由于某些原因,我想将颜色的定义移至单独的文件中(forward
有关详细信息,请参阅 robust-externalize),但我不知道如何从颜色名称中提取颜色的定义。我该怎么做?
我想到两种方法:
- 以某种方式(如何?)获取颜色的 rgb。主要问题是颜色可能是 CMYK,我担心这样会丢失颜色信息。
- 以某种方式提取给出的
\colorlet
参数\definecolor
重要的是,我不想重新定义\colorlet
或\definecolor
。
梅威瑟:
\documentclass[]{article}
\usepackage{xcolor}
\definecolor{colorA}{rgb}{1,.5,0}
\definecolor{colorB}{HTML}{AABBCC}
\definecolor{colorC}{hsb:rgb/cmyk}{1,0,0/0,1,1,0}
\colorlet{colorD}{blue}
\colorlet{colorE}{red!50!blue}
% How to write this function
\NewDocumentCommand{\extractColorCommand}{m}{%
\texttt{\textbackslash definecolor\{#1\}\{???\}\{???\}}%
}
\begin{document}
\textcolor{colorA}{I am colorA}
\textcolor{colorB}{I am colorB}
\textcolor{colorC}{I am colorC}
\textcolor{colorD}{I am colorD}
\textcolor{colorE}{I am colorE}
You can define the above colors using:
\extractColorCommand{colorA}
\extractColorCommand{colorA}
\extractColorCommand{colorB}
\extractColorCommand{colorC}
\extractColorCommand{colorD}
\extractColorCommand{colorE}
\end{document}
答案1
第一种方法有效仅有的对于用 定义的颜色xcolor
。正如 Ulrike Fischer 指出的那样,这是不是一个通用的解决方案。第二个方案仅有的对于用 定义的颜色l3color
。
买者自负 ...
但是如果您知道颜色是这样定义的xcolor
(例如,因为您总是以这种方式定义颜色并且这是您自己的代码),那么您可以使用\extractcolorspec
和/或\extractcolorspecs
从xcolor
包中检索这些颜色的详细信息。
\documentclass{article}
\usepackage{xcolor}
\colorlet{myblue}{blue!50!cyan}
\begin{document}
\extractcolorspec{myblue}{\mybluecmd}\mybluecmd
\extractcolorspecs{myblue}{\mybluemodel}{\mybluecmd}Model \mybluemodel, cmd \mybluecmd
\end{document}
类似地,对于使用 定义的颜色l3color
,您可以使用其中一个导出功能。
\color_set:nn {myotherblue} { blue!50!black }
以下循环遍历各种导出选项并使用\color_export:nnN
来提取适当的颜色信息myotherblue
。
\clist_map_inline:nn { backend, space-sep-rgb, HTML, comma-sep-rgb, comma-sep-cmyk, space-sep-cmyk }
{
\color_export:nnN {myotherblue} {#1} \l_tmpa_tl
#1: ~ \l_tmpa_tl \par
}
完整代码:
\documentclass{article}
\usepackage{xcolor}
\colorlet{myblue}{blue!50!cyan}
\begin{document}
\extractcolorspec{myblue}{\mybluecmd}\mybluecmd
\extractcolorspecs{myblue}{\mybluemodel}{\mybluecmd}Model \mybluemodel, cmd \mybluecmd
\ExplSyntaxOn
\color_set:nn {myotherblue} { blue!50!black }
\clist_map_inline:nn { backend, space-sep-rgb, HTML, comma-sep-rgb, comma-sep-cmyk, space-sep-cmyk }
{
\color_export:nnN {myotherblue} {#1} \l_tmpa_tl
#1: ~ \l_tmpa_tl \par
}
\ExplSyntaxOff
\end{document}
答案2
在testcolors
环境中,您可以以任何格式打印颜色参数,但与\extractcolorspec
您无法将这些值分配给某些命令不同,因此将其转换为新的定义:
\definecolor{mynewcolorA}{RGB}{255,128,0}
...你决定。
但请注意,即使 rbg → RGB → rgb 的转换也会因为小数(例如,1,.5,0
→ 255,128,0
→ 1,.50195,0
)而轻微改变颜色定义。
\documentclass[landscape]{article}
\usepackage{geometry}
\usepackage{xcolor}
\definecolor{colorA}{rgb}{1,.5,0}
\definecolor{colorB}{HTML}{AABBCC}
\definecolor{colorC}{hsb:rgb/cmyk}{1,0,0/0,1,1,0}
\colorlet{colorD}{blue}
\colorlet{colorE}{red!50!blue}
\begin{document}
\sffamily
\begin{testcolors}[RGB,rgb,HTML,cmyk,hsb]
\testcolor{colorA}
\testcolor{colorB}
\testcolor{colorC}
\testcolor{colorD}
\testcolor{colorE}
\end{testcolors}
\end{document}