Seite 1 von 1

Länge eines Zeichens messen (zwecks \not-Positionierung)

Verfasst: So 26. Jun 2011, 21:46
von guy.brush™
Hallo,

ich habe jetzt ein wenig gesucht und leider keine komplette Lösung gefunden. Zuerst einmal: Ich habe hier ein paar längere Pfeile (\xrightarrow) und möchte diese nun negieren. Im Paket stmaryrd werden netterweise die Zeichen \arrownot und \Arrownot definiert, die einen passenderen/schöneren Strich für Pfeile zur Verfügung stellen als \not.

Auf Seite 8 im Manual zu stmaryrd werden diese verwendet, um für \longrightarrow und \Longrightarrow richtig positionierte nicht-Striche zu definieren:
\stmry@if\def\longarrownot{\mathrel{\mkern5.5mu\arrownot\mkern-5.5mu}}\fi
\stmry@if\def\Longarrownot{\mathrel{\mkern5.5mu\Arrownot\mkern-5.5mu}}\fi
Da komme ich gleich auch zu meinen ersten 3 kleinen Fragen: Was ist/macht genau \mkern, welche Einheit ist "mu" und wieso definieren die hier den Strich als \mathrel?

Für beliebig lange Pfeile, z.B. mittels \xrightarrow erstellte, habe ich jedoch keinen mittig positionierten nicht-Strich. Hier ein Beispiel, das das Problem verdeutlicht:
\documentclass{scrartcl}

% --------------------- Einbinden benötigter Pakete ---------------------
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[intlimits]{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{amsopn}
\usepackage{amsthm}
\usepackage{mathtools}
\usepackage{stmaryrd}


\begin{document}

\begin{align*}
  \intertext{L"osung mittels den neuen Befehlen von \texttt{stmaryrd} und den normalen Pfeilen:}
  A &\longarrownot\longrightarrow B\\
  A &\Longarrownot\Longrightarrow B
  \intertext{Probleme bekommt man aber in folgender Situation:}
  A &\longarrownot\xrightarrow{n \rightarrow \infty} B\\
  A &\arrownot\xrightarrow{n \rightarrow \infty} B
\end{align*}


\end{document}
Meine Idee war jetzt, die Definition von \longarrownot und \Longarrownot zu übertagen auf andere Symbole. Dazu würde ich zum einen gerne den Code verstehen, zum anderen aber benötige ich die genaue Länge meines Symbols, welche ich dann durch 2 teilen darf, dann müsste der Strich eigentlich mittig sitzen (wenn ich das richtig verstehe).

Ich habe etwas von dem Paket "calc" gelesen, dass das angeblich könne, aber alle meine Versuche scheiterten :).


Kann mir da jemand helfen :)?


Viele Grüße,

\\ guy.brush

Verfasst: So 26. Jun 2011, 23:56
von iTob
Ich habe jetzt nicht so viel Zeit und muss auch noch ein Referat vorbereiten, daher nur ein paar Tips auf die Schnelle.

Das mu ist eine Längeneinheit für den Mathemodus, mehr dazu solltest du im (frei verfügbaren) TeX Book finden.
\mkern ist vermutlich das Matheanalogon zu \kern, was es erlaubt, den Abstand zwischen zwei Zeichen zu kontrollieren.

Für deine Längenmessung müsstest du einen Hilfslängenbefehl (\newlength{\hilfslaenge}) definieren und dann solltest du mit \settowidth{\hilfslaenge}{Pfeilbefehl} arbeiten können. Bin grad aber nicht scher, ob das auch im Mathemodus geht. Im Zweifel kannst du versuchen, das Argument um $…$ ergänzen. Dann kannst du mit \mkern{0.5*\hilfslaenge} (wenn das nicht geht musst du mit calc eine zweite Hilfslänge berechnen) auf die Hälfte der Pfeillänge springen, deinen Not-Strich setzten und mit \mkern{-0.5*\hilfslaenge} zurück zur Ausgangsposition gehen, um dann ganz normal den \xleftarrow oder was auch immer anzuschließen.
Versuche damit mal, an Minimalbeispiel zu erstellen, an dem wir dann weiterarbeiten können – spätestens Mittwoch nach meinem Referat …

Gute Nacht!
Tobi

Verfasst: Mo 27. Jun 2011, 21:04
von guy.brush™
\documentclass{scrartcl}

% --------------------- Einbinden benötigter Pakete ---------------------
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[intlimits]{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{amsopn}
\usepackage{amsthm}
\usepackage{mathtools}
\usepackage{stmaryrd}

\newlength{\hilfslaenge}
\settowidth{\hilfslaenge}{$\xrightarrow[n \rightarrow \infty]{\text{L}_r}$}
% \newlength{\hilfe}
% \settowidth{\hilfe}{0.5 * \hilfslaenge}
\def\blabla{\mathrel{\mkern{\hilfslaenge mu}\arrownot\mkern-{\hilfslaenge mu}}}

\begin{document}

\begin{align*}
  \intertext{L"osung mittels den neuen Befehlen von \texttt{stmaryrd} und den normalen Pfeilen:}
  A &\longarrownot\longrightarrow B\\
  A &\Longarrownot\Longrightarrow B
  \intertext{Probleme bekommt man aber in folgender Situation:}
  A &\longarrownot\xrightarrow{n \rightarrow \infty} B\\
  A &\arrownot\xrightarrow{n \rightarrow \infty} B
\end{align*}

Versuche zur Probleml"osung:

\[
  \blabla\xrightarrow{n \rightarrow \infty}
\]

\end{document}

Hm ... irgendwie bekomme ich es so nicht hin :).



PS: Viel Erfolg (oder Glück? ;P) beim Referat! :)

Verfasst: Di 28. Jun 2011, 15:15
von iTob
Damit gehts:
\documentclass{scrartcl} 

% --------------------- Einbinden benötigter Pakete --------------------- 
\usepackage[T1]{fontenc} 
\usepackage[ngerman]{babel} 
\usepackage[utf8]{inputenc} 
\usepackage[intlimits]{amsmath} 
\usepackage{amssymb} 
\usepackage{amsfonts} 
\usepackage{amsopn} 
\usepackage{amsthm} 
\usepackage{mathtools} 
\usepackage{stmaryrd} 

\newlength{\xarrlenI}% Hilfslänge I
\newlength{\xarrlenII}% Hilfslänge 2
\newcommand{\xarrnot}[1]{%
	\settowidth{\xarrlenI}{\ensuremath{\textstyle#1}}% Hilfslänge I setzten
	\setlength{\xarrlenII}{0.45\xarrlenI}% Hilflänge II = 0.5*Hilfslänge I
	\mkern-5.5mu% \mathrel-Abstand ausgleichen (?)
	\kern\xarrlenII% in die Mitte gehen
	\arrownot% Nicht-Strich setzen
	\kern-\xarrlenII% von der Mitte zurück zum Anfang
	\mkern5.5mu% zweiter Ausgleich (?)
	#1% Pfeil (Argument) ausgeben
}


\begin{document} 
\[ 
  |a\xarrnot{\xrightarrow{n \rightarrow \infty}}b|
\]
\[ 
  |a\xarrnot{\xrightarrow{i,j,k,l,m \rightarrow \infty}}b|
\]
\[ 
  |a\xarrnot{\xrightleftharpoons{\text{irgend was komischs passiert}}}b|
\]
\end{document}
Frag mich nicht, warum diese Ausgleichslängen (\mkern±5.5mu) nötig sind …

Verfasst: Di 28. Jun 2011, 20:40
von guy.brush™
Irgendwie verstehe ich nicht, wie bzw. dass das funktionieren soll :D.

Also bei meinem im Startpost schon erwähnter Definition kann ich auch die Zahlen bei \mkern ändern und somit den Strich verschieben. Aber irgendwie geht das scheinbar nicht über eine Variable. [Eine Möglichkeit müsste also die fast komplett manuelle sein: Länge des Zeichens in mu messen, ausgeben lassen und in Definition für jeden benötigten Fall eintragen, dann hat man halt n \in \mathbb{N} viele Definitionen ;).]

Du verwendest zum einen hier 0.45 anstelle von 0.5, was mich stutzig macht. Zum anderen darf man die 5.5 bei \mkern nicht verändern. Hä?^^

Und wieso nutzt du \textstyle?


Der Strich wirkt aber irgendwie auch nicht 100%-ig in der Mitte ... oder täuscht das?


Irgendwie ... der Code darf doch gar nicht funktionieren/richtig sein :D.

Verfasst: Mi 29. Jun 2011, 11:09
von iTob
Das \textstyle ist übrig geblieben und kann gelöscht werden.

Das es so funktioniert finde ich auch mehr als seltsam. Finde auch, dass es so nicht richtig sein dar. Aber hey, es geht …
Ich vermute, dass es was mit TeX Mathesatz zu tun (siehe TeX Book, u. a. Stichwort atoms). Wenn du mehr dazu wissen willst, kannst du dich mit der Lösung ja nochmal an tex.stackexchange wenden, da weiß bestimmt jemand mehr Rat als ich.

Ist denn den Problem gelöst mit der Lösung, die es eigentlich nicht geben kann? Dann könntest du noch den Status anpassen ;-)

Verfasst: Do 30. Jun 2011, 20:04
von guy.brush™
Ich habe das ganze einmal ausgedruckt, um mein Augenmaß zu bestätigen oder zu widersprechen. Ich wurde dabei allerdings bestätigt. Die Lösung setzt den Strich nicht exakt in die Mitte.


Vielleicht sollten wir doch erst folgenden Schritt machen: Wüsstest du denn einen Weg, die Länge eines Zeichens zu messen und diese Länge dann in einer beliebigen Maßeinheit (hier mu) ausgeben zu lassen? Dann könnte ich diese manuell gemäß obiger (im Startpost) Definition eintragen.

Verfasst: Do 30. Jun 2011, 22:42
von iTob
Ne. Da weiß ich so ad hoc keinen Weg …

Ich stelle bei Gelegenheit mal einen Frage auf tex.sx, dann sehen wir weiter.