假设我想展示这个表达式
a IF b OR c
b IF d AND e
c IF f OR g
作为一棵树,使用tikz-qtree
。我想做这样的事情:
\documentclass{article}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}[grow'=right]
\tikzset{level distance=2cm}
\tikzset{sibling distance=1cm}
\tikzset{every tree node/.style={anchor=base west}}
\Tree[.a
[.b
[.d ]
[.e ] ]
[.c
[.f ]
[.g ] ] ]
\end{tikzpicture}
\end{document}
上述代码生成以下树:
但是,我想在分支中添加一些装饰,显示第一个分支(从 a 到 b 和 c)是“OR”分支,其他分支是 AND 分支(从 b 开始)和 OR 分支(从 c 开始)。例如,带有标签的弧线。我在 tikz-qtree 文档中没有找到执行此操作的方法。
答案1
这个怎么样:
\documentclass{article}
\usepackage{tikz-qtree}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[grow'=right]
\tikzset{level distance=2cm}
\tikzset{sibling distance=1cm}
\tikzset{every tree node/.style={anchor=base west}}
\Tree[.\node (a) {a};
[.\node (b) {b};
[.\node (d) {d}; ]
[.\node (e) {e}; ] ]
[.\node (c) {c};
[.\node (f) {f}; ]
[.\node (g) {g}; ] ] ]
\node[red] at ($0.33*(a)+0.33*(b)+0.33*(c)$) {\textbf{OR}};
\node[red] at ($0.33*(b)+0.33*(d)+0.33*(e)$) {\textbf{AND}};
\node[red] at ($0.33*(c)+0.33*(f)+0.33*(g)$) {\textbf{OR}};
\end{tikzpicture}
\end{document}
nodes
我利用了在 qtree 中添加命名的可能性(请参阅手册第 4 部分)。然后我使用calc
提供的库TikZ
来计算“中间”的坐标,它基本上是周围坐标的加权平均值(具有相同的权重,因此0.33
)。
编辑1:这是一个绘制圆弧的变体,它使用贾斯珀·洛伊的回答这个问题:
\documentclass{article}
\usepackage{tikz-qtree}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{tkz-euclide}
\usetkzobj{all}
\newcommand{\sparc}[8]% vertex, first child, last child, relative radius, text, text options, draw options, shift
{ \coordinate (firstarm) at ($(#1)!#4!(#2)$);
\coordinate (lastarm) at ($(#1)!#4!(#3)$);
\tkzDrawArc[#7](#1,lastarm)(firstarm)
\node[#6] at ($(#1)+(#8)$) {#5};
}
\begin{document}
\begin{tikzpicture}[grow'=right]
\tikzset{level distance=2cm}
\tikzset{sibling distance=1cm}
\tikzset{every tree node/.style={anchor=base west}}
\Tree[.\node (a) {a};
[.\node (b) {b};
[.\node (d) {d}; ]
[.\node (e) {e}; ]
[.\node (e2) {e$_2$}; ]
[.\node (e3) {e$_3$}; ] ]
[.\node (c) {c};
[.\node (f) {f}; ]
[.\node (g) {g}; ]
[.\node (h) {h}; ] ] ]
\sparc{a}{b}{c}{0.7}{OR}{red}{ultra thick,color=blue!50!cyan}{1.5,0}
\sparc{b}{d}{e3}{0.6}{AND}{yellow,circle,fill=green!50!gray}{ultra thick,color=red!50!orange}{1,0}
\sparc{c}{f}{h}{0.6}{OR}{blue,circle,fill=blue!50!gray,fill opacity=0.3,text opacity=1}{ultra thick,color=green!30!gray}{1,0}
\end{tikzpicture}
\end{document}
编辑2:弧线之间的小间隙是由于.center
节点的总是用于计算。对于从左到右的图,这会更好:
\newcommand{\sparc}[8]% vertex, first child, last child, relative radius, text, text options, draw options, shift
{ \coordinate (firstarm) at ($(#1.east)!#4!(#2.west)$);
\coordinate (lastarm) at ($(#1.east)!#4!(#3.west)$);
\coordinate (vertex) at (#1.east);
\tkzDrawArc[#7](vertex,lastarm)(firstarm)
\node[#6] at ($(#1)+(#8)$) {#5};
}