diff options
Diffstat (limited to 'doc/context/sources/general/manuals/colors/colors-basics.tex')
-rw-r--r-- | doc/context/sources/general/manuals/colors/colors-basics.tex | 1204 |
1 files changed, 1204 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/colors/colors-basics.tex b/doc/context/sources/general/manuals/colors/colors-basics.tex new file mode 100644 index 000000000..4d7822bd0 --- /dev/null +++ b/doc/context/sources/general/manuals/colors/colors-basics.tex @@ -0,0 +1,1204 @@ +% language=uk + +\startcomponent colors-basics + +\environment colors-environment + +\usemodule[setups-basics] \loadsetups[i-color] + +\startchapter[title=Basics][color=darkred] + +\startsection[title=Color models] + +When you work with displays, and most of us do, the dominant color model is \RGB. +As far as I know \CMYK\ electrowetting displays are still not in production and +even there the \CMYK\ seems to have made place for \RGB\ (at least in promotion +movies). This is strange since where \RGB\ is used in cases where colors are +radiated, \CMYK\ shows up in reflective situations (and epub readers are just +that). But \RGB\ and \CMYK\ being complementary is not the only difference: +\CMYK\ has an explicit black channel, and as a consequence you cannot go from one +to the other color space without loss. + +In print \CMYK\ is dominant but in order to get real good colors you can go with +spot colors. The ink is not mixed with others but applied in more or less +quantity. A mixture of spot colors and \CMYK\ is used too. You can combine spot +colors into a so called multitone color. Often spot colors have names (for +instance refering to Pantone) but they always have a specification in another +color space in order to be shown on screen. Think of \quotation {gold} being a +valid ink, but hard to render on screen, so some yellowish replacement is used +there when documents get prepared on screen. + +In \CONTEXT\ all these models are supported, either or not at the same time. In \MKII\ +you had to turn on color support explicitly, if only because of the impact of the +overhead on performance, but in \MKIV\ color is on by default. You can disable it +with: + +\starttyping +\setupcolors + [state=stop] +\stoptyping + +The three mentioned models are controlled by keys, and by default we have set: + +\starttyping +\setupcolors + [rgb=yes, + cmyk=yes, + spot=yes] +\stoptyping + +Spot colors and their combinations in multitone colors are controlled by the same +parameter. You can define colors in the \HSV\ color space but in the end these +become and behave like \RGB. + +\stopsection + +\startsection[title=Using color] + +Normally you will use colors grouped. Most environments accept a \type {color} +parameter (some have \type {textcolor} or similar longer names too). In a running +text you can use: + +\starttyping +\color[red]{This will show up red.} +\stoptyping + +or: + +\starttyping +\startcolor[red] + This will show up red. +\stopcolor +\stoptyping + +In case you don't want the grouping you can use: + +\starttyping +\directcolor[red] +\stoptyping + +You can even use: + +\starttyping +\colored[r=0.5]{also red} +\stoptyping + +In which case an anonymous color is used. An ungrouped variant of this is: + +\starttyping +\directcolored[r=0.5] +\stoptyping + +You will seldom use these direct variants, but they might come in handy when you +write macros yourself where extra grouping starts interfering. In fact, it often +makes sense to use a bit more abstraction: + +\startbuffer +\definehighlight + [important] + [color=red] + +First \highlight[important]{or} second \important {or} third. +\stopbuffer + +\typebuffer + +This gives: \inlinebuffer . + +\stopsection + +\startsection[title=Using \CMYK\ or \RGB] + +When you compare colors in different color spaces, you need to be aware of the +fact that when a black component is used in \CMYK, conversion to \RGB\ might give +the same results but going back from that to \CMYK\ will look different from the +original. Also, \CMYK\ colors are often tuned for specific paper. + +\startbuffer +\definecolor[demo:rgb:1][r=1.0,g=1.0] +\definecolor[demo:rgb:2][r=1.0,g=1.0,b=0.5] +\definecolor[demo:rgb:3][r=1.0,g=1.0,b=0.6] +\definecolor[demo:cmy:1][y=1.0] +\definecolor[demo:cmy:2][y=0.5] +\definecolor[demo:cmy:3][y=0.4] +\stopbuffer + +\typebuffer \getbuffer + +In these definitions we have no black component. In \in {figure} +[color:rgb:cmyk:1] we see how these colors translate to the other color spaces. + +\startbuffer[compare] +\startbuffer +\definemeasure[demo][(\textwidth-2em)/3] +\startcombination[3*2] + {\blackrule[width=\measure{demo},height=1cm,depth=0cm,color=demo:rgb:1]}{\infofont\colorcomponents{demo:rgb:1}} + {\blackrule[width=\measure{demo},height=1cm,depth=0cm,color=demo:rgb:2]}{\infofont\colorcomponents{demo:rgb:2}} + {\blackrule[width=\measure{demo},height=1cm,depth=0cm,color=demo:rgb:3]}{\infofont\colorcomponents{demo:rgb:3}} + {\blackrule[width=\measure{demo},height=1cm,depth=0cm,color=demo:cmy:1]}{\infofont\colorcomponents{demo:cmy:1}} + {\blackrule[width=\measure{demo},height=1cm,depth=0cm,color=demo:cmy:2]}{\infofont\colorcomponents{demo:cmy:2}} + {\blackrule[width=\measure{demo},height=1cm,depth=0cm,color=demo:cmy:3]}{\infofont\colorcomponents{demo:cmy:3}} +\stopcombination +\stopbuffer + +\startcombination[1*4] + {\setupcolors[rgb=yes,cmyk=yes]\getbuffer} {Both \RGB\ and \CMYK\ enabled} + {\setupcolors [rgb=no,cmyk=yes]\getbuffer} {Only \CMYK\ enabled.} + {\setupcolors [rgb=yes,cmyk=no]\getbuffer} {Only \RGB\ enabled.} + {\setupcolors [rgb=no,cmyk=no]\getbuffer} {Both \RGB\ and \CMYK\ disabled.} +\stopcombination +\stopbuffer + +\startplacefigure[location=page,reference=color:rgb:cmyk:1,title={What happens when we disable color spaces.}] + \getbuffer[compare] +\stopplacefigure + +\startbuffer +\definecolor[demo:rgb:1][r=0.5,g=0.6,b=0.7] +\definecolor[demo:rgb:2][r=0.5,g=0.6,b=0.7] +\definecolor[demo:rgb:3][r=0.5,g=0.6,b=0.7] +\definecolor[demo:cmy:1][c=0.5,m=0.4,y=0.3] +\definecolor[demo:cmy:2][c=0.4,m=0.3,y=0.2,k=0.1] +\definecolor[demo:cmy:3][c=0.3,m=0.2,y=0.1,k=0.2] +\stopbuffer + +\typebuffer \getbuffer + +When we define the colors as above, you can see a difference between the \RGB\ +and \CMYK\ values, but also between a black component versus black distributed +over the colorants. This is seen best in \in {figure} [color:rgb:cmyk:2] when we +compare the first and third colors alongside. In \in {figure} [color:rgb:cmyk:3] +you see the whole repertoire. + +\startplacefigure[reference=color:rgb:cmyk:2,title={The impact of black on a \CMYK\ color.}] +\startMPcode + fill fullsquare xyscaled (TextWidth,25mm) withcolor \MPcolor{demo:cmy:3} ; + fill fullsquare xyscaled (TextWidth,20mm) withcolor \MPcolor{demo:cmy:1} ; + fill fullsquare xyscaled (TextWidth,10mm) withcolor \MPcolor{demo:cmy:3} ; + fill fullsquare xyscaled (TextWidth, 5mm) withcolor \MPcolor{demo:cmy:1} ; +\stopMPcode +\stopplacefigure + +\startplacefigure[reference=color:rgb:cmyk:3,title={What happens when we disable color spaces (black component).}] + \getbuffer[compare] +\stopplacefigure + +\stopsection + +\startsection[title=Conversion] + +A conversion to gray happens when \RGB\ and \CMYK\ are both disabled. The following +setting forces conversion. It disables both \RGB\ and \CMYK: + +\starttyping +\setupcolors + [conversion=always] +\stoptyping + +The default setting is \type {yes} which means that colors will be reduced to gray in +the backend. This is an optimization which can result in slightly smaller output: + +\starttabulate[|l|c|l|] +\NC \NC \bf \# \NC \bf \PDF\ sequence \NC \NR +\NC \bf cmyk \NC 23 \NC \tttf 0 0 0 0.5 k 0 0 0 0.5 K \NC \NR +\NC \bf rgb \NC 29 \NC \tttf 0.5 0.5 0.5 rg 0.5 0.5 0.5 RG \NC \NR +\NC \bf gray \NC 11 \NC \tttf 0.5 g 0.5 G \NC \NR +\stoptabulate + +The conversion to gray is controlled by: + +\starttyping +\setupcolors + [factor=yes] +\stoptyping + +Like \type {conversion} the \type {factor} is a global setting. You can play with the factor values. +The default (\type {yes}) uses the factors used by color television: + +\startformula + s = 0.30r + 0.59g + 0.11b +\stopformula + +In \in {figure} [color:demo:gray] we demonstrate what happens when you use different +values. Normally you won't change the defaults but for experimenting we do provide +the option: + +\starttyping +\setupcolors + [factor=0.20:0.40:0.40] +\stoptyping + +There is one pitfall. Colors are finalized per page and as this is a backend +feature the value current when a page is shipped out is used. An exception are +\METAPOST\ graphics, as they have local resources and are finalized immediately. +This is hardly a limitation because one will never set these numbers in the +middle of a document. + +\starttexdefinition color:demo:gray:do + \definecolor[demo:rgb:0][r=0.5,g=0.6,b=0.7] + % \blackrule[width=4cm,height=1cm,color=demo:rgb:0] + \lower.4\strutdp\hbox\bgroup + \startMPcode + fill unitsquare xyscaled (.5TextWidth,.9LineHeight) + withcolor "demo:rgb:0"; + \stopMPcode + \egroup +\stoptexdefinition + +\starttexdefinition color:demo:gray #1#2#3 + \NC \tttf #1 \NC \tttf #2 \NC \tttf #3 \NC + \setupcolors[factor={#1:#2:#3}] + \setupcolors[rgb=no,cmyk=no] + \texdefinition{color:demo:gray:do} + \setupcolors[factor=yes] + \NC \NR +\stoptexdefinition + +\startplacefigure[reference=color:demo:gray,title={Color to gray conversion using factors.}] +\starttabulate[|c|c|c|c|] +\NC \bf r \NC \bf g \NC \bf b \NC \bf gray \NC \NR +\NC \NC \NC \NC \texdefinition{color:demo:gray:do} \NC \NR +\texdefinition{color:demo:gray}{0.30}{0.59}{0.11} +\texdefinition{color:demo:gray}{0.30}{0.11}{0.59} +\texdefinition{color:demo:gray}{0.59}{0.30}{0.11} +\texdefinition{color:demo:gray}{0.11}{0.30}{0.59} +\texdefinition{color:demo:gray}{0.11}{0.59}{0.30} +\texdefinition{color:demo:gray}{0.59}{0.11}{0.30} +\texdefinition{color:demo:gray}{0.20}{0.40}{0.40} +\texdefinition{color:demo:gray}{0.30}{0.60}{0.10} +\texdefinition{color:demo:gray}{0.20}{0.30}{0.20} +\texdefinition{color:demo:gray}{0.40}{0.40}{0.40} +\stoptabulate +\stopplacefigure + +\stopsection + +% let's take a break and watch: https://www.youtube.com/watch?v=baLrrW3El-M + +\startsection[title=Definitions] + +The mostly used color definition command is \type {\definecolor}. Here we define the +primary colors: + +\startbuffer +\definecolor [red] [r=1] +\definecolor [green] [g=1] +\definecolor [blue] [b=1] +\definecolor [yellow] [y=1] +\definecolor [magenta] [m=1] +\definecolor [cyan] [c=1] +\stopbuffer + +\typebuffer \getbuffer + +These can be visualized as follows: + +\startbuffer +\showcolorcomponents[red,green,blue,yellow,magenta,cyan,black] +\stopbuffer + +\typebuffer \getbuffer + +Transparency is included in these tables but is, as already noted, in fact +independent. It can be defined with a color: + +\startbuffer +\definecolor [t:red] [r=1,a=1,t=.5] +\definecolor [t:green] [g=1,a=1,t=.5] +\definecolor [t:blue] [b=1,a=1,t=.5] +\stopbuffer + +\typebuffer \getbuffer + +This time the transparency values show up too: + +\showcolorcomponents[t:red,t:green,t:blue] + +Because transparency is separated from color, we can define transparent behaviour +as follows: + +\startbuffer +\definecolor[t:only] [a=1,t=.5] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer + \dontleavehmode + \blackrule[width=4cm,height=1cm,color=darkgreen]% + \hskip-2cm + \color[t:only]{\blackrule[width=4cm,height=1cm,color=darkred]}% + \hskip-2cm + \color[t:only]{\blackrule[width=4cm,height=1cm]} +\stopbuffer + +\typebuffer + +We skip back to create an overlay, so we get: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +In the section about transparency a bit more will be said about the relation between +color and transparencies and how to cheat. + +As soon as you need to typeset something for professional printing, spot colors +will show up so they are supported too. A spot color is not really a color but +related to the substance that gets put on the paper. This can be ink but also +something metallic, like silver, gold or some texture. In these cases we need +something to represent it when not printed on a suitable device so again we end +up with a color. This is reflected in the way spot colors are set up. + +\startbuffer +\definecolor [parentspot] [r=.5,g=.2,b=.8] +\definespotcolor [childspot-1] [parentspot] [p=.7,e=fancy] +\definespotcolor [childspot-2] [parentspot] [p=.4] +\stopbuffer + +\typebuffer \getbuffer + +The three colors, two of them are spot colors, show up as follows: + +\setupcolors[spot=yes] + +\showcolorcomponents[parentspot,childspot-1,childspot-2] + +The \type {p} is comparable to the \type {s} in gray scales. The \type {e} +parameter can be used to specify a name for the color. In the \PDF\ file that +name will become the separation name (a popular commercial naming scheme is +Pantone). + +A combination of spotcolor is called a multitone color. These are defined as +follows (we also define a few spotcolors and use transparency): + +\startbuffer +\definespotcolor [spotone] [darkred] [p=1] +\definespotcolor [spottwo] [darkgreen] [p=1] + +\definespotcolor [spotone-t] [darkred] [a=1,t=.5] +\definespotcolor [spottwo-t] [darkgreen] [a=1,t=.5] + +\definemultitonecolor + [whatever] + [spotone=.5,spottwo=.5] + [b=.5] + +\definemultitonecolor + [whatever-t] + [spotone=.5,spottwo=.5] + [b=.5] + [a=1,t=.5] +\stopbuffer + +\typebuffer \getbuffer + +\showcolorcomponents[spotone,spottwo,spotone-t,spottwo-t,whatever,whatever-t] + +Transparencies combine as follows: + +\startbuffer +\blackrule[width=3cm,height=1cm,color=spotone-t]\hskip-1.5cm +\blackrule[width=3cm,height=1cm,color=spotone-t] +\stopbuffer + +\typebuffer + +\startlinecorrection +\dontleavehmode\getbuffer +\stoplinecorrection + +In case you want to specify colors in the \HSV\ color space, you can do that too. +The hue parameter (\type {h}) is in degrees and runs from 0 upto 360 (larger +values get divided). The saturation (\type {s}) and value (\type {v}) parameters +run from 0 to 1. The \type {v} parameter is mandate. In \in {figure} [fig:hsv] we +show what the last two variables do. + +\starttyping +\definecolor[somecolor][h=125,s=0.5,v=0.8] +\stoptyping + +\startMPextensions + vardef hsvcircle(expr s, v) = + image ( save p ; path p ; p := fullcircle ; + save l ; numeric l ; l := length(p)/360 ; + for i=0 upto 360 : + fill origin -- subpath (i*l,(i+1)*l) of p -- cycle withcolor hsvtorgb(i,s,v) ; + endfor ; + ) + enddef; +\stopMPextensions + +\startplacefigure[reference=fig:hsv,title={Four hsv color circle running from 0 to 360 degrees, with zero at the right.}] + \startcombination[4*1] + {\startMPcode draw hsvcircle(0.6,0.6) scaled 3cm ; \stopMPcode} {\tttf s=0.6 v=0.6} + {\startMPcode draw hsvcircle(0.4,0.6) scaled 3cm ; \stopMPcode} {\tttf s=0.4 v=0.6} + {\startMPcode draw hsvcircle(0.6,0.4) scaled 3cm ; \stopMPcode} {\tttf s=0.6 v=0.4} + {\startMPcode draw hsvcircle(0.4,0.4) scaled 3cm ; \stopMPcode} {\tttf s=0.4 v=0.4} + \stopcombination +\stopplacefigure + +% \scratchdimen\dimexpr(\textwidth-118pt)/120\relax +% \dontleavehmode \dostepwiserecurse{0}{359}{1}{% +% \definecolor[tempcolor][h=#1,s=0.6,v=0.6]% +% \blackrule[color=tempcolor,width=\scratchdimen,height=1ex,depth=1ex]% +% \hskip1pt +% } + +If you need to use hexadecimal color specifications you can use these +definitions: + +\starttyping +\definecolor[mycolor][x=4477AA] +\definecolor[mycolor][h=4477AA] +\definecolor[mycolor][x=66] +\definecolor[mycolor][#4477AA] +\stoptyping + +The \type {#} is normally not accepted in \TEX\ source code but when you get the +specification from elsewhere (e.g.\ \XML) it can be convenient. + +\stopsection + +\startsection[title=Freezing colors] + +We can clone colors and thereby overload color dynamically. You can however +freeze colors via the setup option \type {expansion}. + +\startbuffer +\definecolor[green] [r=.5]{({\green green -> red})} +\definecolor[green] [g=.5]{({\green green -> green})} +\definecolor[green] [blue]{({\green green -> blue})} +\definecolor[blue] [red]{({\green green -> red})} +\setupcolors[expansion=yes]% +\definecolor[blue] [red]% +\definecolor[green] [blue]% +\definecolor[blue] [r=.5]{({\green green -> blue})} +\stopbuffer + +\typebuffer + +\start +\definecolor[red] [r=.5]% +\definecolor[green][g=.5]% +\definecolor[blue] [b=.5]% +\getbuffer +\stop + +\stopsection + +\startsection[title=Color groups] + +Nowadays we seldom use colorgroups but they are still supported. Groups are +collections of distinctive colors, something we needed in projects where many +graphics had to be made and consistency between text and image colors was +important. The groups can be translated into similar collections in drawing +programs used at that time. + +\startbuffer +\definecolorgroup + [redish] + [1.00:0.90:0.90, % 1 + 1.00:0.80:0.80, % 2 + 1.00:0.70:0.70, % 3 + 1.00:0.55:0.55, % 4 + 1.00:0.40:0.40, % 5 + 1.00:0.25:0.25, % 6 + 1.00:0.15:0.15, % 7 + 0.90:0.00:0.00] % 8 +\stopbuffer + +\typebuffer \getbuffer + +The redish color is called by number: + +\startbuffer +\blackrule[width=3cm,height=1cm,depth=0pt,color=redish:1]\quad +\blackrule[width=3cm,height=1cm,depth=0pt,color=redish:2]\quad +\blackrule[width=3cm,height=1cm,depth=0pt,color=redish:3] +\stopbuffer + +\typebuffer + +The number of elements is normally limited and eight is about what is useful and +still distinguishes good enough when printed in black and white. + +\startlinecorrection +\dontleavehmode\getbuffer +\stoplinecorrection + +\startlinecorrection +\setupcolors[rgb=no,cmyk=no]\dontleavehmode\getbuffer +\stoplinecorrection + +\stopsection + +\startsection[title=Palets] + +Color palets are handy when you want to use a set of (named) colors but +also want to switch efficiently between different definitions: + +\startbuffer +\definepalet + [standard] + [darkred=darkcyan, + darkgreen=darkmagenta, + darkblue=darkyellow] +\stopbuffer + +\typebuffer \getbuffer + +The \type {\setuppalet} commands switches to a palet. When a requested color is +not part of a palet, a regular lookup happens. This is used as: + +\startbuffer +\blackrule[width=15mm,height=10mm,depth=0mm,color=darkred]\quad +\blackrule[width=15mm,height=10mm,depth=0mm,color=darkgreen]\quad +\blackrule[width=15mm,height=10mm,depth=0mm,color=darkblue]\quad +\setuppalet[standard]% +\blackrule[width=15mm,height=10mm,depth=0mm,color=darkred]\quad +\blackrule[width=15mm,height=10mm,depth=0mm,color=darkgreen]\quad +\blackrule[width=15mm,height=10mm,depth=0mm,color=darkblue] +\stopbuffer + +\typebuffer + +\startlinecorrection +\dontleavehmode \getbuffer +\stoplinecorrection + +Here we use color names but often you end up with more symbolic names: + +\starttyping +\definepalet + [standard] + [important=darkred, + notabene=darkgreen, + warning=darkyellow] +\stoptyping + +As with the regular color commands, the palet mechanism is an old one but it is +well integrated. Instead of inheriting you can also use definitions: + +\starttyping +\definepalet + [standard] + [important={r=.5}, + notabene={g=.5}, + warning={r=.5,g=.5}] +\stoptyping + +\stopsection + +\startsection[title=Transparency] + +We already discussed transparency as part of colors. In most cases we will choose +type {normal} (or \type {1}) as transparency type, but there are more: + +\startluacode + local codes = table.swapped(attributes.transparencies.names) + + context.startcolumns { n = 4 } + context.starttabulate ( { "|B||" }, { keeptogether = "no" } ) + for i=0,#codes do + context.NC() + context(i) + context.NC() + context(codes[i]) + context.NC() + context.NR() + end + context.stoptabulate() + context.stopcolumns() +\stopluacode + +In \in {figure} [fig:transparency] we compare these variants. Not all are as +effective as their effect depends on several factors. You can read more about it +in the \PDF\ specification. + +\startMPextensions + vardef transdemo(expr b) = + image ( save p ; path p ; p := fullcircle ; + save l ; numeric l ; l := length(p)/16 ; + if (b = 1) or (b = 3) : + fill fullcircle scaled 1.00 withcolor yellow ; + fill fullcircle scaled 0.80 withcolor red ; + fill fullcircle scaled 0.60 withcolor black ; + fill fullcircle scaled 0.40 withcolor white ; + fill fullcircle scaled 0.20 withcolor .5white ; + fi ; + if (b = 2) or (b = 3) : + for i=0 upto 15 : + fill origin -- subpath (i*l,(i+1)*l) of p -- cycle + withcolor red + withtransparency (i,0.5) ; + draw textext("\ttbf " & decimal i) ysized .04 shifted (.45,0) rotated (i*360/16 + 360/32) ; + endfor ; + fi ; + ) + enddef; +\stopMPextensions + +\startplacefigure[reference=fig:transparency,title={The differences between the transparency options. The center is explicitly filled with white.}] + \startcombination[3*1] + {\startMPcode draw transdemo(1) scaled 4cm ; \stopMPcode} {\tttf backgrounds used} + {\startMPcode draw transdemo(2) scaled 4cm ; \stopMPcode} {\tttf transparencies used} + {\startMPcode draw transdemo(3) scaled 4cm ; \stopMPcode} {\tttf transparency overlayed} + \stopcombination +\stopplacefigure + +Colors and transparencies are coupled by definitions. We will explain this by +some examples. When we say: + +\startbuffer +\definecolor[clr1][r=.5] +\stopbuffer + +\typebuffer \getbuffer + +A non|-|transparent color is defined and when we say: + +\startbuffer +\definecolor[clr2][g=.5,a=1,t=.5] +\stopbuffer + +\typebuffer \getbuffer + +We defined a color with a transparency. However, color and transparency get separated +attributes. So when we nest them as in: + +\startbuffer +\color[clr1]{\bf RED \color[clr2] {GREEN}} +\color[clr2]{\bf GREEN \color[clr1] {RED} } +\stopbuffer + +\typebuffer + +we get: + +\startlines \getbuffer \stoplines + +The transparency of the outer color is also applied to the inner color. If you +don't want that, you explicitly need to set them: + +\startbuffer +\definecolor[clr3][b=.5,a=1,t=1] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\color[clr1]{\bf RED \color[clr2] {GREEN} \color[clr3]{BLUE} } +\color[clr2]{\bf GREEN \color[clr1] {RED} \color[clr2]{GREEN}} +\color[clr3]{\bf BLUE \color[clr1] {RED} \color[clr2]{GREEN}} +\stopbuffer + +\typebuffer + +we get: + +\startlines \getbuffer \stoplines + +If you define a transparent|-|only color, you get transparent black: + +\startbuffer +\definecolor[clr4][a=1,t=.5] +\stopbuffer + +\typebuffer \getbuffer + +So: + +\startbuffer +\color[clr1]{\bf RED \color[clr4] {RED}} +\color[clr4]{\bf BLACK \color[clr1] {RED}} +\stopbuffer + +\typebuffer + +gives: + +\startlines \getbuffer \stoplines + +In addition to the already discussed definers and setters we also have a few +special ones. Personally I never needed them but they are the for completeness. + +\startbuffer +\definetransparency[tsp1][a=1,t=.5] +\stopbuffer + +\typebuffer \getbuffer + +We apply this to some text: + +\startbuffer +\color [clr1]{\bf RED \transparent[tsp1] {RED} } +\transparent[tsp1]{\bf BLACK \color [clr1] {RED} } +\transparent[tsp1]{\bf BLACK \transparent[reset]{BLACK} } +\stopbuffer + +\typebuffer + +and get: + +\startlines \getbuffer \stoplines + +We can also only switch color: + +\startbuffer +\color[clr1]{\bf RED \color [clr2] {GREEN}} +\color[clr1]{\bf RED \coloronly[clr2] {GREEN}} +\stopbuffer + +\typebuffer + +So the second line has no transparency: + +\startlines \getbuffer \stoplines + +The \typ {\starttransparent} and \type {\startcoloronly} commands are the +complements of \typ {\transparent} and \typ {\coloronly}. + +\stopsection + +\startsection[title=Interpolation] + +You can define intermediate colors in a way comparable with \METAPOST\ \type +{.5[red,green]} kind of specifications. Here are some examples: + +\startbuffer +\definecolor [mycolor1] [.5(red,green)] +\definecolor [mycolor2] [.8(red,green)] +\definecolor [mycolor3] [.4(red,white)] +\definecolor [mycolor4] [.4(white,red)] + +\showcolorcomponents[red,green,mycolor1,mycolor2,mycolor3,mycolor4] +\stopbuffer + +\typebuffer \getbuffer + +An older method, still available is: + +\starttyping +\defineintermediatecolor[mycolor5][0.5,red,green] +\stoptyping + +A variation on this are complementary colors: + +\startbuffer +\definecolor[mycolor1][.5(blue,red)] +\definecolor[mycolor2][-.5(blue,red)] +\definecolor[mycolor3][-(blue)] +\definecolor[mycolor4][-(red)] + +\showcolorcomponents[blue,red,mycolor1,mycolor2,mycolor3,mycolor4] +\stopbuffer + +\typebuffer \getbuffer + +\stopsection + +\startsection[title=PDF] + +Although it is not perfect, \PDF\ evolved in such a way that it will stay around +for a while. One reason is that it has become a standard, or more precisely a set +of standards. Depending on what variant you choose color support is limited. + +\startluacode + +local function state(v) + context.NC() + if v then + context("\\star") + end +end + +context.starttabulate { "|l|c|c|c|c|c|" } +context.NC() context.bold("format") +context.NC() context.bold("gray") +context.NC() context.bold("rgb") +context.NC() context.bold("cmyk") +context.NC() context.bold("spot") +-------.NC() context.bold("multi") +context.NC() context.bold("transparency") +context.NC() context.NR() +for name, data in table.sortedhash(lpdf.formats.data) do + context.NC() context.type(name) + state(data.gray_scale) + state(data.rgb_colors) + state(data.cmyk_colors) + state(data.spot_colors) + -- state(data.nchannel_colorspace) + -- state(data.calibrated_rgb_colors) + -- state(data.cielab_colors) + state(data.transparency) + -- state(data.include_intents) + -- state(data.internal_icc_profiles) + -- state(data.external_icc_profiles) + context.NR() +end +context.stoptabulate() + +\stopluacode + +When you have set the \type{format} with \type {\setupbackend} to one of the +known formats mentioned in the previous table, the color conversions will +automatically kick in. + +\stopsection + +\startsection[title=Unboxing] + +This paragraph is somewhat complex, so skip it when you don't feel comfortable +with the subject or when you've never seen low level \CONTEXT\ code. + +Colors are implemented using attributes. Attributes behave like fonts. This means +that they are kind of frozen once material is boxed. Consider that we define a +box as follows: + +\startbuffer +\setbox0\hbox{\bf default {\darkred red \darkgreen green} default} +\stopbuffer + +\typebuffer \getbuffer + +What do you expect to come out the next code? In \MKII\ the \quote {default} +inside the box will be colored yellow but the internal red and and green words +will keep their color. + +\startbuffer +\bf default {\darkyellow yellow {\box0} yellow} default +\stopbuffer + +\typebuffer + +This is what we get in \MKIV: \start \inlinebuffer \stop + +When we use fonts switches we don't expect the content of the +box to change. So, in the following the \quote {default} texts will +{\em not} become bold. + +\startbuffer +\setbox0\hbox{default {\sl slanted \bi bold italic} default} +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +default {\bf bold {\box0} bold} default +\stopbuffer + +\typebuffer + +Now we get: \inlinebuffer . + +Redoing a box with a new font is sort of tricky as by then all kind of +manipulations have been applied and the original inputs is long gone. But colors +are easier to deal with and therefore in \MKIV\ we have a trick to make sure the +outer color gets applied to the box: + +\startbuffer[enable] +\enabledirectives + [attributes.inheritance] +\stopbuffer + +\startbuffer +default {\bf \darkyellow yellow {\attributedbox0} yellow} default +\stopbuffer + +\typebuffer + +So, we get: \start\inlinebuffer[box]\inlinebuffer[enable]\space\inlinebuffer +\stop, but only after we have enabled this mechanisms explicitly: + +\typebuffer[enable] + +There is also an \type {\attributedcopy} macro. These macros signal the attribute +resolver that this box is to be treated special. + +In \MKII\ we have a similar situation which is why we had the option (only used +deep down in \CONTEXT) to encapsulate a bunch of code with + +\starttyping +\startregistercolor[foregroundcolor] +some macro code ... here foregroundcolor is applied ... more code +\stopregistercolor +\stoptyping + +This is for instance used in the \type {\framed} macro. First we package the +content, foregroundcolor is not yet applied because the injected specials of +literals can interfere badly, but by registering the colors the nested color +calls are tricked into thinking that preceding and following content is colored. +When packaged, we apply backgrounds, frames, and foregroundcolor to the whole +result. Because nested colors were aware of the foregroundcolor they have +properly reverted to this color when needed. + +In \MKIV\ the situation is reversed. Here we definitely need to set the +foregroundcolor because otherwise attributes are not set. This is no problem +because contrary to \MKII\ colors don't interfere (no extra nodes). We could have +flushed the framed content using \type {\attributedbox}, but we don't want to +enable inheritance by default because it comes with some overhead. + +\stopsection + +\startsection[title=Color intents] + +If we do this: + +\startbuffer +\startoverlay + {\blackrule[color=darkred, height=2cm,width=4cm]} + {\blackrule[color=darkblue,height=1cm,width=3cm]} +\stopoverlay +\stopbuffer + +\typebuffer + +we get: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +The blue rectangle is drawn on top of the red one. In print, normally the +printing engine will make sure that there is no red below the blue. In case of +transparent colors this is somewhat tricky because then we definitely want to see +part of what lays below. + +You can control this process with the following commands: + +\starttyping +\setupcolors + [intent=...] +\stoptyping + +The default setting is \type {none} but you can set the intent to \type {overprint} or +\type {knockout} as well. In a running text you can use the following commands: + +\starttyping +\startcolorintent[overprint|knockout] + ... +\stopcolorintent + +\startoverprint + ... +\stopoverprint + +\startknockout + ... +\stopknockout +\stoptyping + +In practice you will probably seldom need to deal with this so best leave the defaults +as they are. + +\stopsection + +\startsection[title=Collections] + +Collections are predefined sets of colors. You find them in the files \type +{colo-imp-*.mkiv} and you can make such files yourself. When you define a color a +command is generated by default. When you load a collection, there is a danger +that you redefine commands unintended. For that reason most collections are +wrapped in: + +\starttyping +\startprotectedcolors + % definitions +\stopprotectedcolors +\stoptyping + +This prevents commands being defined and assumes that colors are accessed by +using the \type {color} parameter of setup commands or in the text with: + +\starttyping +\color[somecolor]{this gets colored} + +\startcolor[somecolor] + this gets colored +\stopcolorintent +\stoptyping + +The default set (\type {rgb}) is already preloaded with: + +\starttyping +\usecolors[rgb] % preloaded +\stoptyping + +You can get a list of colors with + +\startbuffer +\showcolor[rgb] +\stopbuffer + +\typebuffer + +This generates the list: + +\getbuffer + +These are the collections shipped with \CONTEXT. Some names are + +\starttabulate[|T||] +\NC crayola \NC crayon colors \NC \NR +\NC dem \NC a demo set of groups and palets \NC \NR +\NC ema \NC an old coming from an Emacs user \NC \NR +%NC pan \NC a bunch of Pantone colors \NC \NR % can't be distributed +%NC pra \NC colors used at \PRAGMA \NC \NR +\NC rainbow \NC a series of color groups by Alan \NC \NR +\NC ral \NC a set often used in industry (from Germany) \NC \NR +\NC rgb \NC a basic set of colors defined in the \RGB\ color space \NC \NR +%NC ros \NC the roscolux color set used in theater and cinema lighting \NC \NR % probably can't be distributed +\NC x11 \NC (most of the) standard X11 \RGB\ colors \NC \NR +\stoptabulate + +You can look in these files to see what gets defined. Even if you don't use them +they might be illustrative, + +\stopsection + +\startsection[title=Text color] + +Setting the color of the running text is done with: + +\starttyping +\setupcolors + [textcolor=darkgray] +\stoptyping + +If needed you can also set the \type {pagecolormodel} there but its default value +is \type {none} which means that it will obey the global settings. + +\stopsection + +\startsection[title=Tikz] + +In case you use the TikZ graphical subsystem you need to be aware of the the fact +that its color support is more geared towards \LATEX. There is glue code that +binds the \CONTEXT\ color system to its internal representation but there can +still be problems. For instance, not all color systems are supported so \CONTEXT\ +will try to remap, but only when it knows that it has to do so. You can best not +mix colorspaces when you use TikZ. If you really want (and there is no real +reason to do so) you can say: + +\starttyping +\enabledirectives[colors.pgf] +\stoptyping + +and then (at the cost of some extra overhead) define colors as: + +\starttyping +\definecolor[pgfcolora][blue!50!green] +\definecolor[pgfcolorb][red!50!blue] +\stoptyping + +\stopsection + +\startsection[title=Implementation details] + +The low level implementation of colors in \MKIV\ is fundamentally different from +\MKII. In \MKIV\ something like this happens: + +\starttyping +one \color[red]{two} three +\stoptyping + +becomes (with grouping): + +\starttyping +one {<start color: red>two<stop color>} three +\stoptyping + +the start and stop points are in fact injections in the input: a special (for +\DVI) or literals (for \PDF) is inserted that turns the color on and off, but +also information is carried along about the state of color, so that we can +properly nest as well as pick up the current color after a page break. We never +had real problems with this mechanism but one had to keep in mind that injections +like this could interfere with typesetting. This mechanism didn't rely on the +engine for housekeeping, all was done at the \TEX\ end using so called marks. + +In \MKIV\ we use attributes. This means that the sequence now looks like: + +\starttyping +one {<set color attribute to red>two} three +\stoptyping + +The actual handling of color happens when a page is shipped out and there is no +interference with typesetting. The work is mostly done in \LUA. + +Colorspaces (\RGB, \CMYK, spot) were already supported in \MKII\ and of course +still are in \MKIV. However, the colorspace is now a more independent property. +At some point in \MKII\ we also implemented transparency as a property of a +color. In \MKIV\ transparency is still defined with a color but handled +independently. This means that where in \MKII\ color is just one axis, in \MKIV\ +we have three: colorspace (model), color and transparency. This of course has a +bit of a performance and memory hit, but in practice a user won't notice it. + +\stopsection + +\startsection[title=Grouping] + +The \type {\color} and \type {\startcolor} command group their arguments. There might +be cases where this interferes with your intentions, for instance when you want to +set some variable and use its value later on. + +\startbuffer +1 \scratchcounter=1 +plus +1 \advance \scratchcounter by 1 +equals +\the\scratchcounter +\stopbuffer + +\typebuffer + +The summation works out okay: {\bf \inlinebuffer}. + +\startbuffer +\color[darkblue]{1 \scratchcounter=1} +plus +\color[darkblue]{1 \advance \scratchcounter by 1} +equals +\color[darkgreen]{\the\scratchcounter} +\stopbuffer + +\typebuffer + +Here the final result depends on the value of \type {\scratchcounter}: +{\scratchcounter 3 \bf \inlinebuffer}. + +\startbuffer +\start + \pushcolor[darkblue]1 \scratchcounter=1 \popcolor + plus + \pushcolor[darkblue]1 \advance \scratchcounter by 1 \popcolor + equals + \pushcolor[darkgreen]\the\scratchcounter \popcolor +\stop +\stopbuffer + +\typebuffer + +Here we get: {\bf \inlinebuffer}. The \typ {\pushcolor} and \typ {\popcolor} +commands can be used nested which give a bot of overhead. The \typ {\savecolor} +and \typ {\restorecolor} commands are variants that don't stack. They are a bit +more efficient but if you use them nested you probably also will use some +grouping. Where the push||pop pair needs to be matched, the save||restore pair +doesn't impose that restriction. + +\stopsection + +\startsection[title=Commands] + +There are quite some commands that relate to colors but you probably only need +\typ {\definecolor}, \type {\color} and \typ {\startcolor} \unknown \typ +{\stopcolor}. Here we show the complete list. Some commands are redundant, for +instance \typ {\definenamedcolor} is the same as \typ {\definecolor}. + +\placeallsetups + +\stopsection + +\stopchapter + +\stopcomponent |