似乎无法包装\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
)\rowcolor
或colortbl
。
上面的相同限制适用于定义为\newcommand
具有可选参数的命令,因为它们以延迟方式扩展,这会破坏对\omit
/ 的扫描\noalign
。
使用\newcommand
(不带可选参数)或者,如果您确实需要一个可选参数,\DeclareExpandableDocumentCommand
则使用xparse
(但请检查文档以了解这种情况下的限制,例如,您需要在可选参数后使用强制参数)。