Kompilierbefehle

Um eine .tex-Datei in ein PDF zu verwandeln, führt man im Terminal einen Kompilierbefehl aus. pdflatex, lualatex, xelatex, latex sowie die japanischen Befehle platex / uplatex sind alle „LaTeX“; der gewählte Befehl bestimmt aber die darunterliegende Engine. Diese legt Ausgabeformat (PDF oder DVI) sowie verfügbare Schriften und Zeichen fest. Diese Seite ordnet die Befehle praktisch ein und zeigt die Optionen, die man wirklich tippt.

Der Befehlsname wählt die Engine

LaTeX ist ein Format, also ein Befehlssystem; die Engine, das Programm, das es tatsächlich verarbeitet, ist etwas anderes. Der Befehlsname bezeichnet die Kombination: pdflatex ist „pdfTeX-Engine + LaTeX-Format“, lualatex ist „LuaTeX + LaTeX“ usw. Aufgerufen werden sie alle gleich: Man übergibt die Quelldatei als Argument; die Endung .tex ist optional.

terminal
pdflatex document.tex      # → document.pdf, document.aux, document.log
lualatex document          # 拡張子は省略可 / extension optional
xelatex  document.tex

Beim Ausführen entstehen neben der Hauptausgabe (.pdf oder .dvi) Hilfsdateien: eine .aux-Datei für Querverweise und Inhaltsverzeichnisdaten, eine .log-Datei mit dem Ablauf und weitere. Damit Nummern, Verweise und Inhaltsverzeichnis stimmen, führt man denselben Befehl normalerweise zweimal aus: Der erste Lauf schreibt Nummern in .aux, der zweite liest sie zurück in den Text. Werkzeuge wie latexmk automatisieren diese Mehrfachläufe. Die ganze Pipeline behandelt „Von der Quelle zum PDF“.

Die drei Befehle mit direkter PDF-Ausgabe

pdflatex, lualatex und xelatex erzeugen alle direkt ein PDF. Sie unterscheiden sich im Umgang mit Unicode und Schriften sowie in der Geschwindigkeit.

pdflatex verwendet die pdfTeX-Engine. pdfTeX ist Hàn Thế Thànhs Erweiterung von TeX aus seiner Doktorarbeit zur Mikrotypografie (Zeichenausgleich am Rand, feine Schriftdehnung); die zentrale Neuerung war die direkte PDF-Ausgabe ohne DVI-Schritt. Es ist das älteste der drei Systeme, mit der besten Kompatibilität zu bestehenden Paketen und der schnellsten Kompilierung. Der Preis: Die Eingabe ist grundsätzlich byteorientiert, ohne natives Unicode und ohne Systemschriften. Modernes LaTeX akzeptiert zwar standardmäßig UTF-8, die Schriften bleiben aber auf TeX-Schriften beschränkt.

lualatex verwendet die LuaTeX-Engine. Sie setzt UTF-8 von Anfang an voraus und kann über das Paket fontspec die auf dem System installierten OpenType- und TrueType-Schriften direkt nutzen. Das prägende Merkmal ist die eingebettete Skriptsprache Lua, mit der man in den Satzprozess selbst eingreifen kann. LuaLaTeX gilt als Standardrichtung für LaTeX; japanischer Satz wird mit dem Paket luatexja erledigt.

xelatex verwendet die XeTeX-Engine, die Jonathan Kew um 2004 entwickelt hat. Auch sie unterstützt Unicode und Systemschriften, stützt sich aber stärker auf externe Bibliotheken und unterscheidet sich deutlich von LuaTeX. Intern schreibt sie kein PDF direkt, sondern erzeugt eine erweiterte DVI-Datei .xdv, die das mitgelieferte xdvipdfmx automatisch in PDF umwandelt. Mit -no-pdf stoppt der Lauf vor dieser Umwandlung bei .xdv.

BefehlEngineAusgabeUnicode / Schriften
pdflatexpdfTeXPDF direktTeX-Schriften; schnell, sehr kompatibel
lualatexLuaTeXPDF direktSystemschriften + Unicode + Lua
xelatexXeTeXPDF (intern über .xdv)Systemschriften + Unicode

Der Befehl latex gibt DVI aus

Der einfache Befehl latex startet in heutigem TeX Live die pdfTeX-Engine im DVI-Modus und erzeugt statt eines PDFs eine .dvi-Datei. DVI (device-independent) ist ein geräteunabhängiges Zwischenformat; da es sich nicht gut direkt anzeigen oder drucken lässt, wird es umgewandelt: mit dvipdfmx nach PDF oder mit dvips nach PostScript. Während pdflatex direkt PDF schreibt, trennt dieser zweistufige Weg „Satz“ und „PDF-Erzeugung“.

Warum verwendet man DVI noch? Manche ältere Mechanik funktioniert nur über DVI, etwa Teile von PSTricks; außerdem lief, wie der nächste Abschnitt erklärt, japanischer Satz traditionell über DVI. Wenn LuaTeX DVI erzeugen soll, verwendet man dvilualatex. Die Umwandlung aus DVI wird auf der Seite „DVI-Konverter“ ausführlich behandelt.

Japanische Befehle — platex / uplatex

platex ist pLaTeX auf der für japanischen Satz spezialisierten pTeX-Engine (entwickelt bei ASCII Corporation, heute e-pTeX). Es behandelt vertikalen Satz, japanische Zeilenabstände und Umbruchregeln (*kinsoku*) sowie die Abstände zwischen japanischem und lateinischem Text. Die Ausgabe ist DVI. Die voreingestellte Eingabekodierung hängt von der Umgebung ab (Shift_JIS / EUC-JP / UTF-8); mit -kanji=utf8 wird UTF-8 gelesen. Dennoch kann pTeX direkt nur Zeichen im Bereich ASCII + JIS X 0208 verarbeiten.

uplatex ist upLaTeX auf der upTeX-Engine von Takuji Tanaka, deren interne Verarbeitung Unicode-basiert ist. Die Standardeingabe ist UTF-8, und Zeichen außerhalb von JIS X 0208, etwa seltene Namenskanji oder die vollständigen CJK Unified Ideographs, können ohne zusätzliche Pakete verarbeitet werden. Deshalb ist es der Standard für moderne japanische Arbeiten. Auch hier ist die Ausgabe DVI; die Eingabekodierung lässt sich mit der Option -kanji ändern.

terminal
# 日本語: 組版 → DVI → PDF / Japanese: typeset → DVI → PDF
uplatex -kanji=utf8 document.tex   # → document.dvi
dvipdfmx document.dvi              # → document.pdf

Das von (u)platex erzeugte DVI wird mit dvipdfmx zu PDF; das dvipdfmx in TeX Live kennt upTeX. Neuere TeX-Live-Versionen verwenden standardmäßig UTF-8-Eingabe, sodass -kanji=utf8 oft weggelassen werden kann. Explizit angegeben vermeidet es aber Überraschungen zwischen Umgebungen. Für zuverlässiges UTF-8 ohne BOM kombiniert man uplatex mit -no-guess-input-enc. Alternativ erzeugt lualatex + luatexja direkt ein PDF aus japanischer Quelle, ganz ohne DVI-Schritt.

Optionen, die man wirklich nutzt

Optionen stehen vor dem Namen der Quelldatei. Die folgenden funktionieren bei pdfTeX-, XeTeX- und LuaTeX-Befehlen:

OptionWirkung
-synctex=1Gibt SyncTeX-Daten aus, damit Editor und PDF gegenseitig springen können
-interaction=nonstopmodeLäuft trotz Fehlern bis zum Ende weiter (batchmode ist noch stiller)
-halt-on-errorStoppt beim allerersten Fehler
-file-line-errorMeldet Fehler im Format file:line: (gut für IDEs)
-output-directory=DIRSchreibt Ausgaben in ein bereits vorhandenes Verzeichnis
-jobname=NAMESetzt den Basisnamen der Ausgabedateien
-shell-escapeErlaubt externe Befehle über \write18 (siehe Warnung)
-draftmodeSchreibt kein PDF und prüft schnell (pdfTeX / LuaTeX)
terminal
pdflatex -synctex=1 -interaction=nonstopmode -halt-on-error -file-line-error document.tex

Das Ausgabeformat lässt sich bei pdfTeX und LuaTeX mit -output-format=dvi|pdf umschalten; XeTeX verwendet stattdessen -no-pdf für .xdv. Vorsicht mit -shell-escape: Pakete wie minted für Code-Hervorhebung und manche Zeichenpakete brauchen es, um externe Programme aufzurufen. Es erlaubt einem Dokument aber beliebige Shell-Befehle auszuführen; aktivieren Sie es nie für Quellen, denen Sie nicht vertrauen.

Welchen Befehl sollte man verwenden

  • Ein neues japanisches Dokumentuplatex (→ dvipdfmx) oder lualatex + luatexja.
  • Vor allem englischer / europäischer Textpdflatex; schnell und kompatibel.
  • Systemschriften sollen verwendet werdenlualatex oder xelatex.
  • DVI-only-Mechanik ist nötiglatex (→ dvipdfmx / dvips).

In der Praxis tippt man diese Befehle selten zweimal von Hand. Üblicher ist ein Build-Werkzeug wie latexmk, das so viele Läufe wie nötig ausführt und auch die DVI-Umwandlung übernimmt. Mehr zu den Engines selbst steht in „Engine und Format wählen“.

Befehlsprüfung vor der Abgabe

  • Zuerst den Befehl allein testen: Führen Sie den gewählten Befehl, etwa pdflatex, lualatex oder uplatex, einmal im Terminal aus, um zu zeigen, dass der Fehler nicht editorabhängig ist.
  • Abgabe-Standard: Ergänzen Sie -halt-on-error -file-line-error -interaction=nonstopmode, damit CI und Logs auf den ersten echten Fehler zeigen.
  • Entscheidung für japanische PDFs: Bei upLaTeX läuft uplatex gefolgt von dvipdfmx; bei LuaLaTeX entsteht das PDF direkt. Vermischen Sie die Routen nicht versehentlich.
  • Log lesen: Lesen Sie ab dem ersten !, nicht nur das Ende von .log, damit Sie zum Befehl zurückfinden, der die Fehlerkette ausgelöst hat.