在新环境中使用 Forest 包

在新环境中使用 Forest 包

我正在尝试使用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}

生产

4棵树

相当于

\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}

相关内容