\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

\rowcolorin的定義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\rowcolorcolortbl

上述相同的限制適用於定義為\newcommand具有可選參數的命令,因為它們以延遲方式擴展,這會中斷\omit/ 的掃描\noalign

使用\newcommand(不含可選參數),或者,如果您確實需要可選參數,則使用\DeclareExpandableDocumentCommandof xparse(但請檢查文件以了解這種情況下的限制,例如,您需要在可選參數之後添加強制參數)。

相關內容