Ich möchte den Code unten so ändern, dass die Kettenverbindungsmethode verwendet wird, anstatt einen Knoten dazwischen einzufügen. Irgendwelche Ideen zur Implementierung?
\documentclass[border=10mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.arrows, calc,chains}
\tikzset{
myarr/.style args={#1 -- #2}{
insert path={let \p1=($(#1)-(#2)$) in},
single arrow, draw=black, minimum width=20mm, minimum height={veclen(\x1,\y1)},
inner sep=0mm, single arrow head extend=1pt,
},
every join/.style={->},
}
\begin{document}
\begin{tikzpicture}[start chain=going right,node distance= 2cm and 2cm]
\def\data{
A,
B,
C,
D%
}
\foreach \p [count=\i from 1] in \data {
\node[draw,on chain,join,minimum width=2cm,minimum height=4cm] (P\i) {\p};
}
% move below logic to use join method
\path (P1) -- (P2) node[midway,->,myarr={P1.east -- P2.west},single arrow] {};
\path (P2) -- (P3) node[midway,->,myarr={P2.east -- P3.west},single arrow] {};
\path (P3) -- (P4) node[midway,->,myarr={P3.east -- P4.west},single arrow] {};
\end{tikzpicture}
\end{document}
Antwort1
Sie können einen Knoten über eine Verknüpfung in einer Kette platzieren, indem Sie einfach ein Attribut einrichten, to path
das genau das tut: einen Knoten platzieren.
Innerhalb eines to path
haben Sie Zugriff auf \tikztostart
und \tikztotarget
– sowie auf, \tikztonodes
aber das ignorieren wir hier … oder brauchen Sie irgendwo Text?
Anschließend kann die Differenz wie bisher berechnet werden, sowie deren veclen
und zusätzlich auch deren Richtung/Winkel über atan2
. Die Ergebnisse können dann wie bisher mit einem verwendet werden, node
welches nun die einzige (visuelle) Ausgabe des ist to path
.
Dies alles geschieht im myarr with anchors
Stil:
\tikzset{
myarr with anchors/.style 2 args={
to path={
let \p0=($(\tikztotarget.#2)-(\tikztostart.#1)$) in
node[myarr node,
minimum height={veclen(\x0,\y0)},
shape border rotate={atan2(\y0,\x0)}] at (\tikztostart.#1) {}}}}
Für einfache Ketten ist es dann so einfach wie
\tikz[
start chain=going right, node distance=2cm and 2cm,
every join/.style={myarr with anchors={east}{west}},
every on chain/.append style={draw, minimum width=2cm, minimum height=4cm}]
\node foreach \t in {A, ..., D} [on chain, join]{\t};
Ich bevorzuge automatischere Ansätze, bei denen die Punkte an der Grenze selbstständig gefunden werden.
Dafür stelle ich den myarr
Stil zur Verfügung, der mithilfe edge
von die Punkte auf der Grenze findet und diese dann in der gleichen Berechnung wie zuvor verwendet.
Optional akzeptiert es auch zwei Argumente, die entweder leer sind (automatischer Ansatz oder kein Knoten) oder eine Ankerspezifikation enthalten (mit dem .
).
Referenz:Können wir „let“ (von „TikZ“) innerhalb der Stildefinition eines Knotens verwenden?.
Code
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.arrows, calc, chains}
\tikzset{
myarr node/.style={
shape=single arrow, draw=black, minimum width=20mm, anchor=tail,
shape border uses incircle, single arrow head extend=+1pt,
inner sep=+0pt, outer sep=+0pt},
%
myarr with anchors/.style 2 args={
to path={
let \p0=($(\tikztotarget.#2)-(\tikztostart.#1)$) in
node[myarr node,
minimum height={veclen(\x0,\y0)},
shape border rotate={atan2(\y0,\x0)}] at (\tikztostart.#1) {}}},
%
myarr/.default={}{},
myarr/.style 2 args={
to path={
\expanded{
(\tikztostart#1) edge[path only, overlay, line to]
coordinate[at start] (@start)
coordinate[at end] (@end) (\tikztotarget#2)}
let \p0=($(@end)-(@start)$) in
node[myarr node,
minimum height={veclen(\x0,\y0)},
shape border rotate={atan2(\y0,\x0)}] at (@start) {}}}}
\begin{document}
\pgfmathsetseed{872607}
\tikz[
start chain=going right, node distance=2cm and 2cm,
every join/.style={myarr with anchors={east}{west}},
every on chain/.append style={draw, minimum width=2cm, minimum height=4cm}]
\node foreach \t in {A, ..., D} [on chain, join]{\t};
\tikz[
start chain=going right, node distance=2cm and 2cm,
every join/.style=myarr,
every on chain/.append style={draw, minimum width=2cm, minimum height=4cm}]
\node foreach \t in {A, ..., D} [on chain, join]{\t};
\tikz[
start chain=going above right, node distance=.4cm and 2cm,
every join/.style=myarr,
every on chain/.append style={draw, circle, minimum size=2cm}]
\node foreach \t in {A, ..., D} [on chain, join, shift={(3*rand, 3*rand)}]{\t};
\tikz[
start chain=going above right, node distance=.4cm and 2cm,
every join/.style={myarr={.north east}{.south west}},
every on chain/.append style={draw, minimum width=2cm, minimum height=1cm}]
\node foreach \t in {A, ..., D} [on chain, join]{\t};
\end{document}
Ausgabe
Antwort2
Ich bin nicht sicher, was Sie versuchen, aber möglicherweise möchten Sie so etwas wie das Folgende?
\documentclass[border=10mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.arrows, calc,chains}
\tikzset{
myarr/.style args={#1 -- #2}{
insert path={let \p1=($(#1)-(#2)$) in},
single arrow, draw=black, minimum width=20mm, minimum height={veclen(\x1,\y1)},
inner sep=0mm, single arrow head extend=1pt,
},
my arr/.style={
insert path={let \p1=(20mm,0pt) in},
single arrow, draw=black, minimum width=20mm, minimum height={veclen(\x1,\y1)},
inner sep=0mm, single arrow head extend=1pt,
},
}
\begin{document}
\begin{tikzpicture}[start chain=going right,node distance=2cm and 0cm]
\def\data{
A,
B,
C,
D%
}
\foreach \p [count=\i from 1,remember=\i as \ilast] in \data {
\edef\tempa{1}\edef\tempb{\i}%
\ifx\tempa\tempb\relax
\else \node (A-\ilast-\i) [draw,on chain,my arr] {};
\fi
\node[draw,on chain,join,minimum width=2cm,minimum height=4cm] (P\i) {\p};
}
\end{tikzpicture}
\end{document}
Antwort3
Eine kleine Variation der netten @cfr-Antwort.
- Der Makro-Join ist (so scheint es) nur zum Zeichnen von Pfeilen (jeder Art) zwischen Knoten gedacht, kann aber keine Knoten zwischen ihnen einfügen.
- Aus diesem Grund können Sie
single arrow
per Makro keine Knoten mit Form zwischen den Hauptknoten in der Kette einfügenjoin
. Sie können nur als normale Knoten in die Kette eingefügt werden. - Dieser
single arrow
Knoten passt gut zwischen zwei Hauptknoten in der Kette. Sie müssen seinen Stil entsprechend definieren (siehe MWE unten). - MWE:
\documentclass[margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, chains,
shapes.arrows}
\begin{document}
\begin{tikzpicture}[
node distance = 0mm,
start chain = going right,
SA/.style = {% single arrow
single arrow, single arrow head extend=3mm,
draw, minimum width=20mm, minimum height=20mm,
inner sep=0mm,
node contents=\vphantom{A},
on chain
},
N/.style = {draw, semithick, on chain,
minimum width=2cm, minimum height=4cm}
]
\def\data{A, B, C, D}
\foreach \i [count=\j] in \data
{
\node[N] {\i};
\ifnum\j<4
\node[SA];
\fi
}
\end{tikzpicture}
\end{document}