使用 Forest 减少树中节点之间的距离

使用 Forest 减少树中节点之间的距离

我的 latex 文档中有许多树太大,很难使周围文本的排版看起来好看。因此,我想通过减少节点之间的距离来减少树的垂直长度。我尝试了以下解决方案线程,通过包含以下代码:

  for tree={
    l sep-=1em,
  },

唯一的影响是标记为 DP 的节点与三角形的节点 Manne 之间的距离减小了。其余部分保持不变。

我已经加载了该gb4e包,因为我在实际文档中需要它,并且与这篇文章的实际问题无关。

\documentclass{article}
\usepackage[utf8x]{inputenc}
\usepackage{forest, gb4e}

\forestset{
sn edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom{}}},
background tree/.style={for tree={text opacity=0.2,draw opacity=0.2,}},   
qtree/.style={
    baseline,
    for tree={
      parent anchor=south,
      child anchor=north,
      align=center,
      inner sep=1pt,
    }},
nice empty nodes/.style={for tree={calign=fixed edge angles},delay={where content={}{shape=coordinate,for parent={for children={anchor=north}}}{}}}
}
\tikzset{every tree node/.style={align=center,anchor=north}}
\begin{document}
\begin{exe}
\ex 
\begin{forest}
  for tree={
    l sep-=1em,
  },
qtree, nice empty nodes,
[TP
    [T]
    [\textit{v}P, 
        [AdvP
            [sneehpeslaakan, triangle]]
        [\textit{v}P
            [DP
                [Manne, triangle]]
            [{}, s sep=15pt
                [VP
                    [DP
                        [gærjah, triangle]]
                    [t{\scriptsize V}]]
                [\textit{v} \\ lohk]]]]]
\end{forest}
%\end{xlist}
\end{exe}

\end{document}

我得到以下输出:

在此处输入图片描述

答案1

问题出在nice empty nodes样式定义方式上。这里有一个解决方案,它给出了一个略有不同的定义,nice empty nodes我称之为fairly nice empty nodes。对于长串的空节点,此定义可能不太成功,但对于树中偶尔出现的空节点,它效果很好。

我对您的代码进行了一些简化,其中大部分现已纳入库中linguisticsforest我还删除了utf8x输入编码,通常不应使用它。triangle默认情况下未定义样式,但有一种roof样式是定义的,所以我改用了它。这是使用forest 来自 TeXLive 2016 的 v. 2.0.3来自 TeXLive 2017 的 v. 2.15。代码已更新以反映最近的变化

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{forest, gb4e}

\forestset{
   fairly nice empty nodes/.style={
        delay={where content={}{shape=coordinate,
              for siblings={anchor=north}}{}
              }}}
\useforestlibrary{linguistics}
\forestapplylibrarydefaults{linguistics}
\begin{document}
\begin{exe}
\ex 
\begin{forest}
fairly nice empty nodes,
[TP
    [T]
    [\textit{v}P, 
        [AdvP
            [sneehpeslaakan, roof]]
        [\textit{v}P
            [DP
                [Manne, roof]]
            [{}, s sep=15pt
                [VP
                    [DP
                        [gærjah, roof]]
                    [t{\scriptsize V}]]
                [\textit{v} \\ lohk]]]]]
\end{forest}
\end{exe}

\end{document}

代码输出

如果你真的想进一步挤压树,你可以设置l=0然后更改 的值,l sep-使其更小一些。例如,设置

for tree={l sep-=.7em,l=0}

输出结果如下:

压缩版本

Forest v.1 版本

看来您使用的是forestv.1,这就是为什么您的代码无法编译的原因。所以这里有一个使用该版本的版本forest。我在答案中保留了其他代码,因为forestv.1 已经有两年多了,而且自 2014 年以来就不再是 TeX Live 的一部分,所以其他发现这个问题的人(或者您,如果您更新的话)可能会发现较新的代码很有用。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{forest, gb4e}

\forestset{
sn edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom{}}},
background tree/.style={for tree={text opacity=0.2,draw opacity=0.2,}},   
qtree/.style={
    baseline,
    for tree={
      parent anchor=south,
      child anchor=north,
      align=center,
      inner sep=1pt,
    }},
nice empty nodes/.style={for tree={calign=fixed edge angles},delay={where content={}{shape=coordinate,for parent={for children={anchor=north}}}{}}},
fairly nice empty nodes/.style={
            delay={where content={}{shape=coordinate,for parent={
                  for children={anchor=north}}}{}}
}}
\tikzset{every tree node/.style={align=center,anchor=north}}

\begin{document}
\begin{exe}
\ex 
\begin{forest}
  for tree={
    l sep-=1em,
  },
qtree, fairly nice empty nodes,
[TP
    [T]
    [\textit{v}P, 
        [AdvP
            [sneehpeslaakan, triangle]]
        [\textit{v}P
            [DP
                [Manne, triangle]]
            [{}, s sep=15pt
                [VP
                    [DP
                        [gærjah, triangle]]
                    [t{\scriptsize V}]]
                [\textit{v} \\ lohk]]]]]
\end{forest}
\end{exe}

\end{document}

相关内容