如何为 tikz-qtree 分支添加装饰(例如,创建 AND 分支和 OR 分支)?

如何为 tikz-qtree 分支添加装饰(例如,创建 AND 分支和 OR 分支)?

假设我想展示这个表达式

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

在此处输入图片描述

相关内容