TeX / e-TeX

An der Wurzel jeder TeX-based-Engine sitzen Knuths ursprüngliches TeX und seine strenge Obermenge e-TeX. Auf dieser Seite erfahren Sie, was „das TeX-Programm“ eigentlich ist, was plain TeX ist, warum fast niemand es heute direkt schreibt, es aber immer noch wichtig ist, und die e-TeX-Erweiterungen – die in den 1990er Jahren hinzugefügt wurden –, die heute die Basis bilden, auf der jede moderne Engine aufbaut.

Was „das TeX-Programm“ ist

Verwirrenderweise benennt das Wort TeX zwei Dinge. Eines ist das Satzprogramm selbst, geschrieben von Donald Knuth. Das andere ist das Befehlssystem, das das Programm interpretiert. Das eigentliche Programm ist eine schonungslos Low-Level-Engine: Es packt Zeichen und Kästchen in Zeilen und Absätze, optimiert die Zeilenumbrüche und schreibt das Ergebnis in eine Ausgabedatei – und sonst wenig.

Knuth war mit der typografischen Qualität seines Buches *The Art of Computer Programming* unzufrieden und begann 1978 mit dem ersten TeX. Diese erste Version war ein explorativer Prototyp; Es wurde 1982 komplett neu geschrieben und diese Neufassung ist als TeX82 bekannt. „TeX“ bedeutet heute effektiv diese TeX82-Linie. Der minimale Satz von Befehlen, die Knuth eingebaut hat, wird Primitive genannt – \def, \hbox, \vbox und dergleichen.

Das Schreiben eines Dokuments in reinen Grundelementen ist unpraktisch, daher verwenden Sie normalerweise ein Format – eine darauf aufbauende Ebene von Makros. Wenn Sie plain.tex laden, erhalten Sie plain TeX; Wenn Sie einen weitaus größeren Makrosatz laden, erhalten Sie LaTeX. Formate werden vorab erweitert und zum Zeitpunkt der Erstellung als .fmt-Datei gespeichert, sodass die Engine sie nicht bei jedem Lauf von Grund auf neu lesen muss.

Plain TeX

Plain TeX ist das Standardformat, das Knuth in *The TeXbook* vorstellt. Es sammelt ein minimales Toolkit – Schriftarten-Setup, die grundlegenden mathematischen Symbole, praktische Makros wie \bye – in plain.tex, das im Lieferumfang von TeX selbst enthalten ist. Vor LaTeX war dies die einzige praktische Möglichkeit, TeX zu verwenden.

Die Notation weicht deutlich von LaTeX ab. Inline-Mathematik ist $...$ (das gleiche wie LaTeX). Eine horizontale Box ist \hbox{...}, eine vertikale Box ist \vbox{...}, die tabellarische Ausrichtung erfolgt 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} – das sind alles Dinge, die LaTeX aus Makros erstellt.

latex
% plain TeX — tex hello.tex で処理 / process with: tex hello.tex
\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$.
\bye

Die Verarbeitung des Beispiels mit tex hello.tex erzeugt eine DVI-Datei (keine PDF – siehe unten). Logo-Makros wie \TeX und Abstandsmakros wie \medskip (ein mittlerer vertikaler Sprung) werden ebenfalls von plain TeX definiert. Neben einem LaTeX \documentclass-Dokument zeigt es, wie dünn eine Haut plain TeX über der bloßen Engine ist.

Kompetente Programmierung und WEB

TeX selbst ist in WEB geschrieben, Knuths eigenem System und der Gründungspraxis der literate programming. Eine WEB-Quelle ist ein einzelnes Dokument, in dem eine menschliche Erklärung und ein Pascal-Code miteinander verwoben sind. Zwei Tools extrahieren dann Ableitungen daraus – tangle erzeugt kompilierbares Pascal und weave erzeugt den Satzkommentar (das Buch *TeX: The Program*).

Die ursprüngliche Zielsprache war Pascal; In modernen Distributionen übersetzt ein Tool namens web2c das WEB (über Pascal) zum Erstellen in C. Das heißt, dass pdfTeX oder LuaTeX, die heute auf Ihrem Computer laufen, letztendlich immer noch auf diese einzige kompetente Quelle zurückgeht.

Eine Versionsnummer, die gegen π konvergiert

Die Versionsnummerierung von TeX ist eigenwillig. Seit Version 3 fügt jedes Update eine weitere Ziffer hinzu, sodass sich die Zahl asymptotisch π annähert. Die aktuelle Version ist 3.141592653, wurde beim 2021-Tuning im Februar dieses Jahres festgelegt und ist seitdem unverändert – ein Symbol dafür, dass das Programm im Wesentlichen fertig und außergewöhnlich stabil ist.

Knuth hat erklärt, dass die „letzte Änderung“, die posthum vorgenommen wurde, die Version auf genau π setzen wird – an diesem Punkt werden alle verbleibenden Fehler zu dauerhaften Funktionen. Tatsächlich hat TeX seit Jahren keine neuen Funktionen erhalten, und die gemeldeten Probleme beschränken sich lediglich auf geringfügige Korrekturen. Diese eingefrorene Stabilität ist genau der Grund, warum eine .tex-Datei von vor Jahrzehnten auch heute noch die gleiche Ausgabe erzeugt.

METAFONT und DVI

TeX hat einen Zwillingsbegleiter, METAFONT (mf): ein System, das eine Schriftart nicht als feste Formen, sondern als *Programm zum Zeichnen* der Glyphen beschreibt. Knuth hat damit die gesamte Computer Modern-Schriftfamilie für TeX entworfen. Die Arbeitsteilung besteht darin, dass TeX entscheidet, wohin die Zeichen gehen, während METAFONT die Formen der Zeichen selbst erzeugt.

Was Knuths TeX direkt ausgibt, ist nicht PDF, sondern eine DVI (DeVice Independent)-Datei. Ein DVI enthält nur geräteunabhängige Anweisungen – „Platziere dieses Zeichen an dieser Position“ – die dann von dvips in PostScript oder von dvipdfmx in PDF konvertiert werden. Ein wesentlicher Unterschied zu den heute weit verbreiteten pdfTeX, XeTeX und LuaTeX besteht darin, dass sie diesen Schritt überspringen und PDF direkt erzeugen.

Warum es immer noch wichtig ist

In der Praxis schreibt fast niemand rohes plain TeX für neue Arbeiten: Die praktischen Mechanismen – Nummerierung, Querverweise, Klassendateien – befinden sich alle in der obersten Schicht LaTeX, und das alltägliche Schreiben erfolgt auf dieser Komfortebene. Dennoch ist es von echtem Wert, die hier beschriebenen Primitiven zu kennen.

  • Die Grundlage jedes Formats. Sowohl LaTeX als auch ConTeXt basieren letztendlich auf diesen Grundelementen.
  • Sie können Fehlern auf den Grund gehen. Verworrene Fehler und geringfügige Änderungen werden lesbar, sobald Sie das Vokabular von \hbox und \vbox kennen.
  • Die Box-and-Glue-Weltanschauung. Die Idee von TeX, eine Seite aus *Boxen* und dehnbarem *Kleber* zu erstellen, ist die gemeinsame Sprache für die umfassende Nutzung von LaTeX.
  • Universalität und Reproduzierbarkeit. Da die Engine eingefroren ist, liefern frühere Dokumente auch in der Zukunft das gleiche Ergebnis.

Was ist e-TeX

Da Knuth TeX eingefroren hat, mussten neue Funktionen aus anderen Händen kommen. So entstand in den 1990er Jahren aus dem europäischen Projekt NTS (New Typesetting System) e-TeX, wobei Peter Breitenlohner die Hauptentwicklung übernahm. e-TeX ersetzt nicht TeX; Es ist als strikte Obermenge** davon konzipiert – vorhandene Eingaben werden unverändert mit identischer Ausgabe ausgeführt.

e-TeX verfügt über zwei Modi. Im Kompatibilitätsmodus verhält es sich genau wie das klassische TeX; Nur im erweiterten Modus – eingegeben durch Starten mit einem * – werden die hinzugefügten Grundelemente verfügbar. Wenn ein Format im erweiterten Modus erstellt wird, muss der Benutzer überhaupt nicht darüber nachdenken.

Jetzt die Grundlinie

Heutzutage wird einfach davon ausgegangen, dass die Erweiterungen e-TeX vorhanden sind. TeX Live ist seit 2003 standardmäßig e-TeX und LaTeX benötigt seit 2017 offiziell die e-TeX-Grundelemente. Noch wichtiger ist, dass alle aktuellen Engine-Bundles e-TeX: pdfTeX, XeTeX und LuaTeX alle die e-TeX-Erweiterungen enthalten und darüber hinaus ihre eigenen Funktionen hinzufügen.

Mit anderen Worten: Wenn Sie mit pdfLaTeX oder LuaLaTeX setzen, laufen Sie auf e-TeX, ohne es zu merken. Viele moderne Pakete – angefangen bei expl3, der LaTeX3-Programmierschicht – könnten ohne die e-TeX-Grundelemente einfach nicht existieren.

Die Grundelemente e-TeX fügen hinzu

Die Ergänzungen von e-TeX sind für Leute, die Makros schreiben, am wichtigsten. Die größte ist Arithmetik mit ganzen Zahlen, Dimensionen und Leim. In bare TeX mussten Sie die Arbeitsregister zur Berechnung neu mischen; e-TeX stellt \numexpr, \dimexpr und \glueexpr bereit, die Ausdrücke wie (a+b)*c/d sofort in erweiterbarer Form auswerten.

latex
% 拡張モードの e-TeX 系エンジンで / on any e-TeX engine in extended mode
\count0=\numexpr (3+4)*2/7 \relax   % 2 が入る / 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

% \unless で「if の否定」を直接書く / negate a conditional directly
\unless\ifnum\count0>10 \message{count0 is not greater than 10}\fi

Eine zweite Säule sind Bedingungen und Token-Manipulation. \ifdefined testet, ob eine Kontrollsequenz definiert ist, und \ifcsname...\endcsname testet die Existenz einer aus einem Namen zusammengesetzten Sequenz – beides ohne Nebenwirkungen (der alte \ifx-Trick in bloßem TeX könnte eine undefinierte Sequenz stillschweigend in \relax umwandeln). \unless invertiert alle Bedingungen und \detokenize wandelt eine Tokenliste in ihre Zeichenfolgenform um (Zeichen des Kategoriecodes 12).

Auch die Expansionskontrolle wird gestärkt. \unexpanded belässt seinen Inhalt an Ort und Stelle, ohne ihn zu erweitern, und \protected macht ein definiertes Makro zu einem Makro, das sich in Erweiterungskontexten wie \edef und \write *nicht* von selbst erweitert – der Schlüssel zur korrekten Implementierung von \protect von LaTeX auf einer niedrigen Ebene.

PrimitivWas es bewirkt
\numexpr / \dimexpr / \glueexprGanzzahl-/Dimensions-/Leime-Ausdrücke vor Ort auswerten (erweiterbar)
\ifdefined / \ifcsnameTesten Sie, ob eine Kontrollsequenz definiert ist/existiert, ohne Nebenwirkungen
\unlessKehren Sie den Sinn der folgenden Bedingung um
\protectedDefinieren Sie ein Makro, das innerhalb von Erweiterungskontexten nicht erweitert wird
\detokenize / \unexpandedVerwandeln Sie Token in eine Zeichenfolge / lassen Sie Token nicht erweitert
\scantokens / \readlineLesen Sie eine Zeichenfolge erneut als Token / lesen Sie eine Eingabezeile wörtlich
\middlePlatzieren Sie ein dehnbares Trennzeichen in der Mitte von \left … \right
\currentgrouplevel / \interactionmodeÜberprüfen Sie die aktuelle Gruppentiefe / rufen Sie den Interaktionsmodus ab und legen Sie ihn fest

Darüber hinaus gibt es \middle für ein dehnbares Trennzeichen in der Mitte der Mathematik wie \left( … \middle| … \right); \scantokens, um einen String als Token erneut zu lesen; \readline, um eine Eingabezeile wörtlich zu lesen; \currentgrouplevel gibt die aktuelle Gruppentiefe zurück; und \interactionmode zum Lesen und Ändern des Interaktionsmodus. e-TeX führte außerdem Hooks für den bidirektionalen (von rechts nach links) Schriftsatz ein, die in spätere Arbeiten in XeTeX, LuaTeX und der japanischen Verarbeitung einflossen.

Eine stille, aber folgenreiche Erweiterung ist eine starke Erhöhung der Register. Bare TeX hatte jeweils nur 256 von \count, \dimen, \skip, \toks und so weiter; e-TeX hat dies auf 32768 erhöht (als spärliche Arrays zugewiesen). Register gehen nicht mehr so ​​schnell zur Neige, selbst wenn viele große Klassen und Pakete geladen werden – eine unbesungene Unterstützung unter den heutigen schwergewichtigen LaTeX-Setups.

Wie dies in LaTeX-Dokumenten hilft

Sie müssen keine Abschlussarbeit oder ein technisches Dokument in plain TeX schreiben. Wenn Sie jedoch die Vokabeln \hbox, \vbox, \count, \dimen und \def kennen, können Sie die unterste Ebene der Fehlermeldungen lesen. Overfull \hbox sagt zum Beispiel, dass Material aus einer Leitungsbox herausragt; Missing number, treated as zero sagt, dass TeX etwas erwartet hat, das als Zahl oder Dimension lesbar ist, und es nicht gefunden hat.

Die Ebene zu verstehen ist etwas anderes, als Prosa direkt darin zu schreiben. Lassen Sie die Strukturbefehle von LaTeX Überschriften, Listen, Querverweise und Theoremumgebungen verarbeiten. Behalten Sie Low-Level-Befehle bei, um herauszufinden, warum etwas kaputt gegangen ist, oder um eine Klasse genau zu reparieren. Selbst beim Definieren eines neuen Befehls sind normale Dokumente mit \newcommand oder \NewDocumentCommand besser bedient als mit rohem \def, da LaTeX die Anzahl der Argumente und Kollisionen mit vorhandenen Befehlen überprüfen kann.

  • Wenn Sie Prosa schreiben, verwenden Sie LaTeX-Strukturbefehle und halten Sie Primitive auf niedriger Ebene selten.
  • Beim Reparieren einer Klasse oder eines Pakets sind e-TeX-Tools wie \ifdefined und \numexpr sicherer als ältere TeX-Tricks.
  • Übersetzen Sie beim Lesen von Protokollen Warnungen in die Sprache von TeX für Boxen, Leim und Register. die Ursache wird sichtbar.