我想将绿色弧线、标签和框添加到这棵树中。(标签将是黑色和红色,就像在不是非常最小的 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
s 放置在记住的位置(命名) \draw
它们之间有一些平行线
如果仔细观察,tikz-qtree
似乎至少有时它的树节点连接稍微偏离中心。因此,尽管样式sq
和crc
定义了最小尺寸(基本上使它们成为正方形或圆形),但这种尝试失败了,导致出现非平行线:
\node[sq] (X0) at (A0){};
\node[crc] (X1) at (C1){};
\draw[teal] (X0.south west) -- (X1.south east); % <<< no parallel line !
所以我选择的方案是:
- 改用极坐标表示法,例如
(X1.340)
(与 340 度处的节点形状的交点) - “用眼睛”调整角度
您也可以使用例如([yshift=-2mm] X1)
,但这可能不会带来真正的优势。
为了获得更统一的视觉效果,您可能还需要对树的所有节点使用有用的minimum size
或。如果这些值足够大,则除了我的 A4 矩形等之外,所有黑色矩形都将具有相同的尺寸。minimum width
\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
以下是一种方法:
- 请参阅手册第 4 章
- 放置
node
额外 \draw
之后- 您可能需要修改您的
anti
宏
除了controls
手册中给出的说明之外,我倾向于用 替换命令--
,我认为这更容易形象化,从而更容易控制。\draw
to[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
,即使文本看起来总是从该节点的右侧开始