Genau für diesen Zweck gibt es die Keys outer xsep
und outer ysep
, die standardmäßig auf .5\pgflinewidth
gesetzt sind, so dass die Anchors auf dem Rand der Pfade der Node liegen und nicht mitten drin. Auf TeX.sx gibt es dazu bereits eine verwandte Frage unter dem Namen Properly aligning drawn lines between the corners of 2 rectangular nodes in TikZ? Es ist nicht das gleiche Problem, aber zeigt die Sachlage, wie ich finde, ganz deutlich.
Setzt man die outer sep
s dementsprechend auf .5\pgflinewidth + 5pt
, kann man die Linien wie ganz gewöhnlich zeichnen, und auch der Timer für die Nodes (das ist das Dingen, was die pos
-Angabe, die auch hinter midway
und near start
steckt, in die eigentliche Koordinate entlang des Pfades verwandelt) funktioniert wie erwartet.
\documentclass[tikz]{standalone}
\tikzset{
hv path/.style={to path={-| (\tikztotarget) \tikztonodes}},
vh path/.style={to path={|- (\tikztotarget) \tikztonodes}}}
\begin{document}
\begin{tikzpicture}[rechteck/.style={
rectangle, draw, minimum width=+1.6cm, minimum height=+3cm,
align=center, inner sep=+0pt, outer sep=.5\pgflinewidth+5pt}]
\node [rechteck] (rechteck2) {ebenso\\ein\\Tester};
\node [rechteck] at (2.6,-3) (rechteck5) {ebenso\\ein\\Tester};
\path[-stealth] (rechteck2) edge[hv path] node[near start, above, red] {Satz} (rechteck5)
edge node[midway, sloped, above] {Oh!} (rechteck5)
edge[vh path] node[near end, above, red] {Satz} (rechteck5);
\end{tikzpicture}
\end{document}
Diese Lösung hat einen Nachteil: Die Einstellung, dieser Abstand, ist node-gebunden, und kann nachträglich nicht mehr geändert werden. Da die shorten
-Optionen pfadgebunden sind, kann man sie auch für jede Verbindung neu setzen.
(Man könnte theoretisch marginal unterschiedlich benannte unsichtbare Duplikate der Nodes mit unterschiedlichen outer sep
s erstellen und diese dann verwenden, das erzeugt aber viel Müll und macht das ganze fast eher komplizierter.)
Eine etwas aufwändigere Option könnte man mithilfe der calc
-Library einführen (man kann selbstverständlich das Ganze auch mit PGF-Mitteln anstellen, calc
macht es nur etwas kürzer (aber wie ich finde, schwerer lesbar)).
Nachteil dieser Lösung ist, dass für jede mögliche Verbindung, die Berechnung angepasst werden muss (für einfache Pfade wie --
und -|
/|-
ist es aber noch sehr einfach). Man beachte, dass der --
-Pfad hier im Vergleich zur anderen Lösung länger ist. (Die 5pt
sind oben orthogonal zum Nodepfad berechnet, hier entlang des Verbindungspfades.)
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\tikzset{
Shorten >/.initial=+5pt, Shorten </.initial=+5pt,
@Shorten path/.style={to path={
\pgfextra\pgfinterruptpath
\path (\tikztostart) #1 coordinate[at start] (s@start)
coordinate[midway] (s@mid)
coordinate[at end] (s@target) (\tikztotarget);
\endpgfinterruptpath\endpgfextra
($(s@start)! \pgfkeysvalueof{/tikz/Shorten <}!(s@mid)$)
#1 ($(s@target)!\pgfkeysvalueof{/tikz/Shorten >}!(s@mid)$) \tikztonodes}},
straight path/.style={@Shorten path=--},
hv path/.style={@Shorten path=-|},
vh path/.style={@Shorten path=|-}}
\begin{document}
\begin{tikzpicture}[rechteck/.style={
rectangle, draw, minimum width=+1.6cm, minimum height=+3cm,
align=center, inner sep=+0pt}]
\node [rechteck] (rechteck2) {ebenso\\ein\\Tester};
\node [rechteck] at (2.6,-3) (rechteck5) {ebenso\\ein\\Tester};
\path[-stealth] (rechteck2) edge[hv path] node[near start, above, red] {Satz} (rechteck5)
edge[straight path] node[midway, sloped, above] {Oh!} (rechteck5)
edge[vh path] node[near end, above, red] {Satz} (rechteck5);
\end{tikzpicture}
\end{document}
Output
beantwortet
19 Okt '13, 06:05
Qrrbrbirlbel
2.9k●3●8●15
Akzeptiert-Rate:
53%