Graphen zeichnen mit TikZ: Im Anfang war der Pfad Till Tantau Mathematische Ideen möchten visualisiert werden. Obwohl sich alle Mathematik-Sachverhalte rein durch Texte und Symbolfolgen beschreiben lassen, veranschaulichen wir sie am liebsten mittels Zeichnungen von Relationen, Funktionen, Graphen, Mengen oder Räumen. Eine Möglichkeit, Visualisierungen von mathematischen Ideen speziell im Kontext des TEX-Satzprogrammes zu erstellen, stellt die Grafikbeschreibungssprache TikZ dar. Anhand eines einfachen Beispiels – ein Graph, dessen Knoten im Kreis angeordnet werden sollen – werden im Artikel drei unterschiedliche Arten vorgestellt, diesen mit TikZ zu zeichnen: Die direkte Nutzung von Pfaden, was die in der TikZ-Historie älteste Möglichkeit darstellt; die Nutzung spezieller Befehle zum Zeichnen von Knoten und Kanten, eine neuere und komfortablere Art der Beschreibung; und schließlich die Nutzung spezieller GraphzeichnenAlgorithmen, der jüngsten Erweiterung von TikZ.

1

Einleitung

David Hilbert hat mit seinem berühmten Ausspruch, es müsse egal sein, ob man von „Punkten“, „Geraden“ und „Ebenen“ spreche oder von „Tischen“, „Stühlen“ und „Bierseideln“, die Anschaulichkeit aus dem Kern der Mathematik verbannt: Mathematik-Studenten lernen heute früh, dass sich die gesamte Mathematik auf logische Kalküle und die Axiome der Mengenlehre zurückführen lässt, dass jeder mathematische Satz letztendlich nur eine formell ableitbare Symbolfolge darstellt. Betritt man aber hundert Jahre nach Hilberts Diktum das Büro einer Mathematikerin, eines Theoretischen Informatikers oder einer Theoretischen Physikerin, so sind die Tafeln dort voll mit Skizzen, komplexen Diagrammen und Zeichnungen von Graphen. Formell mag die Mathematik auf reine Symbolmanipulation zurückführbar sein – wenn Menschen über mathematische Sachverhalte sprechen und schreiben, nutzen sie vielfältige Arten der Visualisierung, um ihre Ideen anderen verständlich zu machen. Mathematische Texte werden heute fast ausschließlich mit Donald Knuths Programm TEX verfasst, da es eine unerreichte typografische Qualität bietet und gleichzeitig geübten Autoren eine unerreicht hohe Arbeitsgeschwindigkeit erlaubt. Die Visualisierung von mathematischen Ideen hingegen ist in TEX nicht direkt vorgesehen; Knuth hat aber einen allgemeinen Mechanismus in sein Programm eingebaut, mit dem sich diese Fähigkeit mit einigem Aufwand prinzipiell nachrüsten lässt. Ein freies Paket, das den Aufwand nicht gescheut hat, ist das TikZ-Paket, um das es in diesem Artikel gehen soll. „TikZ“ steht für „TikZ DOI 10.1515/dmvm-2014-0016

ist kein Zeichenprogramm“ (wohl das erste rekursive typografische deutsche Akronym der Informatikgeschichte). Der Name soll Autoren warnen, dass sie keinen grafischen Editor erwarten dürfen, sondern vielmehr eine Sammlung von TEX-Befehlen mit allen Vor- und Nachteilen, die ein solcher Ansatz mit sich bringt. Ursprünglicher Anlass für die Entwicklung von TikZ war, dass ich für meine Promotionsschrift Zeichnungen direkt in TEX erstellen wollte. Alle damals verfügbaren Pakete hatten Nachteile: Metafont und PSTRICKS kamen mit dem PDF-Format nicht zurecht, die Qualität der von LATEXs Picture-Umgebung erzeugten Zeichnungen genügte mir nicht, Pakete wie XYPIC nutzten eine kryptische Syntax und waren weitgehend undokumentiert. So entstand eine erste noch sehr einfache Version von TikZ, die aber bereits Zeichnungen sowohl im PDF- wie auch PostScript-Format erstellen konnte, die qualitativ hochwertige Zeichnungen erzeugte und die auch eine Dokumentation besaß. Über zehn Jahre später ist die Dokumentation auf weit über 1000 Seiten angewachsen und mit TikZ lassen sich nun viele Standardprobleme bei der Visualisierung von Mathematik auf elegante Art lösen.

x1 xn

xn−1

x2

...

Abbildung 1. Die mit TikZ zu erstellende Beispielzeichnung

Dieselbe Zeichnung kann in TikZ oft auf viele verschiedene Arten erzeugt werden. Im Folgenden sollen gleich drei Wege gezeigt werden, wie der in Abbildung 1 gezeigte Graph in TikZ beschrieben werden kann. Als erstes werden wir den Graphen direkt mittels Pfaden zeichnen, was zugleich die Methode der Wahl in der allerersten Version von TikZ war. Komfortabler ist dann schon die Nutzung von „Knoten“ und „Kanten“ zur Beschreibung des Graphen – die Namen kommen nicht von ungefähr –, was bisher die beste Art war, eine Zeichnung wie die in Abbildung 1 zu beschreiben. Zum Schluss darf dann die seit Anfang 2014 verfügbare Version von TikZ ihre Fertigkeiten demonstrieren: Durch die Nutzung einer neuen Graphsyntax und Algorithmen zum automatischen Zeichnen von Graphen lässt sich der Graph auf sehr kompakte Art beschreiben. FOKUS 35 Unauthenticated Download Date | 8/17/17 12:57 AM

Egal wie wir die Zeichnung aus der Abbildung im Folgenden beschreiben werden, einige Elemente bleiben gleich: Um die von TikZ definierten neuen TEX-Befehle überhaupt nutzen zu können, muss TikZ zunächst geladen werden (extra installiert werden muss es zum Glück nicht, da es Teil jeder Standard-TEX-Installation ist). In LATEX geschieht dies wie bei anderen Paketen auch mittels \usepackage{tikz}, für die LATEX-Alternative ConTEXt und für das klassische PlainTEX gibt es analoge Befehle. Im eigentlichen Dokument können nun {tikzpicture}Umgebungen eingefügt werden (wieder gibt es Pendants für ConTEXt und PlainTEX), jede von ihnen erzeugt dann eine Zeichnung aufgrund der speziellen Befehle innerhalb der Umgebung. Praktischerweise muss die Größe des Bildes nicht angegeben werden, TikZ errechnet diese selbst und reserviert die nötige Menge an Platz auf der Seite. Das fertige Dokument kann schließlich mit allen gängigen Varianten von TEX gesetzt werden, sei es TEX, XETEX, pdfTEX oder LuaTEX. Normalerweise resultiert dies schließlich in einer PDF-Datei, es lassen sich aber auch SVG-Dateien direkt erzeugen, was im Web-Kontext nützlich ist. 2

erzeugt

Statt eines Kreises benötigen wir aber vier Kreise, deren Mittelpunkte ihrerseits auf einem Kreis liegen. Dies ist leicht zu erreichen, indem wir die Mittelpunkte mittels Polarkoordinaten angeben, was in TikZ durch Benutzung eines Doppelpunkts statt eines Kommas geschieht (TikZ kennt noch viele weitere Koordinatensysteme und es können, falls nötig, auch eigene definiert werden). Wir ersetzen also den Pfad durch einen Pfad bestehend aus vier Kreisen: \draw ( 90:13mm) ( 90-72:13mm) ( 90+72:13mm) (90+144:13mm)

circle circle circle circle

[radius=5mm] [radius=5mm] [radius=5mm] [radius=5mm];

Wir erhalten:

Im Anfang war der Pfad

Die zentralen grafischen Elemente, mit denen TikZ und auch die meisten anderen Grafiksprachen intern arbeiten, sind Pfade. Mathematisch sind dies Mengen von offenen oder geschlossenen Kurven, die stückweise kubische Bézier-Kurven sind. In unserem Beispielgraph bilden die Kreise Pfade, ebenso die Bögen der Pfeile zwischen den Knoten. Sogar jede einzelne der kleinen Pfeilspitzen ist von einem Pfad umfasst. Pfade spezifiziert man in TikZ in einer speziellen Syntax, die sich in ihren Grundzügen an Donald Knuths Metafont anlehnt. So beschreibt (0,0)--(2,2)--(2,0)--(0,2)--cycle

einen sich selbst kreuzenden, geschlossenen Pfad ( ). In unserem Beispiel wollen wir als erstes die Kreise zeichnen. Jeder lässt sich gut durch vier Bézier-Bögen approximieren, deren Koordinaten man aber natürlich nicht selbst berechnen muss, sondern die man mittels des speziellen Befehls circle erzeugt. So ist der folgende Pfad ein auf den Urspung zentrierter Kreis mit einem Zentimeter Durchmesser: (0,0) circle [radius=5mm]

Die Spezifikation eines Pfades alleine erzeugt allerdings noch keine Zeichnung. Es „muss etwas mit dem Pfad passieren“; bei den Kreisen möchten wir, dass sie gezeichnet werden, dass also ein Stift entlang des Pfades geführt wird. Hierfür benutzt man wie in Metafont den Befehl \draw, dem ein Pfad folgt und der durch ein Semikolon abgeschlossen wird:

Als nächstes wollen wir die Kanten zwischen den Kreisen (die Bögen) hinzufügen. Hierfür bietet sich der Befehl arc an, der dem Pfad ab der aktuellen Position einen Kreisbogen anfügt, wobei der Startwinkel, der Endwinkel und der Kreisradius als Optionen angegeben werden. Beispielsweise erhalten wir den Bogen vom oberen Kreis zu seinem rechten Nachbarn wie folgt: \draw (68:13mm) arc [ start angle = 68, end angle = 50, radius = 13mm ];

Die Winkel von 68◦ und 50◦ ergeben sich daraus, dass die Bögen ja am Rand der Kreise beginnen und enden sollen und nicht jeweils in deren Mitte. „Etwas Ausprobieren“ ergab, dass die Winkel der Mittelpunkte der Kreise (90◦ und 18◦ ) um 22◦ verkleinert beziehungsweise vergrößert werden müssen. Fügt man entsprechend auch Befehle für die anderen Bögen hinzu, so erhält man:

\begin{tikzpicture} \draw (0,0) circle [radius = 5mm]; \end{tikzpicture}

36

FOKUS

MDMV 22 / 2014 | 35–40 Unauthenticated Download Date | 8/17/17 12:57 AM

Es ist mühselig und fehlerträchtig, die Start- und Endwinkel für jeden der fünf Bögen einzeln auszurechnen. Praktischer wäre es, die gleichartigen Bögen mittels einer Schleife zu erzeugen, bei der sich lediglich der Winkel in 72◦ -Schritten ändert. Hierfür bietet TikZ den \foreachBefehl, mit dem sich sehr viele ähnlich gelagerte Fälle automatisieren lassen: \foreach \angle in {18, 90, 162, 234, 306} { \draw (\angle-22:13mm) arc [ start angle = \angle-22, end angle = \angle-72+22, radius = 13mm ]; }

Unsere Bögen benötigen noch gefüllte Pfeilspitzen. Man könnte nun für jede dieser Spitzen einen kleinen Pfad angeben und diesen dann mittels \fill füllen (statt ihn mit \draw nur zu „zeichnen“). Da jedoch Pfeilspitzen recht häufig vorkommen, bietet TikZ Unterstützung: Dem \draw-Befehl kann die Option [->] übergeben werden. Hierdurch wird am Ende des Pfades eine Pfeilspitze mit der richtigen Ausrichtung gezeichnet. Verändern wir also die \draw-Befehle der Bögen und erhalten: \draw [->] (\angle-22:13mm) ...

x1 x2

xn

xn−1

3

...

Von Knoten und Kanten

Es mutet reichlich verdächtig an, dass der Befehl zur Erzeugung von Beschriftungen ausgerechnet „node“ heißt – und nicht etwa „text“ oder „label“. Tatsächlich ist sein eigentlicher Zweck die Spezifikation von Knoten im Sinne der Graphentheorie – dass diese geeignet positioniert auch einfach nur als Beschriftungen dienen können, ist eher ein angenehmer Nebeneffekt. Meist ist es bei der Spezifikation von Knoten sogar fast hinderlich, dass überhaupt ein Pfad angegeben werden muss, auf dem dann die Knoten positioniert werden. TikZ stellt deshalb den Befehl \node zur Verfügung, mit dem sich unabhängig von einem Pfad ein Knoten erzeugen lässt. Knoten haben in TikZ eine Form, eine Koordinate, einen Namen und eine Beschriftung. All diese Angaben sind optional und jede hat ihre eigene Syntax; lediglich die Beschriftung muss immer am Ende in geschweiften Klammern angegeben werden, sie kann aber leer sein. Die allgemeine Syntax des \node-Befehls lautet vereinfacht (ihre exakte Beschreibung nimmt knapp vier Seiten in der Dokumentation ein):

Das Aussehen der Pfeilspitze werden wir später noch anpassen; die oben zu sehende Voreinstellung ist die Art Pfeil, die man in TEX aus mathematischen Formeln wie f : A → B gewohnt ist. Etwas schöner werden die Pfeile noch, wenn man sie an den Spitzen leicht verkürzt, beispielsweise indem der Endwinkel um 2◦ erhöht wird. Es fehlen nur noch die Beschriftungen. Da solche Beschriftungen typischerweise an bestimmten Punkten auf einem Pfad eingefügt werden sollen, gibt man solche Beschriftungen auch mit an, während man Pfade spezifiziert. Jeder Koordinate auf einem Pfad darf der Befehl node folgen, der einen beliebigen Text als Parameter bekommt, jedoch ist dieser Text nicht Teil des Pfades. Er wird vielmehr erst eingefügt, nachdem der Pfad gezeichnet wurde. In unserem Beispiel können wir die Beschriftungen genau den Kreismittelpunkten folgen lasse. Der erste Kreis lautet dann: \draw (90:13mm) node{$x_1$} circle[radius=5mm];

Ergänzt man die anderen Beschriftungen entsprechend und verkürzt die Pfeile wie oben beschrieben, so erhalten wir unsere erste vollständige Zeichnung von Abbildung 1, wobei wir nur Pfade und Beschriftungen genutzt haben: MDMV 22 / 2014 | 35–40

\node [Form,weitere Optionen] (Name) at (Koordinate) {Beschriftung };

Die wohl wichtigste Eigenschaft eines Knotens ist seine Form. Knoten können quadratisch sein, rechteckig, kreisförmig, elliptisch oder eine von vielen ausgefallenen weiteren Formen haben. Die Knoten in unserem Beispiel sind offenbar kreisförmig, weshalb wir als Form „circle“ angeben (sie hat nichts mit dem gleichnamigen Pfadkommando zu tun). TEX setzt nun zunächst die Beschriftung normal und zentriert sie an der angegebenen Koordinate. Stellen wir uns nun ein Rechteck minimaler Größe um diese Text vor. TEX vergrößert es an allen Seiten um einen gewissen Puffer und berechnet dann für die Form „circle“ den kleinsten Kreis, der es enthält. Die weiteren Optionen regeln, was mit dem so entstandenen Pfad passiert: Wir können ihn zeichnen (draw) oder füllen (fill) oder auf viele weitere Arten nutzen. In unserem Beispiel haben wir fünf kreisförmige Knoten, wobei beim Knoten mit den drei Pünktchen der Pfad nicht gezeichnet wird: \node [circle, draw] at (90:13mm) {$x_1$}; \node [circle, draw] at (18:13mm) {$x_2$}; \node [circle] at (306:13mm) {$\dots$};

FOKUS 37 Unauthenticated Download Date | 8/17/17 12:57 AM

\node [circle, draw] at (234:13mm) {$x_{n-1}$}; \node [circle, draw] at (162:13mm) {$x_n$};

x1 x2

xn

\draw (A) edge[bend left = 17, ->] (B); \draw (B) edge[bend left = 17, ->] (C); ...

Alles zusammengenommen haben wir nun eine zehn Zeilen lange Spezifikation des Graphen, die nicht nur relativ selbsterklärend ist, sondern auch leicht modifizierbar. Ein weiterer Knoten oder Querkanten wären beispielsweise leicht einzubauen.

...

xn−1

dann Optionen übergeben, die das Aussehen der Kante auf vielfältige Weise modifizieren. Beispielsweise krümmt bend left die Kante etwas nach links und wir können die Stärke der Krümmung einstellen:

Schön zu erkennen ist, wie sich die Größe der Knoten automatisch den Beschriftungen anpasst. Weniger schön ist, dass so dem vorletzten Knoten ein optisches Übergewicht gegeben wird, das er in unserem Beispiel nicht verdient hat. Dies können wir durch eine weitere Option beheben: minimum size=1cm garantiert, dass alle Knoten mindestens einen Zentimeter Durchmesser haben. Nachdem wir alle Knoten spezifiziert haben, kümmern wir uns nun um die Kanten. Im vorigen Abschnitt war es noch ziemlich aufwändig, die „Bögen“ zu zeichnen, insbesondere das Finden der korrekten Randpunkte auf den Knoten war umständlich und unbefriedigend. TikZ schafft hier Abhilfe durch eine einfache Idee: Gibt man einem Knoten einen Namen, so kann man ihn später „wie eine Koordinate benutzen“, jedoch beginnen und enden Linien automatisch am Rand des Knotens statt an dessen Mittelpunkt. Zunächst müssen wir also unsere Knoten benennen, beispielsweise mit A bis E: \node [circle, draw] (A) at (90:13mm) {$x_1$}; \node [circle, draw] (B) at (18:13mm) {$x_2$}; ...

Nun können wir intuitiv Kanten zwischen den Knoten zeichnen und erhalten ein fast perfektes Ergebnis: \draw \draw \draw \draw \draw

[->] [->] [->] [->] [->]

(A) (B) (C) (D) (E)

------

(B); (C); (D); (E); (A);

x1 x2

xn

xn−1

...

Die Kanten sind, wie wir es ja auch spezifiziert haben, gerade Strecken; wohingegen wir eigentlich gerne Kreisbögen hätten. Dies erreichen wir dadurch, dass wir -- durch den generischen, konfigurierbaren, wohlbenannten Operator edge ersetzen. Diesem können wir 38

FOKUS

x1 x2

xn

xn−1

4

...

Algorithmisches Zeichnen von Graphen

Vergleicht man die Ansätze aus den beiden vorigen Abschnitten, so ist klar ein Sprung im Grad der Abstraktion erkennbar. Der rein pfadbasierte Ansatz erlaubt zwar die „totale Kontrolle“ über das Aussehen und die Positionierung jedes einzelnen grafischen Elements, die Beschreibung eines Graphen mit node- und edge-Befehlen ist jedoch sicherlich in aller Regel vorzuziehen. Kommt beispielsweise ein weiterer Knoten hinzu, so erfordert dies nur geringe Änderungen im TEX-Manuskript. Ebenso wichtig ist es oft, dass das TEX-Manuskript selbst eine gut lesbare Beschreibung der Graphstruktur darstellt und sich deshalb auch gut weitergeben lässt. Ein gewichtiges Problem bleibt jedoch bestehen: Die Koordinaten der Knoten müssen explizit angegeben werden. Bei einem Graphen mit fünf Knoten mag dies vertretbar sein, bei größeren Graphen verbringt man jedoch schnell viel Zeit damit, durch die liebevoll millimeterweise Umpositionierung von Knoten, Zeichnungen zu perfektionieren. Ein ganzes Teilgebiet der Informatik, das Algorithmische Graphzeichnen (algorithmic graph drawing), beschäftigt sich mit der Berechnung optimaler Positionierungen von Knoten eines Graphen in der Ebene – hierzu tagt seit über 20 Jahren jährlich die Graph Drawing Konferenz. Es gibt eine Vielzahl von Büchern zu dem Thema und noch mehr Software-Pakete. Allen in diesem Kontext vorgeschlagenen Algorithmen ist jedoch gemein, dass sie komplex und oft auch zeitintensiv sind. Auf jeden Fall sind sie deutlich zu komplex, als dass sie, so wie der Rest von TikZ,direkt in TEX implementiert werden könnten. Es erschien daher bei der Konzeption von TikZ aussichtslos, dass TikZ sich jemals selbst um die Positionierung von Knoten würde kümmern können. MDMV 22 / 2014 | 35–40 Unauthenticated Download Date | 8/17/17 12:57 AM

Eine „algorithmische Wende“ begann um das Jahr 2008, als sich LuaTEX zu etablieren begann, eine Fortentwicklung des weitverbreiteten pdfTEX. LuaTEX reichert TEX um einen neuen Befehl an: \directlua. Dieser nimmt ein beliebiges in der Programmiersprache Lua verfasstes Programm als Parameter und führt es aus – und in Lua ist die Implementation komplexer Algorithmen gut möglich. Nach mehreren Jahren Entwicklung ist Anfang 2014 die Version 3.0.0 von TikZ erschienen, die als erste die Kunst des algorithmischen Graphzeichnens beherrscht. Hierfür muss zunächst eine spezielle TikZ-Bibliothek geladen werden: \usetikzlibrary{graphdrawing}

Diese (und nur diese) setzt voraus, dass LuaTEX genutzt wird, da die Algorithmen zum Graphzeichnen wie erwähnt in der Programmiersprache Lua verfasst sind. Da es sehr viele Algorithmen zum Zeichnen von Graphen gibt, muss als nächstes wiederum eine passende „GraphDrawing“ (gd) Bibliothek geladen werden. Für unsere Zwecke wird dies circular sein, welche Algorithmen enthält, die Knoten „in Kreisen“ anordnen: \usegdlibrary{circular}

Daneben gibt es bereits Bibliotheken speziell für das Zeichnen von allgemeinen Bäumen, von phylogenetischen Bäumen, von geschichteten Graphen und von ganz beliebigen Graphen mittels generischer Ansätze. Wir können nun TikZ bitten, für einen Graphen (oder auch nur für einen Teil) die Knotenpositionen selbst zu berechnen. Dazu übergeben wir dem Bild eine geeignete Option, in unserem Fall mit dem leicht wunderlichen Namen simple necklace layout. Er deutet an, dass (a) die Knoten wie auf einer Kette im Kreis angeordnet werden sollen und (b) eine simple Variante der hierfür möglichen Algorithmen genutzt werden soll. Ansonsten kann die Beschreibung des Graphen gleich bleiben, einzig die Koordinatenangaben für die Knoten entfernen wir: \begin{tikzpicture}[simple necklace layout] \node [circle, draw] (A) {$x_1$}; \node [circle, draw] (B) {$x_2$}; \node [circle] (C) {$\dots$}; \node [circle, draw] (D) {$x_{n-1}$}; \node [circle, draw] (E) {$x_n$}; \draw (A) edge[bend right=17, ->] (B); \draw (B) edge[bend right=17, ->] (C); \draw (C) edge[bend right=17, ->] (D); \draw (D) edge[bend right=17, ->] (E); \draw (E) edge[bend right=17, ->] (A); \end{tikzpicture}

x1 x2 ...

xn xn−1

Wie man sieht, positioniert der Algorithmus die Knoten gegen den Uhrzeigersinn, obwohl wir sie gerne im Uhrzeigersinn hätten. Weiterhin könnten die Abstände zwischen den Knoten größer sein. Diese und viele weitere algorithmische Parameter lassen sich durch geeignete Optionen beeinflussen. Die Einführung des algorithmischen Graphzeichnens in TikZ wurde auch genutzt, um die bestehende Syntax für Knoten und Kanten einer kritischen Betrachtung zu unterziehen. Zwar eignen sich nodes und edges gut dafür, Graphen zu spezifizieren, sie werden aber syntaktisch mit normalen Pfadbeschreibungen gemischt. Diese Mischung erzwingt eine Reihe syntaktischer Kompromisse, die andere Formate nicht machen müssen. So zeigt das DOTFormat schön auf, wie man Graphen auch kompakter beschreiben kann: Ein Kreis aus fünf Knoten mit Beschriftungen A bis E lässt sich in diesem Format beschreiben als A -> B -> C -> D -> E -> A; man vergleiche dies mit den zehn Zeilen weiter oben. Parallel zur Einführung des algorithmischen Graphzeichnens hat deshalb auch eine neue Syntax zur Beschreibung von Graphen bei TikZ Einzug gehalten, die die Vorteile des DOT-Formats aufgreift und an TikZ anpasst. Um diese neue Syntax zu nutzen, muss zunächst wieder eine Bibliothek geladen werden: \usetikzlibrary{graphs}

Sie stellt den \graph-Befehl zur Verfügung. Er nimmt als Parameter eine Beschreibung eines Graphen in einer Variante der DOT-Notation und erzeugt daraus ganz normale nodes und edges. Die Beschreibung des Graphen besteht aus Folgen von Knoten, deren Beschriftungen einfach direkt angegeben werden, getrennt durch spezielle Kantensymbole wie -> oder -- oder auch "$x_2$" -> "$\dots$" -> "$x_{n-1}$" -> "$x_n$" -> "$x_1$" };

Diese knappe Beschreibung können wir elegant in eine Kurzvariante der {tikzpicture}-Umgebung einbauen: Dem \tikz-Befehl darf ein einzelner Grafikbefehl folgen, für den dann ein eigenes Bild erstellt wird. Aus \tikz [simple necklace layout] \graph { "$x_1$" -> "$x_2$" -> "$\dots$" -> "$x_{n-1}$" -> "$x_n$" -> "$x_1$" };

wird die Zeichnung MDMV 22 / 2014 | 35–40

FOKUS 39 Unauthenticated Download Date | 8/17/17 12:57 AM

x1 x2 ...

xn xn−1

Mit der neuen Syntax scheint zunächst die Möglichkeit verloren gegangen zu sein, das Aussehen der Knoten zu kontrollieren. Dies ist aber immer noch möglich. Zunächst lässt sich mit den Optionen nodes und edges generell festlegen, wie Knoten und Kanten aussehen sollen. Zusätzlich kann jeder Knoten und jede Kante lokale Optionen haben, die ihnen einfach in eckigen Klammern folgen. Der komplette Code für Abbildung 1 lautet: \tikz[% Waehle den Graphzeichnen-Algorithmus: simple necklace layout, % Knoten im Uhrzeigersinn, oben beginnend: grow’ = down, % Abstand zwischen den Knoten: node sep = 5mm, % Passe Puffer um die Beschriftungen an: inner sep = 1pt, % Etwas dickere Linien: semithick, % Konfiguriere, wie Pfeile aussehen: > = {Stealth[scale=1.5, bend, round, sep]}] \graph[ nodes={minimum size=1cm, draw, circle}, edges={bend left=17, thin} ] {"$x_1$" -> "$x_2$" -> "$\dots$"[draw=none] -> "$x_{n-1}$" -> "$x_n$" -> "$x_1$" };

Auf eine subtile Fähigkeit der aktuellen Version von TikZ erlaube ich mir, an dieser Stelle noch hinzuweisen, da sie mathematisch interessant ist und meines Wissens nicht in einer anderen Software vorhanden ist: Betrachtet man die Pfeilspitzen in Abbildung 1 ganz genau, so krümmen sie sich entlang des Bogens. Verantwortlich hierfür ist die neue Option „bend“ in der Konfiguration der Pfeilspitzen. So unscheinbar sie erscheinen mag, so weitreichend sind ihre mathematischen Effekte: Für jede einzelne „gebogene“ Pfeilspitze wird zunächst ein lokales nichtlineares Koordinatensystem installiert. In diesem System läuft eine Koordinatenachse entlang des Pfades (also entlang einer Bézier-Kurve), die andere Achse verläuft jeweils orthogonal zur Tangente an diese Kurve. Wenn TikZ dann beispielsweise ein Pfeilspitzen-Dreieck in diesem krummlinigen Koordinatensystem zeichnet, so biegen sich die Seiten des Dreiecks entlang des Pfades. Vorteil dieses recht aufwändigen Vorgehens – Metafont behilft sich beispielsweise mit dem Trick, einfach das Ende des Pfades um einen bestimmten Winkel nach links und rechts zu drehen, um ein entlang des Pfades gekrümmtes Dreieck zu erhalten – ist, dass TikZ beliebige Pfeilspitzen entlang

40

FOKUS

beliebiger Pfade krümmen kann; es muss einfach bend hinzugefügt werden.

5

Ausblick

Der Umfang von TikZ macht es unmöglich, in einem einzigen Artikel all seine Möglichkeiten vorzustellen. So ist zum Beispiel das umfangreiche neue Teilsystem zum Erstellen von Plots ebenso unerwähnt geblieben, wie die Möglichkeiten zur Erstellung komplexer eigener GrafikStile und Grafik-Elemente. TikZ kann natürlich auch gut mit Farben umgehen, Pfade können eingefärbt oder mit Farbverläufen gefüllt werden, können halbtransparent sein, mit bunten Mustern gefüllt werden und vieles mehr. Selbst das Thema „algorithmisches Graphzeichnen“ konnte in diesem Artikel nur angeschnitten werden. So erlaubt die Syntax des \graph-Befehls beispielsweise auch eine leichte und elegante Beschreibung von Bäumen, die sicherlich eine der wichtigsten und am häufigsten gezeichneten Graphklassen bilden. Als ein Beispiel hier der Code für einen binären Suchbaum: \tikz [binary tree layout] \graph { r -> { c -> { a, f -> e }, s -> x[second] -> {u,z} } };

r c a

s x

f e

u

z

Um tiefer in TikZ einzusteigen, empfiehlt sich ein Blick in die einführenden Teile des Handbuchs – trotz seines Umfangs. Es liegt als PDF-Dokument jeder Installation von TEX bei und enthält mehrere Tutorials, die schrittweise und ausführlich in die wichtigsten Ideen einführen. Sollte schließlich trotz der vielen Optionen und Bibliotheken von TikZ ein Spezialproblem nicht lösbar erscheinen, so finden sich im Comprehensive TEX Archive Network (WWW.CTAN.ORG, dem Zentralarchiv für TEX) auch noch unzählige Erweiterungen für TikZ. Prof. Dr. Till Tantau, Universität zu Lübeck, Institut für Theoretische Informatik, Ratzeburger Allee 160, 23538 Lübeck [email protected] Till Tantau ist Professor für Theoretische Informatik an der Universität zu Lübeck, seine Forschungsschwerpunkte sind kleine Platzklassen und platzsparende Algorithmen auf Graphdekompositionen. Mit der Programmierung in und für TEX begann er während seines Informatikund Mathematik-Studiums; die ersten Versionen der Pakete TikZ und BEAMER erstellte er für seine Promotion über strukturelle Gemeinsamkeiten der Aufzählbarkeitsklassen von Turing-Maschinen und endlichen Automaten.

MDMV 22 / 2014 | 35–40 Unauthenticated Download Date | 8/17/17 12:57 AM