Zeichnen in LaTeX mit TikZ
Zeichnungen und Animationen direkt in LaTeX setzen
Das TeX-Paket TikZ ermöglicht es, in LaTeX zu zeichnen. Wir wollen in diesem Vortrag aufzeigen, wie simple Zeichnungen, aber auch Graphen, Bäume und Diagramme durch wenige einfache Befehle direkt aus einem LaTeX-Dokument heraus gesetzt werden können.
Warum will man das? Weil schnell professionelle Zeichnungen entstehen. Weil die Zeichnungen perfekt zum restlichen LaTeX-Dokument passen, da sie das Schriftbild des umgebenden Dokuments übernehmen. Und weil es Spaß macht.
Im Vortrag werden schrittweise an konkreten Beispielen die Konzepte von TikZ erläutert. Wir beginnen mit einfachen Strichzeichnungen und arbeiten uns von da aus zu abstrakteren Konzepten wie Graphen, Bäumen oder Funktionsplots vor. Der letzte Abschnitt des Vortrags demonstriert, wie man TikZ mit dem LaTeX-Paket Beamer kombinieren kann, um elegante Vortragsfolien zu gestalten. Durch wenige zusätzliche Befehle werden aus in TikZ gesetzten Zeichnungen hilfreiche Animationen, mit denen auch komplexe Sachverhalte gut visualisiert werden können.
Für diesen Vortrag sind nur grundlegende Vorkenntnisse mit LaTeX nötig, da TikZ eine relativ eigenständige Syntax hat.
Folien
Die Folien des Vortrags als PDF können hier heruntergeladen werden. Der Quelltext der Vorträge selber befindet sich bei Github.
Einführung
FOLIEN Was ist TikZ?
TikZ wird in LaTeX wie eine externe Grafik auch als einzelnes Zeichen gesetzt
DOWNLOAD In diesem Vortrag verwende ich die Dokumentenklasse easytikz.cls
. TikZ ist aber ein normales LaTeX-Paket, das mit jeder Dokumentenklasse verwendet werden kann. Die dafür notwendigen Angaben in der Präambel werden vor dem jeweiligen Beispiel angegeben.
Konfiguration in der Präambel
\documentclass{scrartcl}
% Zeichenkodierung und Schriftart
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% neue deutsche Rechtschreibung
\usepackage[ngerman]{babel}
% TikZ
\usepackage{tikz}
\begin{document}
Wir beginnen mit
\begin{tikzpicture}
\draw (0,0) -- (1.5,0);
\draw (0,0) -- (0,1.5);
\end{tikzpicture}
einem Winkel.
\end{document}
Pfade
Konfiguration in der Präambel
\documentclass{scrartcl}
% Zeichenkodierung und Schriftart
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% neue deutsche Rechtschreibung
\usepackage[ngerman]{babel}
% TikZ and Bibliotheken
\usepackage{tikz}
\usetikzlibrary{positioning,intersections}
Wir erweitern obiges Beispiel um zwei Striche übereinander und ein Rechteck:
\draw
(0,0) -- ++(1,0) ++(0,1) -- ++(-1,0)
(2,0) rectangle (3,1);
FOLIEN Was ist ein Pfad?
FOLIEN Unser erstes Ziel
Gitterpfade
\begin{tikzpicture}
\draw[step=0.5cm]
(0,0) grid (1.4,1.4);
\draw
(0,0) -- (1.5,0);
\draw
(0,0) -- (0,1.5);
\end{tikzpicture}
Skalierung
Durch Ergänzung von [scale=3]
am {tikzpicture}
werden die Koordinaten skaliert.
Stile
Wir ergänzen gray,very thin
als Optionen an das \draw
des Gitters.
Pfeilspitzen
Wir ergänzen [->]
als Option an die beiden \draw
.
Bogenpfade
\draw % 0 bis 90 Grad, Radius 1 cm
(1,0) arc (0:90:1cm);
\draw % 0 bis 30 Grad, Radius 3 mm
(0,0) -- (3mm,0pt) arc (0:30:3mm);
Farbig Zeichnen
Wir ergänzen die Option [green!50!black]
an das letzte \draw
.
Farbig Füllen
Wir ersetzen \draw[green!50!black]
durch \fill[green!20]
.
Farbig Zeichnen und Füllen
Wir setzen \fill[green!20]
durch \filldraw[fill=green!20,draw=green!50!black]
.
Polarkoordinaten und Schnittpunkte
Wir ergänzen
\draw[very thick,red]
(30:1cm) -- (30:1cm |- 0,0);
\draw[very thick,blue]
(0,0) -- (30:1cm |- 0,0);
(30:1cm)
ist dabei die Polarkoordinate, die den Punkt bezeichnet, der sich im Abstand von einem Zentimeter vom Ursprung in einem Winkel von 30 Grad befindet. Das ist der obere Punkt der roten Linie. Der untere Punkt der roten Linie ist gleichzeitig der rechte Punkt der blauen Linie und ergibt sich aus dem Schnittpunkt der X-Koordinate von (30:1cm)
und der Y-Koordinate von (0,0)
.
Schnittpunkte von Pfaden definieren
Wir ergänzen
\draw[name path=upward line]
(1,0) -- (1,1);
\draw[name path=sloped line]
(0,0) -- (30:1.5cm);
\draw[name intersections=
{of=upward line and sloped line, by=tan}];
Unsichtbare Pfade
Wir ersetzen die letzten drei \draw
durch \path
.
Schnittpunkte von Pfaden verwenden
Wir ergänzen
\draw[very thick,orange]
(1,0) -- (tan);
\draw
(0,0) -- (tan);
Beschriftungen
Wir ergänzen an dem \draw
der roten und der blauen Linie Knoten als Beschriftung wie folgt
\draw[very thick,red]
(30:1cm) -- node[left]
{$\sin \alpha$} (30:1cm |- 0,0);
\draw[very thick,blue]
(0,0) -- node[below]
{$\cos \alpha$} (30:1cm |- 0,0);
Weiter ergänzen wir nach dem Füllen des Winkels dessen Beschriftung wie folgt
\draw (15:2mm) node[green!50!black] {$\alpha$};
Beschriftungen der Achsen
Wir ergänzen an dem \draw
der Achsen Knoten als Beschriftung wie folgt
\draw[->] (0,0) -- (1.5,0) node[right] {$x$};
\draw[->] (0,0) -- (0,1.5) node[above] {$y$};
Außerdem ergänzen wir zwei Ticks
\draw (1,1pt) -- (1,-1pt) node[below] {$1$};
\draw (1pt,1) -- (-1pt,1) node[left] {$1$};
Erstes Ziel erreicht!
Graphen
Knoten
Konfiguration in der Präambel
\documentclass{scrartcl}
% Zeichenkodierung und Schriftart
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% neue deutsche Rechtschreibung
\usepackage[ngerman]{babel}
% Mathe
\usepackage{amsmath}
% TikZ und Bibliotheken
\usepackage{tikz}
\usetikzlibrary{positioning,shapes.geometric}
FOLIEN Wofür Knoten?
FOLIEN Ziel Knoten
Knoten sind Pfadelemente
\begin{tikzpicture}[thick]
\path
(0,4) node {Eingabe $a,b$}
(0,3) node {$r=a \mod b$}
(0,2) node {$a=b,\ b=r$}
(0,1) node {$b=0?$}
(0,0) node {Ausgabe $a$};
\end{tikzpicture}
Knoten haben einen eigenen Befehl
\node at (0,4) {Eingabe $a,b$};
\node at (0,3) {$r=a \mod b$};
\node at (0,2) {$a=b,\ b=r$};
\node at (0,1) {$b=0?$};
\node at (0,0) {Ausgabe $a$};
Knoten haben Stile: Ein- und Ausgabe
\tikzset{
io/.style={
trapezium,
trapezium left angle=70,
trapezium right angle=110,
fill=magenta!10,
draw=magenta
}
}
Wir ergänzen den Stil [io]
an {Eingabe $a,b$}
und {Ausgabe $a$}
.
Knoten haben Stile: Operationen
\tikzset{
op/.style={
rectangle,
fill=orange!10,
draw=orange
}
}
Wir ergänzen den Stil [op]
an {$r=a \mod b$}
und {$a=b,\ b=r$}
.
Knoten haben Stile: Entscheidungen
\tikzset{
cn/.style={
diamond,
aspect=2,
inner sep=2pt,
fill=red!10,
draw=red
}
}
Wir ergänzen den Stil [cn]
an {$b=0?$}
.
Knoten haben Namen
Wir vergeben Namen für die Knoten wie folgt
\node[io] at (0,4)
(in) {Eingabe $a,b$};
\node[op] at (0,3)
(div) {$r=a \mod b$};
\node[op] at (0,2)
(set) {$a=b,\ b=r$};
\node[cn] at (0,1)
(cond) {$b=0?$};
\node[io] at (0,0)
(out) {Ausgabe $a$};
Knoten relativ positionieren
Wir ersetzen die absoluten Positionen durch relative Positionierungen wie folgt
\node[io]
(in) {Eingabe $a,b$};
\node[op, below=of in]
(div) {$r=a \mod b$};
\node[op, below=of div]
(set) {$a=b,\ b=r$};
\node[cn, below=of set]
(cond) {$b=0?$};
\node[io, below=of cond]
(out) {Ausgabe $a$};
Wir ergänzen im \tikzset
die Option node distance=5mm
.
Kanten
Wir ergänzen
\path[->]
(in) edge (div)
(div) edge (set)
(set) edge (cond)
(cond) edge (out);
Ein Pfad um die Ecke
Wir ergänzen
\draw[->]
(cond) -- ++(1.5,0)
|- (div);
Beschriftete Kanten
Wir ergänzen Knoten als Beschriftung wie folgt
\path[->]
(in) edge (div)
(div) edge (set)
(set) edge (cond)
(cond) edge node[right] {Ja} (out);
\draw[->] (cond) -- node[below] {Nein} ++(1.5,0) |- (div);
Ziel Knoten erreicht!
Automaten
Konfiguration in der Präambel
\documentclass{scrartcl}
% Zeichenkodierung und Schriftart
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% neue deutsche Rechtschreibung
\usepackage[ngerman]{babel}
% TikZ und Bibliotheken
\usepackage{tikz}
\usetikzlibrary{positioning,automata}
FOLIEN Ziel Automaten
\begin{tikzpicture}[auto, thick]
\node[initial,state] (q0) {$q_0$};
\end{tikzpicture}
Wir ergänzen einen weiteren Zustand
\node[state, right=of q0] (q1) {$q_1$};
\path
(q0) edge[->] node {0} (q1)
(q1) edge[->, loop above] node {0} ()
Und noch einen finalen Zustand
\node[state, accepting, right=of q1] (q2) {$q_2$};
\path
(q1) edge[->, bend left] node {1} (q2)
(q2) edge[->, bend left] node {0} (q1);
Bäume
Konfiguration in der Präambel
\documentclass{scrartcl}
% Zeichenkodierung und Schriftart
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% neue deutsche Rechtschreibung
\usepackage[ngerman]{babel}
% TikZ
\usepackage{tikz}
% Stildefinition um automatisch die Abstände zwischen
% Knoten auf verschiedenen Ebenen schön zu setzen
\tikzset{
level/.style={
sibling distance=20mm/#1
},
level distance=10mm,
}
FOLIEN Ziel Bäume
\begin{tikzpicture}
\node {a}
child { node {b} }
child { node {c} };
\end{tikzpicture}
Wir ergänzen eine weitere Ebene
\node {a}
child { node {b}
child { node {d} }
child { node {e} }
}
child { node {c}
child { node {f} }
child { node {g} }
};
Wir ergänzen noch Stile, damit die Knoten schöner werden.
\tikzset{
every node/.style={
draw,
circle,
inner sep=0pt,
minimum width=15pt
},
thick
}
Funktionsplots
Konfiguration in der Präambel
\documentclass{scrartcl}
% Zeichenkodierung und Schriftart
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% neue deutsche Rechtschreibung
\usepackage[ngerman]{babel}
% TikZ
\usepackage{tikz}
FOLIEN Ziel Funktionsplots
\begin{tikzpicture}[domain=0:5]
\draw[red] plot (\x,\x/3) node[right] {$f(x) = \frac{x}{3}$};
\draw[blue] plot (\x,{sin(\x r)}) node[right] {$f(x) = \sin x$};
\draw[orange] plot (\x,{exp(\x)/50}) node[right] {$f(x) = \frac{e^x}{50}$};
\end{tikzpicture}
Wir ergänzen Achsen und ein Grid
\draw[very thin,gray] (0,-1.4) grid (4.9,3.4);
\draw[->] (0,0) -- (5.2,0) node[right] {$x$};
\draw[->] (0,-1.5) -- (0,3.5) node[above] {$f(x)$};
Wir ergänzen Ticks mit zwei For-Schleifen
\foreach \x in {1,...,4}
\draw (\x,2pt) -- (\x,-2pt) node[below,fill=white] {$\x$};
\foreach \y in {-1,...,3}
\draw (2pt,\y) -- (-2pt,\y) node[left] {$\y$};
Beamer
FOLIEN Was ist BEAMER? Workflow und Folien.
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[ngerman]{babel}
\begin{document}
\begin{frame}{Funktionen von Beamer}
Kompilieren wie jedes andere
\LaTeX-Dokument auch.
\end{frame}
\end{document}
Eine Formel
\begin{frame}{Eine Formel}
\[ a^2 + b^2 = c^2 \]
\end{frame}
Eine Aufzählung
\begin{frame}{Fazit}
\begin{enumerate}
\item Wir
\item sind
\item am
\item Ende.
\end{enumerate}
\end{frame}
Titelfolie
In der Präambel
\title{Meine erste Präsentation}
\author{Malte Schmitz}
Am Anfang des Dokuments
\begin{frame}
\maketitle
\end{frame}
Gliederung
Wir ergänzen die Abschnitte
\section{Einführung}
% ...
\section{Hauptteil}
\subsection{Formel}
\subsection{Sandhaufensatz}
\subsection{Programmablaufplan}
% ...
\section{Schluss}
% ...
Nach der Titelfolie ergänzen wir
\begin{frame}{Gliederung}
\tableofcontents
\end{frame}
Themes
REGIE Theme-Matrix zeigen!
Wir ergänzen in der Präambel
\usetheme{Luebeck}
\usecolortheme{crane}
Overlays
REGIE Folie Sandhaufensatz ohne Overlays aus beamer-final.tex
kopieren.
\begin{frame}{Sandhaufensatz}
\begin{Satz}[Sandhaufensatz]
Es gibt keine Sandhaufen.
\end{Satz}
\begin{Beweis}<2->
\begin{enumerate}
\item<3-> Ein Sandkorn ist kein Sandhaufen.
\item<4-> Sandkörner werden durch Hinzufügen eines Sandkorns nicht zum Sandhaufen.
\item Induktiv folgt die Aussage. \qedhere
\end{enumerate}
\end{Beweis}
\onslide<5->
Der Induktionsbeweis ist \alert<6>{falsch}!
\end{frame}
Overlays mit TikZ
Wir ergänzen in der Präambel
\usepackage{tikz}
\usetikzlibrary{positioning,shapes.geometric}
und in das Dokument kopieren wir aus dem fertigen Knoten-Beispiel
\begin{frame}{Animation}
\tikzset{
io/.style={
trapezium,
trapezium left angle=70,
trapezium right angle=110,
fill=magenta!10,
draw=magenta
},
op/.style={
rectangle,
fill=orange!10,
draw=orange
},
cn/.style={
diamond,
aspect=2,
inner sep=2pt,
fill=red!10,
draw=red
},
node distance=5mm
}
\centering
\begin{tikzpicture}[thick]
\node[io] (in) {Eingabe $a,b$};
\node[op, below=of in] (div) {$r=a \mod b$};
\node[op, below=of div] (set) {$a=b,\ b=r$};
\node[cn, below=of set] (cond) {$b=0?$};
\node[io, below=of cond] (out) {Ausgabe $a$};
%
\path[->]
(in) edge (div)
(div) edge (set)
(set) edge (cond)
(cond) edge node[right] {Ja} (out);
\draw[->] (cond) -- node[below] {Nein} ++(1.5,0) |- (div);
\end{tikzpicture}
\end{tikzpicture}
Wir bauen die eigentlich TikZ-Grafik wie folgt um
\node[io] (in) {Eingabe $a,b$};
\pause
\node[op, below=of in] (div) {$r=a \mod b$};
\path[->] (in) edge (div);
\pause
\node[op, below=of div] (set) {$a=b,\ b=r$};
\path[->] (div) edge (set);
\pause
\node[cn, below=of set] (cond) {$b=0?$};
\path[->] (set) edge (cond);
\draw[->] (cond) -- node[below] {Nein} ++(1.5,0) |- (div);
\pause
\node[io, below=of cond] (out) {Ausgabe $a$};
\path[->] (cond) edge node[right] {Ja} (out);
\onslide<1->
Artikelfassung
FOLIEN Artikelfassung
FOLIEN Zusammenfassung
Zum Weiterlesen
Till Tantau.
The TikZ and pgf Packages,
Manual for version 2.10,
pgfmanual.pdf
, Oktober 2010.
Kjell Magne Fauske und Stefan Kottwitz.
TeXample.net,
ample resources for TeX users,
texample.net
.
Till Tantau, Joseph Wright und Vedran Miletić.
The beamer class,
beameruserguide.pdf
, Oktober 2013.
Till Tantau.
Beamer: Strahlende Vorträge mit LaTeX,
Präsentieren und Dokumentieren – Tools.
Vorlesung vom 31. Oktober 2012.
Sebastian Pipping.
The beamer Theme Matrix,
hartwork.org/beamer-theme-matrix
, April 2009.