![Tikz 图案和 cmyk 颜色模型](https://linux22.com/image/280569/Tikz%20%E5%9B%BE%E6%A1%88%E5%92%8C%20cmyk%20%E9%A2%9C%E8%89%B2%E6%A8%A1%E5%9E%8B.png)
考虑以下示例。
\documentclass{standalone}
\usepackage[cmyk]{xcolor}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\tracingall
\draw [pattern = north west lines] circle [radius = 2cm];
\end{tikzpicture}
\end{document}
xcolor
加载了cmyk
选项,因此所有颜色都应根据 cmyk 颜色模型进行定义(下面的分析表明确实如此,所以xcolor
没问题)。但是,圆圈(图案)内的线条是黑色的,但这种黑色是用 rgb 颜色模型定义的。
通过代码和日志,我找到了解释(\pgf@tempcolor
,cmyk黑色,转换为rgb通过 \pgfutil@convertcolorspec
)请参阅下文摘录。
% pgfcorepatterns.code.tex
\def\pgf@set@fillpattern#1#2{%
\pgfutil@ifundefined{pgf@pattern@name@#1}{%
\pgferror{Undefined pattern `#1'}}
{%
\csname pgf@pattern@instantiate@#1\endcsname%
\expandafter\global\expandafter\let\csname pgf@pattern@instantiate@#1\endcsname=\relax%
\pgf@ifpatternisinherentlycolored{#1}{%
\pgfsys@setpatterncolored{\csname pgf@pattern@name@#1\endcsname}%
}{%
\pgfutil@colorlet{pgf@tempcolor}{#2}%
\pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgf@tempcolor}}%
\pgfutil@extractcolorspec{pgf@tempcolor}{\pgf@tempcolor}%
% *** EXPLANATION HERE ***
\expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgf@rgbcolor}%
\expandafter\pgf@set@fill@patternuncolored\pgf@rgbcolor\relax{#1}%
}%
}%
}
另一段代码(我运行)似乎需要这种转换pdftex
。
% pgfsys-pdftex.def
\def\pgfsys@setpatternuncolored#1#2#3#4{%
\pgfsysprotocol@literal{/pgfprgb cs #2 #3 #4 /pgfpat#1\space scn}%
}
有没有办法改变这种行为(我的编辑器不想要任何 rgb 编码的数字)?
更新
这是我到目前为止尝试过的(但没有效果)。
\pdfcompresslevel=0
\pdfobjcompresslevel=0
\documentclass{standalone}
\usepackage[cmyk]{xcolor}
\usepackage{tikz}
\usetikzlibrary{patterns}
\makeatletter
% from pgfsys-pdftex.def
\def\pgfsys@setpatternuncolored#1#2#3#4#5{%
\pgfsysprotocol@literal{/pgfpcmjk cs #2 #3 #4 #5 /pgfpat#1\space scn}%
}
\def\pgf@sys@pgf@resource@list@colorspaces{} % Empties all reference
% to RGB
\pgfutil@addpdfresource@colorspaces{ /pgfpcmyk [/Pattern /DeviceCMYK] }
% from pgfcorepatterns.code.tex
\def\pgf@set@fillpattern#1#2{%
\pgfutil@ifundefined{pgf@pattern@name@#1}{%
\pgferror{Undefined pattern `#1'}}
{%
\csname pgf@pattern@instantiate@#1\endcsname%
\expandafter\global\expandafter\let\csname pgf@pattern@instantiate@#1\endcsname=\relax%
\pgf@ifpatternisinherentlycolored{#1}{%
\pgfsys@setpatterncolored{\csname pgf@pattern@name@#1\endcsname}%
}{%
\pgfutil@colorlet{pgf@tempcolor}{#2}%
\pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{pgf@tempcolor}}%
\pgfutil@extractcolorspec{pgf@tempcolor}{\pgf@tempcolor}%
% Modified (hum)
\expandafter\pgfutil@convertcolorspec\pgf@tempcolor{cmyk}{\pgf@cmykcolor}%
\expandafter\pgf@set@fill@patternuncolored\pgf@cmykcolor\relax{#1}%
}%
}%
}
\def\pgf@set@fill@patternuncolored#1,#2,#3,#4\relax#5{%
\pgfsys@setpatternuncolored{\csname pgf@pattern@name@#5\endcsname}{#1}{#2}{#3}{#4}%
}
\begin{document}
\begin{tikzpicture}
\draw [pattern = north west lines] circle [radius = 2cm];
\end{tikzpicture}
\end{document}
Evince 告诉我(4 次):
Error: Bad color space 'pgfpcmjk'
Error (478): Bad color space (fill)
Error (509): Incorrect number of arguments in 'scn' command
以下是原始 PDF 文件的一些摘录。阅读它时,我不明白为什么pgfpcmjk
会是一个糟糕的色彩空间,因为它是通过 定义的/DeviceCMYK
。
4 0 obj <<
/Type /Pattern /PatternType 1 /PaintType 2 /TilingType 1 /BBox [-0.99628 -0.99628 3.9851 3.9851] /XStep 2.98883 /YStep 2.98883 /Resources << >>
/Length 48
>>
stream
q 0.3985 w 0.0 2.98883 m 3.08846 -0.09962 l S Q
endstream
endobj
7 0 obj <<
/Length 532
>>
stream
0 0 0 1 k 0 0 0 1 K
0 g 0 G
0 0 0 1 k 0 0 0 1 K
0 0 0 1 k 0 0 0 1 K
0 0 0 1 k 0 0 0 1 K
1 0 0 1 56.892 56.892 cm
q
0 0 0 1 K
0 0 0 1 k
0.3985 w
q
q
/pgfpcmjk cs 0 0 0 1 /pgfpat4 scn
56.69363 0.0 m
56.69363 31.31142 31.31142 56.69363 0.0 56.69363 c
-31.31142 56.69363 -56.69363 31.31142 -56.69363 0.0 c
-56.69363 -31.31142 -31.31142 -56.69363 0.0 -56.69363 c
31.31142 -56.69363 56.69363 -31.31142 56.69363 0.0 c
h
0.0 0.0 m
B
Q
Q
n
Q
0 0 0 1 k 0 0 0 1 K
0 0 0 1 k 0 0 0 1 K
0 0 0 1 k 0 0 0 1 K
0 0 0 1 k 0 0 0 1 K
endstream
endobj
6 0 obj <<
/Type /Page
/Contents 7 0 R
/Resources 5 0 R
/MediaBox [0 0 113.784 113.784]
/Parent 8 0 R
>> endobj
5 0 obj <<
/ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R
/ProcSet [ /PDF ]
>> endobj
1 0 obj
<<>>
endobj
2 0 obj
<< /pgfpat4 4 0 R>>
endobj
3 0 obj
<< /pgfpcmyk [/Pattern /DeviceCMYK] >>
endobj
8 0 obj <<
/Type /Pages
/Count 1
/Kids [6 0 R]
>> endobj
9 0 obj <<
/Type /Catalog
/Pages 8 0 R
>> endobj
答案1
原帖的问题已经被 Stephan Lehmke 在评论中解决了。这只是一个印刷错误(将 ay
改为 a j
)。我不得不说,我没能发现错误,尽管我首先想到的是这个错误,而且我仔细检查了这两个字符串,却没发现任何区别(?)。
因此,为了找出问题所在,我阅读了 PDF 规范中有关颜色空间和图案的内容,并学到了一些东西。由于 OP 在评论中要求澄清这些问题,我决定写这个简短的答案。我不追求 500 赏金,我认为我不配得到 :-)
在PDF 规范,描述了“无色平铺图案”。这些是 TikZ 使用的图案类型,因此这是规范的相关部分。
这些图案不包含有关图案描边或填充应使用什么颜色的信息。它们只定义“如何绘制”图案,而不定义“使用哪种颜色”。相反,填充和描边的颜色必须在使用图案时指定。这样可以定义一次图案,然后将其应用到文档的不同部分,并使用不同的颜色。
要指定图案要绘制的颜色,SCN
需要执行操作来设置笔触的颜色和/或非scn
笔触(填充)的颜色。此操作需要两个参数,第一个参数是指定颜色的组件元组(RGB 模型需要三个组件,CMYK 模型需要四个组件),第二个参数是“图案颜色空间”的名称,必须事先定义。
在 OP 提供的代码中,“图案颜色空间”是/pgfpcmyk
。但是这是一个内部变量,可以有我们喜欢的任何名称。此变量在以下位置定义为图案颜色空间:
/pgfpcmyk [/Pattern /DeviceCMYK]
它指定此特定图案颜色空间使用 CMYK,并且它是“无色图案”(因为/Pattern
在 TikZ 生成的代码中定义为“类型 1”和“绘画类型 2”)。
一旦定义了这个模式颜色空间,它就可以用作csn
这样的参数,例如:
/pgfpcmyk cs 0 0 0 1 /pgfpat4 scn
这首先将非描边色彩空间设置为/pgfpcmyk
(由操作员完成cs
),该色彩空间在上文中定义为图案色彩空间,然后将所调用的非描边颜色的值/pgfpat4
(稍后用于绘制图案的一个特定实例)设置为值0 0 0 1
(在 CMYK 中为黑色)。
如果图案颜色空间使用 RGB(正如 TikZ 通过插入定义默认使用的那样)/pgfprgb [/Pattern /DeviceRGB]
,那么上面这一行就必须使用三个数字来指定颜色,即 R、G、B 分量。
还要注意,变量的特定名称/pgfpcmyk
并不/pgfprgb
意味着这些图案颜色空间分别使用 CMYK 或 RGB。这完全取决于之前如何定义它们。