summaryrefslogtreecommitdiff
path: root/doc/context/sources/general/manuals/colors/colors-basics.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/context/sources/general/manuals/colors/colors-basics.tex')
-rw-r--r--doc/context/sources/general/manuals/colors/colors-basics.tex1204
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