好的空节点被森林 2.0 破坏了?

好的空节点被森林 2.0 破坏了?

我已经使用森林手册中的“nice empty nodes”样式来处理树木一段时间了。今天我更新了包,现在它抛出了一个错误(尽管输出似乎仍然有效)。最小示例:

\documentclass{article}
\usepackage{forest}
\forestset{
nice empty nodes/.style={
    for tree={calign=fixed edge angles},
    delay={where content={}{shape=coordinate,for parent={
                for children={anchor=north}}}{}}
},
}
\begin{document}
\begin{forest}
    [{},nice empty nodes
    [b][
    [c]
    [
    [b] [a]
    ]
    ]
    ]
\end{forest}
\end{document}

错误:“包 forest 错误:nodewalk 步入无效节点;堆栈:“,tree,tree,parent”。 \end{forest}”

有人知道如何解决这个问题吗?

答案1

正如 @cfr 指出的那样,

问题是节点遍历发生了巨大变化,无效步骤现在默认触发错误。由于根节点为空,因此它会得到很好的空节点处理,而父节点会失败,因为没有父节点。

是的,这是 定义中的一个错误nice empty nodes,所以感谢您发现并指出它。我没有发现它,因为nice empty nodes文档中的唯一示例没有将样式应用于根节点,因此文档编译得很好……

解决方案实际上非常简单(并且将包含在即将发布的小版本中),因为forest现在有了步骤siblings

\documentclass{article}
\usepackage{forest}
\forestset{
nice empty nodes/.style={
    for tree={calign=fixed edge angles},
    delay={where content={}{shape=coordinate,for siblings={anchor=north}}{}}
},
}
\begin{document}
\begin{forest}
    [{},nice empty nodes
    [b][
    [c]
    [
    [b] [a]
    ]
    ]
    ]
\end{forest}
\end{document}

请注意,该for parent={for children={...}}习语与 并不完全相同for siblings={...},因为在这种情况下不会遍历当前节点for siblings。在我们的例子中,这没有区别,因为当前节点具有坐标形状。要获得完全相同的(旧)for parent={for children={...}}行为,请说for preceding siblings={...},for current and following siblings={...}。我保证在下一个次要版本中包含 key for current and siblings... 直到现在我才意识到有这样一种情况是有意义的。

答案2

肯定是 bug?即使加载库并使用树序言中的linguistics官方代码,它也无法工作。nice empty nodes

这很不雅观,但目前应该可以工作。问题是节点遍历已经发生了巨大变化,无效步骤现在默认会触发错误。由于根为空,它会得到nice empty nodes处理并for parent失败,因为没有父节点。这不是全局禁用它,而是希望只针对此节点遍历禁用它。但是,我相信有更有效的方法。

\documentclass[tikz]{standalone}
\usepackage{forest}
\forestset{%
  nice empty nodes/.style={%
    for tree={calign=fixed edge angles},
    delay={%
      where content={}{%
        shape=coordinate,
        for nodewalk={%
          Nodewalk={%
            on invalid=fake,
          }{%
            parent,
          }{%
            for children={anchor=north},
          }
        }{},
      }{},
    },
  },
}

\begin{document}
\begin{forest}
  nice empty nodes
  [
    [b]
    [
      [c]
      [
        [b]
        [a]
      ]
    ]
  ]
\end{forest}
\end{document}

更好的空节点?

相关内容