带有和不带有 xparse 的多列自定义宏

带有和不带有 xparse 的多列自定义宏

以下示例有两个常规 LaTeX\newcommand宏和两个\NewDocumentCommand用于指定多列文本的 xparse。每对命令之间的唯一区别是一个将对齐字符作为宏的一部分,而另一个则没有。但是,要求对齐字符位于宏之外的 xparse 版本不起作用并导致Misplaced \omit.错误。

\documentclass{article}
\usepackage{xparse}

\newcommand{\MulticolumnA}[3]{&\multicolumn{#1}{#2}{#3}}
\newcommand{\MulticolumnB}[3]{ \multicolumn{#1}{#2}{#3}}

\NewDocumentCommand{\MulticolumnX}{m m m}{&\multicolumn{#1}{#2}{#3}}
\NewDocumentCommand{\MulticolumnY}{m m m}{ \multicolumn{#1}{#2}{#3}}

\begin{document}
\[
\begin{tabular}{lllllll}
    {a} \MulticolumnA{4}{l}{A-abcdefghijkli}\\
    {a}&\MulticolumnB{4}{l}{B-abcdefghijkli}\\
    {a} \MulticolumnX{4}{l}{X-abcdefghijkli}\\
    %{a}&\MulticolumnY{4}{l}{Y-abcdefghijkli}\\
    {col1}&col2&{col3}&{col4}&{col5}\\
\end{tabular}
\]
\end{document}

以上内容可以按原样进行编译,但如果取消注释一行,则无法进行编译。

答案1

\NewDocumentCommand通过 创建一个强大的命令\protected。有关 e-TeX 的文档在第 14 页上说,在对齐\noalign或时,受保护的宏不会被扩展\omit。因此,在\MulticolumnY之后&,对 的搜索\omit结束,当 TeX 扩展时,\MulticolumnY它会找到一个放错位置的\omit(来自\multicolumn)。您必须\NewExpandableDocumentCommand为此使用。

\NewExpandableDocumentCommand已于 2017/03/11 版本中添加xparse。之前仅\DeclareExpandableDocumentCommand可用。

不会发生这种情况\MulticolumnX,因为命令是不是当 TeX 寻找 时展开\omit;它找到了&,因此它完成表条目并开始一个新的,但现在它可以直接看到\multicolumn并且很高兴。

相关内容