我正在使用 qtree 包在我的文档中呈现小型内联树。在我的例子中,树节点限制为 0 或 2 个子节点。我想以某种方式在视觉上区分左右分支。理想情况下,一侧使用红色虚线,另一侧使用绿色实线,或者可能在一侧使用气泡,但是几乎任何清晰的视觉特征都足够了。
我为什么要这样做?因为在我的大型文档的其他地方,我使用更复杂的方法来绘制更大的树。在这些情况下,我总是用红色虚线和绿色实线来区分两个子节点。在我的文本中,我将这两个子节点称为“正”子节点和“负”子节点,而不是左子节点和右子节点(因为有时 graphviz 会交换右子节点和左子节点以尽量减少交叉线)。我想删除这些图表中所有关于右子节点和左子节点的提及,但由于 qtree 的这种看似限制,我无法做到。
有人能提出解决办法吗?
据 MWE 考虑以下内容。
\documentclass{article}
\usepackage{qtree}
\newcommand\bdd[1]{%
{\scriptsize\begin{tabular}[c]{@{}l@{}}$\Tree[#1]$\end{tabular}}}
\newcommand*\YLR{\bdd{.Y L R }}
\begin{document}
Simple tree \YLR and another
{\scriptsize \begin{tabular}[c]{@{}l@{}}
$\Tree[.non-string [.A ] [.B [.not-number [.L ] [.R ] ] !{\qframesubtree} [.\ C ] ] ]$
\end{tabular}} less simple.
\end{document}
以下是其当前的呈现方式。
答案1
Qtree 将分支线的绘制封装在函数中\qdraw@branches
,目的正是允许它被覆盖。由于您只使用二进制分支,因此您可以从以下定义开始,并为双分支情况添加颜色。(该函数始终绘制一个单位宽的图片;该单位将缩放到所需的任何宽度。)
\makeatletter
\def\qdraw@branches#1{\ifcase#1\relax % Zero case is unused
\or % One-branching
\begin{picture}(0,1)
\put(0,0){\line(0,1){1}}
\end{picture}%
\or % Two-branching
\begin{picture}(2,0.5)
\put(0,0){\line(2,1){1}}
\put(2,0){\line(-2,1){1}}
\end{picture}%
\else\typeout{Qtree error--- Can't handle #1-way branching}
\fi}
答案2
如果您坚持使用虚线,那么实际上没有简单的方法可以做到这一点,qtree
因为pict2e
绘制树木的包没有简单的方法来绘制虚线。如果您只想要不同颜色的边缘,使用 Alexis 建议的方法很容易做到这一点。这是一个使用的完整示例qtree
:
\documentclass{article}
\usepackage{xcolor}
\usepackage{qtree}
\makeatletter
\makeatletter
\def\qdraw@branches#1{\ifcase#1\relax % Zero case is unused
\or % One-branching
\begin{picture}(0,1)
\put(0,0){\line(0,1){1}}
\end{picture}%
\or % Two-branching
\begin{picture}(2,0.5)
\put(0,0){\color{red}\line(2,1){1}}
\put(2,0){\color{green}\line(-2,1){1}}
\end{picture}%
\else\typeout{Qtree error--- Can't handle #1-way branching}
\fi}
\begin{document}
\Tree [.A [.B [.C ] [.D ] ] [.E ] ]
\end{document}
对于虚线和更大的灵活性,您可能会考虑切换到在大多数情况下在语法方面tikz-qtree
是直接替代品的虚线。qtree
以下是采用所述方法的示例这个答案有条件地更改左边缘和右边缘的边缘选项。
\documentclass{article}
\usepackage{tikz-qtree,tikz-qtree-compat}
\newif\ifleft\lefttrue
\tikzset{
edge options/.code={
\ifleft
\tikzset{red,dashed}
\global\leftfalse%
\else
\tikzset{green}
\global\lefttrue%
\fi}
}
\makeatletter
\def\edge@adapter#1{%
\let\tikzparentnode\parentnodename
\let\tikzchildnode\nodename
\path[edge options] edge from parent #1;%
}
\makeatother
\begin{document}
\Tree [.A [.B [.C ] [.D ] ] [.E ] ]
\end{document}