\rowcolor in \NewDocumentCommand

\rowcolor in \NewDocumentCommand

Es scheint unmöglich zu sein, \rowcolorein mit definiertes Makro einzuschließen \NewDocumentCommand, während mit alles in Ordnung ist \newcommand. Kann man das beheben?

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

Da der Fehler nur bei den Ursachen auftritt, \NewDocumentCommandgehe ich davon aus, xparsedass er das Problem verursacht und nicht \rowcolorsich selbst …

Antwort1

Die Definition von \rowcolorin colortbl.styist

\def\rowcolor{%
  \noalign{\ifnum0=`}\fi
  \global\let\CT@do@color\CT@@do@color
  \@ifnextchar[\CT@rowa\CT@rowb}

Wir sehen also, dass es mit beginnt \noalign. Wenn TeX eine Ausrichtung vornimmt (mit dem primitiven \halign, wie es bei der Fall ist tabular) und ein gescannt hat, \crdas eine Zeile beendet (einschließlich des durch die Tabellenpräambel generierten), erweitert es das nächste Token, um zu sehen, ob \omitoder \noalignkommt. So funktioniert \hlinedas optionale Argument für \\oder . TeX erweitert weiterhin Token, bis es entweder / oder ein anderes nicht erweiterbares Token \multicolumnfindet .\noalign\omit

Sie müssen wissen, dass \NewDocumentCommanddie e-TeX-Funktion namens verwendet wird \protected. Ein mit dem Präfix definiertes Makro \protectedverhält sich hinsichtlich des obigen Scan-Mechanismus so, als wäre es ein nicht erweiterbares Token: Es wird \relaxvorerst als gleichwertig zu betrachtet, aber nach Abschluss dieser vorläufigen Suche normal erweitert.

(Dasselbe Verhalten tritt bei \protectedMakros in einem auf \edef.)

Also,niemalsdefinieren mit \NewDocumentCommandMakros, die (am Anfang ihres Ersetzungstextes) Dinge enthalten, diemussan erster Stelle in einer Ausrichtungszelle stehen, wie beispielsweise \multicolumn, \hline, \cline(dasselbe gilt für die Regelerstellungsbefehle von booktabs) oder \rowcolorvon colortbl.

Dieselbe Einschränkung wie oben gilt für Befehle, die mit \newcommandeinem optionalen Argument definiert sind, da sie verzögert erweitert werden, was die Suche nach \omit/ unterbrechen würde \noalign.

Verwenden Sie \newcommand(ohne optionale Argumente) oder, wenn Sie wirklich ein optionales Argument benötigen, \DeclareExpandableDocumentCommandvon xparse(lesen Sie in diesem Fall jedoch die Dokumentation zu den Einschränkungen, z. B. wenn Sie nach einem optionalen Argument ein obligatorisches Argument benötigen).

verwandte Informationen