LuaTeX ist eine TeX-Engine, die pdfTeX erweitert und die Lua-Skriptsprache einbettet. Sie können Lua-Programme während des Satzes aufrufen und direkt auf das Material zugreifen, das TeX erstellt hat – und es ist diese Offenheit, die es weithin als die Zukunft von TeX ansehen lässt. Sie rufen es als lualatex auf und es verarbeitet die Schriftarten Unicode und OpenType nativ.
Was LuaTeX ist
LuaTeX wurde von Taco Hoekwater, Hartmut Henkel, Hans Hagen und anderen entwickelt. Es entstand aus der ConTeXt- und der orientalischen TeX-Welt mit dem Ziel eines „offenen und konfigurierbaren“ TeX, das auf pdfTeX aufbaut und gleichzeitig die Abwärtskompatibilität bewahrt. Da pdfTeX seine Basis ist, gibt es PDF direkt aus und erbt die e-TeX-Erweiterungen und die meisten Satzmaschinen von pdfTeX.
Ein Großteil des pdfTeX-Erbes wird jetzt durch drei Schnittstellenprimitive – \pdfextension, \pdfvariable und \pdffeedback – erreicht, die Schlüsselwörter und Argumente akzeptieren, sodass Funktionen ohne Anpassung der Kern-Engine erweitert werden können. Im täglichen Gebrauch gleichen LaTeX-Pakete diesen Unterschied aus, sodass Sie diese Grundelemente selten von Hand schreiben.
Die andere Säule ist ein eingebetteter Lua 5.3-Interpreter. Schreiben Sie \directlua{...} in Ihre .tex-Datei und der darin enthaltene Lua-Code wird sofort ausgeführt. Die Eingabe erfolgt nativ UTF-8. Für Schriftarten wählen Sie System- oder OpenType-Gesichter direkt mit fontspec aus, genau wie in XeTeX – aber das Laden erfolgt durch LuaTeXs eigenen Lua-basierten Loader (luaotfload).
Einbetten von Lua in ein Dokument
\directlua{...} führt den Lua-Code sofort aus. Von Lua aus rufen Sie tex.print(...) auf und die Ausgabe wird wie gewohnt in den Eingabestream von TeX zurückgeführt und gesetzt. Hier ist ein minimales Dokument, das Sie mit lualatex kompilieren können: Es lässt Lua zwei hoch zehnte Potenzen berechnen und das Ergebnis in den Text einfügen.
\documentclass{article}
\begin{document}
Two to the tenth power is
\directlua{tex.print(2^10)}.
\end{document}Bei der Zusammenstellung dieser Sätze lautet „Zwei hoch zehn ist 1024.“ Stattdessen wird ein Geschwisterbefehl, \latelua{...}, ausgeführt, wenn die Seite, auf der er sich befindet, ausgeliefert wird. Das eignet sich für Arbeiten, die warten müssen, bis Seitenzahlen und endgültige Koordinaten festgelegt sind – zum Beispiel das Zeichnen auf PDF oder das Anhängen von Anmerkungen.
Da rohes \directlua bei Klammern und Sonderzeichen wählerisch ist, können Sie in der Praxis mit dem Paket luacode und seiner Umgebung luacode längeren Lua-Code wörtlich und sicher schreiben.
Rückrufe – Einbindung in den Schriftsatz
Die wahre Stärke von LuaTeX sind seine Rückrufe. TeX erstellt Ihren Text aus Knoten – Zeichen, Kästchen und Leim (dehnbarer Raum), die in verknüpften Listen aneinandergereiht sind – und durch die Registrierung eines Rückrufs wird an jeder solchen Stelle Ihre eigene Lua-Funktion aufgerufen, mit der Sie diese Knotenliste überprüfen und neu schreiben können. So gelangen Sie sicher in das Innere des Motors.
Zu den häufig verwendeten Rückrufen gehören die folgenden. process_input_buffer wird jedes Mal ausgelöst, wenn TeX eine Eingabezeile liest, eine Zeichenfolge empfängt und eine zurückgibt. pre_linebreak_filter übergibt Ihnen die Knotenliste kurz bevor ein Absatz in Zeilen unterteilt wird, und post_linebreak_filter die Liste direkt danach. ligaturing und kerning entsprechen den Phasen der Ligatur- und Kerning-Erstellung.
| Rückruf | Wenn es feuert |
|---|---|
process_input_buffer | Da jede Eingabezeile gelesen wird; zur Vorverarbeitung |
pre_linebreak_filter | Die Knotenliste direkt vor einem Absatzumbruch |
post_linebreak_filter | Die Knotenliste direkt nach dem Zeilenumbruch |
ligaturing / kerning | Die Ligatur- und Kerning-Erstellungsphasen |
Sie steuern diese Vorgänge über eine Reihe von Tabellen, die in Lua sichtbar sind. tex ist das Fenster zum internen Zustand von TeX (Register und Dimensionen), node erstellt, durchläuft und gibt Knoten frei, token befasst sich mit Token (den kleinsten Bedeutungseinheiten von TeX), font mit Schriftartdaten und status mit Laufzeitinformationen. Sogar fortgeschrittene Schriftartmaschinen wie luaotfload werden darüber hinaus in Lua geschrieben.
Schriftarten – Auswahl mit fontspec
Wie in XeTeX können Sie durch Laden des fontspec-Pakets in LuaTeX die auf Ihrem System installierten OpenType / TrueType-Schriftarten direkt benennen. \setmainfont wählt die Hauptschriftart, mit \setsansfont und \setmonofont für die serifenlosen und monospaced-Schriftarten.
\documentclass{article}
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}
\begin{document}
This text is set in an OpenType font, with ligatures like ffi.
\end{document}Hinter den Kulissen übernimmt luaotfload das Laden. Es handelt sich um eine Adaption des Font-Loaders von ConTeXt für Plain TeX und LaTeX, die OpenType-Funktionen wie Ligaturen, Ziffern im alten Stil und Kapitälchen verfügbar macht. Es zielt auf Kompatibilität mit XeTeX ab und wird von der latex3-Gruppe des LaTeX-Teams gepflegt.
In aktuellen Distributionen ruft der Befehl lualatex tatsächlich LuaHBTeX auf, eine LuaTeX-Variante mit eingebettetem HarfBuzz (im Lieferumfang enthalten seit TeX Live 2020). Dadurch wird die Formungsmaschinerie, die für komplexe Skripte – Arabisch, Indisch und dergleichen – benötigt wird, in die Engine selbst integriert.
MetaPost integriert
LuaTeX verfügt über integrierte MPlib – die als Bibliothek gepackte MetaPost-Zeichnungs-Engine – sodass MetaPost-Figuren im selben Prozess wie die Kompilierung generiert werden können, ohne ein externes Programm aufzurufen. Ab LaTeX stellt das Paket luamplib dies bereit, sodass Sie MetaPost-Code direkt in einer mplibcode-Umgebung schreiben können.
Japanisch – LuaTeX-ja
Der japanische Schriftsatz wird von LuaTeX-ja (Paket luatexja) übernommen. Es implementiert auf der Lua-Seite über Rückrufe das japanische Schriftsatz-Know-how von pTeX neu – vertikales Schreiben, den von JFM (japanische Schriftartmetriken) gesteuerten Abstand zwischen Zeichen und Interpunktionsbehandlung sowie den Abstand zwischen japanischem und westlichem Text. Dies eröffnet einen modernen Weg zum japanischen LaTeX, der sich von pLaTeX/upLaTeX unterscheidet.
Mit luatexja-fontspec können Sie auch japanische Schriftarten im Stil von fontspec auswählen. LuaTeX-ja erfordert LuaTeX 1.10.0 oder höher und ein einigermaßen aktuelles luaotfload. Wenn upLaTeX auf der pdfLaTeX-Seite der „ausgereifte Standard“ ist, dann ist LuaLaTeX mit LuaTeX-ja die gute Wahl, wenn Sie heute neu anfangen.
Eine Einschränkung: Die HarfBuzz-Formung von LuaHBTeX und die Vertical-Writing-/CID-Maschinerie von LuaTeX-ja sollten sorgfältig kombiniert werden. Das LuaTeX-ja-Handbuch warnt davor, dass über HarfBuzz definierte japanische Schriftarten unerwünschte Ergebnisse liefern können. Erstellen Sie für japanische Prosa zunächst PDF mit den gebündelten Harano Aji-Schriftarten von TeX Live und den Standardeinstellungen. Führen Sie OpenType-Funktionen oder HarfBuzz-Optionen nur in kleinen Tests ein, bevor Sie sie im Manuskript verwenden.
LuaJITTeX und LuaMetaTeX
LuaJITTeX ist eine Variante, die LuaJIT – einen Just-in-Time-Compiler, der Code zur Laufzeit in Maschinencode umwandelt – anstelle von Standard-Lua verknüpft. Lua läuft schneller, aber LuaJIT bleibt auf dem Sprachniveau Lua 5.1 fixiert (die Hauptlinie LuaTeX ist auf 5.3) und wird weniger aktiv gepflegt. Abgesehen von Sonderfällen, in denen die Ausführung von Lua extrem umfangreich ist, sind die meisten Benutzer mit gewöhnlichem LuaTeX gut bedient.
Der andere Nachfolger ist LuaMetaTeX, eine schlankere Überarbeitung von LuaTeX – „schlank und gemein“ –, die dem modernen ConTeXt (LMTX / MkXL) zugrunde liegt. Es bringt neuen mathematischen Schriftsatz und viele neue Grundelemente mit sich, übernimmt die Linie Lua 5.4 und wird seit 2023 in TeX Live ausgeliefert. Die Arbeitsteilung: LuaTeX für LaTeX-Arbeit, LuaMetaTeX für die neueste ConTeXt.
Kompromisse
XeTeX und LuaTeX verarbeiten beide Unicode und OpenType, unterscheiden sich jedoch im Charakter. Während sich XeTeX aus Bequemlichkeitsgründen auf die Textlayout-Maschinerie des Betriebssystems stützt, ist LuaTeX gerade deshalb flexibler, weil alles von Lua aus steuerbar ist. Der Preis dafür ist, dass es in der Vergangenheit etwas langsamer war als XeTeX (der Abstand hat sich in den letzten Jahren verringert).
- Unicode / OpenType zuerst. UTF-8-Eingabe und
fontspecsind die Norm. - Programmierbar. Mit Lua und Callbacks können Sie in den Schriftsatz selbst einsteigen.
- Eigenständig. MetaPost (MPlib) ist integriert, sodass für die Zahlen kein externer Aufruf erforderlich ist.
- Japanisch-fähig. LuaTeX-ja bietet vollständigen japanischen Schriftsatz, vertikales Schreiben und JFM inklusive.
- Zukunftsorientiert. Das LaTeX-Team zielt auf LuaTeX für die Neuentwicklung ab.
Im Großen und Ganzen wird LuaLaTeX zum Standard für neue Unicode/OpenType-Workflows, bei denen es auf Programmierbarkeit ankommt. Die ältere Unterteilung gilt immer noch: XeLaTeX, wenn Sie einfach einfache Schriftarten benötigen, pdfLaTeX für schnelle, überwiegend englische Arbeiten. Welchen Motor Sie auswählen sollten, erfahren Sie auf der Seite „Motor auswählen“.
Starten eines LuaLaTeX-Dokuments
Wenn Sie LuaLaTeX wählen, beginnen Sie mit Unicode-Quelle, fontspec und, für Japanisch, luatexja. Bei der Migration, während pdfLaTeX-era inputenc/fontenc an Ort und Stelle belassen wird, entstehen Warnungen und eine doppelte Schriftarteneinrichtung. Erstellen Sie zunächst eine kleine Probe, die Körperschriftarten, japanische Schriftarten, Mathematik und Bibliographie übt, und verwenden Sie sie dann als Manuskriptvorlage.
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont{Harano Aji Mincho}
\setsansjfont{Harano Aji Gothic}
\begin{document}
LuaLaTeX で日本語の本文と数式 $E=mc^2$ を同じ経路で組みます。
\end{document}Das Beispiel verwendet Harano Aji-Schriftarten, die in TeX Live enthalten sind, sodass es nicht auf OS-spezifische Schriftarten angewiesen ist. Stellen Sie für die Zusammenarbeit und CI zunächst sicher, dass ein PDF mit gebündelten Schriftarten wie diesen erstellt wird, und wechseln Sie dann nur bei Bedarf zu den vom Labor oder dem Herausgeber benötigten Schriftarten.