Knoten mit Ketten verbinden verbinden

Knoten mit Ketten verbinden verbinden

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}

Ausgabe: Bildbeschreibung hier eingeben

Antwort1

Sie können einen Knoten über eine Verknüpfung in einer Kette platzieren, indem Sie einfach ein Attribut einrichten, to pathdas genau das tut: einen Knoten platzieren.

Innerhalb eines to pathhaben Sie Zugriff auf \tikztostartund \tikztotarget– sowie auf, \tikztonodesaber das ignorieren wir hier … oder brauchen Sie irgendwo Text?

Anschließend kann die Differenz wie bisher berechnet werden, sowie deren veclenund zusätzlich auch deren Richtung/Winkel über atan2. Die Ergebnisse können dann wie bisher mit einem verwendet werden, nodewelches nun die einzige (visuelle) Ausgabe des ist to path.

Dies alles geschieht im myarr with anchorsStil:

\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 myarrStil zur Verfügung, der mithilfe edgevon 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

Bildbeschreibung hier eingeben

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}

Pfeilknoten auf Kette

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 arrowper Makro keine Knoten mit Form zwischen den Hauptknoten in der Kette einfügen join. Sie können nur als normale Knoten in die Kette eingefügt werden.
  • Dieser single arrowKnoten 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}

Bildbeschreibung hier eingeben

verwandte Informationen