是否可以在 TikZ 图形中使用专色?

是否可以在 TikZ 图形中使用专色?

使用 ConTeXt 和 Metapost,可以相当容易地定义专色并在图像中使用它们:

\starttext
\definecolor[MyRed][c=0,m=1,y=1,k=0]
\definespotcolor[RedSpot][MyRed][p=1,e=MyRed]

\startMPpage
  draw unitsquare scaled 10cm;
  fill fullcircle scaled 8cm shifted(5cm,5cm) withcolor \MPcolor{RedSpot};
  setbounds currentpicture to boundingbox currentpicture enlarged 2mm;
\stopMPpage
\stoptext

可以使用 GhostScript 分离 PDF 颜色通道,然后使用 ImageMagick 的montage实用程序进行汇总:

gs -dBATCH -dNOPAUSE -sDEVICE=tiffsep -r300 -sOutputFile=separation.tif <output pdf>
montage -label "%f" -density 300 <output pdf> *.*.tif -geometry 600 output.png

注意:GhostScript 9.0 - 9.02 中有一个错误,导致 tiffsep 设备无法加载颜色配置文件

得到的摘要显示 PDF 由一个黑框和一个占据专色通道的圆圈组成:

ConTeXt 输出的色彩分离


类似的效果可以使用 XColor 和 PS-Tricks 实现

\begin{filecontents*}{spot_color.pro}
TeXDict begin
/RedSpotCMYK [0 1 1 0] def
/RedSpotSpot (RedSpot) def
/RedSpotDef RedSpotCMYK aload pop RedSpotSpot findcmykcustomcolor def
/XC@RedSpot{RedSpotDef 1.0 setcustomcolor}XCdef
end
\end{filecontents*}

\documentclass{minimal}
\usepackage[prologue]{xcolor}
\usepackage{pstricks}

\usepackage[tightpage,active,psfixbb]{preview}
\setlength\PreviewBorder{2mm}
\PreviewEnvironment{pspicture}

\definecolor{RedSpot}{cmyk}{0 1 1 0}

\begin{document}
\begin{pspicture}
  \psframe (0,0) (10cm,10cm)
  \pscircle[fillcolor=RedSpot,fillstyle=solid,linestyle=none] (5cm,5cm){4cm}
\end{pspicture}

\end{document}

使用 LaTeX 编译并转换为 PDF:

latex pstricks_spot
dvips -h tex.pro -h xcolor.pro -h spot_color.pro pstricks_spot
ps2pdf pstricks_spot.ps

这给出了类似的颜色分离:

PSTricks 输出的色彩分离


但是,如果我尝试在上述过程中将 TikZ 替换为 PSTricks:

\begin{filecontents*}{spot_color.pro}
TeXDict begin
/RedSpotCMYK [0 1 1 0] def
/RedSpotSpot (RedSpot) def
/RedSpotDef RedSpotCMYK aload pop RedSpotSpot findcmykcustomcolor def
/XC@RedSpot{RedSpotDef 1.0 setcustomcolor}XCdef
end
\end{filecontents*}

\documentclass{minimal}
\usepackage[prologue]{xcolor}
\usepackage{tikz}

\usepackage[tightpage,active,psfixbb]{preview}
\setlength\PreviewBorder{2mm}
\PreviewEnvironment{tikzpicture}

\definecolor{RedSpot}{cmyk}{0 1 1 0}

\begin{document}
\begin{tikzpicture}[x=1cm,y=1cm]
  \draw            (0,0) rectangle (10,10);
  \fill[color=RedSpot] (5,5) circle (4);
\end{tikzpicture}

\end{document}

笔记:TikZ 2.10 已损坏与预览包结合使用时dvips

红色圆圈不再占据单独通道:

TikZ 输出的色彩分离


因此,我的问题是:

鉴于 XColor 可以为 PSTricks 图形启用专色并且 TikZ 也使用 XColor,是否可以在 TikZ 图形中使用专色?

如果是这样,我将询问一个后续问题,关于在不通过 Postscript 渲染的情况下执行此操作(即使用pdflatex而不是latex/ dvips/ ps2pdf

答案1

(我猜了很多。)我思考这取决于 PGF 将颜色插入输出文件的方式。要了解这一点,值得回顾一下 TikZ/PGF 系统中的级别。

  1. 最顶部的是 TikZ。这是前端层并定义用户(通常)使用的语法。它的工作是将用户友好的内容转换为更简单的状态,以供进一步处理。
  2. 中间是 PGF。这是基础层。所有细节都发生在这里。在这里,事情以机器/程序友好的方式完成。TeX 的全部功能都用于处理一些重型机器。所有路径装饰和类似操作都在这里完成。这一层的目标是翻译用户想要进入基础路径实体
  3. 最底层是驱动程序。这些构成了系统层。这里是 PGF 代码被解释成具体指令的地方。这些指令必须特定于计划的输出类型。

因此要记住的是,当你说“\fill[color=RedSpot]那么”时,这是一个蒂克兹命令将颜色设置为RedSpot哪个,然后由 PGF 和驱动程序进一步解释。追踪定义,我们发现color=RedSpot调用\pgfsetcolor哪个调用\pgf@setcolor哪个调用\pgfsys@color@<model>。这现在是司机level 命令。其定义(例如 CMYK)是

\def\pgfsys@color@cmyk@stroke#1#2#3#4{\pgfsysprotocol@literal{#1 #2 #3 #4 K}}

从中我们可以看到(并通过定义追溯,这变得更加清晰),即使我们已经定义了颜色名称,它也是 CMYK 值被放入文件中。

关键在于 PGF 无法知道 PDF 中可以对颜色进行别名处理,因为它不知道最终输出将是 PDF。因此,它将颜色转换为其原始值。并且0 1 1 0 setcmykcolor 不是专色。

我承认,上面的很多内容都是猜测。以下是我对此提供的证据。如果你编译PSTricks上面的文件并查看 PS,你会发现绘图代码是:

  tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { } def
 0.8 SLW TeXDict begin XC@black end   142.26378 142.26378 113.81102
.5 CLW mul sub 0 360 arc closepath  gsave TeXDict begin XC@RedSpot
end  1. .setopacityalpha  fill  grestore end

但如果你编译该TikZ版本并查看PS,你会发现:

 0 1 1 0 setcmykcolor

 141.73404 141.73404 moveto

 255.12128 141.73404 moveto

 255.12128 204.35689 204.35689 255.12128 141.73404 255.12128 curveto

 79.11119 255.12128 28.3468 204.35689 28.3468 141.73404 curveto

 28.3468 79.11119 79.11119 28.3468 141.73404 28.3468 curveto

 204.35689 28.3468 255.12128 79.11119 255.12128 141.73404 curveto

 closepath

因此RedSpot字面上地进入 PS但首先由 PGF 内部PSTricks转换回。0 1 1 0

关键是执行以下操作。编辑 PS 文件并将 替换为0 1 1 0 setcmykcolorXC@RedSpot然后执行gsmontage操作,您将获得:

TikZ 中的专色

这正是您想要的。

但是,编辑后记并不是一个好方法!以下是我认为在 TikZ 中使用专色需要做的事情。我认为你必须定义一个新的颜色模型比如说spot。然后你会告诉 PGF,spot颜色模型需要特殊处理,因为姓名的颜色(或至少XC@<name>)。要定义专色,你可以(我认为)xcolor使用定义使用一个模型来定义它,然后将其转换为另一个模型。这将确保定义进入 PS 文件(它已经这样做了)。我不知道如何完成所有这些步骤,因为它依赖于了解xcolor工作原理,而我对此了解不多。但这就是我要做的。

相关内容