AA_steps_johnnyberg_sxc_1354835.jpg

© Johnnyberg, sxc.hu

In kleinen Schritten

LaTeX-Dokumente automatisiert kompilieren

21.06.2013
Wer gelegentlich mit LaTeX arbeitet, der profitiert von einem sauber geschriebenen Skript, das beim Übersetzen der Quelldateien hilft.

Langjährige LaTeX-Anwender kennen ihre Werkzeuge und verfügen über ein tieferes Verständnis für das Zusammenspiel der beteiligten Programme. Mit der Zeit geraten die einzelnen Handgriffe zur Routine. Einsteiger suchen dagegen häufig nach den richtigen Befehlen. Mit einem einfachen Skript gelingt das Übersetzen im Handumdrehen – inklusive geordnetem Aufräumen am Schluss.

Standardweg

Eine LaTeX-Datei im Rohformat macht noch keinen Sommer. Für das Übersetzen ins gewünschte Format existieren mehrere Wege. Einer davon führt mittels Zwischenschritt über das Device Independent Format (DVI). Zum Erzeugen von Postscript kommen die Kommandos latex und dvips zum Einsatz, für PDF hingegen latex und dvipdf. Der direkte Weg zum PDF führt über pdflatex (Abbildung 1).

Abbildung 1: Mit wenigen Befehlen übersetzen Sie TeX-Quelldateien in die Formate Postscript und PDF.

Der Ablauf entspricht in etwa jenem beim Kompilieren von Quellcode: Es entstehen Stück für Stück Inhalts-, Abbildungs- und Tabellenverzeichnisse sowie die Querverweise. Für einfache Dokumente genügt dabei ein Durchlauf, bei umfangreicheren Texten mit Verzeichnissen und Verweisen im Text fallen in der Regel drei Durchläufe an (Listing 1). Das gilt selbst beim Einsatz von Pdflatex (wobei in diesem Fall die Schritte 4 und 5 aus Listing 1 entfallen).

Listing 1

$ latex dokument.tex
$ latex dokument.tex
$ latex dokument.tex
$ dvipdf dokument.dvi
$ ps2pdf dokument.ps

Während des Übersetzen der Quellen entstehen eine Reihe von weiteren Dateien (siehe Tabelle "Hilfsdateien"). Darin merkt sich LaTeX alle dynamischen Objekte, die es während der Analyse des Dokuments findet und die es im nächsten Durchlauf in das finale Dokument übertragen muss – beispielsweise Querverweise mit der korrekten Seitenzahl. Mit Ausnahme der .log- und .aux-Datei werden diese Zwischendaten nur dann ausgegeben, wenn LaTeX das entsprechende Verzeichnis erzeugen soll.

Hilfsdateien

Suffix Beschreibung
.log Details zum letzten Übersetzen
.toc Inhaltsverzeichnis ("Table of Contents")
.lof Verzeichnis der Abbildungen ("List of Figures")
.lot Verzeichnis der Tabellen ("List of Tables")
.aux Informationen zwischen den Durchläufen
.idx Mit makeindex erzeugte Indexdateien

Ab ins Skript

Die Abfolge der Kommandos aus Listing 1 ergibt bereit ein einfaches Batch-Skript (Listing 2), das wir im Folgenden make-pdf.sh nennen. Der Einfachheit halber kommt im Beispiel Pdflatex zum Einsatz.

Nachdem Sie das Skript mittels chmod +x make-pdf.sh mit den entsprechenden Rechten ausgestattet haben, rufen Sie es mit ./make-pdf.sh auf. Es arbeitet die gespeicherten Kommandos ab und übersetzt dabei die Datei dokument.tex in ein PDF namens dokument.pdf.

Listing 2

#!/bin/bash
pdflatex dokument.tex
pdflatex dokument.tex
pdflatex dokument.tex

Damit Sie flexibel bleiben und sich beim Übersetzen nicht nur auf ein einziges Dokument festzulegen brauchen, ergänzen Sie das Skript um einen Parameter beim Aufruf – den Dateinamen der LaTeX-Datei. Diesen Dateinamen reicht das Skript in der Variable $1 an den Befehl pdflatex weiter (Listing 3). Die Variable $1 steht in Anführungszeichen, damit auch Dateinamen mit Leerzeichen nicht zum Stolperstein geraten.

Listing 3

#!/bin/bash
pdflatex "$1"
pdflatex "$1"
pdflatex "$1"
find . -regextype posix-extended -regex '.+\.(aux|lo[gft]|toc|idx)' -delete

Bleibt noch das Aufräumen am Schluss, also das Löschen der Zwischendaten. In Zeile 5 von Listing 3 entfernen Sie diese über Find in Kombination mit einem Suchmuster als regulären Ausdruck [1].

Das Suchmuster beinhaltet mindestens ein beliebiges Zeichen (.+), gefolgt von einem Punkt (\.) und entweder der Zeichenkette aux, toc, idx oder lo in Kombination mit g, f oder t. Das Pipe-Zeichen fungiert innerhalb der runden Klammern als Oder-Operator.

Eine explizite Kennzeichnung des Anfangs (^) beziehungsweise des Endes des Suchmusters ($) ist nicht erforderlich – Find fügt das eigenständig hinzu. Ausgehend vom aktuellen Verzeichnis, symbolisiert durch den Punkt, stöbert das Programm alle Dateien auf, die auf das angegebene Suchmuster passen. Mit dem Parameter -delete am Ende des Aufrufs löscht die Software jeden Treffer.

Sie übergeben Find das Suchmuster als erweiterten POSIX-Ausdruck, was die zusätzliche Option -regextype posix-extended im Aufruf notwendig macht. Nutzer von BSD oder Mac OS X nutzen stattdessen die Option -E.

Parameter prüfen

Bislang erfolgt das Abarbeiten des obigen Skripts ohne Überprüfen der übermittelten Parameter. Nun sollten Sie sicherstellen, dass Pdflatex zum einen als Parameter überhaupt einen Wert mit Inhalt bekommt und zum anderen die im Parameter angegebene Datei tatsächlich existiert.

Dazu erweitern Sie Listing 3 um entsprechende Abfragen (Listing 4). Zeile 3 beinhaltet ein If-Konstrukt samt dazugehöriger Bedingung in den eckigen Klammern. Mit -z prüfen Sie, ob die Variable $1 leer ist. Falls ja, kommt der Block zwischen then und fi zum Einsatz. In dem Fall beschwert sich das Skript mit einer Fehlermeldung über den Aufruf und bricht mit dem Rückgabewert 1 ab.

Hat das Skript die erste Hürde erfolgreich gemeistert, dann überprüft es anschließend in Zeile 9, ob die fragliche Datei überhaupt existiert. Dazu kommt ein ähnliches If-Konstrukt zum Einsatz, diesmal aber in Kombination mit -f. Damit prüft die Bash, ob der Inhalt der Variable $1 als Datei existiert. Falls ja, ist alles gut und Sie sind auf der sicheren Seite. Falls nicht, erhalten Sie wieder eine Fehlermeldung, und das Skript bricht diesmal mit dem Rückgabewert 2 ab.

Listing 4

#!/bin/bash
if [ -z "$1" ]
then
  echo "Aufruf: `basename $0` LaTeX-Datei"
  exit 1
fi
if [ ! -f "$1" ]
then
  echo "angegebene LaTeX-Datei $1 nicht gefunden"
  exit 2
fi
pdflatex "$1"
pdflatex "$1"
pdflatex "$1"
find . -regextype posix-extended -regex '.+\.(aux|lo[gft]|toc|idx)' -delete

Fazit

Obwohl Tools wie Gummi [2] und LyX [3] bereits einen hohen Grad an Automatisierung ermöglichen, lohnt es sich dennoch, die Hand- und Kopfarbeit in etwas Eigenes zu investieren. Für ein kleines Projekt genügt in der Regel ein einfaches Skript, das Sie bei Bedarf leicht erweitern.

Falls dann etwas schief läuft, kommen Sie in den dank Textform gut lesbaren Skript-Dateien dem Fehler schnell auf die Spur und beheben ihn ohne großen Aufwand selbst. Gleichzeitig lernen Sie auf diese Weise (in appetitlichen Häppchen) mehr über die einzelnen Tools und deren Funktion. 

Infos

[1] Reguläre Ausdrücke: Frank Hofmann, "Schnipseljagd", LU 09/2011, S. 84ff., http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/09/Erste-Schritte-mit-Regular-Expressions

[2] Gummi: http://dev.midnightcoding.org/projects/gummi

[3] LyX: http://www.lyx.org

[] Der Autor bedankt sich bei Wolfram Eifler, Elmar Heeb, Axel Beckert und Thomas Winde für deren kritische Anmerkungen und Kommentare im Vorfeld dieses Artikels.

[] Frank Hofmann (http://www.efho.de) hat Informatik an der Technischen Universität Chemnitz studiert. Derzeit arbeitet er in Berlin im Open-Source-Experten-Netzwerk Büro 2.0 als Dienstleister mit Spezialisierung auf Druck und Satz. Er ist Mitgründer des Schulungsunternehmens Wizards of FOSS. Seit 2008 koordiniert er das Regionaltreffen der LUGs aus der Region Berlin-Brandenburg.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

Kommentare