我正在尝试使这个循环起作用:
\foreach \name/\col in {first/{204, 0, 0},%
second/{0, 102, 0},%
third/{0, 0, 153}}{%
\definecolor{\name}{RGB}{\col} % buggish line
\expandafter\xdef\csname\name\endcsname##1{\noexpand\textcolor{\name}{##1}}
% + more convenience utilities..
}
..但颜色似乎没有定义,因为我得到
! Package xcolor Error: Undefined color `first'.
当我尝试使用它们时。我尝试摆弄 、、\expandafter
的许多组合\noexpand
\relax
ETC。但没有成功,也没有真正的战略。有什么理由可以让他们正确行事?
最后,我期望:
here is a \first{custom}-\second{colored} \third{text}
生产:
答案1
出于与您需要 相同的原因\xdef
,您需要\xglobal\definecolor
( 手册中的第 2.5.5 节xcolor
)。
\documentclass{article}
\usepackage{xcolor,pgffor}
\foreach \name/\col in {%
first/{204, 0, 0},%
second/{0, 102, 0},%
third/{0, 0, 153}%
}{%
\xglobal\definecolor{\name}{RGB}{\col} % buggish line
\expandafter\xdef\csname\name\endcsname##1{\noexpand\textcolor{\name}{##1}}
% + more convenience utilities..
}
\begin{document}
here is a \first{custom}-\second{colored} \third{text}
\end{document}
我对使用这种方法持谨慎态度,因为您可能会覆盖命令,并可能带来灾难性的后果。
下面是不存在该问题的代码(尽管颜色被默默覆盖了):
\documentclass{article}
\usepackage{xcolor,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\definebunchofcolors}{m}
{
\clist_map_inline:nn { #1 }
{
\iagolito_define_color:n { ##1 }
}
}
\cs_new_protected:Nn \iagolito_define_color:n
{
\__iagolito_define_color_aux:nn #1
}
\cs_new_protected:Nn \__iagolito_define_color_aux:nn
{
\definecolor{#1}{RGB}{#2}
\cs_new:cpn { #1 } ##1 { \textcolor{#1}{##1} }
}
\ExplSyntaxOff
\definebunchofcolors{
{first}{204, 0, 0},
{second}{0, 102, 0},
{third}{0, 0, 153}
}
\begin{document}
here is a \first{custom}-\second{colored} \third{text}
\end{document}
但是,这种方法并不会给你带来太多好处:一次只进行一个声明更加简单。
\documentclass{article}
\usepackage{xcolor,xparse}
\ExplSyntaxOn
\NewDocumentCommand{\setupcolor}{mO{RGB}m}
{
\definecolor{#1}{#2}{#3}
\cs_new:cpn { #1 } ##1 { \textcolor{#1}{##1} }
}
\ExplSyntaxOff
\setupcolor{first}{204, 0, 0}
\setupcolor{second}{0, 102, 0}
\setupcolor{third}[rgb]{0, 0, 0.6}
\begin{document}
here is a \first{custom}-\second{colored} \third{text}
\end{document}
答案2
循环中的定义\foreach
是局部的(除非变为全局的),因此颜色的定义\definecolor
在外部是未知的,特别是当您尝试使用\textcolor
命令访问它们时。
为什么要使用循环?我认为 没有什么\foreach \x in {a,b,c} {\dosomething{\x}}
优势\dosomething{a}\dosomething{b}\dosomething{c}
。
\documentclass{article}
\usepackage{xcolor}
\newcommand\newcolor[2]%
{\definecolor{#1}{RGB}{#2}%
\expandafter\newcommand\csname#1\endcsname[1]{\textcolor{#1}{##1}}%
% + more convenience utilities..
}
\newcolor{first}{204, 0, 0}
\newcolor{second}{0, 102, 0}
\newcolor{third}{0, 0, 153}
\begin{document}
here is a \first{custom}-\second{colored} \third{text}
\end{document}