Ich werde die Frage, wie man Nodes positionieren kann, etwas freier interpretieren.
*Die kursiven Einträge sind noch nicht gefüllt. Ich werde dies beizeiten noch erledigen.*
<h1 id="start">Übersicht</h1>
<ul>
<li><a href="#coords">Wie kann ich Koordinaten spezifizieren?</a></li>
<ul>
<li><a href="#coords-canvasxyz">Der Unterschied zwischen <code>canvas</code> und <code>xyz</code></a></li>
<li><a href="#coords-absrel">Absolut oder relativ oder relativ oder sehr relativ<sup>3.0.0</sup></a></li>
<li><a href="#coords-node">Das Node-Koordinatensystem</a></li>
<li><a href="#coords-others">Die anderen Koordinatensysteme</a></li>
<li><a href="#coords-calc">Die <code>calc</code>-Library</a></li>
<li><i><a href="#coords-trans">Was hat es mit den Transformationen auf sich?</a></i></li>
</ul>
<li><i><a <li><a href="#nodes">Wie kann ich Nodes an diesen Koordinaten positionieren?</a></i></li>
positionieren?</a></li>
<li><i><a href="#relative">Wie kann ich Nodes relativ zu anderen positionieren?</a></i></li>
<li><i><a href="#paths">Wie kann ich Nodes entlang von Pfaden positionieren?</a></i></li>
</ul>
<!-- COORDS -->
<h1 id="coords">Wie kann ich Koordinaten spezifizieren?</h1>
Es gibt viele verschiedene Arten Koordinaten zu spezifizieren. Am bekanntesten sind dabei die expliziten Koordinaten. Zu jeder expliziten Variante existiert eine implizite, die mit dem dazugehörigen Koordinatensystem (*Coordinate System*, `cs:`) angewendet wird. Die explizite Koordinatenangabe ist `(<Name des Koordinatensystem> cs:<Parameter>)`. Dabei sind die `<Parameter>` meist in Key-Value-Form, sie müssen es aber nicht.
Bei den klassischen Koordinatensystemen unterscheidet man erstmal zwischen denen im *Canvas System* und denen im *xyz-System*.
<!-- COORDS: CANVAS oder XYZ -->
<h2 id="coords-canvasxyz">Der Unterschied zwischen <code>canvas</code> und <code>xyz</code></h2>
Mit **Canvas** ist das Papier selbst gemeint. Es gibt zwei Dimensionen: *x* (nach rechts) und *y* (nach oben). Das Canvas-Koordinatensystem arbeitet nur mit Längenangaben (`pt`, `em`, `ex`, `mm`, `cm`, `in` usw.). Der Name für die explizite Version ist `canvas`. Es existiert ebenfalls eine polare Version (`canvas polar`) die schlichterweise eine Radius-Angabe und eine Winkel-Angabe in *x*- und *y*-Werte umrechnet. Ein Beispiel aus dem Manual:
\draw (canvas cs: x=0cm, y=2mm) -- (canvas polar cs: radius=2cm, angle=30); % explizit
\draw (0cm, 2mm) -- (30: 2cm); % implizit
Die polare Version unterscheidet übrigens auch noch den `x radius` und den `y radius`, mit dem man Polarpunkte auf einer Ellipse (und nicht nur einem Kreis) angeben kann. Die implizite Version verwendet dazu `and`: `(<Winkel>:<x-Radius> and <y-Radius>)`.
Bei dem ***xyz***-Koordinatensystem ist ein Koordinatensystem gemeint, das *x*-, *y*- und *z*-Vektoren auf Basis des Canvas-Systems definiert. Standardmäßig sind das die Vektoren `x=(1cm, 0cm), y=(0cm, 1cm), z=(-3.85mm, -3.85mm)` (die auch genauso mit den Optionen `x`, `y` und `z` gesetzt werden können).
Die Benutzung ist ähnlich des Canvas-Systems:
\path[->] (0,0) edge (xyz cs: x=1) edge (xyz cs: y=1) edge (xyz cs: z=1); % explizit
\path[->] (0,0) edge (1, 0) edge (0, 1) edge (0, 0, 1); % implizit
Es existiert ebenfalls eine polare Version (`xyz polar` und `xy polar`), die genauso wie die Canvas-Version funktioniert (allerdings ohne *z*-Bezug).
Man kann übrigens Koordinaten wie `(1cm, 2)` verwenden. TikZ addiert dann einfach die Vektoren `(1cm, 0cm)` und `(0, 2)` aus den beiden Systemen zusammen.
### Exkurs: Implizite polare Koordinatensystem mit einem Wort als Winkel
Statt eines Winkels kann auch eines der folgenden Wörter als Richtung verwendet werden: `up`, `down`, `left`, `right`, `north`, `south`, `east`, `west`, `north east`, `north west`, `south east`, `south west`. Diese korrespondieren direkt zu den acht Haupt-Kompassrichtungen.
Die Koordinatenangabe `(up: 1)` ist also die gleiche wie `(90: 1)`, `(south west: 1)` die gleihe wie `(-135: 1)`.
<!-- COORDS: ABSOLUT oder RELATIV -->
<h2 id="coords-absrel">Absolut oder relativ oder relativ oder sehr relativ<sup>3.0.0</sup></h2>
Befindet sich kein `+` vor einer Koordinate, so ist sie (fast immer, siehe CVS-Version-Option `turn`) absolut.
Folgt die Koordinatenangabe allerdings einem oder mehreren Plus-Zeichnen, ist sie relativ:
- `++` aktualisiert die „letzte Koordinate“.
- `+` aktualisiert nicht die „letzte Koordinate“.
Mit „letzte Koordinate“ ist hier eben genau die Koordinate gemeint, von der die nächste relative Koordinate berechnet wird. Dies wird an einem Beispiel viel klarer. Die folgenden Pfade zeichnen genau das gleiche Rechteck (das auch anders gezeichnet hätte werden können):
\draw (1.5, 1.5) -- ++(1, 0) -- ++(0, 1) -- ++(-1, 0) -- cycle;
\draw (1.5, 1.5) -- + (1, 0) -- + (1, 1) -- + ( 0, 1) -- cycle;
Im zweiten Fall werden alle Koordinaten von `(1.5, 1.5)` aus berechnet, im ersten ist das erst `(1.5, 1.5)`, dann `(2.5, 1.5)`, dann `(2.5, 2.5)` und dann `(1.5, 2.5)`. Bei nur einer relativen Koordinate ist es dementsprechend auch irrelevant, welche Variante man verwendet.
Mit der TikZ-Version 3.0.0 wurde eine spezieller Option eingeführt, die es erlaubt, nicht nur Koordinaten relativ zu dem vorherigen Punkt anzugeben, sondern auch zusätzlich einen Winkel zur Tangente an dem vorherigen Punkt auf dem Pfad anzugeben. *(Hä?)* Diese Option wird wie eine Koordinaten-Transformation angegeben und heißt schlicht `turn`<sup>3.0.0</sup>. Ein Beispiel:
\draw (0,0) -- (1,1) -- ([turn]45:1) -- ([turn] 90:1);
zeichnet im Prinzip das Gleiche wie
\draw (0,0) -- (1,1) -- ++(45+45:1) -- ++(90+90:1);
Es sei angemerkt, das auf ähnlicher Weise dieser Pfad auch mit der `turtle`-Library erreicht werden kann:
\draw (0,0) [turtle={right=45,fd=sqrt 2,left=45,fd,left,fd}];
<!-- COORDS: NODE -->
<h2 id="coords-node">Das Node-Koordinatensystem</h2>
Nodes (sowie `coordinate`s, die im Kern auch nur Nodes sind) sind etwas Spezielles. Sie werden immer absolut referenziert. Das heißt, wenn jemand
\coordinate (meine Koordinate) at (2, 1);
definiert und diese dann in einem Pfad verwendet, wird immer die gleiche Position auf dem Papier ausgewählt, egal wie die Vektoren `x` und `y` gesetzt sind oder welche Transformationen aktiviert sind. Die folgenden Pfade referenzieren also immer den gleichen Punkt:
\path (meine Koordinate);
\path[shift=(30:1), rotate=60, scale=2, xslant=3, x=(30:1.5cm)] (meine Koordinate);
Das ändert sich allerdings, wenn die Transformation direkt an der Koordinate vorgenommen werden:
\path ([shift=(30:1), rotate=60, scale=2, xslant=3] meine Koordinate);
Die Einstellungen der *x*-, *y*- und *z*-Vektoren haben aber darauf immer noch keinen Einfluss.
Was das mit den ganzen Transformationen allerdings auf sich hat, verdient seinen eigenen Abschnitt.
Der Name des Nodes-Koordinatensystem ist `node` und hat die Optionen `name`, `angle` und `anchor`, wobe `angle` und `anchor` gleichbedeutend sind. Man kann also sowohl `anchor=60` als auch `angle=north west` verwenden.
Die explizite Version sieht einfacher nur den Node-Namen vor, eventuell gefolgt von einem Anchor/Angle, der mit einem `.` vom Node-Namen getrennt wird.
Wird eine Node ohne Anchor/Angle spezifiert, wird zwar der `.center`-Anchor als aktuelle Koordinate vorgemerkt (dies ist zum Beispiel relevant für relative Koordinaten), oftmals wird aber dann automatisch ein Punkt auf dem Border der Node verwendet, wenn das der Path-Operator vorsieht (alle außer `arc`?).
\path (node cs: name=node A) -- (node cs: name=node B); % explizit
\path (node A) -- (node B); % implizit
<!-- COORDS: ANDERE -->
<h2 id="coords-others">Die anderen Koordinatensysteme</h2>
Es gibt noch einige andere Koordinatensysteme. Eine etwas genauere Erklärung verdient das `perpendicular`-Koordinatensystem, das die Keys `horizontal line through` und `vertical line through` kennt. Die implizite Version benutzt die Zeichenfolge `|-` und `-|`, die man schon bereits von den Path-Operatoren kennt. `(<p1>|-<p2>)` (oder `(<p1> |- <p2>)`) auch ist das Gleiche wie `(perpendicular cs: vertical line through={(<p1>)}, horizontal line through={(<p2>)})`.
Das „horizontal“ und „vertikal“ ist ebenso abhängig von den Transformationen `xslant`, `yslant` sowie `rotate`. (Sprich die horizontale Achse muss nicht orthogonal zur vertikalen sein noch sind beide immer senkrecht zum Papier.)
Es gibt ferner noch die Koordinatensysteme `tangent` (das die [`calc`-Library](#coords-calc) benötigt) und `barycentric`, die keine implizite Version besitzen. Ihre Verwendung ist dem PGF/TikZ-Manual zu entnehmen.
Außerdem gibt es auch noch die undokumentierten (und zumindest teilweise fehlerhaften) Koordinatensysteme `xyz cylindrical` und `xyz spherical`, siehe für letzteren auch die Frage [„spherical coordinates in tikz 3d“](http://tex.stackexchange.com/q/114150/16595) auf TeX.sx.
<!-- COORDS: CALC -->
<h2 id="coords-calc">Die <code>calc</code>-Library</h2>
verdient ihre eigene Frage und Antwort (und kann auch sehr kompakt im Manual studiert werden).
<!-- CORDS: TRANS -->
<h2 id="coords-trans">Was hat es mit den Transformationen auf sich?</h2>
<!-- NODES -->
<h1 id="nodes">Wie kann ich Nodes an diesen Koordinaten positionieren?</h1>
Mit dem Path-Operator `node` (und `coordinate`) können Nodes an Koordinaten platziert werden.
Dafür gibt es im Prinzip zwei Möglichkeiten: mit `at` und ohne `at`.
Wird kein `at` verwendet, wird die aktuelle Position des Pfades verwendet. (Das ist auch der Grund, warum `\node {Node};` am Ursprung platziert ist. `\node` expandiert zu `\path node` und hier wird implizit `(0,0)` verwendet.)
Wird `at` verwendet (das es übrigens auch als Key gibt), wird diese Position verwendet. Es kann hier allerdings die vorherige Position auf dem Pfad verwendet werden wie unter dem Abschnitt über [absolute und relative Koordinaten](#abs-rel) bereits diskutiert. Ein Beispiel:
\tikz[gridded]\draw (0,0) -- (1,1) -- ++(45+45:1) node {x} -- ++ (180:1);
\tikz[gridded]\draw (0,0) -- (1,1) node at ++(45+45:1) {x} -- ++ (180:1);
\tikz[gridded]\draw (0,0) -- (1,1) node at ([turn]45:1) {x} -- ([turn] 90:1); % 3.0.0.
Selbstverständlich ist der eigentliche Pfad in allen drei Varianten unterschiedlich (aber nicht unterbrochen).
![alt text][1]![alt text][2]![alt text][3]
Normalerweise werden Nodes *über* dem Pfad gezeichnet, was mit dem Key `behind path`<sup>3.0.0</sup> geändert werden. Das Gegenteilige kann mit `in front of path`<sup>3.0.0</sup> erreicht werden.
<!-- RELATIV -->
<h1 id="relative">Wie kann ich Nodes relativ zu anderen positionieren?</h1>
<!-- PFADE -->
<h1 id="paths">Wie kann ich Nodes entlang von Pfaden positionieren?</h1>
[1]: http://texwelt.de/wissen/upfiles/de2212-0.png
[2]: http://texwelt.de/wissen/upfiles/de2212-1.png
[3]: http://texwelt.de/wissen/upfiles/de2212-2.png