Fast jedes Werkzeug zur Feinabstimmung von Mathematik in LaTeX geht auf einen Gedanken zurück: das Aussehen von den Maßen zu trennen, die ein Element belegt – Höhe, Tiefe und Breite. \smash lässt etwas Hohes als null hoch zählen, \vphantom reserviert Höhe, ohne etwas zu drucken, und \rlap druckt ein Zeichen, das null breit ist. Deshalb weichen Symptome wie „ausgerechnet die Zeile mit der Wurzel hat größeren Durchschuss“, „zwei benachbarte \sqrt fluchten oben nicht“ und „eine Bedingung unter dem Summenzeichen zieht die Formel in die Breite“ alle derselben Denkweise. Diese Seite ist nach Symptomen geordnet und stellt \smash, \phantom, \mathstrut, \rlap, \raisebox sowie den Unterschied zwischen \mathrm und \operatorname mit gemessenen Werten vor.
Das Werkzeug zum Symptom finden
Zunächst die Übersicht. Alle diese Befehle sind Werkzeuge, um das gedruckte Ergebnis zuletzt zurechtzurücken, und keiner ändert die Bedeutung einer Formel. Die richtige Reihenfolge lautet daher: die Mathematik zuerst schlicht schreiben und diese Mittel nur dort einsetzen, wo tatsächlich ein sichtbarer Makel auftritt. \smash und \phantom vorsorglich zu streuen, schlägt fehl, sobald Schrift oder Textbreite wechseln. Der Befehl in der ersten Spalte ist zugleich der Suchbegriff; man geht also vom Symptom aus und liest quer.
| Befehl | Behobenes Symptom | Herkunft |
|---|---|---|
\smash | ein hohes Element treibt genau diese Zeile auseinander | LaTeX-Kern ([t] / [b] von amsmath) |
\vphantom | benachbarte Wurzeln oder Zeilen erreichen nicht dieselbe Höhe | plain TeX, in LaTeX unverändert verfügbar |
\mathstrut | dasselbe ohne Argument: reserviert die Höhe einer runden Klammer | plain TeX; die Definition lautet wörtlich \vphantom( |
\phantom | Spalten sollen über Zeilen fluchten, doch die linken Seiten sind verschieden lang | plain TeX; nur für die Breite \hphantom |
\mathclap | eine lange Bedingung unter Summe oder Produkt verbreitert die ganze Formel | mathtools (\mathllap / \mathrlap gehören dazu) |
\rlap | etwas soll gedruckt werden, ohne zur Breite zu zählen | plain TeX; \llap ragt nach links |
\overset | ein beliebiges Zeichen soll genau über einem = stehen | amsmath (\underset für darunter) |
\operatorname | ein selbst definierter mehrbuchstabiger Operator erhält keinen Abstand | amsmath; \operatorname* setzt Grenzen darunter |
\raisebox | ein einzelnes Element soll um einen festen Betrag verschoben werden | LaTeX-Kern; kann auch Höhe und Tiefe überschreiben |
\! | Zeichen stehen zu weit auseinander, etwa im Doppelintegral \int\int | plain TeX; das genaue Gegenteil von \,, nämlich −3 mu |
Nur die Zeile mit der Wurzel hat größeren Durchschuss: \smash
\smash{...} lässt TeX seinen Inhalt als Box mit Höhe null und Tiefe null behandeln. Die Farbe wird weiterhin gedruckt, doch da TeX keine vertikale Ausdehnung sieht, entscheidet es sich nicht mehr, den Durchschuss zu vergrößern. Gemessen ist $\sqrt{1-x^2}$ 9,13329 pt hoch, 1,26668 pt tief und 35,75691 pt breit. In \smash gefasst, wird daraus 0,0 pt Höhe und 0,0 pt Tiefe, bei unveränderten 35,75691 pt Breite. Die Zahlen zeigen deutlich: Nur die Vertikale wird genullt, die Horizontale bleibt völlig unangetastet.
% the radical inside the fraction pushes this line away from the one above
$y = \frac{1}{\sqrt{1 - x^2}}$
% zero its vertical size, and the leading returns to normal
$y = \frac{1}{\smash{\sqrt{1 - x^2}}}$Mit geladenem amsmath erhält \smash ein optionales Argument, mit dem sich oben und unten getrennt behandeln lassen. \smash[t]{...} nullt nur die Höhe und lässt die Tiefe stehen; \smash[b]{...} nullt nur die Tiefe und lässt die Höhe stehen. Gemessen ergab \smash[t]{\sqrt{1-x^2}} 0,0 pt Höhe und 1,26668 pt Tiefe, \smash[b]{\sqrt{1-x^2}} 9,13329 pt Höhe und 0,0 pt Tiefe – genau die gewünschte Seite und sonst nichts. Dieses [t] / [b] steckt nicht im \smash des LaTeX-Kerns; amsmath überschreibt den Befehl, um es zu ergänzen (das schlichte, argumentlose \smash reicht bis plain TeX zurück und steht auch im LaTeX-Kern).
% the descender of y drops the middle radical below the other two
$\sqrt{x} + \sqrt{y} + \sqrt{z}$
% smash away only the depth of y, and all three line up
$\sqrt{x} + \sqrt{\smash[b]{y}} + \sqrt{z}$Das Beispiel, das amsmath selbst anführt, zeigt den Unterschied sauber. In \sqrt{x} + \sqrt{y} + \sqrt{z} lässt die Unterlänge des y die mittlere Wurzel etwas tiefer hängen als die anderen. In Zahlen: $\sqrt{y}$ ist 7,0305 pt hoch und 3,36946 pt tief, $\sqrt{x}$ dagegen 8,00272 pt hoch und 2,39725 pt tief. Misst man aber $\sqrt{\smash[b]{y}}$, erhält man 8,00272 pt Höhe und 2,39725 pt Tiefe – bis zur letzten Nachkommastelle identisch mit $\sqrt{x}$. Allein das Entfernen der Tiefe brachte die Wurzel auf genau die Maße zurück, die sie über einem x hat.
Zwei Hinweise. Erstens verschwinden nur die Maße – die Farbe bleibt –, sodass ein plattgedrücktes Element mit der Zeile darüber kollidieren kann. In Fließtext mit engem Durchschuss sollte das Ergebnis stets angesehen werden. Zweitens raten ältere Darstellungen, \smash am Absatzanfang ein \leavevmode voranzustellen; im aktuellen LaTeX-Kern ist das nicht mehr nötig. \finsm@sh in latex.ltx endet mit \leavevmode@ifvmode\box\z@ und behandelt den vertikalen Modus selbst. Ein \smash am Absatzanfang erzeugte keinerlei Fehler.
Benachbarte Wurzeln fluchten oben nicht: \vphantom und \mathstrut
Wenn \smash das Hohe herunterholt, ist \vphantom die gegenteilige Operation: es hebt das Niedrige an. \vphantom{...} erzeugt eine Box mit derselben Höhe und Tiefe wie ihr Argument, aber null Breite und ohne Druckbild. Gemessen ist $\vphantom{a^2}$ 8,14003 pt hoch und 0,0 pt breit. Das Gegenstück $\hphantom{a^2}$ ist 0,0 pt hoch und 9,77202 pt breit, und $\phantom{a^2}$ mit beidem ist 8,14003 pt hoch und 9,77202 pt breit. Der Satz ist damit sauber vollständig: nur vertikal, nur horizontal, beides. Setzt man ein \vphantom des höheren Inhalts in das niedrigere Element, stimmen die Höhen überein, ohne dass etwas sichtbar wird.
% level the tops of several radicals with one strut each
$\sqrt{\mathstrut a}\;\sqrt{\mathstrut a^2}\;\sqrt{\mathstrut b}$
% or match a specific height by passing the taller content
$\sqrt{a} \;\sqrt{\vphantom{a^2}\,a}$Wenn das Ausschreiben des Zielinhalts jedes Mal lästig wird, gibt es die argumentlose Abkürzung \mathstrut. Ihre Definition in plain TeX lautet: \def\mathstrut{\vphantom(}. Sie ist nichts weiter als eine unsichtbare öffnende Klammer. In der Mathematik ist eine runde Klammer angenehm hoch und folgt der Schriftgröße, was sie zu einem guten Maßstab für das Angleichen von Höhen macht. Die Messungen stimmen dazu. $($ ist 7,5 pt hoch und 2,5 pt tief. $a$ ist 4,30554 pt hoch und 0,0 pt tief, doch $\mathstrut a$ wird 7,5 pt hoch und 2,5 pt tief – genau die Maße der Klammer –, während die Breite bei 5,28589 pt bleibt. Eines an den Anfang jedes Elements gesetzt, und alle liegen auf der Höhe einer runden Klammer.
Die =-Zeichen in align ausrichten: \phantom und \MoveEqLeft
Das Ausdrucksstück, auf das ausgerichtet wird, kommt selbst in \phantom. Schreibt man eine Kette von Umformungen, möchte man ab der zweiten Zeile die linke Seite weglassen und beim = beginnen; schiebt man mit gewöhnlichen Leerzeichen, bricht das, sobald Schrift oder Formel wechseln. Mit \phantom{f(x)} entsteht eine Lücke, genau so breit wie ein tatsächlich gesetztes f(x), und die = fluchten von selbst. Anders als eine von Hand abgezählte Reihe \quad ändert sich die Breite der Lücke mit ihrem Inhalt.
\begin{align*}
f(x) &= x^2 + 2x + 1 \\
\phantom{f(x)} &= (x + 1)^2
\end{align*}
% mathtools: when the first line is too long to keep on one row
\begin{align*}
\MoveEqLeft f(x, y, z) = a + b \\
&= c + d
\end{align*}Umgekehrt hilft \MoveEqLeft aus mathtools, wenn die linke Seite der ersten Zeile zu lang ist, um vor das = zu passen. Es schiebt die erste Zeile über den Ausrichtungspunkt hinaus nach links und richtet die Spalte so ein, dass die folgenden Zeilen von selbst darunter zu liegen kommen. An den Zeilenanfang gesetzt, erspart es das eigenhändige Abzählen von &. Die allgemeine Mechanik von \phantom und \hphantom sowie die mathematischen Abstände insgesamt behandelt die Seite „Indizes und Abstände“ ausführlich.
Etwas setzen, ohne Breite zu belegen: \rlap, \llap, \mathclap
Diese Gruppe ist das waagerechte Gegenstück zu \smash. \rlap{...} druckt seinen Inhalt und gibt der Box zugleich die Breite null, sodass das Material nach rechts überhängt. Die Definition in plain TeX ist eine einzige Zeile – \def\rlap#1{\hbox to\z@{#1\hss}} –, also „eine Box der Breite null bauen und den Überschuss von unendlich dehnbarem Leim nach rechts schieben lassen“, mehr nicht. Gemessen ist \rlap{XX} 0,0 pt breit, ein bloßes XX dagegen 15,00003 pt. \llap, das nach links überhängt, stellt lediglich das \hss voran. Verwendet werden sie für Anmerkungen, die aus einer Tabellenspalte ragen, und um Zeilennummern aus dem Satzspiegel zu schieben.
Um dasselbe innerhalb von Formeln zu erreichen, dienen \mathclap (ragt symmetrisch heraus), \mathllap (nach links) und \mathrlap (nach rechts) aus mathtools. Der klassische Fall ist eine lange Bedingung unter einem Summenzeichen: als \sum_{\mathclap{1 \le i \le j \le n}} a_{ij} gefasst, kehrt die Breite der Formel auf die des Operators zurück. Diese Gruppe wird zusammen mit \smashoperator und dem textmodusfähigen \clap auf der mathtools-Seite ausführlich behandelt. Und wenn die Bedingungen lieber über mehrere Zeilen gestapelt als waagerecht gestaucht werden sollen, ist \substack{...} aus amsmath die richtige Antwort: \sum_{\substack{0<i<m \\ 0<j<n}} setzt die beiden Bedingungen, durch \\ getrennt, als zwei Zeilen unter das Summenzeichen.
Wörter in Formeln: \text, \mathrm und \operatorname im Vergleich
Die drei unterscheiden sich in genau zwei Punkten: ob die umgebende Schrift übernommen wird und ob Operatorabstand hinzukommt. Zuerst die Schrift. \text (definiert in amstext, das amsmath lädt) übernimmt die umgebende Textschrift, während \mathrm stets aufrechte Antiqua erzwingt. Die Messungen zeigen es anschaulich. Innerhalb von \textit{...} misst \text{ab} 14,24867 pt, \mathrm{ab} dagegen 14,61809 pt. Innerhalb von \textbf{...} misst \text{ab} 15,64928 pt, \mathrm{ab} erneut 14,61809 pt – \mathrm fiel unabhängig vom Kontext bis auf die letzte Stelle gleich aus. \text eignet sich für Wörter, die im Ton des umgebenden Textes gelesen werden sollen, \mathrm für Einheiten und Indexbeschriftungen, die immer aufrecht stehen müssen.
Der zweite Punkt, der Abstand, trennt \mathrm von \operatorname. \operatorname (definiert in amsopn, das amsmath lädt) behandelt seinen Inhalt als Operator, als \mathop, sodass beidseitig automatisch ein Atemzug Raum entsteht. Gemessen ist $\mathrm{max} x$ 24,32645 pt und $\operatorname{max} x$ 25,99307 pt – eine Differenz von 1,66662 pt, genau einem schmalen Raum von 3 mu. Mit Operanden auf beiden Seiten ergeben $a \mathrm{mod} b$ und $a \operatorname{mod} b$ 28,74428 pt gegenüber 32,07753 pt, eine Differenz von 3,33325 pt, also 6 mu (je 3 mu pro Seite). Kurioserweise maßen $\mathrm{max}(x)$ und $\operatorname{max}(x)$ bei folgender ( beide 32,10425 pt, exakt gleich – denn TeX setzt zwischen Operator und öffnender Klammer keinen Raum. Aus einem geklammerten Beispiel allein auf „gleich“ zu schließen, wäre also voreilig. Soll die Grenze unter dem Zeichen stehen, dient das gesternte \operatorname*{max}_{x} (gemessen 18,61118 pt gegenüber 23,6459 pt für die ungesternte Form, die den Index daneben setzt).
\[
x_{\text{total}} \quad x_{\mathrm{total}}
\qquad
a \operatorname{mod} b \quad a \mathrm{mod} b
\]
% define it once in the preamble instead of repeating \operatorname
\DeclareMathOperator{\rank}{rank}
\DeclareMathOperator*{\argmax}{arg\,max}Taucht derselbe Operator wiederholt auf, ist es sicherer, ihn einmal in der Präambel zu definieren, als jedes Mal \operatorname zu tippen. \DeclareMathOperator{\rank}{rank} aus amsmath erzeugt \rank als Operator, und das gesternte \DeclareMathOperator*{\argmax}{arg\,max} erzeugt die Fassung, die Grenzen darunter setzt. Da Name und Schreibweise an einer Stelle versammelt sind, ist eine spätere Änderung der Notation eine Einzeiler-Korrektur.
Verschieben und zusammenziehen: \raisebox und \!
\raisebox{Betrag}{Inhalt} hebt seinen Inhalt um den angegebenen Betrag an (ein negativer Wert senkt ihn). Gemessen ist X 6,83331 pt hoch und \raisebox{2pt}{X} 8,83331 pt hoch – exakt 2 pt höher. Mit zwei weiteren optionalen Argumenten, \raisebox{Betrag}[Höhe][Tiefe]{Inhalt}, lassen sich zudem die nach außen gemeldete Höhe und Tiefe überschreiben. \raisebox{2pt}[0pt][0pt]{X} maß 0,0 pt Höhe und 0,0 pt Tiefe – verschoben und zugleich auf dieselbe „Nullgröße“ wie bei \smash gebracht. Nützlich, wenn die Position eines Zeichens die kleinste Korrektur braucht oder ein Schriftwechsel etwas vertikal verrückt hat.
Zuletzt der Fall, dass Zeichen zu weit auseinanderstehen. Der negative schmale Raum \! ist in plain TeX als \def\!{\mskip-\thinmuskip} definiert und damit das genaue Gegenteil von \, (3 mu), nämlich −3 mu. Gemessen ist $ab$ 9,57755 pt, $a\,b$ 11,24417 pt (+1,66662 pt) und $a\!b$ 7,91092 pt (−1,66663 pt) – sauber symmetrisch. Der klassische Anlass ist ein Mehrfachintegral: $\int\int$ misst 14,99997 pt und wirkt so offen, dass es wie zwei getrennte Integrale gelesen wird. Schiebt man zwei \! ein, misst $\int\!\!\int$ 11,66672 pt. Und das eigens dafür vorgesehene $\iint$ aus amsmath misst ebenfalls 11,66672 pt – bis zur letzten Nachkommastelle identisch. Das altmodische \int\!\!\int liefert also ein vom Spezialbefehl ununterscheidbares Ergebnis. Dennoch benennen \iint und \iiint, wo vorhanden, die Absicht klarer und lesen sich besser; \! versteht man am besten als Werkzeug für Fälle ohne fertigen Befehl.
\[
\int\int f \, dA
\qquad
\int\!\!\int f \, dA
\qquad
\iint f \, dA
\]
% an arbitrary symbol set squarely above another
\[
a \overset{!}{=} b, \qquad x \overset{?}{=} y,
\qquad A \overset{f}{\longrightarrow} B
\]Ein Letztes: ein Zeichen genau über ein = setzen. Mit ^ und _ geschriebene Indizes hängen sich rechts oben und rechts unten an ein Symbol, nie direkt darüber oder darunter. Diese Rolle übernehmen \overset{oben}{Basis} und \underset{unten}{Basis} aus amsmath; \overset{!}{=} ist die übliche Schreibweise für „soll gleich sein“, \overset{?}{=} für „ist das gleich?“. Das zweite Argument ist die Basis, das erste das Aufgesetzte. Die weitergehenden Anwendungen – auf Pfeile angewandt, ineinander verschachtelt – behandelt die Seite „Auszeichnungen über und unter Symbolen“.