如何将森林中的边缘延长至边缘标签的长度?

如何将森林中的边缘延长至边缘标签的长度?

我怎样才能增加树中边的长度,以便它们(至少)达到我希望赋予的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}

相关内容