我的问题似乎非常类似这,但用tabu
代替tabular*
。事实上,切换该示例中的选项会导致我在此处看到的失败。
\NewDocumentEnvironment {trace} {} {%
\begin{table}
\begin{tabu} to \textwidth {|@{ }r@{::}l|l|X|}
A & B & C & D \\
}{%
\end{tabu}
\end{table}
}
\begin{trace}
a & b & c & d \\
\end{trace}
这会失败。对于 tabularx 环境也类似,它也允许 X。下面的代码运行正常,但不允许我想使用的 X 参数! Missing number, treated as zero. <to be read again> \[email protected]
l.51 \end{trace}
\NewDocumentEnvironment {trace} {} {%
\begin{table}
\begin{tabular*}{\textwidth}{|@{ }r@{::}l|l|p{0.5\textwidth}|}
A & B & C & D \\
}{%
\end{tabular*}
\end{table}
}
答案1
使用环境定义中的命令形式才能成功编译:
\documentclass{article}
\usepackage{xparse,tabu,tabularx}% http://ctan.org/pkg/{xparse,tabu,tabularx}
\NewDocumentEnvironment {traceA} {} {%
\table
\tabularx{\linewidth}{|@{ }r@{::}l|l|X|}
A & B & C & D \\
}{%
\endtabularx
\endtable
}
\NewDocumentEnvironment {traceB} {} {%
\table
\tabu to \linewidth {|@{ }r@{::}l|l|X|}
A & B & C & D \\
}{%
\endtabu
\endtable
}
\begin{document}
\begin{traceA}
a & b & c & d
\end{traceA}
\begin{traceB}
a & b & c & d
\end{traceB}
\end{document}
这tabularx
文档(部分5 宏,第 4 页)在某种程度上回避了这一点:
现在有一个技巧,可以将环境主体放入令牌寄存器中,而无需进行任何扩展。这不会对嵌套环境进行任何实际检查,因此如果您需要将一个环境嵌套
tabularx
在另一个环境中,则内部环境必须被包围{ }
。[...]
这种抓取环境主体的机制确实存在缺点(与 AMS 对齐环境相同),即您无法通过以下代码创建扩展环境
\newenvironment{foo}{\begin{tabularx}{XX}}{\end{tabularx}}
因为代码正在寻找一个文字字符串
\end{tabularx}
来停止扫描。从 2.02 版开始,可以通过 在定义中直接使用\tabularx
and来避免此问题:\endtabularx
\newenvironment{foo}{\tabularx{XX}}{\endtabularx}
扫描仪现在寻找当前环境的结束(
foo
在此示例中)。这种用法有一些限制,主要限制是它\endtabularx
是环境“结束代码”的第一个标记。
我的猜测是tabu
依赖于类似的限制。