我想知道是否有可能让 TikZ 树以类似于自然演绎(证明)树的方式呈现。具体来说,我想要一棵树,它不是从父级到子级的边缘,而是在每个子树上有水平线(假设树向上或向下生长)。
我对 TikZ 还不熟悉,目前最好的解决方案是绘制没有边的树,然后使用库fit
为所有子树构建边界框,然后使用边界框的锚点画线,这并不是一个令人满意的解决方案。
(我怀疑我可以使用链条,但据我所知,你会失去树的便捷符号。)
编辑:如果可以方便地以某种\foreach
方式遍历树节点,那么繁琐的部分至少可以自动化,这样的事情可能吗?
编辑:我想人们可以对其进行调整level distance
以使边缘水平,但这感觉像是一次黑客攻击。
编辑:这是我所追求的一个例子
制作
\begin{tikzpicture}[grow'=up,level distance=4ex,
edge from parent/.code={},
level/.style={sibling distance=10em/#1}]
\node (A) {A}
child { node (B) {B}
child { node (D) {D} }
child { node (E) {E} } }
child { node (C) {C}
child { node (F) {F} }
child { node (G) {G}
child { node (H) {H} }
child { node (I) {I} }
child { node (J) {J} } } } ;
\node (SubA) [fit=(B) (C)] {};
\node (SubB) [fit=(D) (E)] {};
\node (SubC) [fit=(F) (G)] {};
\node (SubG) [fit=(H) (I) (J)] {};
\foreach \root in {SubA, SubB, SubC, SubG}{
\draw [thick] (\root.south west) -- (\root.south east);
};
\end{tikzpicture}
答案1
您可以指定产生水平线。以下是从库中的edge from parent path
预定义样式改编而来的样式:edge from parent fork up
trees
\documentclass[oneside]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
edge from parent path={
(\tikzparentnode\tikzparentanchor)
+(0pt,.5\tikzleveldistance)
-- (0pt,-.5\tikzleveldistance -| \tikzchildnode\tikzchildanchor)
-- +(0.25cm,0pt)
-- +(-0.25cm,0pt)
},
grow'=up,level distance=4ex,
level/.style={sibling distance=10em/#1}]
\node (A) {A}
child { node (B) {B}
child { node (D) {D} }
child { node (E) {E} } }
child { node (C) {C}
child { node (F) {F} }
child { node (G) {G}
child { node (H) {H} }
child { node (I) {I} }
child { node (J) {J} } } } ;
\end{tikzpicture}
\end{document}