Tikz 图案和 cmyk 颜色模型

Tikz 图案和 cmyk 颜色模型

考虑以下示例。

\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。这完全取决于之前如何定义它们。

相关内容