![在新环境中使用 Forest 包](https://linux22.com/image/306176/%E5%9C%A8%E6%96%B0%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8%20Forest%20%E5%8C%85.png)
我正在尝试使用forest
包来绘制电路,所以我想定义一个“电路”环境,它是环境的包装器forest
。但定义newenvironment
会遇到问题。这是一个最小的工作示例:
\documentclass{article}
\usepackage{forest}
\newenvironment{cc}{\begin{forest}}{\end{forest}}
\begin{document}
\begin{cc}[AND]\end{cc}
\end{document}
产生的错误表明“\begin{forest}
输入第 8 行以 结尾\end{cc}
。”这是什么问题?
我见过此类错误,有些包没有很好地定义它们的环境,这导致在尝试将它们包装在新环境中时出现问题。有时这些问题有解决方法;这里有解决方法吗?
答案1
该forest
包借助包的帮助来抓取环境内容environ
。
在这些情况下,解决方法非常简单:
\newenvironment{cc}{\forest}{\endforest}
答案2
或者你可以使用环境以类似的方式定义您的环境。例如:
\environbodyname\ccbody
\NewEnviron{cc}{% \forest/\endforest from egreg's answer at https://tex.stackexchange.com/a/229608/
\forest
\ccbody
\endforest}
这样做的主要原因显然是在需要的时候。对于简单的情况,埃格勒方法运行良好,并且由于其更简单而更受欢迎。
然而,上述替代方法在无法使用更简单的方法的情况下有效。例如,如果我们想在树中添加一个新的根节点,就会出现这种情况。
假设我们想要对齐几棵树。显然有很多方法可以做到这一点,但这只是一个简单的例子。使用上面的技术,我们可以定义一个环境,ccs
它允许我们一次性指定所有四棵树,并且它将通过确保每棵树都是幻像根的子树来自动对齐这些树。
也就是说,我们可以写
\environbodyname\ccsbody
\bracketset{action character=@}
\NewEnviron{ccs}[1]{% \forest/\endforest from egreg's answer at https://tex.stackexchange.com/a/229608/
\forest
#1
[,phantom, for children={no edge} @\ccsbody]
\endforest}
这使得我们可以写
\begin{ccs}
{
for tree={font=\sffamily, align=center},
}
[AND [one\\two]]
[OR [one][two]]
[NAND [NOT one] [NOT two]]
[NOR [NOT one\\NOT two]]
\end{ccs}
生产
相当于
\begin{forest}
for tree={
font=\sffamily, align=center,
if level=0{
phantom, for children={no edge}
}{}
},
[
[AND [one\\two]]
[OR [one][two]]
[NAND [NOT one] [NOT two]]
[NOR [NOT one\\NOT two]]
]
\end{forest}
显然,我们不会为一次性的事情定义新环境。但如果我们想排版许多这样的树组,并且想使用幻像根对齐它们,我们可能会发现不需要每次都添加额外的节点会很方便。而且,正如我所说,这只是一个故意简化的例子,用来展示该技术的要点。它并不是该技术的引人注目的应用。
完整代码:
\documentclass[tikz,multi,border=5pt]{standalone}
\usepackage{forest}
\environbodyname\ccsbody
\bracketset{action character=@}
\NewEnviron{ccs}[1]{% \forest/\endforest from egreg's answer at https://tex.stackexchange.com/a/229608/
\forest
#1
[,phantom, for children={no edge} @\ccsbody]
\endforest}
\begin{document}
\begin{ccs}
{
for tree={font=\sffamily, align=center},
}
[AND [one\\two]]
[OR [one][two]]
[NAND [NOT one] [NOT two]]
[NOR [NOT one\\NOT two]]
\end{ccs}
\end{document}