iX 3/2018
S. 132
Praxis
Textsatz
Aufmacherbild

Automatisierte Dokumentenverarbeitung mit LaTeX, Teil 3: Schnittstellen zu externen Daten

Eingeordnet

Mit relativ einfachen Mitteln lassen sich in LaTeX3 Dateien einlesen. Mehrere Methoden helfen, strukturierte Daten in speziellen Objekten zu speichern und weiterzuverarbeiten.

Der wesentlichste Bestandteil für Systeme zur automatisierten Generierung von Dokumenten ist die Schnittstelle zu den Inhalten, die dargestellt werden sollen. Über das LaTeX3-Modul l3file lassen sich externe Dateien einlesen und mit den im zweiten Teil dieses Tutorials gezeigten Mechanismen flexibel verarbeiten [1, 2]. Sie können neben Inhalt auch Einstellungen für die Formatierung oder Informationen zum Ausgabemodus enthalten. Das hier vorgestellte System dient dazu, aus denselben Basisdateien unterschiedliche Fassungen zu erstellen, beispielsweise je nach Nutzergruppe. Da LaTeX eine Trennung von Inhalt und Gestaltung vorsieht, kann ein beliebiges Layout verwendet werden – etwa die im ersten Teil angelegte Vorlage im Stil des Corporate Designs.

Im dritten Teil des Tutorials werden aus einer CSV-Datei Inventarlisten und Etiketten erstellt. Dabei kann es sich zum Beispiel um die in einer Firma vorhandenen Server handeln. Die Quelldaten enthalten dann etwa die IP, den Hostnamen oder verantwortliche Betreuer. Auf dem Inventarisierungsetikett kann LaTeX diese Daten einfügen und sie zusätzlich mit einem QR-Code versehen, der den Link zum Server oder zu einem Statusbericht enthält. Die Dokumente sind beliebig erweiterbar, sodass es möglich ist, Listen zur Überprüfung der Bestände an einzelne Abteilungen zu geben. Zusätzlich lassen sich die Mechanismen auf umfangreichere Eingaben und Grafikausgaben übertragen.

Strukturierter, reiner Text

Das Modul l3file kann reinen Text einlesen. Am besten besitzen die einzubindenden Daten dieselbe Codierung wie die Datei mit dem LaTeX-Code. Es ist zwar grundsätzlich möglich, die Codierung innerhalb des Dokuments umzuschalten, allerdings ist eine solche Vorgehensweise nie empfehlenswert – insbesondere da sich mittlerweile ohne großen Aufwand alle Eingaben auf UTF-8 konvertieren lassen. Zudem erlauben immer mehr Programme einen entsprechenden Export.

Nutzer sollten die Daten so strukturieren, dass sie als reiner Text auslesbar sind. Die einfachsten Formate sind durch Trennzeichen getrennte Dateitypen wie CSV. Für komplexere Feldinhalte kann man LaTeX-Code direkt in die Daten schreiben. Für andere Auszeichnungssprachen lassen sich Parser schreiben.

LaTeX3 trennt beim Einlesen von Dateien zwischen einem Lese- und einem Schreibmodus. Streams zum Lesen kommen aus dem Datentypmodul ior (für I/O read). Analog werden schreibende Streams iow zugeordnet. Letztere werden meistens dafür genutzt, zusätzliche Hilfsdateien, die LaTeX für Querverweise oder Verzeichnisse benötigt, anzulegen oder zu manipulieren. Um externe Inhalte einzulesen, genügt es allerdings vollkommen, sich mit lesenden Streams zu befassen. Die schreibende Variante verfügt über analoge Funktionen.

\ior_new:N \LaTeXtut_content_ior

LaTeX öffnet den Stream erst, wenn der Nutzer ihm eine Datei zugewiesen hat. Der folgende Befehl lädt einen Stream zur Datei inventar. csv im Unterordner data:

\ior_open:Nn \LaTeXtut_content_ior
    {data/inventar.csv}

Pfadangaben funktionieren analog zum Einbinden anderer Dateien. Es ist immer empfehlenswert, diese relativ zu wählen, um das Projekt systemunabhängig nutzen zu können. Im Pfad enthaltene Backslashes müssen durch Slashes ersetzt werden.

Mit dem Öffnen der Datei wird der Inhalt noch nicht eingelesen. Ein geöffneter Stream entspricht grob einem Stack, der für jedes Element eine neue Zeile einliest. Dafür existieren grundsätzlich zwei Wege:

% Variablen anlegen
\tl_new:N \l_LaTeXtut_dataHeader_tl
\tl_new:N \l_LaTeXtut_data_tl
%Inhalte einlesen
\ior_str_get:NN \LaTeXtut_content_ior 
    \l_LaTeXtut_dataHeader_tl
\ior_get:NN \LaTeXtut_content_ior
    \l_LaTeXtut_data_tl

Nachdem zwei Tokenlisten-Variablen initialisiert wurden, liest \ ior_str_get:NN die erste Zeile der Datei als String. Dies bedeutet, dass Sonderzeichen innerhalb dieser Zeile keine besondere Bedeutung haben. Strings können in dieser Form auch direkt ausgegeben werden, ohne dass man Sonderzeichen maskieren muss. Sie können allerdings ihre besondere Bedeutung auch behalten, wie beim Einlesen mit \ ior_get in der zweiten Zeile.

Sorgfalt bei Leer- und Sonderzeichen

Wenn die Inhalte des Dokumentes variieren und die Kopfzeilen für die Ausgabe oder die Zuordnung der Daten bestimmt sind, empfiehlt es sich, Strings zu verwenden. Dadurch lassen sich Fehler von Eingaben durch andere Nutzer – insbesondere LaTeX-Laien – vermeiden. Dies ist auch für Dateien sinnvoll, die voraussichtlich Sonderzeichen enthalten. Das Einlesen geschieht immer in der Syntax, die gerade aktiv ist. Im Beispiel ist das die expl3-Syntax. Die Tokenlisten enthalten somit keine Leerzeichen. Möchte man dies vermeiden, kann man den Einlesemechanismus als Makro speichern und für den Moment der Ausführung über \ ExplSyntaxOff in die Standardsyntax wechseln.

Bei pdfLaTeX sorgen übrigens Umlaute für Probleme. Das Programm kennzeichnet sie über inputenc als Sonderzeichen und sie erhalten dadurch eine Funktion. Beim Umwandeln in einen String wird diese Funktion abgeschaltet, was dazu führt, dass das Zeichen nicht mehr korrekt verarbeitet werden kann: