这个问题是关于森林套餐。
根据手册(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}
可能会产生与此大致类似的结果:
然而,我无法弄清楚如何获得这样的东西,尽管这些节点确实可以在树的外部访问,因为我没有收到错误,而且,上述某些变体绘制了一些看起来与我的目标图像大致同构的东西:
请注意,正如上面所暗示的,如果我在环境结束后尝试引用在普通环境中创建的节点,我也期望会出现错误。但事实上,在这种情况下,我得到的行为与没有星号的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}