以下简单示例显示,当tikzpicture
直接将 a 用作forest
节点时,它的某些路径似乎被忽略:\node
路径似乎被忽略,而例如\draw
路径则按预期处理。获得预期结果的一种方法是预先将图片装箱(示例也说明了这一点);但是,我需要在森林中直接使用tikzpicture
包含路径的复杂 s,\node
而无需预先将它们装箱。这可能吗?
\documentclass{article}
\usepackage{forest}
\newsavebox\mybox
\newcommand\test{\tikz{\node[fill=cyan!60] (a) {a};\draw[ultra thick,orange] (a.north west) -- (a.south east);}}
\savebox\mybox{\test}
\begin{document}
\begin{forest}
[\test
[\usebox\mybox
[\test]
[\test]
]
[\test
[\usebox\mybox]
[\usebox\mybox]
]
]
\end{forest}
\end{document}
答案1
这是一个使用键tikz=
添加节点规范的绘图部分的解决方案。我已将其放入节点的样式中。
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
crossed/.style={fill=cyan!60, tikz={\draw[ultra thick,orange] (!.north west) -- (!.south east);}}
[A,for tree=crossed
[B
[C ]
[D ]
]
[E
[F ]
[G ]
]
]
\end{forest}
\end{document}
答案2
它是可以通过选项\node
直接在 中使用命令。不过有几个注意事项:forest
node format
节点 并且只能在 中给出节点
node format
。特别是,在节点之后添加\draw
或任何都是不可能的。这是因为节点使用 PGF 的延迟节点定位 ( - )排版到临时框中(以便进行测量),这只能延迟节点的定位。\path
node format
\pgfpositionnodelater
\pgfpositionnodenow
tikz
因此,据我所知,Alan 建议使用选项是向节点添加一些 TikZ 代码的唯一通用方法。(并且使用相对节点名称来构造路径,例如(!.north west) -- (!.south east)
,这也是我在下面所做的。)宏的名称
\node
必须与 forest 的name
选项匹配。(或者,更准确地说,它们必须在 处匹配draw tree stage
。)否则,一切都会变得一团糟。命令
\node
前面node options
必须有\noexpand
。为什么?node format
必须引用节点的名称,因此它将包含\forestoption{name}
,默认情况下,它还包含\forestoption{node options}
和\forestoption{content format}
。这些宏必须在“调用” 之前展开\node
(TikZ 不会“动态”展开它们),这正是在节点(延迟)排版之前发生的事情。但是,宏\node
本身显然不应展开。
免责声明结束,下面是代码。(我已经定义了样式node format'
以方便输入节点规范。此样式将出现在即将推出的 v1.1 版软件包中。)
\documentclass{article}
\usepackage{forest}
\forestset{
node format'/.style={
node format={\noexpand\node(\forestoption{name})#1;}
},
test/.style={
node format'={[fill=cyan!60] {a}},
tikz={\draw[ultra thick,orange] (.north west) -- (.south east);},
},
}
\begin{document}
\begin{forest}
for tree=test
[
[
[]
[]
]
[
[]
[]
]
]
\end{forest}
\end{document}
PS:抱歉,回答晚了一年半...我完全错过了这个帖子。