在 xparse NewDocumentEnvironment 中使用 tabu/tabularx

在 xparse NewDocumentEnvironment 中使用 tabu/tabularx

我的问题似乎非常类似,但用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 版开始,可以通过 在定义中直接使用\tabularxand来避免此问题:\endtabularx

\newenvironment{foo}{\tabularx{XX}}{\endtabularx}

扫描仪现在寻找当前环境的结束(foo在此示例中)。这种用法有一些限制,主要限制是它 \endtabularx是环境“结束代码”的第一个标记。

我的猜测是tabu依赖于类似的限制。

相关内容