定义一个包含另一个环境内的 tabularx 的新环境(例如 center)

定义一个包含另一个环境内的 tabularx 的新环境(例如 center)

我正在尝试定义一个新环境,将一个tabularx环境封闭在另一个环境中以提供某种格式(例如center将整个环境居中)。以下是我的尝试,但它会产生熟悉的! File ended while scanning use of \TX@get@body错误。但是,我已经\tabularx在定义中使用了该命令,这通常是此错误的修复方法。

以下是我的“MWE”尝试,但失败了:

\documentclass{article}
\usepackage{tabularx}
\newenvironment{CT}{%
  \begin{center}\tabularx{200pt}{XX}}{%
  \endtabularx\end{center}}
\begin{document}
\begin{CT}
One & Two
\end{CT}
\end{document}

如果我删除\begin{center}然后\end{center}它运行,而以下内容完全没问题:

\documentclass{article}
\usepackage{tabularx}
\begin{document}
\begin{center}
\begin{tabularx}{200pt}{XX}
One & Two
\end{tabularx}
\end{center}
\end{document}

我猜想问题在于\tabularx内部行为方式\newenvironment和如何寻找匹配的一些微妙之处\endtabularx

答案1

首先\tabularx要做的事情是

\edef\TX@{\@currenvir}%

即它将当前环境名称保存在名称下\TX@;然后设置目标宽度,然后继续抓取组成表格的标记。我不会在这里发布代码,但关键问题是扫描机制基本上会不断收集标记,直到找到。\end{current_environment}使用您的代码

\newenvironment{CT}
{%
 \begin{center}%
 \tabularx{200pt}{XX}
}
{%
 \endtabularx
 \end{center}%
}

\begin{CT}在 中的某个点扩展结果\begin{center},将其设置\@currenvircenter。然后\tabularx启动,设置\TX@center,并收集标记(不扩展它们),直到找到\end{center}。但是,您的代码确实不是包含\end{center}而是\end{CT}。收集机制不知道 隐藏\end{center}在 中\end{CT},因此它会继续收集内容,直到到达文件末尾。

解决方案,正如 egreg 已经提到的在评论中,就是使用\center\endcenter

\newenvironment{CT}
{%
 \center
 \tabularx{200pt}{XX}
}
{%
 \endtabularx
 \endcenter
}

相关内容