我有同一份文档的两个版本,一个版本使用\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 中处理标记特别“有趣”:将它们隐藏在宏中很棘手。)