> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/de/ausfuhrliche-artikel/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md).

# Eine Einführung in LuaTeX (Teil 1): Was ist es – und was macht es so anders?

LuaTeX ist ein *Werkzeugsatz*— es enthält ausgefeilte Softwarewerkzeuge und Komponenten, mit denen Sie eine breite Palette von Dokumenten erstellen (setzen) können. Der Untertitel dieses Artikels stellt auch zwei Fragen zu LuaTeX: Was ist es — und was macht es so anders? Die Antwort auf „Was ist es?“ mag offensichtlich erscheinen: „Es ist eine TeX-Satz-Engine!“ Tatsächlich ist es das, aber eine weiter gefasste Sichtweise, der sich auch dieser Autor anschließt, ist, dass LuaTeX ein äußerst vielseitiges, auf TeX basierendes *System zur Dokumentenerstellung und -entwicklung*.

### LuaTeX erklären: Wo anfangen?

Das Ziel dieses ersten Artikels über LuaTeX ist es, einen Kontext dafür zu bieten, zu verstehen, was diese TeX-Engine bietet und warum/wie ihr Design es Nutzern ermöglicht, eine breite Palette von Lösungen für komplexe Satz- und Gestaltungsprobleme zu erstellen/entwerfen/schaffen — vielleicht auch ein gewisses Maß an „Zukunftssicherheit“, da Benutzer zunehmend TeX-basierte Software benötigen, die sich an das sich ständig wandelnde technische Ökosystem anpassen kann. Meiner Meinung nach ist es nicht unbedingt der beste Ausgangspunkt, ihre Funktionen/Fähigkeiten aufzulisten und zu beschreiben, wenn man ein Verständnis für die Möglichkeiten und das Potenzial von LuaTeX entwickeln möchte. Ein solcher Ansatz wird für Leser, die mit anderen TeX-Engines nicht vertraut sind und für die funktionsbasierte Vergleiche wahrscheinlich nicht besonders aussagekräftig sind, nicht besonders hilfreich sein.

Unter der Gefahr, die Geduld des Lesers zu strapazieren („Kommen Sie doch endlich zum Punkt!“), werde ich einen eher „ganzheitlichen“ Ansatz wählen, hoffentlich mit nützlichem Hintergrundwissen, aber auf Kosten von etwas zusätzlicher Lektüre — und auch mit einigen Programmier-Themen, um das Verständnis zu erleichtern. In [Teil 2](/latex/de/ausfuhrliche-artikel/09-an-introduction-to-luatex-part-2-understanding-directlua.md) untersuchen wir die Verwendung von `\directlua` aber vorerst versuchen wir, die grundlegenden Grundlagen für das Verständnis von LuaTeX zu legen.

Dieser Artikel spiegelt stark die persönliche „Reise“ des Autors bei der Entwicklung eines Verständnisses und einer Wertschätzung von LuaTeX wider: Wenn man zuerst etwas über die Philosophie hinter der Entwicklung von LuaTeX weiß und es als Container von Softwarewerkzeugen betrachtet, wird man die umfangreichen Lösungsbereiche, die diese erstaunliche Software eröffnet, besser zu schätzen wissen.

## LuaTeX: Nicht nur für die Wissenschaft oder Mathematik!

Der Reichtum an Funktionen und Möglichkeiten, die in LuaTeX eingebaut sind, ermöglicht nicht nur außergewöhnlich hochwertiges Setzen über traditionelles LaTeX, sondern bietet auch enormen Spielraum für die Entwicklung maßgeschneiderter, nicht auf LaTeX basierender Lösungen für komplexe Probleme der Dokumentproduktion und -technik. LuaTeX enthält die leistungsstarke Skriptsprache Lua eingebettet, was beispielsweise bedeutet, dass Sie Lua verwenden können, um „Plugins“ (externe Softwarebibliotheken) in LuaTeX zu laden; dadurch werden Automatisierung auf hohem Niveau, die Integration in bestehende Softwaresysteme oder Workflows sowie die Nutzung spezialisierter Software für Daten-, Text- oder Grafikverarbeitung weiter erleichtert.

Historisch gesehen wird TeX mit wissenschaftlichem Schreiben/Publizieren in Verbindung gebracht, insbesondere in der Mathematik, aber LuaTeX hat insbesondere ein erhebliches Potenzial für Anwendungen in vielen anderen Bereichen — einschließlich der kommerziellen PDF-Dokumentproduktion. Ein solches Beispiel ist [speedata publisher](https://speedata.github.io/publisher/) das LuaTeX ausschließlich als PDF-Erzeugungs-Engine innerhalb seines XML-basierten Workflows verwendet — es nutzt überhaupt kein LaTeX. Tatsächlich enthält speedata publisher praktisch keinen TeX-Code — ich fragte [Patrick Gundlach](https://twitter.com/patrickgundlach), den Entwickler von speedata publisher, der bestätigte, dass es insgesamt rund drei Zeilen TeX-Code verwendet. Seine leistungsstarken Satzfunktionen sind in Lua-Code entworfen und implementiert, wobei die Lua-API von LuaTeX verwendet wird (ein Thema, das wir später in diesem Artikel besprechen).

## Eine kurze persönliche Geschichte: Wie ich LuaTeX zum ersten Mal entdeckte

Ich habe zum ersten Mal Ende 2009/Anfang 2010 von LuaTeX erfahren, als es sich noch in der mittleren Beta-Phase befand (Version 0.50). Damals suchte ich nach TeX-basierter Software, um die handschriftlichen Notizen zu setzen, die aus meinen Bemühungen entstanden, etwas Arabisch zu lernen. Google-Suchen ergaben eine Sammlung von Videos von der TUG-Konferenz 2009 ([jetzt auf YouTube](https://www.youtube.com/playlist?list=PL2D4DD50DC9C0BA0E)) die auch Demonstrationen von sehr hochwertigem arabischem Satz enthielten (über Hans Hagens [ConTeXt-Paket](http://wiki.contextgarden.net/Main_Page)). Diese Videos enthalten auch einen Vortrag mit dem Titel [Das LuaTeX-Projekt: auf halbem Weg zu Version 1](https://youtu.be/AKv4po9PGW0).

Die TeX-Engine, die verwendet wurde, um diesen exquisiten arabischen Satz zu erzeugen, war etwas namens „LuaTeX“. Damals arbeitete ich im wissenschaftlichen (Physik-)Publizieren, aber obwohl ich TeX/LaTeX vollständig kannte, hatte ich noch nie von LuaTeX gehört: Ich war neugierig und wollte mehr über diese neue TeX-Engine erfahren. Da LuaTeX sich noch in der Beta-Entwicklungsphase befand und sich rasch weiterentwickelte, wollte ich mit den allerneuesten Updates auf dem Laufenden bleiben, also war die beste Option (für mich) der Do-it-yourself-Weg, die LuaTeX-Executable aus ihrem Quellcode zu bauen (kompilieren). Zusätzlich zum ausführbaren LuaTeX-Programm benötigen Sie auch eine „TeX-Installation“, um die Umgebung bereitzustellen, in der LuaTeX ausgeführt wird (z. B. texmf.cnf, Makropakete, Schriftarten usw.). Anstatt die riesige [TeX Live](https://www.tug.org/texlive/) Distribution herunterzuladen und zu installieren, entschied ich mich, eine absolut minimale, maßgeschneiderte TeX-Installation zu erstellen, mit der ich LuaTeX erkunden konnte (eine „interessante“ Übung, die ich [auf meinem persönlichen Blog dokumentiert habe](http://www.readytext.co.uk/?cat=30)). Jede neue Version von LuaTeX wird von ihrem Referenzhandbuch begleitet (z. B. für[Version 1.0.4](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co)), das die neuesten Funktionen und Möglichkeiten der Software dokumentiert. Allerdings ist es ein *Referenz-* handbuch und (notwendigerweise) eher knapp bei Erklärungen, die für Anfänger geeignet wären, die mit dieser unglaublichen TeX-Engine beginnen möchten — ein gewisses Maß an Vertrautheit mit TeX-Konzepten auf niedriger Ebene wird vorausgesetzt. Da ich LuaTeX zu einem relativ frühen Zeitpunkt seiner Entwicklung entdeckt hatte, war gutes Einführungsmaterial damals relativ schwer zu finden, also brauchte es etwas Erkunden, Experimentieren (und etwas Frustration …), bevor sich die Teile zusammenfügten. Selbstverständlich kamen meine Arabischstudien abrupt zum Stillstand, als ich von dieser erstaunlichen Software fasziniert wurde und schließlich dazu überging, LuaTeX [Plugins für den Satz arabischer Schrift](http://www.readytext.co.uk/?p=3143) stattdessen!

Meine eigene „LuaTeX-Reise“ war sicherlich sehr nichtlinear, aber unterwegs bot sie die Gelegenheit, (Lua)TeX (und TeX-Installationen) „von Grund auf“ kennenzulernen: Mein Blog beherbergt eine eklektische Sammlung von [Artikeln](http://www.readytext.co.uk/?cat=3) basierend auf verschiedenen Themen, die ich in dieser Zeit erkundet und bearbeitet habe. Hoffentlich nutzt dieser Artikel diese Zeit und Erfahrung angemessen und hilft anderen, sich dafür zu interessieren, die Fähigkeiten von LuaTeX zu erkunden. LuaTeX wird weiterhin entwickelt und hat zum Zeitpunkt des Schreibens Version 1.0.4 erreicht, die mit TeX Live 2017 veröffentlicht wurde. Die Entwickler sind sehr aktiv und entdeckte Fehler werden gewöhnlich bald nach ihrer Meldung behoben — z. B. über die [dev-luatex-Mailingliste](https://mailman.ntg.nl/mailman/listinfo/dev-luatex) oder über den [Online-LuaTeX-Fehlertracker](http://tracker.luatex.org/my_view_page.php). Lange bevor es Version 1.0 erreichte, war LuaTeX produktionsfähig — obwohl man natürlich akzeptieren musste, dass Funktionen sich ständig weiterentwickelten und Änderungen gelegentlich bestehenden TeX-Code beschädigen konnten. Heute wird LuaTeX natürlich von den Plattformen Overleaf und ShareLaTeX unterstützt (als LuaLaTeX).

## TeX in einer sich wandelnden Welt: Neue Technologien und Workflows

Offensichtlich operieren TeX-Engines nicht in einer technologisch statischen Welt, und gelegentlich entstehen Innovationen, die sofort und offensichtlich für die Aufnahme in TeX-Engines in Frage kommen — eine solche Innovation sind variable OpenType-Schriften, auf die wir unten kurz eingehen. Obwohl kaum Zweifel daran bestehen, dass TeX-basierte Satzsoftware außerordentlich vielseitig ist, arbeiten TeX-Engines heute innerhalb eines sich rasch wandelnden und sehr vielfältigen Software-Ökosystems — neue Workflows betonen die Notwendigkeit von Integration und der Flexibilität, eine breite Palette von Dokument-/Satzlösungen zu implementieren, von denen TeX möglicherweise nur eine Komponente ist.

TeX muss nicht nur für seine aktuellen Nutzer relevant bleiben, sondern auch neue anziehen, indem es Lösungen zur Inhaltserstellung ermöglicht, die für nachfolgende Generationen nützlich bleiben — Menschen, die TeX vielleicht nicht unbedingt als eigenständiges Werkzeug nutzen wollen, sondern vielleicht als Teil eines gesamten Workflows über Online-Kollaborationsplattformen wie Overleaf.

Schon ein kurzer Blick auf [tex.stackexchange](https://tex.stackexchange.com/) zeigt die enorme Vielfalt von Dokumenten und Lösungen, die mit TeX-basierter Software erzeugt und implementiert werden — oft mit unglaublichem Einfallsreichtum, wenn Menschen immer neue Anwendungsfälle und Inhaltstypen finden, die sie erzeugen möchten. Darüber hinaus war der Bedarf an Workflows, die TeX-basiertes Markup/Inhalt verarbeiten können, um Ausgaben zu erzeugen, die nicht PDF (und nicht DVI) sind, noch nie größer — etwa MathML/XML und HTML. Zum Beispiel das „Konvertieren“ von TeX in das [JATS XML](https://jats.nlm.nih.gov/) Format (lange Zeit in der Veröffentlichung wissenschaftlicher Zeitschriften verwendet), aber auch, in jüngerer Zeit, der Aufstieg von epub im E-Book-Publishing.

### Variable Schrifttechnologie — Zeiten ändern sich

Am 14. September 2016 gaben Microsoft, [Google](https://opensource.googleblog.com/2016/09/introducing-opentype-font-variations.html), [Adobe](https://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/) und Apple eine neue Schrifttechnologie bekannt: [OpenType-Variable-Schriften](https://medium.com/@tiro/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369). Wir werden diese Technologie nicht im Detail untersuchen, aber es genügt zu sagen, dass hoch angesehene Schrift-Experten wie [Thomas Phinney](https://twitter.com/ThomasPhinney) und [John Hudson](https://twitter.com/TiroTypeworks) beobachtet haben ([auf Twitter](https://twitter.com/ThomasPhinney/status/917087509342851072)) dass die Variable-Font-Technologie viel schneller eingeführt wird als viele frühere Schriftinnovationen — sehr wahrscheinlich getrieben durch die Bedürfnisse von Webdesignern, die responsive Designs benötigen, die sich an die Vielzahl unterschiedlicher Bildschirmgrößen/Auflösungen auf Mobilgeräten anpassen.

Offensichtlich sind OpenType-Variable-Schriften eine interessante und spannende Entwicklung in der Schrifttechnologie, von der TeX-Benutzer zweifellos profitieren könnten — tatsächlich wurde diese Frage zwangsläufig bereits [auf tex.stackexchange aufgeworfen](https://tex.stackexchange.com/questions/355104/tex-luatex-xetex-fontspec-support-for-opentype-variable-fonts) mit LuaTeX-Unterstützung in der LuaTeX [Mailingliste](https://www.tug.org/pipermail/luatex/2016-September/006204.html).

Übrigens ist es erwähnenswert, dass Schrifttechnologie, die auf „parametrischer“ Schriftenerzeugung beruht, keine völlig neue Idee ist: Knuths METAFONT und Adobes Multiple-Master-Technologien sind in gewisser Weise frühe Vorläufer, auch wenn die Implementierungsdetails recht unterschiedlich sind.

### Variable Schriften: Wann wollen wir sie — jetzt?

Jeder neue und nützliche Technologiestandard/jede neue Spezifikation braucht Zeit, um sich in das Ziel-Ökosystem aus Entwicklern und Implementierern „einzuleben“ — einschließlich der Zeit, die nötig ist, um etwaige Unklarheiten oder Deutungen der Formulierungen innerhalb der Spezifikation selbst auszuräumen. Entwickler müssen die Dokumentation lesen und verstehen und sie in echte funktionierende Software umsetzen — was hier auch das Erstellen der Schriften und der Technologien zu ihrer Verwendung umfasst: kompatible Browser und Satz-Engines. TeX-Entwickler werden selbstverständlich Zugang zu hochwertigen variablen Schriften benötigen, die als zuverlässige „Benchmarks“ für die Implementierung (Programmierung) der Unterstützung variabler Schrifttechnologien dienen können.

Die Implementierung jeder neuen Technologie innerhalb von TeX, wie etwa variabler Schriften, wirft die *potenzielle* Notwendigkeit auf, die Interna von TeX-Engines zu ändern — natürlich hängt die Notwendigkeit dazu von der Art dieser Technologie ab und, entscheidend, davon, welcher Aspekt des Verhaltens von TeX geändert werden soll. Es ist nicht immer nötig, die TeX-Engines selbst zu modifizieren; vielleicht sind nur Änderungen an unterstützender/ergänzender Software erforderlich, einschließlich etwaiger „Komponenten“ (Drittanbieter-Bibliotheken mit Code), die in diesen Programmen verwendet werden. Intern sind TeX-Engines *höllisch* komplex — ein ausreichendes Verständnis des Quellcodes von TeX, um verlässliche Änderungen vorzunehmen, erfordert beträchtliche und hochspezialisierte Expertise (von der es nur sehr wenig gibt). Es ist außerdem unerlässlich, dass sich Änderungen nicht nachteilig auf die langfristige Stabilität/Kompatibilität von TeX-Engines auswirken — was für die TeX-Community und für diejenigen, die anschließend die (La)TeX-Datei(en) eines Autors verarbeiten, von entscheidender Bedeutung ist: insbesondere akademische Verlage und cloudbasierte Dienste wie Overleaf und ShareLaTeX.

Viele TeX-Benutzer dürften daran interessiert sein, variable Schriften zu nutzen; zum Beispiel, um neue Gestaltungsmöglichkeiten umzusetzen oder Lösungen für knifflige Satzprobleme zu finden. In gewissem Sinne gibt es also ein Dilemma: TeX-Benutzer wollen Zugang zu einer neuen Technologie, aber ihre Implementierung hängt von einer sehr begrenzten Ressource ab: der Anzahl der Entwickler, die qualifiziert und in der Lage sind, dies zu realisieren. Die Änderung der Interna von TeX ist schwierig und sollte im Allgemeinen möglichst vermieden werden. Gibt es also einen anderen Weg, neue Funktionen/Möglichkeiten (bestimmter Klassen) zu TeX hinzuzufügen? Ja! Und LuaTeX ist diesen Weg gegangen.

#### Frühe Experimente: OpenType-Variable-Schriften und LuaTeX

LuaTeXs Design hat rasche Experimente mit der Technologie variabler Schriften ermöglicht. Bereits im April 2017 verfügte das TeX-Format ConTeXt, das LuaTeX verwendet, über eine [Beta-Version](https://mailman.ntg.nl/pipermail/ntg-context/2017/088343.html) die OpenType-Variable-Schriften implementierte. Dies war möglich, weil ConTeXts Schriftunterstützung in Lua-Code aufgebaut ist (und ConTeXt seinen eigenen in Lua geschriebenen Fontloader hat).

## LuaTeX: Hintergrund und Geschichte

LuaTeX ist in TeX-Begriffen „der Neue im Block“, obwohl es seit über 10 Jahren aktiv entwickelt wird. Die LuaTeX-Website [dokumentiert](http://www.luatex.org/roadmap.html) dass LuaTeX 2005 entstand, wobei (ich glaube) die aktive und kontinuierliche Entwicklung 2006 begann. Aufgrund seiner inhärenten Komplexität und der Sorgfalt derer, die es gebaut haben, benötigte LuaTeX tatsächlich 10 Jahre Entwicklung, um Version 1.0 zu erreichen, die [von seinen Entwicklern angekündigt wurde](https://mailman.ntg.nl/pipermail/dev-luatex/2016-September/005882.html) (Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso) am 27. September 2016.

In dieser Release-Ankündigung steht eine wichtige Grundsatzerklärung:

> „Unser Hauptziel ist es, eine Variante von TeX bereitzustellen, die Benutzererweiterungen ohne die Notwendigkeit erlaubt, die inneren Abläufe anzupassen.“

Diese Formulierung fasst die Philosophie hinter der Entwicklung von LuaTeX perfekt zusammen und weist auf einen Weg hin, auf dem TeX-basierte Software die bereits erwähnten Herausforderungen bewältigen kann: neue Technologien übernehmen und für neue Nutzergenerationen relevant bleiben.

Jetzt ist es an der Zeit, die zweite Frage im Untertitel dieses Artikels zu beantworten: „was macht es so anders“. Indem wir die Bedeutung von „...erlaubt Benutzererweiterungen ohne die Notwendigkeit, die inneren Abläufe anzupassen“ erkunden, können wir die Essenz dessen besser verstehen, was LuaTeX „mitbringt“.

## LuaTeX: TeXs „Black Box“ öffnen

Knuths ursprüngliches TeX-Programm ist der gemeinsame Vorfahr aller modernen TeX-Engines, die heute verwendet werden, und LuaTeX ist im Grunde der jüngste evolutionäre Schritt: abgeleitet vom pdfTeX-Programm, aber mit der Ergänzung einiger leistungsstarker Softwarekomponenten, die eine große Menge zusätzlicher Funktionalität mitbringen. Als Knuth die ursprüngliche Version der TeX-Software schrieb, stellte er auch die TeX-Sprache als Mittel bereit, um ihr Satzverhalten zu steuern und zu programmieren: Rund 320 niedrigstufige Befehle (Primitiven) wurden den Benutzern und Entwicklern von TeX-Makropaketen zur Verfügung gestellt. Diese Befehle boten unterschiedliche Grade der Kontrolle oder Beeinflussung bestimmter Aspekte von TeXs Satzverhalten, aber ein Großteil der internen Funktionalität, der Algorithmen, Entscheidungsprozesse, Daten und Datenstrukturen von TeX blieb dem Benutzer verborgen. Man kann argumentieren, dass Knuths TeX-Programm keine völlig „Black Box“ war, aber sicherlich einen sehr dunklen Grauton darstellte — zugegeben, der Quellcode wurde verfügbar gemacht, aber für die allermeisten Menschen ist auch das eine Black Box der Unverständlichkeit.

Wir bezeichnen die internen Prozesse in TeX als eine Art „Black Box“; LuaTeX öffnet jedoch seine auf TeX basierenden Interna und bietet Benutzern/Entwicklern so weitaus größeren Zugriff auf viele der einst verborgenen Prozesse, die tief im Inneren der TeX-Engine ablaufen, sowie mehr Kontrolle darüber. LuaTeX fügt außerdem viele neue primitive Befehle hinzu, die die Steuerung der neuen Funktionen ermöglichen.

### LuaTeX: Von pdfTeX abgeleitet, verwendet aber nicht den Code von pdfTeX

Der Genauigkeit halber ist es wichtig festzuhalten, dass LuaTeX zwar als von pdfTeX abgeleitet beschrieben wurde, LuaTeX den ursprünglichen Programmcode von pdfTeX jedoch nicht direkt verwendet. Einer der Entwickler von LuaTeX (Taco Hoekwater) unternahm die wahrhaft *herkulische* Aufgabe, den Kern der TeX-Engine von LuaTeX in sauberem, modernem C-Code (CWEB) neu zu schreiben.

#### Historische Anmerkung

Teilweise aufgrund des Alters von Knuths ursprünglichem TeX-Quellcode — von dem seine modernen Nachkommen abgeleitet sind — ist es ein komplexer und verschlungener Prozess, ihn zu ändern, um neue TeX-basierte Satz-Engines anzupassen oder zu erstellen. Ein Teil dieses Prozesses erfordert die Umwandlung von Pascal-Code in C-Code — was nicht ohne eine [gewisse Komplexität](http://www.readytext.co.uk/?p=2529). Der daraus resultierende maschinell erzeugte C-Code ist außerordentlich ausführlich und sehr schwer zu lesen oder zu verstehen. Offensichtlich umgeht das vollständige Neuschreiben von LuaTeXs Code den gesamten Pascal-zu-C-Konvertierungsprozess.

## LuaTeXs Bausteine

In der Einleitung haben wir LuaTeX als einen „Werkzeugkasten“ bezeichnet und es als „System zur Dokumentenerstellung und -entwicklung“ beschrieben. Wir haben gesehen, dass die Entwickler in der Ankündigung zu LuaTeX 1.0 sagten:

> „Unser Hauptziel ist es, eine Variante von TeX bereitzustellen, die Benutzererweiterungen ohne die Notwendigkeit erlaubt, die inneren Abläufe anzupassen.“

Es ist nun an der Zeit, diese Fäden zusammenzuführen und uns auf die Details dessen zu konzentrieren, was das alles *tatsächlich bedeutet* in der Praxis.

### Das LuaTeX-Puzzle

Wenn Sie „unter die Haube“ schauen würden, sähen Sie, dass die LuaTeX-Software, also das eigentliche ausführbare Programm, aus einer Sammlung von Softwarekomponenten aufgebaut ist, die zusammengefügt werden, um die Gesamtfunktionalität von LuaTeX bereitzustellen. Natürlich ist daran nichts Neues und die meiste Software ist so aufgebaut. Was LuaTeX jedoch von anderen TeX-Engines unterscheidet, ist, dass diese Komponenten so kombiniert werden, dass den Benutzern weitaus größerer Zugriff auf viele Aspekte der internen Funktionalität von TeX gewährt wird: TeXs Satzalgorithmen, Entscheidungsprozesse, Daten und Datenstrukturen. Diese Öffnung der Interna von TeX ermöglicht es den Nutzern, neue Satzlösungen zu konstruieren, ohne die eigentliche TeX-Engine selbst modifizieren zu müssen.

### Das Lua in LuaTeX: Ein Schlüssel zur „Black Box“

Lua ist eine sehr leistungsfähige und zugleich leicht zu erlernende Skriptsprache, die [aus Brasilien stammt](https://www.lua.org/about.html)— sie wurde 1993 geschaffen und wird weiterhin aktiv entwickelt. Eine von L u a s Stärken ist ihre Verwendung als Programmiersprache, mit der man disparate Softwarekomponenten „zusammenkleben“ kann, sodass man sie über eine einfache, aber vielseitige Skriptsprache nutzen kann. Lua spielt eine zentrale Rolle dabei, die inneren Abläufe der LuaTeX-TeX-Engine zu öffnen, aber um besser zu verstehen, wie dies erreicht wird, lohnt sich ein kleiner Umweg, um zwei Programmierkonzepte ganz kurz zu besprechen:

* Application Programming Interface (API);
* Sprachbindung.

Sie können diesen Abschnitt gerne überspringen, wenn Sie mit diesen Konzepten vertraut sind. Keines der beiden Themen wird im Detail behandelt — wir streben keine strenge technische Genauigkeit an, sondern wollen nur genügend Hintergrund liefern, um sich dieser Konzepte bewusst zu sein: ihre Bedeutung und Relevanz für LuaTeX.

### Application Programming Interface (API)

Stellen Sie sich vor, Sie sind ein Programmierer, der Code geschrieben hat, den Benutzer (andere Programmierer) nützlich finden könnten, aber Ihr Code ist komplex und Sie möchten nicht, dass Benutzer Ihres Codes sich mit diesen niedrigstufigen Details befassen müssen. Beachten Sie, dass diese Programmierer/Entwickler mit derselben Programmiersprache arbeiten, die Sie zum Schreiben Ihres Codes verwendet haben. Nehmen wir außerdem an, Sie planen, Teile Ihres Codes neu zu schreiben — z. B. um ihn schneller zu machen, weniger Speicher zu benötigen und so weiter. Bestehende Nutzer Ihres Codes sollten sich darum nicht kümmern müssen: Keine geplanten Änderungen sollten ihre Programme kaputt machen. Was ist also die Lösung?

Die Antwort liegt in etwas, das man API nennt: eine *Anwendungsprogrammierschnittstelle*. Anstatt von den Benutzern (anderen Programmierern) zu verlangen, auf die niedrigen Details Ihres Codes zuzugreifen — die sich ändern könnten — stellen Sie einen bestimmten Satz von *Funktionen* bereit, die andere Programmierer verwenden können. Diese Funktionen sind eine *Schnittstelle* zu Ihrem Code, über die andere Entwickler *Anwendungen* erstellen können, ohne intime Kenntnisse der inneren Abläufe Ihres Programms zu benötigen. In gewisser Weise kann man sich dies als eine zusätzliche Schicht vorstellen, die Ihren Code umgibt und Benutzer von den unübersichtlichen, niedrigstufigen Details „abschirmt“.

Solange Sie diese Funktionen (die Schnittstelle) nicht ändern, können Sie die unteren Details Ihrer Software frei ändern und aktualisieren, ohne die Arbeit derjenigen zu beeinträchtigen (zu beschädigen), die sich auf Ihren Code verlassen, um ihre Anwendungen zu erstellen: daher der Begriff Application Programming Interface.

#### APIs: Eine LaTeX-Paket-Analogie

Wenn Sie Befehle verwenden, die von einem LaTeX-Paket bereitgestellt werden, können Sie die Befehle des Pakets als eine Form von API betrachten. Als Benutzer interessiert Sie möglicherweise nicht unbedingt die TeX- und LaTeX-Zauberei hinter diesen Befehlen (d. h. im Code des Pakets): Alles, was Sie wollen, ist, die von ihnen bereitgestellte Funktionalität zu nutzen.

### Programmiersprachenbindung

Wir haben gesehen, dass Programmierer, die einen nützlichen Codebestand schreiben/veröffentlichen (einen *Bibliothek*genannt), eine sogenannte Application Programming Interface (eine Reihe von Funktionen) bereitstellen können, über die andere Programmierer, die *dieselbe* Programmiersprache verwenden, diese Bibliothek (Code-Sammlung) nutzen können. Das ist in Ordnung, wenn beide Seiten (Bibliotheksentwickler und ihre Benutzer) dieselbe *dieselbe* Programmiersprache verwenden, aber was passiert, wenn Programmierer mit einer *anderen* Programmiersprache diese Bibliothek ebenfalls nutzen möchten? Beispielsweise könnten Sie Skripte in der Sprache Lua schreiben, aber eine Bibliothek verwenden wollen, die zum Beispiel in Programmiersprachen wie C/C++ geschrieben ist. Irgendwie müssen die beiden unterschiedlichen Programmiersprachen (Lua und C/C++) die Möglichkeit haben, miteinander zu „kommunizieren“. Eine Lösung für dieses Problem ist die sogenannte [Sprachbindung](https://en.wikipedia.org/wiki/Language_binding).

Die technischen Details der Sprachbindung zu untersuchen, liegt außerhalb des Rahmens dieses Artikels, daher geben wir eine knappe Zusammenfassung der allgemeinen Prinzipien. Im Wesentlichen kann eine geeignete zusätzliche „Schicht“ von Code zur ursprünglichen Bibliothek hinzugefügt werden, damit sie mit einer anderen Programmiersprache (wie Lua) „kommunizieren“ kann: Diese Code-Schicht wird eine *Bindung*. Sie ermöglicht es den beiden Sprachen, über eine API zusammenzuarbeiten, über die Programmierer in der zweiten Sprache (wie Lua) auf die von der Bibliothek bereitgestellten Funktionen/Dienste zugreifen können.

![Schematische Darstellung zur Veranschaulichung des Konzepts einer Sprachbindung.](/files/993c4c676a7574d70329ca6b5b108ab516956cf8)

**Abbildung 1**Schematische Darstellung zur Veranschaulichung des Konzepts einer Sprachbindung: Sie zeigt, wie ein in Lua geschriebenes Programm eine externe Bibliothek nutzen kann, die in einer anderen Programmiersprache geschrieben ist. Durch die Verwendung von Lua-Bindings werden die internen Komponenten von LuaTeX und damit ein großer Teil der internen Satzfunktionalität von LuaTeX Benutzern zur Verfügung gestellt, damit sie Lösungen für komplexe Satzprobleme entwickeln können.

## LuaTeX: Zwei Optionen für die Programmierung — TeX und Lua

Im Wesentlichen ist LuaTeX eine TeX-Engine, die zwei Programmiersprachen unterstützt: die traditionelle, auf TeX basierende Sprache und die Lua-Skriptsprache. Natürlich können Sie beide Sprachen im selben TeX-Dokument verwenden oder, wenn Sie das bevorzugen, weiter über den reinen TeX-Weg setzen: zum Beispiel über das LaTeX-(LuaLaTeX-)Makropaket. TeX (oder LaTeX) ist keine einfache Programmiersprache zum Benutzen oder Lernen, und relativ wenige Menschen haben TeXs viele Eigenheiten wirklich gemeistert — TeXs Konzepte von [Tokens](https://www.overleaf.com/blog/522-what-is-a-tex-token) Tokenisierung und Expansion sind für die Erwartungen und Erfahrungen der meisten Menschen an eine Programmiersprache ziemlich fremd.

Die Hinzufügung von Lua eröffnet die Möglichkeit, TeX-basiertes Setzen über eine wesentlich zugänglichere und konventionellere Programmiersprache zu nutzen — wie bereits am Anfang dieses Artikels angemerkt wurde, können Sie mithilfe der Lua-API [anspruchsvolles Setzen mit praktisch keinem TeX-Code](http://wiki.luatex.org/index.php/TeX_without_TeX).

### LuaTeX fügt viele neue Primitiven hinzu

Jede TeX-Engine bietet Hunderte sogenannter primitive Befehle: die grundlegenden Bausteine der auf TeX basierenden Sprache, die von jeder einzelnen Satz-Engine unterstützt wird. Die ursprüngliche Version von TeX, veröffentlicht von Donald Knuth, bot ungefähr 320 Befehle, aber neuere TeX-Engines (pdfTeX, XeTeX und LuaTeX) haben jeweils viele neue Primitiven hinzugefügt, um Benutzern Zugriff auf die zusätzlichen Funktionen und Möglichkeiten jeder Engine zu geben. LuaTeXs beträchtliche Anzahl neuer Primitiven ist in ihrem [Referenzhandbuch](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co).

Unter den vielen neuen Primitiven, die von LuaTeX eingeführt wurden, befindet sich einer namens `\directlua{...}` der das Tor zur Nutzung von Lua-Code ist: Er ermöglicht den Zugriff auf die Interna der LuaTeX-Engine, um ausgefeilte Satzwerkzeuge und -lösungen zu bauen.

### \directlua{...}: Das Tor zur Lua-Programmierung

Wie bereits erwähnt, kann die Lua-Skriptsprache als eine „Schicht“ betrachtet werden, über die man Zugang zur auf TeX basierenden Satz-Engine von LuaTeX und zur Funktionalität vieler Komponenten erhält, aus denen LuaTeX aufgebaut ist. Die Sprache Lua ist auch der Mechanismus, der die Erweiterbarkeit von LuaTeX ermöglicht — durch L u a s Fähigkeit, spezialisierte externe Bibliotheken mit Software/Code zu laden.

Zusammen genommen wird die von LuaTeX bereitgestellte Lua-Schnittstelle (eine Menge von Lua-basierten Funktionen) als seine *Lua-API*: sie ist die „Kommunikationsverbindung“ zwischen den internen Komponenten von LuaTeX und dem Dokument des Benutzers.

### Ein einfaches Beispiel für \directlua{...}

Die folgenden *äußerst einfaches* Beispiel kratzt nicht einmal an der Oberfläche des sprichwörtlichen Eisbergs der Möglichkeiten. Es dient jedoch dazu, die grundlegende Idee des Zusammenspiels zwischen der „TeX-Art“ und der „Lua-Art“ des Zugriffs auf die Parameter von TeX zu demonstrieren.

Beachten Sie, dass:

* `\hsize` ist ein TeX-Primitiv (Befehl), das den Wert eines internen Parameters setzt, der die Breite gesetzter Zeilen bestimmt — zum Beispiel setzt man ihn normalerweise auf einen geeigneten Wert innerhalb einer `\vbox{...}`. `\hsize` ist nur einer von *vielen* TeX-Parametern, auf die Sie über Lua-Code zugreifen und/oder die Sie ändern können.
* Der Zugriff auf TeX-Parameter ist nur ein *winziger* Aspekt von LuaTeXs Lua-API: Es gibt so viel mehr!

```latex

\documentclass{article}
\begin{document}
\let\\\relax %Bedeutung von \\ neu definieren, um Expansionsprobleme zu vermeiden
Hier ist der aktuelle Wert von {\ttfamily\string\hsize} (über \LaTeX):
\the\hsize\par
\directlua{
%Den aktuellen Wert von \hsize mithilfe der Lua-API abrufen
local hs=tex.hsize
% Verwenden Sie eine Lua-API-Funktion, um etwas
% LaTeX-Code und den Wert von \hsize
tex.print("Hier ist der Wert von {\\ttfamily\\string\\hsize}
aus Lua-Code gemeldet (in skalierten Punkten): ")
tex.print(hs.."\\par")
% Einen neuen Wert für \hsize mithilfe der Lua-API setzen
tex.hsize="400pt" % oder tex.hsize=400*65536 (in skalierten Punkten) verwenden
}%
% Nachdem \directlua fertig ist, bitten wir LaTeX
% uns den neuen Wert von \hsize mitzuteilen
Hier ist der Wert von {\ttfamily\string\hsize}, gemeldet
von \LaTeX{} nachdem {\tt\string\directlua} beendet ist:
\the\hsize\par
\end{document}
```

Hier ist ein Bild, das das Ergebnis des Satzes des LaTeX-Codes durch LuaTeX (oben) zeigt:

![Ergebnisse der Ausführung von LuaTeX](/files/919c497e6c769613f41f1ac1f2e990744bea866f)

Beachten Sie, dass die TeX-„Trickserei“ von `\let\\\relax` dazu dient, Probleme zu vermeiden, die durch die „Expansion“ des Lua-Codes durch LuaTeX verursacht werden: ein Thema, das wir weiter unten kurz anmerken.

### Verwendung von Lua-Code

Es gibt zwei Hauptoptionen, Lua-Code in Ihren TeX-/LaTeX-Dokumenten zu verwenden:

1. **Inline**: Lua-Code direkt in Ihr `.tex` Dokument schreiben (wie im obigen Beispiel);
2. **Extern**: Lua-Code in externen `.lua` Code-Dateien speichern und L u a s Möglichkeiten zum Laden und Ausführen verwenden.

Option (1) eignet sich am besten für kürzere Lua-Code-Fragment. Option (2) wird für größere Programme oder Bibliotheken von Lua-Code verwendet. Sie hat den klaren Vorteil, dass Sie knifflige Probleme vermeiden können, die mit den sogenannten `\catcode` Werten (die „ziemlich frustrierend“ sein können). Der Grund für diese `\catcode` Probleme ist die „Expansion“ des Lua-Codes, bevor er in den eingebauten Lua-Interpreter von LuaTeX eingespeist wird. Diese Expansion kann schwer zu verstehen sein, daher werden wir sie in einem späteren Artikel weiter untersuchen.

Natürlich gibt es LaTeX-Pakete, die die Verwendung von Lua-Code in Ihren .tex-Dateien unterstützen — zum Beispiel können Sie das [luacode-Paket](https://ctan.org/pkg/luacode?lang=en).

## Zusammenfassung und Einleitung zu Teil 2 dieses Artikels

Die Softwarekomponenten, aus denen LuaTeX aufgebaut ist, zusammen mit der eingebetteten Lua-Skriptsprache, bieten eine leistungsstarke Kombination zum Aufbau von Lösungen, die in der Lage sind, eine breite Palette komplexer Satzprobleme zu lösen – und Dokumentenproduktions-Workflows zu entwickeln, die von einer engen Integration mit einer auf TeX basierenden Satz-Engine profitieren können. In [Teil 2 dieses Artikels](/latex/de/ausfuhrliche-artikel/09-an-introduction-to-luatex-part-2-understanding-directlua.md) werfen wir einen ausführlichen Blick auf den leistungsstärksten Befehl, den LuaTeX bereitstellt: `\directlua`.

Bis dahin: Frohes LuaTeXen!

## Danksagungen

Der Autor ist Luigi Scarso außerordentlich dankbar [Luigi Scarso](https://twitter.com/luigi_scarso), einem der Entwickler von LuaTeX, dafür, dass er sich die Zeit genommen hat, einen Entwurf dieses Artikels zu lesen und eine Reihe sehr hilfreicher Anmerkungen und Vorschläge zu machen. Für alle verbleibenden sachlichen Fehler oder Auslassungen ist natürlich der Autor verantwortlich. Außerdem möchte ich [Patrick Gundlach](https://twitter.com/patrickgundlach), Entwickler von [speedata publisher](https://speedata.github.io/publisher/), für seine Zeit danken, meine Fragen zu beantworten.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/de/ausfuhrliche-artikel/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
