提取颜色命令

提取颜色命令

由于某些原因,我想将颜色的定义移至单独的文件中(forward有关详细信息,请参阅 robust-externalize),但我不知道如何从颜色名称中提取颜色的定义。我该怎么做?

我想到两种方法:

  1. 以某种方式(如何?)获取颜色的 rgb。主要问题是颜色可能是 CMYK,我担心这样会丢失颜色信息。
  2. 以某种方式提取给出的\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和/或\extractcolorspecsxcolor包中检索这些颜色的详细信息。

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

expl3:导出 l3color 颜色的色彩规格

完整代码:

\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,0255,128,01,.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}

相关内容