我正在尝试创建一个命令,该命令调用一个环境,该环境使用 定义一个带有一个参数的自定义列定义\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.sty
colortbl
答案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}
附加参数的数量可能多于一个,因此您可以添加对齐作为选项等。