指定森林中每条线的长度

指定森林中每条线的长度

以下面的代码为例:

\documentclass{article}
\usepackage{forest, amsmath}
\begin{document}
    \begin{forest} for tree = {parent anchor = south, child anchor = north, s sep = 0em}
        [, phantom
            [a]
            [r]
            [c]
            [h]
            [i]
            [p]
            [$\stackrel{*}{\text{e}}$
                [$\stackrel{*}{\text{H}}$]
            ]
            [l]
            [a
                [L]
            ]
            [g]
            [o]
        ]
    \end{forest}
\end{document}

在此处输入图片描述

它在两个带星号的元素之间以及a和之间创建了一条关联线L。为了得到字符上方的星号,我不得不进入数学模式(这让我很烦,但这是推荐的方法)。

但是星号增加了H高度,所以字符L与组合顶部对齐H + *。显然它看起来不能那样。

一个简单的解决方法是,在上方添加一个幻影星L,用$\stackrel{\phantom{*}}{\text{L}}$。我得到了这个:

在此处输入图片描述

a这样看起来好多了,但现在从到 的线L太短了。它应该与 的北边缘距离L和另一条线与 的北边缘距离一样近*

我认为正确的做法是手动指定箭头的长度。我该怎么做?或者有更好的解决方案吗?

答案1

最简单的修复方法(假设您的真实树中没有隐藏的复杂性)可能是将某一级别的所有节点放在一个级别中,tier并使用 锚定所有节点mid

对齐节点

\documentclass[border=10pt]{standalone}
\usepackage[linguistics]{forest}
\usepackage{amsmath}
\begin{document}
\begin{forest}
  for tree={%
    s sep'=0em,
    tier/.option=level,
    anchor=mid,
  },
  [, phantom
    [a]
    [r]
    [c]
    [h]
    [i]
    [p]
    [$\stackrel{*}{\text{e}}$
      [$\stackrel{*}{\text{H}}$]
    ]
    [l]
    [a
      [L]
    ]
    [g]
    [o]
  ]
\end{forest}
\end{document}

答案2

有两个参数ll sep。 参数l尝试使子节点的参考点保持相同的垂直距离,而l sep确保父节点和子节点之间的距离最小。H带星号的高度较大,因此由于 而向下移动l sep

在这种情况下,设置为零可能就足够了l sep(假设没有具有异常大高度的节点)。

下面的示例也使用了不同的方法,将星星放在字母上方,以避免使用 的方法增加的额外高度\stackrel

\documentclass{article}
\usepackage{forest}

\newcommand*{\starontop}[1]{%
  \begingroup
    \renewcommand*{\arraystretch}{0}%
    \begin{tabular}[b]{@{}c@{}}\scriptsize*\\#1\end{tabular}%
  \endgroup
}

\begin{document}
    \begin{forest} for tree = {l sep=0pt}
        [, phantom
            [a]
            [r]
            [c]
            [h]
            [i]
            [p]
            [\starontop{e}
                [\starontop{H}]
            ]
            [l]
            [a
                [L]
            ]
            [g]
            [o]
        ]
    \end{forest}
\end{document}

结果

答案3

尝试使用 l sep:

\documentclass{article}
\usepackage{forest, amsmath}
\begin{document}
    \begin{forest} for tree = {parent anchor = south, child anchor = north, s sep = 0em, }
        [, phantom
            [a]
            [r]
            [c]
            [h]
            [i]
            [p]
            [$\stackrel{*}{\text{e}}$
                [$\stackrel{*}{\text{H}}$]
            ]
            [l]
            [a,for tree={l sep= 0.62cm}
               [L]
            ]
            [g]
            [o]
        ]
    \end{forest}
\end{document}

结果:

在此处输入图片描述

编辑

问题是,在 g 的子节点(如果有一个或多个)中,您必须重新定义 l sep。之后... o 也需要不同的 l sep。但是这样它就适用于多个子节点:

\documentclass{article}
\usepackage{forest, amsmath}
\begin{document}
    \begin{forest} for tree = { parent anchor = south, child anchor = north,s sep = 0em,}
        [,phantom
            [a]
            [r]
            [c]
            [h]
            [i]
            [p]
            [$\stackrel{*}{\text{e}}$
                [$\stackrel{*}{\text{H}}$]
            ]
            [l]
            [a,for tree={l sep= 0.66cm}
               [L] [M]
            ]
            [g,for tree={l sep= 0.60cm}
             [G] [F]
            ]
            [o]
            [m,for tree={l sep= 0.66cm}
            [S][J]]
        ]
    \end{forest}
\end{document}

相关内容