Grundlagen von TikZ

TikZ ist die Zeichensprache, die in LaTeX selbst wohnt, und ihr Name ist bereits eine Warnung. Es handelt sich um ein rekursives Akronym für TikZ ist kein Zeichenprogramm — von Anfang an also der Hinweis, dass hier nichts mit der Maus verschoben wird. Stattdessen steht \draw (0,0) -- (2,1); in derselben Datei wie der Fließtext, und die Abbildung wird mit denselben Schriften und in derselben Qualität gesetzt wie der Absatz daneben. Das ist der Handel: weniger Bequemlichkeit, dafür Präzision und Reproduzierbarkeit. Diese Seite folgt ihm von der ersten Form über Koordinaten und Nodes bis zu der Frage, warum der Satz langsam wird und was dagegen hilft.

Warum TikZ darauf besteht, „kein Zeichenprogramm“ zu sein — TikZ und PGF

Der Name ist ein Scherz in der GNU-Tradition, und das Handbuch sagt es selbst: TikZ ist ein rekursives Akronym in der Linie von „gnu’s Not Unix“, das die Lesenden vorwarnen soll. Im Tausch gegen die Maus gibt es den TeX-Zugang, angewandt auf Bilder — exakte Platzierung, Wiederverwendung über Makros, eine Beschriftung, die zum umgebenden Text passt. Abgegeben wird dafür WYSIWYG. Auch den Rest der Rechnung nennt das Handbuch offen und führt schon auf den ersten Seiten die steile Lernkurve und den Neusatz nach jeder kleinen Änderung auf.

Darunter zeichnet in Wirklichkeit PGF die Linien. Der Name steht für „portable graphics format“ und hat einen klaren Ursprung: Der Autor wollte Grafikmakros schreiben, die gleichermaßen mit pdfLaTeX und mit dem klassischen, PostScript-basierten LaTeX funktionieren. Dafür braucht es eine Schicht, welche die Unterschiede der Ausgabewege auffängt — daher portable. Da rohes PGF mühsam zu schreiben ist, liegt TikZ darüber als eine Syntax, die sich lesen und tippen lässt. Gesprochen wird von „PGF/TikZ“ als einem Wort, getippt wird jedoch fast nur die TikZ-Seite, und \usepackage{tikz} lädt PGF gleich mit.

Beides stammt von Till Tantau. Nach eigener Auskunft begann er im Grundstudium mit TeX herumzuspielen, woraus die Präsentationsklasse beamer entstand; später schrieb er TikZ für die Abbildungen seiner Dissertation. Der Standardweg zu LaTeX-Folien und der Standardweg zum Zeichnen in LaTeX, zwei scheinbar unverbundene Dinge, kommen also von derselben Person. Wie weit das Projekt seither gewachsen ist, zeigt eine Zahl: Das Handbuch zur Version 3.1.10, pgfmanual.pdf, umfasst 1321 Seiten. Sein Titelbild ist selbst eine TikZ-Zeichnung — fraktale Bäume und Koch-Schneeflocken über einer Dämmerungslandschaft — und daneben ist der Quelltext abgedruckt, der sie erzeugt.

Zu konfigurieren gibt es fast nichts. Eine Zeile, \usepackage{tikz}, im Vorspann genügt für pdfLaTeX, LuaLaTeX und XeLaTeX. Nur der Weg über DVI braucht zusätzliche Sorgfalt: Bei pLaTeX oder upLaTeX kommt der Treiber — meist dvipdfmx — als Klassenoption hinzu. Ein minimales, übersetzbares Dokument sieht so aus.

document.tex
\documentclass{article}   % with pLaTeX: \documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}
\begin{document}
A line and a circle:
\begin{tikzpicture}
  \draw (0,0) -- (2,1);
  \draw (2.8,0.5) circle [radius=0.5cm];
\end{tikzpicture}
\end{document}

Die erste Form zeichnen: die Umgebung tikzpicture und das Semikolon

Jede Abbildung entsteht innerhalb von \begin{tikzpicture}\end{tikzpicture}, und jeder Zeichenbefehl endet mit einem Semikolon ;. Die Umgebung ist das Blatt, auf dem ein Bild entsteht; Optionen in den eckigen Klammern nach dem Umgebungsnamen gelten für das ganze Blatt — [scale=2] verdoppelt es, [thick] verstärkt sämtliche Linien. Für ein Bild, das in eine Zeile passt, muss die Umgebung gar nicht geöffnet werden: Es gibt die Inline-Formen \tikz{...} und, für einen einzelnen Befehl, \tikz \draw ...;.

latex
% inline: one command, no environment
\tikz \draw (0,0) -- (1.5,0);

% environment: one canvas, several commands, shared options
\begin{tikzpicture}[scale=1.2, thick]
  \draw (-1.5,0) -- (1.5,0);
  \draw (0,-1.5) -- (0,1.5);
\end{tikzpicture}

Fehlt ein Semikolon, erscheint ! Package tikz Error: Giving up on this path. Did you forget a semicolon?. Unangenehm ist dabei, dass die gemeldete Zeilennummer nicht die fehlerhafte Zeile bezeichnet, sondern die darauffolgende. TikZ liest weiter, solange die Token noch zum Pfad gehören könnten, und gibt erst auf, wenn etwas kommt, das unmöglich dazugehört — meist der nächste \draw. Zeigt der Fehler also auf ein \draw, gehört der Blick ans Ende der Zeile darüber.

Koordinaten und Pfade: \draw, \fill, -- und circle

Das Zeichnen in TikZ dreht sich um den Pfad — eine Route, die angibt, wie es von Punkt zu Punkt geht — und der Befehlsname entscheidet, wie diese Route erscheint. \draw zeichnet sie als Linie, \fill füllt das Innere einer geschlossenen Route, \filldraw füllt und zieht danach den Umriss, und \path definiert die Route, ohne irgendetwas zu zeichnen. Das Letzte klingt nutzlos, ist aber der Weg, still Koordinaten und Nodes für späteren Bezug abzulegen. Dieselbe Punktfolge, nur ein anderer Befehlsname, und aus einem Umriss wird eine Fläche: Diese Orthogonalität ist das Rückgrat des Entwurfs.

Ein Punkt lässt sich auf drei Arten schreiben. Kartesisch (x,y) rechnet standardmäßig in Zentimetern, (1,2) bedeutet also 1 cm nach rechts und 2 cm nach oben; Einheiten dürfen explizit stehen, etwa (1cm,2pt). Polar (30:1cm) liest sich als „1 cm in Richtung 30°“. Und eine benannte Koordinate, einmal mit \coordinate (P) at (1,1); gesetzt, heißt danach nur noch (P). Der Unterschied zwischen relativem + und ++ sollte klar sein, bevor er zuschlägt: ++(1,0) geht 1 cm nach rechts und nimmt den aktuellen Punkt mit, +(1,0) erreicht dieselbe Stelle, lässt den aktuellen Punkt aber stehen. Mehrere ++ hintereinander ergeben einen Streckenzug, mehrere + dagegen Strahlen von einem einzigen Bezugspunkt aus.

Wie die Route verläuft, entscheiden die Pfadoperationen. -- ist eine Gerade vom vorigen zum nächsten Punkt; rectangle nimmt zwei gegenüberliegende Ecken, circle einen Mittelpunkt, dazu kommen ellipse, arc und grid. Kurven entstehen mit .. controls .. (Bézier) oder to[bend left], und geschlossen wird eine Form durch ein abschließendes -- cycle, das zum Ausgangspunkt zurückführt. Formargumente stehen heute als Schlüssel-Wert-Paare in eckigen Klammern: circle [radius=10pt], ellipse [x radius=20pt, y radius=10pt], arc [start angle=0, end angle=30, radius=3mm], grid [step=.5cm]. Die ältere Klammerform circle (10pt) funktioniert weiterhin, doch neuer Code liest sich in eckigen Klammern besser, und ein weiterer Schlüssel kostet nichts.

latex
\begin{tikzpicture}
  \draw[step=.5cm, gray, very thin] (-1.4,-1.4) grid (1.4,1.4);
  \draw (0,0) circle [radius=1cm];
  \draw (0,0) -- (30:1cm);                       % polar: 1 cm at 30 degrees
  \fill[blue!20] (0,0) rectangle (0.5,0.5);
  \draw[red] (-1.2,-1.2) -- ++(0.6,0) -- ++(0,0.6);   % ++ carries the current point
\end{tikzpicture}

Heraus kommt ein einziges Bild: ein feines graues Gitter im Abstand von 0,5 cm; ein Kreis mit Radius 1 cm um den Ursprung; eine kurze Strecke, die den Ursprung unter 30° verlässt; ein 0,5 cm großes, hellblau gefülltes Quadrat am Ursprung; und unten links ein roter Winkel, der 0,6 cm nach rechts und dann 0,6 cm nach oben führt. Die Farbe blue!20 bedeutet „20 % Blau“, die übrigen 80 % sind Weiß — daher der helle Ton. Zwei Farben wie in red!50!black ergeben eine Mischung; die Notation gilt unverändert für Füllungen wie für Linien.

Nodes: Text und Kästen setzen und über Namen verbinden

Ein Node setzt Text oder einen Kasten an eine Koordinate; die Form lautet \node[options] (name) at (coordinate) {contents};. In die Klammern kommen Optionen: draw für einen Rahmen, circle oder rectangle für die Form, fill=blue!20 für eine Füllung und so fort. Der Kern der ganzen Konstruktion ist, dass der Name in den runden Klammern zum Griff für diesen Node wird. Danach verweist (name) auf seine Position, und ein Anker wie (name.north) oder (name.east) benennt einen einzelnen Punkt auf seinem Rand.

Daraus folgt das Muster, das ständig gebraucht wird: erst benannte Nodes setzen, dann die Namen verbinden. Wer über Node-Namen statt über rohe Koordinaten verbindet, dessen Verbindungslinie folgt von selbst, wenn ein Node später um einen Zentimeter verschoben wird. Und weil die Linie am Rand des Nodes endet, ragt sie nie in den Kreis oder Kasten hinein. Nodes können auch auf einem Pfad liegen: \draw (a) -- (b) node[midway, above] {$f$}; setzt ein Label knapp über den Mittelpunkt der Linie — die übliche Art, einen Pfeil zu benennen.

latex
\begin{tikzpicture}
  \node (a) at (0,0)   [draw, circle, fill=blue!20] {A};
  \node (b) at (2.5,0) [draw, circle, fill=blue!20] {B};
  \draw[->] (a) -- (b) node[midway, above] {$f$};
  \draw[dashed] (a.south) -- (b.south);   % .south is an anchor on the border
\end{tikzpicture}

Das Bild stellt zwei hellblaue Kreisnodes mit den Labels „A“ und „B“ im Abstand von 2,5 cm auf, zieht einen Pfeil von A nach B mit $f$ über dessen Mittelpunkt und verbindet die Unterkanten der beiden Kreise mit einer gestrichelten Linie. Eine Tretmine lauert dabei: Ein Node muss definiert sein, bevor er referenziert wird. Wer einen noch nicht gesetzten Namen nennt oder einen vorhandenen verschreibt, erhält ! Package pgf Error: No shape named ‘b’ is known. Namen vertippen sich leicht; erscheint diese Meldung, lohnt der Blick auf die Schreibweise und darauf, ob der \node wirklich weiter oben steht.

Linienoptionen und wiederverwendbare Stile mit \tikzset

Wie eine Linie aussieht, entscheiden Optionen in eckigen Klammern: die Stärken thin / thick / very thick, Farben wie red oder blue!50, dashed und dotted, rounded corners sowie die Pfeile -> (Spitze am Ende), <- (am Anfang) und <-> (an beiden Enden). Hinter den Pfeilen steckt eine pragmatische Abkürzung: TikZ hält jede sonst unbekannte Option, die ein - enthält, für eine Pfeilangabe. Ein vertippter Schlüssel hat deshalb zwei mögliche Schicksale, je nach Schreibweise. Ohne - meldet TikZ: ! Package pgfkeys Error: I do not know the key ‘/tikz/thikc’ and I am going to ignore it. Perhaps you misspelled it. Steckt dagegen ein - darin, wird der Tippfehler als Pfeilangabe gelesen und kann stillschweigend zu etwas Seltsamem führen.

OptionBedeutung
thick / very thickStärkere Linien (bis ultra thick)
red, fill=blue!50Linien- oder Füllfarbe; !n setzt die Intensität, red!50!black mischt zwei
dashed / dottedGestrichelte oder gepunktete Linien
rounded cornersEcken eines Pfads abrunden
->, <-, <->Pfeilspitze am Ende, am Anfang oder an beiden Enden
scale=2Dieses Bild oder diesen Pfad um den Faktor 2 skalieren
node distance=1cmStandardabstand bei relativer Platzierung mit positioning

Wird dieselbe Dekoration ein drittes Mal geschrieben, ist das der Hinweis, daraus einen Stil zu machen. Definiert im Vorspann mit \tikzset{name/.style={...}}, genügt danach ein einziger Name; soll sich das Aussehen ändern, ändert eine Zeile in der Definition alles auf einmal. Zählt der Stil nur innerhalb eines Bildes, gehört er stattdessen direkt in die Optionen von tikzpicture. Daneben gibt es Stile für jedes Element einer Art — every node/.style={...} — und sie sind unverzichtbar, sobald in einem Bild wie einem Flussdiagramm alle Nodes gleich aussehen sollen.

latex
\tikzset{help lines/.style={color=blue!50, very thin}}

\begin{tikzpicture}
  \draw[help lines] (0,0) grid (3,2);
  \draw[thick, red, ->, rounded corners] (0,0) -- (1,2) -- (3,2);
\end{tikzpicture}

Gezeichnet wird ein hellblaues Gitter von (0,0) bis (3,2) und darüber eine dicke rote Linie, die vom Ursprung nach (1,2) und weiter nach (3,2) knickt, mit abgerundeten Ecken und Pfeilspitze am Ende. Da das Gitter über einen Stil läuft, ändert ein Wechsel von very thin zu thin nicht nur dieses Gitter, sondern jedes, das mit help lines gezeichnet wird.

Welche \usetikzlibrary tatsächlich gebraucht wird

Der Kern von TikZ ist bewusst klein; die spezialisierten Teile stecken in Bibliotheken, die im Vorspann mit \usetikzlibrary{...} geladen werden, mehrere durch Kommas getrennt. Solange eine Bibliothek nicht geladen ist, existiert ihre bequeme Syntax schlicht nicht: right=of a ohne positioning führt geradewegs in den „I do not know the key“-Fehler aus dem vorigen Abschnitt. Im ersten Jahr verdienen sich vor allem die folgenden ihren Platz.

  • arrows.meta — eine reiche, einstellbare Sammlung von Pfeilspitzen (-{Stealth}, -{Latex}, …). Das Handbuch führt die älteren arrows und arrows.spaced als veraltet; neuer Code nimmt diese Bibliothek.
  • positioning — relative Node-Platzierung: right=of a, below=1cm of b, wobei node distance den Standardabstand festlegt.
  • calc — Koordinatenrechnung: ($(a)+(1,0)$) heißt „1 cm rechts von a“, ($(a)!0.5!(b)$) „der Mittelpunkt von a und b“.
  • shapes — Node-Formen jenseits von Kreis und Rechteck (Rauten, Sterne, Sprechblasen), unterteilt in Teile wie shapes.geometric.
  • decorations — Pfade als Welle, Zickzack, Klammer und mehr gestalten (decorations.pathmorphing und Verwandte).
  • patterns — Füllungen mit Mustern wie Schraffuren, Linien oder Punkten.
  • fit — automatisch eine Box bauen, die mehrere Nodes genau umschließt; praktisch zum Gruppieren von Bildteilen.
  • backgrounds — Rahmen oder Untergrund auf einer Ebene hinter dem Bild zeichnen, ohne mit dem Vordergrund zu kollidieren.
  • matrix — Nodes in einem Gitter, also einer Matrix, ausrichten. graphdrawing übernimmt dagegen automatisches Layout, setzt aber LuaTeX voraus.

Schon arrows.meta zusammen mit positioning reicht für ein brauchbares Flussdiagramm. Der Kniff besteht darin, nur dem ersten Node eine Koordinate zu geben und alle weiteren über Beziehungen zu setzen: „rechts von jenem“, „unter jenem“. Kommt später ein Node dazu, muss keine Koordinate neu gerechnet werden.

document.tex
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning}

\begin{tikzpicture}[node distance=1cm, every node/.style={draw, rounded corners}]
  \node (start)                  {Start};
  \node (proc)  [right=of start] {Process};
  \node (end)   [right=of proc]  {End};
  \draw[-{Stealth}] (start) -- (proc);
  \draw[-{Stealth}] (proc)  -- (end);
\end{tikzpicture}

Das Ergebnis ist ein Flussdiagramm von links nach rechts: drei abgerundete Kästen mit „Start“, „Process“ und „End“, 1 cm auseinander, der Reihe nach durch scharfe Stealth-Spitzen verbunden. every node/.style legt das Aussehen aller drei auf einmal fest, node distance=1cm den Abstand, den right=of verwendet. Beides in die Bildoptionen zu schreiben ist genau das, was eine Abbildung später leicht änderbar macht.

Warum der Satz mit TikZ langsam wird und wann external oder standalone hilft

Langsam wird es, weil TeX die Rechnerei selbst übernimmt, in Makros. Koordinaten addieren, aus einem Winkel einen Punkt machen, eine Bézierkurve unterteilen — all das läuft im Satzdurchgang und nicht in einer externen Engine. Zwischengespeichert wird dabei nichts, also wird jedes einzelne \draw bei jedem Lauf von Grund auf neu berechnet. Bei einer Handvoll Abbildungen fällt das nicht auf; häufen sich dichte grids, Plots mit vielen Punkten und Bilder mit Dutzenden von Nodes, wird das Warten spürbar. Das Handbuch räumt das früh ein und führt lange Neuübersetzungen nach kleinen Änderungen als Teil des Preises für den TeX-Zugang auf.

Das übliche Mittel ist die Bibliothek external. Nach \usetikzlibrary{external} und der Deklaration \tikzexternalize wird jedes tikzpicture einmal in ein eigenes PDF geschrieben und zwischengespeichert. Die Namen entstehen automatisch: Aus main.tex werden main-figure0, main-figure1 und so weiter. Bei späteren Läufen entfällt die Rechnung vollständig, sofern sich der Quelltext eines Bildes nicht geändert hat; dann wird nur das fertige PDF eingebunden, und eine Änderung löst den Neubau aus. Der Standardmodus mode=convert with system call lässt LaTeX sich selbst aufrufen, um die Bilder zu erzeugen, weshalb mit -shell-escape übersetzt werden muss (pdflatex -shell-escape main). Ohne diese Option entstehen keine Abbildungen — und genau dort lohnt der erste Blick.

main.tex
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize          % caches each picture as main-figure0.pdf, main-figure1.pdf, ...

% compile with:  pdflatex -shell-escape main

Der andere Weg ist die Klasse standalone. Die Abbildung wandert in eine eigene .tex und wird mit \documentclass[tikz]{standalone} allein übersetzt; die Option tikz lädt dabei das Paket tikz und erzeugt ein einseitiges PDF, auf die natürliche Größe des Bildes beschnitten (mehrere tikzpicture ergeben mehrere Seiten). Im Hauptdokument steht dann nur noch \includegraphics{figure}. Als Faustregel gilt: external, solange die Abbildung mit dem Text zusammen wächst — der Code bleibt neben der Prosa, gewonnen wird allein der Cache. standalone, sobald die Abbildung mit anderen Dokumenten oder Folien geteilt wird oder dutzendfach überarbeitet werden soll — ein kleines Dokument, das in Sekunden übersetzt, ist der schnellere Ort zum Ausprobieren.

figure.tex
% compiles on its own to a one-page PDF, cropped to the picture
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}
  \draw[-{Stealth}, thick] (0,0) -- (2,1);
\end{tikzpicture}
\end{document}

% then in the main document:  \includegraphics{figure}