\rowcolor в \NewDocumentCommand

\rowcolor в \NewDocumentCommand

Кажется, невозможно обернуть \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}

Таким образом, мы видим, что он начинается с \noalign. Когда TeX выполняет выравнивание (с примитивом \halign, как в случае с tabular), когда он просканировал , который завершает строку (включая ту, которая сгенерирована преамбулой таблицы), он расширяет следующий токен, чтобы увидеть , появляется \crли \omitили . Вот как необязательный аргумент для или\noalign\hline\\\multicolumn . TeX продолжает расширять токены, пока не найдет \noalign/ \omitили другой нерасширяемый токен.

Вы должны знать, что \NewDocumentCommandиспользует функцию e-TeX, которая называется\protected ; макрос, определенный с \protectedпрефиксом, будет вести себя так, как если бы он был нерасширяемым токеном, если речь идет о механизме сканирования, описанном выше: он будет считаться эквивалентным \relaxна данный момент, но он будет расширен обычным образом после завершения этого предварительного поиска.

(То же самое происходит и с\protected макросами в \edef.)

Так,никогдаопределить с помощью\NewDocumentCommand макросов, которые содержат (в начале своего заменяющего текста) вещи, которыедолженбыть первым в ячейке выравнивания, например \multicolumn, , \hline, \cline(то же самое относится к командам создания правил booktabs) \rowcolorили colortbl.

То же ограничение, указанное выше, применяется к командам, определенным с \newcommandнеобязательным аргументом, поскольку они раскрываются с задержкой, что может нарушить сканирование \omit/ \noalign.

Используйте \newcommand(без необязательных аргументов) или, если вам действительно нужен необязательный аргумент, \DeclareExpandableDocumentCommandof xparse(но проверьте документацию на предмет ограничений в этом случае, например, вам нужен обязательный аргумент после необязательного аргумента).

Связанный контент