체인 조인으로 노드 연결

체인 조인으로 노드 연결

사이에 노드를 두는 대신 체인 조인 방법을 사용하도록 아래 코드를 변경하고 싶습니다. 그것을 구현할 아이디어가 있습니까?

\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}

산출: 여기에 이미지 설명을 입력하세요

답변1

to path간단히 노드를 배치하는 를 설정하여 체인에 조인을 통해 노드를 배치할 수 있습니다 .

a 내부에서 및 to path에 액세스할 수 있습니다 . 그러나 여기서는 이를 무시하겠습니다. 아니면 어딘가에 텍스트가 필요합니까?\tikztostart\tikztotarget\tikztonodes

그런 다음 차이는 이전과 마찬가지로 계산할 수 veclen있으며 추가로 를 통해 방향/각도 계산할 수 있습니다 atan2. 그런 다음 결과는 node이전과 같이 와 함께 사용할 수 있으며 이는 이제 의 유일한 (시각적) 출력입니다 to path.

이 작업은 모두 다음 myarr with anchors스타일로 수행됩니다.

\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) {}}}}

간단한 체인의 경우 다음과 같이 쉽습니다.

\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};

나는 스스로 국경의 지점을 찾는 자동 접근 방식을 좋아합니다.

이를 위해 테두리의 점을 찾기 위해 myarran을 사용하고 이전과 동일한 계산에서 이를 사용하는 스타일을 제공합니다.edge

선택적으로 비어 있거나(자동 접근 또는 노드 아님) 앵커 사양을 포함하는 두 개의 인수도 허용합니다( .).


참조:노드의 스타일 정의 내에서 `let`(`TikZ`의)을 사용할 수 있습니까?.

암호

\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}

산출

여기에 이미지 설명을 입력하세요

답변2

당신이 무엇을 하려는지 잘 모르겠지만 아마도 다음과 같은 것을 원하십니까?

\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}

체인의 화살표 노드

답변3

좋은 @cfr 답변의 작은 변형입니다.

  • 매크로 조인은 노드 사이에 화살표(모든 종류)를 그리는 용도로만 사용되지만 노드 사이에 노드를 삽입할 수는 없습니다.
  • 위의 이유로 인해 single arrow체인의 주 노드 사이에 모양의 노드를 매크로로 삽입할 수 없습니다 join. 체인의 일반 노드로만 삽입할 수 있습니다.
  • 해당 single arrow노드는 체인의 두 기본 노드 사이에 잘 ​​맞을 수 있으므로 그에 따라 스타일을 정의해야 합니다(아래 MWE 참조).
  • 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}

여기에 이미지 설명을 입력하세요

관련 정보