当使用 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
选择颜色模型的宏 被硬编码为不尝试除 和 之外的任何操作rgb
。gray
因此,我们需要修改该宏并提供必要的内部转换:
\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