我有以下forest
代码:
\documentclass{article}
\usepackage[linguistics]{forest}
\begin{document}
\begin{forest}
for tree={
if n children=0{
font=\scshape,
tier=terminal,
}{},
}
[Ġentertainment
[Ġen
[Ġ]
[en
[e]
[n]
]
]
[tertainment
[tert
[ter
[t]
[er
[e]
[r]
]
]
[t]
]
[ainment
[ain
[a]
[in
[i]
[n]
]
]
[ment
[m]
[ent
[en
[e]
[n]
]
[t]
]
]
]
]
]
\end{forest}
\end{document}
其结果为以下树:
很明显,这有一些很长的线,但这并不是绝对必要的:例如,请注意左上角有一个节点“en”,右下角也有一个节点。左边的节点显然太高了(这是由于它与根的距离较小造成的)。下面是我绘制的一个例子,表示我希望“en”节点的位置:
我想做这个自动地和对于所有节点(“er” 和 “in” 也是如此),保持叶子对齐。 这可能吗?
答案1
以下代码根据节点的“反向级别”自动分配层名称。叶子节点分配给 tier 0
,其父节点分配给 tier 1
,依此类推。
我们用 遍历树for tree children-first
,先处理子节点,再处理父节点。聚合函数.max
是一种计算tier
分支节点的 的简单方法:它遍历children
节点的 ,并计算它们的 的最大值tier
加一;因为它用作tier
( tier/.max
) 的 pfgkeys 处理程序,所以它将结果分配给父级“层”。
\documentclass{article}
\usepackage[linguistics]{forest}
\begin{document}
\begin{forest}
for tree={
if n children=0{
font=\scshape,
}{},
},
for tree children-first={
if n children=0{
tier=0,
}{
tier/.max={1+tier}{children},
},
},
[Ġentertainment
[Ġen
[Ġ]
[en
[e]
[n]
]
]
[tertainment
[tert
[ter
[t]
[er
[e]
[r]
]
]
[t]
]
[ainment
[ain
[a]
[in
[i]
[n]
]
]
[ment
[m]
[ent
[en
[e]
[n]
]
[t]
]
]
]
]
]
\end{forest}
\end{document}