라인이 아닌 다른 레이어의 라인에 노드를 설정하는 방법은 무엇입니까?

라인이 아닌 다른 레이어의 라인에 노드를 설정하는 방법은 무엇입니까?

선이 배경 레이어에 있는지 여부에 관계없이 선의 노드가 기본 레이어에 있다고 선언할 수 있습니까? 예를 들어: 여기에 이미지 설명을 입력하세요

다음 MWE를 사용하면:

\documentclass[12pt,tikz,border=3mm]{standalone}
    \usetikzlibrary{arrows,arrows.meta,%
        backgrounds,positioning}
\pgfdeclarelayer{foreground} 
\pgfdeclarelayer{background}
   \pgfsetlayers{background,main,foreground}

    \usepackage{amsmath}
\begin{document}
    \begin{tikzpicture}[
    node distance = 0mm,
        LC/.style = {draw=#1,
            line width=1mm,
            arrows={-Stealth[fill=#1,inset=0pt,length=0pt 1.6,angle'=90]},
            },
         X/.style = {draw, very thin, fill=white, fill opacity=0.75,
            font=\scriptsize,
            text=black, text opacity=1, align=left,
            inner sep=2pt, sloped, anchor=west,pos=0.07},
                        ]\sffamily
%---
\linespread{0.8}
%-------
\coordinate                     (a0)    at (0,0);
\coordinate[right=77mm of a0]   (b0);
    \foreach \i [count=\xi from 0] in {1,2,...,4}
{
    \coordinate[below=7mm of a\xi]  (a\i);
    \coordinate[below=7mm of b\xi]  (b\i);
}
\draw[|->]  (a0) -- (a3) node[above left]   {$t$};
\draw[|->]  (b0) -- (b3) node[above right]  {$t$};
\draw[LC=gray]  (a1)
    to node[X] {data\\
                $(\text{SeqNum}=0,\ell=1000)$}
                (b2);
%-------
    \begin{scope}[ X/.append style={anchor=east},
                  LC/.append style={transform canvas={yshift=-2mm}},
                  on background layer]
\draw[LC=teal]  (b1)
    to node[X] {ACK(AckNum$=$1000)}
                (a2);
   \end{scope}
%----------------
    \end{tikzpicture}
        \end{document}

나는 얻다:

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

두 번째 선을 두 번 그려서 얻은 첫 번째 그림: 첫 번째 선은 선으로, 그 위에는 노드가 있는 보이지 않는 그림입니다. 실제 다이어그램에는 이러한 선이 최대 12개까지 있으므로 선이 배경에 있더라도 노드가 기본 평면에 있는 선언을 위한 더 편리한 솔루션을 찾고 있습니다.

답변1

상자를 가지고 놀자.

어느 시점에서 TikZ는 키를 소개합니다.behind path( in front of path다시 전환하기 위해) 기본적으로 노드가 배치되는 하나 또는 다른 경로 상자를 지정합니다. 경로가 최종적으로 그려지면( ;경로 끝 내부) 다음 상자가 "사용"됩니다.

  1. 배경 하나 ( \tikz@figbox@bg)
  2. 실제 경로가 그려집니다
  3. 전경 항목( \tikz@figbox, 노드의 기본 항목)

TikZ가 경로에서 노드를 찾으면 실제로는 단순히 노드를 찾는 것이 아닙니다.무승부그러면 이 두 상자 중 하나에 노드를 그립니다.

이 상자는 경로 시작 시 재설정됩니다. 이 상자는 노드가 해당 경로 위에 배치되는 이유입니다(처음에는 자체 경로이지만).


와 더불어PGF 레이어, 매우 유사한 일이 발생하지만 노드 대신 \begin{pgfonlayer}및 사이의 모든 것이 \end{pgfonlayer}해당 상자 안에 배치됩니다.

그림이 끝나면 이 상자는 "사용"됩니다. (사진을 중첩하기 위한 추가 관리 작업이 있다고 생각합니다.)

이제 TikZ가 사용하는 상자에 노드를 배치하는 대신 다음을 ;수행할 수 있습니다.노력하다레이어 중 하나에 직접 배치합니다.

이는 몇몇 그룹의 깊은 곳에서 발생하기 때문에 전역적이어야 합니다(실제로 \pgfonlayer범위 내 어딘가에서 사용할 수 있으므로 전역적이기도 합니다. 실제로 를 사용할 때 그렇게 됩니다 on background layer).


\setbox이것을 구현하기 위해 하나 (다행히도 첫 번째 것)를 사용자 정의로 교체합니다. 이는 경로에 대한 해당 상자에 노드를 배치하는 매크로 내에서 일반적으로 작동하도록 \tikz@setbox@which허용됩니다 .\setbox

키 는 전역을 수행 하고 상자가 경로 상자 중 하나가 아닌 레이어 중 하나가 node on layer되도록 만듭니다 .\tikz@setbox@which\setbox

이제 다음과 같이 말할 수 있습니다.

\begin{scope}[
  X/.append style={anchor=east},
  LC'/.style={yshift=-2mm}, % no transform canvas
  on background layer]
\draw[LC=teal] ([LC'] b1) % ........ ←
  to node[X, node on layer=foreground] {ACK(AckNum$=$1000)} ([LC'] a2);
\end{scope}

그리고 이것은 이미 이것이 작동하지 않는 것을 보여줍니다.

  • 레이어 main는 선택할 수 없습니다(어느 쪽에서도 선택할 수 없는 특별한 레이어입니다 \pgfonlayer).

  • transform canvas작동하지 않습니다(그러나 에서도 작동하지 않습니다 behind path). 주변에 방법이 있을 수 있지만 설명서에서는 다음을 권장합니다.

    간단히 말해서, 자신이 하고 있는 일을 실제로 알지 않는 한 캔버스 변환을 사용해서는 안 됩니다.

    그리고 내가 추가할게… 꼭 필요한 경우가 아니면.

    모든 좌표에 수동으로 추가되는 키 LC내부의 일반 변환으로 귀하의 추가 내용을 대체했습니다 . LC'(좌표/노드가 일반 좌표로 작동하고 변형이 적용되도록 좌표/노드를 "고정 해제"하는 방법이 있었으면 좋겠지만 매뉴얼에서도@-ridden 해결 방법.)

또한 노드 이외의 다른 것과 함께 사용하지 마십시오. "결정자" 매크로는 \tikz@whichbox노드뿐만 아니라 모서리, 플롯 표시, 행렬, 하위 노드(일반 노드와 동일하지 않음) 및 사진에도 사용됩니다. 거기를 사용하면 \node on layer작동하지 않습니다. 기껏해야 가장자리, 플롯 표시, 매트릭스, 어린이 및 사진이 표시되지 않습니다. (어쨌든 현재 경로 이후에 상자에 추가한 내용은 잊어버리기 때문입니다.) 이를 위해서는 더 많은 패치가 수행되어야 합니다.


즉, 경로를 따라 빈 노드/좌표를 배치한 다음(위치 및 회전을 저장하기 위해) 모든 선 그리기의 끝에 실제 노드를 배치할 때 이를 참조할 수도 있습니다. 하지만 사용하기 쉽도록 하려면 약간의 관리가 필요합니다.

그리고 전체가 있습니다지연된 노드 위치 지정처음에는 노드를 "실행"하고 나중에 배치합니다( forest그래프 그리기 라이브러리에서 사용). 하지만 그것도 그리 간단하지는 않습니다. (박스가 더 많아요!)

암호

\documentclass[12pt, tikz, border=3mm]{standalone}
\usetikzlibrary{arrows, arrows.meta, backgrounds, positioning}
\pgfdeclarelayer{foreground}\pgfdeclarelayer{background}
\pgfsetlayers{background,main,foreground}
\makeatletter\ExplSyntaxOn % replace only first one
\tl_replace_once:Nnn \tikz@fig@continue { \setbox } { \tikz@setbox@which }
\ExplSyntaxOff
\let\tikz@setbox@which\setbox
\tikzset{node on layer/.code={%
  \expandafter\def\expandafter\tikz@whichbox\expandafter
    {\csname pgf@layerbox@#1\endcsname}%
  \def\tikz@setbox@which{\global\setbox}}}
\makeatother
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}[
  node distance = 0mm,
  LC/.style = {draw=#1, line width=1mm,
    arrows={-Stealth[fill=#1,inset=0pt,length=0pt 1.6,angle'=90]}},
  X/.style = {draw, very thin, fill=white, fill opacity=0.75,
    font=\scriptsize, text=black, text opacity=1, align=left,
   inner sep=2pt, sloped, anchor=west,pos=0.07}]
\sffamily\linespread{0.8}

\coordinate                     (a0)    at (0,0);
\coordinate[right=77mm of a0]   (b0);
\foreach \i [count=\xi from 0] in {1,2,...,4}
  \coordinate[below=7mm of a\xi]  (a\i)
   coordinate[below=7mm of b\xi]  (b\i);
\draw[|->] (a0) -- (a3) node[above left]   {$t$};
\draw[|->] (b0) -- (b3) node[above right]  {$t$};
\draw[LC=gray] (a1) to node[X] {data\\$(\text{SeqNum}=0,\ell=1000)$} (b2);

\begin{scope}[
  X/.append style={anchor=east},
  LC'/.style={yshift=-2mm}, % no transform canvas
  on background layer]
\draw[LC=teal] ([LC'] b1)
  to node[X, node on layer=foreground] {ACK(AckNum$=$1000)} ([LC'] a2);
\end{scope}
\end{tikzpicture}
\end{document}

산출

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

답변2

후속 경로 명령을 사용하여 노드를 전면 레이어에 배치하는 것은 어떻습니까?

\path (b1) to node[X,anchor=east,yshift=-2mm] {ACK(AckNum$=$1000)} (a2);

전체 문서는 다음과 같습니다.

\documentclass[12pt,tikz,border=3mm]{standalone}
\usetikzlibrary{arrows,arrows.meta,backgrounds,positioning}
\pgfdeclarelayer{foreground} 
\pgfdeclarelayer{background}
\pgfsetlayers{background,main,foreground}
\usepackage{amsmath}

\begin{document}

\begin{tikzpicture}
  [
    node distance = 0mm,
    LC/.style = {draw=#1,
                 line width=1mm,
                 arrows={-Stealth[fill=#1,inset=0pt,length=0pt 1.6,angle'=90]},
                },
    X/.style = {draw, 
                very thin, 
                fill=white, 
                fill opacity=0.75,
                font=\scriptsize,
                text=black, 
                text opacity=1, 
                align=left,
                inner sep=2pt, 
                sloped, 
                anchor=west,
                pos=0.07},
  ]
 \sffamily
%---
  \linespread{0.8}
%-------
  \coordinate                     (a0)    at (0,0);
  \coordinate[right=77mm of a0]   (b0);
  \foreach \i [count=\xi from 0] in {1,2,...,4}
    {
      \coordinate[below=7mm of a\xi]  (a\i);
      \coordinate[below=7mm of b\xi]  (b\i);
    } 
  \draw[|->]  (a0) -- (a3) node[above left]   {$t$};
  \draw[|->]  (b0) -- (b3) node[above right]  {$t$};
  \draw[LC=gray]  (a1)
                  to 
                  node[X] {data\\
                  $(\text{SeqNum}=0,\ell=1000)$}
                  (b2);
%-------
  \begin{scope}[X/.append style={anchor=east},
                LC/.append style={transform canvas={yshift=-2mm}},
                on background layer]
    \draw[LC=teal]  (b1)
                    to 
                    (a2);
 \end{scope}
%----------------
  \path (b1) to node[X,anchor=east,yshift=-2mm] {ACK(AckNum$=$1000)} (a2);
\end{tikzpicture}
\end{document}

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

관련 정보