如何获取 xcolor 中预定义颜色的列表,以便可以在 foreach 循环中使用该列表?

如何获取 xcolor 中预定义颜色的列表,以便可以在 foreach 循环中使用该列表?

我需要获取 xcolor 中预定义颜色的列表。如下硬编码不是一种好的编码习惯。

\documentclass[dvipsnames,cmyk]{minimal}
\parindent=0pt
\usepackage{pstricks} 

\begin{document}
    \psforeach{\nA}
    {
        Tan, 
        RedOrange, 
        Magenta,
        Yellow,
        Green,
        Red,
        Blue,
        BrickRed,
        DarkOrchid,
        Rhodamine,
        OliveGreen,
        Mahogany,
        Goldenrod%      
    }{{\color{\nA}\nA} \endgraf}
\end{document}

在此处输入图片描述


我的真实场景是创建如下动画。

\documentclass[pstricks,dvipsnames,cmyk]{standalone}

\usepackage{etoolbox}

\def\temp{}

\begingroup
\renewcommand\DefineNamedColor[4]{\listgadd{\temp}{#2}}
\input{dvipsnam.def}
\endgroup
\def\do#1{#1,}
\edef\MyNames{\dolistloop{\temp}end}

\begin{document}
\psforeach{\x}{\MyNames}
{
   \expandafter\ifstrequal\expandafter{\x}{end}{}
   {
        \pspicture(\LL,\BB)(\RR,\TT)
        \pscircle*[linecolor=\x](0,0){\RR}
        \rput(0,0){\tiny\x}
        \endpspicture
        \newpage
   }
}
\end{document}

在此处输入图片描述

答案1

dvipsnm.def在以下示例中,我使用已定义颜色的orig :

编辑2:

使用 psforeach 的宏。

\documentclass[dvipsnames,cmyk]{minimal}
\parindent=0pt
\usepackage{pstricks} 
\usepackage{xcolor}
\usepackage{etoolbox,xstring}
\def\mydvipsnamecolors{}
\begingroup
\renewcommand\DefineNamedColor[4]{%
  \listgadd{\mydvipsnamecolors}{#2}%
  }
\input{dvipsnam.def}
\endgroup
\begin{document}
All names:
\def\do#1{#1, }
\dolistloop{\mydvipsnamecolors}

Package \verb+xstring+
\begin{flushleft}
\def\do#1{#1,}
\edef\MyNames{\dolistloop{\mydvipsnamecolors}notcolor}
\psforeach{\nA}{\MyNames}{%
    \IfStrEq{\nA}{notcolor}{}{\mbox{\color{\nA}++\nA++} \quad}
}
\end{flushleft}

Package \verb+etoolbox+
\begin{flushleft}
\def\do#1{#1,}
\edef\MyNames{\dolistloop{\mydvipsnamecolors}notcolor}
\psforeach{\nA}{\MyNames}{%
   \expandafter\ifstrequal\expandafter{\nA}{notcolor}{}{\mbox{\color{\nA}++\nA++} \quad}
}
\end{flushleft}
\end{document}

编辑3

以下方法也应该有效。您不需要任何 psforeach:

\documentclass[dvipsnames,cmyk]{pst-xport}
\SetCan{1}
\SetPad{0cm}
\usepackage{etoolbox}
\def\mydvipsnamecolors{}
\begingroup
\renewcommand\DefineNamedColor[4]{%
  \listgadd{\mydvipsnamecolors}{#2}%
  }
\input{dvipsnam.def}
\endgroup
\begin{document}

\def\do#1{%
        \pspicture(\LL,\BB)(\RR,\TT)
        \pscircle*[linecolor=#1](0,0){\RR}
        \rput(0,0){\tiny#1}
        \endpspicture
        \newpage

}%
\dolistloop{\mydvipsnamecolors}

\end{document}

答案2

\documentclass[a4paper]{minimal}
\usepackage[dvipsnames,svgnames]{xcolor}
\def\showdvipsnamescolors{%
  \begingroup\renewcommand\DefineNamedColor[4]{\color{##2}##2\par}%
  \input{dvipsnam.def}\endgroup}
\def\showsvgnamescolors{%
  \begingroup\renewcommand\preparecolorset[4]{\process##4;,,,;}
  \def\process##1,##2,##3,##4;{%
    \if!##1!\else\color{##1}##1\par\expandafter\process\fi}%
  \input{svgnam.def}\endgroup}

\begin{document}
DVIPSNAMES

\showdvipsnamescolors
\newpage
SVGNAMES

\showsvgnamescolors
\end{document}

修改代码使其生成颜色列表很简单:

\usepackage{etoolbox}
\def\dvipscolorslist{}
\def\showdvipsnamescolors{%
  \begingroup\renewcommand\DefineNamedColor[4]{\gappto\dvipscolorslist{##2,}}%
  \input{dvipsnam.def}\endgroup}

类似的重新定义可用于\showsvgnamescolors

\def\svgnamescolorslist{}
\def\showsvgnamescolors{%
  \begingroup\renewcommand\preparecolorset[4]{\process##4;,,,;}
  \def\process##1,##2,##3,##4;{%
    \if!##1!\else\gappto\svgnamescolorslist{##1,}\expandafter\process\fi}%
  \input{svgnam.def}\endgroup}

答案3

etoolbox当我必须迭代列表中的元素时,该包通常会对我有所帮助。

\documentclass{article}

\usepackage{etoolbox}
\usepackage[usenames,dvipsnames]{color}

\DeclareListParser*{\myforeach}{,}

\newcommand*\mycolor[1]{%
\color{#1}#1\par%
}

\newcommand*\drawcolors[1]{%
\myforeach{\mycolor}{#1}%
}

\begin{document}

\drawcolors{Tan,RedOrange,Magenta,Yellow,Green,Red,Blue}

\end{document}

请注意,我只是一名普通etoolbox用户,当然不知道其中的高级功能。=)

相关内容