mlte.de

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.

Image

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.