是否可以直接在森林中使用 \node 路径?

是否可以直接在森林中使用 \node 路径?

以下简单示例显示,当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直接在 中使用命令。不过有几个注意事项:forestnode format

  1. 节点 并且只能在 中给出节点node format。特别是,在节点之后添加\draw或任何都是不可能的。这是因为节点使用 PGF 的延迟节点定位 ( - )排版到临时框中(以便进行测量),这只能延迟节点的定位。\pathnode format\pgfpositionnodelater\pgfpositionnodenow

    tikz因此,据我所知,Alan 建议使用选项是向节点添加一些 TikZ 代码的唯一通用方法。(并且使用相对节点名称来构造路径,例如(!.north west) -- (!.south east),这也是我在下面所做的。)

  2. 宏的名称\node必须与 forest 的name选项匹配。(或者,更准确地说,它们必须在 处匹配draw tree stage。)否则,一切都会变得一团糟。

  3. 命令\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:抱歉,回答晚了一年半...我完全错过了这个帖子。

相关内容