我想在 LaTeX 中定义自己的 CMYK 颜色。我知道可以使用
\definecolor{my_color_name}{cmyk}{c,y,m,k}
命令,但此处使用介于0
和之间的值1
。问题是我有一个可用的颜色图,它为我提供了 CMYK 中的所有颜色,其值从 到0
,255
我不想手动将所有值除以255
。对于定义 RGB 颜色,LaTeX 提供了命令
\definecolor{my_color_name}{rgb}{r,g,b}
\definecolor{my_color_name}{RGB}{R,G,B}
其中 {r,g,b} 介于0
和 之间1
,而 {R,G,B} 介于0
和 之间255
。因此,我正在寻找 CMYK 方案的类似内容。有什么想法吗?
答案1
我不知道您如何接收数据,但这可能会让您了解如何进行:
\documentclass{article}
\usepackage{xcolor}
\usepackage{tikz}
\newcommand{\hexcmyk}[5]{%
\pgfmathsetmacro{\myc}{#1/255}%
\pgfmathsetmacro{\mym}{#2/255}%
\pgfmathsetmacro{\myy}{#3/255}%
\pgfmathsetmacro{\myk}{#4/255}%
\definecolor{testcolor}{cmyk}{\myc,\mym,\myy,\myk}%
\textcolor{testcolor}{#5}% Trivial application
}
\def\hhexcmyk(#1,#2,#3,#4)#5{%
\pgfmathsetmacro{\myc}{#1/255}%
\pgfmathsetmacro{\mym}{#2/255}%
\pgfmathsetmacro{\myy}{#3/255}%
\pgfmathsetmacro{\myk}{#4/255}%
\definecolor{testcolor}{cmyk}{\myc,\mym,\myy,\myk}%
\textcolor{testcolor}{#5}% Trivial application
}
\def\defineCMYKcolor(#1,#2,#3,#4)#5{%
\pgfmathsetmacro{\myc}{#1/255}%
\pgfmathsetmacro{\mym}{#2/255}%
\pgfmathsetmacro{\myy}{#3/255}%
\pgfmathsetmacro{\myk}{#4/255}%
\definecolor{#5}{cmyk}{\myc,\mym,\myy,\myk}%
}
\defineCMYKcolor(155,0,255,10){mygreen}
\begin{document}
\hexcmyk{0}{255}{255}{0}{Test text.}
\hhexcmyk(255,0,255,0){TEST}
\defineCMYKcolor(0,255,155,10){myred}
\textcolor{myred}{This is some more text.}
\textcolor{mygreen}{This yet more text.}
\end{document}
产生这个:
我突然想到我不知道数据是如何呈现的,所以扩展了我的答案以提供问题的另一种解决方案。
答案2
只需要包 xcolor:
\usepackage{xcolor}
{\lccode`\?=`\p \lccode`\!=`\t \lowercase{\gdef\ignorept#1?!{#1}}}
\def\divbyccvv#1{\expandafter\ignorept\the\dimexpr#1pt/255\relax}
\def\defineCMYKcolor#1#2{\defineCMYKcolorA{#1}#2,}
\def\defineCMYKcolorA#1#2,#3,#4,#5,{\edef\tmp{\noexpand\definecolor{#1}{cmyk}%
{\divbyccvv{#2},\divbyccvv{#3},\divbyccvv{#4},\divbyccvv{#5}}}\tmp
}
\defineCMYKcolor{my_color_name}{255,0,50,11}
\begin{document}
\color{my_color_name}test in my_color
\end{document}
答案3
xparse
使用和的设施expl3
:
\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\defineCMYKcolor}{mm}
{
\tceighteight_define_CMYK_color:nn { #1 } { #2 }
}
\seq_new:N \l_tceighteight_input_seq
\seq_new:N \l_tceighteight_output_seq
\cs_new_protected:Npn \tceighteight_define_CMYK_color:nn #1 #2
{
% split the input into parts
\seq_set_split:Nnn \l_tceighteight_input_seq { , } { #2 }
% convert each item to a decimal value in [0,1]
\seq_set_map:NNn \l_tceighteight_output_seq \l_tceighteight_input_seq
{
\fp_eval:n { ##1/255 }
}
% now define the color
\definecolor{#1}{cmyk}{ \seq_use:Nn \l_tceighteight_output_seq { , } }
}
\ExplSyntaxOff
\defineCMYKcolor{test}{32,100,211,99}
\begin{document}
\textcolor{test}{ABCDEF}
\end{document}
这四个数字以序列形式存储(这里可以添加一些健全性检查),然后转换成在适当\definecolor
命令中使用的另一个序列。
如果我问颜色test
扩展成什么,我会得到
> \\color@test=macro:
->\xcolor@ {}{0.12549 0.39215 0.82745 0.38823 k 0.12549 0.39215 0.82745 0.38823
K}{cmyk}{0.12549,0.39215,0.82745,0.38823}.
为了检查这些值,我将它们乘以 255,得到
0.12549*255 = 31.99995
0.39215*255 = 99.99825
0.82745*255 = 210.99975
0.38823*255 = 98.99865
这看起来不错(无论如何都会出现一些小错误)。