我想从环境形式更改tabularx
为命令形式,但无法编译。我需要命令形式,因为我tabularx
稍后想在自定义环境中使用。
\documentclass[]{article}
\usepackage{tabularx}
\begin{document}
% working
\begin{tabularx}{\textwidth}{l|l}
my & table
\end{tabularx}
% not working (does not compile)
\tabularx{\textwidth}{l|l}
my & table
\endtabularx
\end{document}
答案1
tabularx
查找表格的结尾,预期以\end
(通常为\end{tabularx}
:) 开头。但是,命令形式可在另一个环境中使用:
\documentclass[]{article}
\usepackage{tabularx}
\begin{document}
\noindent
\begin{tabularx}{\textwidth}{l|X}
my & table
\end{tabularx}
\newenvironment{myenv}{%
\tabularx{\textwidth}{l|X}%
}{%
\endtabularx
}
\noindent
\begin{myenv}
my & table
\end{myenv}
\end{document}
答案2
一般来说,在文档主体中使用\env
和是错误的,因为和的作用远不止执行内部命令。\endenv
\begin{env}
\end{env}
举一个简单的例子,以下文档
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\lipsum[2]
\quote
\lipsum[3]
\endquote
\lipsum[4]
\end{document}
生产
这显然不是预期的结果。同样,
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\lipsum[2]
\center
Centered text
\endcenter
\lipsum[3]
\end{document}
产生以下不需要的输出:
有时使用内部命令在定义中另一个环境,比如
\newenvironment{myenum}
{\enumerate\setlength{\itemsep}{20pt}}
{\endenumerate}
myenum
因为当未正确关闭时,这可以提供更好的错误限制。
这通常是可选的,但它变得强制的对于某些特殊环境,如tabularx
或align
,因为这些环境在行动之前会吸收其内容。因此,如果你想定义一个固定tabularx
样本,你应该这样做
\newenvironment{sptabx}
{\par\nopagebreak\medskip\noindent\tabularx{\textwidth}{lX}}
{\endtabularx\par\medskip}
因此\begin{sptabx}
,在 的定义中使用特殊代码\tabularx
,“知道”它应该寻找\end{sptabx}
作为终止符并吸收其间的所有内容,以便将其传递给 进行排版\endtabularx
。
请注意,调用\sptabx...\endsptabx
将不是查找\end{sptabx}
,因此稍后的某个地方会出现神秘错误。 当然 也是如此\tabularx
。
特定环境必须绝不被内部命令调用:它lrbox
应该始终用作
\begin{lrbox}{<box bin>}
...
\end{lrbox}
在环境定义中使用时亦如此。