
\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 は、 /または別の展開不可能なトークンが見つかるまでトークンを展開し続けます。\halign
tabular
\cr
\omit
\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
of を使用xparse
します (ただし、この場合の制限についてはドキュメントを確認してください。たとえば、オプション引数の後には必須引数が必要です)。