
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.
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 nodes
comomostrado antes - definir útil
styles
, para ser utilizado con el siguiente elemento - coloque nuevos
\node
mensajes con estos estilos en las posiciones recordadas (nombradas) \draw
algunas líneas entre ellos para los paralelos
Si se mira con atención, tikz-qtree
parece que los nodos del árbol se conectan ligeramente descentrados, al menos a veces. Entonces, aunque los estilos sq
definen crc
un 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 size
o minimum width
para 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.
\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
node
s adicionales \draw
más tarde- es posible que necesites modificar tu
anti
-macro
Además de la controls
declaración que figura en el manual, tiendo a preferir reemplazar --
un \draw
comando 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 \anti
macro 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=.7
a 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