Der Mathematikmodus von LaTeX kennt kein „Umschalten der Schrift“ wie der Fließtext. Was er kennt, sind mathematische Alphabete – \mathbf, \mathbb, \mathcal und Verwandte, die jedes eingeschlossene Zeichen einer anderen Schrift zuweisen. Der Haken: Die Plätze sind endlich. Auf den klassischen Engines darf eine Formel höchstens sechzehn benutzen. Diese Grenze wurde 1978 festgelegt und gilt bis heute; sie meldet sich unvermittelt als ! LaTeX Error: Too many math alphabets used in version normal. Diese Seite führt von den sieben Befehlen ohne Paket über das Blackboard-Bold \mathbb (braucht amssymb) und \mathscr (braucht mathrsfs) bis zum Fettsatz mit \bm und den \sym…-Befehlen von unicode-math – zusammengehalten von einer Frage: Wie verteilt man diese sechzehn Plätze?
Ein mathematisches Alphabet ist eine Familie, keine Schrift
Ein Buchstabe im Mathematikmodus gilt als Variable und wird mathematikkursiv gesetzt; das ist das voreingestellte mathematische Alphabet. Ein Befehl wie \mathbf{v} verschiebt nur diesen Bereich in eine andere Familie – TeX nennt sie \fam. Genau hier trennen sich mathematische Alphabete von den Schriftbefehlen des Textmodus. TeX speichert jedes Zeichen einer Formel als „Familiennummer, Platznummer“; eine Schrift ist also kein fortlaufender Strom wie im Fließtext, sondern ein Etikett an jedem einzelnen Symbol. Deshalb ist \mathbf{fit} nicht das Wort „fit“, sondern das Produkt dreier fetter Symbole f, i und t, zwischen denen der Abstand zweier Variablen steht. Für ein echtes aufrechtes Wort in einer Formel dient \text{…} aus amsmath.
Standard-LaTeX bringt sieben Alphabetbefehle mit. Sie tragen alle die Form \math… und sind als Gegenstücke zu \textbf, \textsf und den übrigen Textbefehlen benannt. Leicht zu verwechseln sind \mathnormal und \mathit: \mathnormal (Standard) setzt jeden Buchstaben als Variable mit dem größeren Variablenabstand, während \mathit Textkursiv ist und sich für ein mehrbuchstabiges Wort als eine geneigte Einheit eignet, etwa \mathit{diff}. \mathrm und \mathbf sind aufrechte Antiqua, letzteres fett. \mathsf erscheint in Tensor- und Kategoriennamen, \mathtt, wenn ein codeartiges Token in einer Formel stehen muss.
| Befehl | Aussehen | Hinweise |
|---|---|---|
\mathnormal | Voreingestelltes Mathematikkursiv | Eingebaut; Standardaussehen einer Variablen, mit Variablenabstand |
\mathrm | Aufrechte Antiqua | Eingebaut; aufrechte Konstanten, Operatoren und Abkürzungen |
\mathbf | Aufrecht fett | Eingebaut; aufrecht, daher ungeeignet für Variablen, und ohne Wirkung auf Griechisch |
\mathsf | Serifenlos | Eingebaut; Tensoren, Kategoriennamen und Ähnliches |
\mathtt | Dicktengleich (Schreibmaschine) | Eingebaut; codeartige Tokens in einer Formel |
\mathit | Textkursiv | Eingebaut; mehrbuchstabiges Wort als geneigte Einheit, etwa \mathit{diff} |
\mathcal | Kalligrafisch; nur Großbuchstaben | Eingebaut; Mengenfamilien, Kategorien, Transformationen. Die Glyphen stammen aus cmsy von Computer Modern |
Welches Paket \mathbb, \mathscr und \mathfrak brauchen
Blackboard-Bold \mathbb und Fraktur \mathfrak brauchen amssymb (oder das schlankere amsfonts); die Skriptschrift \mathscr braucht mathrsfs. Nur \mathcal ist eingebaut. \mathbb ist eine Fettschrift mit gedoppelten Strichen – sie ahmt die Tafelgewohnheit nach, Fettdruck durch zweimaliges Nachziehen anzudeuten – und ihre Verwendung ist praktisch auf die Zahlenmengen festgelegt: reelle ℝ, komplexe ℂ, ganze ℤ, rationale ℚ, natürliche ℕ. Sie umfasst die Großbuchstaben A–Z und sonst nichts: keine Kleinbuchstaben, keine Ziffern.
Die Wahl zwischen \mathcal und \mathscr fällt viel leichter, wenn man die Herkunft kennt. Hinter \mathscr steckt rsfs, kurz für Ralph Smith’s Formal Script, veröffentlicht im Oktober 1991. Der Autor schreibt in der README, es handle sich um eine formale Schreibschrift nach den Spencerian- bzw. Copperplate-Handschriften des 18. Jahrhunderts, eng an eine Schrift des Schriftgestalters R. Hunter Middleton angelehnt und dem ähnlich, was die Setzer von Springer Verlag verwendeten. \mathcal ist dagegen die informellere Zierversalie aus der Symbolschrift cmsy von Computer Modern. ℒ und 𝓛 stellen also eine formale Hand einer lockeren Zierform gegenüber; richtig oder falsch ist keines von beiden. Genau diese Förmlichkeit macht rsfs zur bevorzugten Wahl für den Definitionsbereich 𝒟 in der Funktionalanalysis und die Lagrangedichte ℒ in der Feldtheorie.
Auch die Schrift hinter \mathfrak hat einen Namen. amssymb schreibt \DeclareMathAlphabet{\mathfrak}{U}{euf}{m}{n}, und euf steht für Euler Fraktur – die README von AMSFonts hält fest, dass die Euler-Schriften von Hermann Zapf entworfen und ursprünglich in den 1990er Jahren veröffentlicht wurden. Dieselbe README vermerkt, dass Euler 3.0, in dem Zapf viele Glyphen überarbeitete, Donald Knuth am 10. Januar 2008 zu seinem Geburtstag überreicht wurde. Die eckige Schrift für Lie-Algebren 𝔤 und Ideale 𝔭 stammt also von einem der bedeutendsten Schriftgestalter des 20. Jahrhunderts – und anders als \mathbb und \mathcal deckt sie Groß- und Kleinbuchstaben ab. Das vom Paket euscript angebotene Euler Script (eus) gehört zur selben Familie.
\usepackage{amssymb} % \mathbb and \mathfrak
\usepackage{mathrsfs} % \mathscr (Ralph Smith's Formal Script)
% ...
\[
\mathbb{R} \subset \mathbb{C}, \qquad
\mathcal{F}(f) = \hat{f}, \qquad
\mathscr{L}(f) = F, \qquad
\mathfrak{g} = \operatorname{Lie}(G).
\]| Befehl | Benötigtes Paket | Abdeckung und typische Verwendung |
|---|---|---|
\mathbb | amssymb (oder amsfonts) | Nur Großbuchstaben A–Z; die Zahlenmengen ℝ ℂ ℤ ℚ ℕ |
\mathcal | Eingebaut (keines) | Nur Großbuchstaben; Mengenfamilien, Kategorien, Transformationen. Glyphen aus cmsy |
\mathscr | mathrsfs (oder euscript) | Nur Großbuchstaben; die formalere Schreibschrift. Glyphen aus rsfs10 |
\mathfrak | amssymb / amsfonts (euf) | Groß- und Kleinbuchstaben; Lie-Algebren, Ideale. Euler Fraktur |
\mathbb{2} bricht nicht ab – es setzt ein anderes Zeichen
Wer eine Blackboard-Eins oder -Zwei mit \mathbb{1} oder \mathbb{2} erzeugen will, bekommt ein völlig anderes Zeichen – ohne Warnung, ohne Fehler. Setzt man $\mathbb{2}$ mit amssymb unter TeX Live 2024 und holt das Zeichen wieder aus dem PDF heraus, kommt U+22AD (⊭, „not true“) zurück. Der Grund liegt im Mechanismus selbst: \mathbb greift lediglich auf denselben Platz in der msbm-Schrift zu, also erscheint, was in msbm10 auf Platz 2 liegt – und das ist ⊭. Nichts prüft, ob das Zeichen überhaupt existiert. Für die Indikatorfunktion 𝟙 nimmt man \mathds{1} aus dsfont (die Type-1-Schrift dsrom10) oder tauscht das gesamte Blackboard-Alphabet mit dem Paket mathalpha aus. Auch \mathbbm{1} aus bbm ist bekannt, doch die in TeX Live enthaltene Fassung hat keine Type-1-Konturen und landet als Type-3-Bitmap im PDF (in pdffonts gut sichtbar); wo Einreichungsregeln Bitmapschriften ablehnen, meidet man sie besser.
% A blackboard-bold digit is NOT available from amssymb:
% $\mathbb{2}$ -> U+22AD, silently. Use one of these instead.
\usepackage{dsfont} % \mathds{1}, Type 1 outlines
\usepackage[bb=dsserif,scr=rsfs]{mathalpha} % replace the whole \mathbb alphabet
% ...
\[ \mathds{1}_{A}(x), \qquad \mathbb{1}_{A}(x) \]Höchstens sechzehn Alphabete: Too many math alphabets
Wer weiter Alphabete hinzufügt, stößt irgendwann auf ! LaTeX Error: Too many math alphabets used in version normal. Die Grenze liegt bei sechzehn. TeXs mathematische Zeichencodes reservieren nur vier Bit für die Familiennummer, also kann es nie mehr als die Familien 0 bis 15 geben. latex.ltx sagt es unverblümt: \chardef\e@mathgroup@top=16; auf Engines mit \Umathcode (XeTeX und LuaTeX) wird der Wert auf 256 angehoben. Ein nacktes article belegt schon beim Start vier Familien – operators, letters, symbols, largesymbols –, mit amssymb und mathrsfs werden es sieben. Es bleiben rund neun Plätze, in die sich \mathbf, \mathsf, \mathtt, \mathit, \mathcal, \mathbb, \mathfrak und \mathscr nacheinander einreihen. Das Budget gilt eher pro Dokument als pro Formel: Die Plätze füllen sich in der Reihenfolge der ersten Verwendung und werden nicht zurückgegeben.
Über dieselben sechzehn Plätze wacht ein zweiter Türsteher. \DeclareSymbolFont, das eine Symbolschrift registriert, ist in latex.ltx durch die fest verdrahtete Abfrage \ifnum\count18<15 geschützt; darüber hinaus kommt ! LaTeX Error: Too many symbol fonts declared. Genau hier lauert die Falle: Die Zahl 15 gilt unabhängig von der Engine. LuaLaTeX erlaubt zwar 256 Alphabete, Symbolschriften bleiben aber auf sechzehn begrenzt. Ein siebzehntes \DeclareSymbolFont löst unter pdfLaTeX wie unter LuaLaTeX denselben Fehler aus. Nur wer das systemnahe \newfam selbst aufruft und die Obergrenze überschreitet, sieht TeXs eigenes ! No room for a new \mathgroup. – \mathgroup, nicht \fam, denn LaTeX2e macht \newfam zum Alias von \new@mathgroup.
Es gibt auch Erleichterung. Neuere LaTeX-Kernel reservieren die letzten beiden der sechzehn Plätze zum Wiederverwenden (\c@localmathalphabets hat den Vorgabewert 2). Wird im Dokumenttext ein fünfzehntes oder sechzehntes Alphabet gebraucht, verleiht der Kernel den Platz an genau diese Formel und holt ihn danach zurück. Solange also keine einzelne Formel mehr als zwei zusätzliche Alphabete braucht, kommt ein Dokument problemlos über vierzehn hinaus – im Test blieb der Zähler schlicht bei 14 stehen, ohne Fehlermeldung. Die Kehrseite: Drei oder mehr neue Alphabete in einer einzigen Formel, und genau dort bricht es ab. Wenn der Fehler nur bei einer Formel auftritt, ist das die erste Verdächtige. Die Dokumentation von isomath hält ausdrücklich fest, dass sie ihr eigenes \mathsfit wegen dieser Grenze von sechzehn Alphabeten optional macht. Wer gar nicht erst rechnen möchte, wechselt zu XeLaTeX oder LuaLaTeX mit unicode-math – das ist die eigentliche Lösung.
Ein eigenes Alphabet mit \DeclareMathAlphabet
Ein neues mathematisches Alphabet ist eine Zeile: \DeclareMathAlphabet{Befehl}{Kodierung}{Familie}{Serie}{Form}. Es gehört ausschließlich in die Präambel. Eine geneigte serifenlose Schrift für Tensoren? \DeclareMathAlphabet{\mathsfsl}{OT1}{cmss}{m}{sl} – fertig. Soll sie im Fettsatz (dem \mathversion{bold} weiter unten) mitziehen, folgt \SetMathAlphabet{\mathsfsl}{bold}{OT1}{cmss}{bx}{sl}. Wer nur einen weiteren Namen für eine bereits registrierte Symbolschrift braucht, nimmt \DeclareSymbolFontAlphabet – das kostet keinen Platz; mathrsfs.sty besteht im Kern aus genau diesen beiden Zeilen. Und noch etwas: \DeclareMathAlphabet belegt beim Deklarieren keinen Platz, sondern erst bei der ersten tatsächlichen Verwendung. Ein bloß geladenes Paket kann das Budget also nicht aufzehren – das erleichtert die Fehlersuche erheblich.
% preamble only
\DeclareMathAlphabet{\mathsfsl}{OT1}{cmss}{m}{sl}
\SetMathAlphabet{\mathsfsl}{bold}{OT1}{cmss}{bx}{sl}
% costs no slot: just another name for a symbol font already declared
\DeclareSymbolFont{rsfs}{U}{rsfs}{m}{n}
\DeclareSymbolFontAlphabet{\mathscr}{rsfs}
% ...
\[ \mathsfsl{T}_{ij} \]Mathematik fett setzen: \mathbf, \boldsymbol und \bm im Vergleich
\mathbf ist ein aufrechtes Fett und taugt daher weder für Variablen noch für Vektoren, die geneigt sein sollen – und es wirkt auf griechische Buchstaben überhaupt nicht. Eine Messung macht das greifbar: Ein Dokument, das nur $\mathbf{\alpha}$ enthält, mit pdfLaTeX übersetzt und durch pdffonts geschickt, enthält genau eine eingebettete Schrift: CMMI10. Das α erscheint also in gewöhnlichem Mathematikkursiv, nicht im fetten CMMIB10. So ist es gewollt – \mathbf wechselt die Familie, und α liegt auf einem Platz, dessen Form sich beim Wechsel nicht ändert. Da weder Fehler noch Warnung erscheinen, ist das genau die Art Fehler, die unbemerkt eingereicht wird.
Für Fettdruck bei erhaltener Neigung ist \boldsymbol aus amsmath (dessen amsbsy) die erste Wahl, in der Praxis am robustesten aber \bm aus dem Paket bm. Da bm zum erforderlichen Bündel latex-tools gehört, bringt es jede Standarddistribution mit – nichts zu installieren. \bm{…} ist darauf ausgelegt, nur Gewicht hinzuzufügen und Neigung, übrige Form sowie die Abstände ringsum zu erhalten; Variablen, Griechisch und Symbole – selbst komplizierte Eingaben – werden nahezu transparent gefettet. bm definiert außerdem \boldsymbol als Alias für \bm. Umsonst ist \bm allerdings nicht: bm.sty kennt die Grenze \bmmax (Vorgabe 4), die begrenzt, wie viele Familien es für die fette Version beansprucht. Fette mathematische Alphabete stammen aus denselben sechzehn Plätzen und gehören daher in das Budget des vorigen Abschnitts. Wird es knapp, hilft \chardef\bmmax=6 – auf Kosten der gewöhnlichen Alphabete.
Soll eine ganze Formel fett werden – in einer Überschrift, in einer Abbildungsbeschriftung –, wechselt man die Mathematikversion statt zu einem Befehl zu greifen. Genau das tun \boldmath und \mathversion{bold}; Standard-LaTeX liefert zwei Versionen, normal und bold. Eine dritte lässt sich anlegen: \DeclareMathVersion{heavy} deklarieren, die Alphabete mit \SetMathAlphabet{…}{heavy}{…} eintragen, und \mathversion{heavy} schaltet alles um. Das \hm aus bm (Alias \heavysymbol) ist der Befehl für diese heavy-Version, \hmmax hat den Vorgabewert 3. Vorsicht jedoch: Solange keine heavy-Version definiert ist, ist \hm schlicht \bm – \hm zu schreiben liefert also für sich genommen nichts Fetteres.
\usepackage{amsmath} % \boldsymbol
\usepackage{bm} % \bm -- recommended
% \chardef\bmmax=6 % raise bm's family budget if it runs out
% ...
\[
\mathbf{v} \neq \bm{v}, \qquad
\bm{\beta} = (\beta_1, \dots, \beta_n), \qquad
\nabla \bm{F} = \bm{0}.
\]
\section{\boldmath A whole heading in bold maths: $E = mc^2$}\mathbf— aufrecht fett; eingebaut, aber ungeeignet für Variablen, die geneigt sein sollen, und ohne Wirkung auf Griechisch (oben gemessen).\boldsymbol— aus amsmath (amsbsy); erhält die Neigung und kann Griechisch sowie Symbole fetten.\bm— aus dem Paket bm; empfohlen. Fügt nur Gewicht hinzu und erhält Form sowie umgebende Abstände. Der Familienverbrauch wird von\bmmax(Vorgabe 4) begrenzt.\boldmath/\mathversion{bold}— schaltet die gesamte Mathematikversion um statt eines einzelnen Bereichs; für Überschriften und Abbildungsbeschriftungen.
Die \sym…-Befehle: Alphabete, die auf Unicode abbilden
Wird unicode-math unter XeLaTeX oder LuaLaTeX geladen, treten an die Stelle der Alphabetbefehle die \sym…-Familie: \symbf (fett), \symbb (Blackboard), \symcal (kalligrafisch), \symscr (Skript), \symfrak (Fraktur), \symup (aufrecht), \symit (kursiv), \symsf (serifenlos). Die alten Namen bleiben erhalten, doch \mathbb ist tatsächlich als Alias für \symbb und \mathcal als Alias für \symcal neu definiert. Der entscheidende Unterschied: \sym… ist kein Familienwechsel, sondern eine Abbildung auf die Mathematical Alphanumeric Symbols von Unicode. Setzt man $\symbb{2}\ \symbb{r}\ \symcal{L}$ mit STIX Two Math unter LuaLaTeX und holt die Zeichen aus dem PDF zurück, erhält man U+1D7DA (𝟚), U+1D563 (𝕣) und U+2112 (ℒ). Das \mathbb{2}, das im vorigen Abschnitt ⊭ ergab, ist hier eine echte Blackboard-Zwei, und auch Kleinbuchstaben stehen bereit. Diese Abbildung ist zugleich der Grund, warum ein aus dem PDF kopiertes Zeichen seine Bedeutung behält.
Diese Abbildung hat eine Folge, über die man ohne Vorwarnung sicher stolpert: \symcal und \symscr bilden auf dieselben Unicode-Zeichen ab. Die Mathematical Alphanumeric Symbols enthalten nur ein einziges Skriptalphabet, also sind \symcal{L} und \symscr{L} beide U+2112. Um sie optisch zu trennen, greift man über range= zu den OpenType-Stilsets der Schrift. Bei STIX Two Math folgt auf das Haupt-\setmathfont die Zeile \setmathfont{STIX Two Math}[range=\symscr,StylisticSet=1]; gemessen ergibt diese eine Zeile für \symcal{L} eine Breite von 6,99 pt gegenüber 8,63 pt für \symscr{L} – die Zahlen bestätigen, dass eine andere Glyphe gewählt wurde. Was der alte Weg mit zwei Alphabetplätzen löste, löst unicode-math durch die Angabe einer Schriftfunktion.
% compile with xelatex or lualatex
\usepackage{amsmath}
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
\setmathfont{STIX Two Math}[range=\symscr,StylisticSet=1] % a second script shape
% ...
\[
\symbb{R} \subset \symbb{C}, \qquad \symbb{2}, \qquad
\symcal{F} \neq \symscr{F}, \qquad \symfrak{g}, \qquad
\symbfit{v} = \symbf{0}.
\]Zum Schluss eine Warnung zu \symbf unter unicode-math. In der Voreinstellung (bold-style=TeX) ist \symbf{v} fett und *aufrecht*. Gemessen ergab \symbf{v} U+1D42F (fettes aufrechtes v) und \symbfit{v} U+1D497 (fettes kursives v). Wer Vektoren fettkursiv schreibt, nimmt \symbfit oder setzt bold-style=ISO. Wie man die Mathematikschrift für das gesamte Dokument auswählt – was \setmathfont bekommt und wie es zur Textschrift passt –, ist Thema einer eigenen Seite.