与 newenvironment 一起使用时 excludecomment 会失败

与 newenvironment 一起使用时 excludecomment 会失败

我可以proof使用comment包来隐藏环境:

\documentclass{article}
\usepackage{comment,amsthm}
\excludecomment{proof}
\begin{document}
    This is always printed.
    \begin{proof}[Answer]
        Hide this.
    \end{proof}
\end{document}

当我尝试使用添加的newenvironment命令执行相同操作时,即

\documentclass{article}
\usepackage{comment,amsthm}
\newenvironment{answer}{\begin{proof}[Answer]}{\end{proof}}
\excludecomment{answer}
\begin{document}
    This is always printed.
    \begin{answer}
        Hide this.
    \end{answer}
\end{document}

我收到错误:

\begin{answer} 以 \end{proof} 结束。 \end{answer} \begin{document} 以 \end{answer} 结束。 \end{answer} 额外 \endgroup。 \end{answer}

知道原因吗?

答案1

原因是,指定的注释环境<env>不会将构造\begin{<env>}...\end{<env>}作为常规组进行处理(来自文档):

注意:对于包含的注释,\begin\end行表现得好像它们不存在一样。特别是,它们不表示分组,因此赋值和c不是本地的。

更详细的解释: 的扩展\begin{answer}确实会导致\begin{proof}[Answer],但在搜索 之前,该组会立即关闭\end{answer}。在内部,LaTeX 会在每次调用 时跟踪您处于哪个组。负责保存有关ent onment\begin的信息的宏是which,具体取决于您的定义currenvir\@currenvir

\newenvironment{answer}
  {\begin{proof}[Answer]}
  {\end{proof}}

保持proof而不是answer扩展后保持\begin{answer}。最终comment包裹的搜索找到了\end{answer},但是这未能通过匹配环境的 LaTeX 测试\begin,从而导致发布的错误。

简而言之,它的处理方式与预期不同。

解决此问题的方法是使用命令形式设置嵌套环境:

\documentclass{article}

\usepackage{comment,amsthm}

\newenvironment{answer}{\proof[Answer]}{\endproof}
\excludecomment{answer}

\begin{document}

This is always printed.
\begin{answer}
Hide this.
\end{answer}

\end{document}

请注意,注释\end{<env>}<env>独占一行且不带空格:

开始和结束命令应单独成行。起始命令和结束命令之间不应有任何空格,后面也不应有任何内容。

相关内容