Agregar arcos al árbol dibujado con tikz-qtree

Agregar arcos al árbol dibujado con tikz-qtree

Quiero agregar arcos, etiquetas y cuadros verdes a este árbol. (Las etiquetas serán negras y rojas, como en el no mínimo MWE). No necesito una solución programática. Puedo terminar el trabajo si veo cómo hacerlo una vez para cada uno de los tres tipos de arcos verdes.

ingrese la descripción de la imagen aquí

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}

Respuesta1

Como unsiguiente pregunta, y al ser un tema diferente, aquí hay una respuesta separada con un enfoque diferente.

Ideas básicas:

  • presentar named nodescomomostrado antes
  • definir útil styles, para ser utilizado con el siguiente elemento
  • coloque nuevos \nodemensajes con estos estilos en las posiciones recordadas (nombradas)
  • \drawalgunas líneas entre ellos para los paralelos

Si se mira con atención, tikz-qtreeparece que los nodos del árbol se conectan ligeramente descentrados, al menos a veces. Entonces, aunque los estilos sqdefinen crcun tamaño mínimo (básicamente haciéndolos un cuadrado o un círculo), este intento falla, lo que resulta en una línea no paralela:

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

Entonces la alternativa que elijo es:

  • usando notación polar en su lugar, como (X1.340)(intersección con forma de nodos a 340 grados)
  • ajustando ángulos "a ojo"

También puedes usar eg ([yshift=-2mm] X1), pero esto probablemente no resultará en una ventaja real.

Para obtener un resultado visual más uniforme, quizás también debería requerir un útil minimum sizeo minimum widthpara todos los nodos del árbol. Si estos valores son lo suficientemente grandes, todos los rectángulos negros tendrán las mismas dimensiones, excepto el 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}

Respuesta2

Aquí tienes una forma de hacerlo:

  • ver cap. 4 en el manual
  • colocar nodes adicionales
  • \drawmás tarde
  • es posible que necesites modificar tu anti-macro

resultado

Además de la controlsdeclaración que figura en el manual, tiendo a preferir reemplazar --un \drawcomando por to[out=angle,in=angle], que creo que es más fácil de visualizar y, por lo tanto, 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}

PD

Aunque puedes usar tu \antimacro dentro de un nodo, probablemente no sea la mejor manera de hacerlo:

...
        \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}};en la parte inferior izquierda
  • dibuja una línea de puntos azul hasta (A0)
  • coloca un nodo en una posición pos=.7a lo largo de ese camino (que aquí es solo una línea recta)
  • inserta un nodo con texto allí,below
  • lo ancla west, es decir, hace que el texto parezca comenzar siempre desde el lado derecho de este nodo

resultado2

información relacionada