! LaTeX Error: Missing \begin{document}. ist unter den LaTeX-Fehlern eine Seltenheit: eine Meldung, die über sich selbst lügt. In den meisten Dokumenten, die sie erzeugen, steht ein tadelloses \begin{document}. Die Wahrheit lautet: LaTeX prüft nie, ob \begin{document} vorhanden ist. Geprüft wird nur, ob ein Absatz begonnen hat – und in der Präambel ist eine Falle gestellt, die genau in diesem Moment diesen Wortlaut ausgibt. Die Meldung ist also nicht als „\begin{document} fehlt“ zu lesen, sondern als „vor \begin{document} ist etwas Druckbares aufgetaucht“. Diese Seite belegt den Mechanismus im Quelltext des LaTeX-Kerns und geht dann die drei Ursachenfamilien durch: verirrter Fließtext, ein in der Präambel vergessenes \maketitle und ein einzelnes unsichtbares Byte.
Warum die Meldung über sich selbst lügt
LaTeX belegt \everypar in der Präambel mit \@nodocument, und das schlägt in dem Augenblick zu, in dem ein Absatz beginnt. \everypar ist TeXs Haken, der bei jedem Absatzbeginn ausgeführt wird – und ein Absatz beginnt genau dann, wenn etwas Druckbares auftaucht. Die betreffenden Zeilen von latex.ltx, dem LaTeX-Kern selbst, tragen bis heute den Kommentar der Entwickler.
\gdef\@nodocument{%
\@latex@error{Missing \protect\begin{document}}\@ehd}
\everypar{\@nodocument} %% To get an error if text appears before the
\nullfont %% \begin{document}„To get an error if text appears before the \begin{document}“ – der Kommentar sagt es unumwunden. Die Aufgabe von \begin{document} ist es, diese Falle zu entschärfen; die Falle selbst sucht gar nicht nach \begin{document}. Das \nullfont in der Zeile darunter folgt derselben Überlegung: In der ganzen Präambel ist die aktuelle Schrift eine, die überhaupt keine Zeichen enthält, damit versehentlich Gedrucktes nichts auf der Seite hinterlässt. Damit steht auch fest, wie zu reparieren ist: Gesucht wird nicht \begin{document}, sondern das Druckbare, das davor steht. Ein einziger Blick sollte trotzdem prüfen, ob die Zeile wirklich vorhanden und richtig geschrieben ist – selten, aber durchaus möglich, erzeugt ein tatsächlich fehlendes \begin{document} dieselbe Meldung. Nach diesem einen Blick lohnt es nicht, weiter darauf zu starren.
Das Log zeigt genau das eine Zeichen
Die l.NN-Zeile bricht genau hinter dem Zeichen um, das den Fehler ausgelöst hat. TeX teilt die betroffene Zeile in Gelesenes und noch nicht Gelesenes und stapelt beide Hälften; das Ende der oberen Hälfte ist also der Übeltäter selbst. Daher der Eindruck, ein Wort sei mitten entzweigeschnitten: Unten war das T am Anfang von Zeile 3 das erste Druckbare, es begann einen Absatz, und die Falle schlug zu. In jenem Dokument steht in Zeile 4 ein tadelloses \begin{document}.
! LaTeX Error: Missing \begin{document}.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.3 T
his line is body text by mistake.Was in einer Präambel als druckbar zählt
In eine Präambel gehören nur Befehle, die einen Wert festhalten und nichts drucken. \usepackage, \title, \author, \date, \newcommand und Einstellungen aller Art legen bloß Informationen ab und beginnen daher nie einen Absatz. Alles hingegen, was etwas auf die Seite bringen will, erzeugt diesen Fehler. Die Trennlinie verläuft nicht bei „sieht nach Fließtext aus“, sondern bei „erzeugt Ausgabe“ – deshalb ist \title{Mein Aufsatz} harmlos und \maketitle nicht, eine Unterscheidung, die zunächst seltsam wirkt.
- Verirrter Fließtext – ein angefangener Satz unter
\documentclassoder eine als Kommentar gedachte Zeile, deren%nie getippt wurde. Das ist mit Abstand die häufigste Ursache. - Ein
\maketitlein der Präambel – es direkt neben\titlezu schreiben, passiert oft.\maketitlegehört hinter\begin{document}. - Der Aufruf eines Makros, das Text ausgibt – ein einzeln stehendes
\todayin der Präambel oder ein eigenes Makro, das schlicht zu einer Zeichenkette expandiert. Solche Makros zu definieren ist harmlos, sie aufzurufen nicht. - Ein einzelnes überzähliges Zeichen – ein
~direkt hinter\usepackage{amsmath}oder ein Zeichen außerhalb einer nicht geschlossenen Klammer. Eine überzählige}ergibt dagegen! Too many }.
\documentclass{article}
\title{My Paper} % safe: records a value, prints nothing
\author{Me} % safe
\maketitle % ! LaTeX Error: Missing \begin{document}.
\begin{document}
\maketitle % this is where it belongs
\end{document}Wenn ein einzelnes unsichtbares Byte schuld ist
Wer die Präambel dreimal gelesen und nichts Druckbares gefunden hat, hat sehr wahrscheinlich ein geschütztes Leerzeichen, U+00A0, vor sich. In LaTeXs utf8enc.dfu steht die Zeile \DeclareUnicodeCharacter{00A0}{\nobreakspace}, die U+00A0 als druckbares Leerzeichen definiert. Es ist damit echte Ausgabe und beginnt in einer Präambel einen Absatz. Auf dem Bildschirm ist es von einem gewöhnlichen Leerzeichen nicht zu unterscheiden. Es gelangt ganz beiläufig hinein: in einer aus einer Webseite oder einem PDF kopierten \usepackage-Zeile, über Option+Space auf dem Mac, über ein französisches Tastaturlayout. In diesem Fall hat die Zeilenhälfte über l.NN ein auffälliges Aussehen – an ihrem Ende scheint überhaupt nichts zu stehen.
| Zeichen | Wie es hineingerät | Verhalten in einer Präambel |
|---|---|---|
U+00A0 | geschütztes Leerzeichen; aus dem Web oder PDF kopiert, Option+Space am Mac, französische Belegungen | wird als \nobreakspace gesetzt, daher dieser Fehler – bei jeder Engine gleich |
U+3000 | ideografisches Leerzeichen; bei aktiver CJK-Eingabe getippt oder aus CJK-Text kopiert | dieser Fehler bei xelatex und lualatex; bei pdflatex stattdessen Unicode character not set up |
U+FEFF | ein BOM; manche Windows-Editoren setzen es an den Anfang einer UTF-8-Datei | unter TeX Live 2024 überspringen es pdflatex, xelatex und lualatex allesamt. Nicht die Ursache |
Die letzte Zeile der Tabelle widerspricht einem viel wiederholten Ratschlag. Ein BOM ist nicht die Ursache dieses Fehlers. Unter TeX Live 2024 läuft eine Datei mit BOM am Anfang durch pdflatex, xelatex und lualatex, ohne auch nur eine Warnung – selbst dann, wenn der Befehl file sie als UTF-8 (with BOM) text meldet. Deshalb hilft „ohne BOM neu speichern“ so oft nicht weiter; die Zeit ist besser in die Suche nach einem U+00A0 investiert. Nebenbei: \usepackage[utf8]{inputenc} braucht es ebenfalls nicht mehr, seit LaTeX News 28 (2018) UTF-8 zur voreingestellten Eingabekodierung gemacht hat. Kodierungen als solche behandelt die Seite „Kodierung und Zeilenumbrüche“.
Das verirrte Byte tatsächlich finden
Eine Präambel sollte reines ASCII sein; mechanisch nach Zeilen mit einem Nicht-ASCII-Zeichen zu suchen, trifft daher sofort. Über die ganze Datei laufen gelassen, passt allerdings jede Zeile japanischen oder chinesischen Fließtextes, und das Ergebnis ist wertlos. Der Kniff besteht darin, die Datei zuvor bei \begin{document} abzuschneiden. Steht die Zeile fest, zeigt sed -n l ihre Bytes: Ein U+00A0 erscheint als \302\240, womit die Identifizierung feststeht. Danach genügt es, diese zwei Bytes als gewöhnliches Leerzeichen neu zu tippen.
# list preamble lines that contain a non-ASCII character
sed -n '1,/begin{document}/p' paper.tex | LC_ALL=C grep -n '[^ -~]'
# reveal the bytes on a suspect line (U+00A0 shows up as \302\240)
sed -n '3p' paper.tex | sed -n l
# check whether the file carries a byte order mark
file paper.tex