iX 2/2018
S. 118
Praxis
Textsatz
Aufmacherbild

Automatisierte Dokumentenverarbeitung mit LaTeX, Teil 2: Programmierung in LaTeX3

Ordentlich vermischt

LaTeX bietet Anwendern bereits rudimentäre Möglichkeiten zu programmieren – etwa zur automatisierten Datenverarbeitung. Über das Paket expl3 stehen auch die deutlich leistungsfähigeren Methoden von LaTeX3 zur Verfügung.

Seit 1994 ist LaTeX2e die „aktuelle“ Version von LaTeX. Seitdem arbeiten die Entwickler des LaTeX3-Projekts am Nachfolger LaTeX3. Er bringt neue Funktionen und verbessert das Handling der Makros und insbesondere der Makroexpansion. Zwar wartet die TeXnische Welt gebannt auf die offizielle Release, allerdings gibt es zum Ausprobieren seit über zehn Jahren ein LaTeX3-Bundle im Comprehensive TeX Archive Network (CTAN). Das Wrapper-Paket heißt expl3 und ist Bestandteil des l3kernel-Bundles (siehe ix.de/ix1802118). Die Namensgebung stellt damit klar, dass es sich um experimentelle Konzepte handelt. Trotzdem sind die verwendeten Pakete stabil und für den produktiven Einsatz durchaus geeignet. Da sich der Funktionsumfang von LaTeX3 jedoch ständig vergrößert, lohnt ein Update der Distribution inklusive der aktuellen Paket-Updates von CTAN vor der Verwendung.

Primär soll LaTeX3 dem historisch gewachsenen Mischmasch von LaTeX- und TeX-Makros ein Ende bereiten und eine konsistente Schnittstelle für komplexe Programmierung bereitstellen. Ein weiteres Ziel ist es, sämtliche Möglichkeiten einheitlich zu dokumentieren, sodass Nutzer die Funktionsweise einfacher nachvollziehen können. Dazu soll eine neue Syntax dienen, die sich maßgeblich von der von LaTeX2e und TeX unterscheidet. Der Nachteil ist, dass man sich zunächst mit der neuen Syntax und den Methoden vertraut machen muss. Diese Grundlagen sind zusammen mit einer Vorstellung einiger Datentypen der Inhalt dieses zweiten Teils des Tutorials.

Unbemerkter Zugriff auf LaTeX3

LaTeX3 wird mittlerweile in immer mehr Paketen wie xparse oder siunitx verwendet, da die Entwickler die neuen Möglichkeiten schätzen und sie nutzen möchten. Unter Umständen verwendet man es also bereits, ohne davon Notiz zu nehmen. Denn bisher zielt der Einsatz genau darauf ab, dass die Teile in experimenteller LaTeX3-Syntax vor den Endanwendern verborgen bleiben. Die komplexen Mechanismen zum Verarbeiten der Eingaben laufen im Hintergrund. Erst wenn man diese Templates bearbeiten möchte, sind Kenntnisse in expl3 erforderlich.

Dann genügt es allerdings nicht, lediglich das Paket expl3 zu laden. Die Syntax muss zusätzlich ein- und hinterher wieder ausgeschaltet werden. Im klassischen LaTeX existiert ein ähnlicher Mechanismus, der interne Makros vor Verwendung durch Endnutzer schützt. Dort enthalten Namen ein @-Zeichen. Die Schalter \makeatletter und \makeatother wechseln den Modus. Ist das @ als Buchstabe („letter“) kategorisiert, kann es in Befehlsnamen verwendet werden. Ist es ein Zeichen der Kategorie „other“, was dem Normalzustand entspricht, lässt sich ein Makro mit @ im Namen weder definieren noch aufrufen. Analog zum Umgang mit dem @ gibt es für LaTeX3 zwei Makros, die die neue Syntax aktivieren und anschließend wieder deaktivieren:

\ExplSyntaxOn
% Hier kann LaTeX3-Syntax verwendet werden
\ExplSyntaxOff

Diese ersten neuen Makros haben bis auf den Camel Case die Struktur klassischer LaTeX-Befehle – nachvollziehbar, denn vor dem Umschalten ist noch die Standardsyntax aktiv. Um konsistent zu bleiben, hat der Ausschalter dieselbe Struktur. Innerhalb der expl3-Syntax lassen sich natürlich auch LaTeX2-Makros verwenden. Im Vergleich zum Umschalten des @-Zeichens hat \ ExplSyntaxOn jedoch deutlich weitreichendere Auswirkungen auf das Verhalten des Interpreters – nicht nur auf ein einzelnes Zeichen.

1. Leerzeichen (und somit auch Zeilenumbrüche) im Code werden ignoriert. Einzige Ausnahme sind Leerzeichen als Abschluss (\ La TeX \ LaTeX).

2. Makronamen enthalten Unterstriche und Doppelpunkte.

Ganz neue Wege gehen

Listing 1: Variablen verwenden

\documentclass{article}

%ggf. anpassungen bzgl. Kodierung
\usepackage{expl3}
\begin{document} 
  \ExplSyntaxOn
  \int_new:N \g_LaTeXtut_item_int
  Variable~ vor~ Wertzuweisung:~ 
  \int_use:N \g_LaTeXtut_item_int
  \newline
  \int_set:Nn \g_LaTeXtut_item_int {42}
  Variable~ nach~ Wertzuweisung:~ 
  \int_use:N \g_LaTeXtut_item_int
  \ExplSyntaxOff
\end{document}

In LaTeX3 folgen Befehle und Variablen neuen Mustern für die Benennung. Listing 1 zeigt ein vollständiges Beispiel. Durch die Syntaxänderung kann man mit expl3 eine neue Namensstruktur nutzen, um dem Anspruch leichter nachvollziehbarer Makronamen gerecht zu werden. Diese ist im Vergleich zu Standard-LaTeX gewöhnungsbedürftig, allerdings nach kurzer Eingewöhnung intuitiv nutzbar. Unterstriche untergliedern die Namen in Teile. Variablennamen lassen sich nach diesen Konventionen in vier Teile zerlegen:

\<Gültigkeit>_<Modul>_<Variablenname>_<Typ>

So beschreibt etwa \ g_LaTeXtut_item_int eine globale Variable (g) mit dem Namen item aus dem Modul LaTeXtut vom Typ int (Ganzzahl). Das Modul klassifiziert die Herkunft des Makros. Der Name wird meistens so gewählt, dass er dem Paket- oder Projektnamen entspricht, beispielsweise verwendet das Paket siunitx als Modulnamen ebenfalls siunitx. Dieser zusätzliche Namensteil soll Wechselwirkungen zwischen Paketen unterschiedlicher Autoren vermeiden.

Interne Variablen eines Moduls, die nicht außerhalb verwendet werden sollen, erhalten zwei Unterstriche vor dem Modulnamen statt einen. siunitx definiert etwa die Variable \ l_ _siunitx_tmpa_tl als lokale Tokenliste für kurzfristige interne Zuweisungen.

Die Variablennamen selbst sollten bezeichnend und lesbar gewählt werden. Um die Lesbarkeit zu erhöhen, darf dieser Teil weitere Unterstriche enthalten. Abgesehen vom Unterstrich gelten für verwendbare Zeichen dieselben Einschränkungen wie bei LaTeX2e. Der Definitionsbereich kann drei Werte annehmen: