我怎样才能增加树中边的长度,以便它们(至少)达到我希望赋予的forest
长度。edge label
例如,以下代码:
\documentclass{article}
\usepackage{forest}
\forestset{ew edges/.style={for tree={parent anchor = east, child anchor = west, grow' = east}}}
\begin{document}
\begin{forest} ew edges
[96
[48, edge label = {node [midway, above, sloped] {matched place} }]
[48, edge label = {node [midway, below, sloped] {unmatched place} }]
]
\end{forest}
\end{document}
生成以下树
我怎样才能使边缘(至少)达到“不匹配的地方”的长度,以便不存在这样的重叠?
答案1
包装系统不考虑边缘标签,如第 33 页所述。因此,最简单的方法是手动调整级别之间的最小距离 ( )l sep
和/或兄弟之间的最小距离 ( )。s sep
例如,将s sep+=50pt
和添加l sep+=50pt
到扩展样式中ew edges new
,将生成以下树:
或者,可以覆盖打包机制的决定。为此,您需要在打包阶段之后但在计算最终位置之前进行调整。例如,可以使用 来完成此操作before computing xy
。例如,使用新样式my edge label
来调整级别之间的距离,您可以获得如下树:
edge label
这确实要求您以不同的方式指定边缘标签。您需要使用 ,而不是直接使用 来指定它my edge label
。(显然,您可以使用不同的名称 - 但不能使用edge label
。)这是必要的,因为新样式会操纵标签来测量其宽度。然后使用它来使用毕达哥拉斯定理计算级别之间的适当距离。
请注意,第二种方法不能处理以下标签:也因为计算中涉及的尺寸太大,所以标签太长。如果您需要容纳非常长的标签,则可能应该调整计算以最小化涉及的尺寸大小。
\documentclass[border=5pt, tikz, multi, varwidth]{standalone}
\usepackage{forest}
\standaloneenv{forest}
\begin{document}
\forestset{
ew edges new/.style={
for tree={
parent anchor = east,
child anchor = west,
grow' = east,
s sep+=50pt,
l sep+=50pt
}
},
ew edges/.style={
for tree={
parent anchor = east,
child anchor = west,
grow' = east,
}
},
my edge label/.style={
if={n>.5*(n_children("!u"))}{
edge label = {node [midway, below, sloped] {#1}},
}{
edge label = {node [midway, above, sloped] {#1}},
},
TeX={\settowidth{\mylabelwidth}{#1}},
before computing xy={
if={
(l)<(sqrt((\mylabelwidth)^2 - s^2) + 10pt)
}{
l={sqrt((\mylabelwidth)^2 - s^2) + 10pt},
}{},
},
},
}
\newlength{\mylabelwidth}
\begin{forest}
ew edges new
[96
[48, edge label = {node [midway, above, sloped] {matched place} }
]
[48, edge label = {node [midway, below, sloped] {unmatched place} }
]
]
\end{forest}
\begin{forest}
ew edges
[96
[48, my edge label = matched place
]
[48, my edge label = unmatched place
]
]
\end{forest}
\end{document}