Hopfen

tutorials :: foreach-Schleife

Inhalt

Die foreach-Schleife kann einem eine Menge Arbeit ersparen. Sie wird im pgf-manual in Kapitel 34 behandelt.

Die Syntax

Die Syntax der foreach Schleife ist eigentlich intuitiv. Eingeleitet wird sie mit dem Befehl \foreach. Auf diesen folgen (ein oder mehrere) Variablennamen, z.B. \x. Nun muss der Variablen gesagt werden, welche Werte sie bei jedem Schleifendurchlauf annehmen soll. Das geschieht mit einer Liste die in geschweiften Klammern angegeben wird. Ein einfaches Beispiel macht die Sache klarer:

\foreach \x in {1,2,3,4,5} {\x,}  
    
Diese Zeile liefert (außerhalb einer tikzpicture Umgebung) die Zahlenfolge 1,2,3,4,5,. Die Schleife wird also so oft durchlaufen, wie Werte in der Liste sind. Die Erweiterung auf zwei und mehr Variablen erfolgt durch einen Slash (/). Auch dazu ein kleines Beispiel:
\foreach \x/\y in {1/a,2/b,3/c,4/d,5/e} {\x \y,}
    
Dieses Beispiel liefert die Folge 1a,2b,3c,4d,5e,. Wie man sieht werden die Werte für die neue Variable \y in der Liste einfach durch einen Slash an die vorhandenen \x Werte geheftet. Die Erweiterung auf mehr als zwei Variablen erfolgt analog.

Die Liste lässt sich bei bestimmten Zahlenfolgen durch die Punkt-Notation ... abkürzen. Im ersten oberen Beispiel können wir {1,2,3,4,5} einfach durch {1,...,5} ersetzen. Das funktioniert z.B. auch mit geraden Zahlen. So liefert die folgende Zeile die Folge 2,4,6,8,10,

\foreach \x in {2,4,...,10} {\x ,}
    
Mehr zur Punkt-Notation findet man auch im pgf manual.

Beispiele mit einer Variablen

Kommen wir nun zu Beispielen. Mit einer Variablen lässt sich schon viel anfangen. Wir können z.B. einen beschrifteten Zahlenstrahl von -5 bis 5 malen. Den Strahl selbst erhalten wir mit Hilfe des draw Befehls, wobei wir mit der Option [->] einen Pfeil am rechten Ende des Strahles erzeugen. Damit das ganze etwas besser ausschaut, wird der Strahl an beiden Enden 0.5 cm weiter gezeichnet. Die Beschriftung übernimmt eine foreach Schleife. Dazu brauchen wir nur eine Variable \x, die sich gleich um Zweierlei kümmert: die Position der Beschriftung und die Beschriftung selbst. Die Liste enthält die ganzen Zahlen von -5 bis 5, kann also mit der Punkt-Notation geschrieben werden als {-5,...,5}. In der Schleife wird dann ein kleiner Strich an die Position \x gesetzt und unter (below) diesen Strich die entsprechende Zahl. Der folgende Quelltext liefert dann den fertigen Zahlenstrahl.

\begin{tikzpicture}
  
  \draw[->] (-5.5,0) -- (5.5,0) node [below] {$\mathbb{R}$};

  \foreach \x in {-5,...,5}
    \draw (\x,0.1) -- (\x,-0.1) node [below] {\x};

\end{tikzpicture}
    

back to top

Es ist zu beachten, dass innerhalb einer tikzpicture Umgebung am Ende der Schleife ein Semikolon steht.

Das nächste Beispiel soll zeigen, dass wir mit einer Schleife auch automatisiert Farben verändern können. Dazu wollen wir fünf Bälle zeichnen. Mit der Variable \x und der Liste {1,...,5} sowie dem \draw Befehl erhalten wir schon mal fünf Kreise nebeneinander.

\begin{tikzpicture}
  
  \foreach \x in {1,...,5}
    \draw (\x,0) circle (3mm);

\end{tikzpicture}
    
Die Kreise haben alle einen Durchmesser von 3 mm. Wenn man lustig ist, kann man die 3 auch durch \x ersetzen. Dann erhält man jeweils einen Kreis mit Durchmesser 1 mm, 2 mm usw. Die Farbe ändern wir nun, indem wir das Mischverhältnis zu Schwarz (es geht auch jede andere Farbe) ändern. Als Ausgangsfarbe definieren wir ein Blau. Die Variable \x bestimmt nun den prozentualen Anteil von Schwarz und Blau. Damit die entstehenden Bälle keine Ränder aufweisen, ersetzen wir den \draw Befehl durch \shade. Das ist das Ergebnis:
\definecolor{myblue}{HTML}{92dcec}
\begin{tikzpicture}
  
  \foreach \x in {1,...,5}
    \shade[ball color=black!\x 0!myblue] (\x,0) circle (3mm);

\end{tikzpicture}
    

back to top

Hier ist ein weiteres Beispiel:

\definecolor{myblue}{HTML}{92dcec}
\begin{tikzpicture}
  
  \foreach \x in {9,...,1}
    \draw[fill=myblue!\x0] (-0.\x cm - 1cm,-0.\x cm) rectangle 
                                               (0.\x cm + 1cm,0.\x cm);

\end{tikzpicture}
    

back to top

Beispiele mit mehreren Variablen

Deutlich mehr Kreativität können wir mit mehreren Variablen beweisen. Z.B. kann man im vorletzten Beispiel nicht nur das Mischverhältnis zwischen zwei Farben verändern, sondern den ganzen Farbton. Das geschieht mit der zusätzlichen Variable \color. Als Farbtöne wählen wir Grün, Rot, Blau, Gelb und Orange. Die praktische Umsetzung sieht dann wie folgt aus:

\begin{tikzpicture}
  
  \foreach \x/\color in {1/green,
                         2/red,
                         3/blue,
                         4/yellow,
                         5/orange}
    \shade[ball color=\color] (\x,0) circle (3mm);

\end{tikzpicture}
    

back to top

Wie man sieht können in der Liste nicht nur numerische Werte vorkommen, sondern auch Buchstaben oder ganze Wörter.

Kommen wir nun zu einem Beispiel mit vier Variablen. Wir wollen ein paar Blasen erzeugen, d.h. verschieden große farbige Kreise wild verstreut innerhalb eines bestimmten Gebietes. Stellen wir uns das Gebiet als zwei dimensionales Koordinatensystem vor, so brauchen wir die xy-Koordinaten \x und \y. Die verschiedenen Größen der Blasen werden durch ihren Radius \r bestimmt. Wir einigen uns auf drei verschiedene Radien: 1 mm, 2 mm und 3 mm. Jetzt muss man sich nur noch auf die Größe des Gebietes einigen und sich entsprechende Koordinaten einfallen zu lassen. Da ich zu faul bin mir die verschiedenen Koordinaten einfallen zu lassen, habe ich in R eine kleine Funktion geschrieben, die das für mich macht. Man findet sie hier (Zum Zeitpunkt der Fertigstellung dieses tutorials hatte ich noch keine Ahnung von der mathematical engine im pgfpackage. Vielleicht ersetze ich irgendwann einmal die R-Funktion mit dem passenden Quellcode.) Der Funktion übergibt man die Enden der x- und y-Achsen, also die Größe des Gebietes in der die Blasen erscheinen sollen, sowie die gewünschte Anzahl an Blasen. Die Funktion erzeugt dann pseudo-zufällige xy-Koordinaten, die Radien und einen Wert für die Farbe, also die komplette Liste. Man braucht diese nur noch in sein TeX-Dokument zu kopieren und es kann los gehen. Bei mir kam z.B. folgendes Bild mit 50 Blasen zustande:

\definecolor{myblue}{HTML}{92dcec}
\begin{tikzpicture}
  
  \foreach \x/\y/\r/\color in {3.7 cm/ 1.3 cm/ 2 mm/ 80 ,
    3 cm/ 1.5 cm/ 1 mm/ 80 , 1.7 cm/ 0.4 cm/ 2 mm/ 30 ,
    0.3 cm/ 0.2 cm/ 2 mm/ 70 , 0.5 cm/ 0.4 cm/ 1 mm/ 80 ,
    2.4 cm/ 1.5 cm/ 1 mm/ 50 , 1.9 cm/ 1.4 cm/ 2 mm/ 10 ,
    4.7 cm/ 1.3 cm/ 2 mm/ 100 , 1.3 cm/ 0.8 cm/ 2 mm/ 100 ,
    2.8 cm/ 1.4 cm/ 1 mm/ 100 , 4.3 cm/ 0.2 cm/ 2 mm/ 100 ,
    0 cm/ 0.5 cm/ 2 mm/ 50 , 4.8 cm/ 0.7 cm/ 2 mm/ 60 ,
    2.7 cm/ 0 cm/ 1 mm/ 100 , 5 cm/ 0.9 cm/ 2 mm/ 50 ,
    1.3 cm/ 0.6 cm/ 3 mm/ 70 , 1 cm/ 1.2 cm/ 3 mm/ 70 ,
    0 cm/ 0.3 cm/ 2 mm/ 30 , 2.9 cm/ 0.2 cm/ 2 mm/ 100 ,
    5.5 cm/ 0.5 cm/ 2 mm/ 100 , 1.9 cm/ 0.2 cm/ 1 mm/ 100 ,
    2.3 cm/ 0.2 cm/ 1 mm/ 50 , 1.5 cm/ 1.3 cm/ 1 mm/ 50 ,
    3.5 cm/ 1.1 cm/ 2 mm/ 40 , 3.3 cm/ 0.1 cm/ 3 mm/ 100 ,
    4.7 cm/ 0.8 cm/ 2 mm/ 90 , 0.8 cm/ 0.3 cm/ 1 mm/ 100 , 
    0.7 cm/ 0.7 cm/ 2 mm/ 40 , 5.4 cm/ 0.8 cm/ 2 mm/ 70 ,
    0.8 cm/ 1.4 cm/ 3 mm/ 100 , 1.1 cm/ 1.1 cm/ 1 mm/ 40 ,
    2.5 cm/ 0.9 cm/ 2 mm/ 40 , 4.4 cm/ 1.4 cm/ 2 mm/ 60 , 
    1.3 cm/ 0.7 cm/ 1 mm/ 50 , 0.1 cm/ 0.2 cm/ 3 mm/ 90 ,
    4.1 cm/ 0.1 cm/ 2 mm/ 60 , 0.3 cm/ 1.4 cm/ 1 mm/ 60 ,
    1.5 cm/ 0.9 cm/ 2 mm/ 60 , 3.2 cm/ 1.4 cm/ 2 mm/ 80 ,
    4.8 cm/ 0.3 cm/ 2 mm/ 100 , 4.7 cm/ 0.9 cm/ 2 mm/ 50 ,
    4.7 cm/ 0.2 cm/ 2 mm/ 30 , 2.2 cm/ 0.3 cm/ 2 mm/ 70 ,
    3.6 cm/ 1.4 cm/ 1 mm/ 80 , 5.7 cm/ 0.5 cm/ 2 mm/ 50 ,
    4.3 cm/ 0.4 cm/ 3 mm/ 40 , 4 cm/ 0.6 cm/ 2 mm/ 10 ,
    5.5 cm/ 1 cm/ 1 mm/ 60 , 3.1 cm/ 0.3 cm/ 2 mm/ 10 ,
    4.6 cm/ 0.3 cm/ 2 mm/ 40
  }
    \shade[ball color = myblue!\color] (\x, \y) circle (\r);
\end{tikzpicture}
    

back to top

Diese Beispiele dürften für das Verständnis der foreach Schleife ausreichen. Weitere findet man im pgf manual und in den tutorials.


Kontakt: Statistische Beratung