AA_glossy_miqueias_sxc_1007747.jpg

© Miqueias, sxc.hu

Graphviz-Bilder mit LaTeX und PSTricks aufbereiten

Aufpoliert

15.05.2014
Das Programm Graphviz hilft beim Erstellen von Grafiken. Den letzten Schliff verleihen Sie den Ergebnissen aber am besten mittels LaTeX.

Serie: Graphviz

Teil 1 – Graphen flexibel berechnen LU 01/2014 http://www.linux-community.de/28542
Teil 2 -- Feinschliff mit PSTricks LU 06/2014 http://www.linux-community.de/28543

Das Programm Graphviz [1] erweist sich als nützlicher Helfer beim Erstellen gerichteter und ungerichteter Graphen. Allerdings erweist sich das Tool bei der Ausgabe zuweilen als etwas eingeschränkt: So erlaubt es beispielsweise nicht, nur vertikale und horizontale Linien als Verbinder zwischen den Knoten zu verwenden oder mathematische Formeln in den Text der Beschriftungen einzufügen, so wie es in LaTeX üblich ist.

Abhilfe schafft hier das in Python programmierte Werkzeug Dot2tex [2]. Es verwendet als Eingabedatei das DOT-Format, ruft den entsprechenden Graphviz-Renderer auf, und erzeugt je nach Parameter verschiedene LaTeX-Dateien. Auf Wunsch ruft es anschließend noch LaTeX auf.

Das Tool kennt mehrere Möglichkeiten der Ausgabe (siehe Tabelle "Varianten"). Welche Sie verwenden, hängt jeweils davon ab, welchen LaTeX-Compiler (latex, pdflatex, xelatex oder lualatex) Sie verwenden und welches Ausgabeformat – im Wesentlichen Postscript oder PDF – Sie wünschen.

Varianten

Parameter Erläuterung
pst Erzeugt Befehle für PSTricks
psn Erzeugt Befehle für PSTricks (mit Nodes)
pgf Erzeugt PGF-Befehle
tikz Erzeugt TIKZ-Befehle

Das Portable Graphics Format (.pgf) und das TikZ-Format (.tikz) dienen zum Erstellen von Vektorgrafiken und erlauben es, direkt Postscript- oder PDF-Dateien zu erzeugen. Mit pst erhalten Sie die für dieses Tool üblichen Befehle. Das Aussehen kommt der einer normalen DOT-Ausgabe sehr nahe. Als Ausgabe kommt dabei Postscript heraus, das Sie aber sehr leicht in PDF umwandeln.

Mit dem Parameter psn aktivieren Sie den Node-Mechanismus von PSTricks [3], der es Ihnen unter anderem ermöglicht, festzulegen, an welcher Stelle die Verbindung das Objekt berührt und wie die Linien verlaufen sollen.

In der Praxis orientiert sich der Einsatz der Parameter an den Anforderungen, optisch fällt das Ergebnis sehr unterschiedlich aus. Abbildung 1 zeigt dies anhand eines Beispiels. Dot2tex bietet die Möglichkeit, ein komplettes LaTeX-Dokument oder nur den Code für die Grafik zu erzeugen. Dabei verarbeitet es die Dot-Datei und ruft den entsprechenden Graphviz-Renderer auf (Abbildung 2).

Abbildung 1: Das Ergebnis der verschiedenen Parameter weicht in Bezug auf die Optik deutlich ab.
Abbildung 2: Dot2tex bedient sich in einem Zwischenschritt des entsprechenden Renderers von Graphviz.

Als Format für die Ausgabe nutzt Dot2tex XDOT, das die DOT-Befehle mit entsprechenden Koordinaten und weiteren Angaben enthält. Dieses liest die Software erneut ein und wandelt es je nach Parameter in entsprechende LaTeX-Befehle um. Anschließend rufen Sie von Hand die gewünschte LaTeX-Engine auf.

TIPP

Verwenden Sie als LaTeX-Engine xelatex, haben Sie auf diese Weise die Möglichkeit, OpenType-Fonts zu verwenden. Auch Dateien mit der Zeichenkodierung UTF-8 bereiten keine Probleme.

Installation

In den Repositories der meisten Distributionen findet sich nicht nur Graphviz, sondern auch Dot2tex. Unter Ubuntu reicht der folgende Befehl, um die Software zu installieren:

$ sudo apt-get install graphviz dot2tex

Da es sich bei Dot2tex um ein Python-Programm handelt, zieht der Paketmanager über die Abhängigkeiten die entsprechenden Pakete nach, falls sie noch nicht installiert sein sollten.

Bei der LaTeX-Installation kommt es öfter vor, dass das Paket der Distribution nicht die aktuellste Version enthält. Hier ist es sinnvoll, die TeX-Live-Installation zu verwenden: Die hat die alten LaTeX-Pakete in vielen Distributionen ohnehin schon abgelöst.

So geht's

Dot2tex erweitert die DOT-Befehle etwas. Die Variable d2toptions erlaubt, den Renderer (--prog) sowie weitere Parameter direkt in der DOT-Datei festzulegen. Das folgende Beispiel zeigt den Einsatz auf:

d2toptins="--prog=dot --figonly -f psn -t raw --encoding=utf8"

Der Parameter --figonly sorgt dafür, dass das Programm nur Befehle für die eigentliche Grafik erzeugt, die LaTeX-Präambel entfällt. Auf diese Weise verwenden Sie gegebenenfalls eigene Definitionen, etwa für die Schriften. Mit -f psn legen Sie den Modus für die Ausgabe fest.

Mit dem Parameter raw sorgen Sie dafür, dass beim Erzeugen der LaTeX-Datei keine Makros für Sonderzeichen zum Einsatz kommen. Das wiederum ermöglicht es, beliebige LaTeX-Befehle im Label zu verwenden.

Dies setzt allerdings voraus, dass Sie bestimmte Zeichen wie etwa & in der LaTeX-Notation \& schreiben. Damit das Encoding für Xelatex stimmt, enthält die Liste der Parameter zusätzlich die Angabe --encoding=utf8. Alle Parameter sowie weitere Hinweise zum Programm rufen Sie über dot2tex --help auf. Der folgende Befehl übersetzt das Beispiel aus Listing 1:

$ dot2tex -o bsp01.tex bsp01.d2t

Listing 1

digraph G {
  d2toptions="--prog=dot --figonly -f psn -t raw --encoding=utf8"
  DOT -> Organisationsdiagramme;
  DOT -> Pfeildiagramme;
  DOT -> MindMaps;
  DOT -> Netzpläne;
}

Das Ergebnis sehen Sie in Listing 2. Als Maßeinheit kommt hier bp zum Einsatz, der Postscript-Punkt. Dabei entspricht 1 Millimeter ungefähr 2,83 bp.

Listing 2

\begin{pspicture}[linewidth=1bp](0bp,0bp)(734bp,112bp)
  \pstVerb{2 setlinejoin}
  \rput(370bp,19bp){\rnode{Pfeildiagramme}{\psovalbox[]{Pfeildiagramme}}}
  \rput(133bp,19bp){\rnode{Organisationsdiagramme}{\psovalbox[]{Organisationsdiagramme}}}
  \rput(534bp,19bp){\rnode{MindMaps}{\psovalbox[]{MindMaps}}}
  \rput(452bp,93bp){\rnode{DOT}{\psovalbox[]{DOT}}}
  \rput(673bp,19bp){\rnode{Netzpläne}{\psovalbox[]{Netzpläne}}}
  \ncline[]{-}{DOT}{Pfeildiagramme}
  \ncline[]{-}{DOT}{Organisationsdiagramme}
  \ncline[]{-}{DOT}{Netzpläne}
  \ncline[]{-}{DOT}{MindMaps}
\end{pspicture}

Da es aufwendig ist, die LaTeX-Präambel für die einzelnen Grafiken immer wieder anzupassen, bietet sich ein anderer Weg an: Zum einen wäre es möglich, den Code für das Bild über die Anweisung \input{Datei} einzubinden. Zum anderen könnten Sie die ganze Datei mit einem Apache-Ant-Worker-Task [4] übersetzen (Listing 3). Hier können Sie beliebige Makros definieren, um diese in der Node-Beschriftung ("Label") zu nutzen.

Das Build-Tool Apache Ant [5] dient in erster Linie dazu, Quellcode zu übersetzen, wenn sich dieser oder eine abhängige Quelle verändert hat. Durch die sehr einfache Erweiterbarkeit eignet sich das Programm aber auch sehr gut zum Erstellen von Dokumenten aus LaTeX-Quellen oder zum Konvertieren von Bildern.

Listing 3

<?xml version="1.0" encoding="UTF-8"?>
<project name="dot2tex" basedir="." default="dot2tex">
<!-- ant-worker-task einbinden -->
<property name="ant.worker" value="lib/ant-worker.jar" />
<taskdef resource="de/nm/ant/antlib.xml" classpath="${ant.worker}" />
<!-- alle d2t-Dateien umwandeln -->
<target name="dot2tex">
<ifnewer destdir="."
        destextname="pdf"
        srcdir="."
        srcextname="b[0-9]*.*\.d2t$"
        verboseheader="false">
<d2t2pdf>
<![CDATA[
\documentclass[12pt]{article}
\usepackage{libertineotf}
\usepackage{xcolor}
\usepackage{pst-all,pst-grad}
\usepackage[a0paper]{geometry}
\newpsstyle{umlLR}{arrowinset=0,arrowlength=1,arrowscale=3,ArrowFill=false,angleA=0,angleB=180,nodesepA=1pt,armA=1cm,armB=1cm}
\newpsstyle{umlBT}{arrowinset=0,arrowlength=1,arrowscale=3,ArrowFill=false,angleA=-90,angleB=90,nodesepA=1pt,armA=1cm,armB=1cm}
\pagestyle{empty}
\begin{document}%
]]>
</d2t2pdf>
<pdfcrop />
<removeother othernames="d2t,pdf" />
</ifnewer>
</target>
</project>

Das Build-Skript, eine XML-Datei, rufen Sie mit dem Kommandozeilenwerkzeug Ant auf. Geben Sie keinen Namen für das Skript an, dann sucht das Tool nach der Datei build.xml im aktuellen Verzeichnis. Im Beispiel startet es den Task dot2tex (Listing 3, Zeile 9). Damit Ant die Erweiterung findet, binden Sie die entsprechende Bibliothek ein (Zeile 5 und 6). Die Datei ant-worker.jar befindet sich dabei im Unterverzeichnis lib.

Das Kommando ifnewer sorgt dafür, dass das Skript die DOT-Dateien mit dem Suffix d2t nur dann übersetzt, wenn diese sich geändert haben. In diesem Fall arbeitet Ant die nachfolgenden Kommandos d2t2pdf (erstellt das PDF-Bild), pdfcrop (entfernt einen eventuell vorhandenen unnötigen weißen Rand im PDF) und removeother (löscht alle nicht mehr benötigten Dateien) ab.

In der D2T-Datei kommt der Parameter figonly zum Einsatz, die Präambel setzt das Skript (Zeile 17 bis 25). Hier ist als Font der Libertine-OTF-Font eingebunden, dazu einige PSTricks-Pakete und das Paket xcolor zum Einsatz von Farben [6]. Über die Papiergröße A0 stellen Sie sicher, dass die berechnete Grafik auf das Blatt passt. Später schneiden Sie einfach mit Pdfcrop den weißen Rand ab und erhalten ein PDF in der Größe, das der Grafik entspricht.

Um UML-Diagramme zu erzeugen, enthält die Präambel zusätzlich zwei Anweisungen newpsstyle. Die darauf folgenden Befehle sorgen dafür, dass standardmäßig keine Seitennummer erscheint. Anschließend beginnt der Hauptteil des Dokuments. Das zugehörige abschließende Element fügt d2t2pdf automatisch am Ende ein.

Am Schluss räumt das Worker-Skript noch auf: Mit removeother löscht es alle Dateien, die den Basisnamen der Grafikdatei tragen, aber nicht die Endung .d2t oder .pdf aufweisen (siehe Kasten "Temporäre Dateien löschen?"). Das so erzeugte PDF binden Sie über \includegraphics{Datei} in die Master-Datei ein.

Temporäre Dateien löschen?

Oft stellt sich die Frage, ob es sinnvoll ist, temporäre Dateien sofort wieder zu löschen. Das Argument dagegen lautet häufig, die Festplatten seien inzwischen so groß, dass der Platzbedarf nicht stört.

Beim Beispiel aus Listing 3 entstehen insgesamt sechs Dateien: das Original (.d2t), die LaTeX-Datei (.tex), die TeX-Datei mit der Präambel, die Log-Datei sowie ein File, in dem LaTeX Referenzen, Verzeichnisse oder Ähnliches speichert. Ging beim Erzeugen alles glatt, benötigen Sie nur noch die D2T- und PDF-Datei, alles andere ist überflüssig.

Haben Sie allerdings 1000 Eingabedateien, so entstehen auf diese Weise 6000 zusätzliche Dateien, wobei Sie nur 2000 benötigen. Dadurch erhöht sich der Aufwand für das Dateisystem beträchtlich. Verwendet dieses zusätzlich einen Write-Cache, so löscht das System die temporären Dateien meist wieder, bevor sie tatsächlich auf der Festplatte landen. Das verringert bei Dokumenten mit vielen Bildchen die Übersetzungszeit deutlich.

Attribute für PSN

Für die Ausgabe im Modus psn stehen zusätzliche Attribute [7] für Node und Edge bereit. Damit Sie besser verstehen, wie die Attribute wirken, zeigt Listing 4 die Ausgabe, die die Software in diesem Modus für den Node erzeugt.

Listing 4

\rput(Position){\rnode{Node-Name}{\psshape[Psshade-Optionen]{Label}}}

Bei Position trägt die Software die errechnete Position ein. Für den Node kommt der definierte Name zum Einsatz. Bei Psshade-Optionen landen die entsprechenden Werte des Attributes. Für das Label wandelt das Programm den Text um beziehungsweise übernimmt ihn im Modus raw unverändert.

Zusätzlich steht noch das Attribut psbox bereit, das dafür sorgt, dass der Text des Nodes im LaTeX-Element parbox landet. Zur Angabe der Breite und Höhe verwenden Sie die Parameter width und height des Nodes (jeweils in Zoll). Ohne psbox bestimmt PSTricks die Größe der Box selbst. Auch für die Verbindungen stehen zusätzliche Attribute bereit. Die Ausgabe zeigt dabei Listing 5.

Listing 5

\psedge[Psedge-Optionen]{Style}{Ausgangspunkt}{Endpunkt}

Der Aufbau gestaltet sich hier ähnlich wie beim Node. Zusätzlich definiert stylestr die Spitzen, zum Beispiel "->". Ansonsten besteht die Möglichkeit, alle Optionen für Verbindungen und Beschriftungen zu verwenden, die PSTricks bereitstellt, darunter jeden selbst definierten Verbindungstyp (siehe Tabelle "Verbindungen" und Tabelle "Beschriftungen").

Verbindungen

Parameter Erläuterung
ncline direkte Linie
ncarc gebogene Linie
ncdiag Verbindung aus drei Segmenten
ncdiagg Verbindung aus zwei Segmenten
ncbar wie ncdiag, aber mit festem 90-Grad-Winkel
ncangle wie ncdiag, Längen und Winkel berechnet die Software automatisch
ncangles wie ncangle, jedoch mit vier Segmenten
ncloop wie ncangle, jedoch mit fünf Segmenten
nccurve Bézierkurve
nccircle Kreisverbindung zum eigenen Knoten

Beschriftungen

Parameter Erläuterung
ncput auf der Linie (center)
naput über der Linie (above)
nbput unter der Linie (below)
* die Stern-Varianten arbeiten nicht transparent, überschreiben also die Linie
nrot Richtung (Standard: von links nach rechts respektive oben nach unten)

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 8 Heftseiten

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

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

Kommentare

Infos zur Publikation

LU 08/2015: Cloud-Speicher

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Grammatikprüfung in LibreOffice nachrüsten
Grammatikprüfung in LibreOffice nachrüsten
Tim Schürmann, 24.04.2015 19:36, 0 Kommentare

LibreOffice kommt zwar mit einer deutschen Rechtschreibprüfung und einem guten Thesaurus, eine Grammatikprüfung fehlt jedoch. In ältere 32-Bit-Versionen ...

Aktuelle Fragen

Plugins bei OPERA - Linux Mint 17.1
Christoph-J. Walter, 23.07.2015 08:32, 2 Antworten
Beim Versuch Video-Sequenzen an zu schauen kommt die Meldung -Plug-ins und Shockwave abgestürzt-....
Wird Windows 10 update/upgrade mein Grub zerstören ?
daniel s, 22.07.2015 08:31, 5 Antworten
oder rührt Windows den Bootloader nicht an? das ist auch alles was Google mir nicht beantw...
Z FUER Y UND ANDERE EINGABEFEHLER AUF DER TASTATUR
heide marie voigt, 10.07.2015 13:53, 2 Antworten
BISHER konnte ich fehlerfrei schreiben ... nun ist einiges drucheinander geraten ... ich war bei...
PCLinuxOS lässt sich nicht installieren
Arth Lübkemann, 09.07.2015 18:53, 6 Antworten
Hallo Leute, ich versuche seit geraumer Zeit das aktuelle PCLinuxOS KDE per USB Stick zu insta...
Fernwartung oder wartung im haus
heide marie voigt, 29.06.2015 10:37, 2 Antworten
gerne hätte ich jemanden in Bremen nord, der mir weiter hilft - angebote bitte mit preis HMVoigt