森林:自下而上逐级增加水平分离

森林:自下而上逐级增加水平分离

我使用了qtree一段时间,虽然它能做但不能做的事情不多forest,但有一个qtree默认效果我非常喜欢,那就是它会自动从下往上增加树中节点之间的距离,这是我以前无法做到的forest。这使得树中(大致)较高的节点间隔开一点,而较低的节点则靠得更近。

下面是一个 MWE,演示了我正在谈论的内容;首先,有一qtree棵树,然后我尝试forest通过使用只读选项来进行笨拙的近似level

\documentclass{article}
\usepackage{qtree}
\usepackage[linguistics]{forest}
\begin{document}

\Tree [.x x [.x x [.x x [.x x [.x x x ]]]]]

\begin{center}
\begin{forest} 
for tree={
    l sep=0.8ex,
    l sep+=(1/((level)+1))*1.28^1.5ex, % inter-node distance is relative to level
    l-=3ex, % constrains spacing of nodes
    inner sep=0,
    calign=fixed edge angles, 
    calign angle=63,
},
%
%        
[x[x][x[x][x[x][x[x][x[x][x]]]]]]
%
%
\end{forest}
\end{center}

\end{document}

我的问题如下:有没有适当的方法来实现这种效果forest

我的粗略印象是,它qtree有一个系统,可以自动从下往上在每一级添加一点水平分离,即,它以某种方式计算任何给定的一组兄弟与树中最低后代的绝对距离。

阅读文档后,似乎forest使用只读选项跟踪节点的绝对级别level,但这是自上而下计算的。了解是否有办法计算节点相对于其最远直接后代的级别可能对我有帮助forest,但到目前为止,我还没能弄清楚。或者也许还有其他原因导致它一开始就行不通。

答案1

计算节点最远后代在层级方面的距离相当简单。在非花式树中,我们可以在处理的早期完成此操作。如果您的树改变了其结构,您显然需要在结构最终确定后进行计算。

我们首先定义几个count选项forest

\forestset{%
  declare count={level of most distant descendant}{0},
  declare count={steps to most distant descendant}{0},
}

然后,我们可以将树的前言中的这些键与forests 个aggregate函数之一一起使用,.max并稍微forestmath计算一下我们想要的数字。

  before typesetting nodes={%
    where n children=0{}{% we don't calculate anything for terminal nodes which have no descendants by definition
      level of most distant descendant/.max={ > O {level} }{descendants},% get the maximum level of the node's descendants
      steps to most distant descendant/.process={ OOw2 {level of most distant descendant}{level}{#1-#2} },% subtract the node's own level to get the most distant descendant's distance in terms of number of levels

此示例添加数字作为标签以便于说明,但您可能希望使用它来调整树的格式。

      label/.process={ Ow1 {steps to most distant descendant}{{[red, font=\tiny]east:#1}}},
    }
  }

标记节点

\documentclass[]{standalone}
\usepackage[linguistics]{forest}
\forestset{%
  declare count={level of most distant descendant}{0},
  declare count={steps to most distant descendant}{0},
}
\begin{document}

\begin{forest} 
  for tree={
    l sep'=0.8ex,
    l sep+=(1/((level)+1))*1.28^1.5ex, % inter-node distance is relative to level
    l'-=3ex, % constrains spacing of nodes
    inner sep=0pt,
    calign=fixed edge angles, 
    calign angle=63,
  },
  before typesetting nodes={%
    where n children=0{}{%
      level of most distant descendant/.max={ > O {level} }{descendants},
      steps to most distant descendant/.process={ OOw2 {level of most distant descendant}{level}{#1-#2} },
      label/.process={ Ow1 {steps to most distant descendant}{{[red, font=\tiny]east:#1}}},
    }
  }
  [x[x][x[x][x[x][x[x][x[x][x]]]]]]
\end{forest}

\end{document}

当然,如果您的树都是如此简单的结构,那么您可以毫不费力地获得所需的数字,因为所有具有后代的节点都共享一对最远后代。然而,由于这通常不适用于树,因此我们必须为每个具有后代的节点找到最远的后代。

相关内容