\mathrm{sin} und \sin sehen auf dem Papier wie dasselbe „sin“ aus. Trotzdem ist das erste falsch, und der Unterschied beträgt 3.33325pt. Misst man in LaTeX $a\operatorname{op}b$, ergeben sich 23.46638pt, bei $a\mathrm{op}b$ sind es 20.13313pt – die aufrechte Form ist identisch, doch \mathrm trägt keinerlei Abstand. Diese 3.33325pt sind keine Zierde: Es sind genau zwei schmale Abstände, die TeX links und rechts eines Op-Atoms einfügt. Diese Seite beginnt bei jenem Atom, verortet dann die 32 eingebauten Funktionsnamen in den LaTeX-Quellen, erklärt, warum genau zehn davon ihren Index darunter setzen, zeigt, was der Stern in \DeclareMathOperator ändert, und trennt die vier Modulo-Formen \bmod, \pmod, \mod und \pod anhand gemessener Breiten.
Warum \mathrm{sin} falsch ist: die Atomklasse bestimmt den Abstand
Im Mathematikmodus gilt jeder Buchstabe als Variablenname und wird kursiv gesetzt; sin x ergibt daher nicht „Sinus“, sondern das Produkt der vier Größen s, i, n, x. So weit ist das bekannt, und viele greifen zu \mathrm{sin}, weil das Problem gelöst aussieht, sobald die Schrift aufrecht steht. \mathrm ändert jedoch nur die Schrift. Für TeX bleibt die Atomklasse Ord, ein gewöhnliches Zeichen.
TeX ordnet die Bestandteile einer Formel Atomklassen zu – Ord (gewöhnlich), Op (Operator), Bin (binärer Operator), Rel (Relation) und einige weitere – und bestimmt die Abstände allein daraus, welche Klassen nebeneinanderstehen. Zwischen Ord und Ord steht kein Abstand. Zwischen Op und Ord steht ein schmaler Abstand (\thinmuskip, 3mu). \sin ist ein Op, \mathrm{sin} ein Ord – daher der Unterschied. Misst man die folgenden vier in einem 10pt-Dokument, wird der Mechanismus unmittelbar zu Zahlen.
\DeclareMathOperator{\myop}{op}
% \sbox0{$...$}\message{\the\wd0}
$a\operatorname{op}b$ 23.46638pt
$a\myop b$ 23.46638pt % identical to \operatorname
$a\mathop{\mathrm{op}}b$ 23.46638pt % same font as \mathrm, but Op class
$a\mathrm{op}b$ 20.13313pt % 3.33325pt narrower
$\mkern3mu$ 1.66663pt % one thin space; two of them = 3.33326ptDie dritte Zeile gibt den Ausschlag. \mathop{\mathrm{op}} benutzt exakt dieselbe Schrift wie \mathrm und stimmt dennoch bis auf ein Hunderttausendstel Punkt mit \operatorname überein. Den Unterschied macht also nicht die Schrift, sondern die Op-Klasse, die \mathop verleiht. Und die Differenz von 3.33325pt sind genau zwei schmale Abstände zu je 1.66663pt – einer zwischen a und „op“, einer zwischen „op“ und b. Die Überlieferung, \mathrm verderbe den Abstand, ist damit bis auf die letzte Nachkommastelle erklärt. Praktische Folgerung: Funktionsnamen immer mit dem eigenen Befehl oder mit \operatorname schreiben, nie mit \mathrm.
Die 32 eingebauten Funktionsnamen und wo sie stehen
Die Definitionen von \log und \sin stehen nicht in einem Paket, sondern in latex.ltx, der Formatdatei von LaTeX selbst. In TeX Live 2024 belegen sie die Zeilen 12487 bis 12518 – genau 32 Zeilen – jeweils in der Form \DeclareRobustCommand\log{\mathop{\operator@font log}\nolimits}. Die Liste ist noch älter: Fast dieselbe Auswahl findet sich in Knuths plain.tex in den Zeilen 1058–1085. \sin schreiben zu können, verdankt man also nicht amsmath; es funktioniert von Anfang an ganz ohne Paket (nur eigene Deklarationen brauchen amsmath, siehe unten).
- Trigonometrisch:
\sin\cos\tan\cot\sec\cscsowie die Umkehrfunktionen\arcsin\arccos\arctan. - Hyperbolisch:
\sinh\cosh\tanh\coth–\sechund\cschsind nicht dabei; bei Bedarf selbst deklarieren. - Logarithmen und Exponentialfunktion:
\log(allgemein),\ln(natürlich),\lg(zur Basis 2, häufig in der Informationstheorie),\exp. - Algebra, Geometrie und Verwandtes:
\deg(Grad),\dim(Dimension),\ker(Kern),\hom,\arg(Argument),\det(Determinante). - Die 10 mit Indizes darunter:
\lim\limsup\liminf\max\min\sup\inf\det\Pr\gcd.
Basen und Exponenten hängt man mit dem gewöhnlichen Skriptmechanismus an: \log_2 x setzt eine 2 rechts unten an „log“, \sin^2\theta eine rechts oben, also das übliche sin²θ. Ein Detail, das nur beim Lesen der Quelle auffällt: \limsup ist als \mathop{\operator@font lim\,sup} definiert – zwischen „lim“ und „sup“ steht ein von Hand gesetzter schmaler Abstand \,. Es ist kein durchgehendes Wort, sondern zwei absichtlich leicht getrennte Wörter.
\[
\sin^2\theta + \cos^2\theta = 1, \qquad
\log_2 8 = 3, \qquad \ln e = 1.
\]Die 10 mit Indizes darunter – und warum \limits nichts bewirkt
Von den 32 enden 22 mit \nolimits, ihre Indizes erscheinen also rechts unten. Den übrigen zehn – \lim, \limsup, \liminf, \max, \min, \sup, \inf, \det, \Pr, \gcd – fehlt das \nolimits. Da die Vorgabe für \mathop im Display-Stil „Indizes darunter“ lautet, setzen genau diese zehn in einer Anzeige x→0 unter \lim. Die Konvention, dass ein Grenzwert oder Maximum deutlich zeigen soll, „über welchen Bereich“, steht damit unmittelbar in den Definitionen. Im Text-Stil (inline) rutschen alle zehn nach rechts unten.
\[
\lim_{x \to 0} \frac{\sin x}{x} = 1, \qquad
\max_{1 \le i \le n} a_i .
\]Naheliegend wäre der Gedanke, einfach \limits zu verwenden, das ja bei \sum und \int funktioniert. Doch mit geladenem amsmath bewirkt \log\limits_{k} überhaupt nichts – kein Fehler, keine Warnung, stillschweigend ignoriert. Der Grund steht in Zeile 27 von amsopn.sty: \def\nolimits@{\@ifnextchar\limits{\nolimits\@gobble}{\nolimits}}. Jede Operatornamen-Definition ruft am Ende dieses \nolimits@ auf, und ist das nächste Token \limits, gibt es \nolimits aus und verschluckt jenes \limits. Die Messung bestätigt es.
% depth of the box tells us where the script went (bigger = below the operator)
% WITHOUT amsmath — \log is \mathop{...}\nolimits, and \limits overrides it
$\displaystyle\log_{k}x$ d = 2.44443pt
$\displaystyle\log\limits_{k}x$ d = 9.47220pt % moved below
% WITH amsmath — the \limits is swallowed by \nolimits@
$\displaystyle\log_{k}x$ d = 2.44443pt
$\displaystyle\log\limits_{k}x$ d = 2.44443pt % unchanged: nothing happenedDie allgemeine Regel zu \limits – anwendbar auf große Operatoren wie \sum, siehe „Summen, Integrale und große Operatoren“ – gilt unter amsmath also nicht für Operatornamen. Die Gegenrichtung geht ungehindert durch: \lim\nolimits_{k} schiebt den Index von \lim tatsächlich nach rechts unten. Wer den Index darunter haben will, greift nicht zu \limits, sondern zur gesternten Deklaration im nächsten Abschnitt.
\DeclareMathOperator und \operatorname: was der Stern entscheidet
Für einen Namen, der nicht in der Liste steht – die Signumfunktion sgn, die Spur tr, den Rang rank, ess sup, argmax –, übernimmt amsmath. Einmalig schreibt man \operatorname{sgn} x; bei wiederholter Verwendung deklariert man ihn in der Präambel mit \DeclareMathOperator{\sgn}{sgn}. Wie die Messung zu Beginn zeigt, ist ein deklariertes \sgn exakt so breit wie \operatorname{sgn} – beide rufen dasselbe \qopname auf und sind buchstäblich dasselbe. Der Vorteil der Deklaration liegt nicht in der Qualität, sondern darin, dass alles an einer Stelle steht: Eine spätere Notationsänderung ist eine einzige Zeile in der Präambel.
\usepackage{amsmath}
\DeclareMathOperator{\sgn}{sgn} % scripts to the right, like \log
\DeclareMathOperator*{\argmax}{arg\,max} % scripts underneath, like \lim
% in the body:
% \[ \sgn x, \qquad \argmax_{x \in S} f(x) \]Der Stern entscheidet ausschließlich über die Position der Indizes. Ohne ihn erhält man ein Mitglied der \log-Familie (rechts unten), mit ihm eines der \lim-Familie (in Anzeigen darunter). Für Einzelfälle leistet \operatorname*{…} dasselbe. Auch das lässt sich messen: Setzt man dasselbe op in einer Anzeige mit _{n\to\infty}, beträgt die Tiefe der Box ohne Stern 2.44443pt, mit Stern 8.94444pt. Die zusätzliche Tiefe ist der Index, der unter dem Zeichen hängt. Das \, im Namen (arg\,max) steht aus demselben Grund dort wie in der Definition von \limsup: um zwischen den beiden Wörtern den richtigen Abstand zu lassen.
amsmath ergänzt außerdem Vokabular rund um Limes superior und inferior. \varlimsup und \varliminf sind Varianten mit einem Strich über (bzw. unter) „lim“, symbolischer als die Schreibung „lim sup“ von \limsup. \injlim und \projlim setzen direkten und inversen Limes als „inj lim“ und „proj lim“, während \varinjlim und \varprojlim die aus der Kategorientheorie vertraute Form mit einem → (bzw. ←) unter „lim“ liefern. Alle setzen, wie eine gesternte Deklaration, Indizes darunter. Welche man wählt, richtet sich nach der Konvention des Fachgebiets; im Zweifel prüfen, ob die Stildatei der Zeitschrift bereits eine definiert.
\bmod, \pmod, \mod, \pod: die vier per Messung unterscheiden
Verwirrend sind die vier Modulo-Formen, weil alle „mod“ drucken und sich nur in Abstand und Klammern unterscheiden. \bmod und \pmod gehören zum Standard-LaTeX, \mod und \pod stammen aus amsmath. Der Unterschied im Entwurf steht deutlich in den Definitionen: Allein \bmod ist mit \mathbin{…} definiert – also als Bin-Atom, dieselbe Klasse wie + und - –, während die anderen drei lediglich einen Abstand einfügen und dann ihren Inhalt setzen, gleichsam als nachgestellte Anmerkung.
\DeclareRobustCommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin
{\operator@font mod}\penalty900
\mkern5mu\nonscript\mskip-\medmuskip}
\DeclareRobustCommand{\pod}[1]{\allowbreak
\if@display\mkern18mu\else\mkern8mu\fi(#1)}
\DeclareRobustCommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}}
\DeclareRobustCommand{\mod}[1]{\allowbreak\if@display\mkern18mu
\else\mkern12mu\fi{\operator@font mod}\,\,#1}Man beachte \if@display. \pod und \pmod fügen in einer Anzeige 18mu, inline 8mu ein, \mod 18mu bzw. 12mu. \bmod kennt diese Verzweigung nicht – als binärer Operator setzt es einfach beidseitig symmetrisch \mkern5mu – und ist damit das einzige der vier, dessen Breite in Anzeige und Fließtext gleich bleibt. Misst man denselben Ausdruck a … n bei 10pt, wird der Entwurf unmittelbar zu Zahlen.
| Befehl | Ausgabe | Breite inline → Anzeige | Wann verwenden |
|---|---|---|---|
a \bmod n | a mod n | 36.01039pt → 36.01039pt (unverändert) | Wenn der Rest als Wert gemeint ist. Ein Bin-Atom, daher symmetrisch. Standard-LaTeX |
a \pmod{n} | a (mod n) | 46.01036pt → 51.56578pt | Der übliche Abschluss einer Kongruenz, x \equiv y \pmod{n}. Standard-LaTeX |
a \mod{n} | a mod n | 40.45473pt → 43.78798pt | Für Kongruenzen in klammerlosen Konventionen; größerer Vorabstand als \bmod. Braucht amsmath |
a \pod{n} | a (n) | 23.51038pt → 29.06580pt | Klammern ohne das Wort „mod“, wenn der Modul aus dem Kontext klar ist. Braucht amsmath |
Zieht man die Inline-Breite von der Anzeigebreite ab, treten die Definitionen exakt wieder hervor. Bei \pmod und \pod beträgt die Differenz 5.55542pt – das ist 18mu − 8mu = 10mu, bei 10pt also 9.99976 − 4.44434 = 5.55542pt. Bei \mod sind es 3.33325pt, entsprechend 18mu − 12mu = 6mu. Bei \bmod ist sie null. Die Wahl richtet sich nach der Bedeutung: \bmod, wenn der Rest als Wert gemeint ist (5 \bmod 3 = 2), und \pmod, wenn behauptet wird, dass zwei Zahlen modulo n kongruent sind (17 \equiv 5 \pmod{12}). Verwechselt man beides, geht den Lesenden der Unterschied zwischen Wert und Relation verloren.
\[
5 \bmod 3 = 2, \qquad
17 \equiv 5 \pmod{12}.
\]