Missing $ inserted

! Missing $ inserted ist der häufigste Fehler in LaTeX, und der Hilfetext darunter endet mit den Worten Proceed, with fingers crossed. Diese Formulierung stammt von Donald Knuth, sie steht seit den 1980er-Jahren in TeX selbst und erscheint noch heute täglich auf irgendeinem Bildschirm. Die Meldung bedeutet genau eines: Etwas, das nur innerhalb von Mathematik erlaubt ist, ist im laufenden Text aufgetaucht. Schuld ist meist ein Unterstrich _, der wörtlich gemeint war, ein Hochstellungszeichen ^, ein verirrtes \alpha oder ein viel weiter oben nie geschlossenes $. Diese Seite zeigt, wie sich die Meldung lesen lässt, warum die genannte Zeilennummer oft hinter dem eigentlichen Fehler liegt und was an den drei Stellen zu schreiben ist, an denen die Antwort verschieden ausfällt: im Fließtext, in \verb und in \url.

Worüber sich ! Missing $ inserted wirklich beschwert

Sie bedeutet, dass ein Token, das es nur im Mathematikmodus gibt, mitten im waagerechten Textsatz auftauchte – mehr nicht. TeX vermutet einen vergessenen Mathematikbeginn, fügt stillschweigend ein $ ein und setzt weiter. Die Korrektur passt in einen Satz: War Mathematik gemeint, umschließen ($x_1$); war das Zeichen selbst gemeint, maskieren (\_). Eine Ebene tiefer liegt der Mechanismus der Kategoriecodes. TeX weist jedem Eingabezeichen eine Nummer zu: _ hat Catcode 8 (Tiefstellung), ^ hat 7 (Hochstellung), $ hat 3 (Mathematikumschaltung). Die Catcodes 7 und 8 sind ausschließlich innerhalb von Mathematik erlaubt. \alpha und \frac scheitern aus demselben Grund – intern verlangen sie Zeichen der Mathematikklasse.

latex
% "$" is not sacred: it is just the character whose catcode is 3.
% Give catcode 3 to "!" and it opens and closes math exactly like $.
\catcode`\!=3
Then !x_1! typesets as math.   % compiles with zero errors

Der Ausschnitt oben wirkt wie ein Scherz, kompiliert unter TeX Live 2024 aber ohne einen einzigen Fehler. $ ist nicht heilig; es ist bloß das Zeichen, dessen Catcode zufällig 3 lautet. Sobald das einleuchtet, verliert der Fehler sein Rätselhaftes: Es geht um eine Verwechslung der Rolle eines Zeichens. Daraus folgt auch, dass _ und ^ nicht die einzigen Sonderzeichen sind, die im Text Ärger machen – aber ein anderes Zeichen erzeugt eine andere Fehlermeldung, weshalb die folgende Tabelle beim Einordnen hilft. Ein verbreiteter Irrtum: Ein & im Fließtext erzeugt kein ! Missing $ inserted.

ZeichenCatcodeWas im Fließtext geschieht
_8! Missing $ inserted. Für einen echten Unterstrich \_ schreiben
^7! Missing $ inserted. Das Zeichen selbst ist \textasciicircum
$3Öffnet/schließt Mathematik. Einzeln bleibt Mathematik bis zum Absatzende offen
&4Anderer Fehler: ! Misplaced alignment tab character &. Zeichen selbst: \&
%14Gar kein Fehler. Es verschluckt den Zeilenrest – auch ein schließendes $
#6! You can’t use ‘macro parameter character #’ in horizontal mode
~13Kein Fehler; wird zum geschützten Leerzeichen (Zeichen selbst: \textasciitilde)

<inserted text> und die Zeile l.3 lesen

Das $ unter <inserted text> hat TeX selbst hinzugefügt; es steht nicht in der Datei. Die Zeile l.3 dagegen ist der Tatort: TeX druckt die betroffene Zeile in zwei Hälften umbrochen, und der Umbruch markiert genau, wie weit gelesen wurde. Unten steht die echte Ausgabe von pdfLaTeX (TeX Live 2024) für eine vierzeilige Datei, deren Text nur The value x_1 is here. lautet. Der Umbruch liegt unmittelbar hinter x_: TeX hielt in dem Moment an, in dem es den Unterstrich las. Diese zweiteilige Darstellung ist das Nützlichste an einer TeX-Fehlermeldung, weil sie die Stelle innerhalb einer langen Zeile genau angibt.

log
! Missing $ inserted.
<inserted text>
                $
l.3 The value x_
                1 is here.
I've inserted a begin-math/end-math symbol since I think
you left one out. Proceed, with fingers crossed.

Dieselbe Meldung erscheint Wort für Wort auch unter plain TeX. Sie stammt also nicht von LaTeX, sondern von der TeX-Engine selbst und tritt sogar auf, wenn die Datei keine einzige \usepackage-Zeile enthält. Deshalb sollte bei der Ursachensuche zuerst das eigene Getippte und erst dann ein Paket verdächtigt werden. Der Schlusssatz des Hilfetextes, Proceed, with fingers crossed, ist seit dem Einfrieren von TeX im Jahr 1990 im Wesentlichen unverändert.

Warum die gemeldete Zeilennummer hinter dem Fehler liegt

TeX meldet die Zeile, in der es etwas bemerkt hat, nicht die Zeile mit dem Fehler. Bei etwas, das schon beim Lesen unzulässig ist – etwa _ –, fallen beide zusammen. Bei Fehlern, die Mathematik offen lassen, etwa einem nie geschlossenen $, bemerkt TeX das Problem jedoch erst am Absatzende, also bei der nächsten Leerzeile. Da eine Formel keinen Absatzwechsel überspannen darf, ist die Leerzeile der erste Moment, in dem TeX schließen kann, dass Mathematik noch offen ist. In der Datei unten steckt der Fehler in Zeile 3, gemeldet wird aber Zeile 4, die Leerzeile.

document.tex
\documentclass{article}
\begin{document}
The rate is $x% of the total$ per year.

Next paragraph.
\end{document}
log
! Missing $ inserted.
<inserted text>
                $
l.4

I've inserted a begin-math/end-math symbol since I think
you left one out. Proceed, with fingers crossed.

Die Falle ist das % in Zeile 3. Ein nicht maskiertes Prozentzeichen kommentiert den Rest der Zeile aus – samt schließendem $ –, sodass die Mathematik in die nächste Zeile hinein offen bleibt. Rechts von l.4 steht nichts, weil Zeile 4 die Leerzeile ist. Ist die Fehlerzeile leer, heißt das: Mathematik steht seit irgendwo weiter oben offen. In der Praxis geht man am schnellsten zum Absatz unmittelbar vor der gemeldeten Zeile und zählt dort die $. Editoren gleichen Klammern ab, aber keine $; diesen Schritt muss man selbst tun. Nach demselben Mechanismus erzeugt eine Zeile mit 50% statt 50\% einige Zeilen später einen rätselhaften Fehler.

Einen echten Unterstrich setzen: \_, \textunderscore und _ in \verb

Wer nur einen Dateinamen wie data_set.csv setzen will, schreibt data\_set.csv. Das Verhältnis von \_ zu \textunderscore lohnt aber einen Blick. In der Kerneldatei latex.ltx ist \_ definiert als „im Mathematikmodus \nfss@text{\textunderscore}, sonst \textunderscore“ – es ist dasselbe. Im Text sind beide also exakt gleichwertig; \_ ist nur die Kurzform, die auch im Mathematikmodus funktioniert. Wichtiger ist das Folgende: In der voreingestellten Kodierung OT1 wird der Unterstrich als Linie gezeichnet, nicht als Zeichen gesetzt. Die Kerneldefinition lautet \leavevmode \kern.06em\vbox{\hrule\@width.3em} – eine waagerechte Linie von 0,3 em Breite. Folglich lässt sich der Unterstrich nicht aus dem PDF kopieren, und die PDF-Suche findet ihn nicht. Mit \usepackage[T1]{fontenc} greift \DeclareTextSymbol{\textunderscore}{T1}{95} aus t1enc.def, und es entsteht eine echte Glyphe, die kopiert und gefunden wird. Durch pdftotext geschickt liefert dasselbe Dokument in OT1 data set, in T1 dagegen data_set.

SchreibweiseErgebnisWann sinnvoll
\__Standardform; funktioniert im Text und in Mathematik
\textunderscore_wozu \_ expandiert; im Text kein Unterschied
\verb|a_b|a_bohne Maskierung; ein \_ darin druckt auch den Backslash
underscore_ein Paket; danach ist ein nacktes _ im Text unbedenklich
\textasciicircum^ein wörtliches ^, keine Hochstellung
latex
% math, when you mean math
The value $x_1$ and $\alpha$ are positive, and $x^2 \ge 0$.

% characters, when you mean characters
Open data\_set.csv, then press \textasciicircum{}C to stop.

% verbatim, when the string is code
Run \verb|make data_set^2| in the shell.

In \url und siunitx kehrt sich die Antwort um

In \url{...} darf _ nicht maskiert werden. \url{https://example.com/a_b} läuft unverändert korrekt durch, während \url{a\_b} tatsächlich a\_b samt Backslash druckt. Der Grund: Das Paket url schreibt die Kategoriecodes um, bevor es sein Argument liest, und macht _ und die übrigen Sonderzeichen wieder zu gewöhnlichen Zeichen. Ähnlich verhält sich siunitx: \num und \qty öffnen intern selbst den Mathematikmodus, sodass \qty{2.5}{\micro\metre} direkt im Fließtext stehen darf. Anders gesagt: Was zu tippen ist, hängt davon ab, in wessen Argument man sich befindet. Als Faustregel gilt: Behandelt der Befehl seinen Inhalt wörtlich, gehört das nackte Zeichen hinein, sonst die maskierte Form. \verb, \url und \lstinline aus listings gehören zur ersten Sorte, \section, \caption und \footnote zur zweiten.

latex
\usepackage{url}       % or hyperref, which loads url
\usepackage{siunitx}
...
\url{https://example.com/a_b}    % right: bare underscore
\url{https://example.com/a\_b}   % wrong: prints the backslash
\qty{2.5}{\micro\metre}          % siunitx opens math for you

Eine Leerzeile in \[ … \] und ! Display math should end with $$

Eine einzige Leerzeile in abgesetzter Mathematik erzeugt drei Fehler. Man trennt eine Formel für die Lesbarkeit auf zwei Zeilen – und das Dokument bricht. Setzt man zwischen \[ E = mc^2 und F = ma eine Leerzeile, gibt TeX Live 2024 nacheinander ! Missing $ inserted, ! Display math should end with $$ und ! LaTeX Error: Bad math environment delimiter aus. Alle drei folgen aus der einen Regel, dass eine Formel keinen Absatzwechsel überspannen darf. Zum Aufteilen dient die Umgebung align oder \\, niemals eine Leerzeile; für Prosa zwischen zwei Zeilen einer abgesetzten Formel gibt es \intertext aus amsmath. ! Display math should end with $$ erscheint übrigens auch, wenn die Zahl der öffnenden und schließenden Dollarzeichen nicht übereinstimmt, etwa bei $$ … $. In LaTeX ist \[ … \] die übliche Form und nicht $$, denn $$ ignoriert die Abstandsparameter wie \abovedisplayskip.

log
! Missing $ inserted.
<inserted text>
                $
l.5

! Display math should end with $$.
<to be read again>
                   \tex_par:D
l.5

! LaTeX Error: Bad math environment delimiter.
l.7 \]

Wenn aus einem Fehler fünf Meldungen werden

Kommen die Fehler in Scharen, wird nur der erste behoben. Die übrigen sind fast immer Kollateralschäden des von TeX eingefügten $. Übersetzt man eine Datei, deren Text nur aus \frac{1}{2} im Fließtext besteht, entsteht eine Kette von dreien: ! Missing $ inserted (bei \frac), ! Extra }, or forgotten $. (von der schließenden Klammer des \over in der Definition von \frac) und noch einmal ! Missing $ inserted bei \end{document}. Nach dem ersten Fehler läuft TeX weiterhin im Mathematikmodus weiter, sodass der folgende Text als Mathematik gedeutet wird: In Wörtern klaffen Lücken, die Interpunktionsabstände zerfallen, und weitere Fehler prasseln herunter. Das Vorgehen liegt damit fest: den ersten Fehler beheben und neu übersetzen. Die zweite und alle weiteren Meldungen vorher zu lesen, ist verlorene Mühe.

  • Zur angegebenen Zeile l.N springen und sie bis zum Umbruch lesen; das Zeichen direkt hinter dem Umbruch ist der Übeltäter.
  • Fällt der Umbruch auf eine Leerzeile, im Absatz davor die $ zählen – eine ungerade Anzahl bedeutet ein ungeschlossenes.
  • Dieselbe Zeile bis zum Ende prüfen: Verschluckt ein nicht als Kommentar gemeintes % das schließende $?
  • War Mathematik gemeint, $ … $ schreiben; waren Zeichen gemeint, \_, \%, \&, \#, \textasciicircum{}.
  • Für Code oder Bezeichner wörtlich \verb oder listings verwenden, statt jedes Zeichen einzeln zu maskieren.
  • Nach der Korrektur erst neu übersetzen, dann den nächsten Fehler lesen.