
Betrachten Sie $a \triangleright b$
und $a \overline{\triangleright} b$
. Sie verhalten sich hinsichtlich des Abstands völlig unterschiedlich:
Warum? Wie behebe ich das?
Antwort1
Der Befehl \triangleright
ist ein sogenannter binärer Operator. LaTeX behandelt diese binären Operatoren so, dass davor und danach ein kleiner horizontaler Abstand gesetzt wird. Was hier passiert ist, ist, dass Sie diesen Befehl in einen anderen Befehl eingebunden haben, der diese Funktion verbirgt. Sie können den gleichen Effekt sehen, wenn Sie einfach versuchen $a+b{+}c$
.
Daher müssen Sie Ihre Konstruktion wieder in einen binären Operator umwandeln, indem Sie sie in den Befehl einschließen \mathbin
:
% arara: pdflatex
\documentclass{article}
\newcommand*{\oltriangleright}{\mathbin{\overline\triangleright}}
\begin{document}
$a \triangleright b$ and $a \oltriangleright b$
\end{document}
Was bedeutet dieses Symbol? Wenn Sie eine Referenz haben, können Sie es dem Unicode empfehlen.
Antwort2
Jedes Objekt im mathematischen Satz hat eine der Klassen: 0=Ord, 1=Op, 2=Bin, 3=Rel, 4=Open, 5=Close, 6=Punct. Diese Klasse beeinflusst die horizontalen Leerzeichen (die automatisch zwischen Objekten eingefügt werden). Die elementaren Objekte im mathematischen Satz werden normalerweise als \mathchardef
primitive (für Steuersequenzen) oder \mathcode
(für native Codes) deklariert. Die \mathode
von a
und b
werden als Klasse Ord deklariert und triangleright wird als deklariert
\mathchardef\triangleright="212E
was bedeutet, class=2=Bin, family=1, fontcode=2E. Das Wichtigste (im Moment) ist die Klasse Bin. Die Sequenz a\triangleright b
ist „Ord Bin Ord“ und dies beeinflusst die rechten horizontalen Abstände. Die Dinge sind komplizierter, aber das Grundprinzip wird hier gezeigt.
Das Wichtigste ist nun die Tatsache, dass Klammern (wie {\triangleright}
) oder andere Konstruktionen (wie \overline{\triangleright}
) das zusammengesetzte Objekt in der Klasse Ord erzeugen. Ord Ord Ord
In unserem Beispiel haben wir also und dies fügt keine Leerzeichen dazwischen ein. Aber es gibt Klassenneutypisierungsprimitive \mathord
, \mathop
, \mathbin
, \mathrel
, \mathopen
, \mathclose
und \mathpunct
die das Objekt der gegebenen Klasse erzeugen. Also
a \mathbin{\overline{\triangleright}} b
ergibt die Reihenfolge „Ord Bin Ord“ und dies beeinflusst die richtigen Abstände.
Antwort3
Sie können den richtigen Abstand mit einer geänderten Version von erreichen, \overline
die dieselbe Infrastruktur verwendet wie \overset
:
\documentclass{article}
\usepackage{amsmath,amssymb}
\makeatletter
\DeclareRobustCommand{\coverline}[1]{% clever overline
\binrel@{#1}\binrel@@{\overline{#1}}%
}
\makeatother
\begin{document}
$a\coverline{<}b$
$a<b$
$a\coverline{\triangleright} b$
$a\triangleright b$
\end{document}
Die Anweisung \binrel@
ermittelt, ob das Argument eine binäre Operation oder ein Relationssymbol ist und setzt entsprechend \binrel@@
auf \mathbin
oder \mathrel
; wenn der Typ nicht ermittelt werden kann, wird es auf gesetzt \mathord
.