
Parece imposible envolverlo \rowcolor
en una macro definida con \NewDocumentCommand
, mientras que todo está bien con \newcommand
. ¿Es posible solucionar esto?
\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}
Dado que el error solo aparece con \NewDocumentCommand
Supongo que xparse
causa el problema y no \rowcolor
en sí mismo...
Respuesta1
La definición de \rowcolor
en colortbl.sty
es
\def\rowcolor{%
\noalign{\ifnum0=`}\fi
\global\let\CT@do@color\CT@@do@color
\@ifnextchar[\CT@rowa\CT@rowb}
Así vemos que comienza con \noalign
. Cuando TeX está haciendo una alineación (con la primitiva \halign
, como es el caso de tabular
), cuando ha escaneado un \cr
que termina una fila (incluida la generada por el preámbulo de la tabla) expande el siguiente token para ver si aparece \omit
o \noalign
. Así es como funciona \hline
el argumento opcional to \\
or . TeX continúa expandiendo tokens hasta que \multicolumn
encuentra otro token no expandible.\noalign
\omit
Debes saber que \NewDocumentCommand
utiliza la función e-TeX llamada \protected
; una macro definida con el \protected
prefijo se comportará como si fuera un token no expandible en lo que respecta al mecanismo de escaneo anterior: se considerará equivalente a \relax
por el momento, pero se expandirá normalmente una vez finalizada esta búsqueda preliminar.
(El mismo comportamiento ocurre con \protected
las macros en un archivo \edef
.)
Entonces,nuncadefinir con \NewDocumentCommand
macros que contienen (al comienzo de su texto de reemplazo) cosas quedebeser el primero en una celda de alineación, como \multicolumn
, \hline
, \cline
(lo mismo se aplica a los comandos de creación de reglas de booktabs
) o \rowcolor
de colortbl
.
La misma limitación anterior se aplica a los comandos definidos con \newcommand
para tener un argumento opcional, porque se expanden de manera retrasada que interrumpiría el escaneo de \omit
/ \noalign
.
Utilice \newcommand
(sin argumentos opcionales) o, si realmente necesita un argumento opcional, \DeclareExpandableDocumentCommand
of xparse
(pero consulte la documentación para conocer las limitaciones en este caso, por ejemplo, necesita un argumento obligatorio después de un argumento opcional).