Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2
Bilder auf TeXwelt geladen

17 Aug '13, 11:20

cgnieder's gravatar image

cgnieder
22.1k253463

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: ![](http://i.imgur.com/eXw46ve.png) ![alt text][1] 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 ![](http://i.imgur.com/TTnKmEt.png) ![alt text][2] 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` ![](http://i.imgur.com/b6TLGh6.png) ![alt text][3] ## 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}\end{document} [1]: http://texwelt.de/wissen/upfiles/qrr-kreis1.png [2]: http://texwelt.de/wissen/upfiles/qrr-kreis2.png [3]: http://texwelt.de/wissen/upfiles/qrr-kreis3.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

26 Jul '13, 05:43

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815

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: ![](http://i.imgur.com/eXw46ve.png) 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 ![](http://i.imgur.com/TTnKmEt.png) 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` ![](http://i.imgur.com/b6TLGh6.png) ## 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}