[Tikzdevice-bugs] Context and tikz?
Matthieu Stigler
matthieu.stigler at gmail.com
Wed Apr 20 10:08:16 CEST 2011
Le 20/04/2011 05:08, Charlie Sharpsteen a écrit :
> ---------- Forwarded message ----------
> From: Charlie Sharpsteen<chuck at sharpsteen.net>
> Date: Tue, Apr 19, 2011 at 8:08 PM
> Subject: Re: [Tikzdevice-bugs] Context and tikz?
> To: mat<matthieu.stigler at gmail.com>
>
>
>
>
> On Tue, Apr 19, 2011 at 4:13 PM, mat<matthieu.stigler at gmail.com> wrote:
>
>> Le 19. 04. 11 23:57, Charlie Sharpsteen a écrit :
>>
>> On Tue, Apr 19, 2011 at 2:13 PM, mat<matthieu.stigler at gmail.com> wrote:
>>
>>> Charlie
>>>
>>> Wonderful!! It's exactly what I needed! And you did it so fast,
>>> congratulations!
>>>
>> Just make sure you double-check that the text in your plot still looks OK
>> as I didn't have time to implement proper calculations of text size for
>> `metapost`---the device still falls back to using LaTeX which does things
>> differently from ConTeXt.
>>
>>
>>
>>> The way you did it is really nice, since it seems the color def are not
>>> rewritten each time, which allows one to set them "globally". Now for the
>>> pentone color: as I understood it, the most standard case will be one spot
>>> color, used with different "tints" (ie percentage). For my case for example,
>>> it implied this:
>>> \definecolor[PantoneBlue][c=1, m=0.58,y=0,k=0.29]
>>>
>>> \definespotcolor[PantoneBlueHundredSpot][PantoneBlue][p=1,e=Pantone 294 C]
>>> \definespotcolor[PantoneBlueSixtySpot][PantoneBlue][p=0.6,e=Pantone 294 C]
>>> \definespotcolor[PantoneBlueFourtySpot][PantoneBlue][p=0.4,e=Pantone 294
>>> C]
>>> ....
>>>
>>> So a function like:
>>> define_metap_tint( Rname='PantoneBlueFourty', colRef='Pantone 294 C',
>>> tint=0.4)
>>>
>>> could be very useful!!!
>>>
>> I'll look into the tinting---I left it at a default of 1 because I don't
>> fully understand how it works and would need to read up a little bit more. I
>> think you may be able to achieve a similar effect using R's transparency
>> settings---in my experiments an object printed with 100% opacity was
>> represented in the spot color channel by a solid black shape which I presume
>> indicates a full layer of ink. An object set to 60% opacity was represented
>> in a shade of gray which I would presume means that less ink is being laid
>> down.
>>
>> The part I am not sure about is if setting the opacity achieves the same
>> effect as tinting the color
>>
>> I did some quick reading and it looks like normal transparency is
> equivalent to tinting *only when* there is nothing underneath the
> transparent element. However, PDF supports 12 different methods (!!!) of
> handling transparency---one of which may be equivalent to tinting. Tinting
> could always be implemented using ConTeXt parameters---but this would
> involve writing a lot more code as we would need to support defining a
> seperate color for each tint. Changing the PDF transparency method, which
> is defined as "normal" in metapDevice.c, is a lot easier:
>
> printOutput(tikzInfo, " withcolor transparent( \"normal\" , %4.2f,
> \\MPcolor{%s});\n",
> alpha / 255.0, color_name);
>
>
>
>
>> I unfortunately do not know this...
>>
>>
>> One more remark: as the code stands now, it allows only "R color names"
>>> since:
>>> grDevices::col2rgb(rgb_value)
>>> only accept R color names. I changed for my purpose in:
>>> if ( is.character(rgb_value) ) {
>>> if(rgb_value%in%colors()) {
>>> rgb_value<- grDevices::col2rgb(rgb_value)
>>> } else {
>>> rgb_value<- grDevices::col2rgb(eval(parse(text=rgb_value))))
>>> }
>>> #might be wrong as I'm writing trying to remember
>>>
>>> would something like this make sense?
>>>
>> I'm not sure exactly what your code is trying to do---but feel free to
>> modify the functions any way you see fit! The only important bit is that
>> the color definition has to accept a vector of three integers as
>> a valid input as that is what is emitted by the C code of the device.
>> Automatically translating character strings into RGB values is just
>> a convenience for us humans.
>>
>> well with actual code, color name within the plot has to be a R color name.
>> However, if user defines his own, it does not work (it is character, but
>> will create error with col2rgb)
>>
> Ahh, I think there may be some confusion. Consider the color definitions
> below:
>
> define_metap_color("FiretruckRed", "red")
> define_metap_color("OceanBlue", c(0, 0, 160), "Blue Spot Color")
>
> The first parameter, "FiretruckRed", is not an R color---it is the name we
> will assign to this color at the ConTeXt level. The color R cares about is
> in the second parameter which may be a string such as "red" or a RGB vector
> such as c(0, 0, 160). Strings such as "red" get expanded by `col2rgb` into
> their vector equivalents: c(255, 0, 0). These vectors are then encoded as a
> hexadecimal string so they can easily be used as names for values in an R
> list. In the case of "red", it gets transformed into c(255, 0, 0) and then
> to "#FF0000".
>
> After this expansion, the list of defined colors ends up looking like:
>
> list(
> "#FF0000" = metap_color( "FiretruckRed", c(255, 0, 0) ),
> "#0000A0" = metap_color( "OceanBlue", c(0, 0, 160), "Blue Spot Color" )
> )
>
> At the C level, when R is drawing a graphic it sends three integers
> representing the Red Green and Blue components of the color that is being
> used. The MetaPost device needs to know the name ConTeXt will eventually
> use for these colors, so it calls back to R and passes the RGB vector. Say
> you use:
>
> plot(1, col = 'red')
>
> The C routines receive something like:
>
> R_RED = 255; R_GREEN = 0; R_BLUE = 0
>
> The C code of the metapost device then calls the R function
> get_or_set_color(c(255, 0, 0)) which transforms c(255, 0, 0) to the
> hexadecimal string "#FF0000" and looks it up in the color list, finds an
> entry and returns "FiretruckRed" as the color name to be written into the
> output. If this function was passed c(0, 0, 160) it would hash to "#0000A0"
> and return "OceanBlue". If it was passed the vector for green, c(0, 255, 0)
> it would find that the entry in the color list for "#00FF00" was NULL. In
> this case `get_or_set_color` creates a value in the list, assigns it a
> generic name "MetaPostColorA" and returns that.
>
> When the device is closed, it writes out the color definitons for each
> components in the color list. For non-spot colors like "FiretruckRed" it
> just writes a \definecolor[FiretruckRed]. For spot colors like "OceanBlue"
> it first defines the RGB color with:
>
> \definecolor[OceanBlue]
>
> This is the color a PDF viewer will use to show the document. It then
> defines a spot color "OceanBlueSpot" and replaces all instances of
> "OceanBlue" in the document with "OceanBlueSpot". "OceanBlue" will still
> contain the color used for viewing, but there will be a new spot color
> channel that can be used in printing.
>
>
ok, thanks for info. My point was simply that now you can't use a custom
name color:
## Custom color name: no!
myCol<-rgb(192,203,227,maxColorValue=255)
metapost('spot_colors2.tex')
define_metap_color("Red", 'myCol', 'Spot Color Red')
plot(BOD, col = 'myCol')
dev.off()
>>
>>
>>> Finally, the colors defs:
>>>
>>> \definecolor
>>> [Red]
>>> [r=1.000,g=0.000,b=0.000]
>>> did not appear in the tex file? Is this expected? Could it be made
>>> automatical?
>>>
>> The color definitions should get written into the tex file when dev.off()
>> is called. If you have an example of a plot where this isn't happening, send
>> it to me and I'll try to puzzle out what is going wrong.
>>
>> code would be same as before:
>>
>> library(tikzDevice)
>>
>> metapost("try.tex")
>>
>> define_metap_color("Red", 'red', 'Spot Color Red')
>> op<-par(bg=11,bty="n", cex=2, mar=c(3,4,1,2)+0.1)
>> x<- runif(100)
>> plot(x, las=1, yaxt="n",tcl=0, ann=F, type="l", lwd=2, col="blue")
>> grid(col="white", lty="solid", nx=NA, ny=NULL, lwd=2)
>> lines(x, col="red", lwd=2)
>> axis(1, tcl=0, labels=FALSE, col="black", lwd=1,
>> at=as.Date(c("1970-01-01","2011-01-01")))
>> axis(2, las=2, tick=FALSE)
>> par(op)
>> dev.off()
>>
>> does not produce the expected definitions, right?
>>
> Yes, it is not defining red like it should have. I pushed a small tweak to
> metapColors.R which I think fixes the problem.
>
>
it did!
Now two things I would suggest that could greatly improve the features:
-Allow custom cmyk def of spot: define_metap_color("Red", 'red', 'Spot
Color Red', cmyk=c(0,0.2,0.03,1)). This is because pantone needs
ultimately a cmyk def
-Allow tints: define_metap_tint(Rname="Red", parent='red', pantname="a"
p=0.8), which would write:
something like:
metapost('spot_colors.tex')
define_metap_color("PantoneBlue", 'red', 'PANTONE 294 C') # adds
both \definecolor[PantoneBlue] and
\definespotcolor[PantoneBlueSpot][PantoneBlue][p=1,e=PANTONE 294 C]
define_metap_tint(Rname="blue", parent="PantoneBlue",
pantName='PantoneBlueEighty', p=0.8) # adds only
\definespotcolor[PantoneBlueEightySpot][PantoneBlue][p=0.8,e=PANTONE 294 C]
plot(BOD, col = 'red')
lines(BOD, col='blue')
dev.off()
you see the idea? Would be great!!!
>>
>> I think as it stands the feature is already nice, so it can only improve
>>> :-) And sure, adding the possibility to have spotcolors in R with tikzDevice
>>> is a really nice feature, great you intend to work on it!!!!!
>>>
>>> Finally, yes I hope it will work for the printer. Would be nice to find
>>> some professional but unfortunately all the graphical designer we consulted
>>> have no idea of these low-levels manipulation, and none could understand the
>>> "hacking" done. So we can't really know until printing whether fine or not (
>>> a big issue is whether the black color should also be written with such
>>> "separation" code, so that the printer put black on second scale... no idea
>>> is necessary or not).
>>>
>> I originally had the definition of black default to a spot color, but I
>> reversed it as I figured that it is already separated onto the K channel of
>> CMYK in the PDF. It would be pretty easy to change back to a spot color,
>> just edit the appropriate entry in the `setTikzDefaults` function in
>> deviceUtils.R. I'm hoping that isolating colors on separate channels in the
>> PDF will be enough for a professional printer to easily set up a run, but I
>> am not a professional so I don't know for sure :-)
>>
>>
>>
>>> Thanks so much!!
>>>
>> You're welcome! Hope it helps with the book!
>>
>> will be happy to send you the link soon!
>>
>> Thanks again!!
>>
>>
>>
>> -Charlie
>>
>>
>>
> _______________________________________________
> Tikzdevice-bugs mailing list
> Tikzdevice-bugs at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/tikzdevice-bugs
More information about the Tikzdevice-bugs
mailing list