在列定义之外使用 \columncolor

在列定义之外使用 \columncolor

我正在尝试创建一个命令,该命令调用一个环境,该环境使用 定义一个带有一个参数的自定义列定义\newcolumntype,并定义第二个命令,其中包含表列的参数。然后,仍然在第一个命令中,我开始表格环境并调用自定义列,使用第二个命令作为其参数。但我总是得到一个未定义的控制序列错误。有什么想法可以解释为什么会这样吗?

我确信这非常清楚,但我将其简化为一个最小的例子,如下所示:

\documentclass{article}
\usepackage{array}
\usepackage[table,dvipsnames]{xcolor}
\usepackage{colortbl}

\newenvironment{tablecolor}{
    \newcommand{\tlight}{\columncolor{SkyBlue!30}\color{black}}
    \newcolumntype{C}[1]{>{##1}c}
}{}

\newcommand{\tablegoals}{
\begin{tablecolor}
\begin{tabular}{l|C{\tlight}}
Goal 7  & \\
\end{tabular}
\end{tablecolor}
}

\begin{document}
    \tablegoals
\end{document}

这是我的第二次尝试。方法不同,但同样出现未定义控制序列错误\columncolor

\documentclass{article}
\usepackage{array}
\usepackage[table,dvipsnames]{xcolor}
\usepackage{colortbl}
\usepackage{ifthen}

\newenvironment{tablecolor}{
    \newcolumntype{C}[1]{>{
        \ifthenelse{\equal{dark}{##1}}{
            \columncolor{Cyan}\color{white}
            }{
            \columncolor{SkyBlue!30}\color{black}
        }
    }c}
}{
}

\newcommand{\tablegoals}[1]{
    \begin{tablecolor}
        \begin{tabular}{l|C{dark}}
            Goal 7  &   #1
        \end{tabular}
    \end{tablecolor}
}

\begin{document}
    \tablegoals{Check mark}
\end{document}

答案1

我向 David Carlisle(他编写了该colortbl软件包并\newcolumntype参与了该array软件包的开发)咨询了这个问题。他的回答如下:

错误消息告诉你\columncolor没有定义,事实上,colortbl.sty这样的命令没有定义,它只是用作

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

这本质上意味着在正常的array包表处理完成之后,colortbl进入找到该标记作为标记并插入一些额外的东西。

我不记得为什么这样写(日志上说是 15 年前的事了:-)但当时可能有原因。

结果(可能没有很好地记录下来)是,如果你隐藏\columncolor在宏中,它将无法工作,它必须明确地位于顶层。你可以定义一种颜色或另一种颜色,或者采用一个参数来获取颜色,因为它们在开始寻找其标记之前newcolumntypes就已经扩展了。array.stycolortbl

答案2

哇,你手上有点乱!首先,你不需要那个新环境,或者至少你不需要其中的那些命令。试试这个:

\documentclass{article}
\usepackage{array}
\usepackage[table,dvipsnames]{xcolor}
\usepackage{colortbl}
\newenvironment{tablegoals}[1]
    {\begin{tabular}{l|>{\columncolor{#1}}c}}
    {\end{tabular}}

\begin{document}
    \begin{tablegoals}{SkyBlue!30}
    Goal 7  & Something \\
    \end{tablegoals}
\end{document}

此处\newwnvironment将新环境的名称作为第一个参数,将环境内容之前的内容作为第二个参数,将环境末尾的内容作为第三个参数。因此,第二个参数包含\begin{tabular}{...}第二列的颜色定义。第三个参数只是结束表格。无需定义任何新命令,因为无论如何,这个新环境只允许您输入一次所有这些内容。

如果您发现自己定义了很多具有不同列颜色的表,那么以下内容可能newcommand会有所帮助:

\newcommand{\newcolumnwithcolor}[2]{\newcolumntype{#1}{>{\columncolor{#2}}c}}

现在,您可以在序言中快速、易读地定义许多列类型

\newcolumnwithcolor{C}{SkyBlue!30}

您可以在表格环境中使用它。

\begin{tabular}{l|C}
Goal 7  & Something \\
\end{tabular}

请注意,这些似乎只能用一个字符来命名。

最后,您可以定义一个接受参数的特殊列。如果您使用相同的列定义,并且仅更改颜色,则以下内容有效:

\newcolumntype{D}[1]{>{\columncolor{#1}}c}

\begin{tabular}{|l|D{SkyBlue!10}|}
Goal 7  & Something \\
\end{tabular}

附加参数的数量可能多于一个,因此您可以添加对齐作为选项等。

相关内容