tikz-qtree로 그린 트리에 호 추가

tikz-qtree로 그린 트리에 호 추가

이 트리에 녹색 호, 라벨 및 상자를 추가하고 싶습니다. (레이블은 최소한의 MWE에서와 같이 검은색과 빨간색으로 표시됩니다.) 프로그래밍 방식의 솔루션이 필요하지 않습니다. 녹색 호 3종 각각 하나씩 어떻게 하는지 보면 작업을 끝낼 수 있어요.

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

MWE:

\documentclass{standalone}
\usepackage{tikz-qtree}
\newcommand{\anti}[1]{%
    \ensuremath{{\color{red}\overline{#1}}}%
}
\newcommand{\ee}[1]{%
    node[midway,left] {#1}
}
\begin{document}
\begin{tikzpicture}[every tree node/.style={draw,rectangle,align=center},
   level distance=1.5cm,sibling distance=0.5cm, 
   edge from parent path={(\tikzparentnode) -- (\tikzchildnode)}]
  \Tree [.0
    \edge \ee{1};
    [.1
      \edge \ee{1};
      [.2
        \edge \ee{1};
        [.3
          \edge \ee{1}; 4
          \edge \ee{\anti{2}}; \anti{5}
        ]
        \edge \ee{\anti{2}};
        [.\anti{4}
          \edge \ee{1}; \anti{5}
          \edge \ee{\anti{2}}; 6
        ]
      ]
      \edge \ee{\anti{2}};
      [.\anti{3}
        \edge \ee{1};
              [.\anti{4}
                \edge \ee{1}; \anti{5}
                \edge \ee{\anti{2}}; 6
              ]
              \edge \ee{\anti{2}};
              [.5
                \edge \ee{1}; 6
                \edge \ee{\anti{2}}; \anti{7}
              ]
      ]
    ]
%    second half
    \edge \ee{\anti{2}};          
    [.\anti{2}
      \edge \ee{1};
      [.\anti{3}
        \edge \ee{1};
              [.\anti{4}
                \edge \ee{1}; \anti{5}
                \edge \ee{\anti{2}}; 6
              ]
              \edge \ee{\anti{2}};
              [.5
                \edge \ee{1}; 6
                \edge \ee{\anti{2}}; \anti{7}
              ]
      ]
      \edge \ee{\anti{2}};
            [.4
              \edge \ee{1};
              [.5
                \edge \ee{1}; 6
                \edge \ee{\anti{2}}; \anti{7}
              ]
              \edge \ee{\anti{2}};
                    [.\anti{6}
                \edge \ee{1}; \anti{7}
                \edge \ee{\anti{2}}; 8
                    ]
              ]
    ]
    ]
  ]
\end{tikzpicture}
\end{document}

답변1

로서후속 질문, 그리고 다른 주제이므로 초점이 다른 별도의 답변이 있습니다.

기본 아이디어:

  • named nodes다음 과 같이 소개하다이전에 표시됨
  • 유용한 정의 styles, 다음 항목과 함께 사용
  • \node기억된 위치(이름이 지정됨)에 이러한 스타일을 사용하여 새 항목을 배치합니다.
  • \draw평행선을 위해 그들 사이에 몇 개의 선이 있습니다.

주의 깊게 살펴보면 tikz-qtree적어도 가끔은 트리 노드가 중심에서 약간 벗어나 연결되어 있는 것처럼 보입니다. 따라서 스타일 sqcrc최소 크기 정의(기본적으로 정사각형 또는 원으로 만들기)가 실패하여 평행하지 않은 선이 생성됩니다.

    \node[sq] (X0) at (A0){};   
    \node[crc] (X1) at (C1){}; 
    \draw[teal] (X0.south west) -- (X1.south east); % <<< no parallel line !

그래서 제가 선택한 대안은 다음과 같습니다.

  • 대신 극 표기법을 사용합니다. 예를 들어 (X1.340)(340도 노드 모양의 교차점)
  • "눈으로" 각도 조정

eg 를 사용할 수도 있지만 ([yshift=-2mm] X1)실제로 이점이 발생하지는 않습니다.

보다 균일한 시각적 결과를 얻으려면 트리의 모든 노드에 대해 유용한 minimum size또는가 필요할 수도 있습니다 . minimum width이 값이 충분히 크면 A4 직사각형을 제외하고 모든 검은색 직사각형의 크기가 동일합니다.

결과

\documentclass[border=3mm]{standalone}  % <<<
\usepackage{tikz}   % <<< see manual
\usepackage{tikz-qtree}
\newcommand{\anti}[1]{%
    \ensuremath{{\color{red}\overline{#1}}}%
}
\newcommand{\ee}[1]{%
    node[midway,left] {#1}
}
\begin{document}
\begin{tikzpicture}[
    every tree node/.style={draw,rectangle,align=center},
    level distance=1.5cm,
    sibling distance=0.5cm, 
    edge from parent path={(\tikzparentnode) -- (\tikzchildnode)},
    sq/.style ={draw=teal!100!black!80, minimum size=9mm},
    crc/.style={draw=teal!100!black!80, minimum size=8mm,circle},
  ]
  \Tree [.\node(A0){0}; % <<<
    \edge \ee{1};
    [.\node(C1){1}; % <<<
      \edge \ee{1};
      [.2
        \edge \ee{1};
        [.3
          \edge \ee{1}; 4
          \edge \ee{\anti{2}}; \anti{5}
        ]
        \edge \ee{\anti{2}};
        [.\node(B4){\anti{4}};  % <<<
          \edge \ee{1}; \anti{5}
          \edge \ee{\anti{2}}; 6
        ]
      ]
      \edge \ee{\anti{2}};
      [.\anti{3}
        \edge \ee{1};
              [.\anti{4}
                \edge \ee{1}; \anti{5}
                \edge \ee{\anti{2}}; 6
              ]
              \edge \ee{\anti{2}};
              [.5
                \edge \ee{1}; 6
                \edge \ee{\anti{2}}; \anti{7}
              ]
      ]
    ]
%    second half
    \edge \ee{\anti{2}};          
    [.\anti{2}
      \edge \ee{1};
      [.\anti{3}
        \edge \ee{1};
              [.\anti{4}
                \edge \ee{1}; \anti{5}
                \edge \ee{\anti{2}}; 6
              ]
              \edge \ee{\anti{2}};
              [.5
                \edge \ee{1}; 6
                \edge \ee{\anti{2}}; \anti{7}
              ]
      ]
      \edge \ee{\anti{2}};
            [.\node(A4){A4};    % <<<
              \edge \ee{1};
              [.5
                \edge \ee{1}; 6
                \edge \ee{\anti{2}}; \anti{7}
              ]
              \edge \ee{\anti{2}};
                    [.\anti{6}
                \edge \ee{1}; \anti{7}
                \edge \ee{\anti{2}}; 8
                    ]
              ]
    ]
    ]
  ]
  
    % ~~~ extra-nodes and connectors ~~~~~~
    \node[sq] (X0) at (A0){};   
    \node[crc] (X1) at (C1){}; 
    \draw[teal] (X0.south west) -- (X1.340);    
    
    
    % ~~~ some connectors ~~~~~~~~~
    \draw[teal,dashed] (A0) -- (A4);
    \draw[teal,
          loosely dashed, <->] 
          (A0) to[out=-10,in=90] node[sloped,above]{off-road}(A4);
%   \draw[dotted,blue] (B4) -- node[below,pos=.7,anchor=west]{note!}(A0);
\end{tikzpicture}
\end{document}

답변2

이를 수행하는 방법은 다음과 같습니다.

  • ch를 참조하십시오. 설명서에 4개
  • node추가 로 배치
  • \draw나중에
  • anti-macro를 수정해야 할 수도 있습니다

결과

controls매뉴얼에 제공된 설명 외에도 나는 명령을 --로 대체하는 것을 선호하는 경향이 있는데 , 이는 시각화하기 쉽고 제어하기가 더 쉽다고 생각합니다.\drawto[out=angle,in=angle]

\documentclass{standalone}
\usepackage{tikz}   % <<< see manual
\usepackage{tikz-qtree}
\newcommand{\anti}[1]{%
    \ensuremath{{\color{red}\overline{#1}}}%
}
\newcommand{\ee}[1]{%
    node[midway,left] {#1}
}
\begin{document}
\begin{tikzpicture}[every tree node/.style={draw,rectangle,align=center},
   level distance=1.5cm,sibling distance=0.5cm, 
   edge from parent path={(\tikzparentnode) -- (\tikzchildnode)}]
  \Tree [.\node(A0){A0};    % <<<
    \edge \ee{1};
    [.1
      \edge \ee{1};
      [.2
        \edge \ee{1};
        [.3
          \edge \ee{1}; 4
          \edge \ee{\anti{2}}; \anti{5}
        ]
        \edge \ee{\anti{2}};
        [.\anti{4}
          \edge \ee{1}; \anti{5}
          \edge \ee{\anti{2}}; 6
        ]
      ]
      \edge \ee{\anti{2}};
      [.\anti{3}
        \edge \ee{1};
              [.\anti{4}
                \edge \ee{1}; \anti{5}
                \edge \ee{\anti{2}}; 6
              ]
              \edge \ee{\anti{2}};
              [.5
                \edge \ee{1}; 6
                \edge \ee{\anti{2}}; \anti{7}
              ]
      ]
    ]
%    second half
    \edge \ee{\anti{2}};          
    [.\anti{2}
      \edge \ee{1};
      [.\anti{3}
        \edge \ee{1};
              [.\anti{4}
                \edge \ee{1}; \anti{5}
                \edge \ee{\anti{2}}; 6
              ]
              \edge \ee{\anti{2}};
              [.5
                \edge \ee{1}; 6
                \edge \ee{\anti{2}}; \anti{7}
              ]
      ]
      \edge \ee{\anti{2}};
            [.\node(A4){A4};    % <<<
              \edge \ee{1};
              [.5
                \edge \ee{1}; 6
                \edge \ee{\anti{2}}; \anti{7}
              ]
              \edge \ee{\anti{2}};
                    [.\anti{6}
                \edge \ee{1}; \anti{7}
                \edge \ee{\anti{2}}; 8
                    ]
              ]
    ]
    ]
  ]
    % ~~~ some connectors ~~~~~~~~~
    \draw[teal,dashed] (A0) -- (A4);
    \draw[teal,
          loosely dashed, <->] 
          (A0) to[out=-10,in=90] node[sloped,above]{off-road}(A4);
    
\end{tikzpicture}
\end{document}

추신

노드 내부에서 매크로를 사용할 수 있지만 \anti아마도 최선의 방법은 아닐 것입니다.

...
        \edge \ee{\anti{2}};
        [.\node(B4){\anti{4}};  % <<<
          \edge \ee{1}; \anti{5}
          \edge \ee{\anti{2}}; 6
        ]
...
    \draw[dotted,blue] (B4) -- node[below,pos=.7,anchor=west]{note!}(A0);
\end{tikzpicture}
\end{document}

이 코드는:

  • \node(B4){\anti{4}};왼쪽 아래로 정의
  • (A0)에 파란색 점선을 그립니다.
  • 해당 경로를 따라 위치에 노드를 배치합니다 pos=.7(여기서는 직선임).
  • 거기에 텍스트가 있는 노드를 삽입합니다.below
  • 고정 west하면 텍스트가 항상 이 노드 오른쪽에서 시작하는 것처럼 표시됩니다.

결과 2

관련 정보