\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}

したがって、 は で始まることがわかります。TeX が (の場合のように\noalignプリミティブ を使って) 位置合わせを行うとき、行 (テーブル プリアンブルによって生成された行を含む) を終了する をスキャンすると、次のトークンを展開してまたはが来るかどうかを確認します。これが、 またはのオプション引数の動作方法です。TeX は、 /または別の展開不可能なトークンが見つかるまでトークンを展開し続けます。\haligntabular\cr\omit\noalign\hline\\\multicolumn\noalign\omit

\NewDocumentCommandは と呼ばれる e-TeX 機能を使用することを知っておく必要があります\protected。 プレフィックスで定義されたマクロは、\protected上記のスキャン メカニズムに関する限り、展開不可能なトークンであるかのように動作します。つまり、当面は と同等であると見なされます\relaxが、この予備的な検索が終了した後は正常に展開されます。

\protected(内のマクロでも同じ動作が起こります\edef。)

それで、一度もないマクロで定義し\NewDocumentCommand、置換テキストの先頭に次のものを含める。しなければならない\multicolumn\hlineなどの配置セルの先頭にする必要があります(の\clineルール作成コマンドにも同じことが当てはまりますbooktabs) 。\rowcolorcolortbl

オプションの引数を持つように定義されたコマンドにも、上記と同じ制限が適用されます。\newcommandこれは、それらのコマンドが遅延して展開され、\omit/のスキャンが中断されるためです\noalign

(オプション引数なし)を使用する\newcommandか、オプション引数が本当に必要な場合は\DeclareExpandableDocumentCommandof を使用xparseします (ただし、この場合の制限についてはドキュメントを確認してください。たとえば、オプション引数の後には必須引数が必要です)。

関連情報