我已经使用森林手册中的“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}