\rowcolor en \NewDocumentCommand

\rowcolor en \NewDocumentCommand

Parece imposible envolverlo \rowcoloren 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 \NewDocumentCommandSupongo que xparsecausa el problema y no \rowcoloren sí mismo...

Respuesta1

La definición de \rowcoloren colortbl.styes

\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 \crque termina una fila (incluida la generada por el preámbulo de la tabla) expande el siguiente token para ver si aparece \omito \noalign. Así es como funciona \hlineel argumento opcional to \\or . TeX continúa expandiendo tokens hasta que \multicolumnencuentra otro token no expandible.\noalign\omit

Debes saber que \NewDocumentCommandutiliza la función e-TeX llamada \protected; una macro definida con el \protectedprefijo se comportará como si fuera un token no expandible en lo que respecta al mecanismo de escaneo anterior: se considerará equivalente a \relaxpor el momento, pero se expandirá normalmente una vez finalizada esta búsqueda preliminar.

(El mismo comportamiento ocurre con \protectedlas macros en un archivo \edef.)

Entonces,nuncadefinir con \NewDocumentCommandmacros 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 \rowcolorde colortbl.

La misma limitación anterior se aplica a los comandos definidos con \newcommandpara 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, \DeclareExpandableDocumentCommandof 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).

información relacionada