(I'm guessing a lot here.) I think that it is down to the way in which PGF inserts colours in to the output file. To see this, it's worth reviewing the levels in the TikZ/PGF system.
- At the top, we have TikZ. This is the frontendlayer and defines the syntax that the user (usually) uses. It's job is to translate user-friendly stuff into a simpler state ready for further processing.
- In the middle, we have PGF. This is the basiclayer. This is where all the detail takes place. Here, things are done in a machine/program-friendly way. The full power of TeX is used to do some heavy machinery. All the path decorations and similar are done here. The goal of this layer is to translate what the user wants in to basic path entities.
- At the bottom, we have the drivers. These form the systemlayer. Here is where the PGF code is interpreted in to specific instructions. These have to be specific to the planned output type.
So the thing to remember in this is that when you say \fill[color=RedSpot]
then that is a TikZ command to set the colour to RedSpot
which then gets further interpreted by PGF and then the driver. Chasing definitions through, we find that color=RedSpot
calls \pgfsetcolor
which calls \pgf@setcolor
which calls \pgfsys@color@<model>
. This is now a driver level command. Its definition, say for CMYK, is
\def\pgfsys@color@cmyk@stroke#1#2#3#4{\pgfsysprotocol@literal{#1 #2 #3 #4 K}}
from which we can see (and tracing back through the definitions, this gets clearer) that even if we've defined a colour name, it is the CMYK values that get put in the file.
The point is that PGF cannot know that it is possible in PDF to alias colours, because it doesn't know that the final output will be PDF. So it translates the colours to their raw values. And 0 1 1 0 setcmykcolor
isn't the spot colour.
A lot of the above is speculation, I'll admit. Here's my evidence for this being the case. If you compile the PSTricks
file above and look at the PS, you'll find that the drawing code is:
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
But if you compile the TikZ
version and look at the PS, you'll find:
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
So the RedSpot
gets put literally in to the PS from PSTricks
but is translated back to 0 1 1 0
internally by PGF first.
The clincher is to do the following. Edit the PS file and replace the 0 1 1 0 setcmykcolor
by XC@RedSpot
. Then do the gs
and montage
stuff, and you get:
which is what you wanted.
However, editing the postscript isn't a great way to do this! Here's what I think you'd have to do to use spot colours in TikZ. I think you'd have to define a new colour model, say spot
. You'd then tell PGF that the spot
colour model is to be treated specially in that the name of the colour is to be used (or at least XC@<name>
). To define a spot colour, you could (I think) use xcolor
to define it using one model and then convert it to another. That would ensure that the definition got in to the PS file (which it does already). I don't know how to do all those steps, because it relies on knowing how xcolor
works and I don't know much about that. But that's what I would do.
It seems that pgf
does not have any built-in support for cmyk
when using ConTeXt. As a result, the macro \pgfutil@registercolor
, which chooses colour models, is hard-coded not to try anything other than rgb
and gray
. Thus we need alter that macro and provide the necessary internal conversion:
\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
Original answer (to a slightly different question!)
Two things are going on here. First, pgf
does not support ConTeXt's \definecolor
: there is a note to the effect in the manual. So you need to use \pgfutil@definecolor
instead. Secondly, there is no built-in code for a cmyk
model when working with ConTeXt. However, this does not seem to be too hard to emulate:
\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
Best Answer
Unfortunately, the requested feature is unsupported.
In general, your approach works fine: if you write
all color definitions result in cmyk colors. But shadings are special: they are not based on xcolor's drivers but on pgf's drivers. And the pgf drivers for shadings supports RGB, nothing else. I believe that pgf calls colorspace conversion routines in order to convert from cmyk back to RGB whenever it generates shadings.
What you need is a feature request for PGF in order to respect the global
xcolor
configuration and to generate shadings in that color space.There may be work-arounds. These, however, depend on the urgency - if you say that you will file feature requests and will live with the restriction, that is fine.
If you really need a workaround, you can continue reading.
The work-around that I have in mind is to use pgfplots. It has a couple of plot-related shadings and comes with its own related drivers. These, in turn, support cmyk - and most shadings can be expressed as plot-based shadings. The effort to convert these shadings from tikz pictures which have a super embedding into your pictures to pgfplots plots would be medium.
Here is an attempt in this direction:
It relies on a surface plot with explicit color using the rectangular coordinates (1cm,1cm) (2cm,2cm) and the colors are listed in the table. The verbose syntax
color=<name>
is necessary to distinguish from something like0,0,1
orgray=0.5
.