TikZ 中的 CMYK ConTeXt 颜色

TikZ 中的 CMYK ConTeXt 颜色

当使用 CMYK 系统时,通过 ConTeXt 中的内部\definecolor宏定义的颜色不能在 TikZ 中使用。

有没有办法转换它们或勾选设置以便 TikZ 可以使用它们?

最小示例:

\usemodule[tikz]
\definecolor[c][c=1]
\starttext
\tikz\node[c]{t};
\stoptext

预期的:青色“t”
已收到:黑色“t”和Package pgf: Error! Color c has an unsupported color model..


编辑:TikZ 确实使用 RGB 颜色模型定义的 ConTeXt 颜色:

\definecolor[r][r=1]
\tikz\node[r]{t};

这给了我一个红色的“t”,正如预期的那样。所以我不想知道如何明确定义颜色以用于 TikZ,但我必须在某处添加什么代码才能使这两行\definecolor[c][c=1]\tikz\node[c]{t};最小示例中的一样一起工作。

答案1

似乎在使用 ConTeXt 时pgf,对 没有任何内置支持cmyk。因此,\pgfutil@registercolor选择颜色模型的宏 被硬编码为不尝试除 和 之外的任何操作rgbgray因此,我们需要修改该宏并提供必要的内部转换:

\usemodule[tikz]
\definecolor[c][c=1]
\starttext
\unprotect
\def\pgfutil@registercolor#1{%
  \edef\pgf@temp{\PDFcolor{#1}}%
  \edef\pgf@marshal{\noexpand\pgfutil@in@{g}{\pgf@temp}}%
  \pgf@marshal
  \ifpgfutil@in@
    \expandafter\pgfutil@context@parse@gray\pgf@temp\pgf@stop{#1}%
  \else
    \edef\pgf@marshal{\noexpand\pgfutil@in@{rg}{\pgf@temp}}%
    \pgf@marshal
    \ifpgfutil@in@
      \expandafter\pgfutil@context@parse@rgb\pgf@temp\pgf@stop{#1}%
    \else
      \edef\pgf@marshal{\noexpand\pgfutil@in@{k}{\pgf@temp}}%
      \pgf@marshal
      \ifpgfutil@in@
        \expandafter\pgfutil@context@parse@cmyk\pgf@temp\pgf@stop{#1}%
      \else 
        \PackageError{pgf}{Color #1 has an unsupported color model.}{}%
        \pgfutil@definecolor{#1}{gray}{0}%
      \fi
    \fi
  \fi
}
\def\pgfutil@context@parse@cmyk#1 #2 #3 #4k#5\pgf@stop #6{%
  \pgfutil@definecolor{#6}{cmyk}{#1,#2,#3,#4}%
}
\def\pgfutil@emu@cmyk#1#2,#3,#4,#5\@nil{%
  \expandafter\def\csname\string\color@#1\endcsname
    {\xcolor@{}{}{cmyk}{#2,#3,#4,#5}}%
}

\protect
\tikz\node[c]{t};
\stoptext

原始答案(针对略有不同的问题!)

这里有两个问题。首先,pgf不支持 ConTeXt \definecolor:手册中有说明。因此您需要使用\pgfutil@definecolor。其次,使用 ConTeXt 时没有内置cmyk模型代码。但是,这似乎并不难模仿:

\usemodule[tikz]
\unprotect
\def\pgfutil@emu@cmyk#1#2,#3,#4,#5\@nil{%
  \expandafter\def\csname\string\color@#1\endcsname
    {\xcolor@{}{}{cmyk}{#2,#3,#4,#5}}%
}
\pgfutil@definecolor{c}{cmyk}{1,0,0,0}
\protect
\starttext
\tikz\node[c]{t};
\stoptext

相关内容