mathtools

amsmath hat sich seit den 1990er Jahren kaum verändert. Stabilität ist ein Vorzug, doch der Preis war ein wachsender Stapel kleiner Ärgernisse, die niemand beheben konnte: das Aussehen von :=, Betragsstriche, die der Höhe ihres Inhalts nicht folgen, eine lange Bedingung unter dem Summenzeichen, die die ganze Formel in die Breite zieht. mathtools ist das 2002 entstandene LaTeX-Paket, das genau diese Korrekturen aufnimmt, und es ersetzt amsmath nicht, sondern lädt amsmath und baut darauf auf. Diese Seite arbeitet \DeclarePairedDelimiter, \coloneqq, \mathclap, \prescript, matrix*, dcases und showonlyrefs durch, jeweils mit gemessenen Maßen. Jedes davon ist ein Schritt, den amsmath allein nicht gehen konnte.

amsmath oder mathtools – welches Paket wird geladen?

Es genügt, mathtools zu laden. Das Paket zieht amsmath selbst herein, ein separates \usepackage{amsmath} erübrigt sich. Auch Optionen für amsmath werden unverändert durchgereicht: \usepackage[fleqn,tbtags]{mathtools} entspricht \usepackage[fleqn,tbtags]{amsmath} gefolgt von \usepackage{mathtools}. Beide Pakete zu nennen und dabei auf die Reihenfolge zu achten, ist nicht nötig.

latex
% one line is enough: mathtools loads amsmath itself
\usepackage{mathtools}

% options aimed at amsmath are passed straight through
\usepackage[fleqn,tbtags]{mathtools}

Dieser Entwurf – „auf amsmath aufsetzen“ – überdauerte drei Generationen von Betreuern. Der Copyright-Block von mathtools.sty nennt 2002–2011 Morten Høgholm, 2012–2019 Lars Madsen und ab 2020 Lars Madsen gemeinsam mit dem LaTeX3-Projekt. mathtools stieg damit vom Werkzeugkasten eines Einzelnen zum Quasi-Standard auf, um den sich das Entwicklungsteam von LaTeX selbst kümmert. Man merkt es: In der Präambel eines Dokuments mit Mathematik steht inzwischen häufiger mathtools als amsmath in der ersten Zeile. mathtools benötigt außerdem das Hilfspaket mhsetup, das Distributionen wie TeX Live mitliefern; es verlangt also keine Aufmerksamkeit.

Betrag und Norm, die sich selbst anpassen: \DeclarePairedDelimiter

Eine Zeile in der Präambel – \DeclarePairedDelimiter\abs{\lvert}{\rvert} – liefert ein eigenes \abs mit drei umschaltbaren Größen. Das selbstgebaute \newcommand{\abs}[1]{\lvert#1\rvert}, das jeder zuerst schreibt, bekommt zwar den waagerechten Abstand richtig hin, doch bei hohem Inhalt wie \abs{\frac{a}{b}} wachsen die Striche nicht mit und bleiben neben einem Bruch stehen, der über sie hinausragt. Genau hier übernimmt \DeclarePairedDelimiter. Auch der Befehlsname in geschweiften Klammern, \DeclarePairedDelimiter{\abs}{\lvert}{\rvert}, übersetzt einwandfrei.

latex
% in the preamble; braces around the command name are optional
\DeclarePairedDelimiter\abs{\lvert}{\rvert}
\DeclarePairedDelimiter\norm{\lVert}{\rVert}

% three ways to call it
\[
  \abs{x} = \abs{-x}
  \qquad
  \abs*{\frac{a}{b}} = \frac{\abs{a}}{\abs{b}}
  \qquad
  \norm[\big]{v}
\]

Der Unterschied ist kein Eindruck, sondern messbar. Unter TeX Live 2024 ergibt \sbox0{$\abs{\frac ab}$} eine Höhe von 7,5 pt, das gesternte \abs*{\frac ab} dagegen 8,50006 pt. Der Stern fasst den Inhalt in \left … \right, die Striche wuchsen also um die Höhe des Bruchs. Die dritte Form mit [\big], [\Big], [\bigg] oder [\Bigg] wählt die Stufe von Hand; hier maß [\big] ebenfalls 8,50006 pt und traf damit dieselbe Stufe wie die automatische Variante. Als Merksatz: Stern = dehnen, eckige Klammern = auf diese Stufe festlegen. Für Notationen mit einem Trenner innerhalb des Begrenzers, etwa \Set{x}{x>0}, dient \DeclarePairedDelimiterX.

FormGrößeEinsatz
\abs{x}fest (gemessen 7,5 pt)wenn der Inhalt eine niedrige Variable oder Zahl ist
\abs*{x}automatisch (gemessen 8,50006 pt)hohe Inhalte: Brüche, Wurzeln, Summen
\abs[\big]{x}Stufe von Hand gewähltum eine Reihe Formeln auf gleicher Höhe zu halten
\DeclarePairedDelimiterXwie oben, mit mehreren ArgumentenNotationen mit innerem Trenner, etwa \Set{x}{x>0}

Warum := falsch aussieht und was \coloneqq wirklich ändert

Zwei Dinge sind zu korrigieren: die Höhe des Doppelpunkts und der Zwischenraum zwischen Doppelpunkt und Gleichheitszeichen. Eine verbreitete Erklärung lautet, der Abstand stimme nicht, weil : keine Relation sei – das ist schlicht falsch. Fragt man LaTeX nach dem Math Code von :, lautet die Antwort 12346, hexadezimal "303A; die führende 3 steht für Klasse 3, also eine Relation. Ein $a\mathrel{:=}b$ ändert daher gar nichts. Die Messung bestätigt es: $a:=b$ und $a\mathrel{:=}b$ ergaben beide exakt 25,68855 pt.

Was tut \coloneqq also? Die Definition lautet \vcentcolon\mathrel{\mkern-1.2mu}=. Erstens verwendet sie statt des gewöhnlichen : das Zeichen \vcentcolon, einen auf der mathematischen Achse zentrierten Doppelpunkt (gemessen: $:$ ist 4,30554 pt hoch, $\vcentcolon$ 4,65277 pt – um 0,34723 pt angehoben). Zweitens zieht ein negativer Kern von -1.2mu den Doppelpunkt an das Gleichheitszeichen heran, denn bei zwei benachbarten Relationen setzt TeX auch dazwischen Relationsabstand, sodass : und = wie zwei getrennte Zeichen wirken. Ergebnis: $a\coloneqq b$ misst 25,02191 pt und damit genau 0,66664 pt weniger als ein rohes := – exakt 1,2 mu bei 10 pt.

latex
\[
  f(x) \coloneqq x^2 + 1, \qquad y \eqqcolon g(x), \qquad
  A \Coloneqq B
\]

Eine Falle: mathtools hat die Bedeutung von \coloneq geändert. Heute liefert \coloneq standardmäßig dasselbe „:=“ wie \coloneqq; in der älteren Definition ergab es Doppelpunkt und Strich, „:−“. Ebenso \eqcolon, das nun mit \eqqcolon auf „=:“ übereinstimmt. Für Dokumente, die die alten Glyphen brauchen, gibt es \usepackage[legacycolonsymbols]{mathtools}. Umgekehrt wurden \coloneqq und \eqqcolon nie abgekündigt und liefern unter beiden Einstellungen dasselbe – im Zweifel die Variante mit zwei q schreiben. Zur Familie gehören ferner \dblcolon (::), \Coloneqq (::=), \Eqqcolon, \colonapprox, \colonsim sowie die neueren \approxcolon und \simcolon.

Eine lange Bedingung unter der Summe verbreitert die Formel: \mathclap und \smashoperator

Die Bedingung in eine Box der Breite null stecken – und das Problem verschwindet. \sum_{1 \le i \le j \le n} a_{ij} misst 48,21771 pt in der Breite; als \sum_{\mathclap{1 \le i \le j \le n}} a_{ij} misst dieselbe Formel 28,43983 pt, also 19,78 pt weniger. Die Zeichen der Bedingung verschwinden nicht, sie stehen weiterhin sichtbar unter dem Summenzeichen. Sie zählen nur nicht mehr zur Breite der Formel. Bei \mathclap ragt der Überstand nach beiden Seiten, bei \mathllap nach links, bei \mathrlap nach rechts. Das textmodusfähige \clap folgt derselben Idee.

latex
% the wide condition stretches the whole formula
\[ \sum_{1 \le i \le j \le n} a_{ij} \]

% zero-width box: same look, width of the operator only
\[ \sum_{\mathclap{1 \le i \le j \le n}} a_{ij} \]

% same result, but this one can flatten a single side
\[ \smashoperator{\sum_{1 \le i \le j \le n}} a_{ij} \]
\[ \smashoperator[r]{\sum_{1 \le i \le j \le n}} a_{ij} \]

mathtools bietet ein zweites Werkzeug, \smashoperator. Gemessen ergibt \smashoperator{\sum_{1 \le i \le j \le n}} 28,43983 pt – exakt der Wert von \mathclap. Der Unterschied liegt in der Beweglichkeit: \smashoperator nimmt Operator und Indizes gemeinsam entgegen und lässt über [l], [r] oder [lr] (Voreinstellung) wählen, welche Seite plattgedrückt wird. Steht das Summenzeichen am linken Rand und darf nicht hineinragen, hilft [r]: gemessen 38,32878 pt, zwischen beidseitigem Smash und Original. \mathclap zielt auf eine Stelle innerhalb der Formel, \smashoperator kümmert sich um den Operator am Zeilenanfang.

Indizes links vom Symbol: \prescript und \adjustlimits

Drei Argumente – \prescript{oben}{unten}{Basis} – setzen Indizes links oben und links unten an ein Symbol. Am deutlichsten zeigt es die Isotopenschreibweise: \prescript{238}{92}{\mathbf{U}} setzt Uran-238 mit der Massenzahl 238 links oben und der Ordnungszahl 92 links unten. Man kann auch von Hand {}^{238}_{92}\mathbf{U} schreiben, doch dabei hängen die Indizes an einer leeren Gruppe, und Position wie Größe bleiben unzuverlässig. Wird links unten nichts gebraucht, bleibt das zweite Argument ein leeres {}. Die Schrift der Indizes lässt sich über prescript-sub-format und prescript-sup-format in \mathtoolsset austauschen.

latex
\[
  \prescript{238}{92}{\mathbf{U}}, \qquad
  \prescript{n}{}{C}_{k}
\]

% limits of two nested operators lined up
\[ \adjustlimits \sum_{i} \sum_{j} a_{ij} \]

Ein weiteres Werkzeug gehört hierher – unscheinbar, aber nützlich. \adjustlimits richtet die unteren Grenzen zweier verschachtelter Operatoren aneinander aus. Folgen Indizes unterschiedlicher Größe aufeinander wie in \sum_i \sum_j, wirkt die zweite Grenze mitunter leicht angehoben; \adjustlimits fängt diesen Absatz auf. Gemessen: \sum_i\sum_j 30,55557 pt, \adjustlimits\sum_i\sum_j 32,2222 pt – eine Differenz von 1,66663 pt, also genau 3 mu. Ebenso hilfreich, wenn Operatoren unterschiedlicher Breite aufeinanderfolgen, etwa \lim_{n\to\infty}\sup_{x}.

Matrixspalten ausrichten: pmatrix* und [r], [l], [c]

Das pmatrix von amsmath zentriert seine Spalten immer. Sobald negative Zahlen auftauchen, wird das zum Problem: Steht -1 über 2, wirken die Ziffern um die Breite des Minuszeichens verschoben. mathtools stellt zu jeder Umgebung eine gesternte Fassung bereit – matrix*, pmatrix*, bmatrix*, Bmatrix*, vmatrix*, Vmatrix*, smallmatrix* – die als optionales Argument dieselbe Spaltenangabe wie array entgegennimmt. Mit \begin{pmatrix*}[r] richten sich die Spalten rechts aus, und die Minuszeichen ragen sauber nach links heraus. Voreingestellt ist c; der Stern allein ändert also nichts. Die Standardausrichtung der kleinen Varianten legt smallmatrix-align in \mathtoolsset fest.

latex
\[
  \begin{pmatrix*}[r]
    -1 &  3 \\
     2 & -4
  \end{pmatrix*}
  \qquad
  \begin{pmatrix}
    -1 &  3 \\
     2 & -4
  \end{pmatrix}
\]

Fallunterscheidungen und eine sehr lange Zeile: dcases, rcases, multlined

Das cases von amsmath setzt seinen Inhalt im Textstil, ein Bruch darin wird also gestaucht – \frac{1}{2} schrumpft. Das dcases von mathtools behält die Schreibweise bei, setzt den Rumpf aber in Displaygröße; das d steht für displaystyle. Gehört die geschweifte Klammer stattdessen nach rechts – mehrere Bedingungen, die auf eine Folgerung führen –, dient rcases, gefolgt von \Rightarrow oder Ähnlichem direkt nach \end{rcases}. Es gibt ein kombiniertes drcases sowie die gesternten dcases* und rcases*, die die letzte Spalte als Text setzen. Für eine eigene Fallumgebung baut \newcases sie.

latex
\[
  f(x) =
  \begin{dcases}
    \frac{1}{2} & x > 0 \\
    0           & x \le 0
  \end{dcases}
  \qquad
  \begin{rcases}
    a \\ b
  \end{rcases} \Rightarrow c
\]

% [t] aligns on the first row; the second optional argument fixes the width
\[
  \begin{multlined}[t][0.6\textwidth]
    a + b + c + d \\ {} + e + f
  \end{multlined}
\]

multlined ist die Umgebung multline aus amsmath, in eine einzige Box gepackt. multline beansprucht eine ganze abgesetzte Zeile für sich und lässt sich daher nicht in align oder rechts von einem = verwenden. multlined ist eine Umgebung und fügt sich an beliebiger Stelle in eine Formel ein, sodass sich nur die lange rechte Seite intern umbrechen lässt. Sie nimmt zwei optionale Argumente: das erste die vertikale Ausrichtung zur Umgebung (t, b, voreingestellt zentriert), das zweite die Breite. Ohne Breitenangabe belegt sie nur so viel Platz wie nötig. Für einen Pfeil zwischen zwei ausgerichteten Zeilen gibt es \ArrowBetweenLines, für lockereren Zeilenabstand über eine ganze Ausrichtung die Umgebung spreadlines.

Nur referenzierte Gleichungen nummerieren: showonlyrefs

Mit \mathtoolsset{showonlyrefs} erhalten nur die aus dem Text referenzierten Gleichungen eine Nummer; die übrigen verlieren ihre. In einem Entwurf kommen und gehen Gleichungsnummern ständig, und eine Nummer an einer Gleichung, auf die niemand verweist, schickt Gutachtende auf die Suche, wo „(7)“ denn verwendet werde. Ein align mit zwei Gleichungen unter TeX Live 2024, von denen nur eine per \eqref referenziert wurde, ergab (1) an der referenzierten Gleichung und gar keine Nummer an der anderen. Eine Bedingung gilt: mit \eqref verweisen, nicht mit \ref. Sollen auch die von Hand mit \tag{} gesetzten Nummern erhalten bleiben, kommt showmanualtags hinzu.

latex
\mathtoolsset{
  showonlyrefs,        % number only what \eqref points at
  showmanualtags,      % but keep \tag{} numbers visible
  centercolon          % a bare : is set at axis height
}

Was stammt aus amsmath, was aus mathtools?

Wer nur mathtools lädt, sieht die Grenze nicht mehr – wichtig wird sie beim Bearbeiten fremder Dokumente oder bei Einreichungsregeln, die allein amsmath zulassen. Die .sty-Dateien geben Auskunft. Die dehnbaren Pfeile \xrightarrow und \xleftarrow stammen aus amsmath (definiert in amsmath.sty); mathtools ergänzt die übrige Familie – die doppelt gestrichenen \xRightarrow, \xLeftarrow und \xLeftrightarrow, das beidseitige \xleftrightarrow, die Hakenpfeile \xhookrightarrow und \xhookleftarrow, den Abbildungspfeil \xmapsto, das längere \xlongrightarrow sowie Harpunen. Alle verwenden dieselbe Form [unten]{oben}. \intertext gehört zu amsmath, das engere \shortintertext zu mathtools. \overset, \underset und \substack sind amsmath; die eckigen \overbracket und \underbracket sind mathtools.

Befehl/UmgebungHerkunftAufgabe
\xrightarrowamsmathPfeil, der auf die Labelbreite wächst; [unten]{oben}
\xleftrightarrowmathtoolsder Rest der dehnbaren Familie: \xRightarrow, \xmapsto und mehr
\overbracketmathtoolsdas eckige Gegenstück zu \overbrace / \underbrace; erstes optionales Argument Linienstärke, zweites Höhe (Standard 0,7 ex)
\intertextamsmathschiebt Fließtext zwischen Zeilen, ohne die Ausrichtung zu verlieren
\shortintertextmathtoolsdasselbe mit engerem Abstand darüber und darunter
\substackamsmathstapelt einen Index über mehrere Zeilen – das Gegenstück zum Stauchen mit \mathclap
\MoveEqLeftmathtoolsschiebt die erste Zeile eines align nach links, damit die folgenden darunter passen
\splitfracmathtoolsbricht einen zu langen Zähler oder Nenner auf zwei Zeilen um