`\foreach` 循环内的 `\definecolor`

`\foreach` 循环内的 `\definecolor`

我正在尝试使这个循环起作用:

\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}

相关内容