\NewDocumentCommand 中的 \rowcolor

\NewDocumentCommand 中的 \rowcolor

似乎无法包装\rowcolor用 定义的宏\NewDocumentCommand,而用 则一切正常\newcommand。 有可能修复这个问题吗?

\documentclass{article}

\usepackage[table]{xcolor}
\usepackage{xparse}

\NewDocumentCommand{\rowI}{}{
    \rowcolor{blue}
}
%\newcommand{\rowI}{
%   \rowcolor{green}
%}

\begin{document}
\begin{tabular}{lll}
    \rowI 1 & 2 & 3 \\
    1 & 2 & 3 \\
\end{tabular}
\end{document}

由于错误仅出现在\NewDocumentCommand我猜测xparse导致问题的原因而不是\rowcolor问题本身时……

答案1

\rowcolor的定义colortbl.sty

\def\rowcolor{%
  \noalign{\ifnum0=`}\fi
  \global\let\CT@do@color\CT@@do@color
  \@ifnextchar[\CT@rowa\CT@rowb}

因此,我们看到它以 开头\noalign。当 TeX 进行对齐时(使用原始的\halign,就像 的情况一样tabular),当它扫描到\cr结束一行(包括由表前导生成的行)时,它会扩展下一个标记以查看是否出现\omit或。这就是或 的可选参数的工作方式。TeX 继续扩展标记,直到找到/或另一个不可扩展的标记。\noalign\hline\\\multicolumn\noalign\omit

您必须知道\NewDocumentCommand使用了名为 的 e-TeX 功能\protected\protected就上述扫描机制而言,使用前缀定义的宏将表现得像一个不可扩展的标记:它将\relax暂时被视为等同于 ,但在此初步查找结束后它将正常扩展。

\protected(中的宏也会发生相同的行为\edef。)

所以,绝不使用\NewDocumentCommand宏定义,在替换文本的开头包含以下内容:必须在对齐单元格中位于第一个,例如\multicolumn\hline\cline( 的规则制定命令同样适用booktabs\rowcolorcolortbl

上面的相同限制适用于定义为\newcommand具有可选参数的命令,因为它们以延迟方式扩展,这会破坏对\omit/ 的扫描\noalign

使用\newcommand(不带可选参数)或者,如果您确实需要一个可选参数,\DeclareExpandableDocumentCommand则使用xparse(但请检查文档以了解这种情况下的限制,例如,您需要在可选参数后使用强制参数)。

相关内容