Die chains
library, die auch die positioning
library lädt, hält dafür eine interessante Lösung parat, die in vereinfachter Version als Beispiel auch im PGF/TikZ-Manual angegeben ist.
Der start chain
-Key unterscheidet nämlich theoretisch vier mögliche Optionskombination.
Anstatt going
kann man auch placed
verwenden, das auch den ersten Node auf dem Chain beeinflust. Zusätzlicher wird in dem folgenden Text geprüft, ob ein Gleichheitszeichen =
vorhanden ist. Ist dies der Fall, wird dieser Text wie er ist als Option für den Node verwendet, der on chain
gesetzt wird. Hier haben wir Zugriff auch \tikzchaincount
sowie den Node-Namen \tikzchainprevious
.
Das einfache Beispiel aus dem Manual sie hier angegeben mit:
\begin{tikzpicture}[start chain=circle placed {at=(\tikzchaincount*30:1.5)}]
\foreach \i in {1,...,10}
\node [on chain] {\i};
\draw (circle-1) -- (circle-10);
\end{tikzpicture}
Dieses Beispiel ergibt schon ein Ergebnis, das dem Geforderten ähnelt:

Führt man dies weiter, könnte man sich eine Option wie nodes around center
vorstellen, die folgendermaßen definiert ist:
\tikzset{
nodes around center/.style args={#1:#2:#3:#4}{%
% #1 = Startwinkel
% #2 = Anzahl Knoten
% #3 = Zentrums-Node
% #4 = Abstand
at={([shift={(#3)}] {{(\tikzchaincount-1)*360/(#2)+#1}}:{#4})}
}
}
Ein Chain, der mit start chain=circle placed {nodes around center=45:10:Z:5em},
auch circle
genannt ist (dies hat nichts mit dem Shape zu tun), platziert nun die on chain=circle
gesetzten Nodes startend bei 45° im Abstand von 5em
um Z
(also Z.center
). Der radiale Abstand ist dabei 36°.
Nodes können auch ebenfalls mit einer \foreach
-Schleife gesetzt werden, falls sie gemeinsame Eigenschaften haben. Ein vollständiges Beispiel:
\begin{tikzpicture}[node distance=5em,every node/.style={circle,draw}]
\node [circle] (Z) {Zentrum};
\begin{scope}[
start chain=circle placed {nodes around center=45:10:Z:5em},
every join/.append style={<->},
every node/.append style={
on chain=circle,
join,
minimum size=2em
}
]
\foreach \cnt in {0,...,5}
\node[fill=black!\cnt 0!white] {\cnt};
\node {6}; \node[rotate=180] {7};
\node {$\infty$}; \node {9};
\chainin (circle-begin);
\end{scope}
\end{tikzpicture}
ergibt

Ein kleiner Unterschied besteht aber immer noch zwischen dieser Platzierung und einer mithilfe positioning
. Der Abstand 5em
ist gemessen zwischen den center
-Anchors der Nodes. Sofern nicht die on grid
-Option gesetzt ist, platziert positioning
die Nodes so, dass der Abstand zwischen ihren Borders (die mit draw
gezeichneten Linien (und genaugenommen gehört outer sep
s da auch noch dazu)) 5em
beträgt.
Geht man davon aus, dass das Zentrum als benannte Node (das kann auch eine benannte coordinate
sein) angegeben ist, kann man dieses Verhalten mit einer kleinen Variation an dem nodes around center
-Style auch simulieren. (Ich habe dafür die rotate
-Option bei der 7
-Node entfernen müssen.) Bei gleicher Argumenten sieht die Definition von nodes around center*
dann folgendermaßen aus:
\tikzset{
nodes around center*/.style args={#1:#2:#3:#4}{% gleiche Optionen wie oben
at={([shift={(#3.{(\tikzchaincount-1)*360/(#2)+#1})}] {{(\tikzchaincount-1)*360/(#2)+#1}}:{#4})},
anchor={(\tikzchaincount-1)*360/(#2)+#1+180}
}
}
und ergibt dann mit dem Startwinkel 180

Kompletter Code
\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{chains}
\tikzset{
nodes around center/.style args={#1:#2:#3:#4}{%
% #1 = Startwinkel, #2 = Anzahl Knoten
% #3 = Zentrums-Node, #4 = Abstand
at={([shift={(#3)}] {{(\tikzchaincount-1)*360/(#2)+#1}}:{#4})}
},
nodes around center*/.style args={#1:#2:#3:#4}{% gleiche Optionen wie oben
at={([shift={(#3.{(\tikzchaincount-1)*360/(#2)+#1})}] {{(\tikzchaincount-1)*360/(#2)+#1}}:{#4})},
anchor={(\tikzchaincount-1)*360/(#2)+#1+180}
}
}
\begin{document}
\begin{tikzpicture}[node distance=5em,every node/.style={circle,draw}]
\node [circle] (Z) {Zentrum};
\begin{scope}[
start chain=circle placed {nodes around center=45:10:Z:5em},
every join/.append style={<->},
every node/.append style={
on chain=circle,
join,
minimum size=2em
}
]
\foreach \cnt in {0,...,5}
\node[fill=black!\cnt 0!white] {\cnt};
\node {6}; \node[rotate=180] {7};
\node {$\infty$}; \node {9};
\chainin (circle-begin);
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}[node distance=5em,every node/.style={circle,draw}]
\node [circle] (Z) {Zentrum};
\begin{scope}[
start chain=circle placed {nodes around center*=180:10:Z:5em},
every join/.append style={<->},
every node/.append style={
on chain=circle,
join,
minimum size=2em
}
]
\foreach \cnt in {0,...,5}
\node[fill=black!\cnt 0!white] {\cnt};
\node {6}; \node {7};
\node {$\infty$}; \node {9};
\chainin (circle-begin);
\end{scope}
\end{tikzpicture}
\end{document}
Wenn ich beim TikZ-Lernen und Grafiken-Erstellen auf Fragen stoße, stelle ich sie mal hier. Falls sie zu grundlegend sein sollten, gern ignorieren! Wenn ich es selber rauskriege mit dem dicken Handbuch, poste ich auch gern die gefundene Lösung. Am Ende haben dann hoffentlich auch andere als ich was davon, wenn sie auf solche Fragen stoßen.