我需要获取 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
用户,当然不知道其中的高级功能。=)