
Кажется, невозможно обернуть \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
(без необязательных аргументов) или, если вам действительно нужен необязательный аргумент, \DeclareExpandableDocumentCommand
of xparse
(но проверьте документацию на предмет ограничений в этом случае, например, вам нужен обязательный аргумент после необязательного аргумента).