Syntaxdiagramme mit LaTeX und rail unter macOS erstellen

Headerbild: Syntaxdiagramme mit LaTeX und rail unter macOS erstellen

Große Texte schreibe ich gerne mit LaTeX. Für Syntaxdiagramme im Text verwende ich seit Jahren rail. Hierbei handelt es sich um ein LaTeX-Paket nebst zugehörigem Programm, welches die Diagrammdateien für LaTeX übersetzt. Das Paket ist im Original ausschließlich im Quellcode zu haben. Unter Gnu/Linux habe ich es mehrfach übersetzt. Auch eine Version für Windows habe ich schon gebastelt.

Nun wollte ich einen bestehenden Text, der Syntaxdiagramme enthält, unter macOS überarbeiten und übersetzen. Also rail auf den Rechner geladen und … – So einfach war es nicht mit der Übersetzung. Der Apple-Compiler kann mit dem uralten Quellcode nichts anfangen. Wie es dennoch funktioniert, beschreibe ich hier. Wer keine Lust zum Compilieren hat, findet am Ende des Artikels ein Archiv, in dem sich nicht nur der Quellcode, sondern auch ausführbare Dateien für macOS/OS X und Windows befinden.

Voraussetzungen schaffen

Neben rail, welches man sich bei CTAN herunterladen kann, brauchen wir natürlich Xcode, die Entwicklungsumgebung für macOS/OS X. Die kann man sich leicht aus dem App-Store herunterladen. Das kostet auch nichts – toll. Außerdem werden noch die Kommandozeilenwerkzeuge für Xcode benötigt. Auch die gibt es gratis. Um sie zu installieren, geben wir, nach erfolgreicher Xcode-Installation, den folgenden Befehl im Terminalfenster ein:

$ sudo xcode-select --install

Damit, so dachte ich anfangs, wäre alles gut. Wie jedoch schon zu Beginn dieses Artikels angedeutet, funktioniert das Ganze nicht. rail lässt sich mit den Apple-Tools nicht übersetzen. Bloße Anpassungen des Makefiles reichen nicht aus. Man braucht noch die Werkzeuge yacc, Bison und einen „alten“ gcc. Ich verwende hier macOS Sierra und habe mich für das Repository MacPorts entschieden, um die benötigten Werkzeuge zu installieren. Um MacPorts zu installieren wird Xcode samt Kommandowerkzeugen benötigt. Deren Installation ist/war also nicht umsonst, auch wenn sonst nicht programmiert werden soll. Wie MacPorts und die dort verfügbaren Programme installiert werden, ist auf der Dokumentationsseite detailliert und einfach verständlich beschrieben. Als gcc-Version habe ich Version 4.3 verwendet. Mit den neueren Versionen ließ sich rail bei mir nicht übersetzen.

rail übersetzen

Nach Abschluss der Vorarbeiten, habe ich das Makefile angepasst. Das für macOS Sierra und MacTex 2016 angepasste Makefile liegt dem beigefügten Archiv unter dem Namen Makefile.macos bei. Wer selbst compilieren möchte, muss es also entsprechend umbenennen oder kopieren. Damit nun auch der richtige Compiler verwendet wird, muss der gcc4.3 aktiviert werden. Bei MacPorts funktioniert das mit folgendem Befehl:

$ sudo port select --set gcc mp-gcc43

Später kann man mit

$ sudo port select --set gcc none

wieder zum Apple-Compiler zurückschalten. Vorher sollte man natürlich rail übersetzen und installieren. Das ist nun einfach:

$ make
$ sudo make install
$ sudo texhash

Das war es dann auch schon. rail ist einsatzbereit installiert.

Syntaxdiagramme erstellen

In den im Paket enthaltenen Beispiel- bzw. Dokumentationsdateien kann man lernen, wie rail angewendet wird. Das im Beitragsbild dargestellte Diagramm stammt aus rail.tex, der Dokumentation zu rail. Die Dokumentation zeigt beispielhaft verschiedene Syntaxdiagramme und ist leicht verständlich.

Als erstes muss das rail-Paket in das Dokument eingebunden werden:

\usepackage{rail}

Wer will, kann auch noch Optionen direkt im Dokument verankern. Beispiel:

\railoptions{+ac}

Es geht aber auch über die Kommandozeile. Hier ein Auszug aus der Manage, welche die Parameter erläutert:

-a     An alternate layout is used for the * operator with an  empty  
       second  argument.   Instead  of transforming x * into 
       () | x + it is transformed into () + x.

-c     The  input is checked for undefined identifiers and unnamed rules.  
       Statistics about those are printed to the standard output stream.

-d     Turns on yacc(1) debugging output. This only works if the program 
       has been compiled with YYDEBUG defined (which is the default) and 
       your yacc supports it.

-h     Arrow-heads are drawn where lines enter the boxes.

-i     Index entries are generated for all named rules, i.e., rules that 
       are of the form identifier : body.

-t     The parse tree of a rule body is included as comments in file.rao.

Dies ist der aus der Dokumentation entnommene Quelltext für das Beitragsbild:

\begin{rail}
decl : 'def' identifier '=' ( expression + ';' )
| 'type' identifier '=' type
;
\end{rail}

Zuerst ist dann das Dokument mit LaTeX zu übersetzen. Beispielsweise mit pdflatex:

$ pdflatex dokument

Sodann folgt ein rail-lauf und ein oder mehrere weitere LaTeX-Läufe. Die Anzahl hängt bekanntlich vom Dokument und den darin enthaltenen Querverweisen ab. Also mindestens:

$ rail dokument
$ pdflatex dokument

Fertig ist das LaTeX-Dokument mit Syntaxdiagramm. – Letztlich also doch ganz einfach.

Download

Wer rail nicht selbst übersetzen mag, der kann sich hier ein Archiv herunterladen. Das Archiv enthält fertig übersetze Programme für macOS bzw. OS X sowie für Windows. Für Windows sind zwei Versionen enthalten, 16- und 32-Bit. Die 16-Bit-Version gehört zum Umfang des Original-Archivs. Ich denke nicht, dass jemand etwas damit anfangen kann. Die von mir übersetzte Version hat 32-Bit und läuft unter Window 7 oder neuer. Die dazu erforderliche Datei cygwin1.dll ist auch enthalten.

Hier ist das Download-Archiv.

 
DOWNLOAD

 
Einen Hinweis möchte/muss ich noch geben. rail mag den Windows-Zeilenumbruch nicht. Näheres hierzu kann in den Kommentaren meines analogen Beitrags zu LaTeX und rail nachgelesen werden.

Karsten Brodmann

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.