summaryrefslogtreecommitdiff
path: root/tex/context/base/colo-ini.tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/colo-ini.tex')
-rw-r--r--tex/context/base/colo-ini.tex2992
1 files changed, 1496 insertions, 1496 deletions
diff --git a/tex/context/base/colo-ini.tex b/tex/context/base/colo-ini.tex
index 1ba4603db..62723c3eb 100644
--- a/tex/context/base/colo-ini.tex
+++ b/tex/context/base/colo-ini.tex
@@ -1,1496 +1,1496 @@
-%D \module
-%D [ file=colo-ini,
-%D version=1997.4.1,
-%D title=\CONTEXT\ Color Macros,
-%D subtitle=Initialization,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. Non||commercial use is
-%C granted.
-
-\writestatus{loading}{Context Color Macros}
-
-\unprotect
-
-%D Color support is not present in \TEX. Colorful output can
-%D however be accomplished by using specials. This also means
-%D that this support depends on the \DVI\ driver used. At the
-%D moment this module was written, still no decent standard on
-%D color specials has been agreed upon. We therefore decided to
-%D implement a mechanism that is as independant as possible of
-%D drivers.
-%D
-%D Color support shares with fonts that is must be implemented
-%D in a way that permits processing of individual \DVI\ pages.
-%D Furthermore it should honour grouping. The first condition
-%D forces us to use a scheme that keeps track of colors at
-%D page boundaries. This can be done by means of \TEX's
-%D marking mechanism (\type{\mark}).
-%D
-%D When building pages, \TEX\ periodically looks at the
-%D accumulated typeset contents and breaks the page when
-%D suitable. At that moment, control is transfered to the
-%D output routine. This routine takes care of building the
-%D pagebody and for instance adds headers and footers. The page
-%D can be broken in the middle of some colored text, but
-%D headers and footers are often in black upon white or
-%D background. If colors are applied there, they definitely
-%D are used local, which means that they don't cross page
-%D borders.
-%D
-%D Boxes are handled as a whole, which means that when we
-%D apply colors inside a box, those colors don't cross page
-%D boundaries, unless of course boxes are split or unboxed.
-%D Especially in interactive texts, colors are often used in
-%D such a local way: in boxes (buttons and navigational tools)
-%D or in the pagebody (backgrounds).
-%D
-%D So we can distinguish local colors, that don't cross
-%D pages from global colors, of which we can end many pages
-%D later. The color macros will treat both types in a different
-%D way, thus gaining some speed.
-%D
-%D This module also deals with gray scales. Because similar
-%D colors can end up in the same gray scale when printed in
-%D black and white, we also implement a palet system that deals
-%D with these matters. Because of fundamental differences
-%D between color and gray scale printing, in \CONTEXT\ we also
-%D differ between these. For historic reasons |<|we first
-%D implemented gray scales using patterns of tiny periods|>|
-%D and therefore called them {\em rasters}. So don't be
-%D surprised if this term shows up.
-
-\startmessages dutch library: colors
- title: kleur
- 1: systeem -- is globaal actief
- 2: systeem -- is lokaal actief
- 3: -- is niet gedefinieerd
- 4: systeem -- wordt geladen
- 5: onbekend systeem --
- 6: palet -- is beschikbaar
- 7: palet -- is niet beschikbaar
- 8: (verkeerde) specificatie -- bij -- wordt zwart
- 9: -- kleurruimte wordt niet ondersteund
- 10: -- kleurruimte wordt ondersteund
- 11: kleur wordt vertaald in grijs
-\stopmessages
-
-\startmessages english library: colors
- title: color
- 1: system -- is global activated
- 2: system -- is local activated
- 3: -- is not defined
- 4: system -- is loaded
- 5: unknown system --
- 6: palette -- is available
- 7: palette -- is not available
- 8: (invalid) specification -- at color -- becomes black
- 9: -- color space is not supported
- 10: -- color space is supported
- 11: color is converted to gray
-\stopmessages
-
-\startmessages german library: colors
- title: farbe
- 1: system -- ist global aktiviert
- 2: system -- ist lokal aktiviert
- 3: -- ist undefiniert
- 4: system -- ist geladen
- 5: unbekanntes System --
- 6: palette -- ist verfuegbar
- 7: palette -- ist nicht verfuegbar
- 8: (ungueltige) Spezifikation -- bei Farbe -- wird schwarz
- 9: -- Farbraum wird nicht unterstuetzt
- 10: -- Farbraum wird unterstuetzt
- 11: Farbe wird in Grau umgewandelt
-\stopmessages
-
-%D \macros
-%D {definecolor}
-%D {}
-%D
-%D We will enable users to specify colors in \kap{RGB} and
-%D \kap{CMYK} color spaces or gray scales using
-%D
-%D \showsetup{\y!definecolor}
-%D
-%D For example:
-%D
-%D \starttypen
-%D \definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
-%D \stoptypen
-%D
-%D Such color specifications are saved in a macro in the
-%D following way:
-%D
-%D \starttypen
-%D \setvalue{\??cr name}{R:r:g:b}
-%D \setvalue{\??cr name}{C:c:m:y:k}
-%D \setvalue{\??cr name}{S:s}
-%D \stoptypen
-%D
-%D Gray scales are specified with the \type{s} parameter,
-%D where the is derived from screen.
-
-\def\colorlist{}
-
-\def\@@cl@@z{0}
-\def\@@cl@@o{1}
-
-\def\definecolor%
- {\dodoubleargument\dodefinecolor}
-
-\def\dodefinecolor[#1][#2]%
- {% beware
-\saveglobal
- \addtocommalist{#1}\colorlist
-\restoreglobal
- \doifassignmentelse{#2}
- {\let\@@cl@@r=\@@cl@@z\let\@@cl@@g=\@@cl@@z\let\@@cl@@b=\@@cl@@z
- \let\@@cl@@c=\@@cl@@z\let\@@cl@@m=\@@cl@@z\let\@@cl@@y=\@@cl@@z
- \let\@@cl@@k=\@@cl@@z\let\@@cl@@s=\@@cl@@z
- \getparameters[\??cl @@][#2]%
- \doifelse{\@@cl@@r\@@cl@@g\@@cl@@b}{\@@cl@@z\@@cl@@z\@@cl@@z}
- {\doifelse{\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k}{\@@cl@@z\@@cl@@z\@@cl@@z\@@cl@@z}
- {\doifelse{\@@cl@@s}{\@@cl@@z}
- {\showmessage{\m!colors}{8}{{[#2]},#1}%
- \redoglobal\setevalue{\??cr#1}{S:\@@cl@@z}}
- {\redoglobal\setevalue{\??cr#1}{S:\@@cl@@s}}}
- {\redoglobal\setevalue{\??cr#1}{C:\@@cl@@c:\@@cl@@m:\@@cl@@y:\@@cl@@k}}}
- {\redoglobal\setevalue{\??cr#1}{R:\@@cl@@r:\@@cl@@g:\@@cl@@b}}}
- {\doifdefinedelse{\??cr#2}
- {\redoglobal\setevalue{\??cr#1}{\getvalue{\??cr#2}}}
- {\showmessage{\m!colors}{3}{#1}}}%
- \dodoglobal\setvalue{#1}{\color[#1]}}
-
-%D The names of colors are stored in a comma separated list
-%D only for the purpose of showing them with \type{\showcolor}.
-%D
-%D Colors can be defined global by using \type{\doglobal},
-%D like in
-%D
-%D \startbuffer
-%D \doglobal\definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \haalbuffer
-%D
-%D This color shows up as \color[SomeKindOfRed]{some kind
-%D of red}.
-
-%D \macros
-%D {setupcolor}
-%D {}
-%D
-%D Color definitions can be grouped in files with the name:
-%D
-%D \starttypen
-%D \f!colorprefix-identifier.tex
-%D \stoptypen
-%D
-%D where \type{\f!colorprefix} is \unprotect {\tttf \f!colorprefix}.
-%D Loading such a file is done by \protect
-%D
-%D \showsetup{\y!setupcolor}
-%D
-%D Some default colors are specified in \type{colo-rgb.tex},
-%D which is loaded into the format by:
-%D
-%D \starttypen
-%D \setupcolor[rgb]
-%D \stoptypen
-
-\def\colorstyle{}
-
-\def\setupcolor%
- {\dosingleargument\dosetupcolor}
-
-\def\dosetupcolor[#1]%
- {\doifnot{#1}{\colorstyle}
- {\def\colorstyle{#1}%
- \def\dodosetupcolor##1%
- {\makeshortfilename[\f!colorprefix\truefilename{##1}]%
- \readsysfile{\shortfilename}%
- {\showmessage{\m!colors}{4}{\colorstyle}}
- {\showmessage{\m!colors}{5}{\colorstyle}}}%
- \processcommalist[#1]\dodosetupcolor}}
-
-%D When typesetting for paper, we prefer using the \kap{CMYK}
-%D color space, but for on||screen viewing we prefer \kap{RGB}
-%D (the previous implementation supported only this scheme).
-%D Independant of such specifications, we support some automatic
-%D conversions:
-%D
-%D \startopsomming[opelkaar]
-%D \som convert all colors to \kap{RGB}
-%D \som convert all colors to \kap{CMYK}
-%D \som convert all colors to gray scales
-%D \stopopsomming
-%D
-%D We also support optimization of colors to gray scales.
-%D
-%D \startopsomming[verder]
-%D \som reduce gray colors to gray scales
-%D \som reduce \kap{CMY} components to \kap{K}
-%D \stopopsomming
-%D
-%D These options are communicated by means of:
-
-\newif\ifRGBsupported
-\newif\ifCMYKsupported
-\newif\ifconverttoGRAY
-\newif\ifpreferGRAY
-\newif\ifGRAYprefered
-\newif\ifreduceCMYK
-
-%D The last boolean controls reduction of \kap{CMYK} to
-%D \kap{CMY} colors. When set to true, the black component
-%D is added to the other ones.
-
-%D Color modes are entered using the next set of commands.
-%D The \type{\stop} alternatives are implemented in a way
-%D that permits non||grouped use.
-
-\def\dostartcolormodeR#1:#2:#3\od%
- {\bgroup
- \def\@@cl@@r{#1}\def\@@cl@@g{#2}\def\@@cl@@b{#3}%
- \ifpreferGRAY\ifx\@@cl@@r\@@cr@@g\ifx\@@cl@@r\@@cl@@b
- \GRAYpreferedtrue
- \fi\fi\fi
- \ifGRAYprefered
- \dostartgraycolormode\@@cl@@r
- \else\ifRGBsupported
- \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
- \else\ifCMYKsupported
- \convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b
- \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \else
- \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b
- \dostartgraycolormode\@@cl@@s
- \fi\fi\fi
- \egroup}
-
-\def\dostartcolormodeC#1:#2:#3:#4\od%
- {\bgroup
- \def\@@cl@@c{#1}\def\@@cl@@m{#2}\def\@@cl@@y{#3}\def\@@cl@@k{#4}%
- \ifpreferGRAY\ifx\@@cl@@k\@@cl@@z\ifx\@@cl@@c\@@cr@@m\ifx\@@cl@@c\@@cl@@y
- \GRAYpreferedtrue
- \fi\fi\fi\fi
- \ifGRAYprefered
- \dostartgraycolormode\@@cl@@c
- \else\ifCMYKsupported
- \ifreduceCMYK
- \convertCMYKtoCMY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \else
- \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \fi
- \else\ifRGBsupported
- \convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
- \else
- \convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \dostartgraycolormode\@@cl@@s
- \fi\fi\fi
- \egroup}
-
-\def\dostartcolormodeS#1\od%
- {\dostartgraycolormode{#1}}
-
-%D Prefering gray is not the same as converting to gray. Conversion treats
-%D each color components in a different way, while prefering is just a
-%D reduction and thus a space||saving option.
-
-%D \macros
-%D {startcolormode,stopcolormode}
-%D
-%D We use \type{\stopcolormode} to reset the color in
-%D whatever color space and do so by calling the corresponding
-%D special. Both commands can be used for fast color
-%D switching, like in colored verbatim,
-
-\def\dostartcolormode#1:%
- {\getvalue{dostartcolormode#1}}
-
-\def\startcolormode#1%
- {\doifcolorelse{#1}
- {\getcurrentcolorspecs{#1}%
- \expandafter\dostartcolormode\currentcolorspecs\od}
- {\dostopcolormode}}
-
-\def\stopcolormode%
- {\dostopcolormode}
-
-%D We use some reserved names for local color components.
-%D Consistent use of these scratch variables saves us
-%D unneccessary hash entries.
-%D
-%D \starttypen
-%D \@@cl@@r \@@cl@@g \@@cl@@b
-%D \@@cl@@c \@@cl@@m \@@cl@@y \@@cl@@k
-%D \@@cl@@s
-%D \stoptypen
-%D
-%D We implement several conversion routines.
-%D
-%D \starttypen
-%D \convertRGBtoCMYK {r} {g} {b}
-%D \convertRGBtoGRAY {r} {g} {b}
-%D \convertCMYKtoRGB {c} {m} {y} {k}
-%D \convertCMYKtoGRAY {c} {m} {y} {k}
-%D \convertCMYKtoCMY {c} {m} {y} {k}
-%D \stoptypen
-%D
-%D The relation between \kap{Gray}, \kap{RGB} and \kap{CMYK}
-%D is:
-%D
-%D \plaatsformule[-]
-%D \startformule
-%D G = .30r + .59g + .11b
-%D = 1.0 - \min(1.0,\ .30c + .59m + .11y + k)
-%D \stopformule
-%D
-%D When converting from \kap{CMYK} to \kap{RGB} we use the
-%D formula:
-%D
-%D \plaatsformule[-]
-%D \startformule
-%D \eqalign
-%D {r &= 1.0 - \min(1.0,\ c+k) \cr
-%D g &= 1.0 - \min(1.0,\ m+k) \cr
-%D b &= 1.0 - \min(1.0,\ y+k)}
-%D \stopformule
-%D
-%D In the conversion routine the color components are calculated
-%D in three digits precision.
-
-\def\realcolorvalue#1%
- {\ifnum #1<10 0.00\the#1%
- \else\ifnum#1<100 0.0\the#1%
- \else\ifnum#1<1000 0.\the#1%
- \else 1\fi\fi\fi}
-
-\def\doconvertCMYKtoRGB#1\k#2\to#3%
- {\scratchdimen=#1\s!pt
- \advance\scratchdimen by #2\s!pt\relax
- \ifdim\scratchdimen>1\s!pt
- \scratchdimen=-1\s!pt
- \else
- \scratchdimen=-\scratchdimen
- \fi
- \advance\scratchdimen by 1\s!pt
- \multiply\scratchdimen by 1000
- \scratchcounter=\scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard
- \edef#3{\realcolorvalue\scratchcounter}}
-
-\def\convertCMYKtoRGB#1#2#3#4%
- {\doconvertCMYKtoRGB#1\k#4\to\@@cl@@r
- \doconvertCMYKtoRGB#2\k#4\to\@@cl@@g
- \doconvertCMYKtoRGB#3\k#4\to\@@cl@@b}
-
-\def\doconvertRGBtoCMYK#1\to#2%
- {\scratchdimen=#1\s!pt
- \multiply\scratchdimen by 1000
- \scratchcounter=\scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard
- \scratchcounter=-\scratchcounter
- \advance\scratchcounter by 1000
- \edef#2{\realcolorvalue\scratchcounter}}
-
-\def\convertRGBtoCMYK#1#2#3%
- {\doconvertRGBtoCMYK#1\to\@@cl@@c
- \doconvertRGBtoCMYK#2\to\@@cl@@m
- \doconvertRGBtoCMYK#3\to\@@cl@@y
- \let\@@cl@@k=\@@cl@@z}
-
-\def\convertRGBtoGRAY#1#2#3%
- {\scratchdimen=#1\s!pt
- \scratchdimen=300\scratchdimen
- \scratchcounter=\scratchdimen
- \scratchdimen=#2\s!pt
- \scratchdimen=590\scratchdimen
- \advance\scratchcounter by \scratchdimen
- \scratchdimen=#3\s!pt
- \scratchdimen=110\scratchdimen
- \advance\scratchcounter by \scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard
- \edef\@@cl@@s{\realcolorvalue\scratchcounter}}
-
-\def\convertCMYKtoGRAY#1#2#3#4%
- {\convertCMYKtoRGB{#1}{#2}{#3}{#4}%
- \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b}
-
-\def\doconvertCMYKtoCMY#1\k#2\to#3%
- {\scratchdimen=#1\s!pt
- \advance\scratchdimen by #2\s!pt\relax
- \ifdim\scratchdimen>1\s!pt
- \scratchdimen=1\s!pt
- \else
- \scratchdimen=\scratchdimen
- \fi
- \multiply\scratchdimen by 1000
- \scratchcounter=\scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard
- \edef#3{\realcolorvalue\scratchcounter}}
-
-\def\convertCMYKtoCMY#1#2#3#4%
- {\doconvertCMYKtoCMY#1\k#4\to\@@cl@@c
- \doconvertCMYKtoCMY#2\k#4\to\@@cl@@m
- \doconvertCMYKtoCMY#3\k#4\to\@@cl@@y
- \let\@@cl@@k=\@@cl@@z}
-
-%D We already mentioned that colors interfere with building
-%D the pagebody. This means that when the page is composed,
-%D the colors temporary have to be reset. After the page is
-%D shipped out, we have to revive the current color.
-%D
-%D We use \type{\marks} to keep track of colors across page
-%D boundaries. Unfortunately standard \TEX\ supports only one mark,
-%D and using this one for color support only would be a waste.
-%D We therefore use an adapted version of J.~Fox's multiple mark
-%D mechanism as (re|)|implemented in \module{supp-mrk}.
-
-\doifdefinedelse{newmark}
- {\newmark\colormark}
- {\def\colormark#1{}}
-
-%D Using this mark mechanism with lots of colors has one
-%D major drawback: \TEX's memory tends to overflow when
-%D very colorful text is stored in a global box. Even worse is that
-%D the processing time grows considerably. We therefore support
-%D local as well as global color switching.
-%D
-%D Of the next macros, \type{\popcolor} is to be used after
-%D the actual \type{\shipout} and \type{\startcolorpage} and
-%D \type{\stopcolorpage} are called when entering and leaving
-%D the \type{\pagebody} builder. In case of emergencies
-%D \type{\pushcolor} can be used to undo the current color,
-%D for instance when insertions are appended to the page.
-
-%D Before we present the color macros, we first define the
-%D setup command. This command takes care of setting up the
-%D booleans that control local and global behavior and
-%D conversion to other color spaces.
-
-\newif\ifincolor
-\newif\iflocalcolor
-
-\def\setupcolors%
- {\dosingleargument\dosetupcolors}
-
-\def\dosetupcolors[#1]%
- {\getparameters[\??cl][#1]%
- \doifelse{\@@clreductie}{\v!ja}
- {\reduceCMYKtrue}
- {\reduceCMYKfalse}%
- \doifelse{\@@clrgb}{\v!nee}
- {\showmessage{\m!colors}{9}{\v!rgb}\RGBsupportedfalse}
- {\showmessage{\m!colors}{10}{\v!rgb}\RGBsupportedtrue}%
- \doifelse{\@@clcmyk}{\v!nee}
- {\showmessage{\m!colors}{9}{\v!cmyk}\CMYKsupportedfalse}
- {\showmessage{\m!colors}{10}{\v!cmyk}\CMYKsupportedtrue}%
- \processaction
- [\@@clconversie]
- [ \v!ja=>\preferGRAYtrue,
- \v!nee=>\preferGRAYfalse,
- \v!altijd=>\preferGRAYtrue
- \RGBsupportedfalse
- \CMYKsupportedfalse,
- \s!default=>\preferGRAYfalse,
- \s!unknown=>\preferGRAYfalse]%
- \ifRGBsupported
- \converttoGRAYfalse
- \forcegrayMPcolorsfalse
- \else\ifCMYKsupported
- \converttoGRAYfalse
- \forcegrayMPcolorsfalse
- \convertMPcolorstrue
- \ifreduceCMYK
- \reduceMPcolorstrue
- \fi
- \else
- \converttoGRAYtrue
- \forcegrayMPcolorstrue
- \convertMPcolorsfalse
- \reduceMPcolorsfalse
- \showmessage{\m!colors}{11}{}%
- \fi\fi
- \processaction
- [\@@clstatus]
- [\v!globaal=>\incolortrue\localcolorfalse
- \showmessage{\m!colors}{1}{\colorstyle},
- \v!lokaal=>\incolortrue\localcolortrue
- \showmessage{\m!colors}{2}{\colorstyle},
- \v!start=>\let\@@clstatus=\v!globaal
- \incolortrue\localcolorfalse
- \showmessage{\m!colors}{1}{\colorstyle},
- \v!stop=>\incolorfalse\localcolorfalse
- \forcegrayMPcolorstrue]}
-
-%D \macros
-%D {doifcolorelse}
-%D {}
-%D
-%D Switching to a color is done by means of the following
-%D command. Later on we will explain the use of palets. We
-%D define ourselves a color conditional first.
-
-\def\currentpalet{}
-
-\def\doifcolorelse#1%
- {\doifdefinedelse{\??cr\currentpalet#1}}
-
-\def\getcurrentcolorspecs#1%
- {\edef\currentcolorspecs{\getvalue{\??cr\currentpalet#1}}}
-
-%D \macros
-%D {localstartcolor,localstopcolor}
-%D {}
-%D
-%D Simple color support, that is without nesting, is provided
-%D by:
-
-\def\localstartcolor[#1]%
- {\ifincolor
- \localcolortrue
- \doglobalstartcolor[#1]%
- \fi}
-
-\def\localstopcolor%
- {\ifincolor
- \doglobalstopcolor
- \fi}
-
-%D \macros
-%D {startcolor,stopcolor}
-%D {}
-%D
-%D The more save method, the one that saves the current color
-%D state and returns to this state afterward, is activated by:
-%D
-%D \showsetup{\y!startcolor}
-
-\def\startcolor[#1]%
- {\ifincolor
- \doglobalstartcolor[#1]%
- \fi}
-
-\def\stopcolor%
- {\ifincolor
- \doglobalstopcolor
- \fi}
-
-%D This macros call the global color switching ones. Starting
-%D a global, i.e. a possible page boundary crossing, color
-%D mode also sets a \type{\mark} in \TEX's internal list.
-
-\newcount\colorlevel
-
-\setvalue{\??cl0C}{} % saved color
-\setvalue{\??cl0S}{} % stop command
-
-\def\dodoglobalstartcolor[#1]%
- {\xdef\currentcolor{\getvalue{\??cl\the\colorlevel C}}%
- \global\advance\colorlevel by 1
- \setxvalue{\??cl\the\colorlevel C}{#1}%
- \debuggerinfo{\m!colors}
- {start #1 at level \the\colorlevel}%
- \doifelsenothing{#1}
- {\setxvalue{\??cl\the\colorlevel C}{\currentcolor}%
- \setgvalue{\??cl\the\colorlevel S}{\donoglobalstopcolor}}
- {\doifelse{#1}{\currentcolor}
- {\setgvalue{\??cl\the\colorlevel S}{\donoglobalstopcolor}}
- {\doifcolorelse{#1}
- {\docolormark{#1}%
- \setgvalue{\??cl\the\colorlevel S}{\dodoglobalstopcolor}%
- \startcolormode{#1}}
- {\setgvalue{\??cl\the\colorlevel S}{\donoglobalstopcolor}%
- \showmessage{\m!colors}{3}{#1}}}}}
-
-\def\doglobalstartcolor[#1]%
- {\ifnum\colorlevel=0
- \doifelsenothing{#1}
- {\setgvalue{\??cl\the\colorlevel S}{}}
- {\dodoglobalstartcolor[#1]}%
- \else
- \dodoglobalstartcolor[#1]%
- \fi
- \ignorespaces}
-
-\def\donoglobalstopcolor%
- {\ifnum\colorlevel>0
- \xdef\currentcolor{\getvalue{\??cl\the\colorlevel C}}%
- \debuggerinfo{\m!colors}
- {stop \currentcolor\normalspace at level \the\colorlevel}%
- \global\advance\colorlevel by -1
- \fi}
-
-\def\dodoglobalstopcolor%
- {\ifnum\colorlevel>0
- \donoglobalstopcolor
- \xdef\previouscolor{\getvalue{\??cl\the\colorlevel C}}%
- \ifnum\colorlevel=0
- \docolormark{}%
- \stopcolormode
- \else % let's do a bit redundant testing here
- \docolormark{\previouscolor}%
- \doifelsenothing{\previouscolor}
- {\dostopcolormode}
- {\doifcolorelse{\previouscolor}
- {\doifnot{\currentcolor}{\previouscolor}
- {\startcolormode{\previouscolor}}}
- {\dostopcolormode}}%
- \fi
- \fi}
-
-\def\doglobalstopcolor%
- {\getvalue{\??cl\the\colorlevel S}}
-
-%D We don't use grouping and save each stop alternative. This
-%D permits be especially useful in for instance local color
-%D support in verbatim. Using \type{\bgroup}||\type{\egroup}
-%D pairs could interfere with calling commands
-
-%D This color mechanism takes care of nested colors, like in:
-%D
-%D \startbuffer
-%D \kleur[groen]{groen \kleur[groen]{groen \kleur[rood]{rood}} groen}
-%D \kleur[groen]{groen \kleur[]{groen \kleur[rood]{rood}} groen}
-%D \kleur[groen]{groen \kleur[rood]{rood \kleur[rood]{rood}} groen}
-%D \kleur[groen]{groen \kleur[groen]{groen \kleur[]{groen}} groen}
-%D \kleur[groen]{groen \kleur[rood]{rood} groen}
-%D \kleur[groen]{groen \kleur[]{groen} groen}
-%D \kleur[]{zwart \kleur[rood]{rood} zwart}
-%D \kleur[]{zwart}
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D or
-%D
-%D \startvoorbeeld
-%D \startregels
-%D \haalbuffer
-%D \stopregels
-%D \stopvoorbeeld
-%D
-%D Crossing page boundaries is of course also handled.
-%D Undefined or empty color specifications are treated as
-%D efficient as possible.
-%D
-%D \startbuffer
-%D \startkleur[groen]
-%D [groen] \input tufte [groen] \par
-%D \startkleur[]
-%D [groen] \input knuth [groen] \par
-%D \startkleur[rood]
-%D [rood] \input tufte [rood] \par
-%D \startkleur[geel]
-%D [geel] \input knuth [geel] \par
-%D \stopkleur
-%D [rood] \input tufte [rood] \par
-%D \stopkleur
-%D [groen] \input knuth [groen] \par
-%D \stopkleur
-%D [groen] \input tufte [groen] \par
-%D \stopkleur
-%D \stopbuffer
-%D
-%D \startvoorbeeld
-%D \haalbuffer
-%D \stopvoorbeeld
-%D
-%D These quotes are typeset by saying:
-%D
-%D \typebuffer
-%D
-%D Out of efficiency we only use marks when needed. The next
-%D macro tries to find out if indeed a mark should be set.
-%D This macro uses the boolean \type{\ifinpagebody}, which can
-%D be defined and set in the module that handles the pagebody.
-
-\ifx\ifinpagebody\undefined \newif\ifinpagebodytrue \fi
-
-\def\docolormark#1%
- {\ifinpagebody \else
- \iflocalcolor \else
- \dodocolormark{#1}%
- \fi
- \fi}
-
-\let\lastcolormark=\empty
-
-\def\dodocolormark#1%
- {\doifnot{#1}{\lastcolormark}
- {\colormark{#1}%
- \xdef\lastcolormark{#1}}}
-
-%D \macros
-%D {pushcolor, popcolor}
-%D {}
-%D
-%D Pushing the current state in the output routine simply comes
-%D to resetting the color to black, while popping restores the
-%D color state to that of before the break.
-
-\def\pushcolor%
- {\stopcolormode}
-
-\def\popcolor%
- {\doifsomething{\botcolormark}
- {\debuggerinfo{\m!colors}{popping \botcolormark}%
- \startcolormode{\botcolormark}}}
-
-\def\popsplitcolor%
- {\getsplitmarks\colormark % hier wel
- \doifsomething{\botcolormark}
- {\debuggerinfo{\m!colors}{split popping \botcolormark}%
- \startcolormode{\botcolormark}}}
-
-%D \macros
-%D {startcolorpage, stopcolorpage}
-%D {}
-%D
-%D Local use can be forced with the next two macros. Nesting
-%D is still supported but colors are no longer marked.
-
-%D \starttypen
-%D \def\startcolorpage%
-%D {\bgroup
-%D \let\docolormark=\gobbleoneargument
-%D \edef\savedcolorlevel{\the\colorlevel}%
-%D \ifnum\colorlevel>0
-%D \stopcolormode
-%D \fi
-%D \global\colorlevel=0\relax}
-%D
-%D \def\stopcolorpage%
-%D {\global\colorlevel=\savedcolorlevel\relax
-%D \egroup}
-%D \stoptypen
-
-%D The next alternative makes (simple) color separation more
-%D easy:
-
-\def\startcolorpage%
- {\bgroup
- \let\docolormark=\gobbleoneargument
- \edef\savedcolorlevel{\the\colorlevel}%
- \localstartcolor[black]%
- \global\colorlevel=0\relax}
-
-\def\stopcolorpage%
- {\localstopcolor
- \global\colorlevel=\savedcolorlevel\relax
- \egroup}
-
-%D \macros
-%D {color,gray}
-%D {}
-%D
-%D This leaves the simple color command:
-%D
-%D \showsetup{\y!color}
-%D \showsetup{\y!gray}
-%D
-%D Which can be used straightforward: \color[groen]{green as gras}.
-%D We want color support to be similar to font support and
-%D therefore implement \type{\color} as:
-
-\unexpanded\def\color[#1]%
- {\groupedcommand
- {\startcolor[#1]}
- {\stopcolor}}
-
-\unexpanded\def\gray[#1]%
- {\groupedcommand
- {\RGBsupportedfalse\CMYKsupportedfalse\startcolor[#1]}
- {\stopcolor}}
-
-%D This implementation enables use of defined colors like:
-%D
-%D \starttypen
-%D Look at the {\brightgreen bright} side of life and get
-%D yourself no \red{red} head!
-%D \stoptypen
-
-%D \macros
-%D {colorvalue, grayvalue}
-%D {}
-%D
-%D We can typeset the color components using \type{\colorvalue} and
-%D \type{\grayvalue}. The commands:
-%D
-%D \startbuffer
-%D color value of SomeKindOfRed: \colorvalue{SomeKindOfRed} \crlf
-%D gray value of SomeKindOfRed: \grayvalue{SomeKindOfRed}
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D show us:
-%D
-%D \startvoorbeeld
-%D \haalbuffer
-%D \stopvoorbeeld
-
-\def\realcolorformat#1%
- {\ifnum#1<10 0.00\the#1%
- \else\ifnum#1<100 0.0\the#1%
- \else\ifnum#1<1000 0.\the#1%
- \else 1.000\fi\fi\fi}
-
-\def\colorformatseparator{ }
-
-\def\dodoformatcolor#1%
- {\scratchdimen=#1\s!pt\relax
- \ifdim\scratchdimen>1\s!pt
- \scratchdimen=1\s!pt
- \fi
- \multiply\scratchdimen by 1000
- \scratchcounter=\scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard \relax
- \realcolorformat\scratchcounter}
-
-\def\doformatcolorR#1:#2:#3\od%
- {\dodoformatcolor{#1}\colorformatseparator
- \dodoformatcolor{#2}\colorformatseparator
- \dodoformatcolor{#3}}
-
-\def\doformatcolorC#1:#2:#3:#4\od%
- {\dodoformatcolor{#1}\colorformatseparator
- \dodoformatcolor{#2}\colorformatseparator
- \dodoformatcolor{#3}\colorformatseparator
- \dodoformatcolor{#4}}
-
-\def\doformatcolorS#1\od%
- {\dodoformatcolor{#1}}
-
-\def\doformatcolor#1:%
- {\getvalue{doformatcolor#1}}
-
-\def\colorvalue#1%
- {\doifcolorelse{#1}
- {\getcurrentcolorspecs{#1}%
- \expandafter\doformatcolor\currentcolorspecs\od}
- {}}
-
-\def\doformatgrayR#1:#2:#3\od%
- {\convertRGBtoGRAY{#1}{#2}{#3}%
- \dodoformatcolor\@@cl@@s}
-
-\def\doformatgrayC#1:#2:#3:#4\od%
- {\convertCMYKtoGRAY{#1}{#2}{#3}{#4}%
- \dodoformatcolor\@@cl@@s}
-
-\def\doformatgrayS#1\od%
- {\dodoformatcolor{#1}}
-
-\def\doformatgray#1:%
- {\getvalue{doformatgray#1}}
-
-\def\grayvalue#1%
- {\doifcolorelse{#1}
- {\getcurrentcolorspecs{#1}%
- \expandafter\doformatgray\currentcolorspecs\od}
- {}}
-
-%D \macros
-%D {locatstartraster,localstopraster,
-%D startraster,stopraster}
-%D {}
-%D
-%D The previous conversions are not linear and treat each color
-%D component according to human perception curves. Pure gray
-%D (we call them rasters) has equal color components. In
-%D \CONTEXT\ rasters are only used as backgrounds and these
-%D don't cross page boundaries in the way color does. Therefore
-%D we don't need stacks and marks. Just to be compatible with
-%D color support we offer both 'global' and 'local' commands.
-
-\def\localstartraster[#1]%
- {\doifinstringelse{.}{#1}
- {\dostartgraymode{#1}}
- {\dostartgraymode{\@@rsraster}}}
-
-\def\localstopraster%
- {\dostopgraymode}
-
-\def\startraster%
- {\localstartraster}
-
-\def\stopraster%
- {\localstopraster}
-
-%D In this documentation we will not go into too much details
-%D on palets. Curious users can find more information on this
-%D topic in \uit[use of color].
-%D
-%D At the moment we implemented color in \CONTEXT\ color
-%D printing was not yet on the desktop. In spite of this lack our
-%D graphics designer made colorfull illustrations. When printed
-%D on a black and white printer, distinctive colors can come
-%D out equally gray. We therefore decided to use only colors
-%D that were distinctive in colors as well as in black and
-%D white print.
-%D
-%D Although none of the graphic packages we used supported
-%D logical colors and global color redefition, we build this
-%D support into \CONTEXT. This enabled us to experiment and
-%D also prepared us for the future.
-
-%D \macros
-%D {definepalet}
-%D {}
-%D
-%D Colors are grouped in palets. The colors in such a palet can
-%D have colorful names, but best is to use names that specify
-%D their use, like {\em important} or {\em danger}. As a sort
-%D of example \CONTEXT\ has some palets predefined,
-%D like:\voetnoot{At the time I wrote the palet support, I was
-%D reading 'A hort history of time' of S.~Hawkins, so that's
-%D why we stuck to quarks.}
-%D
-%D \starttypen
-%D \definepalet
-%D [alfa]
-%D [ top=rood:7,
-%D bottom=groen:6,
-%D up=blauw:5,
-%D down=cyaan:4,
-%D strange=magenta:3,
-%D charm=geel:2]
-%D \stoptypen
-%D
-%D It's formal definition is:
-%D
-%D \showsetup{\y!definepalet}
-%D
-%D Visualized, such a palet looks like:
-%D
-%D \startbuffer[palet]
-%D \showpalet [alfa] [horizontaal,naam,nummer,waarde]
-%D \stopbuffer
-%D
-%D \startregelcorrectie
-%D \haalbuffer[palet]
-%D \stopregelcorrectie
-%D
-%D This bar shows both the color and gray alternatives of the
-%D palet components (not visible in black and white print).
-%D
-%D When needed, one can copy a palet by saying:
-%D
-%D \starttypen
-%D \definepalet [TEXcolorpretty] [colorpretty]
-%D \stoptypen
-%D
-%D This saves us some typing in for instance the modules that
-%D deal with pretty verbatim typesetting.
-
-\def\definepalet%
- {\dodoubleargument\dodefinepalet}
-
-\def\dodefinepalet[#1][#2]%
- {\doifassignmentelse{#2}
- {\setvalue{\??pa#1}{}%
- \setevalue{\??pa\??pa#1}{#2}%
- \showmessage{\m!colors}{6}{#1}%
- \def\dodododefinepalet[##1=##2]%
- {\doifvaluesomething{\??pa#1}
- {\setevalue{\??pa#1}{\getvalue{\??pa#1},}}%
- \setevalue{\??pa#1}{\getvalue{\??pa#1}##1}%
- \doifdefinedelse{\??cr##2}
- {\setevalue{\??cr#1:##1}{\getvalue{\??cr##2}}}
- {\setevalue{\??cr#1:##1}{S:0}}}%
- \def\dododefinepalet##1%
- {\dodododefinepalet[##1]}%
- \processcommalist[#2]\dododefinepalet}
- {\doifdefined{\??pa#2}
- {\expanded{\dodefinepalet[#1][\getvalue{\??pa\??pa#2}]}}}}
-
-%D \macros
-%D {setuppalet}
-%D {}
-%D
-%D Colors are taken from the current palet, if defined.
-%D Setting the current palet is done by:
-%D
-%D \showsetup{\y!setuppalet}
-
-\def\currentpalet{}
-
-\def\setuppalet%
- {\dosingleempty\dosetuppalet}
-
-\def\dosetuppalet[#1]%
- {\doifelsenothing{#1}
- {\def\currentpalet{}}
- {\doifelsevaluenothing{\??pa#1}
- {\showmessage{\m!colors}{7}{#1}%
- \def\currentpalet{}}
- {\def\currentpalet{#1:}}}}
-
-%D \macros
-%D {showpalet}
-%D {}
-%D
-%D The previous visualization was typeset with:
-%D
-%D \typebuffer[palet]
-%D
-%D This commands is defined as:
-%D
-%D \showsetup{\y!showpalet}
-
-\def\showpalet%
- {\dodoubleargument\doshowpalet}
-
-\def\doshowpalet[#1][#2]%
- {\doifdefined{\??pa#1}
- {\doifinsetelse{\v!vertikaal}{#2}
- {\showverticalpalet[#1][#2]}
- {\showhorizontalpalet[#1][#2]}}}
-
-\def\showverticalpalet[#1][#2]%
- {\localvbox
- {\offinterlineskip
- \setuppalet[#1]
- \def\rule%
- {\vrule\!!width3em\!!height\ht\strutbox\!!depth\dp\strutbox}
- \tabskip\!!zeropoint
- \def\doshowpalet##1%
- {\doifinsetelse{\v!nummer}{#2}{##1\hskip.5em}{}&
- \color[##1]{\rule}\gray[##1]{\rule}&
- \doifinset{\v!waarde}{#2}{\hskip.5em\colorvalue{##1}}\crcr}
- \halign
- {\hss##&\hss##\hss&##\cr
- &\doifinset{\v!naam}{#2}{\strut#1}&\cr%
- \processpalet[#1]\doshowpalet\crcr}}}
-
-\def\showhorizontalpalet[#1][#2]%
- {\localvbox
- {\offinterlineskip
- \setuppalet[#1]
- \tabskip\!!zeropoint
- \!!widtha=\!!zeropoint
- \doifinset{\v!nummer}{#2}
- {\def\doshowpalet##1%
- {\setbox0=\hbox{##1}%
- \ifdim\!!widtha<\wd0\!!widtha=\wd0\fi}%
- \processpalet[#1]\doshowpalet}%
- \advance\!!widtha by 1em
- \ifdim\!!widtha<5em
- \!!widtha=5em
- \fi
- \halign
- {##&&\hbox to \!!widtha{\hss##\hss}\cr
- \doifinset{\v!nummer}{#2}
- {\def\doshowpalet##1{&\strut##1}%
- \processpalet[#1]\doshowpalet}\cr
- \doifinset{\v!naam}{#2}{#1\hskip.5em}%
- \def\doshowpalet##1%
- {&\color[##1]{\vrule\!!width\!!widtha\!!height\ht\strutbox\!!depth\!!zeropoint}}%
- \processpalet[#1]\doshowpalet\crcr
- \def\doshowpalet##1%
- {&\gray[##1]{\vrule\!!width\!!widtha\!!height\!!zeropoint\!!depth\dp\strutbox}}%
- \processpalet[#1]\doshowpalet\crcr
- \doifinset{\v!waarde}{#2}
- {\def\doshowpalet##1%
- {&\vbox
- {\hsize\!!widtha
- \vskip.25ex
- \everypar{\strut}
- \veryraggedcenter
- \let\colorformatseparator=\endgraf
- \colorvalue{##1}}}%
- \processpalet[#1]\doshowpalet}%
- \crcr}}}
-
-\def\processpalet[#1]%
- {\expanded{\globalprocesscommalist[\getvalue{\??pa#1}]}}
-
-%D \macros
-%D {definecolorgroup}
-%D {}
-%D
-%D The naming of the colors in this palet suggests some
-%D ordening, which in turn is suported by color grouping.
-%D
-%D \starttypen
-%D \definecolorgroup
-%D [rood]
-%D [1.00:0.90:0.90,
-%D 1.00:0.80:0.80,
-%D 1.00:0.70:0.70,
-%D 1.00:0.55:0.55,
-%D 1.00:0.40:0.40,
-%D 1.00:0.25:0.25,
-%D 1.00:0.15:0.15,
-%D 0.90:0.00:0.00]
-%D \stoptypen
-%D
-%D In such a color group colors are numbered from~$1$ to~$n$.
-%D
-%D \showsetup{\y!definecolorgroup}
-%D
-%D This kind of specification is not only more compact than
-%D defining each color separate, it also loads faster and takes
-%D less bytes.
-
-\def\definecolorgroup%
- {\dotripleempty\dodefinecolorgroup}
-
-\def\dodefinecolorgroup[#1][#2][#3]%
- {\ifthirdargument
- \processaction
- [#2]
- [ \v!cmyk=>\edef\currentcolorspace{C},
- \v!rgb=>\edef\currentcolorspace{R},
- \v!gray=>\edef\currentcolorspace{S},
- \s!unknown=>\edef\currentcolorspace{R}]%
- \scratchcounter=0
- \def\dododefinecolorgroup##1%
- {\advance\scratchcounter by 1
- \setevalue{\??cr#1:\the\scratchcounter}{\currentcolorspace:##1}}%
- \processcommalist[#3]\dododefinecolorgroup
- \else
- \doifinstringelse{:}{#2}
- {\definecolorgroup[#1][\v!rgb][#2]}
- {\doloop
- {\doifdefinedelse{\??cr#2:\recurselevel}
- {\setevalue{\??cr#1:\recurselevel}%
- {\getvalue{\??cr#2:\recurselevel}}}
- {\exitloop}}}%
- \fi}
-
-%D \macros
-%D {showcolorgroup}
-%D {}
-%D
-%D We can show the group by:
-%D
-%D \startbuffer
-%D \showcolorgroup [blauw] [horizontaal,naam,nummer,waarde]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D or in color:
-%D
-%D \startregelcorrectie
-%D \haalbuffer
-%D \stopregelcorrectie
-%D
-%D which uses:
-%D
-%D \showsetup{\y!showcolorgroup}
-
-\def\showcolorgroup%
- {\dodoubleargument\doshowcolorgroup}
-
-\def\doshowcolorgroup[#1][#2]%
- {\doifdefined{\??cr#1:1}
- {\doifinsetelse{\v!vertikaal}{#2}
- {\showverticalcolorgroup[#1][#2]}
- {\showhorizontalcolorgroup[#1][#2]}}}
-
-\def\showhorizontalcolorgroup[#1][#2]%
- {\localvbox
- {\offinterlineskip
- \setuppalet
- \tabskip\!!zeropoint
- \def\rule%
- {\vrule\!!width4em\!!height\ht\strutbox\!!depth\dp\strutbox}
- \def\colorformatseparator{\strut\cr}
- \def\dodoshowgroup##1%
- {\halign
- {\hss####\hss\cr
- \doifinset{\v!nummer}{#2}{\strut##1}\cr
- \color[#1:##1]{\vrule\!!width4em\!!height\ht\strutbox\!!depth\!!zeropoint}\cr
- \gray[#1:##1]{\vrule\!!width4em\!!height\!!zeropoint\!!depth\dp\strutbox}\cr
- \doifinset{\v!waarde}{#2}{\colorvalue{#1:##1}\strut}\crcr}}
- \def\doshowgroup##1%
- {\doifdefined{\??cr#1:##1}
- {\vbox{\dodoshowgroup{##1}}}}
- \hbox
- {\doifinset{\v!naam}{#2}
- {\strut
- \doifinsetelse{\v!waarde}{#2}
- {\raise3\lineheight\hbox{#1\hskip.5em}}
- {#1}%
- \hskip.5em}%
- \doshowgroup1\doshowgroup2\doshowgroup3\doshowgroup4%
- \doshowgroup5\doshowgroup6\doshowgroup7\doshowgroup8}}}
-
-\def\showverticalcolorgroup[#1][#2]%
- {\localvbox
- {\offinterlineskip
- \setuppalet
- \tabskip\!!zeropoint
- \def\rule%
- {\vrule\!!width2.5em\!!height\ht\strutbox\!!depth\dp\strutbox}
- \def\doshowgroup##1%
- {\doifdefined{\??cr#1:##1}
- {\doifinset{\v!nummer}{#2}{##1\hskip.5em}&
- \color[#1:##1]{\rule}\gray[#1:##1]{\rule}&
- \doifinset{\v!waarde}{#2}{\hskip.5em\colorvalue{#1:##1}}\crcr}}
- \halign
- {\hss##&\hss##\hss&##\hss\cr
- &\doifinset{\v!naam}{#2}{\strut#1}&\crcr
- \doshowgroup1\doshowgroup2\doshowgroup3\doshowgroup4%
- \doshowgroup5\doshowgroup6\doshowgroup7\doshowgroup8}}}
-
-%D There are ten predefined color groups, like
-%D \color[groen]{\em groen}, \color[rood]{\em rood},
-%D \color[blauw]{\em blauw}, \color[cyaan]{\em cyaan},
-%D \color[magenta]{\em magenta} and \color[geel]{\em geel}.
-%D
-%D \startregelcorrectie
-%D \hbox to \hsize
-%D {\hss
-%D \showcolorgroup [rood] [vertikaal,naam,nummer]\hss
-%D \showcolorgroup [groen] [vertikaal,naam]\hss
-%D \showcolorgroup [blauw] [vertikaal,naam]\hss
-%D \showcolorgroup [cyaan] [vertikaal,naam]\hss
-%D \showcolorgroup [magenta] [vertikaal,naam]\hss
-%D \showcolorgroup [geel] [vertikaal,naam]\hss}
-%D \stopregelcorrectie
-%D
-%D These groups are used to define palets {\em alfa} upto {\em
-%D zeta}. As long as we don't use colors from the same row, we
-%D get ourselves distinctive palets. By activating such a palet
-%D one gains access to its members {\em top} to {\em charm} (of
-%D course one should use more suitable names than these).
-%D
-%D \startregelcorrectie
-%D \hbox to \hsize
-%D {\showpalet [alfa] [vertikaal,naam,nummer]\hss
-%D \showpalet [beta] [vertikaal,naam]\hss
-%D \showpalet [gamma] [vertikaal,naam]\hss
-%D \showpalet [delta] [vertikaal,naam]\hss
-%D \showpalet [epsilon] [vertikaal,naam]\hss
-%D \showpalet [zeta] [vertikaal,naam]}
-%D \stopregelcorrectie
-%D
-%D By using the keyword \type{\v!waarde} the individual color
-%D components are shown too. When printed in color, these
-%D showcases show both the colors and the gray value.
-
-%D \macros
-%D {comparepalet}
-%D {}
-%D
-%D There are some more testing macros available:
-%D
-%D \startbuffer
-%D \comparepalet [alfa]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D shows the palet colors against a background:
-%D
-%D \startregelcorrectie
-%D \haalbuffer
-%D \stopregelcorrectie
-%D
-%D The formal definition is:
-%D
-%D \showsetup{\y!comparepalet}
-
-\def\comparepalet%
- {\dosingleargument\docomparepalet}
-
-\def\docomparepalet[#1]%
- {\doifdefined{\??pa#1}
- {\hbox
- {\dodocomparepalet\color[#1]%
- \quad
- \dodocomparepalet\gray[#1]}}}
-
-\def\dodocomparepalet#1[#2]%
- {\localvbox
- {\offinterlineskip
- \setuppalet[#2]
- \getcommacommandsize[\getvalue{\??pa#2}]
- \!!widtha=2em\relax
- \hsize=\commalistsize\!!widtha
- \def\rule%
- {\vrule\!!width.5\!!widtha\!!height2.25ex\!!depth-.75ex}
- \def\dododocomparepalet##1%
- {\hbox
- {\setbox0=\hbox
- {#1[##1]{\vrule\!!width\hsize\!!height3ex}}%
- \wd0=\!!zeropoint\box0
- \hbox to \hsize
- {\def\dododocomparepalet####1%
- {\hbox to \!!widtha
- {\hss#1[####1]{\rule}\hss}}%
- \processcommacommand[\getvalue{\??pa#2}]\dododocomparepalet}}
- \endgraf}
- \processcommacommand[\getvalue{\??pa#2}]\dododocomparepalet}}
-
-%D \macros
-%D {comparecolorgroup}
-%D {}
-%D
-%D The similar command:
-%D
-%D \startbuffer
-%D \comparecolorgroup [blauw]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D shows color groups:
-%D
-%D \startregelcorrectie
-%D \haalbuffer
-%D \stopregelcorrectie
-%D
-%D this commands are defined as:
-%D
-%D \showsetup{\y!comparecolorgroup}
-
-\def\comparecolorgroup%
- {\dosingleargument\docomparecolorgroup}
-
-\def\docomparecolorgroup[#1]%
- {\doifdefined{\??cr#1:1}
- {\hbox
- {\dodocomparecolorgroup\color[#1]%
- \quad
- \dodocomparecolorgroup\gray[#1]}}}
-
-\def\dodocomparecolorgroup#1[#2]%
- {\localvbox
- {\!!counta=0
- \dorecurse{15}
- {\doifdefined{\??cr#2:\recurselevel}{\advance\!!counta by 1}}
- \!!widtha=2em\relax
- \hsize=\!!counta\!!widtha
- \def\rule%
- {\vrule\!!width.5\!!widtha\!!height2.25ex\!!depth-.75ex}
- \def\dododocomparecolorgroup##1%
- {\hbox to \hsize
- {\setbox0=\hbox
- {#1[#2:##1]{\vrule\!!width\hsize\!!height3ex}}%
- \wd0=\!!zeropoint\box0
- \hbox to \hsize
- {\hss\dorecurse{\!!counta}{#1[#2:\recurselevel]{\rule}\hss}}}
- \endgraf}
- \dorecurse{\!!counta}{\dododocomparecolorgroup\recurselevel}}}
-
-%D \macros
-%D {showcolor}
-%D {}
-%D
-%D But let's not forget that we also have the more traditional
-%D non||related colors. These show up after:
-%D
-%D \starttypen
-%D \showcolor [name]
-%D \stoptypen
-%D
-%D Where \type{name} for instance can be \type{rgb}.
-%D
-%D \showsetup{\y!showcolor}
-
-\def\showcolor[#1]%
- {\bgroup
- \setupcolor[#1]
- \stelwitruimtein[\v!geen]
- \def\rule%
- {\vrule\!!width4em\!!height\ht\strutbox\!!depth\dp\strutbox}
- \def\docommand##1%
- {\hbox
- {\gray[##1]{\rule}\quad
- \color[##1]{\rule}\quad
- \grayvalue{##1}\quad
- \hbox to 12em{\colorvalue{##1}\hss}%
- \strut##1}
- \endgraf}
- \processcommacommand[\colorlist]\docommand
- \egroup}
-
-%D \macros
-%D {negativecolorbox}
-%D
-%D Sometimes, especially when we deal with typesetting
-%D devices, we want to reverse the color scheme. Instead of
-%D recalculating all those colors, we use a quick and dirty
-%D approach:
-%D
-%D \starttypen
-%D \negativecolorbox0
-%D \stoptypen
-%D
-%D will negate the colors in box zero.
-
-\def\negatecolorbox#1%
- {\setbox#1=\hbox
- {\dostartnegative
- \localstartcolor[white]%
- \vrule\!!height\ht#1\!!depth\dp#1\!!width\wd#1%
- \localstopcolor
- \hskip-\wd#1%
- \box#1\dostopnegative}}
-
-%D \macros
-%D {ifMPgraphics, MPcolor}
-%D
-%D A very special macro is \type{\MPcolor}. This one can be
-%D used to pass a \CONTEXT\ color to \METAPOST.
-%D
-%D \starttypen
-%D \MPcolor{my own red}
-%D \stoptypen
-%D
-%D This macro returns a \METAPOST\ triplet \type{(R,G,B)}.
-%D Only \kap{RGB} colors and gray scales are supported.
-
-\ifx\MPgraphicstrue\undefined
- \newif\ifMPgraphics\MPgraphicstrue
-\fi
-
-\def\MPcolor#1%
- {\ifMPgraphics
- \@EA\@EA\@EA\doMPcolor\csname\??cr#1\endcsname::::\end
- \else
- #1%
- \fi}
-
-\def\doMPcolor#1:#2:#3:#4:#5\end%
- {\if#1R(#2,#3,#4)\else\if#2G(#2,#2,#3)\else(1,1,1)\fi\fi}
-
-%D We default to the colors defined in \module{colo-rgb} and
-%D support both \kap{RGB} and \kap{CMYK} output.
-
-\setupcolor
- [\v!rgb]
-
-\setupcolors
- [\c!status=\v!stop,
- \c!conversie=\v!ja,
- \c!reductie=\v!nee,
- \c!rgb=\v!ja,
- \c!cmyk=\v!ja]
-
-%D As we can see, color support is turned off by default.
-%D Reduction of gray colors to gray scales is turned on.
-
-\protect
-
-\endinput
+%D \module
+%D [ file=colo-ini,
+%D version=1997.4.1,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. Non||commercial use is
+%C granted.
+
+\writestatus{loading}{Context Color Macros}
+
+\unprotect
+
+%D Color support is not present in \TEX. Colorful output can
+%D however be accomplished by using specials. This also means
+%D that this support depends on the \DVI\ driver used. At the
+%D moment this module was written, still no decent standard on
+%D color specials has been agreed upon. We therefore decided to
+%D implement a mechanism that is as independant as possible of
+%D drivers.
+%D
+%D Color support shares with fonts that is must be implemented
+%D in a way that permits processing of individual \DVI\ pages.
+%D Furthermore it should honour grouping. The first condition
+%D forces us to use a scheme that keeps track of colors at
+%D page boundaries. This can be done by means of \TEX's
+%D marking mechanism (\type{\mark}).
+%D
+%D When building pages, \TEX\ periodically looks at the
+%D accumulated typeset contents and breaks the page when
+%D suitable. At that moment, control is transfered to the
+%D output routine. This routine takes care of building the
+%D pagebody and for instance adds headers and footers. The page
+%D can be broken in the middle of some colored text, but
+%D headers and footers are often in black upon white or
+%D background. If colors are applied there, they definitely
+%D are used local, which means that they don't cross page
+%D borders.
+%D
+%D Boxes are handled as a whole, which means that when we
+%D apply colors inside a box, those colors don't cross page
+%D boundaries, unless of course boxes are split or unboxed.
+%D Especially in interactive texts, colors are often used in
+%D such a local way: in boxes (buttons and navigational tools)
+%D or in the pagebody (backgrounds).
+%D
+%D So we can distinguish local colors, that don't cross
+%D pages from global colors, of which we can end many pages
+%D later. The color macros will treat both types in a different
+%D way, thus gaining some speed.
+%D
+%D This module also deals with gray scales. Because similar
+%D colors can end up in the same gray scale when printed in
+%D black and white, we also implement a palet system that deals
+%D with these matters. Because of fundamental differences
+%D between color and gray scale printing, in \CONTEXT\ we also
+%D differ between these. For historic reasons |<|we first
+%D implemented gray scales using patterns of tiny periods|>|
+%D and therefore called them {\em rasters}. So don't be
+%D surprised if this term shows up.
+
+\startmessages dutch library: colors
+ title: kleur
+ 1: systeem -- is globaal actief
+ 2: systeem -- is lokaal actief
+ 3: -- is niet gedefinieerd
+ 4: systeem -- wordt geladen
+ 5: onbekend systeem --
+ 6: palet -- is beschikbaar
+ 7: palet -- is niet beschikbaar
+ 8: (verkeerde) specificatie -- bij -- wordt zwart
+ 9: -- kleurruimte wordt niet ondersteund
+ 10: -- kleurruimte wordt ondersteund
+ 11: kleur wordt vertaald in grijs
+\stopmessages
+
+\startmessages english library: colors
+ title: color
+ 1: system -- is global activated
+ 2: system -- is local activated
+ 3: -- is not defined
+ 4: system -- is loaded
+ 5: unknown system --
+ 6: palette -- is available
+ 7: palette -- is not available
+ 8: (invalid) specification -- at color -- becomes black
+ 9: -- color space is not supported
+ 10: -- color space is supported
+ 11: color is converted to gray
+\stopmessages
+
+\startmessages german library: colors
+ title: farbe
+ 1: system -- ist global aktiviert
+ 2: system -- ist lokal aktiviert
+ 3: -- ist undefiniert
+ 4: system -- ist geladen
+ 5: unbekanntes System --
+ 6: palette -- ist verfuegbar
+ 7: palette -- ist nicht verfuegbar
+ 8: (ungueltige) Spezifikation -- bei Farbe -- wird schwarz
+ 9: -- Farbraum wird nicht unterstuetzt
+ 10: -- Farbraum wird unterstuetzt
+ 11: Farbe wird in Grau umgewandelt
+\stopmessages
+
+%D \macros
+%D {definecolor}
+%D {}
+%D
+%D We will enable users to specify colors in \kap{RGB} and
+%D \kap{CMYK} color spaces or gray scales using
+%D
+%D \showsetup{\y!definecolor}
+%D
+%D For example:
+%D
+%D \starttypen
+%D \definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
+%D \stoptypen
+%D
+%D Such color specifications are saved in a macro in the
+%D following way:
+%D
+%D \starttypen
+%D \setvalue{\??cr name}{R:r:g:b}
+%D \setvalue{\??cr name}{C:c:m:y:k}
+%D \setvalue{\??cr name}{S:s}
+%D \stoptypen
+%D
+%D Gray scales are specified with the \type{s} parameter,
+%D where the is derived from screen.
+
+\def\colorlist{}
+
+\def\@@cl@@z{0}
+\def\@@cl@@o{1}
+
+\def\definecolor%
+ {\dodoubleargument\dodefinecolor}
+
+\def\dodefinecolor[#1][#2]%
+ {% beware
+\saveglobal
+ \addtocommalist{#1}\colorlist
+\restoreglobal
+ \doifassignmentelse{#2}
+ {\let\@@cl@@r=\@@cl@@z\let\@@cl@@g=\@@cl@@z\let\@@cl@@b=\@@cl@@z
+ \let\@@cl@@c=\@@cl@@z\let\@@cl@@m=\@@cl@@z\let\@@cl@@y=\@@cl@@z
+ \let\@@cl@@k=\@@cl@@z\let\@@cl@@s=\@@cl@@z
+ \getparameters[\??cl @@][#2]%
+ \doifelse{\@@cl@@r\@@cl@@g\@@cl@@b}{\@@cl@@z\@@cl@@z\@@cl@@z}
+ {\doifelse{\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k}{\@@cl@@z\@@cl@@z\@@cl@@z\@@cl@@z}
+ {\doifelse{\@@cl@@s}{\@@cl@@z}
+ {\showmessage{\m!colors}{8}{{[#2]},#1}%
+ \redoglobal\setevalue{\??cr#1}{S:\@@cl@@z}}
+ {\redoglobal\setevalue{\??cr#1}{S:\@@cl@@s}}}
+ {\redoglobal\setevalue{\??cr#1}{C:\@@cl@@c:\@@cl@@m:\@@cl@@y:\@@cl@@k}}}
+ {\redoglobal\setevalue{\??cr#1}{R:\@@cl@@r:\@@cl@@g:\@@cl@@b}}}
+ {\doifdefinedelse{\??cr#2}
+ {\redoglobal\setevalue{\??cr#1}{\getvalue{\??cr#2}}}
+ {\showmessage{\m!colors}{3}{#1}}}%
+ \dodoglobal\setvalue{#1}{\color[#1]}}
+
+%D The names of colors are stored in a comma separated list
+%D only for the purpose of showing them with \type{\showcolor}.
+%D
+%D Colors can be defined global by using \type{\doglobal},
+%D like in
+%D
+%D \startbuffer
+%D \doglobal\definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \haalbuffer
+%D
+%D This color shows up as \color[SomeKindOfRed]{some kind
+%D of red}.
+
+%D \macros
+%D {setupcolor}
+%D {}
+%D
+%D Color definitions can be grouped in files with the name:
+%D
+%D \starttypen
+%D \f!colorprefix-identifier.tex
+%D \stoptypen
+%D
+%D where \type{\f!colorprefix} is \unprotect {\tttf \f!colorprefix}.
+%D Loading such a file is done by \protect
+%D
+%D \showsetup{\y!setupcolor}
+%D
+%D Some default colors are specified in \type{colo-rgb.tex},
+%D which is loaded into the format by:
+%D
+%D \starttypen
+%D \setupcolor[rgb]
+%D \stoptypen
+
+\def\colorstyle{}
+
+\def\setupcolor%
+ {\dosingleargument\dosetupcolor}
+
+\def\dosetupcolor[#1]%
+ {\doifnot{#1}{\colorstyle}
+ {\def\colorstyle{#1}%
+ \def\dodosetupcolor##1%
+ {\makeshortfilename[\f!colorprefix\truefilename{##1}]%
+ \readsysfile{\shortfilename}%
+ {\showmessage{\m!colors}{4}{\colorstyle}}
+ {\showmessage{\m!colors}{5}{\colorstyle}}}%
+ \processcommalist[#1]\dodosetupcolor}}
+
+%D When typesetting for paper, we prefer using the \kap{CMYK}
+%D color space, but for on||screen viewing we prefer \kap{RGB}
+%D (the previous implementation supported only this scheme).
+%D Independant of such specifications, we support some automatic
+%D conversions:
+%D
+%D \startopsomming[opelkaar]
+%D \som convert all colors to \kap{RGB}
+%D \som convert all colors to \kap{CMYK}
+%D \som convert all colors to gray scales
+%D \stopopsomming
+%D
+%D We also support optimization of colors to gray scales.
+%D
+%D \startopsomming[verder]
+%D \som reduce gray colors to gray scales
+%D \som reduce \kap{CMY} components to \kap{K}
+%D \stopopsomming
+%D
+%D These options are communicated by means of:
+
+\newif\ifRGBsupported
+\newif\ifCMYKsupported
+\newif\ifconverttoGRAY
+\newif\ifpreferGRAY
+\newif\ifGRAYprefered
+\newif\ifreduceCMYK
+
+%D The last boolean controls reduction of \kap{CMYK} to
+%D \kap{CMY} colors. When set to true, the black component
+%D is added to the other ones.
+
+%D Color modes are entered using the next set of commands.
+%D The \type{\stop} alternatives are implemented in a way
+%D that permits non||grouped use.
+
+\def\dostartcolormodeR#1:#2:#3\od%
+ {\bgroup
+ \def\@@cl@@r{#1}\def\@@cl@@g{#2}\def\@@cl@@b{#3}%
+ \ifpreferGRAY\ifx\@@cl@@r\@@cr@@g\ifx\@@cl@@r\@@cl@@b
+ \GRAYpreferedtrue
+ \fi\fi\fi
+ \ifGRAYprefered
+ \dostartgraycolormode\@@cl@@r
+ \else\ifRGBsupported
+ \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
+ \else\ifCMYKsupported
+ \convertRGBtoCMYK\@@cl@@r\@@cl@@g\@@cl@@b
+ \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \else
+ \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b
+ \dostartgraycolormode\@@cl@@s
+ \fi\fi\fi
+ \egroup}
+
+\def\dostartcolormodeC#1:#2:#3:#4\od%
+ {\bgroup
+ \def\@@cl@@c{#1}\def\@@cl@@m{#2}\def\@@cl@@y{#3}\def\@@cl@@k{#4}%
+ \ifpreferGRAY\ifx\@@cl@@k\@@cl@@z\ifx\@@cl@@c\@@cr@@m\ifx\@@cl@@c\@@cl@@y
+ \GRAYpreferedtrue
+ \fi\fi\fi\fi
+ \ifGRAYprefered
+ \dostartgraycolormode\@@cl@@c
+ \else\ifCMYKsupported
+ \ifreduceCMYK
+ \convertCMYKtoCMY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \else
+ \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \fi
+ \else\ifRGBsupported
+ \convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
+ \else
+ \convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
+ \dostartgraycolormode\@@cl@@s
+ \fi\fi\fi
+ \egroup}
+
+\def\dostartcolormodeS#1\od%
+ {\dostartgraycolormode{#1}}
+
+%D Prefering gray is not the same as converting to gray. Conversion treats
+%D each color components in a different way, while prefering is just a
+%D reduction and thus a space||saving option.
+
+%D \macros
+%D {startcolormode,stopcolormode}
+%D
+%D We use \type{\stopcolormode} to reset the color in
+%D whatever color space and do so by calling the corresponding
+%D special. Both commands can be used for fast color
+%D switching, like in colored verbatim,
+
+\def\dostartcolormode#1:%
+ {\getvalue{dostartcolormode#1}}
+
+\def\startcolormode#1%
+ {\doifcolorelse{#1}
+ {\getcurrentcolorspecs{#1}%
+ \expandafter\dostartcolormode\currentcolorspecs\od}
+ {\dostopcolormode}}
+
+\def\stopcolormode%
+ {\dostopcolormode}
+
+%D We use some reserved names for local color components.
+%D Consistent use of these scratch variables saves us
+%D unneccessary hash entries.
+%D
+%D \starttypen
+%D \@@cl@@r \@@cl@@g \@@cl@@b
+%D \@@cl@@c \@@cl@@m \@@cl@@y \@@cl@@k
+%D \@@cl@@s
+%D \stoptypen
+%D
+%D We implement several conversion routines.
+%D
+%D \starttypen
+%D \convertRGBtoCMYK {r} {g} {b}
+%D \convertRGBtoGRAY {r} {g} {b}
+%D \convertCMYKtoRGB {c} {m} {y} {k}
+%D \convertCMYKtoGRAY {c} {m} {y} {k}
+%D \convertCMYKtoCMY {c} {m} {y} {k}
+%D \stoptypen
+%D
+%D The relation between \kap{Gray}, \kap{RGB} and \kap{CMYK}
+%D is:
+%D
+%D \plaatsformule[-]
+%D \startformule
+%D G = .30r + .59g + .11b
+%D = 1.0 - \min(1.0,\ .30c + .59m + .11y + k)
+%D \stopformule
+%D
+%D When converting from \kap{CMYK} to \kap{RGB} we use the
+%D formula:
+%D
+%D \plaatsformule[-]
+%D \startformule
+%D \eqalign
+%D {r &= 1.0 - \min(1.0,\ c+k) \cr
+%D g &= 1.0 - \min(1.0,\ m+k) \cr
+%D b &= 1.0 - \min(1.0,\ y+k)}
+%D \stopformule
+%D
+%D In the conversion routine the color components are calculated
+%D in three digits precision.
+
+\def\realcolorvalue#1%
+ {\ifnum #1<10 0.00\the#1%
+ \else\ifnum#1<100 0.0\the#1%
+ \else\ifnum#1<1000 0.\the#1%
+ \else 1\fi\fi\fi}
+
+\def\doconvertCMYKtoRGB#1\k#2\to#3%
+ {\scratchdimen=#1\s!pt
+ \advance\scratchdimen by #2\s!pt\relax
+ \ifdim\scratchdimen>1\s!pt
+ \scratchdimen=-1\s!pt
+ \else
+ \scratchdimen=-\scratchdimen
+ \fi
+ \advance\scratchdimen by 1\s!pt
+ \multiply\scratchdimen by 1000
+ \scratchcounter=\scratchdimen
+ \advance\scratchcounter by \!!medcard
+ \divide\scratchcounter by \!!maxcard
+ \edef#3{\realcolorvalue\scratchcounter}}
+
+\def\convertCMYKtoRGB#1#2#3#4%
+ {\doconvertCMYKtoRGB#1\k#4\to\@@cl@@r
+ \doconvertCMYKtoRGB#2\k#4\to\@@cl@@g
+ \doconvertCMYKtoRGB#3\k#4\to\@@cl@@b}
+
+\def\doconvertRGBtoCMYK#1\to#2%
+ {\scratchdimen=#1\s!pt
+ \multiply\scratchdimen by 1000
+ \scratchcounter=\scratchdimen
+ \advance\scratchcounter by \!!medcard
+ \divide\scratchcounter by \!!maxcard
+ \scratchcounter=-\scratchcounter
+ \advance\scratchcounter by 1000
+ \edef#2{\realcolorvalue\scratchcounter}}
+
+\def\convertRGBtoCMYK#1#2#3%
+ {\doconvertRGBtoCMYK#1\to\@@cl@@c
+ \doconvertRGBtoCMYK#2\to\@@cl@@m
+ \doconvertRGBtoCMYK#3\to\@@cl@@y
+ \let\@@cl@@k=\@@cl@@z}
+
+\def\convertRGBtoGRAY#1#2#3%
+ {\scratchdimen=#1\s!pt
+ \scratchdimen=300\scratchdimen
+ \scratchcounter=\scratchdimen
+ \scratchdimen=#2\s!pt
+ \scratchdimen=590\scratchdimen
+ \advance\scratchcounter by \scratchdimen
+ \scratchdimen=#3\s!pt
+ \scratchdimen=110\scratchdimen
+ \advance\scratchcounter by \scratchdimen
+ \advance\scratchcounter by \!!medcard
+ \divide\scratchcounter by \!!maxcard
+ \edef\@@cl@@s{\realcolorvalue\scratchcounter}}
+
+\def\convertCMYKtoGRAY#1#2#3#4%
+ {\convertCMYKtoRGB{#1}{#2}{#3}{#4}%
+ \convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b}
+
+\def\doconvertCMYKtoCMY#1\k#2\to#3%
+ {\scratchdimen=#1\s!pt
+ \advance\scratchdimen by #2\s!pt\relax
+ \ifdim\scratchdimen>1\s!pt
+ \scratchdimen=1\s!pt
+ \else
+ \scratchdimen=\scratchdimen
+ \fi
+ \multiply\scratchdimen by 1000
+ \scratchcounter=\scratchdimen
+ \advance\scratchcounter by \!!medcard
+ \divide\scratchcounter by \!!maxcard
+ \edef#3{\realcolorvalue\scratchcounter}}
+
+\def\convertCMYKtoCMY#1#2#3#4%
+ {\doconvertCMYKtoCMY#1\k#4\to\@@cl@@c
+ \doconvertCMYKtoCMY#2\k#4\to\@@cl@@m
+ \doconvertCMYKtoCMY#3\k#4\to\@@cl@@y
+ \let\@@cl@@k=\@@cl@@z}
+
+%D We already mentioned that colors interfere with building
+%D the pagebody. This means that when the page is composed,
+%D the colors temporary have to be reset. After the page is
+%D shipped out, we have to revive the current color.
+%D
+%D We use \type{\marks} to keep track of colors across page
+%D boundaries. Unfortunately standard \TEX\ supports only one mark,
+%D and using this one for color support only would be a waste.
+%D We therefore use an adapted version of J.~Fox's multiple mark
+%D mechanism as (re|)|implemented in \module{supp-mrk}.
+
+\doifdefinedelse{newmark}
+ {\newmark\colormark}
+ {\def\colormark#1{}}
+
+%D Using this mark mechanism with lots of colors has one
+%D major drawback: \TEX's memory tends to overflow when
+%D very colorful text is stored in a global box. Even worse is that
+%D the processing time grows considerably. We therefore support
+%D local as well as global color switching.
+%D
+%D Of the next macros, \type{\popcolor} is to be used after
+%D the actual \type{\shipout} and \type{\startcolorpage} and
+%D \type{\stopcolorpage} are called when entering and leaving
+%D the \type{\pagebody} builder. In case of emergencies
+%D \type{\pushcolor} can be used to undo the current color,
+%D for instance when insertions are appended to the page.
+
+%D Before we present the color macros, we first define the
+%D setup command. This command takes care of setting up the
+%D booleans that control local and global behavior and
+%D conversion to other color spaces.
+
+\newif\ifincolor
+\newif\iflocalcolor
+
+\def\setupcolors%
+ {\dosingleargument\dosetupcolors}
+
+\def\dosetupcolors[#1]%
+ {\getparameters[\??cl][#1]%
+ \doifelse{\@@clreductie}{\v!ja}
+ {\reduceCMYKtrue}
+ {\reduceCMYKfalse}%
+ \doifelse{\@@clrgb}{\v!nee}
+ {\showmessage{\m!colors}{9}{\v!rgb}\RGBsupportedfalse}
+ {\showmessage{\m!colors}{10}{\v!rgb}\RGBsupportedtrue}%
+ \doifelse{\@@clcmyk}{\v!nee}
+ {\showmessage{\m!colors}{9}{\v!cmyk}\CMYKsupportedfalse}
+ {\showmessage{\m!colors}{10}{\v!cmyk}\CMYKsupportedtrue}%
+ \processaction
+ [\@@clconversie]
+ [ \v!ja=>\preferGRAYtrue,
+ \v!nee=>\preferGRAYfalse,
+ \v!altijd=>\preferGRAYtrue
+ \RGBsupportedfalse
+ \CMYKsupportedfalse,
+ \s!default=>\preferGRAYfalse,
+ \s!unknown=>\preferGRAYfalse]%
+ \ifRGBsupported
+ \converttoGRAYfalse
+ \forcegrayMPcolorsfalse
+ \else\ifCMYKsupported
+ \converttoGRAYfalse
+ \forcegrayMPcolorsfalse
+ \convertMPcolorstrue
+ \ifreduceCMYK
+ \reduceMPcolorstrue
+ \fi
+ \else
+ \converttoGRAYtrue
+ \forcegrayMPcolorstrue
+ \convertMPcolorsfalse
+ \reduceMPcolorsfalse
+ \showmessage{\m!colors}{11}{}%
+ \fi\fi
+ \processaction
+ [\@@clstatus]
+ [\v!globaal=>\incolortrue\localcolorfalse
+ \showmessage{\m!colors}{1}{\colorstyle},
+ \v!lokaal=>\incolortrue\localcolortrue
+ \showmessage{\m!colors}{2}{\colorstyle},
+ \v!start=>\let\@@clstatus=\v!globaal
+ \incolortrue\localcolorfalse
+ \showmessage{\m!colors}{1}{\colorstyle},
+ \v!stop=>\incolorfalse\localcolorfalse
+ \forcegrayMPcolorstrue]}
+
+%D \macros
+%D {doifcolorelse}
+%D {}
+%D
+%D Switching to a color is done by means of the following
+%D command. Later on we will explain the use of palets. We
+%D define ourselves a color conditional first.
+
+\def\currentpalet{}
+
+\def\doifcolorelse#1%
+ {\doifdefinedelse{\??cr\currentpalet#1}}
+
+\def\getcurrentcolorspecs#1%
+ {\edef\currentcolorspecs{\getvalue{\??cr\currentpalet#1}}}
+
+%D \macros
+%D {localstartcolor,localstopcolor}
+%D {}
+%D
+%D Simple color support, that is without nesting, is provided
+%D by:
+
+\def\localstartcolor[#1]%
+ {\ifincolor
+ \localcolortrue
+ \doglobalstartcolor[#1]%
+ \fi}
+
+\def\localstopcolor%
+ {\ifincolor
+ \doglobalstopcolor
+ \fi}
+
+%D \macros
+%D {startcolor,stopcolor}
+%D {}
+%D
+%D The more save method, the one that saves the current color
+%D state and returns to this state afterward, is activated by:
+%D
+%D \showsetup{\y!startcolor}
+
+\def\startcolor[#1]%
+ {\ifincolor
+ \doglobalstartcolor[#1]%
+ \fi}
+
+\def\stopcolor%
+ {\ifincolor
+ \doglobalstopcolor
+ \fi}
+
+%D This macros call the global color switching ones. Starting
+%D a global, i.e. a possible page boundary crossing, color
+%D mode also sets a \type{\mark} in \TEX's internal list.
+
+\newcount\colorlevel
+
+\setvalue{\??cl0C}{} % saved color
+\setvalue{\??cl0S}{} % stop command
+
+\def\dodoglobalstartcolor[#1]%
+ {\xdef\currentcolor{\getvalue{\??cl\the\colorlevel C}}%
+ \global\advance\colorlevel by 1
+ \setxvalue{\??cl\the\colorlevel C}{#1}%
+ \debuggerinfo{\m!colors}
+ {start #1 at level \the\colorlevel}%
+ \doifelsenothing{#1}
+ {\setxvalue{\??cl\the\colorlevel C}{\currentcolor}%
+ \setgvalue{\??cl\the\colorlevel S}{\donoglobalstopcolor}}
+ {\doifelse{#1}{\currentcolor}
+ {\setgvalue{\??cl\the\colorlevel S}{\donoglobalstopcolor}}
+ {\doifcolorelse{#1}
+ {\docolormark{#1}%
+ \setgvalue{\??cl\the\colorlevel S}{\dodoglobalstopcolor}%
+ \startcolormode{#1}}
+ {\setgvalue{\??cl\the\colorlevel S}{\donoglobalstopcolor}%
+ \showmessage{\m!colors}{3}{#1}}}}}
+
+\def\doglobalstartcolor[#1]%
+ {\ifnum\colorlevel=0
+ \doifelsenothing{#1}
+ {\setgvalue{\??cl\the\colorlevel S}{}}
+ {\dodoglobalstartcolor[#1]}%
+ \else
+ \dodoglobalstartcolor[#1]%
+ \fi
+ \ignorespaces}
+
+\def\donoglobalstopcolor%
+ {\ifnum\colorlevel>0
+ \xdef\currentcolor{\getvalue{\??cl\the\colorlevel C}}%
+ \debuggerinfo{\m!colors}
+ {stop \currentcolor\normalspace at level \the\colorlevel}%
+ \global\advance\colorlevel by -1
+ \fi}
+
+\def\dodoglobalstopcolor%
+ {\ifnum\colorlevel>0
+ \donoglobalstopcolor
+ \xdef\previouscolor{\getvalue{\??cl\the\colorlevel C}}%
+ \ifnum\colorlevel=0
+ \docolormark{}%
+ \stopcolormode
+ \else % let's do a bit redundant testing here
+ \docolormark{\previouscolor}%
+ \doifelsenothing{\previouscolor}
+ {\dostopcolormode}
+ {\doifcolorelse{\previouscolor}
+ {\doifnot{\currentcolor}{\previouscolor}
+ {\startcolormode{\previouscolor}}}
+ {\dostopcolormode}}%
+ \fi
+ \fi}
+
+\def\doglobalstopcolor%
+ {\getvalue{\??cl\the\colorlevel S}}
+
+%D We don't use grouping and save each stop alternative. This
+%D permits be especially useful in for instance local color
+%D support in verbatim. Using \type{\bgroup}||\type{\egroup}
+%D pairs could interfere with calling commands
+
+%D This color mechanism takes care of nested colors, like in:
+%D
+%D \startbuffer
+%D \kleur[groen]{groen \kleur[groen]{groen \kleur[rood]{rood}} groen}
+%D \kleur[groen]{groen \kleur[]{groen \kleur[rood]{rood}} groen}
+%D \kleur[groen]{groen \kleur[rood]{rood \kleur[rood]{rood}} groen}
+%D \kleur[groen]{groen \kleur[groen]{groen \kleur[]{groen}} groen}
+%D \kleur[groen]{groen \kleur[rood]{rood} groen}
+%D \kleur[groen]{groen \kleur[]{groen} groen}
+%D \kleur[]{zwart \kleur[rood]{rood} zwart}
+%D \kleur[]{zwart}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D Crossing page boundaries is of course also handled.
+%D Undefined or empty color specifications are treated as
+%D efficient as possible.
+%D
+%D \startbuffer
+%D \startkleur[groen]
+%D [groen] \input tufte [groen] \par
+%D \startkleur[]
+%D [groen] \input knuth [groen] \par
+%D \startkleur[rood]
+%D [rood] \input tufte [rood] \par
+%D \startkleur[geel]
+%D [geel] \input knuth [geel] \par
+%D \stopkleur
+%D [rood] \input tufte [rood] \par
+%D \stopkleur
+%D [groen] \input knuth [groen] \par
+%D \stopkleur
+%D [groen] \input tufte [groen] \par
+%D \stopkleur
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \haalbuffer
+%D \stopvoorbeeld
+%D
+%D These quotes are typeset by saying:
+%D
+%D \typebuffer
+%D
+%D Out of efficiency we only use marks when needed. The next
+%D macro tries to find out if indeed a mark should be set.
+%D This macro uses the boolean \type{\ifinpagebody}, which can
+%D be defined and set in the module that handles the pagebody.
+
+\ifx\ifinpagebody\undefined \newif\ifinpagebodytrue \fi
+
+\def\docolormark#1%
+ {\ifinpagebody \else
+ \iflocalcolor \else
+ \dodocolormark{#1}%
+ \fi
+ \fi}
+
+\let\lastcolormark=\empty
+
+\def\dodocolormark#1%
+ {\doifnot{#1}{\lastcolormark}
+ {\colormark{#1}%
+ \xdef\lastcolormark{#1}}}
+
+%D \macros
+%D {pushcolor, popcolor}
+%D {}
+%D
+%D Pushing the current state in the output routine simply comes
+%D to resetting the color to black, while popping restores the
+%D color state to that of before the break.
+
+\def\pushcolor%
+ {\stopcolormode}
+
+\def\popcolor%
+ {\doifsomething{\botcolormark}
+ {\debuggerinfo{\m!colors}{popping \botcolormark}%
+ \startcolormode{\botcolormark}}}
+
+\def\popsplitcolor%
+ {\getsplitmarks\colormark % hier wel
+ \doifsomething{\botcolormark}
+ {\debuggerinfo{\m!colors}{split popping \botcolormark}%
+ \startcolormode{\botcolormark}}}
+
+%D \macros
+%D {startcolorpage, stopcolorpage}
+%D {}
+%D
+%D Local use can be forced with the next two macros. Nesting
+%D is still supported but colors are no longer marked.
+
+%D \starttypen
+%D \def\startcolorpage%
+%D {\bgroup
+%D \let\docolormark=\gobbleoneargument
+%D \edef\savedcolorlevel{\the\colorlevel}%
+%D \ifnum\colorlevel>0
+%D \stopcolormode
+%D \fi
+%D \global\colorlevel=0\relax}
+%D
+%D \def\stopcolorpage%
+%D {\global\colorlevel=\savedcolorlevel\relax
+%D \egroup}
+%D \stoptypen
+
+%D The next alternative makes (simple) color separation more
+%D easy:
+
+\def\startcolorpage%
+ {\bgroup
+ \let\docolormark=\gobbleoneargument
+ \edef\savedcolorlevel{\the\colorlevel}%
+ \localstartcolor[black]%
+ \global\colorlevel=0\relax}
+
+\def\stopcolorpage%
+ {\localstopcolor
+ \global\colorlevel=\savedcolorlevel\relax
+ \egroup}
+
+%D \macros
+%D {color,gray}
+%D {}
+%D
+%D This leaves the simple color command:
+%D
+%D \showsetup{\y!color}
+%D \showsetup{\y!gray}
+%D
+%D Which can be used straightforward: \color[groen]{green as gras}.
+%D We want color support to be similar to font support and
+%D therefore implement \type{\color} as:
+
+\unexpanded\def\color[#1]%
+ {\groupedcommand
+ {\startcolor[#1]}
+ {\stopcolor}}
+
+\unexpanded\def\gray[#1]%
+ {\groupedcommand
+ {\RGBsupportedfalse\CMYKsupportedfalse\startcolor[#1]}
+ {\stopcolor}}
+
+%D This implementation enables use of defined colors like:
+%D
+%D \starttypen
+%D Look at the {\brightgreen bright} side of life and get
+%D yourself no \red{red} head!
+%D \stoptypen
+
+%D \macros
+%D {colorvalue, grayvalue}
+%D {}
+%D
+%D We can typeset the color components using \type{\colorvalue} and
+%D \type{\grayvalue}. The commands:
+%D
+%D \startbuffer
+%D color value of SomeKindOfRed: \colorvalue{SomeKindOfRed} \crlf
+%D gray value of SomeKindOfRed: \grayvalue{SomeKindOfRed}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D show us:
+%D
+%D \startvoorbeeld
+%D \haalbuffer
+%D \stopvoorbeeld
+
+\def\realcolorformat#1%
+ {\ifnum#1<10 0.00\the#1%
+ \else\ifnum#1<100 0.0\the#1%
+ \else\ifnum#1<1000 0.\the#1%
+ \else 1.000\fi\fi\fi}
+
+\def\colorformatseparator{ }
+
+\def\dodoformatcolor#1%
+ {\scratchdimen=#1\s!pt\relax
+ \ifdim\scratchdimen>1\s!pt
+ \scratchdimen=1\s!pt
+ \fi
+ \multiply\scratchdimen by 1000
+ \scratchcounter=\scratchdimen
+ \advance\scratchcounter by \!!medcard
+ \divide\scratchcounter by \!!maxcard \relax
+ \realcolorformat\scratchcounter}
+
+\def\doformatcolorR#1:#2:#3\od%
+ {\dodoformatcolor{#1}\colorformatseparator
+ \dodoformatcolor{#2}\colorformatseparator
+ \dodoformatcolor{#3}}
+
+\def\doformatcolorC#1:#2:#3:#4\od%
+ {\dodoformatcolor{#1}\colorformatseparator
+ \dodoformatcolor{#2}\colorformatseparator
+ \dodoformatcolor{#3}\colorformatseparator
+ \dodoformatcolor{#4}}
+
+\def\doformatcolorS#1\od%
+ {\dodoformatcolor{#1}}
+
+\def\doformatcolor#1:%
+ {\getvalue{doformatcolor#1}}
+
+\def\colorvalue#1%
+ {\doifcolorelse{#1}
+ {\getcurrentcolorspecs{#1}%
+ \expandafter\doformatcolor\currentcolorspecs\od}
+ {}}
+
+\def\doformatgrayR#1:#2:#3\od%
+ {\convertRGBtoGRAY{#1}{#2}{#3}%
+ \dodoformatcolor\@@cl@@s}
+
+\def\doformatgrayC#1:#2:#3:#4\od%
+ {\convertCMYKtoGRAY{#1}{#2}{#3}{#4}%
+ \dodoformatcolor\@@cl@@s}
+
+\def\doformatgrayS#1\od%
+ {\dodoformatcolor{#1}}
+
+\def\doformatgray#1:%
+ {\getvalue{doformatgray#1}}
+
+\def\grayvalue#1%
+ {\doifcolorelse{#1}
+ {\getcurrentcolorspecs{#1}%
+ \expandafter\doformatgray\currentcolorspecs\od}
+ {}}
+
+%D \macros
+%D {locatstartraster,localstopraster,
+%D startraster,stopraster}
+%D {}
+%D
+%D The previous conversions are not linear and treat each color
+%D component according to human perception curves. Pure gray
+%D (we call them rasters) has equal color components. In
+%D \CONTEXT\ rasters are only used as backgrounds and these
+%D don't cross page boundaries in the way color does. Therefore
+%D we don't need stacks and marks. Just to be compatible with
+%D color support we offer both 'global' and 'local' commands.
+
+\def\localstartraster[#1]%
+ {\doifinstringelse{.}{#1}
+ {\dostartgraymode{#1}}
+ {\dostartgraymode{\@@rsraster}}}
+
+\def\localstopraster%
+ {\dostopgraymode}
+
+\def\startraster%
+ {\localstartraster}
+
+\def\stopraster%
+ {\localstopraster}
+
+%D In this documentation we will not go into too much details
+%D on palets. Curious users can find more information on this
+%D topic in \uit[use of color].
+%D
+%D At the moment we implemented color in \CONTEXT\ color
+%D printing was not yet on the desktop. In spite of this lack our
+%D graphics designer made colorfull illustrations. When printed
+%D on a black and white printer, distinctive colors can come
+%D out equally gray. We therefore decided to use only colors
+%D that were distinctive in colors as well as in black and
+%D white print.
+%D
+%D Although none of the graphic packages we used supported
+%D logical colors and global color redefition, we build this
+%D support into \CONTEXT. This enabled us to experiment and
+%D also prepared us for the future.
+
+%D \macros
+%D {definepalet}
+%D {}
+%D
+%D Colors are grouped in palets. The colors in such a palet can
+%D have colorful names, but best is to use names that specify
+%D their use, like {\em important} or {\em danger}. As a sort
+%D of example \CONTEXT\ has some palets predefined,
+%D like:\voetnoot{At the time I wrote the palet support, I was
+%D reading 'A hort history of time' of S.~Hawkins, so that's
+%D why we stuck to quarks.}
+%D
+%D \starttypen
+%D \definepalet
+%D [alfa]
+%D [ top=rood:7,
+%D bottom=groen:6,
+%D up=blauw:5,
+%D down=cyaan:4,
+%D strange=magenta:3,
+%D charm=geel:2]
+%D \stoptypen
+%D
+%D It's formal definition is:
+%D
+%D \showsetup{\y!definepalet}
+%D
+%D Visualized, such a palet looks like:
+%D
+%D \startbuffer[palet]
+%D \showpalet [alfa] [horizontaal,naam,nummer,waarde]
+%D \stopbuffer
+%D
+%D \startregelcorrectie
+%D \haalbuffer[palet]
+%D \stopregelcorrectie
+%D
+%D This bar shows both the color and gray alternatives of the
+%D palet components (not visible in black and white print).
+%D
+%D When needed, one can copy a palet by saying:
+%D
+%D \starttypen
+%D \definepalet [TEXcolorpretty] [colorpretty]
+%D \stoptypen
+%D
+%D This saves us some typing in for instance the modules that
+%D deal with pretty verbatim typesetting.
+
+\def\definepalet%
+ {\dodoubleargument\dodefinepalet}
+
+\def\dodefinepalet[#1][#2]%
+ {\doifassignmentelse{#2}
+ {\setvalue{\??pa#1}{}%
+ \setevalue{\??pa\??pa#1}{#2}%
+ \showmessage{\m!colors}{6}{#1}%
+ \def\dodododefinepalet[##1=##2]%
+ {\doifvaluesomething{\??pa#1}
+ {\setevalue{\??pa#1}{\getvalue{\??pa#1},}}%
+ \setevalue{\??pa#1}{\getvalue{\??pa#1}##1}%
+ \doifdefinedelse{\??cr##2}
+ {\setevalue{\??cr#1:##1}{\getvalue{\??cr##2}}}
+ {\setevalue{\??cr#1:##1}{S:0}}}%
+ \def\dododefinepalet##1%
+ {\dodododefinepalet[##1]}%
+ \processcommalist[#2]\dododefinepalet}
+ {\doifdefined{\??pa#2}
+ {\expanded{\dodefinepalet[#1][\getvalue{\??pa\??pa#2}]}}}}
+
+%D \macros
+%D {setuppalet}
+%D {}
+%D
+%D Colors are taken from the current palet, if defined.
+%D Setting the current palet is done by:
+%D
+%D \showsetup{\y!setuppalet}
+
+\def\currentpalet{}
+
+\def\setuppalet%
+ {\dosingleempty\dosetuppalet}
+
+\def\dosetuppalet[#1]%
+ {\doifelsenothing{#1}
+ {\def\currentpalet{}}
+ {\doifelsevaluenothing{\??pa#1}
+ {\showmessage{\m!colors}{7}{#1}%
+ \def\currentpalet{}}
+ {\def\currentpalet{#1:}}}}
+
+%D \macros
+%D {showpalet}
+%D {}
+%D
+%D The previous visualization was typeset with:
+%D
+%D \typebuffer[palet]
+%D
+%D This commands is defined as:
+%D
+%D \showsetup{\y!showpalet}
+
+\def\showpalet%
+ {\dodoubleargument\doshowpalet}
+
+\def\doshowpalet[#1][#2]%
+ {\doifdefined{\??pa#1}
+ {\doifinsetelse{\v!vertikaal}{#2}
+ {\showverticalpalet[#1][#2]}
+ {\showhorizontalpalet[#1][#2]}}}
+
+\def\showverticalpalet[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet[#1]
+ \def\rule%
+ {\vrule\!!width3em\!!height\ht\strutbox\!!depth\dp\strutbox}
+ \tabskip\!!zeropoint
+ \def\doshowpalet##1%
+ {\doifinsetelse{\v!nummer}{#2}{##1\hskip.5em}{}&
+ \color[##1]{\rule}\gray[##1]{\rule}&
+ \doifinset{\v!waarde}{#2}{\hskip.5em\colorvalue{##1}}\crcr}
+ \halign
+ {\hss##&\hss##\hss&##\cr
+ &\doifinset{\v!naam}{#2}{\strut#1}&\cr%
+ \processpalet[#1]\doshowpalet\crcr}}}
+
+\def\showhorizontalpalet[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet[#1]
+ \tabskip\!!zeropoint
+ \!!widtha=\!!zeropoint
+ \doifinset{\v!nummer}{#2}
+ {\def\doshowpalet##1%
+ {\setbox0=\hbox{##1}%
+ \ifdim\!!widtha<\wd0\!!widtha=\wd0\fi}%
+ \processpalet[#1]\doshowpalet}%
+ \advance\!!widtha by 1em
+ \ifdim\!!widtha<5em
+ \!!widtha=5em
+ \fi
+ \halign
+ {##&&\hbox to \!!widtha{\hss##\hss}\cr
+ \doifinset{\v!nummer}{#2}
+ {\def\doshowpalet##1{&\strut##1}%
+ \processpalet[#1]\doshowpalet}\cr
+ \doifinset{\v!naam}{#2}{#1\hskip.5em}%
+ \def\doshowpalet##1%
+ {&\color[##1]{\vrule\!!width\!!widtha\!!height\ht\strutbox\!!depth\!!zeropoint}}%
+ \processpalet[#1]\doshowpalet\crcr
+ \def\doshowpalet##1%
+ {&\gray[##1]{\vrule\!!width\!!widtha\!!height\!!zeropoint\!!depth\dp\strutbox}}%
+ \processpalet[#1]\doshowpalet\crcr
+ \doifinset{\v!waarde}{#2}
+ {\def\doshowpalet##1%
+ {&\vbox
+ {\hsize\!!widtha
+ \vskip.25ex
+ \everypar{\strut}
+ \veryraggedcenter
+ \let\colorformatseparator=\endgraf
+ \colorvalue{##1}}}%
+ \processpalet[#1]\doshowpalet}%
+ \crcr}}}
+
+\def\processpalet[#1]%
+ {\expanded{\globalprocesscommalist[\getvalue{\??pa#1}]}}
+
+%D \macros
+%D {definecolorgroup}
+%D {}
+%D
+%D The naming of the colors in this palet suggests some
+%D ordening, which in turn is suported by color grouping.
+%D
+%D \starttypen
+%D \definecolorgroup
+%D [rood]
+%D [1.00:0.90:0.90,
+%D 1.00:0.80:0.80,
+%D 1.00:0.70:0.70,
+%D 1.00:0.55:0.55,
+%D 1.00:0.40:0.40,
+%D 1.00:0.25:0.25,
+%D 1.00:0.15:0.15,
+%D 0.90:0.00:0.00]
+%D \stoptypen
+%D
+%D In such a color group colors are numbered from~$1$ to~$n$.
+%D
+%D \showsetup{\y!definecolorgroup}
+%D
+%D This kind of specification is not only more compact than
+%D defining each color separate, it also loads faster and takes
+%D less bytes.
+
+\def\definecolorgroup%
+ {\dotripleempty\dodefinecolorgroup}
+
+\def\dodefinecolorgroup[#1][#2][#3]%
+ {\ifthirdargument
+ \processaction
+ [#2]
+ [ \v!cmyk=>\edef\currentcolorspace{C},
+ \v!rgb=>\edef\currentcolorspace{R},
+ \v!gray=>\edef\currentcolorspace{S},
+ \s!unknown=>\edef\currentcolorspace{R}]%
+ \scratchcounter=0
+ \def\dododefinecolorgroup##1%
+ {\advance\scratchcounter by 1
+ \setevalue{\??cr#1:\the\scratchcounter}{\currentcolorspace:##1}}%
+ \processcommalist[#3]\dododefinecolorgroup
+ \else
+ \doifinstringelse{:}{#2}
+ {\definecolorgroup[#1][\v!rgb][#2]}
+ {\doloop
+ {\doifdefinedelse{\??cr#2:\recurselevel}
+ {\setevalue{\??cr#1:\recurselevel}%
+ {\getvalue{\??cr#2:\recurselevel}}}
+ {\exitloop}}}%
+ \fi}
+
+%D \macros
+%D {showcolorgroup}
+%D {}
+%D
+%D We can show the group by:
+%D
+%D \startbuffer
+%D \showcolorgroup [blauw] [horizontaal,naam,nummer,waarde]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or in color:
+%D
+%D \startregelcorrectie
+%D \haalbuffer
+%D \stopregelcorrectie
+%D
+%D which uses:
+%D
+%D \showsetup{\y!showcolorgroup}
+
+\def\showcolorgroup%
+ {\dodoubleargument\doshowcolorgroup}
+
+\def\doshowcolorgroup[#1][#2]%
+ {\doifdefined{\??cr#1:1}
+ {\doifinsetelse{\v!vertikaal}{#2}
+ {\showverticalcolorgroup[#1][#2]}
+ {\showhorizontalcolorgroup[#1][#2]}}}
+
+\def\showhorizontalcolorgroup[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet
+ \tabskip\!!zeropoint
+ \def\rule%
+ {\vrule\!!width4em\!!height\ht\strutbox\!!depth\dp\strutbox}
+ \def\colorformatseparator{\strut\cr}
+ \def\dodoshowgroup##1%
+ {\halign
+ {\hss####\hss\cr
+ \doifinset{\v!nummer}{#2}{\strut##1}\cr
+ \color[#1:##1]{\vrule\!!width4em\!!height\ht\strutbox\!!depth\!!zeropoint}\cr
+ \gray[#1:##1]{\vrule\!!width4em\!!height\!!zeropoint\!!depth\dp\strutbox}\cr
+ \doifinset{\v!waarde}{#2}{\colorvalue{#1:##1}\strut}\crcr}}
+ \def\doshowgroup##1%
+ {\doifdefined{\??cr#1:##1}
+ {\vbox{\dodoshowgroup{##1}}}}
+ \hbox
+ {\doifinset{\v!naam}{#2}
+ {\strut
+ \doifinsetelse{\v!waarde}{#2}
+ {\raise3\lineheight\hbox{#1\hskip.5em}}
+ {#1}%
+ \hskip.5em}%
+ \doshowgroup1\doshowgroup2\doshowgroup3\doshowgroup4%
+ \doshowgroup5\doshowgroup6\doshowgroup7\doshowgroup8}}}
+
+\def\showverticalcolorgroup[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet
+ \tabskip\!!zeropoint
+ \def\rule%
+ {\vrule\!!width2.5em\!!height\ht\strutbox\!!depth\dp\strutbox}
+ \def\doshowgroup##1%
+ {\doifdefined{\??cr#1:##1}
+ {\doifinset{\v!nummer}{#2}{##1\hskip.5em}&
+ \color[#1:##1]{\rule}\gray[#1:##1]{\rule}&
+ \doifinset{\v!waarde}{#2}{\hskip.5em\colorvalue{#1:##1}}\crcr}}
+ \halign
+ {\hss##&\hss##\hss&##\hss\cr
+ &\doifinset{\v!naam}{#2}{\strut#1}&\crcr
+ \doshowgroup1\doshowgroup2\doshowgroup3\doshowgroup4%
+ \doshowgroup5\doshowgroup6\doshowgroup7\doshowgroup8}}}
+
+%D There are ten predefined color groups, like
+%D \color[groen]{\em groen}, \color[rood]{\em rood},
+%D \color[blauw]{\em blauw}, \color[cyaan]{\em cyaan},
+%D \color[magenta]{\em magenta} and \color[geel]{\em geel}.
+%D
+%D \startregelcorrectie
+%D \hbox to \hsize
+%D {\hss
+%D \showcolorgroup [rood] [vertikaal,naam,nummer]\hss
+%D \showcolorgroup [groen] [vertikaal,naam]\hss
+%D \showcolorgroup [blauw] [vertikaal,naam]\hss
+%D \showcolorgroup [cyaan] [vertikaal,naam]\hss
+%D \showcolorgroup [magenta] [vertikaal,naam]\hss
+%D \showcolorgroup [geel] [vertikaal,naam]\hss}
+%D \stopregelcorrectie
+%D
+%D These groups are used to define palets {\em alfa} upto {\em
+%D zeta}. As long as we don't use colors from the same row, we
+%D get ourselves distinctive palets. By activating such a palet
+%D one gains access to its members {\em top} to {\em charm} (of
+%D course one should use more suitable names than these).
+%D
+%D \startregelcorrectie
+%D \hbox to \hsize
+%D {\showpalet [alfa] [vertikaal,naam,nummer]\hss
+%D \showpalet [beta] [vertikaal,naam]\hss
+%D \showpalet [gamma] [vertikaal,naam]\hss
+%D \showpalet [delta] [vertikaal,naam]\hss
+%D \showpalet [epsilon] [vertikaal,naam]\hss
+%D \showpalet [zeta] [vertikaal,naam]}
+%D \stopregelcorrectie
+%D
+%D By using the keyword \type{\v!waarde} the individual color
+%D components are shown too. When printed in color, these
+%D showcases show both the colors and the gray value.
+
+%D \macros
+%D {comparepalet}
+%D {}
+%D
+%D There are some more testing macros available:
+%D
+%D \startbuffer
+%D \comparepalet [alfa]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D shows the palet colors against a background:
+%D
+%D \startregelcorrectie
+%D \haalbuffer
+%D \stopregelcorrectie
+%D
+%D The formal definition is:
+%D
+%D \showsetup{\y!comparepalet}
+
+\def\comparepalet%
+ {\dosingleargument\docomparepalet}
+
+\def\docomparepalet[#1]%
+ {\doifdefined{\??pa#1}
+ {\hbox
+ {\dodocomparepalet\color[#1]%
+ \quad
+ \dodocomparepalet\gray[#1]}}}
+
+\def\dodocomparepalet#1[#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet[#2]
+ \getcommacommandsize[\getvalue{\??pa#2}]
+ \!!widtha=2em\relax
+ \hsize=\commalistsize\!!widtha
+ \def\rule%
+ {\vrule\!!width.5\!!widtha\!!height2.25ex\!!depth-.75ex}
+ \def\dododocomparepalet##1%
+ {\hbox
+ {\setbox0=\hbox
+ {#1[##1]{\vrule\!!width\hsize\!!height3ex}}%
+ \wd0=\!!zeropoint\box0
+ \hbox to \hsize
+ {\def\dododocomparepalet####1%
+ {\hbox to \!!widtha
+ {\hss#1[####1]{\rule}\hss}}%
+ \processcommacommand[\getvalue{\??pa#2}]\dododocomparepalet}}
+ \endgraf}
+ \processcommacommand[\getvalue{\??pa#2}]\dododocomparepalet}}
+
+%D \macros
+%D {comparecolorgroup}
+%D {}
+%D
+%D The similar command:
+%D
+%D \startbuffer
+%D \comparecolorgroup [blauw]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D shows color groups:
+%D
+%D \startregelcorrectie
+%D \haalbuffer
+%D \stopregelcorrectie
+%D
+%D this commands are defined as:
+%D
+%D \showsetup{\y!comparecolorgroup}
+
+\def\comparecolorgroup%
+ {\dosingleargument\docomparecolorgroup}
+
+\def\docomparecolorgroup[#1]%
+ {\doifdefined{\??cr#1:1}
+ {\hbox
+ {\dodocomparecolorgroup\color[#1]%
+ \quad
+ \dodocomparecolorgroup\gray[#1]}}}
+
+\def\dodocomparecolorgroup#1[#2]%
+ {\localvbox
+ {\!!counta=0
+ \dorecurse{15}
+ {\doifdefined{\??cr#2:\recurselevel}{\advance\!!counta by 1}}
+ \!!widtha=2em\relax
+ \hsize=\!!counta\!!widtha
+ \def\rule%
+ {\vrule\!!width.5\!!widtha\!!height2.25ex\!!depth-.75ex}
+ \def\dododocomparecolorgroup##1%
+ {\hbox to \hsize
+ {\setbox0=\hbox
+ {#1[#2:##1]{\vrule\!!width\hsize\!!height3ex}}%
+ \wd0=\!!zeropoint\box0
+ \hbox to \hsize
+ {\hss\dorecurse{\!!counta}{#1[#2:\recurselevel]{\rule}\hss}}}
+ \endgraf}
+ \dorecurse{\!!counta}{\dododocomparecolorgroup\recurselevel}}}
+
+%D \macros
+%D {showcolor}
+%D {}
+%D
+%D But let's not forget that we also have the more traditional
+%D non||related colors. These show up after:
+%D
+%D \starttypen
+%D \showcolor [name]
+%D \stoptypen
+%D
+%D Where \type{name} for instance can be \type{rgb}.
+%D
+%D \showsetup{\y!showcolor}
+
+\def\showcolor[#1]%
+ {\bgroup
+ \setupcolor[#1]
+ \stelwitruimtein[\v!geen]
+ \def\rule%
+ {\vrule\!!width4em\!!height\ht\strutbox\!!depth\dp\strutbox}
+ \def\docommand##1%
+ {\hbox
+ {\gray[##1]{\rule}\quad
+ \color[##1]{\rule}\quad
+ \grayvalue{##1}\quad
+ \hbox to 12em{\colorvalue{##1}\hss}%
+ \strut##1}
+ \endgraf}
+ \processcommacommand[\colorlist]\docommand
+ \egroup}
+
+%D \macros
+%D {negativecolorbox}
+%D
+%D Sometimes, especially when we deal with typesetting
+%D devices, we want to reverse the color scheme. Instead of
+%D recalculating all those colors, we use a quick and dirty
+%D approach:
+%D
+%D \starttypen
+%D \negativecolorbox0
+%D \stoptypen
+%D
+%D will negate the colors in box zero.
+
+\def\negatecolorbox#1%
+ {\setbox#1=\hbox
+ {\dostartnegative
+ \localstartcolor[white]%
+ \vrule\!!height\ht#1\!!depth\dp#1\!!width\wd#1%
+ \localstopcolor
+ \hskip-\wd#1%
+ \box#1\dostopnegative}}
+
+%D \macros
+%D {ifMPgraphics, MPcolor}
+%D
+%D A very special macro is \type{\MPcolor}. This one can be
+%D used to pass a \CONTEXT\ color to \METAPOST.
+%D
+%D \starttypen
+%D \MPcolor{my own red}
+%D \stoptypen
+%D
+%D This macro returns a \METAPOST\ triplet \type{(R,G,B)}.
+%D Only \kap{RGB} colors and gray scales are supported.
+
+\ifx\MPgraphicstrue\undefined
+ \newif\ifMPgraphics\MPgraphicstrue
+\fi
+
+\def\MPcolor#1%
+ {\ifMPgraphics
+ \@EA\@EA\@EA\doMPcolor\csname\??cr#1\endcsname::::\end
+ \else
+ #1%
+ \fi}
+
+\def\doMPcolor#1:#2:#3:#4:#5\end%
+ {\if#1R(#2,#3,#4)\else\if#2G(#2,#2,#3)\else(1,1,1)\fi\fi}
+
+%D We default to the colors defined in \module{colo-rgb} and
+%D support both \kap{RGB} and \kap{CMYK} output.
+
+\setupcolor
+ [\v!rgb]
+
+\setupcolors
+ [\c!status=\v!stop,
+ \c!conversie=\v!ja,
+ \c!reductie=\v!nee,
+ \c!rgb=\v!ja,
+ \c!cmyk=\v!ja]
+
+%D As we can see, color support is turned off by default.
+%D Reduction of gray colors to gray scales is turned on.
+
+\protect
+
+\endinput