Forest 的 \Forest* 宏:如何在树外使用节点?

Forest 的 \Forest* 宏:如何在树外使用节点?

这个问题是关于森林套餐

根据手册(22):

\begin{forest}<tree>\end{forest} 
\Forest[*]{<tree>} 

环境和无星号版本的宏引入了一个组;带星号的宏则没有,因此创建的节点可以在之后使用。(请注意,这将留下许多临时宏。但这不应该是个问题,因为它们都位于\forest命名空间中。)

默认情况下,树中的节点采用 形式命名node@id。但是,如果使用 ,name=<name>则节点将命名为<name>

鉴于此,我对此特性的可能简单的理解表明,类似于以下代码中的一种变体:

\documentclass{article}
\usepackage{forest}
\begin{document}
  \Forest*{
    [A, name=a
      [B, name=b]
      [C, name=c]
    ]
  }
  \tikz[overlay,remember picture]\draw [red] (a) -- (b) -- (c) -- (a);
  \tikz[overlay]\draw [blue] (a) -- (b) -- (c) -- (a);
  \tikz[remember picture]\draw [green] (a) -- (b) -- (c) -- (a);
  \tikz\draw [magenta] (a) -- (b) -- (c) -- (a);
\end{document}

可能会产生与此大致类似的结果:

带有红色连接线的三角形 ABC

然而,我无法弄清楚如何获得这样的东西,尽管这些节点确实可以在树的外部访问,因为我没有收到错误,而且,上述某些变体绘制了一些看起来与我的目标图像大致同构的东西:

洋红色、绿色和蓝色的同构连接线

请注意,正如上面所暗示的,如果我在环境结束后尝试引用在普通环境中创建的节点,我也期望会出现错误。但事实上,在这种情况下,我得到的行为与没有星号的forest情况相同。即:\Forest\Forest*

\documentclass{article}
\usepackage{forest}
\begin{document}
  \Forest{
    [A, name=a1
      [B, name=b1]
      [C, name=c1]
    ]
  }
  \Forest*{
    [A, name=a
      [B, name=b]
      [C, name=c]
    ]
  }
  \begin{forest}
    [A, name=a2
      [B, name=b2]
      [C, name=c2]
    ]
  \end{forest}
  \tikz[overlay,remember picture]\draw [red] (a) -- (b) -- (c) -- (a);
  \tikz[overlay]\draw [blue] (a) -- (b) -- (c) -- (a);
  \tikz[remember picture]\draw [green] (a) -- (b) -- (c) -- (a);
  \tikz\draw [magenta] (a) -- (b) -- (c) -- (a);
  \tikz[overlay,remember picture]\draw [red] (a1) -- (b1) -- (c1) -- (a1);
  \tikz[overlay]\draw [blue] (a1) -- (b1) -- (c1) -- (a1);
  \tikz[remember picture]\draw [green] (a1) -- (b1) -- (c1) -- (a1);
  \tikz\draw [magenta] (a1) -- (b1) -- (c1) -- (a1);
  \tikz[overlay,remember picture]\draw [red] (a2) -- (b2) -- (c2) -- (a2);
  \tikz[overlay]\draw [blue] (a2) -- (b2) -- (c2) -- (a2);
  \tikz[remember picture]\draw [green] (a2) -- (b2) -- (c2) -- (a2);
  \tikz\draw [magenta] (a2) -- (b2) -- (c2) -- (a2);
\end{document}

生成以下内容且无错误:

具有不同环境和宏的同构变体

这个问题由两部分组成:;)

  • 这个功能该如何使用呢?

  • 如果不是我(可能有点特殊)阅读手册时所建议的用途,那么它的预期用途到底是什么?

请注意,我可以用其他更方便的方式轻松生成目标图像。这只是一个示例,用于说明我期望如何使用该功能。

以下内容不是问题的一部分。它试图阻止进一步的回答,将问题视为“我如何绘制它?”而不是“这是为了什么以及我应该如何使用它?”

仅供记录:

\Forest{[A[B][C, tikz={\draw [red] () -- (!s) -- (!u) -- ();}]]}

将产生一棵与目标完全一样的树,即树枝更暗,因为红色覆盖了黑色,而:

\Forest{for tree={edge={draw=red}}[A[B][C, tikz={\draw [red] () -- (!s);}]]}

将产生一个与目标图像不一样的版本,因为红线颜色均匀,但如果这是一个关于如何绘制目标图像的问题,那么这可能就是我真正想要的,但事实并非如此。

答案1

因为没有引入组而留在内存中的节点\Forest*不是 tikz 的节点,而是 forest 的逻辑节点,即节点层次结构。

此功能的目的是能够在文档的多个位置构建树,或者重复使用树,如下所示。(我将在文档中包含此示例。)

\documentclass{article}
\usepackage{forest}

\begin{document}
\Forest*{
  [VP,name=VP
    [V]
    [DP]
  ]
}
\forestset{for name={VP}{for tree={s=0}}}% workaround for the bug
\Forest*{
  [TP
    [T]
    [,replace by=VP]
  ]
}
\end{document}

重复使用一棵树

(在构建这个例子时,我发现了一个错误...第二棵树中的 VP 没有被正确打包...因此需要一个解决方法。我将在即将推出的版本中修复这个错误,我可以宣布,在过去的一个月里,这个版本已经取得了很好的进展。)

更新。回答 cfr 的评论:(replace by'复制替换子树)在此示例中是合法的,并且几乎等同于replace by。只有在修改节点时才会显示差异,如下所示(或明确引用它们的id)。

\documentclass{standalone}
\usepackage{forest}

\begin{document}
\Forest*{
  [VP,name=VP
    [V]
    [DP]
  ]
}
\forestset{for name={VP}{for tree={s=0}}}% workaround for the bug
\Forest*{
  copy name template={copy of #1},
  before typesetting nodes={
    for name={VP}{content+=?},
    for name={copy of VP}{content+=!}
  }
  [TP
    [T]
    [,replace by=VP]
    [,replace by'=VP]
  ]
}
\end{document}

说明<code>替换为'</code>

相关内容