\newenvironment 不是一个简单的替代?

\newenvironment 不是一个简单的替代?

我有同一份文档的两个版本,一个版本使用\begin{inner}\end{inner}替换环境inner,另一个版本使用 手动替换主体inner。第一个版本触发错误,另一个版本按预期工作。这是第一个版本:

\documentclass[10pt]{article}

\newenvironment{outerx}
    {
        \noindent\begin{tabular}{@{}p{3cm} | c |}
    }
    {   
        \end{tabular}
    }
\newenvironment{inner}
    {
        dsfsdf & dssdf
    }
    {
    }

\begin{document}
\begin{outerx}{dsfsdsfd}

\begin{inner}{dsfsdf}
\end{inner}

\end{outerx}

\end{document}

此操作失败并显示以下错误消息:

! Extra }, or forgotten \endgroup.
\@endpbox ...finalstrut \@arstrutbox \par \egroup
                                              \hfil
l.20 \begin{inner}
                  {dsfsdf}

而下面的方法就可以正常工作:

\documentclass[10pt]{article}

\newenvironment{outerx}
    {
        \noindent\begin{tabular}{@{}p{3cm} | c |}
    }
    {   
        \end{tabular}
    }

\begin{document}
\begin{outerx}{dsfsdsfd}

        dsfsdf & dssdf

\end{outerx}

\end{document}

这是否意味着这\newenvironment不仅仅是一个简单的文本替换?我遗漏了什么?

答案1

代码确实可以通过替换来工作,但你却被一个事实所困扰:额外的材料,\begin\end在此处添加以使环境工作。特别是,LaTeX 环境形成一个组。因此,您有相当于

\begin{outerx}
  \begingroup a & \endgroup b
\end{outerx}

这会产生同样的错误:组不能跨越表格单元格。(在 TeX 中,单元格本身就是组结构。)因此,您不能在这里使用环境:您需要类似

\newcommand*\inner{ dsfsdf & dssdf}
\begin{outerx}
  \inner
\end{outerx}

&在 TeX 中处理标记特别“有趣”:将它们隐藏在宏中很棘手。)

相关内容