我在 LATEX 中画树。这个qtree
库似乎是我需要的,但是父级总是被放置在其子级的中心,如下所示:
parent
/ \
child_1 child_2
(我是新用户,没有足够的声誉来发布图片。)
我想要的是一棵像这样生长正常的树:
root -- child_1 -- grandchild_1_1
\- child_2
\- child_3 -- grandchild_3_1
\- grandchild_3_2 -- great-grandchild_3_2_1
\- child_4 -- grandchild_4_1
旋转qtree
到右增长是不够的,因为父节点垂直对齐到它们的子节点的中心,但我需要它们保持在其子树的顶部。
我尝试过trees
TikZ 库,它允许自定义“增长函数”来指定子节点的位置。但是它不考虑子树的大小,因此在这种情况下child_4
会紧跟在 之下child_3
,grandchild_4_1
与 重叠grandchild_3_2
。
有没有一种简单的方法可以“禁用”父级居中qtree
?或者有没有更好的解决方案(可能是编写我自己的宏)?
答案1
我不确定这是否是您想要的,但这里有一个使用该forest
包的解决方案。它提供了一个对齐参数,用于对齐节点的子节点,这可以满足您的大部分需求。我不知道您是否想要方形边缘,但它们似乎更适合这种树,(在屏幕截图中,线条看起来很奇怪,但这是屏幕渲染的产物)。我添加了一个简单的替代方案,没有方形边缘看起来更漂亮一些。
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
grow right/.style={for tree={%
calign=last,
grow=east,
,s sep=.5cm,
parent anchor=east,
child anchor=west,
edge path={\noexpand\path[\forestoption{edge}]
(!u.parent anchor) -- +(0pt,-10pt) |- (.child anchor)
\forestoption{edge label};}
}
}
,grow right
[Root [Child1 ]
[Child2
[GChild1 ]
[Gchild2 ]
[GChild3 ]
]
[Child3
[Gchild4 ]
[Gchild5 ]
]
]
\end{forest}
\hfill
\begin{forest}
[Root,for tree={calign=last,grow=east,draw, parent anchor=east,child anchor=west} [Child1 ]
[Child2
[GChild1 ]
[Gchild2 ]
[GChild3 ]
]
[Child3
[Gchild4 ]
[Gchild5 ]
]
]
\end{forest}
\end{document}
编辑:请注意,由于坐标为逆时针方向,子节点的排列顺序是相反的。使用块calign=first, reversed=true
中的选项for tree = {...}
可以生成所需的精确树,如下所示:
答案2
这只是Alan Munn 的回答它使用edges
当前版本的 Forest 的库和其他功能。因此需要版本 2+。
\documentclass[tikz,border=10pt,multi,rgb]{standalone}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
for tree={
grow'=0,
parent anchor=children,
child anchor=parent,
anchor=parent,
if n children=0{folder}{},
edge path'={(!u.parent anchor) -- ++(5pt,0) |- (.child anchor)},
},
where n=1{
calign with current edge
}{},
[Root
[Child1]
[Child2
[GChild1]
[Gchild2]
[GChild3]
]
[Child3
[Gchild4 ]
[Gchild5 ]
]
]
\end{forest}
\end{document}
此代码生成树的平方边版本:
我认为路径起点处(垂直线之前)的小偏移看起来更整洁一些,但如果愿意,可以通过将边缘路径的定义更改为来消除这一点
edge path'={(!u.parent anchor) |- (.child anchor)},
或者,完全删除此行将导致使用默认路径的树: