Ein Blick in die ausführbaren Dateien von TeX Live 2024 fördert Merkwürdiges zutage: latex, pdflatex und etex sind überhaupt keine Programme, sondern symbolische Links auf pdftex. Einzig Knuths TeX selbst – der Befehl tex – existiert noch als eigenständiges Programm. Wer das einmal begriffen hat, löst damit den größten Teil der Verwirrung rund um LaTeX auf, denn dahinter steht die Unterscheidung, auf der das ganze System beruht: Engine (das Programm) und Format (ein vorgeladener Satz von Makros) sind zweierlei. Diese Seite behandelt das eingefrorene Programm zuunterst und die in den 1990er Jahren aufgesetzten e-TeX-Erweiterungen – jene Grundlage, auf der heute alle unbemerkt arbeiten.
Was der Befehl tex tatsächlich ausführt
tex startet ein Programm, das Zeichen und Kästen zu Zeilen und Absätzen packt, die Zeilenumbrüche optimiert und das Ergebnis in eine Datei schreibt – und im Wesentlichen sonst nichts. Die Verwirrung beginnt damit, dass das Wort TeX sowohl dieses Programm als auch das Befehlssystem bezeichnet, das das Programm interpretiert. Von Gliederung, Querverweisen und Literaturverzeichnissen weiß das Programm selbst nichts.
Knuth begann 1978 mit dem ersten TeX, veranlasst durch die Fahnen des zweiten Bandes seines The Art of Computer Programming, deren Formelsatz er unerträglich fand. Diese erste Fassung war ein tastender Prototyp und wurde 1982 vollständig neu geschrieben; diese Neufassung ist TeX82, und „TeX“ meint heute praktisch diese Linie. Der minimale Befehlssatz, den Knuth unmittelbar in das Programm einbaute, sind die Primitive – \def (einen Befehl definieren), \hbox (eine waagerechte Box), \vbox (eine senkrechte Box) und Verwandtes.
Ein Dokument in bloßen Primitiven zu schreiben ist unpraktikabel. Deshalb verwendet man in der Praxis ein Format: eine darauf aufgesetzte Schicht von Makros. Das Laden von plain.tex ergibt plain TeX, das Laden eines weit größeren Makrosatzes ergibt LaTeX. Ein Format wird nicht bei jedem Lauf neu gelesen, sondern vorab expandiert, als .fmt-Datei gespeichert und beim Start augenblicklich zurückgeladen. Die Einzelheiten dazu – was in einer .fmt steckt, wie fmtutil sie neu baut, wie sich LaTeX2e zu LaTeX3 verhält – gehören auf die Seite „LaTeX-Formate“.
Welches von tex, initex und etex ist ein echtes Programm
Nur tex. initex ist ein symbolischer Link auf tex, und etex ist ein Link auf pdftex – e-TeX als eigenständiges Programm existiert in aktuellen Distributionen also gar nicht mehr. Das ist keine Meinung, sondern in Sekunden mit readlink auf dem eigenen Rechner nachprüfbar. Unter TeX Live 2024 antwortet tex --version mit TeX 3.141592653 (TeX Live 2024).
$ tex --version | head -1
TeX 3.141592653 (TeX Live 2024)
# Which of these are real binaries, and which are links?
$ cd $(dirname $(which tex))
$ readlink tex initex etex latex pdflatex amstex csplain
# tex prints nothing: it is a real executable
tex # initex -> tex
pdftex # etex -> pdftex
pdftex # latex -> pdftex
pdftex # pdflatex -> pdftex
pdftex # amstex -> pdftex
pdftex # csplain -> pdftexWarum ist das so? Weil die e-TeX-Erweiterungen vollständig in die anderen Engines aufgenommen wurden. Die mit TeX Live ausgelieferte Datei doc/etex/base/README (Karl Berry, 2024) sagt es ungeschminkt: Die in den meisten Distributionen bereitgestellte ausführbare Datei etex ist eine Inkarnation von pdfTeX im DVI-Modus – gerade damit auch die über e-TeX hinausgehenden Erweiterungen zur Verfügung stehen. Nach derselben Logik ist latex kein „altes TeX“, sondern pdfTeX im DVI-Modus; beim Aufruf meldet das Banner This is pdfTeX, .... Solche Vertauschungen funktionieren nur, weil Engine und Format unabhängige Achsen sind.
Plain TeX: eine Welt ohne \documentclass und ohne \begin{document}
Plain TeX ist das Standardformat, das Knuth in The TeXbook vorstellt. Es bündelt eine minimale Ausstattung – Schrifteinrichtung, die grundlegenden mathematischen Zeichen, bequeme Makros wie \bye – in plain.tex, das mit TeX selbst ausgeliefert wird. Vor LaTeX war dies der einzige praktikable Weg, TeX zu nutzen. In TeX Live 2024 erzeugt die Engine tex dieses Format aus tex.ini und legt es als tex.fmt ab.
Die Notation weicht deutlich von LaTeX ab. Inline-Mathematik ist in beiden $...$, doch eine waagerechte Box heißt \hbox{...}, eine senkrechte \vbox{...}, tabellarischer Satz geschieht mit \halign, ein Befehl wird mit \def definiert, die Textbreite ist \hsize, und ein Dokument endet mit \bye. Es gibt kein \documentclass und kein \begin{document} – LaTeX baut beides aus Makros. Umgekehrt gelesen sagt das etwas Wichtiges: Die Bequemlichkeiten von LaTeX sind Leistungen des Formats, nicht der Engine.
% plain TeX — process with: tex hello.tex (produces hello.dvi)
\hsize=10cm
\font\big=cmr10 at 17pt
{\big Hello, plain \TeX!}
\medskip
This paragraph is set in the default font.
Inline math works too: $E = mc^2$.
\byeVerarbeitet man das mit tex hello.tex, entsteht eine DVI-Datei – kein PDF; dazu gleich mehr. Logo-Makros wie \TeX und Abstandsmakros wie \medskip (ein mittlerer vertikaler Sprung) definiert ebenfalls plain TeX. Stellt man es neben ein LaTeX-Dokument mit \documentclass, sieht man, wie dünn die Haut ist, die plain TeX über die nackte Engine legt.
Literate Programming und WEB: wie TeX’ eigener Quelltext geschrieben ist
TeX selbst ist in WEB geschrieben, Knuths eigenem System und der Gründungspraxis des Literate Programming. Eine WEB-Quelle ist ein einziges Dokument, in dem Erläuterung für Menschen und Pascal-Code miteinander verwoben sind. Zwei Werkzeuge ziehen daraus unterschiedliche Ableitungen: tangle erzeugt kompilierbares Pascal, weave den gesetzten Kommentar – das Buch TeX: The Program.
Die ursprüngliche Zielsprache war Pascal; in modernen Distributionen übersetzt ein Werkzeug namens web2c das WEB (über Pascal) nach C und baut daraus. Das heißt: pdfTeX, XeTeX oder LuaTeX, die heute auf dem eigenen Rechner laufen, gehen letztlich auf jene eine literarische Quelle zurück. Deshalb taucht der Name web2c in der Verzeichnisstruktur von TeX Live immer wieder auf.
Eine gegen π konvergierende Versionsnummer und ein eingefrorenes Programm
Die Versionsnummerierung von TeX ist eigenwillig. Seit Version 3 hängt jedes Update eine weitere Ziffer an, sodass sich die Zahl asymptotisch π nähert. Ruft man in der mit TeX Live 2024 gelieferten Fassung tex --version auf, antwortet sie TeX 3.141592653. Das begleitende METAFONT tut dasselbe in Richtung e, der Basis des natürlichen Logarithmus – erst beides zusammen macht den Witz sichtbar.
Und Knuth hat erklärt, die „absolut letzte Änderung“, die nach seinem Tod vorgenommen wird, werde die Version auf genau π setzen – womit alle verbliebenen Fehler in seiner eigenen Formulierung zu Features werden (Donald E. Knuth, „The future of TeX and METAFONT“, NTG-Zeitschrift MAPS, 1990; nachgedruckt als Kapitel 30 von Digital Typography). Dieses Einfrieren war eine Entwurfsentscheidung, keine Kapitulation. Gerade weil das Fundament sich nicht bewegt, können die darauf aufsetzenden Formate und Treiber sich unbesorgt weiterentwickeln. Dass eine .tex-Datei von vor Jahrzehnten heute dieselbe Ausgabe erzeugt, folgt unmittelbar daraus.
METAFONT und DVI: warum TeX kein PDF direkt ausgibt
TeX hat einen Zwillingsgefährten, METAFONT (Befehl mf): ein System, das eine Schrift nicht als feste Formen, sondern als Programm zum Zeichnen der Glyphen beschreibt. Knuth entwarf damit die gesamte Familie Computer Modern für TeX. Die Arbeitsteilung ist sauber – TeX entscheidet, wohin die Zeichen kommen, METAFONT erzeugt die Formen der Zeichen selbst.
Und was Knuths TeX unmittelbar ausgibt, ist kein PDF, sondern eine DVI-Datei (DeVice Independent). Ein DVI enthält nur geräteunabhängige Anweisungen – „setze dieses Zeichen an diese Position“ –, die dvips dann in PostScript oder dvipdfmx in PDF verwandelt. 1982 gab es PDF noch nicht, insofern war das die naheliegende Konstruktion; umgekehrt gelesen heißt es, dass sich das Ausgabeformat ändern konnte, ohne TeX selbst umzuschreiben. Der große Unterschied der heute verbreiteten pdfTeX, XeTeX und LuaTeX ist, dass sie diesen Schritt nach innen geholt haben und PDF direkt schreiben können.
Was e-TeX ist: ein eingefrorenes Programm erweitern, ohne es zu brechen
e-TeX ist eine Erweiterung, die dem eingefrorenen TeX neue Primitive als strenge Obermenge hinzufügt. Nachdem Knuth TeX eingefroren hatte, mussten neue Funktionen aus anderen Händen kommen. Unter der Schirmherrschaft von DANTE e.V., der deutschsprachigen TeX-Anwendervereinigung, entstand 1992 das NTS-Projekt (New Typesetting System), und e-TeX war dessen erstes konkretes Ergebnis. Umgesetzt hat es Peter Breitenlohner vom Max-Planck-Institut für Physik in München (gestorben 2015), Koordinator des Projekts war Philip Taylor. Die mit TeX Live gelieferte Handbuchseite etex.1 nennt als Ziel, Geist und Philosophie von TeX fortzuführen und weiterzuentwickeln – und dabei Knuths Wunsch zu achten, dass TeX eingefroren bleibt.
„Strenge Obermenge“ heißt: Vorhandene Eingaben laufen unverändert und liefern identische Ausgaben. Um das zu garantieren, kennt e-TeX zwei Modi. Im Kompatibilitätsmodus verhält es sich genau wie nacktes TeX; erst im erweiterten Modus stehen die zusätzlichen Primitive zur Verfügung. Was davon greift, entscheidet sich nicht zur Laufzeit, sondern beim Bau des Formats: Stellt man dem Quelldateinamen des Formats beim Dumpen ein * voran, wählt man den erweiterten Modus. Wie der nächste Abschnitt zeigt, ruht das gesamte moderne LaTeX auf dieser Ein-Zeichen-Konvention.
Warum man längst unbemerkt e-TeX verwendet
Weil das LaTeX-Format im erweiterten Modus gedumpt wird. Das ist keine Vermutung, sondern steht in einer Konfigurationsdatei. Öffnet man fmtutil.cnf in TeX Live 2024, findet sich die Zeile latex pdftex language.dat -translate-file=cp227.tcx *latex.ini; das * vor latex.ini fordert den erweiterten Modus an – und der Kommentarkopf derselben Datei stellt fest, dass dieses * im Wesentlichen der Option -etex entspricht. Die Zeile für plain TeX lautet dagegen tex tex - tex.ini: Engine tex, kein *. Nur das nackte TeX ist ohne die e-TeX-Erweiterungen geblieben.
Dasselbe lässt sich von der LaTeX-Seite her bestätigen. Nahe dem Anfang der Kerndatei latex.ltx steht die Wache \ifx\eTeXversion\undefined \errmessage{LaTeX requires e-TeX}: Ohne die Erweiterungen bricht schon der Bau des Formats ab. Auch der Zeitpunkt, an dem das offiziell wurde, ist dokumentiert – LaTeX News 16 (Dezember 2003) kündigte an, dass die Releases binnen etwa zwei Jahren e-TeX voraussetzen würden, und LaTeX News 26 erklärte, dass ab dem Release vom Januar 2017 e-TeX zum Bau des Formats erforderlich ist. Die Zeile entering extended mode in der dritten Zeile eines latex-Laufs ist die sichtbare Spur dieser Entscheidung.
# Ask each engine whether the e-TeX primitives exist.
$ cat > probe.tex <<'EOF'
\message{[eTeX=\ifx\eTeXversion\undefined none\else\number\eTeXversion\eTeXrevision\fi]}
\count300=7 % register 300 does not exist in Knuth's TeX
\end
EOF
$ tex probe.tex # Knuth's TeX: no extensions
[eTeX=none]
! Bad register code (300).
$ pdftex probe.tex # pdfTeX: e-TeX 2.6 built in, 32768 registers
[eTeX=2.6]
$ latex probe.tex | head -3
This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024) (preloaded format=latex)
restricted \write18 enabled.
entering extended modeDieses letzte Banner ist das Thema dieser Seite, zusammengezogen auf eine Zeile. Die Versionsangabe 3.141592653-2.6-1.40.26 hat drei Schichten: Knuths TeX ist 3.141592653, e-TeX ist 2.6, pdfTeX ist 1.40.26 – und (preloaded format=latex) nennt das Format. Eine Zeile hält also zugleich die Abstammung der Engine und die Wahl des Formats fest. Wer sich angewöhnt, die erste Zeile des Logs zu lesen, klärt das klassische Rätsel der Zusammenarbeit – „gleicher Befehl, anderes Ergebnis“ – in Sekunden.
Die Primitive, die e-TeX hinzugefügt hat
Die Zusätze von e-TeX wirken vor allem für diejenigen, die Makros schreiben. Der größte ist Arithmetik mit Ganzzahlen, Maßen und Glue. In nacktem TeX musste man für jede Rechnung Hilfsregister jonglieren; e-TeX liefert \numexpr, \dimexpr und \glueexpr, die einen Ausdruck wie (a+b)*c/d an Ort und Stelle auswerten – und zwar expandierbar, sodass der Wert unmittelbar in \edef oder \write erscheint.
% On any e-TeX engine in extended mode (pdftex, xetex, luatex, euptex).
\count0=\numexpr (3+4)*2/7 \relax % yields 2
% Branch safely on whether a name is defined.
\ifdefined\foo \message{foo exists}\else \message{no foo}\fi
% Test a control sequence without creating it.
\ifcsname chapter\endcsname \message{chapter is defined}\fi
% Negate a conditional directly, instead of swapping the branches.
\unless\ifnum\count0>10 \message{count0 is not greater than 10}\fiDie zweite Säule sind Bedingungen und Token-Manipulation. \ifdefined prüft, ob eine Kontrollsequenz definiert ist; \ifcsname...\endcsname prüft die Existenz einer aus einem Namen zusammengesetzten. Entscheidend ist bei beiden, dass sie keine Nebenwirkungen haben: Der ältere \ifx-Kniff aus nacktem TeX konnte eine undefinierte Kontrollsequenz stillschweigend in \relax verwandeln. \unless kehrt jede Bedingung um und erspart das Vertauschen der beiden Zweige, und \detokenize überführt eine Tokenliste in ihre Zeichenkettenform – Zeichen der Kategorie 12.
| Primitiv | Wirkung |
|---|---|
\numexpr | Wertet einen ganzzahligen Ausdruck an Ort und Stelle aus (expandierbar): \numexpr (3+4)*2/7 \relax |
\dimexpr / \glueexpr | Dasselbe für Maße und für Glue: \dimexpr \textwidth/3 \relax |
\ifdefined | Prüft ohne Nebenwirkung, ob eine Kontrollsequenz definiert ist |
\ifcsname | Prüft die Existenz einer aus einem Namen gebildeten Kontrollsequenz, ohne sie anzulegen |
\unless | Kehrt den Wahrheitswert der folgenden Bedingung um: \unless\ifnum ... |
\protected | Definiert ein Makro, das sich in \edef oder \write nicht von selbst expandiert |
\detokenize / \unexpanded | Wandelt eine Tokenliste in eine Zeichenkette / lässt eine Tokenliste unexpandiert |
\scantokens / \readline | Liest eine Zeichenkette erneut als Eingabe / liest eine Eingabezeile wörtlich |
\middle | Setzt einen dehnbaren Begrenzer mitten in \left … \right |
\currentgrouplevel | Gibt die aktuelle Gruppentiefe zurück (\interactionmode liest und setzt den Interaktionsmodus) |
Auch die Expansionssteuerung wurde gestärkt. \unexpanded belässt seinen Inhalt unexpandiert, und \protected definiert ein Makro, das sich in Expansionskontexten nicht von selbst expandiert. Letzteres ist der Schlüssel dazu, LaTeX’ \protect auf niedriger Ebene korrekt umzusetzen, sodass fragile Befehle es unbeschadet in ein \edef oder ein \write schaffen. In der Mathematik zahlt sich \middle aus: Schreibt man \left( … \middle| … \right), wächst der senkrechte Strich in der Mitte auf dieselbe Höhe wie die Klammern zu beiden Seiten. Nacktes TeX kannte den Begriff eines Begrenzers mitten in der Formel überhaupt nicht.
Unauffällig, aber entscheidend ist die starke Vermehrung der Register. Nacktes TeX hatte von \count, \dimen, \skip, \toks und Verwandten je nur 256 – genau das verweigerte tex oben mit ! Bad register code (300). e-TeX hob die Grenze auf 32768 und legt sie als dünn besetzte Felder an, sodass ungenutzte kein Gedächtnis kosten. Dass heutige LaTeX-Dokumente, die Dutzende großer Klassen und Pakete laden, nicht an Registermangel scheitern, verdanken sie dieser Erweiterung.
e-TeX brachte außerdem Vorrichtungen für den bidirektionalen Satz mit – Schriftsysteme, die von rechts nach links laufen. Dieser Teil geht auf Breitenlohners TeX--XeT zurück und floss in die spätere Arbeit an XeTeX, LuaTeX und der japanischen Verarbeitung ein. Und viele moderne Pakete könnten ohne diese Primitive schlicht nicht existieren. expl3, die Programmierschicht von LaTeX, ist das offenkundige Beispiel: Ohne \ifcsname und \protected wäre dieses gewaltige Makrosystem gar nicht zu schreiben gewesen.
Was sich lesen lässt, wenn man diese Schicht kennt
Man sieht Fehlermeldungen bis auf den Grund. Vieles, wovor LaTeX warnt, ist im Vokabular der darunterliegenden Schicht formuliert. Overfull \hbox (12.3pt too wide) besagt, dass Material 12.3pt aus der waagerechten Box herausragt, die eine Zeile ist; wer weiß, dass \hbox eine Box ist, engt die Ursache auf eine lange URL oder ein untrennbares Wort ein. ! Missing number, treated as zero. besagt, dass TeX etwas als Zahl oder Maß Lesbares erwartete und nichts fand – meist eine vertippte Länge.
Diese Schicht zu lesen und in ihr zu schreiben sind allerdings zweierlei. Überschriften, Listen, Querverweise und Satzumgebungen überlässt man den strukturierenden Befehlen von LaTeX; die Low-Level-Befehle hebt man auf, um zu lesen, warum etwas zerbrach, oder um eine Klasse eng umgrenzt anzustupsen. Selbst beim Definieren eines neuen Befehls sind gewöhnliche Dokumente mit \newcommand oder \NewDocumentCommand besser bedient als mit rohem \def, denn diese prüfen die Argumentzahl und warnen vor Kollisionen mit vorhandenen Befehlen.
- Beim Schreiben von Fließtext – die strukturierenden Befehle von LaTeX verwenden und Low-Level-Primitive selten halten.
- Beim Reparieren einer Klasse oder eines Pakets – e-TeX-Werkzeuge wie
\ifdefinedund\numexprsind sicherer und lesbarer als ältere TeX-Kniffe. - Beim Lesen eines Logs – Warnungen in TeX’ Vokabular aus Boxen, Glue und Registern übersetzen, dann tritt die Ursache hervor.
- Wenn Reproduzierbarkeit nötig ist – die Engine ist eingefroren, alte Dokumente liefern weiterhin dasselbe Ergebnis. Was sich tatsächlich bewegt, ist die Version von Format und Paketen; genau die gehört festgeschrieben.