
似乎不可能包裝\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
in的定義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
結束一行的 a(包括由表前導碼生成的行)時,它會擴展下一個標記以查看 或\omit
是否\noalign
出現。這就是or\hline
的可選參數的工作方式。 TeX 繼續擴展標記,直到找到/或另一個不可擴展的標記。\\
\multicolumn
\noalign
\omit
你必須知道它使用了名為;\NewDocumentCommand
的 e-TeX 功能。就上述掃描機製而言,\protected
用前綴定義的巨集的行為就好像它是不可擴展的令牌:暫時將其視為等效,但在初步查找結束後它將正常擴展。\protected
\relax
(同樣的行為也會發生在\protected
. 中的巨集中\edef
。)
所以,絕不使用\NewDocumentCommand
巨集定義,其中包含(在替換文字的開頭)以下內容必須位於對齊單元格中的第一個,例如\multicolumn
、\hline
、 (這同樣適用於)或的\cline
規則制定命令。booktabs
\rowcolor
colortbl
上述相同的限制適用於定義為\newcommand
具有可選參數的命令,因為它們以延遲方式擴展,這會中斷\omit
/ 的掃描\noalign
。
使用\newcommand
(不含可選參數),或者,如果您確實需要可選參數,則使用\DeclareExpandableDocumentCommand
of xparse
(但請檢查文件以了解這種情況下的限制,例如,您需要在可選參數之後添加強制參數)。