如何使用 0 到 255 之间的值定义 CMYK 颜色

如何使用 0 到 255 之间的值定义 CMYK 颜色

我想在 LaTeX 中定义自己的 CMYK 颜色。我知道可以使用

\definecolor{my_color_name}{cmyk}{c,y,m,k}

命令,但此处使用介于0和之间的值1。问题是我有一个可用的颜色图,它为我提供了 CMYK 中的所有颜色,其值从 到0255我不想手动将所有值除以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

这看起来不错(无论如何都会出现一些小错误)。

相关内容