为什么我不能通过 \setkeys 设置 \columncolor?

为什么我不能通过 \setkeys 设置 \columncolor?

我正在尝试使用如下源中的选项创建一个新的列类型,并且所有选项都可以正常工作,除了b给出以下错误消息的选项:

! Undefined control sequence.
\KV@xcol@b #1->\columncolor 
                            {#1}

当我直接使用时\columncolor},如tabularx下面的第二个,没有问题。为什么?

\documentclass{article}
\usepackage[papersize={90mm,60mm},margin=5mm]{geometry}
\usepackage{array,xkeyval,xcolor,colortbl,tabularx,ragged2e}
\pagestyle{empty}\parindent0pt

% keys for columntype x:
\makeatletter
\define@key{xcol}{w}{\hsize=#1\hsize}       % relative width (summarize to 1)
\define@key{xcol}{f}{\leavevmode\color{#1}} % foreground color
\define@key{xcol}{b}{\columncolor{#1}}      % background color
\define@key{xcol}{r}[]{\RaggedLeft}         % justify right
\define@key{xcol}{l}[]{\RaggedRight}        % justify left (the default)
\define@key{xcol}{c}[]{\Centering}          % center
\makeatother

\newcolumntype{x}[1]{>{\RaggedRight\setkeys{xcol}{#1}}X}

\begin{document}

% the b=yellow should make \colorcolumn{yellow}, but \columncolor is undefined?
\begin{tabularx}{80mm}[t]{|x{f=blue,b=yellow,w=.7,c}|x{w=.3,r}|}\hline
Hello & World\\\hline
\end{tabularx}
\bigskip

% using \columncolor directly: no problem:
\begin{tabularx}{50mm}[t]{|>{\columncolor{yellow}}x{f=blue,w=.7,r}|x{w=.3}|}\hline
Hello & World\\\hline
\end{tabularx}

\end{document}

答案1

\columncolor它实际上并不是一个执行的命令,而是一个插入标记位置的标记(事实上,它根本没有被定义为命令)。

colortbl发现

\expandafter\CT@extract\the\toks\@tempcnta\columncolor!\@nil

...

\def\CT@extract#1\columncolor#2#3\@nil{%...

因此\CT@extract需要看到一个明确的\columncolor标记,而不是隐藏在宏或括号组后面。

这样做的原因有些不明确:-)

相关内容