Adicione arcos à árvore desenhada com tikz-qtree

Adicione arcos à árvore desenhada com tikz-qtree

Quero adicionar arcos verdes, rótulos e caixas a esta árvore. (Os rótulos serão pretos e vermelhos, como no MWE não muito mínimo). Não preciso de uma solução programática. Posso terminar o trabalho se descobrir como fazê-lo uma vez para cada um dos três tipos de arcos verdes.

insira a descrição da imagem aqui

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}

Responder1

Como umquestão a seguire sendo um tópico diferente, aqui está uma resposta separada com um foco diferente.

Ideias básicas:

  • introduzirnamed nodes comomostrado antes
  • definir útilstyles , para ser usado com o próximo item
  • coloque novo\node s com esses estilos nas posições lembradas (nomeadas)
  • \drawalgumas linhas entre eles para os paralelos

Se você olhar com atenção, tikz-qtreeparece conectar os nós da árvore ligeiramente fora do centro, pelo menos às vezes. Portanto, embora os estilos sqdefinam crcum tamanho mínimo (basicamente tornando-os um quadrado ou círculo), essa tentativa falha, resultando em uma linha não paralela:

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

Então a alternativa que escolho é:

  • usando notação polar, como(X1.340) (interseção com formato de nós em 340 graus)
  • ajustando ângulos "a olho nu"

Você também pode usar, por exemplo([yshift=-2mm] X1) , mas isso provavelmente não resultará em uma vantagem real.

Para um resultado visual mais uniforme talvez você também deva exigir um útil minimum sizeou minimum widthpara todos os nós da árvore. Se esses valores forem grandes o suficiente, todos os retângulos pretos terão as mesmas dimensões, exceto o meu A4 etc.

resultado

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

Responder2

Esta é uma maneira de fazer isso:

  • veja cap. 4 no manual
  • coloque nodes extras
  • \drawmais tarde
  • você pode precisar modificar seu anti-macro

resultado

Além da controlsafirmação dada no manual, tendo a preferir a substituição --de um \drawcomando por to[out=angle,in=angle], que considero mais fácil de visualizar e, portanto, de controlar.

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

PS

Embora você possa usar sua \antimacro dentro de um nó, provavelmente não é a melhor maneira de fazer isso:

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

Este código:

  • define \node(B4){\anti{4}};no canto inferior esquerdo
  • desenha uma linha pontilhada azul para (A0)
  • coloca um nó na posição pos=.7ao longo desse caminho (que é apenas uma linha reta aqui)
  • insere um nó com texto lá,below
  • ancora-o west, ou seja, faz com que o texto pareça começar sempre a partir deste nó do lado direito

resultado2

informação relacionada