diff options
author | Hans Hagen <pragma@wxs.nl> | 1998-04-15 00:00:00 +0200 |
---|---|---|
committer | Hans Hagen <pragma@wxs.nl> | 1998-04-15 00:00:00 +0200 |
commit | f7ce2124ddf34c4a7c785e1500003921d70118ba (patch) | |
tree | 35d818611773ecd034e23a0e4079ba0a994c6887 | |
parent | 5f54d546a687e0615f87a117c5950b78ef346af7 (diff) | |
download | context-f7ce2124ddf34c4a7c785e1500003921d70118ba.tar.gz |
stable 1998.04.15
114 files changed, 95738 insertions, 95546 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
diff --git a/tex/context/base/colo-rgb.tex b/tex/context/base/colo-rgb.tex index 717e4799d..3ea42994e 100644 --- a/tex/context/base/colo-rgb.tex +++ b/tex/context/base/colo-rgb.tex @@ -1,365 +1,365 @@ -%D \module -%D [ file=colo-rgb, -%D version=1995.1.1, -%D title=\CONTEXT\ Color Macros, -%D subtitle=RGB, -%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. - -%D Just to give users a start we define some colors. While -%D switching fonts is as international as can be, thanks to the -%D mnemonics, naming colors is very interface dependant. To -%D support international setups, we define both english and -%D interface dependant colors. We use the color inheritance -%D mechanisms to implement the interface dependant ones. - -%D First we define some simple primary \kap{RGB} and \kap{CMYK} -%D colors. All colors are defined in \kap{RGB} color space. - -\definecolor [red] [r=1, g=0, b=0] -\definecolor [green] [r=0, g=1, b=0] -\definecolor [blue] [r=0, g=0, b=1] - -\definecolor [cyan] [r=0, g=1, b=1] -\definecolor [magenta] [r=1, g=0, b=1] -\definecolor [yellow] [r=1, g=1, b=0] - -\definecolor [white] [r=1, g=1, b=1] -\definecolor [black] [r=0, g=0, b=0] - -\definecolor [darkred] [r=.8, g=0, b=0] -\definecolor [middlered] [r=.9, g=0, b=0] -\definecolor [lightred] [r=1, g=0, b=0] - -\definecolor [darkgreen] [r=0, g=.6, b=0] -\definecolor [middlegreen] [r=0, g=.8, b=0] -\definecolor [lightgreen] [r=0, g=1, b=0] - -\definecolor [darkblue] [r=0, g=0, b=.8] -\definecolor [middleblue] [r=0, g=0, b=.9] -\definecolor [lightblue] [r=0, g=0, b=1] - -\definecolor [darkcyan] [r=.6, g=.8, b=.8] -\definecolor [middlecyan] [r=0, g=.8, b=.8] - -\definecolor [darkmagenta] [r=.8, g=.6, b=.8] -\definecolor [middlemagenta] [r=1, g=0, b=.6] - -\definecolor [darkyellow] [r=.8, g=.8, b=.6] -\definecolor [middleyellow] [r=1, g=1, b=.2] - -\definecolor [darkgray] [r=.5, g=.5, b=.5] -\definecolor [middlegray] [r=.7, g=.7, b=.7] -\definecolor [lightgray] [r=.9, g=.9, b=.9] - -%D These colors are mapped to interface dependant colornames. - -\startinterface dutch - - \definecolor [rood] [red] - \definecolor [groen] [green] - \definecolor [blauw] [blue] - - \definecolor [cyaan] [cyan] - \definecolor [magenta] [magenta] - \definecolor [geel] [yellow] - - \definecolor [wit] [white] - \definecolor [zwart] [black] - - \definecolor [donkerrood] [darkred] - \definecolor [middelrood] [middlered] - \definecolor [lichtrood] [lightred] - - \definecolor [donkergroen] [darkgreen] - \definecolor [middelgroen] [middlegreen] - \definecolor [lichtgroen] [lightgreen] - - \definecolor [donkerblauw] [darkblue] - \definecolor [middelblauw] [middleblue] - \definecolor [lichtblauw] [lightblue] - - \definecolor [donkercyaan] [darkcyan] - \definecolor [middelcyaan] [middlecyan] - - \definecolor [donkermagenta] [darkmagenta] - \definecolor [middelmagenta] [middlemagenta] - - \definecolor [donkergeel] [darkyellow] - \definecolor [middelgeel] [middleyellow] - - \definecolor [donkergrijs] [darkgray] - \definecolor [middengrijs] [middlegray] - \definecolor [lichtgrijs] [lightgray] - -\stopinterface - -\startinterface german - - \definecolor [rot] [red] - \definecolor [gruen] [green] - \definecolor [blau] [blue] - - \definecolor [cyan] [cyan] - \definecolor [magenta] [magenta] - \definecolor [gelb] [yellow] - - \definecolor [weiss] [white] - \definecolor [schwarz] [black] - - \definecolor [dunkelrot] [darkred] - \definecolor [mittelrot] [middlered] - \definecolor [hellrot] [lightred] - - \definecolor [dunkelgruen] [darkgreen] - \definecolor [mittelgruen] [middlegreen] - \definecolor [hellgruen] [lightgreen] - - \definecolor [dunkelblau] [darkblue] - \definecolor [mittelblau] [middleblue] - \definecolor [hellblau] [lightblue] - - \definecolor [dunkelcyan] [darkcyan] - \definecolor [mittelcyan] [middlecyan] - - \definecolor [dunkelmagenta] [darkmagenta] - \definecolor [mittelmagenta] [middlemagenta] - - \definecolor [dunkelgelb] [darkyellow] - \definecolor [mittelgelb] [middleyellow] - - \definecolor [dunkelgrau] [darkgray] - \definecolor [mittelgrau] [middlegray] - \definecolor [hellgrau] [lightgray] - -\stopinterface - -%D Like colors, we first define the english colorgroups. These -%D colorgroups are tuned for distinctive gray scale printing. - -\definecolorgroup - [gray] - [0.95:0.95:0.95, - 0.90:0.90:0.90, - 0.80:0.80:0.80, - 0.70:0.70:0.70, - 0.60:0.60:0.60, - 0.50:0.50:0.50, - 0.40:0.40:0.40, - 0.30:0.30:0.30, - 0.20:0.20:0.20, - 0.10:0.10:0.10, - 0.00:0.00:0.00] - -\definecolorgroup - [red] - [1.00:0.90:0.90, - 1.00:0.80:0.80, - 1.00:0.70:0.70, - 1.00:0.55:0.55, - 1.00:0.40:0.40, - 1.00:0.25:0.25, - 1.00:0.15:0.15, - 0.90:0.00:0.00] - -\definecolorgroup - [green] - [0.90:1.00:0.90, - 0.70:1.00:0.70, - 0.50:1.00:0.50, - 0.30:1.00:0.30, - 0.15:0.90:0.15, - 0.00:0.80:0.00, - 0.00:0.65:0.00, - 0.00:0.50:0.00] - -\definecolorgroup - [blue] - [0.90:0.95:1.00, - 0.80:0.90:1.00, - 0.55:0.85:1.00, - 0.30:0.80:1.00, - 0.15:0.75:1.00, - 0.00:0.70:1.00, - 0.00:0.55:1.00, - 0.00:0.40:1.00] - -\definecolorgroup - [cyan] - [0.80:1.00:1.00, - 0.60:1.00:1.00, - 0.30:1.00:1.00, - 0.00:0.95:0.95, - 0.00:0.85:0.85, - 0.00:0.75:0.75, - 0.00:0.60:0.60, - 0.00:0.50:0.50] - -\definecolorgroup - [magenta] - [1.00:0.90:1.00, - 1.00:0.80:1.00, - 1.00:0.65:1.00, - 1.00:0.50:1.00, - 1.00:0.35:1.00, - 1.00:0.15:1.00, - 0.90:0.05:0.90, - 0.80:0.00:0.80] - -\definecolorgroup - [yellow] - [1.00:1.00:0.70, - 1.00:1.00:0.00, - 1.00:0.85:0.05, - 1.00:0.70:0.00, - 1.00:0.55:0.00, - 0.95:0.40:0.00, - 0.80:0.30:0.00, - 0.60:0.30:0.00] - -\definecolorgroup - [red*] - [1.00:0.95:0.95, - 1.00:0.90:0.90, - 1.00:0.80:0.80, - 1.00:0.70:0.70, - 1.00:0.60:0.60, - 1.00:0.50:0.50, - 1.00:0.40:0.40, - 1.00:0.30:0.30] - -\definecolorgroup - [green*] - [0.95:1.00:0.95, - 0.90:1.00:0.90, - 0.80:1.00:0.80, - 0.70:1.00:0.70, - 0.60:1.00:0.60, - 0.50:1.00:0.50, - 0.40:1.00:0.40, - 0.30:1.00:0.30] - -\definecolorgroup - [blue*] - [0.95:0.95:1.00, - 0.90:0.90:1.00, - 0.80:0.80:1.00, - 0.70:0.70:1.00, - 0.60:0.60:1.00, - 0.50:0.50:1.00, - 0.40:0.40:1.00, - 0.30:0.30:1.00] - -\definecolorgroup - [yellow*] - [1.00:1.00:0.10, - 1.00:1.00:0.00, - 0.90:0.90:0.00, - 0.80:0.80:0.00, - 0.70:0.70:0.00, - 0.60:0.60:0.00, - 0.50:0.50:0.00, - 0.40:0.40:0.00] - -%D For the sake of implementing interface dependant color -%D groups we support colorgroup duplication. - -\startinterface dutch - \definecolorgroup [grijs] [gray] - \definecolorgroup [rood] [red] - \definecolorgroup [groen] [green] - \definecolorgroup [blauw] [blue] - \definecolorgroup [cyaan] [cyan] - \definecolorgroup [magenta] [magenta] - \definecolorgroup [geel] [yellow] - \definecolorgroup [rood*] [red*] - \definecolorgroup [groen*] [green*] - \definecolorgroup [blauw*] [blue*] - \definecolorgroup [geel*] [yellow*] -\stopinterface - -\startinterface german - \definecolorgroup [grau] [gray] - \definecolorgroup [rot] [red] - \definecolorgroup [gruen] [green] - \definecolorgroup [blau] [blue] - \definecolorgroup [cyan] [cyan] - \definecolorgroup [magenta] [magenta] - \definecolorgroup [gelb] [yellow] - \definecolorgroup [rot*] [red*] - \definecolorgroup [gruen*] [green*] - \definecolorgroup [blau*] [blue*] - \definecolorgroup [gelb*] [yellow*] -\stopinterface - -%D The next set of color palets is quite language independant. -%D These palets are meant as examples. - -\definepalet - [alfa] - [ top=red:7, - bottom=green:6, - up=blue:5, - down=cyan:4, - strange=magenta:3, - charm=yellow:2] - -\definepalet - [beta] - [ top=red:7, - bottom=green:5, - up=blue:3, - down=cyan:6, - strange=magenta:2, - charm=yellow:1] - -\definepalet - [gamma] - [ top=red:2, - bottom=green:5, - up=blue:3, - down=cyan:6, - strange=magenta:7, - charm=yellow:4] - -\definepalet - [delta] - [ top=yellow*:5, - bottom=yellow*:3, - up=yellow*:2, - down=magenta:6, - strange=blue:4, - charm=blue:1] - -\definepalet - [epsilon] - [ top=cyan:7, - bottom=cyan:5, - up=blue:3, - down=yellow:6, - strange=yellow:4, - charm=yellow:2] - -\definepalet - [zeta] - [ top=red:6, - bottom=green:5, - up=blue:7, - down=cyan:4, - strange=magenta:3, - charm=yellow:2] - -%D The next four colors are used for typesetting verbatim \TEX\ -%D in color. - -\definecolor [texcolorone] [middlered] -\definecolor [texcolortwo] [middlegreen] -\definecolor [texcolorthree] [middleblue] -\definecolor [texcolorfour] [darkyellow] - -\endinput +%D \module
+%D [ file=colo-rgb,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=RGB,
+%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.
+
+%D Just to give users a start we define some colors. While
+%D switching fonts is as international as can be, thanks to the
+%D mnemonics, naming colors is very interface dependant. To
+%D support international setups, we define both english and
+%D interface dependant colors. We use the color inheritance
+%D mechanisms to implement the interface dependant ones.
+
+%D First we define some simple primary \kap{RGB} and \kap{CMYK}
+%D colors. All colors are defined in \kap{RGB} color space.
+
+\definecolor [red] [r=1, g=0, b=0]
+\definecolor [green] [r=0, g=1, b=0]
+\definecolor [blue] [r=0, g=0, b=1]
+
+\definecolor [cyan] [r=0, g=1, b=1]
+\definecolor [magenta] [r=1, g=0, b=1]
+\definecolor [yellow] [r=1, g=1, b=0]
+
+\definecolor [white] [r=1, g=1, b=1]
+\definecolor [black] [r=0, g=0, b=0]
+
+\definecolor [darkred] [r=.8, g=0, b=0]
+\definecolor [middlered] [r=.9, g=0, b=0]
+\definecolor [lightred] [r=1, g=0, b=0]
+
+\definecolor [darkgreen] [r=0, g=.6, b=0]
+\definecolor [middlegreen] [r=0, g=.8, b=0]
+\definecolor [lightgreen] [r=0, g=1, b=0]
+
+\definecolor [darkblue] [r=0, g=0, b=.8]
+\definecolor [middleblue] [r=0, g=0, b=.9]
+\definecolor [lightblue] [r=0, g=0, b=1]
+
+\definecolor [darkcyan] [r=.6, g=.8, b=.8]
+\definecolor [middlecyan] [r=0, g=.8, b=.8]
+
+\definecolor [darkmagenta] [r=.8, g=.6, b=.8]
+\definecolor [middlemagenta] [r=1, g=0, b=.6]
+
+\definecolor [darkyellow] [r=.8, g=.8, b=.6]
+\definecolor [middleyellow] [r=1, g=1, b=.2]
+
+\definecolor [darkgray] [r=.5, g=.5, b=.5]
+\definecolor [middlegray] [r=.7, g=.7, b=.7]
+\definecolor [lightgray] [r=.9, g=.9, b=.9]
+
+%D These colors are mapped to interface dependant colornames.
+
+\startinterface dutch
+
+ \definecolor [rood] [red]
+ \definecolor [groen] [green]
+ \definecolor [blauw] [blue]
+
+ \definecolor [cyaan] [cyan]
+ \definecolor [magenta] [magenta]
+ \definecolor [geel] [yellow]
+
+ \definecolor [wit] [white]
+ \definecolor [zwart] [black]
+
+ \definecolor [donkerrood] [darkred]
+ \definecolor [middelrood] [middlered]
+ \definecolor [lichtrood] [lightred]
+
+ \definecolor [donkergroen] [darkgreen]
+ \definecolor [middelgroen] [middlegreen]
+ \definecolor [lichtgroen] [lightgreen]
+
+ \definecolor [donkerblauw] [darkblue]
+ \definecolor [middelblauw] [middleblue]
+ \definecolor [lichtblauw] [lightblue]
+
+ \definecolor [donkercyaan] [darkcyan]
+ \definecolor [middelcyaan] [middlecyan]
+
+ \definecolor [donkermagenta] [darkmagenta]
+ \definecolor [middelmagenta] [middlemagenta]
+
+ \definecolor [donkergeel] [darkyellow]
+ \definecolor [middelgeel] [middleyellow]
+
+ \definecolor [donkergrijs] [darkgray]
+ \definecolor [middengrijs] [middlegray]
+ \definecolor [lichtgrijs] [lightgray]
+
+\stopinterface
+
+\startinterface german
+
+ \definecolor [rot] [red]
+ \definecolor [gruen] [green]
+ \definecolor [blau] [blue]
+
+ \definecolor [cyan] [cyan]
+ \definecolor [magenta] [magenta]
+ \definecolor [gelb] [yellow]
+
+ \definecolor [weiss] [white]
+ \definecolor [schwarz] [black]
+
+ \definecolor [dunkelrot] [darkred]
+ \definecolor [mittelrot] [middlered]
+ \definecolor [hellrot] [lightred]
+
+ \definecolor [dunkelgruen] [darkgreen]
+ \definecolor [mittelgruen] [middlegreen]
+ \definecolor [hellgruen] [lightgreen]
+
+ \definecolor [dunkelblau] [darkblue]
+ \definecolor [mittelblau] [middleblue]
+ \definecolor [hellblau] [lightblue]
+
+ \definecolor [dunkelcyan] [darkcyan]
+ \definecolor [mittelcyan] [middlecyan]
+
+ \definecolor [dunkelmagenta] [darkmagenta]
+ \definecolor [mittelmagenta] [middlemagenta]
+
+ \definecolor [dunkelgelb] [darkyellow]
+ \definecolor [mittelgelb] [middleyellow]
+
+ \definecolor [dunkelgrau] [darkgray]
+ \definecolor [mittelgrau] [middlegray]
+ \definecolor [hellgrau] [lightgray]
+
+\stopinterface
+
+%D Like colors, we first define the english colorgroups. These
+%D colorgroups are tuned for distinctive gray scale printing.
+
+\definecolorgroup
+ [gray]
+ [0.95:0.95:0.95,
+ 0.90:0.90:0.90,
+ 0.80:0.80:0.80,
+ 0.70:0.70:0.70,
+ 0.60:0.60:0.60,
+ 0.50:0.50:0.50,
+ 0.40:0.40:0.40,
+ 0.30:0.30:0.30,
+ 0.20:0.20:0.20,
+ 0.10:0.10:0.10,
+ 0.00:0.00:0.00]
+
+\definecolorgroup
+ [red]
+ [1.00:0.90:0.90,
+ 1.00:0.80:0.80,
+ 1.00:0.70:0.70,
+ 1.00:0.55:0.55,
+ 1.00:0.40:0.40,
+ 1.00:0.25:0.25,
+ 1.00:0.15:0.15,
+ 0.90:0.00:0.00]
+
+\definecolorgroup
+ [green]
+ [0.90:1.00:0.90,
+ 0.70:1.00:0.70,
+ 0.50:1.00:0.50,
+ 0.30:1.00:0.30,
+ 0.15:0.90:0.15,
+ 0.00:0.80:0.00,
+ 0.00:0.65:0.00,
+ 0.00:0.50:0.00]
+
+\definecolorgroup
+ [blue]
+ [0.90:0.95:1.00,
+ 0.80:0.90:1.00,
+ 0.55:0.85:1.00,
+ 0.30:0.80:1.00,
+ 0.15:0.75:1.00,
+ 0.00:0.70:1.00,
+ 0.00:0.55:1.00,
+ 0.00:0.40:1.00]
+
+\definecolorgroup
+ [cyan]
+ [0.80:1.00:1.00,
+ 0.60:1.00:1.00,
+ 0.30:1.00:1.00,
+ 0.00:0.95:0.95,
+ 0.00:0.85:0.85,
+ 0.00:0.75:0.75,
+ 0.00:0.60:0.60,
+ 0.00:0.50:0.50]
+
+\definecolorgroup
+ [magenta]
+ [1.00:0.90:1.00,
+ 1.00:0.80:1.00,
+ 1.00:0.65:1.00,
+ 1.00:0.50:1.00,
+ 1.00:0.35:1.00,
+ 1.00:0.15:1.00,
+ 0.90:0.05:0.90,
+ 0.80:0.00:0.80]
+
+\definecolorgroup
+ [yellow]
+ [1.00:1.00:0.70,
+ 1.00:1.00:0.00,
+ 1.00:0.85:0.05,
+ 1.00:0.70:0.00,
+ 1.00:0.55:0.00,
+ 0.95:0.40:0.00,
+ 0.80:0.30:0.00,
+ 0.60:0.30:0.00]
+
+\definecolorgroup
+ [red*]
+ [1.00:0.95:0.95,
+ 1.00:0.90:0.90,
+ 1.00:0.80:0.80,
+ 1.00:0.70:0.70,
+ 1.00:0.60:0.60,
+ 1.00:0.50:0.50,
+ 1.00:0.40:0.40,
+ 1.00:0.30:0.30]
+
+\definecolorgroup
+ [green*]
+ [0.95:1.00:0.95,
+ 0.90:1.00:0.90,
+ 0.80:1.00:0.80,
+ 0.70:1.00:0.70,
+ 0.60:1.00:0.60,
+ 0.50:1.00:0.50,
+ 0.40:1.00:0.40,
+ 0.30:1.00:0.30]
+
+\definecolorgroup
+ [blue*]
+ [0.95:0.95:1.00,
+ 0.90:0.90:1.00,
+ 0.80:0.80:1.00,
+ 0.70:0.70:1.00,
+ 0.60:0.60:1.00,
+ 0.50:0.50:1.00,
+ 0.40:0.40:1.00,
+ 0.30:0.30:1.00]
+
+\definecolorgroup
+ [yellow*]
+ [1.00:1.00:0.10,
+ 1.00:1.00:0.00,
+ 0.90:0.90:0.00,
+ 0.80:0.80:0.00,
+ 0.70:0.70:0.00,
+ 0.60:0.60:0.00,
+ 0.50:0.50:0.00,
+ 0.40:0.40:0.00]
+
+%D For the sake of implementing interface dependant color
+%D groups we support colorgroup duplication.
+
+\startinterface dutch
+ \definecolorgroup [grijs] [gray]
+ \definecolorgroup [rood] [red]
+ \definecolorgroup [groen] [green]
+ \definecolorgroup [blauw] [blue]
+ \definecolorgroup [cyaan] [cyan]
+ \definecolorgroup [magenta] [magenta]
+ \definecolorgroup [geel] [yellow]
+ \definecolorgroup [rood*] [red*]
+ \definecolorgroup [groen*] [green*]
+ \definecolorgroup [blauw*] [blue*]
+ \definecolorgroup [geel*] [yellow*]
+\stopinterface
+
+\startinterface german
+ \definecolorgroup [grau] [gray]
+ \definecolorgroup [rot] [red]
+ \definecolorgroup [gruen] [green]
+ \definecolorgroup [blau] [blue]
+ \definecolorgroup [cyan] [cyan]
+ \definecolorgroup [magenta] [magenta]
+ \definecolorgroup [gelb] [yellow]
+ \definecolorgroup [rot*] [red*]
+ \definecolorgroup [gruen*] [green*]
+ \definecolorgroup [blau*] [blue*]
+ \definecolorgroup [gelb*] [yellow*]
+\stopinterface
+
+%D The next set of color palets is quite language independant.
+%D These palets are meant as examples.
+
+\definepalet
+ [alfa]
+ [ top=red:7,
+ bottom=green:6,
+ up=blue:5,
+ down=cyan:4,
+ strange=magenta:3,
+ charm=yellow:2]
+
+\definepalet
+ [beta]
+ [ top=red:7,
+ bottom=green:5,
+ up=blue:3,
+ down=cyan:6,
+ strange=magenta:2,
+ charm=yellow:1]
+
+\definepalet
+ [gamma]
+ [ top=red:2,
+ bottom=green:5,
+ up=blue:3,
+ down=cyan:6,
+ strange=magenta:7,
+ charm=yellow:4]
+
+\definepalet
+ [delta]
+ [ top=yellow*:5,
+ bottom=yellow*:3,
+ up=yellow*:2,
+ down=magenta:6,
+ strange=blue:4,
+ charm=blue:1]
+
+\definepalet
+ [epsilon]
+ [ top=cyan:7,
+ bottom=cyan:5,
+ up=blue:3,
+ down=yellow:6,
+ strange=yellow:4,
+ charm=yellow:2]
+
+\definepalet
+ [zeta]
+ [ top=red:6,
+ bottom=green:5,
+ up=blue:7,
+ down=cyan:4,
+ strange=magenta:3,
+ charm=yellow:2]
+
+%D The next four colors are used for typesetting verbatim \TEX\
+%D in color.
+
+\definecolor [texcolorone] [middlered]
+\definecolor [texcolortwo] [middlegreen]
+\definecolor [texcolorthree] [middleblue]
+\definecolor [texcolorfour] [darkyellow]
+
+\endinput
diff --git a/tex/context/base/cont-de.tex b/tex/context/base/cont-de.tex index c4a7f0ddb..7800753b6 100644 --- a/tex/context/base/cont-de.tex +++ b/tex/context/base/cont-de.tex @@ -1,21 +1,21 @@ -%D \module -%D [ file=cont-de, -%D version=1997.08.19, -%D title=\CONTEXT, -%D subtitle=\CONTEXT\ German Format Generation, -%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. - -\catcode`\{=1 -\catcode`\}=2 - -\def\defaultinterface{german} - -\input context.tex - -\endinput +%D \module
+%D [ file=cont-de,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ German Format Generation,
+%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.
+
+\catcode`\{=1
+\catcode`\}=2
+
+\def\defaultinterface{german}
+
+\input context.tex
+
+\endinput
diff --git a/tex/context/base/cont-en.tex b/tex/context/base/cont-en.tex index eec7fa56c..5720142a5 100644 --- a/tex/context/base/cont-en.tex +++ b/tex/context/base/cont-en.tex @@ -1,21 +1,22 @@ -%D \module -%D [ file=cont-en, -%D version=1997.08.19, -%D title=\CONTEXT, -%D subtitle=\CONTEXT\ English Format Generation, -%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. - -\catcode`\{=1 -\catcode`\}=2 - -\def\defaultinterface{english} - -\input context.tex - -\endinput +%D \module
+%D [ file=cont-en,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%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.
+
+\catcode`\{=1
+\catcode`\}=2
+
+\def\defaultinterface{english}
+
+\input context.tex
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/cont-fil.tex b/tex/context/base/cont-fil.tex index b11190bea..0ffbcae93 100644 --- a/tex/context/base/cont-fil.tex +++ b/tex/context/base/cont-fil.tex @@ -1,19 +1,22 @@ -%D \module -%D [ file=cont-fil, -%D version=1997.11.15, -%D title=\CONTEXT\ Miscellaneous Macros, -%D subtitle=File Synonyms, -%D author=J. 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 File Synonyms} - -\definefilesynonym [chemic] [chemie] - -\definefilesynonym [unit] [eenheid] -\definefilesynonym [einheit] [eenheid] +%D \module
+%D [ file=cont-fil,
+%D version=1997.11.15,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=File Synonyms,
+%D author=J. 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 File Synonyms}
+
+\definefilesynonym [chemic] [chemie]
+
+\definefilesynonym [unit] [eenheid]
+\definefilesynonym [einheit] [eenheid]
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/cont-log.tex b/tex/context/base/cont-log.tex index 5ab8abe47..339667576 100644 --- a/tex/context/base/cont-log.tex +++ b/tex/context/base/cont-log.tex @@ -1,128 +1,129 @@ -%D \module -%D [ file=cont-log, -%D version=1995.10.10, -%D title=\CONTEXT\ Miscellaneous Macros, -%D subtitle=\TEX\ Logos, -%D author=J. 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 TeX Logos} - -%D The system that is used to typeset this text is called \TEX, -%D typeset with an lowered~E. From te beginning of \TEX, -%D authors of macro packages adapted this raising and lowering -%D style. In this module we define some of those logos. -%D Watch the \type{cmr} detection hack. - -\unprotect - -\convertargument cmr\to\someCMRfont - -\def\doifCMRfontelse#1#2% - {\doifinstringelse{\someCMRfont}{\fontname\font} - {\def\next{#1}} - {\def\next{#2}}% - \next} - -\unexpanded\def\CMRkern% - {\doifCMRfontelse{\kern}{\scratchdimen=}} - -\def\TeX% - {T% - \kern-.1667em\lower.5ex\hbox{E}% - \kern-.125emX} - -\def\ConTeXt% - {C% - \CMRkern-.0333emO% - \CMRkern-.0333emN% - \CMRkern-.0333em\TeX% - \CMRkern-.0333emT} - -\def\PPCHTeX% - {PPCH\TeX} - -\def\LaTeX% - {L% - \kern-.30em\raise.3ex\hbox{\txx A}% - \kern-.18em\TeX} - -\def\TaBlE% - {T% - \kern-.27em\lower.5ex\hbox{A}% - \kern-.18emB% - \kern-.1em\lower.5ex\hbox{L}% - \kern-.075emE} - -\def\PiCTeX% - {P% - \kern-.12em\lower.5ex\hbox{I}% - \kern-.075em C% - \kern-.11em\TeX} - -\def\AMSswitch#1% - {$\fam2\ifdim\korpsgrootte>1.1em\scriptstyle\fi#1$} - -\def\AmSTeX% - {\AMSswitch A% - \kern-.1667em\lower.5ex\hbox{\AMSswitch M}% - \kern-.125em\AMSswitch S% - -\TeX} - -\def\LamSTeX% - {L% - \kern-.4em\raise.3ex\hbox{\AMSswitch A}% - \kern-.25em\lower.4ex\hbox{\AMSswitch M}% - \kern-.1em{\AMSswitch S}% - -\TeX} - -\def\MetaFont% \hbox prevents missing - warning in YandYTEX - {\hbox{\font\logofont=logo10 at \korpsgrootte\logofont METAFONT}} - -\def\MetaPost% \hbox prevents missing - warning in YandYTEX - {\hbox{\font\logofont=cmss10 at \korpsgrootte\logofont METAPOST}} - -%D \macros -%D {TEX, METAFONT, METAPOST, -%D PICTEX, TABLE, -%D CONTEXT, PPCHTEX, -%D AMSTEX, LATEX, LAMSTEX} -%D {} -%D -%D We define the funny written ones as well as th eless -%D error prone upper case names (in \CONTEXT\ we tend to -%D write all user defined commands, like abbreviations, in -%D uppercase.) - -\def\METAFONT {\MetaFont} -\def\METAPOST {\MetaPost} -\def\PPCHTEX {\PPCHTeX} -\def\CONTEXT {\ConTeXt} - -\def\TEX {\TeX} -\def\LATEX {\LaTeX} -\def\PICTEX {\PiCTeX} -\def\TABLE {\TaBlE} -\def\AMSTEX {\AmSTeX} -\def\LAMSTEX {\LamSTeX} - -%D And this is how they show up: \TeX, \MetaFont, \MetaPost, -%D \PiCTeX, \TaBlE, \ConTeXt, \PPCHTeX, \AmSTeX, \LaTeX, -%D \LamSTeX. We also define some logos for the programs that -%D we wrote and use at \PRAGMA: \TeX EDIT, \TeX FORM, \TeX -%D ADRES, \TeX SPELL, \TeX UTIL. - -\def\TEXEDIT {\TeX EDIT} -\def\TEXFORM {\TeX FORM} -\def\TEXADRES {\TeX ADRES} -\def\TEXSPELL {\TeX SPELL} -\def\TEXUTIL {\TeX UTIL} - -\protect - -\endinput +%D \module
+%D [ file=cont-log,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=\TEX\ Logos,
+%D author=J. 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 TeX Logos}
+
+%D The system that is used to typeset this text is called \TEX,
+%D typeset with an lowered~E. From te beginning of \TEX,
+%D authors of macro packages adapted this raising and lowering
+%D style. In this module we define some of those logos.
+%D Watch the \type{cmr} detection hack.
+
+\unprotect
+
+\convertargument cmr\to\someCMRfont
+
+\def\doifCMRfontelse#1#2%
+ {\doifinstringelse{\someCMRfont}{\fontname\font}
+ {\def\next{#1}}
+ {\def\next{#2}}%
+ \next}
+
+\unexpanded\def\CMRkern%
+ {\doifCMRfontelse{\kern}{\scratchdimen=}}
+
+\def\TeX%
+ {T%
+ \kern-.1667em\lower.5ex\hbox{E}%
+ \kern-.125emX}
+
+\def\ConTeXt%
+ {C%
+ \CMRkern-.0333emO%
+ \CMRkern-.0333emN%
+ \CMRkern-.0333em\TeX%
+ \CMRkern-.0333emT}
+
+\def\PPCHTeX%
+ {PPCH\TeX}
+
+\def\LaTeX%
+ {L%
+ \kern-.30em\raise.3ex\hbox{\txx A}%
+ \kern-.18em\TeX}
+
+\def\TaBlE%
+ {T%
+ \kern-.27em\lower.5ex\hbox{A}%
+ \kern-.18emB%
+ \kern-.1em\lower.5ex\hbox{L}%
+ \kern-.075emE}
+
+\def\PiCTeX%
+ {P%
+ \kern-.12em\lower.5ex\hbox{I}%
+ \kern-.075em C%
+ \kern-.11em\TeX}
+
+\def\AMSswitch#1%
+ {$\fam2\ifdim\korpsgrootte>1.1em\scriptstyle\fi#1$}
+
+\def\AmSTeX%
+ {\AMSswitch A%
+ \kern-.1667em\lower.5ex\hbox{\AMSswitch M}%
+ \kern-.125em\AMSswitch S%
+ -\TeX}
+
+\def\LamSTeX%
+ {L%
+ \kern-.4em\raise.3ex\hbox{\AMSswitch A}%
+ \kern-.25em\lower.4ex\hbox{\AMSswitch M}%
+ \kern-.1em{\AMSswitch S}%
+ -\TeX}
+
+\def\MetaFont% \hbox prevents missing - warning in YandYTEX
+ {\hbox{\font\logofont=logo10 at \korpsgrootte\logofont METAFONT}}
+
+\def\MetaPost% \hbox prevents missing - warning in YandYTEX
+ {\hbox{\font\logofont=cmss10 at \korpsgrootte\logofont METAPOST}}
+
+%D \macros
+%D {TEX, METAFONT, METAPOST,
+%D PICTEX, TABLE,
+%D CONTEXT, PPCHTEX,
+%D AMSTEX, LATEX, LAMSTEX}
+%D {}
+%D
+%D We define the funny written ones as well as th eless
+%D error prone upper case names (in \CONTEXT\ we tend to
+%D write all user defined commands, like abbreviations, in
+%D uppercase.)
+
+\def\METAFONT {\MetaFont}
+\def\METAPOST {\MetaPost}
+\def\PPCHTEX {\PPCHTeX}
+\def\CONTEXT {\ConTeXt}
+
+\def\TEX {\TeX}
+\def\LATEX {\LaTeX}
+\def\PICTEX {\PiCTeX}
+\def\TABLE {\TaBlE}
+\def\AMSTEX {\AmSTeX}
+\def\LAMSTEX {\LamSTeX}
+
+%D And this is how they show up: \TeX, \MetaFont, \MetaPost,
+%D \PiCTeX, \TaBlE, \ConTeXt, \PPCHTeX, \AmSTeX, \LaTeX,
+%D \LamSTeX. We also define some logos for the programs that
+%D we wrote and use at \PRAGMA: \TeX EDIT, \TeX FORM, \TeX
+%D ADRES, \TeX SPELL, \TeX UTIL.
+
+\def\TEXEDIT {\TeX EDIT}
+\def\TEXFORM {\TeX FORM}
+\def\TEXADRES {\TeX ADRES}
+\def\TEXSPELL {\TeX SPELL}
+\def\TEXUTIL {\TeX UTIL}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index 9b8a2fe71..0e2322ec9 100644 --- a/tex/context/base/cont-new.tex +++ b/tex/context/base/cont-new.tex @@ -1,20 +1,20 @@ -%D \module -%D [ file=cont-new, -%D version=1995.10.10, -%D title=\CONTEXT\ Miscellaneous Macros, -%D subtitle=New Macros, -%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. - -% new (or test) commands - -\unprotect - -\protect - -\endinput +%D \module
+%D [ file=cont-new,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=New Macros,
+%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.
+
+% new (or test) commands
+
+\unprotect
+
+\protect
+
+\endinput
diff --git a/tex/context/base/cont-nl.tex b/tex/context/base/cont-nl.tex index 5731d81cb..8e17e0eaa 100644 --- a/tex/context/base/cont-nl.tex +++ b/tex/context/base/cont-nl.tex @@ -1,21 +1,21 @@ -%D \module -%D [ file=cont-nl, -%D version=1997.08.19, -%D title=\CONTEXT, -%D subtitle=\CONTEXT\ Dutch Format Generation, -%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. - -\catcode`\{=1 -\catcode`\}=2 - -\def\defaultinterface{dutch} - -\input context.tex - -\endinput +%D \module
+%D [ file=cont-nl,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Dutch Format Generation,
+%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.
+
+\catcode`\{=1
+\catcode`\}=2
+
+\def\defaultinterface{dutch}
+
+\input context.tex
+
+\endinput
diff --git a/tex/context/base/cont-usr.tex b/tex/context/base/cont-usr.tex index f6bc9e058..a16575ece 100644 --- a/tex/context/base/cont-usr.tex +++ b/tex/context/base/cont-usr.tex @@ -1,49 +1,52 @@ -%D \module -%D [ file=cont-usr, -%D version=1997.10.05, -%D title=\CONTEXT\ User Format Specifications, -%D subtitle=System Specific Setups, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] - -%D In this file users can specify what hyphenation patterns -%D they want to load into the format file. - -\unprotect - -% \installlanguage [\s!af] [\c!status=\v!start] % afrikaans -% \installlanguage [\s!da] [\c!status=\v!start] % danish - \installlanguage [\s!de] [\c!status=\v!start] % german - \installlanguage [\s!en] [\c!status=\v!start] % english -% \installlanguage [\s!fi] [\c!status=\v!start] % finnish - \installlanguage [\s!fr] [\c!status=\v!start] % french -% \installlanguage [\s!it] [\c!status=\v!start] % italian - \installlanguage [\s!nl] [\c!status=\v!start] % dutch -% \installlanguage [\s!no] [\c!status=\v!start] % norwegian -% \installlanguage [\s!pl] [\c!status=\v!start] % polish -% \installlanguage [\s!pt] [\c!status=\v!start] % portuguese -% \installlanguage [\s!sp] [\c!status=\v!start] % spanish -% \installlanguage [\s!sv] [\c!status=\v!start] % swedish -% \installlanguage [\s!tr] [\c!status=\v!start] % turkish - -% \appendtoks \language[\s!nl]\to \everyjob -% \appendtoks \language[\s!en]\to \everyjob -% \appendtoks \language[\s!de]\to \everyjob -% \appendtoks \language[\s!fr]\to \everyjob -% \appendtoks \language[\s!sp]\to \everyjob -% \appendtoks \language[\s!it]\to \everyjob -% \appendtoks \language[\s!da]\to \everyjob -% \appendtoks \language[\s!pt]\to \everyjob -% \appendtoks \language[\s!sv]\to \everyjob -% \appendtoks \language[\s!pl]\to \everyjob -% \appendtoks \language[\s!fi]\to \everyjob -% \appendtoks \language[\s!af]\to \everyjob -% \appendtoks \language[\s!no]\to \everyjob -% \appendtoks \language[\s!tr]\to \everyjob - -\appendtoks \mainlanguage[\currentlanguage] \to \everyjob - -\protect - -\endinput +%D \module
+%D [ file=cont-usr,
+%D version=1997.10.05,
+%D title=\CONTEXT\ User Format Specifications,
+%D subtitle=System Specific Setups,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+%D In this file users can specify what hyphenation patterns
+%D they want to load into the format file.
+
+\unprotect
+
+% \usespecials[reset,ps,tr,pdf]
+
+% \installlanguage [\s!af] [\c!status=\v!start] % afrikaans
+% \installlanguage [\s!da] [\c!status=\v!start] % danish
+ \installlanguage [\s!de] [\c!status=\v!start] % german
+ \installlanguage [\s!en] [\c!status=\v!start] % english
+% \installlanguage [\s!fi] [\c!status=\v!start] % finnish
+ \installlanguage [\s!fr] [\c!status=\v!start] % french
+% \installlanguage [\s!it] [\c!status=\v!start] % italian
+ \installlanguage [\s!nl] [\c!status=\v!start] % dutch
+% \installlanguage [\s!no] [\c!status=\v!start] % norwegian
+% \installlanguage [\s!pl] [\c!status=\v!start] % polish
+% \installlanguage [\s!pt] [\c!status=\v!start] % portuguese
+% \installlanguage [\s!sp] [\c!status=\v!start] % spanish
+% \installlanguage [\s!sv] [\c!status=\v!start] % swedish
+% \installlanguage [\s!tr] [\c!status=\v!start] % turkish
+
+% \appendtoks \language[\s!nl]\to \everyjob
+% \appendtoks \language[\s!en]\to \everyjob
+% \appendtoks \language[\s!de]\to \everyjob
+% \appendtoks \language[\s!fr]\to \everyjob
+% \appendtoks \language[\s!sp]\to \everyjob
+% \appendtoks \language[\s!it]\to \everyjob
+% \appendtoks \language[\s!da]\to \everyjob
+% \appendtoks \language[\s!pt]\to \everyjob
+% \appendtoks \language[\s!sv]\to \everyjob
+% \appendtoks \language[\s!pl]\to \everyjob
+% \appendtoks \language[\s!fi]\to \everyjob
+% \appendtoks \language[\s!af]\to \everyjob
+% \appendtoks \language[\s!no]\to \everyjob
+% \appendtoks \language[\s!tr]\to \everyjob
+
+\appendtoks \mainlanguage[\currentlanguage] \to \everyjob
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/context.rme b/tex/context/base/context.rme new file mode 100644 index 000000000..553088fdc --- /dev/null +++ b/tex/context/base/context.rme @@ -0,0 +1,48 @@ +There are currently three interfaces available:
+
+ cont-en the english version
+ cont-de the german version
+ cont-nl the dutch version
+
+One should compile one of these (or all) into a fmt file.
+When one uses the main file,
+
+ context the undefined version
+
+TeX ask for an interface language as well as a message
+language. Here one has to specify the full name (english,
+german, dutch) or use the default (enter).
+
+By default only the english hyphenation patterns are loaded,
+unless more are enabled in:
+
+ cont-usr the typesetting language specifications
+
+Furthermore, users can preset commands etc in the file
+
+ cont-sys a system file loaded at runtime
+
+For questions and remarks on ConTeXt, one can subscribe to
+the list:
+
+ ntg-context@ntg.nl
+
+by sending the message
+
+ subscribe ntg-context
+
+to the list server:
+
+ majordomo@ntg.nl
+
+One can find more info at:
+
+ www.ntg.nl/context
+
+or on CTAN in the ConTeXt directory.
+
+Don't hesitate to ask questions. ConTeXt can do a lot, and
+the manuals are always way behind and incomplete.
+
+Hans Hagen
+pragma@pi.net
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index 7e8a286c7..f0f98ef7c 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -1,184 +1,184 @@ -%D \module -%D [ file=context, -%D version=1995.10.10, -%D title=\CONTEXT, -%D subtitle=\CONTEXT\ Format Generation, -%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. - -%D Welcome to the main module. When this module is ran through -%D \type{initex} or \type{tex -i} or \type{whatevertex} using -%D \type{whatever switch}, the \CONTEXT\ format file is -%D generated. During this process the user is asked for an -%D interface language. Supplying \type{dutch} will generate a -%D dutch version of \CONTEXT, supplying \type{english} will of -%D course end op in a english version. -%D -%D First we load the system modules. These implement a lot of -%D manipulation macros. The first one loads \PLAIN\ \TEX, as -%D minimal as possible. - -\input syst-tex.tex -\input syst-gen.tex -\input syst-ext.tex -\input syst-new.tex - -%D To enable selective loading, we say: - -\CONTEXTtrue - -%D After this we're ready for the multi||lingual interface -%D modules. - -\input mult-ini.tex -\input mult-sys.tex -\input mult-con.tex -\input mult-com.tex - -%D Now we're ready for some general support modules. These -%D modules implement some basic typesetting functionality. - -\input supp-ini.tex -\input supp-fil.tex -\input supp-box.tex -\input supp-mrk.tex -\input supp-vis.tex -\input supp-fun.tex -\input supp-pdf.tex -\input supp-spe.tex -\input supp-mps.tex -\input supp-tpi.tex - -%D Verbatim typestting is implemented in a separate class of -%D modules. The pretty typesetting modules are loaded at run -%D time. - -\input verb-ini.tex % replaces supp-ver - -%D We also use some third party macros. These are loaded by -%D saying: - -\input thrd-ran - -%D When loading the font, color and special modules, we need a -%D bit more advanced file handling, so next we load: - -\input core-fil.tex - -%D \CONTEXT\ does not implement its own table handling. We -%D just go for the best there is and load \TABLE. Just to be -%D sure we do it here, before we redefine \type{|}. - -\doinputonce{table} - -%D Here comes the last support module. - -\input supp-lan.tex - -%D The next three modules do what their names state. They -%D load additional definition modules when needed. - -\input lang-ini.tex -\input colo-ini.tex -\input spec-ini.tex - -%D The special modules need some additional macro's: - -\input spec-mis.tex - -%D For the moment we load a lot of languages. In the future -%D we'll have to be more space conservative. - -\input lang-lab.tex - -\input lang-alt.tex -\input lang-ana.tex -\input lang-art.tex -\input lang-bal.tex -\input lang-cel.tex -\input lang-ger.tex -\input lang-grk.tex -\input lang-hnl.tex -\input lang-ind.tex -\input lang-ita.tex -\input lang-sla.tex -\input lang-ura.tex - -%D Next we load some core macro's. These implement the -%D macros' that are seen by the users. - -\input core-var.tex -\input core-gen.tex -\input core-mak.tex -\input core-grd.tex -\input core-ver.tex -\input core-vis.tex -\input core-con.tex -\input core-rul.tex -\input core-tab.tex -\input core-fil.tex -\input core-new.tex -\input core-nav.tex -\input core-ref.tex -\input core-obj.tex -\input core-01a.tex -\input core-mul.tex -\input core-pag.tex - -%D Of course we do need fonts. There are no \TFM\ files -%D loaded yet, so the format file is independant of their -%D content. Here we also redefine \type{\it} as {\it italic} -%D instead of italian. - -\input font-ini.tex - -%D Now we're ready for more core modules. - -\input core-fnt.tex -\input core-not.tex -% \input core-jav.tex % still experimental and loaded at runtime - -\input core-01b.tex -\input core-01c.tex -\input core-01d.tex -\input core-01e.tex - -\input core-02a.tex -\input core-02b.tex -% core-02c.tex -\input core-02d.tex - -%D Except from english, no hyphenation pattersn are loaded -%D yet. Users can specify their needs in the next module: - -\input cont-usr.tex - -%D The next two modules implement some additional -%D functionality concenring classes of documents and output. -%D These modules probably will be replaced some day. - -\input docs-ini.tex -\input list-ini.tex - -%D \TEX\ related logo's are always typeset in a special way. -%D Here they come: - -\input cont-log.tex - -%D At run time, a few more files are loaded, like: -%D -%D \startopsomming[opelkaar] -%D \som \type{cont-sys}: local (system dependant) defaults -%D \som \type{cont-old}: substitutes for old (obsolete) macros -%D \som \type{cont-new}: new macro implementations (for testing) -%D \som \type{cont-fil}: filename and module synonyms -%D \stopopsomming - -%D Dumping the format is all that's left to be done. - -\dump +%D \module
+%D [ file=context,
+%D version=1995.10.10,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Format Generation,
+%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.
+
+%D Welcome to the main module. When this module is ran through
+%D \type{initex} or \type{tex -i} or \type{whatevertex} using
+%D \type{whatever switch}, the \CONTEXT\ format file is
+%D generated. During this process the user is asked for an
+%D interface language. Supplying \type{dutch} will generate a
+%D dutch version of \CONTEXT, supplying \type{english} will of
+%D course end op in a english version.
+%D
+%D First we load the system modules. These implement a lot of
+%D manipulation macros. The first one loads \PLAIN\ \TEX, as
+%D minimal as possible.
+
+\input syst-tex.tex
+\input syst-gen.tex
+\input syst-ext.tex
+\input syst-new.tex
+
+%D To enable selective loading, we say:
+
+\CONTEXTtrue
+
+%D After this we're ready for the multi||lingual interface
+%D modules.
+
+\input mult-ini.tex
+\input mult-sys.tex
+\input mult-con.tex
+\input mult-com.tex
+
+%D Now we're ready for some general support modules. These
+%D modules implement some basic typesetting functionality.
+
+\input supp-ini.tex
+\input supp-fil.tex
+\input supp-box.tex
+\input supp-mrk.tex
+\input supp-vis.tex
+\input supp-fun.tex
+\input supp-pdf.tex
+\input supp-spe.tex
+\input supp-mps.tex
+\input supp-tpi.tex
+
+%D Verbatim typestting is implemented in a separate class of
+%D modules. The pretty typesetting modules are loaded at run
+%D time.
+
+\input verb-ini.tex % replaces supp-ver
+
+%D We also use some third party macros. These are loaded by
+%D saying:
+
+\input thrd-ran
+
+%D When loading the font, color and special modules, we need a
+%D bit more advanced file handling, so next we load:
+
+\input core-fil.tex
+
+%D \CONTEXT\ does not implement its own table handling. We
+%D just go for the best there is and load \TABLE. Just to be
+%D sure we do it here, before we redefine \type{|}.
+
+\doinputonce{table}
+
+%D Here comes the last support module.
+
+\input supp-lan.tex
+
+%D The next three modules do what their names state. They
+%D load additional definition modules when needed.
+
+\input lang-ini.tex
+\input colo-ini.tex
+\input spec-ini.tex
+
+%D The special modules need some additional macro's:
+
+\input spec-mis.tex
+
+%D For the moment we load a lot of languages. In the future
+%D we'll have to be more space conservative.
+
+\input lang-lab.tex
+
+\input lang-alt.tex
+\input lang-ana.tex
+\input lang-art.tex
+\input lang-bal.tex
+\input lang-cel.tex
+\input lang-ger.tex
+\input lang-grk.tex
+\input lang-hnl.tex
+\input lang-ind.tex
+\input lang-ita.tex
+\input lang-sla.tex
+\input lang-ura.tex
+
+%D Next we load some core macro's. These implement the
+%D macros' that are seen by the users.
+
+\input core-var.tex
+\input core-gen.tex
+\input core-mak.tex
+\input core-grd.tex
+\input core-ver.tex
+\input core-vis.tex
+\input core-con.tex
+\input core-rul.tex
+\input core-tab.tex
+\input core-fil.tex
+\input core-new.tex
+\input core-nav.tex
+\input core-ref.tex
+\input core-obj.tex
+\input core-01a.tex
+\input core-mul.tex
+\input core-pag.tex
+
+%D Of course we do need fonts. There are no \TFM\ files
+%D loaded yet, so the format file is independant of their
+%D content. Here we also redefine \type{\it} as {\it italic}
+%D instead of italian.
+
+\input font-ini.tex
+
+%D Now we're ready for more core modules.
+
+\input core-fnt.tex
+\input core-not.tex
+% \input core-jav.tex % still experimental and loaded at runtime
+
+\input core-01b.tex
+\input core-01c.tex
+\input core-01d.tex
+\input core-01e.tex
+
+\input core-02a.tex
+\input core-02b.tex
+% core-02c.tex
+\input core-02d.tex
+
+%D Except from english, no hyphenation pattersn are loaded
+%D yet. Users can specify their needs in the next module:
+
+\input cont-usr.tex
+
+%D The next two modules implement some additional
+%D functionality concenring classes of documents and output.
+%D These modules probably will be replaced some day.
+
+\input docs-ini.tex
+\input list-ini.tex
+
+%D \TEX\ related logo's are always typeset in a special way.
+%D Here they come:
+
+\input cont-log.tex
+
+%D At run time, a few more files are loaded, like:
+%D
+%D \startopsomming[opelkaar]
+%D \som \type{cont-sys}: local (system dependant) defaults
+%D \som \type{cont-old}: substitutes for old (obsolete) macros
+%D \som \type{cont-new}: new macro implementations (for testing)
+%D \som \type{cont-fil}: filename and module synonyms
+%D \stopopsomming
+
+%D Dumping the format is all that's left to be done.
+
+\dump
diff --git a/tex/context/base/core-01a.tex b/tex/context/base/core-01a.tex index 0e6983f07..0cd073f02 100644 --- a/tex/context/base/core-01a.tex +++ b/tex/context/base/core-01a.tex @@ -1,16242 +1,16216 @@ -%D \module -%D [ file=core-01a, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=1A (to be split), -%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. - -% nog oplossen: voetnoot setten ivm later veranderde -% witruimte; probleem: als lijn graphic - -% \ifinfloat \ifinpagebody \ifintable \ifincolumns etc naar -% core-sta(tus) -% nieuw/nb: -% -% in handleiding: eerste in set float [hier..] telt! -% [hier,altijd] en niet [altijd,hier] -% -% \switchnaarkorps[globaal] voor bv grote figuren in klein -% \interactiebuttons[][] -% lijstalternatieven: e, f,g -% \lastreference -% \pagina[ja,blanko,rechts] -% \stelkopin[tussen] % precies aangeven waar voor/tussen/na -% \stelpapierformaatin[liggend,A4][liggend,A4] - -% kopletter: letter=,tekstletter=\bfa,nummerletter=\bf (anders ook \bfa) - -% in handleiding vermelden dat \definieerinteractiemenu 3 args behoeft! -% in handleiding: \steloffsetin vervangen door \stellayoutin -% in handleiding: \stellayoutin optie [markering=aan] -% in handleiding: \stellayoutin schaalt naar paginamaten -% in handleiding: \stellayoutin optie [plaats=midden|..zijdig] -% in handleiding: \stelinteractieschermin optie [..wit=, ..=passend] -% in handleiding: \stelinteractieschermin optie [..offset=, ..=passend] -% in handleiding: \definieerpapierformaat [A3,S3456][..] -% in handleiding: \stellayoutin optie [breedte|hoogte=passend] -% in handleiding: meer achtergrond opties -% in handleiding: \stelregelsin[inspringen=ja,nee,even,oneven] -% in handleiding: \stelkolommenin[optie=achtergrond] -% in handleiding: \omlijnd[breedte=passend,uitlijnen=midden] (auto mode) -% in handleiding: \omlijnd[achtergrondcommando ...] -% in handleiding: \stelhoofdin[status=hoog] -% in handleiding: \stellijstin[koppeling=aan] % interactieve optie, was standaard aan, nu uit -% in handleiding: \stelvoetin[voor=,na=,strut=] -% in handleiding: \stelmenuin[][links=,rechts=,midden=,voor=,...] - -% in handleiding: \definecolorgroup[a][b] -% \stelinteractiebalkin[symbool=ja|nee] -% \stelinteractiemenuin[zelfdepagina|onbekendeverwijzing=ja|nee|leeg|geen] -% \definieerconversie[aa][*,**,***] -% \stelkopin[eigennummer=ja] -% \stel...tekstenin (zonder argumenten == reset) - -% in handleiding: \definieeroverlay[naam]{commando} -% in handleiding: \plaatsonderelkaar -% -% in handleiding preview bij figuren - -% nb: als subpage: dan ook op eerste pag nummer ophogen (i.g.v. \standaardopmaak) -% execute command interactive commands - -% \stelsubpaginanummerin[reset] -% \bepaallijstkenmerken -% \bepaalregisterkenmerken - -% in handleiding cmyk/rgb/k -% in handleiding: \raggedright etc fontswitch afhankelijk (em) - -\newevery \everybodyfont \Everybodyfont % just to be sure - -\appendtoks \setnormalbaselines \to \everybodyfont -\appendtoks \setstrut \to \everybodyfont -\appendtoks \settopskip \to \everybodyfont -\appendtoks \setmaxdepth \to \everybodyfont -\appendtoks \stelinspringenin \to \everybodyfont -\appendtoks \stelblankoin \to \everybodyfont -\appendtoks \stelwitruimtein \to \everybodyfont -% \appendtoks \setupfootnotes \to \everybodyfont - -% \appendtoks .. \to \everypar -% \appendtoks .. \to \everypar -% \appendtoks .. \to \everypar - -% kan elders ook worden gebruikt i.i.g ongeveer -% \v!tekst EN \c!tekst etc checken - -\unprotect - -\def\gobbleassigndimen#1\\{} - -\def\assigndimen#1#2% - {\afterassignment\gobbleassigndimen#1=#2\!!zeropoint\\} - -\protect - -\writestatus{loading}{Context Core Macros (a)} - -\unprotect - -\startmessages dutch library: systems - title: systeem - 1: laden hulpfile uitgesteld (typemode) - 2: -- geladen - 3: probeer LaTeX eens - 4: commando -- is al gedefinieerd - 5: macro's uit -- geladen - 6: geen macro's in -- gevonden - 7: macro's uit -- reeds geladen - 8: nieuwe versie hulpfile, tweede run nodig - 9: -- niet gevonden/geplaatst - 10: gebruik geen em in -- - 11: aanmaken basale hulpfile - 12: de hulpfile is niet gesorteerd, gebruik texutil - 13: markering -- gedefinieerd -- - 14: geforceerde paginaovergang in lijst voor -- - 15: wegschrijven buffer -- - 16: inlezen buffer -- - 17: verbatim inlezen buffer -- - 18: synoniem -- -- bestaat niet - 19: betekenissen (synoniemen) van -- geladen - 20: betekenissen (sorteren) van -- geladen - 21: de hulpfile is niet geladen - 22: gebruik een goede hulpfile - 23: -- gearrangeerd op -- -\stopmessages - -\startmessages english library: systems - title: system - 1: loading utility-file postponed (typemode) - 2: -- loaded - 3: try LaTeX - 4: command -- is already defined - 5: macros of -- loaded - 6: no macros found in -- - 7: macros of -- already loaded - 8: new version of utility file, second pass needed - 9: -- not found/processed - 10: don't use em in -- - 11: building simple utility-file - 12: the utility-file is not sorted, use texutil - 13: mark -- defined -- - 14: forced newpage in list at -- - 15: saving buffer -- - 16: typesetting buffer -- - 17: typesetting verbatim buffer -- - 18: synonym -- -- does not exist - 19: meaning (synonyms) of -- loaded - 20: meaning (sorts) of -- loaded - 21: no utility data is loaded - 22: use a valid utilityfile - 23: -- arranged at -- -\stopmessages - -% - TOBIAS: check 21/22/23 - -\startmessages german library: systems - title: system - 1: Laden der Hilfsdatei verschoben (tippenmodus) - 2: -- geladen - 3: Versuche LaTeX - 4: Befehl -- ist bereits definiert - 5: Makros in -- geladen - 6: Keine Makros in -- gefunden - 7: Makros in -- bereits geladen - 8: Neue Version der Hilfsdatei, zweiter Durchlauf benoetigt - 9: -- nicht gefunden/verarbeitet - 10: Benutzte kein em in -- - 11: Erstelle einfache Hilfdatei - 12: Die Hilfdatei ist nicht sortiert, verwende texutil - 13: Beschriftung -- definiert -- - 14: Erzwungendes Seitenumbruch in Liste bei -- - 15: Speichere Buffer -- - 16: Setzte Buffer -- - 17: Setzte tippen-Buffer -- - 18: Synonym -- -- existiert nicht - 19: Bedeutung (synonyme) von -- geladen - 20: Bedeutung (sortieren) von -- geladen - 21: Die Hilfsdatei ist nicht geladen - 22: Brauche gute Hilfsdateien - 23: -- arrangiert auf -- -\stopmessages - -\startmessages dutch library: textblocks - title: tekstblokken - 1: nieuwe versie, tweede run nodig - 2: wegschrijven blokken naar -- - 3: inlezen blokken uit -- - 4: er is een tweede run nodig - 5: -- niet verborgen - 6: -- verborgen en verwerkt - 7: -- verborgen - 8: -- gehandhaafd - 9: -- niet gehandhaafd - 10: -- geladen en verwerkt - 11: -- geladen en geplaatst - 12: -- overgeslagen -\stopmessages - -\startmessages english library: textblocks - title: textblocks - 1: new version, second pass needed - 2: writing blocks to -- - 3: reading blocks from -- - 4: second pass needed - 5: -- not hidden - 6: -- hidden and processed - 7: -- hidden - 8: -- typeset - 9: -- not typeset - 10: -- loaded and processed - 11: -- loaded and typeset - 12: -- skipped -\stopmessages - -\startmessages german library: textblocks - title: textblock - 1: neue Version, zweiter Durchlauf benoetigt - 2: schreibe Bloecke zu -- - 3: lese Bloecke von -- - 4: zweiter Durchlauf benoetigt - 5: -- nicht verborgen - 6: -- verborgen und verarbeitet - 7: -- verborgen - 8: -- gesetzt - 9: -- nicht gesetzt - 10: -- geladen und verarbeitet - 11: -- geladen und gesetzt - 12: -- ausgelassen -\stopmessages - -\startmessages dutch library: floatblocks - title: plaatsblokken - 1: -- hernummerd / -- => -- - 2: -- bewaard - 3: -- verplaatst - 4: -- geplaatst - 5: volgorde aangepast - 6: maximaal -- boven - 7: maximaal -- onder - 8: minder dan -- regels - 9: volgorde verstoord - 10: -- begrensd - 11: geen blok opgegeven - 12: niet gedefinieerd -\stopmessages - -\startmessages english library: floatblocks - title: floatblocks - 1: -- renumbered / -- => -- - 2: -- saved - 3: -- moved - 4: -- placed - 5: order adapted - 6: n of top floats limited to -- - 7: n of bottom floats limited to -- - 8: less than -- lines - 9: order disturbed - 10: -- limited - 11: no block given - 12: undefined -\stopmessages - -\startmessages german library: floatblocks - title: Gleitobjektbloecke - 1: -- neu nummeriert / -- => -- - 2: -- gespeichert - 3: -- verschoben - 4: -- plaziert - 5: Reihenfolge angepasst - 6: Anz. der oberen Gleitobjekte beschraengt auf -- - 7: Anz. der unteren Gleitobjekte beschraengt auf -- - 8: weniger als -- zeilen - 9: Reigenfolge gestoert - 10: -- begrenzt - 11: kein Block gegeben - 12: undefiniert -\stopmessages - -\startmessages dutch library: layouts - title: layout - 1: teksthoogte aangepast met -- op pagina -- - 2: -- maal uitgestelde tekst tussengevoegd - 3: -- maal tekst plaatsen uitstellen - 4: margeblokken actief - 5: margeblokken inactief - 6: subpagina reeks -- verwerkt (aantal --) - 7: beeldmerken berekenen - 8: achtergronden berekenen - 9: momenteen maximaal -- niveaus in opsommingen - 10: -- en -- tellen niet op tot 1.0 - 11: interlinie -- niet toegestaan in gridmode -\stopmessages - -\startmessages english library: layouts - title: layout - 1: textheight adapted with -- at page -- - 2: -- times postponed text placed - 3: -- times text postponed - 4: marginblocks active - 5: marginblocks inactive - 6: subpage set -- processed (size --) - 7: calculating logospace - 8: calculating backgrounds - 9: currently no more than -- levels in itimezations - 10: -- and -- don't add up to 1.0 - 11: spacing -- not permitted in gridmode -\stopmessages - -% TOBIAS: 10 and 11! - -\startmessages german library: layouts - title: Layout - 1: Texthoehe angepasst mit -- auf Seite -- - 2: -- mal verschobener Text plaziert - 3: -- mal Text verschoben - 4: marginalbloecke aktiv - 5: marginalbloecke inaktiv - 6: Unterseitenfolge -- verarbeitet (Groesse --) - 7: berechne Platz des Logo - 8: berechne Hintergrund - 9: z.Z. nicht mehr als -- Niveaus in Posten - 10: -- and -- don't add up to 1.0 - 11: spacing -- not permitted in gridmode -\stopmessages - -\startmessages dutch library: structures - title: structuur - 1: begin van sectieblok -- - 2: eind van sectieblok -- -\stopmessages - -\startmessages english library: structures - title: structure - 1: begin of sectionblock -- - 2: end of sectionblock -- -\stopmessages - -\startmessages german library: structures - title: struktur - 1: Begin des Abschnittsblock -- - 2: Ende des Abschnittsblock -- -\stopmessages - -% \CONTEXTtrue % Now we know that we can use ConTeXt commands. - -% \def\teststatus{stop} -% -% \def\doiftrue {\iftrue} -% \def\doiffalse {\iffalse} -% -% \def\setstatus#1#2% -% {\doifelse{\getvalue{#1\c!status}}{\v!start} -% {\let#2=\doiftrue} -% {\let#2=\doiffalse}} -% -% \setstatus{test}\iftest -% -% \iftest -% \message{JA} -% \else -% \message{NEE} -% \fi - -% om problemen te voorkomen: -% -% \ascii => \@@ascii@@ -% \asciiA => \@@ascii@@A -% \asciiB => \@@ascii@@B - -% Nodig i.v.m. inspringen eerste alineas - -\def\explicithmode% - {\unhbox\voidb@x} - -% Nodig voor gebruikers - -\def\geentest{\donottest} - -% Dit moet nog ergens een plaats krijgen: - -\def\stelfactorenin% - {\stelwitruimtein - \stelblankoin - \settopskip - \setmaxdepth} - -% Nog doen: -% -% \goodbreak -> \allowbreak en \dosomebreak{..} in koppen -% -% bij koppen zowieso: \blanko[reset] - -% Nog in commando verwerken: -% -% \voorkeur … la \blanko -% -% Om ongewenste witruimte te voorkomen kan met \dosomebreak{\break} -% een \penalty v¢¢r witruimte worden geplaatst. - -\def\dosomebreak#1% - {\skip0=\lastskip - \removelastskip - %\type{#1}% - #1\relax - \ifdim\skip0=\!!zeropoint - \else - \vskip\skip0 - \fi} - -% beter, vooral in \vbox; nog in \pagina toepassen s! - -\def\doifoutervmode#1% - {\ifvmode\ifinner\else#1\fi\fi} - -\def\dosomebreak#1% - {\doifoutervmode - {\skip0=\lastskip - \removelastskip - %\leavevmode\type{#1}% - #1\relax - \ifdim\skip0=\!!zeropoint % else interference with footnotes - \else - \vskip\skip0 - \fi}} - -% Idem: -% -% \springin - -%\def\noindentation% vervallen -% {\EveryPar -% {\ifdim\parindent=\!!zeropoint -% \else -% \bgroup -% \setbox0=\lastbox -% \egroup -% \fi -% \EveryPar{}}} - -\newif\ifindentation \indentationtrue % documenteren, naar buiten - -\let\checkindentation=\relax - -\def\donoindentation% - {\ifdim\parindent=\!!zeropoint - \else - \bgroup - \setbox0=\lastbox - \egroup - \fi} - -\def\noindentation% - {\indentationfalse - \def\checkindentation% - {\donoindentation - \let\checkindentation=\indentationtrue}} - -\def\indentation% - {\ifvmode - \ifdim\parindent=\!!zeropoint - \else - \hskip\parindent - \fi - \fi} - -% vergeten - -% \def\forgetall% -% {\everypar{}% % i.v.m. sidefloats -% \let\par=\endgraf % i.v.m. getpar etc -% \stelwitruimtein[\v!geen]% -% \stelinspringenin[\v!geen]% -% \leftskip\!!zeropoint -% \rightskip\!!zeropoint -% \relax} -% -% \def\forgetparindent% -% {\everypar{}% -% \voorwit\!!zeropoint % toegevoegd -% \parindent\!!zeropoint} - -\def\forgeteverypar% - {\everypar{}} - -\def\forgeteverypar% - {\everypar{\the\neverypar}} - -\def\forgetparindent% - {\forgeteverypar - \stelinspringenin[\v!geen]} - -\def\forgetparskip% - {\stelwitruimtein[\v!geen]} - -\def\forgetbothskips% - {\tolerance=1500 - \leftskip\!!zeropoint - \rightskip\!!zeropoint\relax} - -\def\forgetspacing% - {\emergencystretch\!!zeropoint\relax} - -\def\forgetall% - {\let\par=\endgraf % i.v.m. getpar etc - \forgetparskip - \forgetparindent - \forgetbothskips - \forgetspacing} % i.v.m. funny spacing in pagebody - -\def\localvbox#1#% - {\vbox#1\bgroup - \forgetparskip - \setlocalhsize - \hsize=\localhsize - \forgetparindent - \forgetbothskips - \forgeteverypar - \let\next=} - -% ach ja - -\unexpanded\def\dostartattributes#1% - {\begingroup % geen \bgroup, anders in mathmode lege \hbox - \doifdefinedelse{#1\c!kleur} - {\def\colorattribute{\getvalue{#1\c!kleur}}} - {\let\colorattribute=\empty}% - \doifdefinedelse{#1\c!letter} - {\def\fontattribute{\getvalue{#1\c!letter}}} - {\let\fontattribute=\empty}% - \startcolor[\colorattribute]% - \doconvertfont{\fontattribute}} - -\unexpanded\def\dostopattributes% - {\stopcolor - \endgroup} - -\unexpanded\def\doattributes#1#2% - {\dostartattributes{#1}{#2}\dostopattributes} - -% \dotextprefix{tekst} -% -% als {tekst} niet leeg is: tekst~ - -\def\dotextprefix#1% - {\ConvertToConstant\doifnot{#1}{}{#1~}} - -\def\herhaal {\dorepeat} -\def\herhaler {\repeater} -\def\herhaalmetcommando {\dorepeatwithcommand} - -% This permits things like ^\index{hans}^, where hans is -% duplicated in the text. - -\newif\ifduplicate - -\bgroup -\gdef\checkduplication% in line with Knuth - {\ifmmode - \def\next{^}% - \else - \let\next=\startduplication - \fi - \next} -\gdef\insideduplication% - {\ifmmode - \def\next{^}% - \else - \let\next=\egroup - \fi - \next} -\catcode`\^=\@@active -\gdef\enableduplication% - {\catcode`\^=\@@active - \let^=\checkduplication} -\gdef\disableduplication% - {\catcode`\^=\@@superscript} -\gdef\startduplication% - {\bgroup - \duplicatetrue - \let^=\insideduplication} -\egroup - -\def\verbatim#1% - {\convertargument#1\to\ascii\ascii} - -% mogelijke optimalisaties: -% -% \ifx ...\else ...\fi -% \ifvisible ... \fi - -% De opbouw van deze file -% -% Deze file bevat naast de verschillende Pragma-Macro's ook -% helpinformatie bij deze macro's en templates. Een blok -% helpinformatie wordt gekenmerkt door een %I. -% -% Een blok kan zijn opgedeeld in pagina's. In dat geval is -% %I vervangen door %P. De eerste regel van een blok bevat -% de titel van de informatie. -% -% Een template (voorgedefinieerde structuur) wordt gekenmerkt -% door %T. Ook hier bevat de eerste regel een titel, -% eventueel gevolgd door een mnemonic. -% -% Zowel de helpinformatie als de templates zijn in het -% programma TeXEdit oproepbaar. -% -% Het programma TeXEdit kan t.z.t. worden ingesteld met -% behulp van de onderstaande, door %S voorafgegane, -% setupcommando's. Vooralsnog is een en ander 'hard' in het -% programma geprogrammeerd. - -%S InputFile \input -%S InputFile \omgeving \environment -%S InputFile \projekt \project -%S InputFile \produkt \product -%S InputFile \onderdeel \component -%S -%S CheckStrings \start \stop -%S CheckStrings \begin \end -%S CheckStrings \begin \eind -%S -%S CheckChars { } -%S CheckChars [ ] -%S CheckChars ( ) -%S -%S CheckChar $ - -% Het <pagina>-karakter (FormFeed), wordt omgezet in \par - -\edef\oldlinefeed{\the\catcode`\^^L} - -\catcode`\^^L=\oldlinefeed - -\catcode`\^^L=\@@endofline - -%I n=Struts -%I c=\strut,\setnostrut,\setstrut,\toonstruts -%I -%I Struts zijn onzichtbare 'karakters' met alleen een hoogte -%I en diepte. De volgende commando's hebben betrekking op -%I struts -%I -%I \strut -%I \setstrut -%I \setnostrut -%I \toonstruts - -\def\toonstruts% - {\setteststrut} - -% Hieronder volgen enkele instellingen en macro's ten behoeve -% van de interlinie en \strut. De waarden 2.8, 0.07, 0.72 en -% 0.28 zijn ooit eens ontleend aan INRS-TEX en moeten wellicht -% nog eens instelbaar worden. -% -% \lineheight : de hoogte van een regel -% \spacing{getal} : instellen interlinie -% \normalbaselines : instellen regelafstend -% -% \setstrut : instellen \strut -% \setnostrut : resetten \strut, \endstrut, \begstrut -% -% \setteststrut : instellen zichtbare struts -% \resetteststrut : instellen onzichtbare struts -% -% \setfontparameters : instellen na fontset -% -% De hoogte van een regel (\lineheight) is gelijk aan de -% som van de hoogte (\ht) en diepte (\dp) van \strutbox. -% -% \strut : denkbeeldig blokje met hoogte en diepte -% -% Een \hbox kan als deze aan het begin van een regel staat -% een breedte \hsize krijgen. Dit is soms te voorkomen met het -% commando \leavevmode. Binnen een \vbox geeft dit echter -% niet altijd het gewenste resultaat, vandaar het commando -% -% \leaveoutervmode - -% Pas op: niet zomaar \topskip en \baselineskip aanpassen -% en zeker niet \widowpenalty. Dit kan ernstige gevolgen -% hebben voor kolommen. -% -% Enige glue kan op zich geen kwaad, echter als blanko=vast, -% dan moet ook de rek 0 zijn. Binnen kolommen is rek ook -% niet bepaald mooi. Een hele kleine waarde (0.025) voldoet, -% omdat een positieve glue eindeloos rekbaar is. - -\newdimen\strutdimen -\newdimen\lineheight -\newdimen\openlineheight -\newdimen\openstrutheight -\newdimen\openstrutdepth - -\def\strutheightfactor {.72} -\def\strutdepthfactor {.28} - -\def\baselinefactor {2.8} -\def\baselinegluefactor {0} - -\def\normallineheight {\baselinefactor ex} - -\def\strutheight {0pt} -\def\strutdepth {0pt} -\def\strutwidth {0pt} - -\def\spacingfactor {1} - -\def\topskipfactor {1.0} -\def\maxdepthfactor {0.4} - -\def\systemtopskipfactor {\topskipfactor} -\def\systemmaxdepthfactor {\maxdepthfactor} - -% De onderstaande definitie wordt in de font-module overruled - -\ifx\globalbodyfontsize\undefined - \newdimen\globalbodyfontsize \globalbodyfontsize=12pt -\fi - -% door een \dimen. Dit is geen probleem omdat (1) de default -% korpsgrootte 12pt is en (2) de fonts nog niet geladen zijn -% en de instellingen bij het laden nogmaals plaatsvinden. - -\def\settopskip% the extra test is needed for the lbr family - {\topskip=\systemtopskipfactor\globalbodyfontsize - \ifgridsnapping \else - \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi - \fi - \relax % the skip - \ifdim\topskip<\strutheightfactor\openlineheight - \topskip=\strutheightfactor\openlineheight\relax - \fi} - -\def\setmaxdepth% - {\maxdepth=\systemmaxdepthfactor\globalbodyfontsize} - -\def\normalbaselines% - {\baselineskip\normalbaselineskip - \lineskip\normallineskip - \lineskiplimit\normallineskiplimit} - -\def\setnormalbaselines% - {\lineheight=\normallineheight - \openlineheight=\spacingfactor\lineheight -\openstrutheight=\strutheightfactor\openlineheight -\openstrutdepth =\strutdepthfactor \openlineheight - \normalbaselineskip= - \openlineheight - \!!plus\baselinegluefactor\openlineheight - \!!minus\baselinegluefactor\openlineheight - \normallineskip\!!onepoint\relax - \normallineskiplimit\!!zeropoint\relax - \normalbaselines} - -\def\setspacingfactor#1\to#2\by#3\\% - {\strutdimen=#2pt\relax - \strutdimen=#3\strutdimen - \edef#1{\withoutpt{\the\strutdimen}}} - -\def\spacing#1% - {\ifgridsnapping - \edef\spacingfactor{1}% - \showmessage{\m!layouts}{11}{#1}% - \else - \edef\spacingfactor{#1}% - \fi - \setspacingfactor\systemtopskipfactor\to\topskipfactor\by#1\\% - \setspacingfactor\systemmaxdepthfactor\to\maxdepthfactor\by#1\\% - \setnormalbaselines - \setstrut} - -\def\setstrutdimen#1#2#3% % een strut is n.m maal ex - {\strutdimen=\normallineheight % wat niet per se \lineheight - \strutdimen=#2\strutdimen % is omdat een strut lokaal - \strutdimen=#3\strutdimen % kan afwijken van de globale - \edef#1{\the\strutdimen}} % strut - -\let\normalstrut=\strut - -% The double \hbox construction enables us to \backtrack -% boxes. - -\def\setstrut% - {\setstrutdimen\strutheight\strutheightfactor\spacingfactor - \setstrutdimen\strutdepth \strutdepthfactor \spacingfactor - \let\strut=\normalstrut - \setbox\strutbox=\normalhbox - {\normalhbox - {\vrule - \!!width \strutwidth - \!!height \strutheight - \!!depth \strutdepth - \normalkern-\strutwidth}}} - -\def\setteststrut% - {\def\strutwidth{.8pt}% - \setstrut} - -\def\begstrut% - {\relax\ifdim\ht\strutbox=\!!zeropoint \else - \strut - \normalpenalty\!!tenthousand - \normalhskip\!!zeropoint - \ignorespaces - \fi} - -\def\endstrut% - {\relax\ifdim\ht\strutbox=\!!zeropoint \else - \unskip - \normalpenalty\!!tenthousand - \normalhskip\!!zeropoint - \strut - \fi} - -\def\setnostrut% - {\setbox\strutbox=\normalhbox{\normalhbox{}}% - \let\strut=\empty - \let\endstrut=\empty - \let\begstrut=\empty} - -\def\resetteststrut% - {\let\strutwidth=\!!zeropoint - \setstrut} - -\def\setfontparameters% - {\the\everybodyfont} - -% \setnormalbaselines -% \setstrut -% \settopskip -% \setmaxdepth -% \the\EveryFontSwitch - -%D We need \type{\normaloffinterlineskip} because the new -%D definition contains an assignment, and |<|don't ask me -%D why|>| this assignment gives troubles in for instance the -%D visual debugger. - -\ifx\undefined\normaloffinterlineskip - \let\normaloffinterlineskip=\offinterlineskip % knuth's original -\fi - -% \newskip\oldbaselineskip -% \newskip\oldlineskip -% \newskip\oldlineskiplimit -% -% \newif\ifinterlineskipoff -% -% \def\offinterlineskip% -% {\ifinterlineskipoff\else -% \interlineskipofftrue -% \oldbaselineskip=\baselineskip -% \oldlineskip=\lineskip -% \oldlineskiplimit=\lineskiplimit -% \fi -% \normaloffinterlineskip} -% -% \def\oninterlineskip% -% {\ifinterlineskipoff -% \baselineskip=\oldbaselineskip -% \lineskip=\oldlineskip -% \lineskiplimit=\oldlineskiplimit -% \fi} - -\def\offinterlineskip% - {\edef\oninterlineskip% - {\baselineskip=\the\baselineskip - \lineskip=\the\lineskip - \lineskiplimit=\the\lineskiplimit - \noexpand\let\noexpand\offinterlineskip=\noexpand\normaloffinterlineskip}% - \normaloffinterlineskip} - -\let\oninterlineskip=\relax - -\def\leaveoutervmode% - {\ifvmode\ifinner\else - \leavevmode - \fi\fi} - -% We passen ook de \displayskip's wat aan (nog eens uitzoeken): - -\def\displayskipsize#1#2% - {#1\lineheight\!!plus#2\lineheight\!!minus#2\lineheight} - -\def\displayskipfactor {1.0} -\def\displayshortskipfactor {0.8} - -\def\displayskipgluefactor {0.3} -\def\displayshortskipgluefactor {0.2} - -\def\abovedisplayskipsize% doet niets ? - {\displayskipsize\displayskipfactor\displayskipgluefactor} - -\def\belowdisplayskipsize% doet niets ? - {\displayskipsize\displayskipfactor\displayskipgluefactor} - -\def\abovedisplayshortskipsize% - {\displayskipsize\displayshortskipfactor\displayshortskipgluefactor} - -\def\belowdisplayshortskipsize% - {\displayskipsize\displayshortskipfactor\displayshortskipgluefactor} - -\def\setdisplayskip#1#2#3% - {#1=#2\relax - \advance#1 by -\parskip - \advance#1 by -#3\relax} - -\def\setdisplayskips% - {\setdisplayskip\abovedisplayskip\abovedisplayskipsize\baselineskip - \setdisplayskip\belowdisplayskip\belowdisplayskipsize\!!zeropoint - \setdisplayskip\abovedisplayshortskip\abovedisplayshortskipsize\baselineskip - \setdisplayskip\belowdisplayshortskip\belowdisplayshortskipsize\!!zeropoint} - -% We stellen enkele penalties anders in dan Plain TEX: - -\widowpenalty=2000 % was: 1000 -\clubpenalty=2000 % was: 800 - -% Bovendien definieren we enkele extra \fill's: - -\def\hfilll% - {\hskip\!!zeropoint\!!plus1filll} - -\def\vfilll% - {\vskip\!!zeropoint\!!plus1filll} - -% De onderstaande hulpmacro's moeten nog eens instelbaar worden -% gemaakt. - -\def\tfskipsize{1em\relax} - -\def\tfkernsize{1ex\relax} - -\def\tfskip% - {{\tf\hskip\tfskipsize}} - -\def\tfkern% - {{\tf\kern\tfkernsize}} - -% Dit hoort eigenlijk thuis onder het kopje boodschappen cq, -% meldingen. - -\def\mindermeldingen% - {\hbadness=10000 - \hfuzz=\maxdimen - \vbadness=10000 - \vfuzz=\maxdimen} - -% Utility-file -% -% De onderstaande macro's ondersteunen het gebruik van de -% zogeheten utility-file. Alle extern onder te brengen -% informatie wordt opgeslagen in de file \jobname.tui, tenzij -% er selectief pagina's worden gezet. In dat geval wordt de -% file \jobname.tmp gebruikt. Informatie wordt ingelezen uit -% de file \jobname.tuo, welke door TeXUtil wordt aangemaakt. - -% Bepaalde commando's worden als string weggeschreven. Deze -% zijn aan het eind van deze file gedefinieerd. - -% Om een opbouw van spaties te voorkomen (???) moet ^^M een -% andere betekenis krijgen: -% -% \catcode`\^^M=14 (comment) -% -% read file -% -% \catcode`\^^M=5 (end of line) - -\newwrite\uti -\newif\ifutilitydone - -\def\@@utilityerrormessage% - {\showmessage{\m!systems}{8}{}% - \global\let\@@utilityerrormessage=\relax} - -\def\thisisutilityversion#1% - {\doifnot{\utilityversion}{#1}% - {\@@utilityerrormessage - \resetutilities - \endinput}} - -\def\writeutility% - {\write\uti} - -\def\immediatewriteutility% - {\immediate\write\uti} - -\def\writeutilitycommand#1% - {\writeutility{c \string#1}} - -\def\immediatewriteutilitycommand#1% - {\immediatewriteutility{c \string#1}} - -\def\openutilities% - {\immediate\openout\uti=\jobname.\f!inputextension - \immediatewriteutilitycommand% - {\thisisutilityversion{\utilityversion}}} - -\def\closeutilities% - {\savenofsubpages - \savenofpages - \immediate\closeout\uti - \reportutilityproblems} - -\def\abortutilitygeneration% - {\immediatewriteutilitycommand{\utilitygenerationaborted}% - \immediatewriteutility{q {quit}}} - -\def\utilitygenerationaborted% - {\showmessage{\m!systems}{21}{}% - \global\let\utilitygenerationaborted=\endinput - \gdef\reportutilityproblems{\showmessage{\m!systems}{22}{}}% - \endinput} - -\let\reportutilityproblems=\relax - -\let\utilityresetlist=\empty - -\def\addutilityreset#1% - {\addtocommalist{\s!reset#1}\utilityresetlist} - -\def\resetutilities% - {\processcommacommand[\utilityresetlist]\getvalue} - -% #1=type -% #2=file -% #3=melding - -% #4=voor -% #5=na - -% Er wordt gegroepeerd. Als binnen een lijst (bijvoorbeeld) de -% \leftskip is aangepast, maar nog geen \par is gegeven, dan -% geldt buiten de groep de oude \leftskip. Aan #5 kan dan -% ook \par worden meegegeven om de paragraaf af te sluiten. - -\newif\ifdoinpututilities -\newif\ifunprotectutilities % voor't geval er \v!xxxxxx's zijn - -\def\utilitycheckmessage% - {\showmessage{\m!systems}{12}{}% - \global\let\utilitycheckmessage=\relax} - -\def\saveutilityline#1 #2\txen% tricky maar ok, want achter \command - {\if #1c% commands % in \ascii staat een spatie; #1 kan - \write\scratchwrite{#2}% % \par in stringvorm zijn (eof)! - \else\if#1s% synoniems - \utilitycheckmessage - \else\if#1r% registers - \utilitycheckmessage - \fi\fi\fi} - -\def\checkutilityfile% - {\doiflocfileelse{\jobname.\f!outputextension} - {} - {\doiflocfileelse{\jobname.\f!inputextension} - {\bgroup - \showmessage{\m!systems}{11}{}% - \openout\scratchwrite=\jobname.\f!outputextension - \openlocin\scratchread{\jobname.\f!inputextension}% - \def\doprocessline% - {\ifeof\scratchread - \def\doprocessline{\closein\scratchread}% - \else - \read\scratchread to \ascii - \convertcommand\ascii\to\ascii - \expandafter\saveutilityline\ascii\txen - \fi - \doprocessline}% - \doprocessline - \closeout\scratchwrite - \egroup} - {}}} - -\long\def\doutilities#1#2#3#4#5% % introduceren in utility file - {%\ifprocessingverbatim - % \showmessage{\m!systems}{1}{}% - %\else -\restorecatcodes - \resetutilities - \def\docommando##1% % zo kunnen meerdere dingen - {\getvalue{\s!set##1}}% % in een pass worden gedaan, - \processcommacommand[#1]\docommando % zie bijvoorbeeld lijsten - \begingroup - \footnotesenabledfalse - \doinpututilitiestrue - \global\utilitydonefalse - \catcode`\%=\@@comment\relax - \pushendofline % geeft problemen zodra andere file wordt ingelezen - \ifunprotectutilities % nog nodig ? - \unprotect - \fi - \ifnum\catcode`\@=\@@active \else - \catcode`\@=\@@letter % permits expanded commands with \@'s - \fi - \ifnum\catcode`\!=\@@active \else - \catcode`\!=\@@letter % permits multilingual constants - \fi - #4\readjobfile{#2.\f!outputextension}{}{}#5% - \relax - \ifunprotectutilities - \protect - \fi - \popendofline - \ifutilitydone\else - \doifnot{#3}{} - {\showmessage{\m!systems}{9}{{#3}}% - \ifvoorlopig - \blanko - \type{[\currentmessagetext]}% - \blanko - \fi}% - \fi - \endgroup - }%\fi} - -% Commando's ten behoeve van two-pass lists. In principe -% kan alles in een keer worden ingelezen. Omdat de macro's -% groeien is de kans groot dat het (main) geheugen door -% (de)allocatie volloopt. Vandaar dat we het toch maar niet -% doen. -% -% \definetwopasslist{\s!xxx} -% -% \gettwopassdata{\s!xxx} -% \getfrompassdata{\s!xxx}{n} n=index (getal) -% \findtwopassdata{\s!xxx}{tag} bijvoorbeeld {label:} -% \iftwopassdatafound -% \twopassdata -% -% \twopassentry{\s!xxx}{nr}{data} nr alleen voor testdoeleinden - -\def\alltwopasslists{} - -\newif\iftwopassdatafound - -\def\twopassentry#1% - {\executeifdefined{@@#1\s!pass}\gobbletwoarguments} - -\def\definetwopasslist#1% - {\doifundefined{#1:\s!list} - {\addtocommalist{#1}\alltwopasslists - \doglobal\addutilityreset{#1\s!pass}% - \setgvalue{\s!set#1\s!pass}% - {\setgvalue{@@#1\s!pass}####1####2% - {\debuggerinfo{\m!systems}{twopass data #1 - ####1 = ####2}% - \setxvalue{#1:\s!list}{\getvalue{#1:\s!list}####2,}}}% - \setgvalue{\s!reset#1\s!pass}% - {\setgvalue{@@#1\s!pass}####1####2{}}% - \getvalue{\s!reset#1\s!pass}}} - -\def\doloadtwopassdata#1% - {\doifundefined{#1:\s!list} - {\setgvalue{#1:\s!list}{}% - \doutilities{#1\s!pass}{\jobname}{}{}{}% - \setxvalue{#1:\s!list}{\getvalue{#1:\s!list}0,0}}} - -\def\loadtwopassdata% - {\processcommacommand[\alltwopasslists]\doloadtwopassdata} - -\def\twopassdata{} - -\def\dogettwopassdata[#1,#2]#3% - {\doifelse{#1}{0} - {\twopassdatafoundfalse} - {\twopassdatafoundtrue - \setxvalue{#3:\s!list}{#2}% - \edef\twopassdata{#1}}} - -\def\gettwopassdata#1% - {\edef\!!stringa{\getvalue{#1:\s!list}}% - \debuggerinfo{\m!systems}{twopass get #1 - \!!stringa}% - \expandafter\dogettwopassdata\expandafter[\!!stringa]{#1}} - -\def\dofindtwopassdata#1#2% - {\edef\!!stringa{,\getvalue{#1:\s!list}}% - \debuggerinfo{\m!systems}{twopass find #2 - \!!stringa}% - \def\dodofindtwopassdata[##1,##2#2##3,##4]% - {\def\twopassdata{##3}% - \doifelse{##3}{} - {\twopassdatafoundfalse} - {\twopassdatafoundtrue}}% - \@EA\dodofindtwopassdata\@EA[\!!stringa,#2,#2,]} - -\def\findtwopassdata% - {\ExpandBothAfter\dofindtwopassdata} - -\def\dogetfirsttwopassdata[#1,#2]#3% - {\doifelse{#1}{0} - {\twopassdatafoundfalse} - {\twopassdatafoundtrue - \edef\twopassdata{#1}}} - -\def\getfirsttwopassdata#1% - {\edef\!!stringa{\getvalue{#1:\s!list}}% - \expandafter\dogetfirsttwopassdata\expandafter[\!!stringa]{#1}} - -\def\getlasttwopassdata#1% - {\edef\twopassdata{0}\twopassdatafoundfalse - \newcounter\noftwopassitems - \def\docommando##1% - {\doifnot{##1}{0} - {\increment\noftwopassitems - \edef\twopassdata{##1}\twopassdatafoundtrue}}% - \processcommacommand[\getvalue{#1:\s!list}]\docommando} - -\def\getfromtwopassdata#1#2% - {\getfromcommacommand[\getvalue{#1:\s!list}][#2]% - \doifelsenothing{\commalistelement} - {\twopassdatafoundfalse} - {\twopassdatafoundtrue - \let\twopassdata=\commalistelement}} - -% Maten -% -% De onderstaande instellingen worden gebruikt voor het -% vastleggen van de zetspiegel en marges. - -\voffset=0pt % setting this to -1in let's go metapost crazy -\hoffset=0pt % setting this to -1in let's go metapost crazy - -\newdimen\papierhoogte -\newdimen\papierbreedte - -\newdimen\printpapierhoogte -\newdimen\printpapierbreedte - -\newdimen\zethoogte -\newdimen\zetbreedte - -\newdimen\teksthoogte -\newdimen\tekstbreedte - -\newdimen\kopwit \kopwit=2cm -\newdimen\rugwit \rugwit=2cm - -\newdimen\hoofdhoogte \hoofdhoogte=2cm -\newdimen\voethoogte \voethoogte=2cm - -%\newdimen\kopkopwit \kopkopwit=0cm - -\newdimen\kopoffset \kopoffset=\!!zeropoint -\newdimen\rugoffset \rugoffset=\!!zeropoint - -\newdimen\linkermargebreedte \linkermargebreedte=3cm -\newdimen\rechtermargebreedte \rechtermargebreedte=\linkermargebreedte - -\newdimen\linkerrandbreedte \linkerrandbreedte=3cm -\newdimen\rechterrandbreedte \rechterrandbreedte=\linkerrandbreedte - -\newdimen\bovenhoogte \bovenhoogte=1cm -\newdimen\onderhoogte \onderhoogte=\bovenhoogte - -\def\margeafstand% - {\@@lymargeafstand} - -\def\randafstand% - {\@@lyrandafstand} - -\def\margebreedte% - {\@@lymarge} - -\def\randbreedte% - {\@@lyrand} - -\def\linkerrandafstand% - {\ifdim\!!zeropoint<\linkerrandbreedte - \@@lylinkerrandafstand - \else - \!!zeropoint - \fi} - -\def\rechterrandafstand% - {\ifdim\!!zeropoint<\rechterrandbreedte - \@@lyrechterrandafstand - \else - \!!zeropoint - \fi} - -\def\linkermargeafstand% - {\ifdim\!!zeropoint<\linkermargebreedte - \@@lylinkermargeafstand - \else - \!!zeropoint - \fi} - -\def\rechtermargeafstand% - {\ifdim\!!zeropoint<\rechtermargebreedte - \@@lyrechtermargeafstand - \else - \!!zeropoint - \fi} - -\def\bovenafstand% - {\ifdim\!!zeropoint<\bovenhoogte - \@@lybovenafstand - \else - \!!zeropoint - \fi} - -\def\hoofdafstand% - {\ifdim\!!zeropoint<\hoofdhoogte - \@@lyhoofdafstand - \else - \!!zeropoint - \fi} - -\def\voetafstand% - {\ifdim\!!zeropoint<\voethoogte - \@@lyvoetafstand - \else - \!!zeropoint - \fi} - -\def\onderafstand% - {\ifdim\!!zeropoint<\onderhoogte - \@@lyonderafstand - \else - \!!zeropoint - \fi} - -\newif\ifdubbelzijdig -\dubbelzijdigfalse - -\newif\ifenkelzijdig -\enkelzijdigtrue - -\def\doifsometextlineelse#1#2#3% ! omgekeerd ! - {\doifinsetelse{\getvalue{\??tk#1\v!tekst\c!status}}{\v!geen,\v!hoog} - {#3}{#2}} - -\def\calculatevsizes% global needed in \resetlayoutregel - {\redoglobal\teksthoogte=\zethoogte - %\redoglobal\kopkopwit=\kopwit - %\redoglobal\advance\kopkopwit by \hoofdhoogte - %\redoglobal\advance\kopkopwit by \hoofdafstand - \doifsometextlineelse{\v!hoofd} - {\redoglobal\advance\teksthoogte by -\hoofdhoogte - \redoglobal\advance\teksthoogte by -\hoofdafstand} - {}% - \doifsometextlineelse{\v!voet} - {\redoglobal\advance\teksthoogte by -\voethoogte - \redoglobal\advance\teksthoogte by -\voetafstand} - {}% - \resetglobal - \setvsize} - -\def\calculatereducedvsizes% - {\teksthoogte=\zethoogte - \doifsometextlineelse{\v!hoofd} - {\advance\teksthoogte by -\hoofdhoogte - \advance\teksthoogte by -\hoofdafstand} - {\hoofdhoogte=\!!zeropoint}% - \doifsometextlineelse{\v!voet} - {\advance\teksthoogte by -\voethoogte - \advance\teksthoogte by -\voetafstand} - {\voethoogte=\!!zeropoint}} - -\def\calculatehsizes% - {\tekstbreedte=\zetbreedte - \sethsize} - -\def\sethsize% - {\global\hsize=\tekstbreedte} - -\def\setvsize% - {\ifdim\vsize=\teksthoogte - \else - \bgroup - \dimen0=-\vsize - \advance\dimen0 by \teksthoogte - \global\advance\vsize by \dimen0 - \ifdim\pagegoal<\maxdimen - \advance\dimen0 by \pagegoal - \global\pagegoal=\dimen0 - \fi - \egroup - \fi} - -% Algemeen -% -% De Pragma-macros zijn samengesteld met behulp van de -% commandos van PlainTeX- en enkele TugBoat routines. -% -% Voor de volledigheid zijn in de definitie steeds de -% {}-haakjes vermeld. Deze haakjes zijn niet altijd -% nodig, Als bijvoorbeeld een paragraaf bewerkt wordt, -% kunnen ze achterwege blijven. -% -% Instellingen worden opgegeven tussen []-haakjes, -% meestal direct na het commando. Instellingen mogen -% soms achterwege blijven. -% -% Een aantal veelgebruikte macro's zijn in TeXEdit op -% naam en/of door middel van een mnemonic oproepbaar. - -% %I n=Offset -% %I c=\steloffsetin -% %I -% %I De totale bladzijde kan verschoven worden ten opzichte -% %I van de linkerbovenhoek met: -% %I -% %I \steloffsetin[rug=,kop=] -% %I -% %I Dit commando moet worden gegeven aan het begin van de -% %I pagina waarvoor het moet gelden. Er kunnen positieve -% %I en negatieve waarden worden ingevuld: -10pt, 1.5cm. -% -% \def\dosteloffsetin[#1]% -% {\getparameters -% [\??os] -% [\c!rug=\rugoffset, -% \c!kop=\kopoffset, -% #1]% -% \rugoffset=\@@osrug -% \kopoffset=\@@oskop} -% -% \def\steloffsetin% -% {\dosingleargument\dosteloffsetin} - -% De onderstaande macro voert commando's uit, afhankelijk van -% het karakter van het paginanummer. -% -% \doifonevenpaginaelse{then-commando}{else-commando} - -% NB \userpageno vervangen door \realpageno - -\def\doifonevenpaginaelse#1#2% - {\ifodd\realpageno#1\else#2\fi} - -\def\doifbothsidesoverruled#1\orsideone#2\orsidetwo#3\od% - {\ifdubbelzijdig - \ifodd\realpageno#2\relax\else#3\relax\fi - \else - #1\relax - \fi} - -\def\doifbothsides#1\orsideone#2\orsidetwo#3\od% - {\ifdubbelzijdig - \ifenkelzijdig - #1\relax - \else - \ifodd\realpageno#2\relax\else#3\relax\fi - \fi - \else - #1\relax - \fi} - -\def\dostartglobaldefs#1#2% - {\edef\!!stringa{\the\globaldefs}% - \ifnum\globaldefs#10 - \globaldefs=-\globaldefs - \fi - \advance\globaldefs by #21 - \setevalue{@gd@\the\globaldefs}{\!!stringa}} - -\def\dostopglobaldefs% - {\doifdefinedelse{@gd@\the\globaldefs} - {\globaldefs=\getvalue{@gd@\the\globaldefs}\relax} - {\globaldefs=0\relax}} - -\def\startlocal {\dostartglobaldefs>-} -\def\stoplocal {\dostopglobaldefs} -\def\startglobal {\dostartglobaldefs<+} -\def\stopglobal {\dostopglobaldefs} - -%I n=Zetspiegel -%I c=\stellayoutin,\definieerpapierformaat,\stelpapierformaatin -%I c=\paslayoutaan -%I -%I De zetspiegel is het door de tekst gevormde vlak. -%I Hiertoe behoren ¢¢k de hoofd- en voetmarge. De zetspiegel -%I wordt ingesteld met: -%I -%I \stellayoutin[breedte=,hoogte=,rugwit=,kopwit=] -%I -%I Er dienen maten te worden ingevuld, waarbij de eenheid -%I direkt achter het getal staat: 10pt, 100mm, 5cm, 3.5in. -%I -%I De parameters hebben de volgende betekenis: -%I -%I breedte breedte van het tekstvlak, inclusief marges -%I hoogte hoogte van het tekstvlak, inclusief marges -%I rugwit witruimte aan de binnenzijde, zonder marge -%I kopwit witruimte aan de bovenzijde, zonder marge -%P -%I Rond de zetspiegel vinden we marges, randen, het hoofd en -%I de voet. Ook deze worden ingesteld met: -%I -%I \stellayoutin[breedte=,hoogte=,rugwit=,kopwit=] -%I -%I hoofd hoogte van de bovenmarge binnen de zetspiegel -%I voet hoogte van de ondermarge binnen de zetspiegel -%I marge breedte van de marge naast de zetspiegel -%I -%I en -%I -%I rand breedte van de rand naast de marge -%I boven hoogte van de rand boven het hoofd -%I onder hoogte van de rand onder de voet -%I -%I Alleen het hoofd en de voet hangen dus samen met de -%I zetspiegel. -%P -%I Eventueel kunnen de linker- en rechtermarge en apart -%I worden ingesteld: -%I -%I \stellayoutin[linkermarge=,rechtermarge=] -%I -%I Het zelfde geldt voor de randen. In dat geval wordt bij -%I dubbelzijdig zetten gespiegeld. Oppassen dus! -%I -%I De afstanden tussen marges, randen enz. kunnen worden -%I ingesteld met: -%I -%I bovenafstand, onderafstand -%I hoofdafstand,voetafstand -%I linkermargeafstand,rechtermargeafstand, -%I linkerrandafstand,rechterrandafstand -%P -%I De zetspiegel kan (tijdelijk) worden aangepast met het -%I commando: -%I -%I \paslayoutaan[hoogte=] -%I -%I Men dient een positieve (+) of negatieve (-) maat op te -%I geven. De zethoogte blijft gelijk, maar de teksthoogte -%I wordt aangepast ten koste van de voethoogte. Eventueel -%I kan 'max' worden opgegeven. -%I -%I Er kan een reeks aanpassingen worden opgegeven: -%I -%I \paslayoutaan[nr,nr,nr,...][hoogte=] -%I -%I Hierbij is staat nr voor het paginanummer, dat wil -%I zeggen: het volgnummer in de tekst. -%I -%I Bij voorlopige versies wordt onderaan de pagina de -%I aanpassing weergegeven. -%P -%I Beeldmerken en achtergronden worden uit oogpunt van -%I verwerkingssnelheid niet vaker berekend dan nodig. Mocht -%I om een of andere reden een beeldmerk of achtergrond niet -%I overeenkomen komen met de wensen, dan kan herberekenen -%I worden geforceerd met: -%I -%I \stellayoutin[reset] -%P -%I Het papierformaat is in te stellen met het commando -%I -%I \stelpapierformaatin[DIN-formaat] -%I -%I Mogelijke DIN-formaten zijn A4 tot en met A9. De -%I afmetingen van een A4 zijn: -%I -%I breedte : 21.0cm = 8.18in = 589pt -%I hoogte : 29.7cm = 11.58in = 834pt -%I -%I Optioneel kan men het printer papierformaat instellen door -%I een tweede argument mee te geven. Standaard wordt -%I uitgegaan van A4. -%I -%I \stelpapierformaatin[A5][A4] -%I -%P Men kan zelf een papierformaat definieren met -%I -%I \definieerpapierformaat [naam] [hoogte=,breedte=] -%I -%I waarbij de offset betrekking heeft op dubbelzijdig zetten. - -\def\dodefinieerpapierformaat[#1][#2]% - {\getparameters - [\??pp#1] % geen \c!schaal, scheelt hash ruimte - [\c!breedte=\@@ppbreedte,\c!hoogte=\@@pphoogte,#2]} - -\def\definieerpapierformaat% - {\dodoubleargument\dodefinieerpapierformaat} - -\definieerpapierformaat[][\c!breedte=210mm,\c!hoogte=297mm] - -\chardef\papermirror =0 -\chardef\printmirror =0 -\chardef\paperrotation =0 -\chardef\paperreverse =0 -\chardef\printrotation =0 -\chardef\printreverse =0 -\chardef\paperlandscape=0 -\chardef\printlandscape=0 - -\def\papierschaal{1} - -\newif\ifnegateprintbox - -\def\dostelpapierrichtingin#1#2#3#4#5% - {\global\chardef#2=0 - \global\chardef#5=0 - \gdef#3{0}% - \gdef#4{0}% - \global\negateprintboxfalse - \processallactionsinset - [#1] - [ \v!liggend=>\global\chardef#2=1, - \v!gespiegeld=>\global\chardef#5=1, - \v!geroteerd=>\gdef#3{90}\gdef#4{270}, - \v!negatief=>\global\negateprintboxtrue, - 90=>\gdef#3{90}\gdef#4{270}, - 180=>\gdef#3{180}\gdef#4{0}, - 270=>\gdef#3{270}\gdef#4{90}]} - -\def\dostelpapierformaatin[#1][#2]% - {\dostelpapierrichtingin{#1}\paperlandscape\paperrotation\paperreverse\papermirror - \dostelpapierrichtingin{#2}\printlandscape\printrotation\printreverse\printmirror - \def\docommando##1% - {\doifsomething{##1}{\doifdefined{\??pp##1\c!breedte} - {\gdef\papierformaat{##1}% - \global\papierbreedte=\getvalue{\??pp##1\c!breedte}% - \global\papierhoogte=\getvalue{\??pp##1\c!hoogte}}}}% - \processcommalist[#1]\docommando - \doifdefinedelse{\??pp#1\c!schaal} - {\edef\papierschaal{\getvalue{\??pp#1\c!schaal}}} - {\edef\papierschaal{1}}% - \def\docommando##1% - {\doifsomething{##1}{\doifdefined{\??pp##1\c!breedte} - {\global\printpapierbreedte=\getvalue{\??pp##1\c!breedte}% - \global\printpapierhoogte=\getvalue{\??pp##1\c!hoogte}}}}% - \processcommalist[#2]\docommando - \ifnum\paperlandscape>0 - \doglobal\swapdimens\papierbreedte\papierhoogte - \fi - \ifnum\printlandscape>0 - \doglobal\swapdimens\printpapierbreedte\printpapierhoogte - \fi - \ifdim\papierhoogte>\printpapierhoogte - \global\printpapierhoogte=\papierhoogte - \fi - \ifdim\papierbreedte>\printpapierbreedte - \global\printpapierbreedte=\papierbreedte - \fi - \calculatehsizes - \calculatevsizes - \global\newlogostrue - \global\newbackgroundtrue - \resetlayout} - -\def\stelpapierformaatin% - {\dodoubleempty\dostelpapierformaatin} - -\def\checkforems[#1]% - {\def\docommando##1% - {\beforesplitstring##1\at em\to\asciia - \doifnot{\asciia}{##1} - {\aftersplitstring\asciia\at=\to\asciia - \doifsomething{\asciia} - {\showmessage{\m!systems}{10}{##1}}}}% - \processcommalist[#1]\docommando} - -\def\resetlayout% - {\global\linkermargebreedte=\@@lylinkermarge - \global\rechtermargebreedte=\@@lyrechtermarge - \global\linkerrandbreedte=\@@lylinkerrand - \global\rechterrandbreedte=\@@lyrechterrand - \global\hoofdhoogte=\@@lyhoofd - \global\voethoogte=\@@lyvoet - \global\onderhoogte=\@@lyonder - \global\bovenhoogte=\@@lyboven - \global\rugwit=\@@lyrugwit - \global\kopwit=\@@lykopwit - \doifelse{\@@lygrid}{\v!ja} - {\gridsnappingtrue} - {\gridsnappingfalse}% - \stelwitruimtein - \stelblankoin - \doifelse{\@@lybreedte}{\v!midden} - {\global\zetbreedte=\papierbreedte - \global\advance\zetbreedte by -2\rugwit} - {\doifelse{\@@lybreedte}{\v!passend} - {\global\zetbreedte=\papierbreedte - \global\advance\zetbreedte by -\rugwit - \scratchdimen=\rugwit - \advance\scratchdimen by -\linkerrandbreedte - \advance\scratchdimen by -\linkerrandafstand - \advance\scratchdimen by -\paginascheiding - \advance\scratchdimen by -\linkermargebreedte - \advance\scratchdimen by -\linkermargeafstand - \ifdim\scratchdimen<\!!zeropoint - \scratchdimen=\!!zeropoint - \fi - \global\advance\zetbreedte by -\rechtermargeafstand - \global\advance\zetbreedte by -\rechtermargebreedte - \global\advance\zetbreedte by -\paginascheiding - \global\advance\zetbreedte by -\rechterrandafstand - \global\advance\zetbreedte by -\rechterrandbreedte - \global\advance\zetbreedte by -\scratchdimen} - {\global\zetbreedte=\@@lybreedte}}% - \doifelse{\@@lyregels}{} - {\doifelse{\@@lyhoogte}{\v!midden} - {\global\zethoogte=\papierhoogte - \global\advance\zethoogte by -2\kopwit} - {\doifelse{\@@lyhoogte}{\v!passend} - {\global\zethoogte=\papierhoogte - \global\advance\zethoogte by -\kopwit - \scratchdimen=\kopwit - \advance\scratchdimen by -\bovenhoogte - \advance\scratchdimen by -\bovenafstand - \ifdim\scratchdimen<\!!zeropoint - \scratchdimen=\!!zeropoint - \fi - \global\advance\zethoogte by -\onderafstand - \global\advance\zethoogte by -\onderhoogte - \global\advance\zethoogte by -\scratchdimen} - {\global\zethoogte=\@@lyhoogte}}} - {\global\zethoogte=\@@lyregels\baselineskip - \global\advance\zethoogte by \hoofdhoogte - \global\advance\zethoogte by \voethoogte}% - \rugoffset=\@@lyrugoffset - \kopoffset=\@@lykopoffset - \calculatehsizes - \calculatevsizes - \global\newlogostrue - \global\newbackgroundtrue} - -\newif\ifdoublesidedprint - -\def\setcenterpagebox#1#2#3#4% - {\let\leftpagebox =#1% - \let\rightpagebox =#2% - \let\toppagebox =#3% - \let\bottompagebox=#4}% - -\def\presetcenterpagebox% in \stellayoutin !!!!!!!!!!!!!!!! - {\setcenterpagebox\relax\hss\relax\vss - \doublesidedprintfalse - \ExpandFirstAfter\processallactionsinset - [\@@lyplaats] - [ \v!midden=>\setcenterpagebox\hss\hss\vss\vss, - \v!links=>\setcenterpagebox\relax\hss\toppagebox\bottompagebox, - \v!rechts=>\setcenterpagebox\hss\relax\toppagebox\bottompagebox, - \v!onder=>\setcenterpagebox\leftpagebox\rightpagebox\vss\relax, - \v!boven=>\setcenterpagebox\leftpagebox\rightpagebox\relax\vss, - \v!dubbelzijdig=>\doublesidedprinttrue, - \v!enkelzijdig=>\doublesidedprintfalse]} - -\def\complexstellayoutin[#1]% - {\ConvertToConstant\doifnot{#1}{\v!reset} - {\getparameters[\??ly][#1]% - \checkforems[#1]}% - \resetlayout - \presetcenterpagebox} - -\def\simplestellayoutin% - {\resetlayout - \presetcenterpagebox} - -\def\stellayoutin% - {\complexorsimpleempty{stellayoutin}} - -\let\@@zahoogte=\!!zeropoint - -\def\dopushpagedimensions% - {\xdef\oldteksthoogte{\the\teksthoogte}% - \xdef\oldvoethoogte{\the\voethoogte}% - \global\let\@@zahoogte=\@@zahoogte} - -\def\dopoppagedimensions% - {\global\teksthoogte=\oldteksthoogte - \global\voethoogte=\oldvoethoogte - \resetlayout - \global\let\pushpagedimensions=\dopushpagedimensions - \global\let\poppagedimensions=\relax} - -\let\poppagedimensions=\relax -\let\pushpagedimensions=\dopushpagedimensions - -% Elke \csname ... \endcsname wordt ook aangemaakt, dus ook -% in een test met \doifdefined. Bij veel bladzijden kan dit -% te veel macro's kosten. Vandaar de set \adaptedpages. Het -% kost tijd, maar scheelt macro's. - -\def\adaptedpages{} - -\def\adaptpagedimensions% - {\rawdoifinsetelse{\realfolio}{\adaptedpages} - {\getvalue{\??za\realfolio}% - \letvalue{\??za\realfolio}=\relax} - {}} - -\def\checkpagedimensions% - {\poppagedimensions - \adaptpagedimensions} - -\def\reportpagedimensions% - {\ifx\poppagedimensions\relax - \else - \spatie\@@zahoogte\spatie- - \fi - \realfolio} - -\def\dodopaslayoutaan[#1]% - {\getparameters[\??za][\c!hoogte=,\c!regels=,#1]% - \pushpagedimensions - \doifelsenothing{\@@zaregels} - {\showmessage{\m!layouts}{1}{\@@zahoogte,\realfolio}} - {\showmessage{\m!layouts}{1}{\@@zaregels\space\v!regels,\realfolio}% - \def\@@zahoogte{\@@zaregels\openlineheight}}% - \doifelse{\@@zahoogte}{\v!max} - {\balancedimensions{\teksthoogte}{\voethoogte}{\voethoogte}} - {\balancedimensions{\teksthoogte}{\voethoogte}{\@@zahoogte}}% - \ifdim\voethoogte<\!!zeropoint - \global\advance\teksthoogte by \voethoogte - \global\voethoogte=\!!zeropoint - \global\xdef\@@zahoogte{\@@lyvoet\spatie(\v!max)}% - \fi - \setvsize - \global\pagegoal=\vsize % nog corrigeren voor insertions ? - \global\newlogostrue - \global\newbackgroundtrue - \global\let\pushpagedimensions=\relax - \global\let\poppagedimensions=\dopoppagedimensions} - -\def\dopaslayoutaan[#1][#2]% - {\doifelsenothing{#2} - {\dodopaslayoutaan[#1]} - {\def\docommando##1% - {\addtocommalist{##1}\adaptedpages - \setgvalue{\??za##1}{\dodopaslayoutaan[#2]}}% - \processcommalist[#1]\docommando - \adaptpagedimensions}} - -\def\paslayoutaan% - {\dodoubleempty\dopaslayoutaan} - -%I n=Margeblokken -%I c=\startmargeblok,\stelmargeblokkenin -%I -%I voorlopig: -%I -%I \stelmargeblokkenin -%I [plaats=,breedte,letter=,uitlijnen=, -%I voor=,na=,links=,rechts=,boven=,onder=,tussen=] -%I -%I plaats = inmarge, links, rechts, midden -%I links, rechts, voor, na = rule -%I boven, onder, tussen = skip -%I status= -%I -%I \startmargeblok -%I \stopmargeblok - -\newif\ifmargeblokken - -\def\dostelmargeblokkenin[#1]% - {\getparameters[\??mb][#1]% - \doifelse{\@@mbstatus}{\v!start}% - {\showmessage{\m!layouts}{4}{}% - \margeblokkentrue - \let\somenextfloat=\dosomenextfloat - \let\startmargeblok=\dostartmargeblok - \let\stopmargeblok=\dostopmargeblok}% - {\showmessage{\m!layouts}{5}{}% - \margeblokkenfalse - \def\somenextfloat[##1]% - {\someelsefloat[##1,\v!hier]}% - \let\startmargeblok=\dontstartmargeblok - \let\stopmargeblok=\dontstopmargeblok}} - -\def\stelmargeblokkenin% - {\dosingleargument\dostelmargeblokkenin} - -\newbox\marginbox - -\def\dosomenextfloat[#1]% - {\global\setbox\marginbox=\vbox - {\hsize\@@mbbreedte - \unvbox\marginbox - \ifvoid\marginbox\else - \@@mbtussen - \fi - \box\floatbox\filbreak}% - \ifdim\ht\marginbox>\teksthoogte - \dosavefloatinfo - \else - \doinsertfloatinfo - \fi} - -\newbox\preparedmarginbox - -\def\reshapemargin% - {\beginofshapebox - \unvbox\preparedmarginbox - \endofshapebox - \reshapebox - {\box\shapebox}% - \setbox\preparedmarginbox=\vbox to \teksthoogte - {\@@mbboven - \flushshapebox - \@@mbonder}} - -\def\plaatsrechtermargeblok% - {\hskip\rechtermargebreedte} - -\def\plaatslinkermargeblok% - {\hskip\linkermargebreedte} - -\def\checkmargeblokken% - {\setbox\preparedmarginbox=\vbox - {\forgetall - \splittopskip\topskip - \ifvoid\marginbox\else - \ifdim\ht\marginbox>\teksthoogte - \vsplit\marginbox to \teksthoogte - \else - \unvbox\marginbox - \fi - \fi}% - \reshapemargin - \setbox\preparedmarginbox=\vbox - {\@@mbvoor\box\preparedmarginbox\@@mbna}% - \def\rightmarginbox% - {\def\plaatsrechtermargeblok% - {\setbox\preparedmarginbox=\hbox to \rechtermargebreedte - {\@@mblinks\box\preparedmarginbox\@@mbrechts}% - \vsmashbox\preparedmarginbox - \box\preparedmarginbox}}% - \def\leftmarginbox% - {\def\plaatslinkermargeblok% - {\setbox\preparedmarginbox=\hbox to \linkermargebreedte - {\@@mbrechts\box\preparedmarginbox\@@mblinks}% - \vsmashbox\preparedmarginbox - \box\preparedmarginbox}}% - \processaction - [\@@mbplaats] - [ \v!inmarge=>\doifbothsidesoverruled - \rightmarginbox - \orsideone - \rightmarginbox - \orsidetwo - \leftmarginbox - \od, - \v!midden=>\doifbothsidesoverruled - \rightmarginbox - \orsideone - \leftmarginbox - \orsidetwo - \rightmarginbox - \od, - \v!links=>\leftmarginbox, - \v!rechts=>\rightmarginbox, - \s!unknown=>\setbox\preparedmarginbox=\hbox{}]} - -\def\dostartmargeblok% % 2 maal \vbox ivm \unvbox elders - {\global\setbox\marginbox=\vtop\bgroup\vbox\bgroup - \hsize\@@mbbreedte - \ifvoid\marginbox\else - \unvbox\marginbox - \@@mbtussen - \fi - \steluitlijnenin[\@@mbuitlijnen]% - \dostartattributes{\??mb}{}% - \begstrut\ignorespaces} - -\def\dostopmargeblok% - {\unskip\endstrut - \dostopattributes - \egroup - \egroup} - -\def\dontstartmargeblok% - {\@@mbvoor - \bgroup - \dostartattributes{\??mb}{}} - -\def\dontstopmargeblok% - {\dostopattributes - \egroup - \@@mbna} - -%I n=Uitstellen -%I c=\startuitstellen -%I -%I Zetcommando's kunnen in een wachtrij worden gezet en na -%I een pagina worden uitgevoerd. Dit gebeurt met het commando: -%I -%I \startuitstellen -%I ... -%I \stopuitstellen -%I -%I Dit kan handig zijn bij bijvoorbeeld grote tussen te voegen -%I figuren, tabellen, formulieren enz. -%I -%I \startuitstellen -%I \plaatsfiguur[pagina][]{...}{...} -%I \stopuitstellen -%I -%I Er kunnen meerdere commando's in de wachtrij worden -%I geplaatst. -%P -%I Het mechanisme werkt nog niet vlekkeloos. Zo wordt -%I nog gerekend met waarden van de vorige pagina. Dit heeft -%I bijvoorbeeld als gevolg dat figuren kunnen worden -%I opgespaard. -%I -%I Het kan gebeuren dat een (te) groot figuur er voor zorgt -%I dat ook andere figuren worden verplaatst. De volgorde -%I blijft immers gehandhaafd. In dat geval kan zo'n groot -%I figuur worden verplaatst naar de eerstvolgende voor de -%I handliggende pagina: -%I -%I \startuitstellen -%I \plaatsfiguur[pagina][]{...}{...} -%I \pagina -%I \stopuitstellen - -\newcounter\nofpostponedblocks - -\def\douitstellen% - {\dorecurse{\nofpostponedblocks} - {\haalbuffer[buf-\recurselevel]}% - \doglobal\newcounter\nofpostponedblocks} - -\setvalue{\e!start\e!uitstellen}% - {\doglobal\increment\nofpostponedblocks - \showmessage{\m!layouts}{3}{\nofpostponedblocks}% - \startbuffer[buf-\nofpostponedblocks] - [\e!start\e!uitstellen][\e!stop\e!uitstellen]} - -%I n=Nummeren -%I c=\stelnummerenin -%I -%I Automatische nummering kan worden ingesteld met het -%I commando: -%I -%I \stelnummerenin[wijze=,blok=,status=] -%I -%I Mogelijke wijzen van nummeren zijn: 'pertekst', -%I 'perhoofdstuk' en 'perparagraaf'. Als status kan worden -%I meegegeven 'start' of 'stop'. Met blok wordt aangegeven -%I of moet worden uitgegaan van het huidige hoofdstuk ('nee') -%I of het blokhoofdstuk ('ja'). - -% Commando's ten behoeve van nummeren: -% -% \definieernummer[naam] -% \stelnummerin[naam][wijze=,blok=,tekst=plaats=,conversie=,start=] -% \setnummer[naam]{waarde} -% \resetnummer[naam] -% \verhoognummer[naam] -% \verlaagnummer[naam] -% \volgendenummer[naam][tag][referentie] -% \nummer[naam] -% \huidigenummer[naam] -% \innummer[naam][referentie] -% \opnummer[naam][referentie] -% \savenumber[naam] -% \restorenumber[naam] - -\newif\ifnummeren - -\def\dostelnummerenin[#1]% globaal - {\getparameters[\??nr][#1]% - \doifelse{\@@nrstatus}{\v!start} - {\global\nummerentrue} - {\global\nummerenfalse}}% - -\def\stelnummerenin% - {\dosingleargument\dostelnummerenin} - -\def\dostelnummerin[#1][#2]% - {\getparameters[\s!number#1][#2]} - -\def\stelnummerin% - {\dodoubleargument\dostelnummerin} - -\def\dodefinieernummer[#1][#2]% ook overal class als localframed - {\makecounter{\s!number#1}% - \getparameters - [\s!number#1] - [\s!check=, - \c!wijze=\@@nrwijze, - \c!wijze\c!lokaal=\getvalue{\s!number#1\c!wijze}, - \c!sectienummer=\v!ja, - \c!tekst=, - \c!plaats=, % was: \c!zetwijze - \c!conversie=\v!cijfers, - \c!start=0, - #2]% - \setcounter{\s!number#1}{\getvalue{\s!number#1\c!start}}} - -\def\definieernummer% - {\dodoubleempty\dodefinieernummer} - -\def\setnummer[#1]#2% - {\setcounter{\s!number#1}{#2}} - -\def\resetnummer[#1]% - {\setcounter{\s!number#1}{0\getvalue{\s!number#1\c!start}}} - -\def\dodoreset#1% - {\getvalue{\s!reset#1}}% - -\def\doreset[#1]% - {\processcommalist[#1]\dodoreset} - -\def\reset% - {\dosingleargument\doreset} - -\def\verhoognummer[#1]% - {\checknummer{#1}% - \ifnummeren - \else - \resetcounter{\s!number#1}% - \fi - \pluscounter{\s!number#1}} - -\def\savenumber[#1]% - {\savecounter{\s!number#1}} - -\def\restorenumber[#1]% - {\restorecounter{\s!number#1}} - -% nieuw, maar kan dit (i.v.m. (sub)page?) - -\def\verhoognummer[#1]% - {\checknummer{#1}% - \ifnummeren - \pluscounter{\s!number#1}% - \else - \setcounter{\s!number#1}{0\getvalue{\s!number#1\c!start}}% - \fi} - -\def\verlaagnummer[#1]% - {\minuscounter{\s!number#1}} - -\def\dodochecknummer#1#2#3% - {\bgroup - \doifinstringelse{.0}{.#2} % waarom \instring en \@koscheider - {\doifnot{#3}{\v!per} - {\debuggerinfo{\m!systems}{number #1 #3 becomes \getvalue{\s!number#1\c!wijze}}% - \setevalue{\s!number#1\c!wijze}% geen \xdef, gaat mis met \subpage - {#3}% - \dochecknummer{#1}}} % tricky and ugly - {\doifnotvalue{\s!number#1\s!check}{#2} - {\setcounter{\s!number#1}{0\getvalue{\s!number#1\c!start}}% - \setxvalue{\s!number#1\c!wijze\c!lokaal}% - {\getvalue{\s!number#1\c!wijze}}% - \setxvalue{\s!number#1\s!check}% - {#2}}}% - \egroup} - -\def\dochecknummer#1% - {\edef\currentsection{\getvalue{\??by\getvalue{\s!number#1\c!wijze}}}% - \doifsomething{\currentsection} - {\dodochecknummer - {#1} - {\getvalue{\currentsection\c!nummer}} - {\v!per\previoussection{\currentsection}}}} - -\def\checknummer#1% - {\bgroup - \ifnum\blocklevel>0 - \doifelsevalue{\s!number#1\c!blokwijze}{\v!nee} - {\dochecknummer{#1}} - {\setblockcounters % dit kan sneller omdat de waarden - \dochecknummer{#1}}% % en het type bekend zijn - \else - \dochecknummer{#1}% - \fi - \egroup} - -\def\domaakvoorafgaandenummer[#1]% - {\gdef\voorafgaandenummer{}% - \ifsectienummer - \doifvalue{\??sb\@@sectieblok\c!nummer}{\v!ja} % toegevoegd - {\doifvalue{\s!number#1\c!sectienummer}{\v!ja} - {\edef\currentsection% - {\getvalue{\??by\getvalue{\s!number#1\c!wijze\c!lokaal}}}% - \doifnot{\currentsection}{\zerosection} - {\doifnot{\@@sectionvalue{\currentsection}}{0} - {\xdef\voorafgaandenummer% - {\getvalue{\currentsection\c!nummer}.}}}}}% - \fi} - -\def\maakvoorafgaandenummer[#1]% - {\bgroup - \ifnum\blocklevel>0 - \doifelsevalue{\s!number#1\c!blokwijze}{\v!nee} - {\domaakvoorafgaandenummer[#1]}% - {\setblockcounters % dit kan sneller omdat de waarden - \domaakvoorafgaandenummer[#1]}% % en het type bekend zijn - \else - \domaakvoorafgaandenummer[#1]% - \fi - \egroup} - -\def\nummer[#1]% - {\convertnumber - {\getvalue{\s!number#1\c!conversie}} - {\countervalue{\s!number#1}}} - -\def\ruwenummer[#1]% - {\countervalue{\s!number#1}} - -\def\maakhetnummer[#1]% - {\maakvoorafgaandenummer[#1]% - \global\edef\hetnummer% - {\voorafgaandenummer\nummer[#1]}}% - -\def\lossenummer[#1]% - {\maakhetnummer[#1]% - \hetnummer} - -\def\huidigenummer[#1]% - {%\getvalue{\getvalue{\s!number#1\c!zetwijze}}% - \getvalue{\getvalue{\s!number#1\c!plaats}}% - {\dotextprefix{\getvalue{\s!number#1\c!tekst}}\lossenummer[#1]}} - -\def\volgendenummer[#1][#2][#3]% - {\verhoognummer[#1]% - \huidigenummer[#1]% - \rawreference{#2}{#3}{\hetnummer}} - -\def\innummer[#1][#2]% - {\c!in \in{\getvalue{\s!number#1\c!tekst}}[#2]}% - -\def\opnummer[#1][#2]% - {\c!op \op{\getvalue{\s!number#1\c!tekst}}[#2]}% - -% \gotonextsubpage : voor de pagebody -% \subpaginanummer : alleen in de voet/kopregels -% \aantalsubpaginas : alleen in de voet/kopregels - -% \firstsubpage : eerste \realpageno, voor interne doeleinden -% \prevsubpage : vorige \realpageno, voor interne doeleinden -% \nextsubpage : volgende \realpageno, voor interne doeleinden -% \lastsubpage : laatste \realpageno, voor interne doeleinden -% \nofsubpages : laatste subpage (in berekeningen) -% \subpageno : huidige subpage (in berekeningen) - -\newif\ifsubpaging -\newif\ifshowingsubpage - -\definieernummer - [\s!subpage] - -\stelnummerin - [\s!subpage] - [\c!wijze=\@@snwijze] - -\def\resetsubpaginanummer% - {\resetnummer[\s!subpage]% - \global\subpageno=\ruwenummer[\s!subpage]} - -\def\dostelsubpaginanummerin[#1]% - {\doifelse{#1}{\v!reset} - {\resetnummer[\s!subpage]} - {\getparameters[\??sn][#1]% - \processaction - [\@@snstatus] - [ \v!stop=>\ifsubpaging - \else - \subpagingfalse - \fi - \showingsubpagefalse, - \v!start=>\subpagingtrue - \showingsubpagetrue, - \v!geen=>\subpagingtrue - \showingsubpagefalse]}} - -\def\aantalsubpaginas% - {\ifshowingsubpage - \nofsubpages - \else - 0% - \fi} - -\def\subpaginanummer% - {\ifshowingsubpage - \the\subpageno - \else - 0% - \fi} - -\def\stelsubpaginanummerin% - {\dosingleargument\dostelsubpaginanummerin} - -\def\newnofsubpages {0} -\def\nofsubpages {0} -\def\firstsubpage {1} -\def\prevsubpage {1} -\def\nextsubpage {1} -\def\lastsubpage {1} - -\def\nextpage {1} -\def\prevpage {1} - -\definetwopasslist{\s!subpage} - -\def\savenofsubpages% - {\ifsubpaging - \showmessage{\m!layouts}{6}{\newnofsubpages,\the\subpageno}% - \immediatewriteutilitycommand% - {\twopassentry% - {\s!subpage}% - {\newnofsubpages}% - {\the\subpageno}}% - \fi} - -\def\setsubpagenumbers% - {\iftwopassdatafound - \bgroup - \xdef\nofsubpages{\twopassdata}% - \xdef\firstsubpage{\realfolio}% - \advance\realpageno by \nofsubpages - \advance\realpageno by -1 - \xdef\lastsubpage{\realfolio}% - \egroup - \else - \xdef\nofsubpages{0}% - \fi} - -\def\gotonextsubpage% - {\global\let\checksubpages=\relax - \ifsubpaging - \edef\oldsubpage{\the\subpageno}% - \verhoognummer[\s!subpage]% - \global\subpageno=\ruwenummer[\s!subpage]\relax - \ifnum\subpageno=1 - \gettwopassdata{\s!subpage}% - \setsubpagenumbers - \ifnum\oldsubpage>0 - \showmessage{\m!layouts}{6}{\newnofsubpages,\oldsubpage}% - \edef\next% - {\writeutilitycommand% - {\twopassentry% - {\s!subpage}% - {\newnofsubpages}% - {\oldsubpage}}}% - \next - \fi - \doglobal\increment\newnofsubpages\relax - \fi - \setglobalsystemreference\rt!page{\v!eerste\v!sub\v!pagina}\firstsubpage - \setglobalsystemreference\rt!page{\v!laatste\v!sub\v!pagina}\lastsubpage - \bgroup - \ifnum\realpageno=\firstsubpage\relax - \global\let\prevsubpage=\firstsubpage - \else - \xdef\prevsubpage{\realfolio}% - \doglobal\decrement\prevsubpage - \fi - \setglobalsystemreference\rt!page{\v!vorige\v!sub\v!pagina}\prevsubpage - \ifnum\realpageno=\lastsubpage\relax - \global\let\nextsubpage=\lastsubpage - \else - \xdef\nextsubpage{\realfolio}% - \doglobal\increment\nextsubpage - \fi - \setglobalsystemreference\rt!page{\v!volgende\v!sub\v!pagina}\nextsubpage - \egroup - \fi} - -\def\checksubpages% - {\getfromtwopassdata{\s!subpage}{1}% - \setsubpagenumbers - \global\let\checksubpages=\relax} - -% Omdat \gotonextrealpage gebruik maakt van de hulpfile, -% moet het initialiseren van \realpageno plaatsvinden in -% een later stadium, namelijk zodra referenties worden -% gebruikt (anders gaat het mis op nog niet gedefinieerde -% lijstcommando's e.d.). De eerst aanroep vindt dan ook -% plaats vlak nadat de hulpfile voor de eerste maal is -% ingelezen. - -\countdef\realpageno = 0 \realpageno = 1 -\countdef\userpageno = 1 \userpageno = 1 -\countdef\subpageno = 2 \subpageno = 0 % !! -\countdef\arrangeno = 3 \arrangeno = 0 % !! - -% we don't want conflicts when \pageno is used by other -% packages, like CWEB, so we redefine \pageno - -\newcount\pageno \pageno = 1 - -\def\setuserpageno#1% - {\global\userpageno=#1\relax - \global\pageno=\userpageno} - -\def\realfolio {\the\realpageno} -\def\folio {\the\userpageno} -\def\firstpage {1} -\def\lastpage {1} -\def\currentpage {\the\realpageno} - -\def\gotonextrealpage% - {\global\advance\realpageno by 1 - \ifnum\realpageno>\lastpage - \xdef\lastpage{\realfolio}% - \fi - \setglobalsystemreference\rt!page{\v!eerste\v!pagina}\firstpage - \setglobalsystemreference\rt!page{\v!laatste\v!pagina}\lastpage - \bgroup - \ifnum\realpageno>1 - \advance\realpageno by -1 - \xdef\prevpage{\realfolio}% -\setglobalsystemreference\rt!page{\v!achteruit}\prevpage - \else - \global\let\prevpage=\firstpage -\setglobalsystemreference\rt!page{\v!achteruit}\lastpage - \fi - \setglobalsystemreference\rt!page{\v!vorige\v!pagina}\realfolio - \egroup - \bgroup - \ifnum\realpageno<\lastpage\relax - \advance\realpageno by 1 - \xdef\nextpage{\realfolio}% - \setglobalsystemreference\rt!page{\v!pagina}\realfolio -\setglobalsystemreference\rt!page{\v!vooruit}\realfolio - \else - \global\let\nextpage=\lastpage - \setglobalsystemreference\rt!page{\v!pagina}\firstpage -\setglobalsystemreference\rt!page{\v!vooruit}\firstpage - \fi - \setglobalsystemreference\rt!page{\v!volgende\v!pagina}\realfolio - \egroup} - -\def\checkrealpage% - {\global\realpageno=0 - \gotonextrealpage - \global\let\checkrealpage=\relax} - -\def\realnumberofpages#1% meteen laden, voor andere files (met refs) - {\gdef\lastpage{#1}% - \global\let\realnumberofpages=\gobbleoneargument} - -\def\savenofpages% - {\advance\realpageno by -1 - \immediatewriteutilitycommand{\realnumberofpages{\realfolio}}}% - -\def\totaalaantalpaginas% - {\lastpage} - -\def\myshipout#1% - {\voorpagina - \dontshowcomposition - \dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}% - \ifarrangingpages - \actualarrange - {\thisisrealpage{\realfolio}#1}% - \else - \actualshipout - {\thisisrealpage{\realfolio}#1}% - \fi - \gotonextrealpage - \napagina} - -\newbox\postponedcontent - -\def\flushatshipout% - {\dowithnextbox - {\global\setbox\postponedcontent=\hbox - {\box\postponedcontent\box\nextbox}% - \global\ht\postponedcontent=\!!zeropoint - \global\dp\postponedcontent=\!!zeropoint - \global\wd\postponedcontent=\!!zeropoint}% - \hbox} - -\def\actualshipout#1% - {\shipout\vbox - {\forgetall - \offinterlineskip - \mindermeldingen - \vskip-1in - \hskip-1in - \hbox - {\setbox0=\hbox{#1}% just in case there are objects there - \setbox\scratchbox=\hbox{\the\everyshipout}% - \smashbox\scratchbox - \box\scratchbox - \box\postponedcontent % evt ver naar links ! - \box0}}} - -\def\actualarrange#1% - {\setbox0=\hbox{\thisisrealpage{\realfolio}#1}% - \pusharrangedpage0 - \deadcycles=0} - -\def\goleftonpage% - {\hskip-\linkermargeafstand - \hskip-\linkermargebreedte - \hskip-\paginascheiding - \hskip-\linkerrandafstand - \hskip-\linkerrandbreedte} - -\def\doswapmargins% - {\let\doswapmargins=\relax % to prevent local swapping - \swapmacros\@@lylinkermargeafstand\@@lyrechtermargeafstand - \swapmacros\@@lylinkerrandafstand\@@lyrechterrandafstand - \swapdimens\linkermargebreedte\rechtermargebreedte - \swapdimens\linkerrandbreedte\rechterrandbreedte} - -\def\doifmarginswapelse#1#2% - {\doifbothsides#1\orsideone#1\orsidetwo#2\od} - -\def\swapmargins% - {\doifmarginswapelse{}{\doswapmargins}} - -% Output routines -% -% \dopagecontents#1#2 : tekst, floats en footnotes -% \dopagebody#1#2 : hoofd, \pagecontents, voet -% \dooutput : outputroutine -% -% \ifinpagebody - -\def\doejectpage#1% - {\bgroup % de \ifdim is nodig omdat - \par % anders een eventuele - \ifdim\pagetotal>\pagegoal\else % laatste regel boven de - %\normalvfill % baseline te staan terwijl - \normalvfil % baseline te staan terwijl - \fi % de vorige bladzijden op - #1% % de baseline staan - \egroup} - -% ^^ NOG NETTER MAKEN, TEGELIJK MET MULTI COLUMNS EN ACHTERGRONDEN! - -\def\ejectpage% - {\doejectpage\eject} - -\def\superejectpage% - {\doejectpage\supereject} - -\def\ejectinsert% - {\flushfootnotes - \bgroup - \noftopfloats=\!!thousand - \doflushfloats - \egroup} - -% De volgende macro's worden gedefinieerd in de module -% colo-ini. Om resetten bij twee maal laden te voorkomen -% checken we wel even. Anders krijgen we een mark-build-up. - -\newif\ifinpagebody - -\doifundefined{pushcolor} {\def\pushcolor{}} -\doifundefined{popcolor} {\def\popcolor{}} -\doifundefined{startcolorpage} {\def\startcolorpage{}} -\doifundefined{stopcolorpage} {\def\stopcolorpage{}} - -% bewaren tvb documentatie -% -% \hbox to \hsize -% {\en -% \switchnaarkorps[5pt]% -% \emergencystretch2em -% \dimen0=\baselineskip -% \baselineskip=\dimen0 plus 1pt -% \hsize=.2\hsize -% \vsize=2\hsize -% \ruledvbox to \vsize{\input tufte \par}\hss -% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth}\hss -% \ruledvbox to \vsize{\input tufte \par\kern0pt}\hss -% \ruledvbox to \vsize{\input tufte \par\vfill}\hss -% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth\vfill}} -% -% \hbox to \hsize -% {\en -% \switchnaarkorps[5pt]% -% \emergencystretch2em -% \dimen0=\baselineskip -% \baselineskip=\dimen0 plus 1pt -% \hsize=.18\hsize -% \vsize=2.5\hsize -% \setbox0=\vbox{\input tufte\relax}% -% \ruledvbox to \vsize{\unvcopy0}\hss -% \ruledvbox to \vsize{\unvcopy0\kern-\dp0}\hss -% \ruledvbox to \vsize{\unvcopy0\kern0pt}\hss -% \ruledvbox to \vsize{\unvcopy0\vfill}\hss -% \ruledvbox to \vsize{\unvcopy0\kern-\dp0\vfill}} - -% \def\dopagecontents#1#2% -% {\dotopinsertions -% \bgroup -% \forgetall -% \boxmaxdepth=\maxdepth -% \dimen0=\dp#2% -% \bgroup -% #1#2\relax -% \pushcolor -% \dobotinsertions -% \egroup -% \ifr@ggedbottom -% \kern-\dimen0 -% \vfil -% \fi -% \ifb@selinebottom -% \kern-\dimen0 -% \kern\maxdepth -% \fi -% \egroup -% \placefootnotes} - -\def\dopagecontents#1#2% \box<n> \unvbox<n> - {\bgroup - \forgetall - \boxmaxdepth=\maxdepth - \setbox0=\vbox to \teksthoogte - {\edef\currentpagedepth{\the\dp#2}% still to be derived from #1 - \dotopinsertions - #1#2\relax - \pushcolor - \ifgridsnapping - \vskip-\currentpagedepth - \vskip\openstrutdepth % \dp\strutbox - \prevdepth\openstrutdepth % \dp\strutbox - \dobotinsertions - \vfil - \else\ifr@ggedbottom - \vskip-\currentpagedepth - \vskip\openstrutdepth % \dp\strutbox - \prevdepth\openstrutdepth % \dp\strutbox - \dobotinsertions - \vfil - \else\ifb@selinebottom - \kern-\currentpagedepth - \kern\maxdepth - \dobotinsertions - \fi\fi\fi - \ifdim\ht\footins>\!!zeropoint % beter dan \ifvoid\footins\else - \kern\skip\footins - \kern\ht\footins - \fi}% - \ifgridsnapping - \getnoflines\teksthoogte - \advance\noflines by -1 - \scratchdimen=\noflines\lineheight - \advance\scratchdimen by \topskip - \else - \scratchdimen=\ht0 - \fi - \setbox2=\hbox - {\ifvoid\savedfootins \else - \setbox\footins=\box\savedfootins - \fi - \lower\scratchdimen\vbox{\placefootnotes}}% - \smashbox2 - \ht0=\!!zeropoint - \vbox to \teksthoogte - {\box0\box2}% - \egroup} - -\def\dodummypageskip#1% - {\getvalue{\s!dummy\c!commando#1}} - -\setvalue{\s!dummy\c!commando\v!links}% - {\hskip\linkerrandbreedte} - -\setvalue{\s!dummy\c!commando\v!rechts}% - {\hskip\rechterrandbreedte} - -\setvalue{\s!dummy\c!commando\v!boven}% - {} % \vbox to \bovenhoogte{\vss}} - -\setvalue{\s!dummy\c!commando\v!onder}% - {} % \vbox to \onderhoogte{\vss}} - -\def\plaatslinkerrandblok {\dodummypageskip\v!links} -\def\plaatsrechterrandblok {\dodummypageskip\v!rechts} - -\newtoks\afterpage \newtoks\aftereverypage -\newtoks\beforepage \newtoks\beforeeverypage - -\newif\ifshowgrid - -\def\toongrid% - {\tracegridsnappingtrue - \showgridtrue} - -\def\doplaatstekstblok#1#2% - {\bgroup - \setbox0=\hbox to \zetbreedte - {\vbox to \teksthoogte - {\offinterlineskip - \boxmaxdepth\maxdepth - \dopagecontents#1#2}}% - \ht0=\teksthoogte - \wd0=\zetbreedte - \ifshowgrid - \setgridbox2\zetbreedte\teksthoogte - \hbox{\color[red]{\box2}\hskip-\zetbreedte\box0}% - \else - \box0 - \fi - \egroup} - -\def\getmainbox#1#2% - {\setbox0=\vbox - {\offinterlineskip % na \paginaletter ! - \calculatereducedvsizes - \calculatehsizes - \swapmargins - \vskip\hoofdhoogte - \vskip\hoofdafstand - \hbox - {\bgroup - \swapmargins - \goleftonpage - \plaatslinkerrandblok - \hskip\linkerrandafstand - \showpageseparation - \plaatslinkermargeblok - \hskip\linkermargeafstand - \egroup - \doplaatstekstblok#1#2% - \bgroup - \hskip\rechtermargeafstand - \plaatstestinfo - \plaatsrechtermargeblok - \showpageseparation - \hskip\rechterrandafstand - \plaatsrechterrandblok - \egroup}% - \vfill} - \smashbox0 - \box0} - -%\def\setpagedisplacement% -% {\global\voffset=\kopoffset -% \global\hoffset=\rugoffset -% \global\advance\voffset by -1in -% \global\advance\hoffset by -1in} - -\def\centerpagebox#1% - {\printpapierbreedte=\papierschaal\printpapierbreedte - \printpapierhoogte =\papierschaal\printpapierhoogte - \setbox#1=\vbox to \printpapierhoogte - {\toppagebox - \hbox to \printpapierbreedte - {\ifdoublesidedprint - \doifbothsides - \leftpagebox\box#1\rightpagebox - \orsideone - \leftpagebox\box#1\rightpagebox - \orsidetwo - \rightpagebox\box#1\leftpagebox - \od - \else - \leftpagebox\box#1\rightpagebox - \fi} - \bottompagebox}} - -\def\offsetprintbox#1% - {\dimen0=\wd#1\dimen2=\ht#1\dimen4=\dp#1% - \setbox#1=\vbox - {\forgetall - \offinterlineskip - \vskip\kopoffset - \doifbothsides - \hskip\rugoffset - \orsideone - \hskip\rugoffset - \orsidetwo - \hskip-\rugoffset - \od - \box#1}% - \wd#1=\dimen0\ht#1=\dimen2\dp#1=\dimen4} - -\def\replicatebox#1#2#3% - {\setbox#1=\vbox - {\forgetall - \offinterlineskip - \dorecurse{#3}{\hbox{\dorecurse{#2}{\copy#1}}}}} - -\def\replicatepagebox#1% - {\ifnum\@@lynx>0 \ifnum\@@lyny>0 - \replicatebox{#1}{\@@lynx}{\@@lyny}% - \fi\fi} - -\def\rotatepagebodybox#1#2#3% - {\ifnum#2#3>0 - \setbox#1=\vbox - {\edef\somerotation% - {\ifdubbelzijdig\ifodd\realpageno#2\else#3\fi\else#2\fi}% - \dorotatebox\somerotation\hbox{\box#1}}% - \fi} - -\def\rotatepaperbox#1% - {\rotatepagebodybox{#1}\paperrotation\paperreverse} - -\def\rotateprintbox#1% - {\rotatepagebodybox{#1}\printrotation\printreverse} - -\def\mirrorpagebodybox#1#2% - {\ifcase#2\or - \setbox#1=\vbox - {\domirrorbox\vbox{\box#1}}% - \fi} - -\def\mirrorpaperbox#1% - {\mirrorpagebodybox{#1}\papermirror} - -\def\mirrorprintbox#1% - {\mirrorpagebodybox{#1}\printmirror} - -\def\scalepagebox#1% - {\ifdim\@@lyschaal pt=1pt \else - \setbox#1=\vbox - {\schaal[\c!sx=\@@lyschaal,\c!sy=\@@lyschaal]{\box#1}}% - \papierbreedte=\@@lyschaal\papierbreedte - \papierhoogte =\@@lyschaal\papierhoogte - \fi} - -\def\negateprintbox#1% - {\ifnegateprintbox - \negatecolorbox{#1}% - \fi} - -\def\buildpagebox#1% - {\setbox#1=\vbox to \papierhoogte - {\hsize\papierbreedte - \vskip\kopwit - \doifbothsides - \hskip\rugwit - \orsideone - \hskip\rugwit - \orsidetwo - \hskip\papierbreedte - \hskip-\rugwit - \hskip-\zetbreedte - \od - \box#1}% - \dp#1=\!!zeropoint} - -\def\pagecutmarksymbol% - {\the\realpageno}% - -\def\addpagecutmarks#1% - {\doif{\@@lymarkering}{\v!aan} - {\let\cutmarksymbol=\pagecutmarksymbol - \makecutbox{#1}}} - -\def\addpagecolormarks#1% - {\doif{\@@lymarkering}{\v!kleur} - {\let\cutmarksymbol=\pagecutmarksymbol - \makecutbox{#1}% - \ifnum\horizontalcutmarks>1 \chardef\colormarkoffset=4 \fi - \ifnum\verticalcutmarks >1 \chardef\colormarkoffset=4 \fi - \colormarkbox{#1}}} - -\newif\ifpagebodyornaments \pagebodyornamentstrue -\newif\ifarrangingpages \arrangingpagesfalse - -\let\poparrangedpages=\relax -\let\pusharrangedpage=\relax - -\def\reportarrangedpage#1% - {\showmessage - {\m!systems}{23} - {\the\realpageno.\the\pageno\ifnum\subpageno>0 .\the\subpageno\fi,#1}} - -\def\buildpagebody#1#2% - {\vbox - {\forgetall % igv problemen, check: \boxmaxdepth\maxdimen - \mindermeldingen - \setbox0=\vbox - {\doconvertfont{\@@lyletter}{}% - \offinterlineskip - \ifpagebodyornaments - \getbackgroundbox - \getlogobox - \gettextboxes - \fi - \getmainbox#1#2}% - \buildpagebox0 - \ifpagebodyornaments - \addpagebackground0 - \fi - \ifarrangingpages \else - \addpagecutmarks0 - \replicatepagebox0 - \scalepagebox0 - \mirrorpaperbox0 - \rotatepaperbox0 - \addpagecolormarks0 - \centerpagebox0 - \mirrorprintbox0 - \rotateprintbox0 - \offsetprintbox0 - \negateprintbox0 - \fi - \box0}} - -\def\finishpagebox#1% - {\ifarrangingpages - \addpagecutmarks#1% - \addpagecolormarks#1% - \centerpagebox#1% - \mirrorprintbox#1% - \rotateprintbox#1% - \offsetprintbox#1% - \negateprintbox#1% - \fi} - -% TBV testdoeleinden: - -\def\dotoonprint[#1][#2][#3]% - {\omlijnd - [\c!offset=\v!overlay, - \c!strut=\v!nee] - {\forgetall - \mindermeldingen - \globaldefs=-1 - \dimen0=\pagegoal - \definieerpapierformaat[X][\c!breedte=4em, \c!hoogte=6em]% - \definieerpapierformaat[Y][\c!breedte=12em,\c!hoogte=14em]% - \stelpapierformaatin[#1,X][#2,Y]% - \stellayoutin[#3]% - \setbox0=\vbox - {\omlijnd - [\c!offset=\v!overlay,\c!strut=\v!nee, - \c!breedte=\papierbreedte,\c!hoogte=\papierhoogte] - {\ss ABC\par DEF}}% - \dubbelzijdigfalse - \def\cutmarklength{.5em}% - \addpagecutmarks0% - \replicatepagebox0% - \scalepagebox0% - \mirrorpaperbox0% - \rotatepaperbox0% - \centerpagebox0% - \mirrorprintbox0% - \rotateprintbox0% - \offsetprintbox0% - \pagegoal=\dimen0 - \box0}} - -\def\toonprint% - {\dotripleempty\dotoonprint} - -% \switchnaarkorps[8pt] -% -% \startcombinatie[4*4] -% {\toonprint} {\strut} -% {\toonprint[][][plaats=midden]} {\type{plaats=midden}} -% {\toonprint[][][plaats=midden,markering=aan]} {\type{markering=aan}\break -% \type{plaats=midden}} -% {\toonprint[][][plaats=midden,markering=aan,nx=2]} {\type{markering=aan}\break -% \type{plaats=midden}\break -% \type{nx=2}} -% {\toonprint[][][plaats=links]} {\type{plaats=links}} -% {\toonprint[][][plaats=rechts]} {\type{plaats=rechts}} -% {\toonprint[][][plaats={links,onder}]} {\type{plaats={links,onder}}} -% {\toonprint[][][plaats={rechts,onder}]} {\type{plaats={rechts,onder}}} -% {\toonprint[][][nx=2,ny=1]} {\type{nx=2,ny=1}} -% {\toonprint[][][nx=1,ny=2]} {\type{nx=1,ny=2}} -% {\toonprint[][][nx=2,ny=2]} {\type{nx=2,ny=2}} -% {\toonprint[][][nx=2,ny=2,plaats=midden]} {\type{nx=2,ny=2}\break -% \type{plaats=midden}} -% {\toonprint[][][rugoffset=3pt]} {\type{rugoffset=.5cm}} -% {\toonprint[][][kopoffset=3pt]} {\type{kopoffset=.5cm}} -% {\toonprint[][][schaal=1.5]} {\type{schaal=1.5}} -% {\toonprint[][][schaal=0.8]} {\type{schaal=0.8}} -% \stopcombinatie -% -% \startcombinatie[3*4] -% {\toonprint[liggend][][plaats=midden]} {\type{liggend}} -% {\toonprint[][liggend][plaats=midden]} {\strut\break\type{liggend}} -% {\toonprint[liggend][liggend][plaats=midden]} {\type{liggend}\break\type{liggend}} -% {\toonprint[90][][plaats=midden]} {\type{90}} -% {\toonprint[][90][plaats=midden]} {\strut\break\type{90}} -% {\toonprint[90][90][plaats=midden]} {\type{90}\break\type{90}} -% {\toonprint[180][][plaats=midden]} {\type{180}} -% {\toonprint[][180][plaats=midden]} {\strut\break\type{180}} -% {\toonprint[180][180][plaats=midden]} {\type{180}\break\type{180}} -% {\toonprint[gespiegeld][][plaats=midden]} {\type{gespiegeld}} -% {\toonprint[][gespiegeld][plaats=midden]} {\strut\break\type{gespiegeld}} -% {\toonprint[gespiegeld][gespiegeld][plaats=midden]} {\type{gespiegeld}\break\type{gespiegeld}} -% \stopcombinatie - -\chardef\normalpagebox=255 - -\def\dopagebody#1#2% - {\getallmarks - \restoreglobalbodyfont - \startcolorpage - \gotonextsubpage - \dontshowboxes - \naastpagina - \checkreferences - \checkmargeblokken - \dotoks\beforeeverypage - \flushtoks\beforepage - \inpagebodytrue - \buildpagebody#1#2% - \flushtoks\afterpage - \dotoks\aftereverypage - \resetpagina - \updatelistreferences - \resetlayoutregels % mischien in shipout - \stopcolorpage} - -\def\beforefinaloutput% - {} - -\def\afterfinaloutput% - {\forgetall - \vskip\!!zeropoint\relax - \ifvoid\normalpagebox - \else - \unvbox\normalpagebox - \penalty\outputpenalty - \fi - \ifnum\outputpenalty>-\@MM\relax - \else - \dosupereject - \fi - \inpagebodytrue % needed for enabling \blanko ! - \dosetbothinserts - \setvsize} % this is needed for interacting components, like floats and multicolumns - -\def\setpagecounters% - {\setuserpageno{\ruwenummer[\s!page]}% - \doifelse{\@@snstatus}{\v!stop} - {\global\subpageno=0} - {\global\subpageno=\ruwenummer[\s!subpage]}} - -\def\dofinaloutput#1#2% - {\beforefinaloutput - \myshipout{\hbox{\dopagebody#1#2\setpagecounters}}% - \afterfinaloutput - \popcolor} % ... and here ... - -\def\donofinaloutput#1#2% - {\beforefinaloutput - \setpagecounters - \message{[-\the\realpageno]}% - \setbox0=\hbox - {\the\everyshipout - \dopagebody#1#2}% - \deadcycles=0 - \gotonextrealpage - \afterfinaloutput - \popcolor} % ... and here - -\let\checkpageversion=\relax - -\def\finaloutput#1#2% - {\checkpageversion - \ifverwerken - \ifgeselecteerd - \dofinaloutput#1#2% - \else - \donofinaloutput#1#2% - \fi - \else - \ifgeselecteerd - \donofinaloutput#1#2% - \else - \dofinaloutput#1#2% - \fi - \fi - \resetselectiepagina - \verhoogpaginanummer - \checkpagedimensions - \ifnum\outputpenalty>-\@MM\relax - \else - \dosupereject - \fi - \douitstellen} - -\def\dooutput% - {\finaloutput\unvbox\normalpagebox} - -\output={\dooutput} - -%I n=Beeldmerken -%I c=\definieerbeeldmerk,\plaatsbeeldmerken -%I -%I In het hoofd of in de voet kan een logo worden gezet met -%I het commando: -%I -%I \plaatsbeeldmerken[naam] -%I -%I Plaatsen kan dan ook pas nadat een beeldmerk is gedefinieerd: -%I -%I \definieerbeeldmerk[naam][lokatie][plaats][commando=,status=] -%I -%I waarbij status 'start' of 'stop' kan zijn. In geval van -%I 'start' wordt op elke bladzijde het logo geplaatst. -%I -%I Mogelijke lokaties zijn 'boven', 'hoofd', 'voet' en 'onder' en -%I als plaats kan worden opgegeven 'linkerrand', 'linkermarge', -%I 'links', 'midden', 'rechts', 'rechtermarge' en 'rechterrand'. -%I -%I Logo's worden boven, onder of in de hoofd- of voetregel gezet, -%I zo hoog of laag mogelijk. Verdere positionering zal dus in -%I het commando moeten plaatsvinden! - -\newbox\leftlogos -\newbox\rightlogos - -\newif\ifnewlogos - -% \logostatus -% -% 0 = niet plaatsen > 0 -% 1 = direkt plaatsen > 1 -% 2 = berekenen en plaatsen > 1 -% 3 = een pagina berekenen en plaatsen > 2 - -\def\logostatus{0} - -\def\gedefinieerdebeeldmerken{} -\def\teplaatsenbeeldmerken{} - -\def\dodefinieerbeeldmerk[#1][#2][#3][#4]% - {\addtocommalist{#1}\gedefinieerdebeeldmerken - \setvalue{\??lo#2#3}{#1}% - \getparameters[\??lo#2#3][#4]% - \gdef\logostatus{2}} - -\def\definieerbeeldmerk% - {\doquadrupleargument\dodefinieerbeeldmerk} - -\def\complexplaatsbeeldmerken[#1]% - {\xdef\teplaatsenbeeldmerken{#1}% - \gdef\logostatus{3}} - -\def\simpleplaatsbeeldmerken% - {\global\let\teplaatsenbeeldmerken=\gedefinieerdebeeldmerken - \gdef\logostatus{3}} - -\definecomplexorsimple\plaatsbeeldmerken - -\def\doplaatsbeeldmerken#1#2% - {\bgroup - \setbox0=\vbox - {\hbox - {\ifnum\logostatus=3 - \def\docommando##1% - {\ExpandBothAfter\doifinset{\getvalue{\??lo#1##1}}{\teplaatsenbeeldmerken} - {#2{\hbox{\getvalue{\??lo#1##1\c!commando}}}}}% - \else - \def\docommando##1% - {\doifvalue{\??lo#1##1\c!status}{\v!start} - {#2{\hbox{\getvalue{\??lo#1##1\c!commando}}}}}% - \fi - \def\dodocommando##1##2##3##4##5##6% - {\hskip\linkerrandafstand - \hskip\pageseparation - \hbox to \linkermargebreedte{\docommando{##2}\hss}% - \hskip\linkermargeafstand - \hbox to \zetbreedte{\docommando{##3}\hss\docommando{##4}}% - \hskip\rechtermargeafstand - \hbox to \rechtermargebreedte{\hss\docommando{##5}}% - \hskip\pageseparation - \hskip\rechterrandafstand - \hbox to \rechterrandbreedte{\hss\docommando{##6}}}% - \normalbaselines - \hsmash - {\hbox to \zetbreedte{\hss\docommando\c!midden\hss}}% - \hsmash - {\doifbothsides - \hskip-\rugwit - \orsideone - \hskip-\rugwit - \orsidetwo - \hskip-\papierbreedte - \hskip+\rugwit - \hskip+\zetbreedte - \od - \hbox to \papierbreedte{\docommando\v!pagina\hss}}% - \swapmargins - \goleftonpage - \doifbothsidesoverruled - \dodocommando - {\v!linkerrand}{\v!linkermarge}{\v!links} - {\v!rechts}{\v!rechtermarge}{\v!rechterrand}% - \orsideone - \dodocommando - {\v!linkerrand}{\v!linkermarge}{\v!links} - {\v!rechts}{\v!rechtermarge}{\v!rechterrand}% - \orsidetwo - \dodocommando - {\v!rechterrand}{\v!rechtermarge}{\v!rechts} - {\v!links}{\v!linkermarge}{\v!linkerrand}% - \od}}% - \getboxheight\dimen0\of\box0\relax - \vskip-\dimen0 - \box0 - \egroup} - -\def\setlogobox#1#2% - {\global\setbox#1=\vbox to \papierhoogte - {\offinterlineskip - \mindermeldingen - \calculatereducedvsizes - #2\relax - \vskip-\kopwit - \doplaatsbeeldmerken\v!boven\vsmash - \vskip\kopwit - \doplaatsbeeldmerken\v!hoofd\vsmash - \vskip\hoofdhoogte - \vskip\hoofdafstand - \doplaatsbeeldmerken\v!tekst\vsmash % evt \vbox - \vskip\teksthoogte - \vskip\voetafstand - \vskip\voethoogte - \doplaatsbeeldmerken\v!voet\vbox - \vfilll - \doplaatsbeeldmerken\v!onder\vbox% - \vskip\kopwit} - \smashbox#1} - -\def\setlogoboxes% - {\showmessage{\m!layouts}{7}{}% - \setlogobox\leftlogos\relax - \ifdubbelzijdig - \setlogobox\rightlogos\doswapmargins - \fi} - -\def\getlogobox% - {\ifnum\logostatus>0 - \ifnum\logostatus=3 - \setlogoboxes - \gdef\logostatus{2}% - \else\ifnum\logostatus=2 - \setlogoboxes - \gdef\logostatus{1}% - \else\ifnewlogos - \gdef\logostatus{2}% - \setlogoboxes - \gdef\logostatus{1}% - \global\newlogosfalse - \fi\fi\fi - \doifmarginswapelse - {\copy\leftlogos} - {\copy\rightlogos}% - \fi} - -%I n=Spatiering -%I c=\stelspatieringin -%I c=\omlaag,\opelkaar,\spatie,\vastespaties -%I -%I De ruimte na interpunctie worden ingesteld met: -%I -%I \stelspatieringin[instelling] -%I -%I waarbij de volgende instellingen mogelijk zijn: -%I -%I ruim flexibele ruimte na interpunctie -%I opelkaar een spatie na interpunctie -%I -%I Bij een smalle layout levert de instelling 'ruim' minder -%I in de marge uitstekende (niet af te breken) woorden op. -%I -%P -%I Andere commando's zijn: -%I -%I \omlaag[afstand] een vaste afstand omlaag -%I \opelkaar ruimte tussen regels weghalen -%I -%I \spatie een (harde) spatie -%I \geenspatie geen vorige/volgende spatie -%I -%I \hfil \hfill \hfilll opvullen met horizontaal wit -%I \vfil \vfill \vfilll opvullen met vertikaal wit -%I -%I \strut karakter-box zonder breedte -%I -%I \vastespaties geeft ~ de breedte van een cijfer - -% \frenchspacing leidt soms tot afbreken tussen -, vandaar -% de variant \newfrenchspacing. - -\def\dofrenchspacing#1% - {\sfcode`\.#1 \sfcode`\,#1\relax - \sfcode`\?#1 \sfcode`\!#1\relax - \sfcode`\:#1 \sfcode`\;#1\relax} - -\def\frenchspacing% - {\dofrenchspacing{1000}} % \@m - -\def\newfrenchspacing% - {\dofrenchspacing{1050}} % \@ml - -\def\dostelspatieringin[#1]% - {\processaction - [#1] - [\v!opelkaar=>\newfrenchspacing, - \v!ruim=>\nonfrenchspacing]} - -\def\stelspatieringin% - {\dosingleargument\dostelspatieringin} - -\def\space% - { } - -\def\spatie% kan tzt vervallen, eerst overal in zetten - { } - -\def\hardespatie% - {~} - -\bgroup -\catcode`\~=\@@active % eigenlijk is ~ al actief -\gdef\fixedspaces% % in Plain \TeX, maar we weten - {\catcode`\~=\@@active % nooit wat er inmiddels is - \def~{\hskip.5em}} % gebeurd, vandaar. -\egroup - -\def\nospace% - {\unskip\ignorespaces} - -\def\geenspatie% % kan tzt vervallen, eerst overal in zetten - {\unskip\ignorespaces} - -\def\geenspaties{\geenspaties} % kan weg - -\def\opelkaar% - {\nointerlineskip} - -\def\omlaag[#1]% - {\nointerlineskip% - \vskip#1 } - -%I n=Witruimte -%I c=\stelwitruimtein,\witruimte,\geenwitruimte -%I c=\startopelkaar,\startvanelkaar -%I c=\startregelcorrectie,\corrigeerwitruimte -%I -%I De afstand tussen paragrafen is in te stellen met: -%I -%I \stelwitruimtein[maat] -%I -%I In te vullen op de plaats van 'maat' (12pt, 1cm) of een -%I van de aanduidingen klein, middel of groot. Als niets -%I wordt meegegeven, dus alleen \stelwitruimtein, dan -%I wordt de ingestelde witruimte aangepast aan het formaat -%I letter. -%I -%I Voor elke lege regel in de ASCII-file voegt TEX de -%I ingestelde witruimte tussen. -%I -%I Het commando \witruimte dwingt witruimte af en het -%I commando \geenwitruimte maakt witruimte ongedaan. -%I -%I Behalve met de hier beschreven witruimte-commando's is de -%I witruimte tussen paragrafen te be‹nvloeden met behulp van -%I de elders beschreven blanko-commando's. -%P -%I Een stuk tekst kan zonder witruimte worden gezet door het -%I tussen de volgende commando's op te nemen: -%I -%I \startopelkaar -%I \stopopelkaar -%I -%I Waarbij een optioneel argument [blanko] mogelijk is. De -%I tegenhanger hiervan is: -%I -%I \startvanelkaar -%I \stopvanelkaar -%P -%I TeX handelt de interlinie van een (omlijnde) box of een -%I rule anders af dan van een regel tekst. In dergelijke -%I gevallen kan de volgende constructie worden gebruikt: -%I -%I \startregelcorrectie -%I \omlijnd{tekst} -%I \stopregelcorrectie - -\newskip\tussenwit -\tussenwit=\!!zeropoint - -\def\blankokleinmaat% - {\smallskipamount} - -\def\blankomiddelmaat% - {\medskipamount} - -\def\blankogrootmaat% - {\bigskipamount} - -\def\currentwitruimte% - {\!!zeropoint} - -\def\stelwitruimteopnieuwin% - {\expanded{\stelwitruimtein[\currentwitruimte]}} - -% \def\dodostelwitruimtein[#1]% -% {\processallactionsinset -% [#1] -% [\v!herstel=>\parskip=\tussenwit, -% \v!regel=>\edef\currentwitruimte{#1}% -% \tussenwit=\baselineskip -% \parskip=\tussenwit, -% \v!vast=>\tussenwit=1\tussenwit -% \parskip=1\parskip, -% \s!default=>\doifnot{\currentwitruimte}{\v!geen} -% {\stelwitruimteopnieuwin}, -% \s!unknown=>\edef\currentwitruimte{#1}% -% \assigndimension{#1} -% {\tussenwit}{\blankokleinmaat} -% {\blankomiddelmaat}{\blankogrootmaat}% -% \parskip=\tussenwit]} - -\newif\ifwitruimteflexibel - -\def\dodostelwitruimtein[#1]% - {\witruimteflexibeltrue - \processallactionsinset - [#1] - [\v!herstel=>, - \v!vast=>\witruimteflexibelfalse, - \v!flexibel=>\witruimteflexibeltrue, - \v!regel=>\tussenwit=\baselineskip, - \s!default=>\doifnot{\currentwitruimte}{\v!geen} - {\stelwitruimteopnieuwin}, - \s!unknown=>\@EA\assigndimension\@EA{\commalistelement} % \@EA is nodig - {\tussenwit}{\blankokleinmaat} % om loops af - {\blankomiddelmaat}{\blankogrootmaat}]% % te vangen - \edef\currentwitruimte% - {\ifdim\tussenwit=\!!zeropoint - \v!geen - \else - \ifgridsnapping\the\baselineskip\else\the\tussenwit\fi - \fi}% - \ifgridsnapping - \witruimteflexibelfalse - \tussenwit=1\tussenwit - \ifdim\tussenwit>\!!zeropoint - \tussenwit=\baselineskip - \fi - \else - \ifwitruimteflexibel \else \tussenwit=1\tussenwit \fi - \fi - \parskip=\tussenwit} - -\def\dostelwitruimtein[#1]% - {\expanded{\dodostelwitruimtein[#1]}} - -\def\stelwitruimtein% - {\dosingleempty\dostelwitruimtein} - -\def\geenwitruimte% - {\ifdim\parskip>\!!zeropoint\relax - \ifdim\lastskip=-\parskip - \else - \vskip-\parskip - \fi - \fi} - -% deze variant is nodig binnen \startopelkaar -% steeds testen: -% -% \hoofdstuk{..} -% \plaatslijst[..] -% \hoofdstuk{..} -% \input tufte -% -% met/zonder witruimte - -\def\witruimte% - {\par - \ifdim\parskip>\!!zeropoint\relax - %\ifdim\lastskip>\parskip \else - % \removelastskip interferes with blanko blokkeer en klein - \vskip\parskip - %\fi - \fi} - - -\def\nonoblanko[#1]% - {\par} - -\def\noblanko% - {\dosingleempty\nonoblanko} - -% De onderstaande macro handelt ook de situatie dat er geen -% tekst tussen \start ... \stop is geplaatst. Daartoe wordt de -% laatste skip over de lege tekst heen gehaald. Dit komt goed -% van pas bij het plaatsen van (mogelijk lege) lijsten. - -\newif\ifopelkaar - -\def\noparskipsignal {0.00001pt} -\def\lastdoneparskip {0pt} - -\def\startopelkaar% - {\dosingleempty\dostartopelkaar} - -\def\dostartopelkaar[#1]% nesting afvangen - {\par - \ifvmode - \edef\lastdoneparskip{\the\lastskip}% -\edef\lastdoneprevdepth{\the\prevdepth}% zeer recent toegevoegd - \ifdim\prevdepth=-1000pt % toegevoegd omdat binnen - \else % een vbox een extra skip - \witruimte % ongewenst is; dit kan - \vskip\noparskipsignal % waarschijnlijk ook in - \fi % blanko blokkeer - \bgroup - \doifelse{#1}{\v!blanko} - {\opelkaarfalse} - {\opelkaartrue}% - \blanko[\v!blokkeer]% - \stelwitruimtein[\v!geen] - \fi} - -\def\stopopelkaar% - {\par -\ifvmode - \egroup - \ifdim\lastskip=\noparskipsignal\relax - \removelastskip - \geenwitruimte - \vskip-\lastdoneparskip - \vskip+\lastdoneparskip -\prevdepth-\lastdoneprevdepth % zeer recent toegevoegd - \fi -\fi} - -\def\startvanelkaar% - {\blanko - \leavevmode - \bgroup} - -\def\stopvanelkaar% - {\egroup - \blanko} - -% De onderstaande macro's moeten nog eens nader worden uitgewerkt. -% Ze spelen een rol bij de spatiering rond omkaderde teksten -% en/of boxen zonder diepte. - -\def\toonregelcorrectie {\showbaselinecorrection} -\def\regelcorrectie {\baselinecorrection} -%\def\startregelcorrectie {\startbaselinecorrection} -%\def\stopregelcorrectie {\stopbaselinecorrection} - -\definecomplexorsimpleempty\startregelcorrectie - -% \prevdepth crosses pageboundaries! - -\let\dorondomregelcorrectie=\relax - -\def\complexstartregelcorrectie[#1]% - {\bgroup - \processaction - [#1] - [ \v!blanko=>\let\dorondomregelcorrectie=\blanko, - \s!default=>\let\dorondomregelcorrectie=\relax, - \s!unknown=>{\def\dorondomregelcorrectie{\blanko[#1]}}]% - \dorondomregelcorrectie - \startbaselinecorrection - \offbaselinecorrection} - -\def\stopregelcorrectie% - {\stopbaselinecorrection - \dorondomregelcorrectie - \egroup} - -\def\corrigeerwitruimte% - {\dowithnextbox - {\startbaselinecorrection - \box\nextbox - \stopbaselinecorrection}% - \vbox} - -%I n=Regelafstand -%I c=\stelinterliniein -%I -%I De regelafstand is in te stellen met het commando: -%I -%I \stelinterliniein[factor] -%I -%I Invulmogelijkheden voor 'factor' zijn: klein (1.00), -%I middel (1.25), groot (1.50) of een getal. OOk kan -%I aan of uit worden opgegeven. -%I -%I Als het commando zonder [factor] wordt gegeven, dan -%I worden de interlinie aangepast aan het formaat van het -%I actuele letterformaat. Een aan het formaat aangepaste -%I interlinie kan ook worden ingesteld met: -%I -%I \stelinterliniein[reset,factor] -%I -%I In z'n eenvoudigste vorm \stelinterliniein wordt de -%I interlinie aangepast aan het formaat letter. - -\def\complexstelinterliniein[#1]% \commalistelement ipv #1 - {\doifassignmentelse{#1} - {\getparameters[\??it][#1]% - \scratchdimen=0\@@ithoogte pt - \advance\scratchdimen by 0\@@itdiepte pt - \ifdim\scratchdimen>1pt - \showmessage{\m!layouts}{10}{\@@ithoogte,\@@itdiepte}% - \let\@@ithoogte=\strutheightfactor - \let\@@itdiepte=\strutdepthfactor - \else - \let\strutheightfactor=\@@ithoogte - \let\strutdepthfactor =\@@itdiepte - \fi - \let\normallineheight =\@@itregel - \let\topskipfactor =\@@itboven - \let\maxdepthfactor =\@@itonder - \setfontparameters\setstrut} - {\processallactionsinset % \regelwit = dummy ! - [#1] - [ \v!aan=>\oninterlineskip, - \v!uit=>\offinterlineskip, - \v!reset=>\setfontparameters, - \s!unknown=>\assignvalue{#1}{\regelwit}{1.00}{1.25}{1.50}% - \spacing{\regelwit}]}} - -\def\simplestelinterliniein% - {\setfontparameters} - -\definecomplexorsimple\stelinterliniein - -%I n=Blanko -%I c=\blanko,\geenblanko,\stelblankoin -%I c=\startregelcorrectie -%I -%I Behalve met de hier beschreven blanko-commando's is de -%I witruimte tussen paragrafen te be‹nvloeden met behulp van -%I de elders beschreven witruimte-commando's. -%I -%I Het commando -%I -%I \blanko[sprong] -%I -%I voegt witruimte tussen paragrafen toe. -%I -%I Mogelijke instellingen voor 'sprong' zijn: terug, klein, -%I middel, groot. Per blanko is elke combinatie van -%I instellingen toegestaan. Ook een veelvoud van een instelling -%I is mogelijk. Enkele voorbeelden: -%I -%I \blanko[terug,3*groot] -%I \blanko[klein,middel] -%P -%I Naast de genoemde instellingen zijn enkele bijzondere -%I instellingen mogelijk: -%I -%I wit tussenvoegen van \witruimte -%I geenwit terugspringen van \witruimte -%I blokkeer overslaan van de volgende \blanko -%I reset opheffen van \blanko[blokkeer] -%I forceer afdwingen van een blanko (bovenaan) -%I -%I Ook deze instellingen zijn in combinatie met andere te -%I gebruiken. Een voorbeeld: \blanko[forceer,wit,2*middel]. -%I -%I Het commando \blanko (zonder instelling) is gelijk aan -%I \blanko[groot]. -%I -%I Het commando \geenblanko maakt het commando \blanko -%I ongedaan. -%P -%I Met het commando's -%I -%I \stelblankoin[maat] -%I -%I is het mogelijk de spronggrootte in te stellen. De maat -%I kan worden opgegeven in getallen en eenheden (12pt, 1cm). -%I De standaard instellingen krijgt met met 'normaal', -%I regelafstanden met 'regel'. -%I -%I Het commando \stelblankoin (zonder argument) past de sprong -%I aan het formaat letter aan. -%P -%I Rond omlijnde tekst, of algemener: rond lijnen, wordt -%I geen witruimte gegenereerd. Wil men dit wel, dan dient men -%I de betreffende tekst te omringen met: -%I -%I \startregelcorrectie -%I \stopregelcorrectie - -% In earlier versions \type{\bigskipamount} was -% \type{\ht\strutbox} and the stretch was plus or minus -% \type{.4\dp\strutbox}. Don't ask me why. The most recent -% implementation is based on a user supplied distance, which -% is by default \type{.75\normalskipamount} where -% \type{\normalskipamount} equals the current baseline -% distance. - -\newif\ifblankoreset \blankoresetfalse -\newif\ifblankoblokkeer \blankoblokkeerfalse -\newif\ifblankogeenwit \blankogeenwitfalse -\newif\ifdoeblanko \doeblankofalse -\newif\ifblankoflexibel \blankoflexibeltrue -\newif\ifblankobuiten - -\newskip\blankoskip \blankoskip=\bigskipamount -\newskip\blankoskipamount - -\def\skipfactor {.75} -\def\skipgluefactor {.25} - -%\def\normalskipamount% -% {\openlineheight -% \ifblankoflexibel -% \!!plus\skipgluefactor\openlineheight -% \!!minus\skipgluefactor\openlineheight -% \fi -% \relax} - -\def\normalskipamount% - {\openlineheight - \ifgridsnapping \else \ifblankoflexibel - \!!plus\skipgluefactor\openlineheight - \!!minus\skipgluefactor\openlineheight - \fi \fi - \relax} - -\def\regelafstand{\normalskipamount} - -\def\deblankoskip{\skipfactor\regelafstand} - -\def\laatsteblankoskip% - {\blankoskip} - -\def\geenblanko% - {\removelastskip} - -\def\dosingleblanko#1% - {\doifelse{#1}{\v!regel} - {\blankoskipamount=\openlineheight} - {\ifgridsnapping - \assigndimension{#1}{\blankoskipamount}% - {.25\openlineheight}{.5\openlineheight}{\openlineheight}% - \else - \assigndimension{#1}{\blankoskipamount}% - {\smallskipamount}{\medskipamount}{\bigskipamount}% - \fi}% - \global\advance\blankoskip by \blankoskipamount} - -\def\doblanko#1% - {\processallactionsinset - [#1] - [ \v!groot=>\dosingleblanko\v!groot, % happens often - \v!buiten=>\ifvmode\ifinner\blankobuitentrue\fi\fi, - \v!reset=>\global\blankoresettrue, - \v!terug=>\geenblanko, - \v!wit=>\global\advance\blankoskip by \parskip, - \v!formule=>\global\advance\blankoskip by \medskipamount, - \v!geenwit=>\global\blankogeenwittrue, - -\v!wit=>\global\advance\blankoskip by -\parskip, - \v!blokkeer=>\global\blankoblokkeertrue, - \v!forceer=>\endgraf\ifdim\prevdepth>0pt\else\line{}\kern-\lineheight\fi, - \v!regel=>\global\advance\blankoskip by \lineheight, - \s!unknown=>{\herhaalmetcommando[#1]\dosingleblanko}]} - -\def\oldprevdepth{\prevdepth}% -\def\newprevdepth{-1001pt} - -\def\mindimen{0.00002pt} - -\def\docomplexdoblanko[#1]% pas op \relax's zijn nodig ivm volgende \if - {\global\blankoresetfalse - \global\blankoblokkeerfalse - \global\blankogeenwitfalse - \global\blankoskip=\!!zeropoint\relax - \blankobuitenfalse - \processcommalist[#1]\doblanko - \ifblankobuiten - \else - \par - \ifvmode - \ifblankoblokkeer - \global\doeblankofalse - \edef\oldprevdepth{\the\prevdepth}% - \prevdepth=\newprevdepth - \else - \global\doeblankotrue - \fi - \ifblankoreset - \global\doeblankotrue - \ifdim\prevdepth=\newprevdepth - \prevdepth=\oldprevdepth - \fi - \fi - \ifdoeblanko - \ifdim\lastskip<\blankoskip\relax - % else when \blanko[2*groot] + \blanko[3*groot] with parskip - % equaling 1*groot, gives a groot=\parskip so adding a small - % value makes it distinguishable; can also be done at parskip - % setting time (better) - \global\advance\blankoskip by \mindimen\relax % = skip - % test this on 2* + 3* and parskip groot - \ifblankogeenwit - \global\advance\blankoskip by -\parskip - \else - \ifdim\lastskip=\parskip - \else % force this due to previous comment - \ifdim\parskip>\!!zeropoint\relax - \ifdim\blankoskip<\parskip\relax - \global\blankoskip=\!!zeropoint - \else - \global\advance\blankoskip by -\parskip - \fi - \fi - \fi - \fi - \ifdim\prevdepth=\newprevdepth - \else - \removelastskip - \vskip\blankoskip - \fi - \fi - \fi - \fi - \fi} - -\def\complexdoblanko[#1]% - {\flushfootnotes - \ifopelkaar - \ifinpagebody - \expanded{\docomplexdoblanko[#1]}% \expanded=nieuw - \else - \par - \fi - \else - \expanded{\docomplexdoblanko[#1]}% \expanded = nieuw - \fi} - -\def\currentblanko% - {\v!groot} - -\def\simpledoblanko% - {\doifelse{\currentwitruimte}{\v!geen} - {\blanko[\currentblanko]} - {\blanko[\currentwitruimte]}} - -\def\blanko% - {\complexorsimple{doblanko}} - -\def\dostelblankoin#1% - {\bgroup - \skip0=#1\relax - \xdef\globalblanko{\the\skip0}% - \egroup - \bigskipamount=\globalblanko - \smallskipamount=\globalblanko - \medskipamount=\globalblanko - \divide\medskipamount by 2\relax - \divide\smallskipamount by 4\relax}% - -\def\complexstelblankoin[#1]% - {\ExpandFirstAfter\processallactionsinset - [#1] - [ \v!flexibel=>\blankoflexibeltrue, - \v!vast=>\blankoflexibelfalse]% - \ExpandFirstAfter\processallactionsinset - [#1] - [ \v!flexibel=>\dostelblankoin{\deblankoskip}, - \v!vast=>\dostelblankoin{\deblankoskip}, - \v!regel=>\edef\deblankoskip{\regelafstand}% - \dostelblankoin{\deblankoskip}% - \let\deblanko=\v!groot, - \v!groot=>\ifgridsnapping - \edef\deblankoskip{\regelafstand}% - \dostelblankoin{\deblankoskip}% - \fi - \def\currentblanko{\v!groot}% - \let\deblanko=\v!groot, - \v!middel=>\def\currentblanko{\v!middel}% - \let\deblanko=\v!middel, - \v!klein=>\def\currentblanko{\v!klein}% - \let\deblanko=\v!klein, - \v!normaal=>\dostelblankoin{\deblankoskip}% - \let\deblanko=\v!groot, - \v!standaard=>\edef\deblankoskip{\skipfactor\regelafstand}% - \dostelblankoin{\deblankoskip}% - \let\deblanko=\v!groot, - \s!default=>\dostelblankoin{\deblankoskip}% - \let\deblanko=\v!groot, - \s!unknown=>\let\deblankoskip=\commalistelement - \dostelblankoin{\deblankoskip}% - \let\deblanko=\v!groot]% - \stelwitruimtein} - -\def\stelblankoin% - {\complexorsimpleempty{stelblankoin}} - -%I n=Inspringen -%I c=\inspringen,\nietinspringen,\welinspringen -%I c=\stelinspringenin -%I -%I Het inspringen van de eerste regel van een paragraaf -%I wordt ingesteld met het commando: -%I -%I \inspringen[parameter] -%I -%I waarbij als parameter kan worden meegegeven: -%I -%I niet de volgende paragraaf niet inspringen -%I nooit de volgende paragrafen niet inspringen -%I altijd de volgende paragrafen inspringen -%I -%I De mate van inspringen wordt ingesteld met: -%I -%I \stelinspringenin[maat] -%I -%I waarbij maat staat voor een TeX-maat of het woord klein, -%I middel, groot of geen. - -\def\currentvoorwit{} - -\newdimen\voorwit - -\def\dostelinspringenin[#1]% - {\doifsomething{#1}{\def\currentvoorwit{#1}}% - \assigndimension{\currentvoorwit}{\voorwit}{1em}{1.5em}{2em}% - \parindent=\voorwit\relax} - -\def\stelinspringenin% - {\dosingleempty\dostelinspringenin} - -\def\doinspringen[#1]% - {\processaction - [#1] - [ \v!nee=>\parindent=\voorwit\relax\noindent, - \v!niet=>\parindent=\voorwit\relax\noindent, - \v!ja=>\parindent=\voorwit\relax, % geen \indent ! - \v!altijd=>\parindent=\voorwit\relax, % geen \indent ! - \v!nooit=>\parindent=\!!zeropoint\relax]} - -\def\inspringen% - {\dosingleargument\doinspringen} - -\def\nietinspringen{\inspringen[\v!nee]} -\def\welinspringen{\inspringen[\v!ja]} - -%I n=Verhogen,Verlagen -%I c=\laag,\hoog,\laho -%I -%I Met de volgende commando's kunnen letters en woorden -%I worden verhoogd en verlaagd. -%I -%I \laag{tekst} -%I \hoog{tekst} -%I \laho{lage tekst}{hoge tekst} - -\def\holatextfont{\tx} -\def\holamathfont{\the\scriptfont\fam} - -\def\dodohooglaag#1% - {\doifelsenothing{\fontsize} - %{\ifnum\fam<0 \holatextfont\else\holamathfont\fi#1} - {\ifmmode - \ifnum\fam<0 - \holatextfont - \else - \holamathfont - \fi - \else - \holatextfont - \fi#1} - {\holatextfont#1}} - -\def\dohooglaag#1#2#3#4#5% - {\bgroup - \ifdim\fontdimen5\textfont2=1ex - \dimen0=\fontdimen#1\textfont2 - \else - \dimen0=#2ex - \fi - \advance\dimen0 by #3\relax - \kern.1ex - \setbox0=\hbox{#4\dimen0\hbox{\dodohooglaag{#5}}}% - \ht0=\ht\strutbox - \dp0=\dp\strutbox - \box0 - \egroup} - -\unexpanded\def\hoog% - {\dohooglaag{14}{.86}\!!zeropoint\raise} - -\unexpanded\def\laag% - {\dohooglaag{16}{.48}\!!zeropoint\lower} - -\unexpanded\def\laho#1#2% - {\hbox% - {\setbox4=\hbox{\dohooglaag{16}{.48}{.1ex}{\lower}{#1}}% - \setbox6=\hbox{\dohooglaag{14}{.86}{.1ex}{\raise}{#2}}% - \ifdim\wd4<\wd6\relax - \wd4=\!!zeropoint\box4\box6\relax - \else - \wd6=\!!zeropoint\box6\box4\relax - \fi}} - -%I n=Kapitalen -%I c=\kap,\Kap,\KAP,\Kaps,\Woord,\Woorden,\opgerekt -%I -%I Kapitalen kunnen in een kleiner letterformaat worden -%I weergegeven met de commando's: -%I -%I \kap{tekst} -%I \Kap{tekst} -%I \KAP{tekst} -%I -%I Bij het eerste commando wordt de hele tekst in kapitalen -%I gezet, bij het tweede alleen de eerste letter en bij het -%I laatste commando de letters die worden voorafgegaan door -%I \\, bijvoorbeeld \KAP{\\Commissie \\Ziezo}. -%I -%I Als de tekst van het laatste commando uit woorden bestaat, -%I kan ook het volgende commando worden gebruikt: -%I -%I \Kaps{tekst tekst tekst} -%I -%I In dat geval zijn geen \\ nodig. -%P -%I Binnen \kap kan \nokap worden gebruikt om een kleine -%I letter af te dwingen: \kap{AM\nokap{v}B}. -%I -%I Een eerste letter(s) van een of meer woorden kunnen worden -%I omgezet in een hoofdletter met het commando -%I -%I \Woord{woord} -%I \Woorden{woord woord woord ...} -%I -%I Een heel woord kan in hoofdletters worden omgezet met: -%I -%I \WOORD{tekst} -%P -%I Woorden kunnen worden uitgerekt over de actuele breedte -%I met: -%I -%I \opgerekt{tekst} -%I -%I bijvoorbeeld: -%I -%I \hbox to 20em{\opgerekt{abcdef\\ghijk}} -%I -%I met \\ of {} wordt een spatie afgedwongen. - -%T n=kap -%T m=kap -%T a=k -%T -%T \kap{?} - -%I n=Afbreken -%I c=\stelkoppeltekenin -%I -%I Met streepjes (-, --, ---) verbonden worden alleen afgebroken -%I op de plaats van het streepje. Wil men kunnen afbreken op -%I andere plaatsen, dan moet men de volgende constructie -%I gebruiken: -%I -%I ditiseen|---|heellangwoord|--|hoeweleigenlijkis|-|heteenzin -%I -%I Het is ook mogelijk geen teken mee te geven: -%I -%I ditiseen||heellangwoord -%I -%I In dat geval wordt het ingestelde teken tussengevoegd. Het -%I teken kan worden ingesteld met: -%I -%I \stelkoppeltekenin[teken=] -%I -%I Betekenisvolle waarden zijn: - en --, eventueel kan ~ -%I worden meegegeven. In dat geval wordt een \thinspace -%I geplaatst. -%P -%I Een |~| levert midden in de zin een spatie en aan het -%I eind van de zin een streepje, || is standaard equivalent -%I met |--|. -%I -%I Het koppelteken zelf kan worden opgeroepen met |=|, -%I bijvoorbeeld in alfa|=| en beta||deeltjes. Dit levert -%I dus alfa- en beta-deeltjes of alfa-- en beta--deeltjes. -%I Andere instellingen worden afgevangen. -%I -%I Ook ( en ) worden afgevangen. Hierbij wordt bij het -%I afbreken van voor(na) op de volgende regel (-na) -%I geplaatst. En wat te denken van |<| en |>|. - -% we use module supp-lan.tex - -\installdiscretionaries || \@@kpteken - -\newsignal\subsentencesignal -\newcounter\subsentencelevel -\def\subsentenceskip{.25em\relax} - -\def\stelkoppeltekenin% - {\dodoubleargument\getparameters[\??kp]} - -\def\beginofsubsentence% - {\ifdim\lastkern=\subsentencesignal - \unskip - \kern\subsentenceskip - \fi - \doglobal\increment\subsentencelevel - \ifnum\subsentencelevel=1 - \leaveoutervmode - \fi - \ifodd\subsentencelevel - \getvalue{\??la\currentlanguage\c!leftsentence}% - \else - \getvalue{\??la\currentlanguage\c!leftsubsentence}% - \fi - \ignorespaces} - -\def\beginofsubsentencespacing% - {\kern\subsentencesignal\ignorespaces} - -\def\endofsubsentence% - {\ifodd\subsentencelevel - \getvalue{\??la\currentlanguage\c!rightsentence}% - \else - \getvalue{\??la\currentlanguage\c!rightsubsentence}% - \fi - \doglobal\decrement\subsentencelevel - \unskip - \kern\subsentencesignal} - -\def\endofsubsentencespacing% - {%\ifdim\lastkern=\subsentencesignal \else - % \unskip - %\fi - \ifdim\lastkern=\subsentencesignal - \unskip - \hskip\subsentenceskip - \ignorespaces - \else - \unskip - \fi} - -% test |<|test |<|test|>| test|>| test \par -% test|<|test|<|test|>|test|>|test \par -% test |<||<|test|>||>| test \par - -\enableactivediscretionaries - -%I n=Positioneren -%I c=\startpositioneren,\stelpositionerenin -%I -%I Er kan (binnen zekere grenzen) gepositioneerd worden met -%I de commando's: -%I -%I \startpositioneren -%I \stoppositioneren -%I -%I met daartussen -%I -%I \positioneer(x,y){...} -%I -%I waarbij x en y alleen getallen worden ingevuld. Ongewenste -%I spaties moeten zonodig met worden voorkomen met een %-teken. -%P -%I Een en ander kan worden ingesteld met: -%I -%I \stelpositionerenin[eenheid=,factor=,schaal=,xstap=, -%I ystap=,xoffset=,yoffset=,offset=] -%I -%I Standaard is de eenheid cm en de factor 1. Mogelijke -%I stapaanduidingen zijn 'absoluut' en 'relatief'. Deze -%I instellingen kunnen \resetpositioneren worden hersteld. -%I -%I Als men negatieve coordinaten (of een negatieve offset) -%I gebruikt, dan kan het soms wenselijk zijn het nulpunt te -%I laten samenvallen met de linkerbovenhoek van de omringende -%I box. In dat geval kan met offset=nee instellen. De negatieve -%I posities vallen in dat geval buiten de box. - -% Het gebruik van \skip's spaart \dimen's. - -\newskip\xpositie -\newskip\ypositie - -\newskip\xafmeting -\newskip\yafmeting - -\newskip\xoffset -\newskip\yoffset - -\newbox\positiebox - -\def\startpositioneren% - {\bgroup - \xpositie=\!!zeropoint - \ypositie=\!!zeropoint - \xafmeting=\!!zeropoint - \yafmeting=\!!zeropoint - \xoffset=\!!zeropoint - \yoffset=\!!zeropoint - \hfuzz=30cm - \vfuzz=30cm - \setbox\positiebox=\hbox\bgroup} - -\def\stoppositioneren% - {\doifnot{\@@psoffset}{\v!ja} - {\global\xoffset=\!!zeropoint - \global\yoffset=\!!zeropoint}% - \global\advance\xafmeting by \xoffset - \global\advance\yafmeting by \yoffset - \egroup - \vbox to \yafmeting - {\vskip\yoffset - \hbox to \xafmeting - {\hskip\xoffset - \box\positiebox - \hfill}% - \vfill}% - \egroup} - -\def\resetpositioneren% - {\getparameters[\??ps] - [\c!eenheid=\s!cm, - \c!factor=1, - \c!xfactor=\@@psfactor, - \c!yfactor=\@@psfactor, - \c!schaal=1, - \c!xschaal=\@@psschaal, - \c!yschaal=\@@psschaal, - \c!xstap=\v!absoluut, - \c!ystap=\v!absoluut, - \c!xoffset=\!!zeropoint, - \c!yoffset=\!!zeropoint]} - -\resetpositioneren - -\def\stelpositionerenin% - {\resetpositioneren% - \dodoubleargument\getparameters[\??ps]}% - -\def\positioneer(#1,#2)#3% \nextbox - {\setbox0=\hbox{#3}% - \def\berekenpositioneren##1##2##3##4##5##6##7##8##9% - {\skip0=##1\@@pseenheid\relax - \skip0=##8\skip0\relax - \skip0=##9\skip0\relax - \doifelse{##2}{\v!relatief}% - {\advance\skip0 by ##3\relax - \advance\skip0 by ##4\relax - \def##4{\!!zeropoint}}% - {\advance\skip0 by ##4\relax}% - ##3=\skip0\relax - \ifdim##3<-##7\relax - \global##7=-##3\relax - \fi - \skip2=##5\relax - \advance\skip2 by ##3\relax - \ifdim\skip2>##6\relax - \global##6=\skip2\relax - \fi}% - \berekenpositioneren{#1}{\@@psxstap}{\xpositie} - {\@@psxoffset}{\wd0}{\xafmeting}{\xoffset} - {\@@psxschaal}{\@@psxfactor}% - \skip4=\ht0 \advance\skip4 by \dp0 - \berekenpositioneren{#2}{\@@psystap}{\ypositie} - {\@@psyoffset}{\skip4}{\yafmeting}{\yoffset} - {\@@psyschaal}{\@@psyfactor}% - \vbox to \!!zeropoint - {\vskip\ypositie - \hbox to \!!zeropoint - {\hskip\xpositie - \box0 - \hskip-\xpositie}% - \vskip-\ypositie}% - \ignorespaces} - -\def\dorooster[#1]% - {\bgroup - \getparameters[\??rt] - [\c!nx=10,\c!ny=10, - \c!dx=.5,\c!dy=.5, - \c!xstap=0,\c!ystap=0, - \c!eenheid=\s!cm, - \c!schaal=1, - \c!factor=1, - \c!offset=\v!ja, - #1]% - \startpositioneren - \dimen0=\@@rtdx\@@rteenheid - \dimen0=\@@rtschaal\dimen0 - \dimen0=\@@rtfactor\dimen0 - \multiply\dimen0 by \@@rtnx - \dimen2=\@@rtdy\@@rteenheid - \dimen2=\@@rtschaal\dimen2 - \dimen2=\@@rtfactor\dimen2 - \multiply\dimen2 by \@@rtny - \def\horline - {\vbox - {\hrule - \!!width \dimen0 - \!!height \lijndikte - \!!depth \!!zeropoint}}% - \def\verline% - {\vrule - \!!width \lijndikte - \!!height \dimen2 - \!!depth \!!zeropoint}% - \def\setlegend##1##2% - {\global\!!countc=0 - \dimen0=2em - \dimen2=##2\@@rteenheid - \dimen2=\@@rtschaal\dimen2 - \dimen2=\@@rtfactor\dimen2 - \divide\dimen0 by \dimen2 - \global\!!counte=\dimen0 - \ifnum\!!counte>50 - \global\!!counte=100 - \else\ifnum\!!counte>10 - \global\!!counte=50 - \else\ifnum\!!counte>5 - \global\!!counte=10 - \else\ifnum\!!counte>1 - \global\!!counte=5 - \else - \global\!!counte=1 - \fi\fi\fi\fi - \global\!!countd=0 - \def\legend% - {\ifnum\!!countd=0 - \vbox - {\hbox to 2em{\hss\the\!!countc\hss}}% - \global\!!countd=\!!counte - \fi - \global\advance\!!countd by -1 - \global\advance\!!countc by ##1}}% - \def\draw##1##2##3##4##5##6##7% - {\stelpositionerenin - [\c!xstap=\v!absoluut, - \c!ystap=\v!absoluut, - \c!eenheid=\@@rteenheid, - \c!schaal=\@@rtschaal, - \c!factor=\@@rtfactor, - \c!offset=\@@rtoffset, - \c!xoffset=##6, - \c!yoffset=##7]% - \positioneer(0,0){##1}% - \stelpositionerenin - [\c!xstap=\v!relatief, - \c!ystap=\v!relatief, - \c!schaal=\@@rtschaal, - \c!factor=\@@rtfactor, - \c!offset=\@@rtoffset, - \c!eenheid=\@@rteenheid]% - \dorecurse{##2}{\positioneer(##3,##4){##5}}}% - \draw{\verline}{\@@rtnx}{\@@rtdx}{0}{\verline}{\!!zeropoint}{\!!zeropoint}% - \draw{\horline}{\@@rtny}{0}{\@@rtdy}{\horline}{\!!zeropoint}{\!!zeropoint}% - \tfx - \doifnot{\@@rtxstap}{0} - {\setlegend{\@@rtxstap}{\@@rtdx}% - \draw{\legend}{\@@rtnx}{\@@rtdx}{0}{\legend}{-1em}{-1.5em}}% - \doifnot{\@@rtystap}{0} - {\setlegend{\@@rtystap}{\@@rtdy}% - \draw{\legend}{\@@rtny}{0}{\@@rtdy}{\legend}{-2em}{-.75ex}}% - \stoppositioneren - \egroup} - -\def\rooster% - {\dosingleempty\dorooster} - -%I n=Kolommen -%I c=\stelkolommenin,\startkolommen,\kolom -%I -%I Tekst kan in kolommen worden gezet. Het aantal kolommen -%I en het al dan niet opnemen van een vertikale lijn kan -%I worden ingesteld. -%I -%I \stelkolommenin[n=,lijn=,tolerantie=,afstand=, -%I balanceren=,uitlijnen=,hoogte=] -%I -%I Hierin staat n voor het aantal kolommen. Aan lijn -%I kan aan of uit worden toegekend. Aan voor en na kan -%I een commando worden toegekend, bijvoorbeeld ~~. -%I -%I Mogelijke waarden voor de tolerantie zijn: zeerstreng, -%I streng, soepel en zeersoepel. -%P -%I De in kolommen te zetten tekst moet worden opgenomen -%I tussen de commando's: -%I -%I \startkolommen -%I \stopkolommen -%I -%I Er wordt naar een nieuwe kolom gesprongen met: -%I -%I \kolom - -\newif\ifbinnenkolommen -\newif\if@@klbalanceren -\newif\if@@kluitlijnen - -\binnenkolommenfalse - -\def\stelkolommenin% - {\dodoubleargument\getparameters[\??kl]} - -\def\linebetweencolumns% - {\bgroup - \startcolorpage - \ifdim\@@klafstand>\!!zeropoint - \dimen0=\@@klafstand - \else - \dimen0=\linewidth - \fi - \advance\dimen0 by -\linewidth - \hskip.5\dimen0 - \vrule - \!!width\linewidth - \ifb@selinebottom\!!depth\strutdepth\fi - \hskip.5\dimen0\relax - \stopcolorpage - \egroup} - -\def\spacebetweencolumns% - {\hskip\@@klafstand} - -\presetlocalframed[\??kl] - -\def\backgroundfinishcolumnbox% - {\dimen0=\@@kloffset - \advance\dimen0 by -\@@kllijndikte - \localframed - [\??kl] - [\c!offset=\dimen0, - \c!strut=\v!nee, - \c!breedte=\v!passend, - \c!hoogte=\v!passend, - \c!uitlijnen=]} - -\def\backgroundsetcolumntextheight% - {\dimen0=-\@@kloffset - \multiply\dimen0 by 2 - \advance\dimen0 by \teksthoogte - \edef\columntextheight{\the\dimen0}} - -\def\backgroundsetcolumntextwidth% - {\dimen0=-\@@kloffset - \multiply\dimen0 by \nofcolumns - \multiply\dimen0 by 2 - \advance\dimen0 by \tekstbreedte - \edef\columntextwidth{\the\dimen0}} - -\def\complexstartkolommen[#1]% %% \startkolommen - {\bgroup - \let\stopkolommen=\egroup - \ifbinnenkolommen - \else - \stelkolommenin[#1]% - \ifnum\@@kln>1\relax - \witruimte - \begingroup - \doif{\@@kloptie}{\v!achtergrond} - {\let\finishcolumnbox = \backgroundfinishcolumnbox - \let\setcolumntextheight = \backgroundsetcolumntextheight - \let\setcolumntextwidth = \backgroundsetcolumntextwidth}% -% \doifelse{\@@kllijn}{\v!aan} -% {\let\betweencolumns=\linebetweencolumns} -% {\let\betweencolumns=\spacebetweencolumns}% - \processaction - [\@@kllijn] - [ \v!aan=>\let\betweencolumns=\linebetweencolumns, - \v!uit=>\let\betweencolumns=\spacebetweencolumns, - \s!default=>\let\betweencolumns=\spacebetweencolumns, - \s!unknown=>\let\betweencolumns=\@@kllijn]% - \doifelsenothing{\@@klhoogte} - {\heightencolumnsfalse} - {\heightencolumnstrue}% - \doifelse{\@@klbalanceren}{\v!ja} - {\balancecolumnstrue} - {\balancecolumnsfalse}% - \processaction % ook nog: laatsteuitlijnen - [\@@kluitlijnen] - [ \v!ja=>\stretchcolumnstrue - \inheritcolumnsfalse, - \v!nee=>\stretchcolumnsfalse - \inheritcolumnsfalse, - \v!tekst=>\stretchcolumnsfalse - \inheritcolumnstrue]% - \nofcolumns=\@@kln - \edef\fixedcolumnheight{\@@klhoogte}% - \steltolerantiein[\@@kltolerantie]% %% \startkolommen - \stelblankoin[\@@klblanko]% - \ifdim\tussenwit>\!!zeropoint - \stelwitruimtein[\@@klblanko]% - \fi - \def\stopkolommen% - {\endmulticolumns - \global\binnenkolommenfalse - \endgroup - \egroup}% - \global\binnenkolommentrue - \beginmulticolumns - \fi - \fi} - -\def\startkolommen% - {\complexorsimpleempty{startkolommen}} - -\def\kolom% - {\ifbinnenkolommen - \ejectcolumn - \fi} - -%I n=Kader -%I c=\toonkader,\tooninstellingen,\toonlayout -%I -%I Met behulp van de drie commando's: -%I -%I \toonkader -%I \tooninstellingen -%I -%I kan de zetspiegel zichtbaar worden gemaakt, of eventueel -%I met: -%I -%I \toonkader [rand,tekst,marge] -%I -%I Het commando: -%I -%I \toonlayout -%I -%I genereert enkele (linker en rechter) pagina's. - -\def\complextoonkader[#1]% - {\stelachtergrondenin - [\v!hoofd,\v!tekst,\v!voet] - [#1] - [\c!achtergrond=, - \c!kader=\v!aan, - \c!hoek=\v!recht, - \c!kaderoffset=\!!zeropoint, - \c!kaderdiepte=\!!zeropoint, - \c!kaderkleur=] - \let\pageseparation=\!!zeropoint} - -\def\simpletoonkader% - {\complextoonkader - [\v!linkerrand,\v!linkermarge, - \v!tekst, - \v!rechtermarge,\v!rechterrand]} - -\definecomplexorsimple\toonkader - -\def\tooninstellingA#1#2% - {\ifx#2\??ly - #1&\dimen0=\getvalue{#2#1}\PtToCm{\the\dimen0}&\dimen0=\getvalue{#2#1}\the\dimen0&\cr - \else - #1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr - \fi} - -\def\tooninstellingB#1#2#3% - {#1&#3&\tttf\string#3\cr} - -\def\tooninstellingen% % engels maken - {\noindent - \vbox - {\forgetall - \mindermeldingen - \switchnaarkorps[\v!klein] - \tabskip\!!zeropoint - \halign - {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr - \tooninstellingA{papierhoogte} \papierhoogte - \tooninstellingA{papierbreedte} \papierbreedte - \tooninstellingA{printpapierhoogte} \printpapierhoogte - \tooninstellingA{printpapierbreedte} \printpapierbreedte - \tooninstellingA{kopwit} \kopwit - \tooninstellingA{rugwit} \rugwit - \tooninstellingA{hoogte} \zethoogte - \tooninstellingA{breedte} \zetbreedte - \tooninstellingA{teksthoogte} \teksthoogte - \tooninstellingA{tekstbreedte} \tekstbreedte - \tooninstellingA{bovenafstand} \??ly - \tooninstellingA{hoofd} \hoofdhoogte - \tooninstellingA{hoofdafstand} \??ly - \tooninstellingA{boven} \bovenhoogte - \tooninstellingA{voetafstand} \??ly - \tooninstellingA{voet} \voethoogte - \tooninstellingA{onderafstand} \??ly - \tooninstellingA{onder} \onderhoogte - \tooninstellingA{linkerrand} \linkerrandbreedte - \tooninstellingA{linkerrandafstand} \??ly - \tooninstellingA{linkermarge} \linkermargebreedte - \tooninstellingA{linkermargeafstand} \??ly - \tooninstellingA{rechtermargeafstand}\??ly - \tooninstellingA{rechtermarge} \rechtermargebreedte - \tooninstellingA{rechterrandafstand} \??ly - \tooninstellingA{rechterrand} \rechterrandbreedte - \noalign{\blanko} - \tooninstellingB{korps} \the \globalbodyfontsize - \noalign{\blanko} - \tooninstellingB{regel} \relax \strutheightfactor - \tooninstellingB{hoogte} \relax \strutdepthfactor - \tooninstellingB{diepte} \relax \normallineheight - \tooninstellingB{boven} \relax \topskipfactor - \tooninstellingB{onder} \relax \maxdepthfactor}}} - -\def\toonlayout% - {\bgroup - \pagina - \toonkader - \stellayoutin[\c!markering=\v!aan] - \herhaal[4*\tooninstellingen\pagina] - \egroup} - -% - meerdere niveaus (moet niet moeilijk zijn) -% - instellingen in macro - -%I n=Opsomming -%I c=\startopsomming,\som,\sub,\kop,\sym,\mar,\but -%I c=\stelopsommingin -%I -%I Opsommingen kunnen tot op vier niveaus automatisch worden -%I aangemaakt met het commando: -%I -%I \startopsomming[aanduiding][instellingen] -%I -%I \som ........ -%I \som ........ -%I \som[referentie] ........ -%I \som ........ -%I -%I \stopopsomming -%I -%I Eventueel kan direct achter \som een [referentie] worden -%I opgegeven, zodat men bijvoorbeeld kan verwijzen naar -%I 'punt \in[referentie]' (hier punt 3). -%P -%I De volgende genummerde aanduidingen zijn mogelijk: -%I -%I wijze van 'nummeren' instelling -%I -%I 1, 2, 3, 4 n (normaal) / o (oldstyle) -%I a, b, c, d a -%I A, B, C, D A (normaal) / KA (kap) -%I i, ii, iii, iv r -%I I, II, III, IV R (normaal) / KR (kap) -%I -%I doornummeren verder -%P -%I De volgende niet-genummerde aanduidingen zijn mogelijk -%I (de aanduiding kan eventueel achterwege blijven): -%I -%I wijze van 'markeren' instelling -%I -%I dot 1 -%I streepje 2 -%I sterretje 3 -%I driehoekje 4 -%I bolletje 5 -%I groter bolletje 6 -%I nog groter bolletje 7 -%I -%I alleen inspringen leeg laten -%P -%I Het al dan niet inspringen en de eventuele ruimte tussen -%I de onderdelen wordt globaal of lokaal ingesteld met de -%I commando's: -%I -%I \stelopsommingin[niveau][instelling] -%I -%I waarbij de volgende instellingen mogelijk zijn: -%I -%I standaard standaard instellingen -%I opelkaar geen witruimte tussen onderdelen -%I aanelkaar weinig witruimte na het symbool -%I aansluitend geen wit voor en na de opsomming -%I ruim meer witruimte na het symbool (n*ruim) -%I inmarge markering in de kantlijn -%I opmarge markering op de 'kantlijn' -%I afsluiter afsluiter achter markering -%I kolommen in twee kolommen zetten -%I intro aansluiten op vorige regel(s) -%P -%I In plaats van een cijfer bij niveau kan ook het woord -%I 'elk' worden gegeven. De instellingen mogen ook direkt -%I achter de aanduiding worden meegegeven: [1,opelkaar]. -%I -%I Als alternatief voor \som is \kop beschikbaar. In dat geval -%I wordt de eerste alinea (of een eerste woord) afwijkend gezet. -%I -%I Met \sym{symbool} kan een eigen symbool worden geplaatst. -%I Als dit symbool breed is (bijvoorbeeld ++), kan men de -%I breedte aanpassen, bijvoorbeeld: \startopsomming[2*ruim]. -%I -%I Een ander alternatief is \mar{tekst}. De tekst wordt in -%I dat geval in de marge geplaatst. -%I -%I Een leeg item (dus zonder aanduiding) kan worden -%I opgeroepen met \nop. Op deze manier kunnen opsommingen in -%I kolommen worden uitgelijnd (gemanipuleerd). Het commando -%I \nop komt overeen met \sym{\strut} \strut. -%P -%I Met \som[aanduiding] (zonder \start... \stop...) kan snel een -%I opsomming met ‚‚n item worden gezet. In dat geval wordt er -%I geen referentie aangemaakt. -%I -%I Als men een item tussenvoegt maar (vooralsnog) de nummering -%I niet wil verhogen, dan kan men \sub gebruiken. Het oude nummer -%I wordt dan in het zetwerk voorafgegaan door een +. -%I -%I Interactieve items kunnen worden gemaakt met \but, waarbij -%I de bestemming tussen [] moet worden meegegeven. -%P -%I Een nauwkeuriger (globale) instelling is eveneens mogelijk met -%I het commando: -%I -%I \stelopsommingin[niveau][breedte=,voor=,tussen=,na=, -%I kopvoor=,kopna=,kopletter=,marletter=,symlettter=, -%I afsluiter=,n=,factor=,afstand=] -%I -%I Standaard gelden voor de letters de volgende instellingen: -%I -%I kopletter normaal -%I marletter type -%I symletter vet -%I -%I De commando's \sym{symbool} en \som zijn ook buiten -%I opsommingen beschikbaar. - -%T n=opsomming -%T m=ops -%T a=o -%T -%T \startopsomming -%T -%T \som ? -%T -%T \stopopsomming - -%T n=som -%T m=som -%T a=s -%T -%T \som ? - -% -% NOG [0] voor start op 0 -% - -\newif\ifsomkolommen \somkolommenfalse -\newif\ifsubsom \subsomfalse -\newif\ifsymsom \symsomfalse -\newif\ifkopsom \kopsomfalse -\newif\ifsomintro \somintrofalse -\newif\ifsomautointro \somautointrofalse -\newif\ifpackeditems \packeditemsfalse -\newif\iffirstlist \firstlistfalse - -\definetwopasslist{\s!list} - -\newcounter\noflists -\newcounter\itemlevel - -\def\dolistreference% - {\immediatewriteutilitycommand% - {\twopassentry% - {\s!list}% - {\currentlist}% - {\currentlist:\noflistelements}}} - -\def\setnextitemlevel#1% - {\doifundefined{\??op#1\c!breedte} - {\edef\itemreferences{\itemreferences,#1}% - \copyparameters - [\??op#1][\??oo] - [\c!breedte,\c!factor,\c!afstand, - \c!marletter,\c!symletter,\c!kopletter, - \c!markleur,\c!symkleur,\c!kopkleur, - \c!kopvoor,\c!kopna,\c!voor,\c!tussen,\c!na, - \c!afsluiter,\c!plaatsafsluiter, - \c!n,\c!binnen,\c!symbool,\c!marge]% - \makecounter{\s!itemcount#1}% - \setvalue{\??op\c!symbool\s!global#1}{#1}}} - -\def\maxitemlevel{0} -\def\itemreferences{0} - -\def\dostelopsommingenin[#1]% % still undocumented - {\getparameters[\??oo][\c!niveaus=4,#1]% - \ifnum\@@ooniveaus>\maxitemlevel - \edef\maxitemlevel{\@@ooniveaus}% - \herhaal[\maxitemlevel*\setnextitemlevel{\herhaler}]% - \fi} - -\def\stelopsommingenin% - {\dosingleargument\dostelopsommingenin} - -\def\doitemreference#1,#2,#3\\% - {\ifnum\itemlevel>#1 - \ifnum#1>0 - \tempsymbool - \fi - \getvalue{\??op\c!symbool#2}% - \doitemreference#2,#3\\% - \fi} - -\def\itemreference% - {\expandafter\doitemreference\itemreferences,,\\} - -\def\itemuse#1% - {\getvalue{\??op\itemlevel#1}}% - -\def\packitems% - {\ifnum\itemlevel=0 \else\packeditemstrue\fi} - -\def\dostelopsomminginvariable[#1][#2]% niveau instellingen - {\doifelsenothing{#1} - {\getparameters[\??op\itemlevel][#2]}% - {\getparameters[\??op#1][#2]}} - -\def\dododostelopsomminginconstant[#1][#2#3]% - {\processaction - [#2#3] - [ \v!opelkaar=>\packitems, - \v!intro=>\somintrotrue, - \v!autointro=>\somautointrotrue, - \v!ruim=>{\doassign[\??op#1][\c!factor=1]}, - #2*\v!ruim=>{\doassign[\??op#1][\c!factor=#2]}, - \v!marge=>{\doassign[\??op#1][\c!breedte=-2em]}, % signal - \v!inmarge=>{\doassign[\??op#1][\c!breedte=-2em]}, % signal - \v!opmarge=>\doifnot{#1}{1}{\doassign[\??op#1][\c!breedte=0em]}, % signal - \v!kolommen=>\packitems, - \v!aansluitend=>{\getparameters[\??op#1] - [\c!kopvoor=,\c!kopna=, - \c!voor=,\c!tussen=,\c!na=]% - \packitems}, - \v!aanelkaar=>{\doassign[\??op#1][\c!factor=-1]}, - #2*\v!aanelkaar=>{\doassign[\??op#1][\c!factor=-#2]}, - \v!afsluiter=>{\doassign[\??op#1][\c!plaatsafsluiter=\v!ja]}, - \v!standaard=>{\getparameters[\??op#1] - [\c!breedte=1.5em, - \c!factor=0, - \c!afstand=.5em, - \c!kopvoor=, - \c!kopna=\blanko, - \c!voor=\blanko, - \c!tussen=\blanko, - \c!na=\blanko, - \c!binnen=]}]} - -\def\dostelopsomminginconstant[#1][#2]% - {\def\dodostelopsomminginconstant##1% - {\dododostelopsomminginconstant[#1][##1]}% - \processcommalist[#2]\dodostelopsomminginconstant} - -\def\dodododostelopsommingin[#1][#2]% - {\ConvertToConstant\doifinstringelse{=}{#2} - {\dostelopsomminginvariable[#1][#2]} - {\setvalue{\??op#1}{\dostelopsomminginconstant[#1][#2]}}}% - -\def\dododostelopsommingin[#1][#2]% - {\ConvertToConstant\doifnot{#2}{} - {\doifelse{#1}{\v!elk} - {\herhaal[\maxitemlevel*{\ExpandFirstAfter\dodododostelopsommingin[\herhaler][#2]}]} - {\ExpandFirstAfter\dodododostelopsommingin[#1][#2]}}} - -\def\dodostelopsommingin[#1][#2]% - {\ConvertToConstant\doifelse{#2}{} - {\ifnum\itemlevel=0\relax - \dododostelopsommingin[\v!elk][#1]% - \else - \dododostelopsommingin[\itemlevel][#1]% - \fi} - {\doifelsenothing{#1} - {\dododostelopsommingin[\itemlevel][#2]} - {\dododostelopsommingin[#1][#2]}}} - -\def\dostelopsommingin[#1][#2][#3]% - {\dodostelopsommingin[#1][#2]% - \ConvertToConstant\doifnot{#3}{} % anders wordt #2 overruled - {\dodostelopsommingin[#1][#3]}} - -\def\stelopsommingin% - {\dotripleempty\dostelopsommingin} - -\def\doadvanceitem% - {\ifsubsom\else\ifsymsom\else - \pluscounter{\s!itemcount\itemlevel}% - \fi\fi} - -\def\setitemlevel#1% - {\ifnum\itemlevel>0\relax - \firstlisttrue - \doifnotinset{\v!verder}{#1} - {\resetcounter{\s!itemcount\itemlevel}}% - \def\tempnumber% - {\countervalue{\s!itemcount\itemlevel}}% - \doifelsevalue{\??op\itemlevel\c!plaatsafsluiter}{\v!ja} - {\def\tempsymbool{\getvalue{\??op\itemlevel\c!afsluiter}}} - {\def\tempsymbool{}}% - \fi} - -\def\setitemmark#1% % maakt gebruik van \??ss en \??cv - {\doifdefinedelse{\??ss#1} % en pas op: resets \docommando - {\setxvalue{\??op\c!symbool\s!global\itemlevel}% - {#1}% - \setgvalue{\??op\c!symbool\s!local\itemlevel}% - {?}% - \def\listitem% - {\symbol[#1]}% - \def\docommando##1{}} - {\doifdefined{\??cv#1} - {\setxvalue{\??op\c!symbool\s!global\itemlevel}% - {#1}% - \setgvalue{\??op\c!symbool\s!local\itemlevel}% - {\convertnumber{#1}{\countervalue{\s!itemcount\itemlevel}}}% - \def\listitem% - {\getvalue{\??op\c!symbool\s!local\itemlevel}\tempsymbool}% - \def\docommando##1{}}}} - -\def\calculatelistwidth#1#2% - {#2=\getvalue{\??op#1\c!afstand}\relax - \multiply#2 by \getvalue{\??op#1\c!factor}\relax - \advance#2 by \getvalue{\??op#1\c!breedte}\relax} - -\def\dodostartopsomming[#1][#2]% - {\ifhmode - \par - \fi - \ifnum\itemlevel=\maxitemlevel\relax - \showmessage{\m!layouts}{9}{\maxitemlevel}% - \def\itemincrement{0}% - \else - \def\itemincrement{1}% - \fi - \doglobal\increment(\itemlevel,\itemincrement)% - \begingroup - \ifnum\itemlevel=1 % NIEUW - \doifelsevalue{\??op1\c!marge}{\v!standaard} - {\ifdim\voorwit=\!!zeropoint - \advance\leftskip by \@@sllinks - \else - \advance\leftskip by \voorwit - \fi} - {\advance\leftskip by \getvalue{\??op1\c!marge}}% - \fi - \doifinset{\v!kolommen}{#1}% - {\ifbinnenkolommen\else - \global\somkolommentrue - \getvalue{\??op\itemlevel\c!voor}% - \processfirstactioninset - [#1] - [ \v!een=>\!!counta=1\relax, - \v!twee=>\!!counta=2\relax, - \v!drie=>\!!counta=3\relax, - \v!vier=>\!!counta=4\relax, - \v!vijf=>\!!counta=5\relax, - \s!unknown=>\@EA\!!counta\getvalue{\??op\itemlevel\c!n}]% - \startkolommen - [\c!n=\!!counta, - \c!hoogte=, - \c!lijn=\v!uit, - \c!balanceren=\v!ja, - \c!uitlijnen=\v!nee]% - \fi}% - \doifinsetelse{\v!intro}{#1} - {\somintrotrue} - {\somintrofalse}% - \doglobal\increment\noflists - \let\currentlist=\noflists - \newcounter\noflistelements - \kopsomfalse - \subsomfalse - \symsomfalse - \let\marsymbol=\relax - \let\somdestination=\empty - \def\symsymbol{}% - \def\som% - {\dosom}% - \def\but[##1]% - {\def\somdestination{##1}% - \dosom}% - \def\nop% - {\sym{\strut}\strut}% - \definecomplexorsimple\its - \setvalue{\v!mar}##1% - {\def\marsymbol% - {\llap - {\doattributes{\??op\itemlevel\v!mar}{##1}% - \hskip\leftskip\hskip\linkermargeafstand}}% - \dosom}% - \setvalue{\v!kop}% - {\kopsomtrue\dokop}% - \setvalue{\v!sub}% - {\subsomtrue\dosom}% - \setvalue{\v!sym}##1% - {\def\symsymbol% - {\doattributes{\??op\itemlevel\v!sym}{##1}}% - \symsomtrue - \dosom}% - \setvalue{\v!its}% - {\getvalue{\v!sym}% - {\calculatelistwidth{\itemlevel}{\dimen0}% - \hbox to \dimen0 - {\dorecurse{\getvalue{\??op\itemlevel\c!items}}{\listitem\hss}% - \unskip - \hskip\getvalue{\??op\itemlevel\c!afstand}}}}% - \setitemlevel{#1}% - \getvalue{\??op\itemlevel}% - \doifelsenothing{#1} % iffirstargument - {\edef\@@opsymbool{\getvalue{\??op\itemlevel\c!symbool}}% - \setgvalue{\??op\c!symbool\s!global\itemlevel}{}% - \setgvalue{\??op\v!verder\itemlevel}{}% - \setitemmark{\@@opsymbool}% - \dostelopsomminginvariable[\itemlevel][#2]} - {\dostelopsomminginconstant[\itemlevel][#1]% - \dostelopsomminginvariable[\itemlevel][#2]% - \doifinsetelse{\v!verder}{#1}% - {\edef\@@opsymbool{\getvalue{\??op\c!symbool\s!global\itemlevel}}% - \getvalue{\??op\v!verder\itemlevel}} - {\edef\@@opsymbool{\getvalue{\??op\itemlevel\c!symbool}}% - \setgvalue{\??op\v!verder\itemlevel}% - {\dostelopsomminginconstant[\itemlevel][#1]% - \dostelopsomminginvariable[\itemlevel][#2]}}% - \def\docommando{\setitemmark}% \setitemmark resets \docommando - \processcommalist[#1,\@@opsymbool]\docommando}% - \ifsomautointro\ifnum\prevgraf<3 - \somintrotrue - \fi\fi - \ifpackeditems - \doassign[\??op\itemlevel][\c!tussen=]% - \fi - \calculatelistwidth{\itemlevel}{\dimen0}% - \ifdim\dimen0>\!!zeropoint\relax - \advance\leftskip by \dimen0\relax - \fi} - -\def\dostartopsomming[#1][#2]% - {\ifsecondargument - \dodostartopsomming[#1][#2]% - \else - \doifassignmentelse{#1} - {\dodostartopsomming[][#1]} - {\dodostartopsomming[#1][]}% - \fi} - -\def\startopsomming% - {\bgroup - \dodoubleempty\dostartopsomming} - -\def\stopopsomming% - {\par - \dolistreference - \endgroup - \ifsomkolommen - \global\somkolommenfalse - \stopkolommen - \getvalue{\??op\itemlevel\c!na}% - \else - \ifnum\itemlevel=1\relax - \dosomebreak\allowbreak % toegevoegd - \getvalue{\??op1\c!na}% - \fi - \fi - \endgroup - \doglobal\decrement(\itemlevel,\itemincrement)% - \egroup} - -\def\sombreak% - {\flushfootnotes\penalty-5\relax} % -10 - -\def\somnobreak% - {\flushfootnotes\penalty+5\relax} % \nobreak - -\def\dolistitem% - {\par - \ignorespaces - \increment\noflistelements - \ifnum\noflistelements=1\relax % als gevolg van nesting - \findtwopassdata{\s!list}{\noflists:}% % van wordt soms de volgorde - \fi % verstoord, vandaar \find - \ifsomkolommen\else - \iftwopassdatafound - \ifnum\twopassdata=3\relax - \ifnum\noflistelements>1\relax - \dosomebreak\somnobreak - \fi - \else\ifnum\twopassdata>3\relax - \ifnum\noflistelements=2\relax - \ifsomkolommen\else - \ifsomintro - \dosomebreak\nobreak - \else - \dosomebreak\somnobreak - \fi - \fi - \else\ifnum\twopassdata=\noflistelements\relax - \dosomebreak\somnobreak - \else\ifnum\noflistelements>2\relax - \dosomebreak\sombreak - \else - \ifsomintro\else\dosomebreak\sombreak\fi - \fi\fi\fi - \fi\fi - \fi - \fi - \noindent - \ifkopsom - \setbox8=\hbox{\doattributes{\??op\itemlevel\v!kop}{\listitem}}% - \else\ifsymsom - \setbox8=\hbox{\symsymbol}% - \else - \setbox8=\hbox{\listitem}% - \fi\fi - \doifsomething{\somdestination} - {\setbox8=\hbox{\naar{\copy8}[\somdestination]}}% - \dimen2=\getvalue{\??op\itemlevel\c!breedte}\relax - \ifdim\dimen2<\!!zeropoint\relax - \llap{\ifsubsom\llap{+}\fi\box8\hskip\linkermargeafstand}% - \else - \ifdim\dimen2=\!!zeropoint\relax - \calculatelistwidth{1}{\dimen0}% - \else - \calculatelistwidth{\itemlevel}{\dimen0}% - \fi - \llap{\hbox to \dimen0{\ifsubsom\llap{+}\fi\box8\hfill}}% - \fi - \setevalue{\??op\c!symbool\itemlevel}% - {\getvalue{\??op\c!symbool\s!local\itemlevel}}% - \kopsomfalse - \subsomfalse - \symsomfalse - \EveryPar{\ignorespaces}% - \ignorespaces} - -\def\complexdosom[#1]% - {\par - \ignorespaces - \doadvanceitem - \ifsomkolommen\else - \ifnum\noflistelements>0\relax\dosomebreak\nobreak\fi - \fi - \iffirstlist - \firstlistfalse - \begingroup - \ifcase\itemlevel - \or % 1 - \ifsomkolommen\else - \ifsomintro\dosomebreak\nobreak\fi - \getvalue{\??op1\c!voor}% - \ifsomintro\dosomebreak\nobreak\fi - \fi - \else % 2 en hoger - \let\previtemlevel=\itemlevel - \decrement\previtemlevel - \getvalue{\??op\previtemlevel\c!tussen}% = itemlevel-1 - \fi - \else - \itemuse{\c!tussen}% - \fi - \ignorespaces - \dolistitem - \ifpackeditems - \stelwitruimtein[\v!geen]% - \fi - \itemuse{\c!binnen}% - \marsymbol - \let\marsymbol=\relax - \doifsomething{#1} - {\bgroup - \protectconversion - \rawreference{\s!lst}{#1}{\itemreference}% - \egroup}% - \ignorespaces} - -\def\complexsom[#1]#2\par% - {\startopsomming[#1] - \complexdosom[]\ignorespaces#2\par - \stopopsomming} - -\def\som% - {\complexorsimpleempty{som}} - -\def\dosom% - {\complexorsimpleempty{dosom}} - -\def\complexdokop[#1]#2\par% - {\ifpackeditems\else\itemuse{\c!kopvoor}\fi% - \dosomebreak{\pagina[\v!voorkeur]}% geen \goodbreak ! \allowbreak testen - \complexdosom[#1]{\doattributes{\??op\itemlevel\v!kop}{\ignorespaces#2}}\par% - \ifpackeditems\else\itemuse{\c!kopna}\fi% - \dosomebreak\nobreak} - -\def\complexkop[#1]#2\par#3\par% - {\startopsomming[#1]% - \complexdokop[]\ignorespaces#2\par#3\par% - \stopopsomming} - -\setvalue{\v!kop}% - {\complexorsimpleempty{kop}} - -\def\dokop% - {\complexorsimpleempty{dokop}} - -\def\sym#1% - {\noindent - \setbox0=\hbox{#1}% - \ifdim\wd0<1em\relax - \setbox0=\hbox to 1.5em{#1\hfil}% - \else - \setbox0=\hbox spread 1em{#1\hfil}% - \fi - \hangindent=\wd0\relax - \box0 - \ignorespaces} - -%I n=Doordefinieren -%I c=\doordefinieren,\steldoordefinierenin -%I -%I Er kunnen (eenvoudige) definitie-lijsten worden -%I gemaakt met behulp van het commando: -%I -%I \doordefinieren[naam][plaats=,breedte=,uitlijnen=, -%I monster=,letter=,kopletter=,voor=,tussen=,na=,hang=, -%I inspringen=,tekst=] -%I -%I Een definitie is vervolgens op naam op te roepen: -%I -%I \naam{begrip} definitie -%P -%I Een definitie heeft de vorm: -%I -%I links Dit is een linker tekst. Een tekst wordt -%I links geplaatst als 'links' wordt meegegeven. -%I -%I Dit is een rechter tekst. Een tekst wordt rechts -%I rechts geplaatst als 'rechts' wordt meegegeven. -%I -%I boven -%I -%I Dit is een tekst waarbij het woord erboven staat. Voor -%I dit soort teksten wordt 'boven' meegegeven. -%I -%I Tot slot is het mogelijk de tekst in de marge of -%I aansluitend te plaatsen, in dat geval wordt 'inmarge', -%I 'inlinker', 'inrechter' of 'aanelkaar' meegegeven. -%P -%I Aan 'voor', 'tussen' of 'na' kan een commando worden -%I toegekend, bijvoorbeeld \blanko[groot]. Als letter kan -%I normaal, vet, kapitaal, type, schuin, klein en kleinvet -%I worden meegegeven. -%I -%I Als 'breedte' kan een maat worden meegegeven of een van de -%I instellingen 'passend' en 'ruim'. In dat geval wordt de -%I aan 'monster' toegekende tekst als uitgangspunt genomen. -%P -%I Met 'hang' kan men aangeven hoe lang er links of rechts -%I moet worden ingesprongen. Er kan een aantal regels worden -%I meegegeven maar ook 'passend' of 'ruim'. Een overgang naar -%I een nieuwe regel binnen een linker- of rechtertekst wordt -%I afgedwongen met \\ (vergelijk \margeteksten). -%I -%I Defaultwaarden kunnen worden ingesteld met het commando: -%I -%I \steldoordefinierenin[instellingen] -%I -%I Het tussentijds bijstellen van de instellingen is mogelijk -%I met: -%I -%I \steldoordefinieren[naam][instellingen] - -% Dit kan en moet dus anders: -% -% \start... : \vbox\bgroup -% \stop... : \egroup -% llap enz. -% geen indent! -% -% enz. enz. -% -% Op die manier is meer mogelijk en worden \par's geskipt. - -% De macro's \??dd#1\c!lokaal en \??dd#1\c!commando leveren -% de koppeling tussen \doornummeren en \doordefinieren. Deze -% constructie is nodig omdat doornummeren geen argument -% heeft en omdat subnummers niet worden genest binnen -% het hogere niveau. Het commando \??dd#1\s!do\c!commando -% moet in dat geval \v!ja zijn. - -% herimplementeren met \nextbox en \unhbox\unvbox - -\newbox\@@definitiebox - -% \setvalue{@@dodefinitiewoord\v!links}#1% -% {\hbox to \!!widtha{#1\hss}} -% \setvalue{@@dodefinitiewoord\v!rechts}#1% -% {\hbox to \!!widtha{\hss#1}} -% \setvalue{@@dodefinitiewoord\v!midden}#1% -% {\hbox to \!!widtha{\hss#1\hss}} -% \setvalue{@@dodefinitiewoord}#1% -% {#1} -% -% \def\@@definitiewoord#1% -% {\getvalue{\??dd#1\c!commando}{#1}} -% -% \def\normal@@definitiewoord#1[#2]#3% -% {\bgroup -% \getvalue{@@dodefinitiewoord\getvalue{\??dd#1\c!uitlijnen}} -% {\doattributes{\??dd#1\v!kop}{\strut\getvalue{\??dd#1\c!tekst}#3}}% -% \rawreference{\s!def}{#2}{#3}% -% \egroup} -% -% \def\@@definitielinks#1[#2]#3% -% {\doifelsevaluenothing{\??dd#1\c!hang} -% {\@@definitielinkspure{#1}[#2]{#3}} -% {\@@definitielinkshang{#1}[#2]{#3}}} -% -% \def\@@definitierechts#1[#2]#3% -% {\doifelsevaluenothing{\??dd#1\c!hang} -% {\@@definitierechtspure{#1}[#2]{#3}} -% {\@@definitierechtshang{#1}[#2]{#3}}} -% -% \def\@@definitielinkspure#1[#2]#3% -% {\@@dostartdefinitie{#1}{#3}% -% \advance\leftskip by \!!widtha -% \llap -% {\hbox to \!!widtha{\@@definitiewoord{#1}[#2]{#3}% -% \hss}}% -% \@@dodefinitie{#1}} -% -% \def\@@definitierechtspure#1[#2]#3% -% {\@@dostartdefinitie{#1}{#3}% -% \advance\rightskip by \!!widtha -% \rlap -% {\hskip\hsize -% \hskip-\leftskip -% \hskip-\rightskip -% \hbox to \!!widtha{\hss\@@definitiewoord{#1}[#2]{#3}}}% -% \@@dodefinitie{#1}} -% -% \def\@@makedefinitiebox#1[#2]#3#4% -% {\setbox\@@definitiebox=\vtop % \vbox gaat fout in hang -% {\forgetall -% \hsize\!!widtha -% #4% -% \def\\{\endgraf}% -% \@@definitiewoord{#1}[#2]{\begstrut#3\endstrut}}% -% \ht\@@definitiebox=\ht\strutbox -% \dp\@@definitiebox=\dp\strutbox -% \doifinsetelse{\getvalue{\??dd#1\c!hang}}{\v!passend,\v!ruim} -% {\dimen0=\ht\@@definitiebox -% \advance\dimen0 by \dp\@@definitiebox -% \doifvalue{\??dd#1\c!hang}{\v!ruim} -% {\advance\dimen0 by .5\ht\strutbox}% -% \getnoflines{\dimen0}% -% \hangafter=-\noflines} -% {\hangafter=-\getvalue{\??dd#1\c!hang}}}% -% -% \def\@@definitielinkshang#1[#2]#3% -% {\@@dostartdefinitie{#1}{#3}% -% \mindermeldingen -% \hangindent=\!!widtha\relax -% \@@makedefinitiebox{#1}[#2]{#3}{}% -% \llap -% {\dontshowcomposition -% \vtop to \!!zeropoint{\box\@@definitiebox}}% -% \@@dodefinitie{#1}}% -% -% \def\@@definitierechtshang#1[#2]#3% -% {\@@dostartdefinitie{#1}{#3}% -% \mindermeldingen -% \hangindent=-\!!widtha\relax -% \@@makedefinitiebox{#1}[#2]{#3}{\raggedleft}% -% \rlap -% {\dontshowcomposition -% \dimen0=\hsize -% \advance\dimen0 by -\leftskip -% \advance\dimen0 by -\rightskip -% \hbox to \dimen0 -% {\hss -% \vtop to \!!zeropoint{\box\@@definitiebox}}}% -% \@@dodefinitie{#1}} -% -% \def\@@definitieboven#1[#2]#3% -% {%\pagina[\v!voorkeur]% % Weg ermee! -% \dosomebreak{\goodbreak}% % Dit is beter en nodig! -% \@@dostartdefinitie{#1}{#3}% -% \@@definitiewoord{#1}[#2]{#3}% -% \nobreak -% \getvalue{\??dd#1\c!tussen}% -% \@@dodefinitie{#1}} -% -% \def\@@definitieinmarge#1[#2]#3% -% {\@@dostartdefinitie{#1}{#3}% -% \inmarge{\@@definitiewoord{#1}[#2]{#3}}% -% \@@dodefinitie{#1}} -% -% \def\@@definitieinlinker#1[#2]#3% -% {\@@dostartdefinitie{#1}{#3}% -% \inlinker{\@@definitiewoord{#1}[#2]{#3}}% -% \@@dodefinitie{#1}} -% -% \def\@@definitieinrechter#1[#2]#3% -% {\@@dostartdefinitie{#1}{#3}% -% \inrechter{\@@definitiewoord{#1}[#2]{#3}}% -% \@@dodefinitie{#1}} -% -% \def\@@definitieaanelkaarpassend#1[#2]#3% -% {\@@dostartdefinitie{#1}{#3}% -% \@@definitiewoord{#1}[#2]{#3}% -% \tfskip % nog afstand implementeren -% \@@dodefinitie{#1}} -% -% \def\@@definitieaanelkaarbreed#1[#2]#3% -% {\@@dostartdefinitie{#1}{#3}% -% \ignorespaces -% \hbox to \!!widtha -% {\@@definitiewoord{#1}[#2]{#3}% -% \tfskip -% \hss}% % nog afstand implementeren -% \@@dodefinitie{#1}} -% -% \def\@@definitieaanelkaar#1[#2]#3% -% {\doifinsetelse{\getvalue{\??dd#1\c!breedte}}{\v!passend,\v!ruim}% -% {\@@definitieaanelkaarpassend{#1}[#2]{#3}}% -% {\@@definitieaanelkaarbreed{#1}[#2]{#3}}} -% -% \def\@@dostartdefinitie#1#2% -% {\getvalue{\??dd#1\c!voor}% -% \begingroup -% %\showcomposition -% \assignwidth -% {\!!widtha} -% {\getvalue{\??dd#1\c!breedte}} -% {\doattributes -% {\??dd#1\v!kop} -% {\getvalue{\??dd#1\c!tekst}% -% \doifelsevaluenothing{\??dd#1\c!monster} -% {#2} -% {\getvalue{\??dd#1\c!monster}}}} -% {1em}% -% \getvalue{\??dd#1\c!lokaal}% -% \parindent=\!!zeropoint\relax -% \noindent -% \ignorespaces} - -\def\@@definitiewoord#1% - {\getvalue{\??dd#1\c!commando}{#1}} - -\def\normal@@definitiewoord#1[#2]#3% - {\doattributes - {\??dd#1\v!kop} - {\begstrut\getvalue{\??dd#1\c!tekst}#3\endstrut}% - \rawreference{\s!def}{#2}{#3}} - -\def\@@definitielinks#1% - {\@@definitiehang{#1}\@@definitielinkspure\@@definitielinkshang} - -\def\@@definitierechts#1% - {\@@definitiehang{#1}\@@definitierechtspure\@@definitierechtshang} - -\def\@@definitiehang#1#2#3% - {\processaction - [\getvalue{\??dd#1\c!hang}] - [ \v!geen=>\let\next=#2, - 0=>\let\next=#2, - \s!unknown=>\let\next=#3, - \s!default=>\let\next=#2]% - \next{#1}} - -\def\@@definitielinkspure#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \advance\leftskip by \!!widtha - \@@makedefinitiepurebox{#1}\raggedright% - \advance\leftskip by \!!widthb - \llap - {\hbox to \leftskip{\copy\@@definitiebox\hss}}% - \@@dodefinitie{#1}} - -\def\@@definitierechtspure#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \advance\rightskip by \!!widtha - \@@makedefinitiepurebox{#1}\raggedleft% - \rlap - {\hskip\hsize - \hskip-\leftskip - \hskip-\rightskip - \copy\@@definitiebox}% - \advance\rightskip by \!!widthb - \@@dodefinitie{#1}} - -\def\@@makedefinitiepurebox#1#2% - {\setbox\@@definitiebox=\vtop - {\hsize\!!widtha - \leftskip\!!zeropoint - \rightskip\!!zeropoint - #2\steluitlijnenin[\getvalue{\??dd#1\c!uitlijnen}]% - \unhcopy\@@definitiebox}% - \ht\@@definitiebox=\ht\strutbox - \dp\@@definitiebox=\dp\strutbox} - -\def\@@definitielinkshang#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \mindermeldingen - \advance\!!widtha by \!!widthb - \hangindent=\!!widtha - \@@makedefinitiehangbox{#1}{\raggedright}{\advance\rightskip by \!!widthb}% - \llap - {\dontshowcomposition - \vtop to \!!zeropoint{\box\@@definitiebox}}% - \@@dodefinitie{#1}}% - -\def\@@definitierechtshang#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \mindermeldingen - \advance\!!widtha by \!!widthb - \hangindent=-\!!widtha - \@@makedefinitiehangbox{#1}{\raggedleft}{\advance\leftskip by \!!widthb}% - \rlap - {\dontshowcomposition - \dimen0=\hsize - \advance\dimen0 by -\leftskip - \advance\dimen0 by -\rightskip - \hbox to \dimen0 - {\hss\vtop to \!!zeropoint{\box\@@definitiebox}}}% - \@@dodefinitie{#1}} - -\def\@@makedefinitiehangbox#1#2#3% - {\setbox\@@definitiebox=\vtop % \vbox gaat fout in hang - {\forgetall - \hsize\!!widtha - #2\steluitlijnenin[\getvalue{\??dd#1\c!uitlijnen}]#3% - \unhcopy\@@definitiebox}% - \ht\@@definitiebox=\ht\strutbox - \dp\@@definitiebox=\dp\strutbox - \doifinsetelse{\getvalue{\??dd#1\c!hang}}{\v!passend,\v!ruim} - {\dimen0=\ht\@@definitiebox - \advance\dimen0 by \dp\@@definitiebox - \doifvalue{\??dd#1\c!hang}{\v!ruim} - {\advance\dimen0 by .5\ht\strutbox}% - \getnoflines{\dimen0}% - \hangafter=-\noflines} - {\hangafter=-\getvalue{\??dd#1\c!hang}}}% - -\def\@@definitieboven#1[#2]#3% - {%\pagina[\v!voorkeur]% % Weg ermee! - \dosomebreak{\goodbreak}% % Dit is beter en nodig! - \@@dostartdefinitie{#1}[#2]{\let\\=\space#3}% - \copy\@@definitiebox - \nobreak - \getvalue{\??dd#1\c!tussen}% - \@@dodefinitie{#1}} - -\def\@@definitieinmarge#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \inmarge{\unhcopy\@@definitiebox}% - \@@dodefinitie{#1}} - -\def\@@definitieinlinker#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \inlinker{\unhcopy\@@definitiebox}% - \@@dodefinitie{#1}} - -\def\@@definitieinrechter#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \inrechter{\unhcopy\@@definitiebox}% - \@@dodefinitie{#1}} - -\def\@@definitieaanelkaarpassend#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \unhcopy\@@definitiebox - \@@dodefinitie{#1}} - -\def\@@definitieaanelkaarruim#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \hbox spread \!!widthb - {\unhcopy\@@definitiebox\hss}% - \@@dodefinitie{#1}} - -\def\@@definitieaanelkaarbreed#1[#2]#3% - {\@@dostartdefinitie{#1}[#2]{#3}% - \hbox to \!!widtha - {\unhcopy\@@definitiebox\hss}% - \kern\!!widthb - \ignorespaces - \@@dodefinitie{#1}} - -\def\@@definitieaanelkaar#1[#2]#3% - {\processaction - [\getvalue{\??dd#1\c!breedte}] - [\v!passend=>\let\next=\@@definitieaanelkaarpassend, - \v!ruim=>\let\next=\@@definitieaanelkaarruim, - \s!unknown=>\let\next=\@@definitieaanelkaarbreed, - \s!default=>\let\next=\@@definitieaanelkaarruim]% - \next{#1}[#2]{#3}} - -\def\@@dostartdefinitie#1[#2]#3% - {\getvalue{\??dd#1\c!voor}% - \begingroup - \showcomposition - \setbox\@@definitiebox=\hbox - {\forgetall - \def\\{\crcr}% - \doattributes - {\??dd#1\v!kop} - {\@@definitiewoord{#1}[#2]{\vbox{\halign{\strut##\hss\cr#3\crcr}}}}}% - \!!widthb=\getvalue{\??dd#1\c!afstand}\relax - \ifdim\!!widthb=\!!zeropoint\relax - \doifvalue{\??dd#1\c!breedte}{\v!ruim}{\!!widthb=1em}% - \fi - \assignwidth - {\!!widtha} - {\getvalue{\??dd#1\c!breedte}} - {\doifelsevaluenothing{\??dd#1\c!monster} - {\unhcopy\@@definitiebox} - {\doattributes{\??dd#1\v!kop} - {\getvalue{\??dd#1\c!tekst}\getvalue{\??dd#1\c!monster}}}} - {\!!widthb}% - \getvalue{\??dd#1\c!lokaal}% - \parindent=\!!zeropoint\relax - \noindent - \ignorespaces} - -\def\@@stopdefinitie#1% - {\par - \dostopattributes - \endgroup - \egroup % temporary hack - \getvalue{\??dd#1\c!na}% - \pagina[\v!voorkeur]} % toegevoegd maar heroverwegen - -\def\@@dodefinitie#1% - {\dostartattributes - {\??dd#1} - {}% - \ignorespaces} - -\def\@@somedefinitie#1[#2]#3% - {\bgroup % temporary hack - \BeforePar{\getvalue{\??dd#1}[#2]{#3}}% - \AfterPar{\@@stopdefinitie{#1}}% - \GetPar} - -\def\@@startdefinitie#1[#2]#3% - {\bgroup % temporary hack - \BeforePar{\getvalue{\??dd#1}[#2]{#3}}% - \GotoPar} - -\def\dodosteldoordefinierenin[#1][#2]% - {\getparameters[\??dd#1][#2]} - -\def\dosteldoordefinierenin[#1][#2]% - {\ConvertToConstant\doifelse{#2}{} - {\dodosteldoordefinierenin[][#1]} - {\dodoubleargumentwithset\dodosteldoordefinierenin[#1][#2]}} - -\def\steldoordefinierenin% - {\dodoubleempty\dosteldoordefinierenin} - -% kan zonder \interfaced wanneer \setvalue{...\v!...} - -\def\executedoordefinitie#1[#2]% - {\ExpandAfter\doifundefined{@@definitie\interfaced{\getvalue{\??dd#1\c!plaats}}} - {\setvalue{\??dd#1\c!plaats}{\v!links}}% - \getvalue{@@definitie\interfaced{\getvalue{\??dd#1\c!plaats}}}{#1}[#2]} - -\def\dodoordefinieren[#1][#2]% - {\copyparameters[\??dd#1][\??dd] - [\c!plaats,\c!kopletter,\c!letter,\c!kleur,\c!kopkleur, - \c!breedte,\c!hang,\c!monster,\c!voor,\c!tussen,\c!na, - \c!uitlijnen,\c!inspringen,\c!tekst,\c!afstand]% - \getparameters[\??dd#1] - [\s!do\c!commando=\v!nee, - \c!commando=\normal@@definitiewoord, - \c!lokaal=, - #2]% - \doifvalue{\??dd#1\c!plaats}{\v!boven}% - {\doassign[\??dd#1][\c!tussen={\blanko}]}% - \setvalue{\??dd#1}[##1]% - {\executedoordefinitie{#1}[##1]}% - \doifelsevalue{\??dd#1\s!do\c!commando}{\v!ja} - {\setvalue{\s!complex\??dd#1}[##1]% - {\@@somedefinitie{#1}[##1]{}}% - \setvalue{\s!complex\??dd\s!start#1}[##1]% - {\@@startdefinitie{#1}[##1]{}}}% - {\setvalue{\s!complex\??dd#1}[##1]% - {\dowithwargument{\@@somedefinitie{#1}[##1]}}% - \setvalue{\s!complex\??dd\s!start#1}[##1]% - {\dowithwargument{\@@startdefinitie{#1}[##1]}}}% - \setvalue{#1}% - {\complexorsimpleempty{\??dd#1}}% - \setvalue{\e!start#1}% - {\complexorsimpleempty{\??dd\s!start#1}}% - \setvalue{\e!stop#1}% - {\@@stopdefinitie{#1}}}% - -\def\doordefinieren% - {\dodoubleemptywithset\dodoordefinieren} - -%I n=Doornummeren -%I c=\doornummeren,\steldoornummerenin -%I c=\reset,\volgende,\vorige -%I -%I Het is mogelijk door een tekst heen genummerde opsommingen -%I te gebruiken. Het beschikbare commando is: -%I -%I \doornummeren[naam][plaats=,niveaus=,conversie=, -%I kopletter=,letter=,breedte=,monster=,tekst=,voor=,tussen=, -%I na=,wijze=,blok=,scheider=,afsluiter=,hang=,links=,rechts=, -%I sectienummer=,nummer=,koppeling=,uitlijnen=,inspringen] -%I -%I De naam bestaat uit letters. -%I -%I Na het commando 'doornummeren' zijn de volgende commando's -%I beschikbaar: -%I -%I \naam -%I \subnaam -%I \subsubnaam -%I -%I waarbij naam staat voor de opgegeven naam. -%P -%I Dit commando komt in grote lijnen overeen met het -%I commando \doordefinieren. Als de plaats 'links' is -%I en de tekst is 'vraag', dan krijgen we na het -%I geven van \vraag Wat ... was?: -%I -%I vraag 1 Wat zouden we krijgen als de plaats 'rechts' -%I en de tekst 'antwoord' was? -%I -%I We kunnen een referentie meegeven, dus \vraag[ref]. Als -%I we geen nummer willen, maar wel de tekst, dan is de -%I aanroep \vraag[-]. Er wordt in dat geval niet opgehoogd. -%I Hetzelfde kan worden bereikt door 'nummer' de waarde -%I nee te geven. -%P -%I De wijze waarop het laatste niveau wordt weergegeven kan -%I worden ingesteld met conversie: cijfers, letters, Letters, -%I romeins en Romeins). Conversie heeft pas effect als ook -%I niveaus is ingesteld (2 of 3, standaard 3). -%I -%I Voor of na de te nummeren tekst op te nemen commando's -%I kunnen worden ingesteld. Ook kan een voor het nummer op te -%I nemen tekst worden meegegeven en kan de plaats van de tekst -%I en het nummer worden ingesteld (… la \doordefinieren!). -%I -%I Er kan een koppeling worden gelegd met een ander item. Zo -%I kunnen bijvoorbeeld vragen worden gekoppeld aan antwoorden. -%I Dergelijke koppelingen hebben pas betekenis bij -%I interactieve teksten. -%I -%I Defaultwaarden kunnen worden ingesteld met het commando: -%I -%I \steldoornummerenin[instellingen] -%P -%I Het is mogelijk het nummeren opnieuw te starten met het -%I commando: -%I -%I \reset<naam> -%I -%I en een (sub)nummer op te hogen met: -%I -%I \volgende<naam> -%I \volgendesub<naam> -%I -%I Het tussentijds bijstellen van de instellingen is mogelijk -%I met: -%I -%I \steldoornummerenin[naam][instellingen] - -\def\showdnpuretext#1% - {\strut\getvalue{\??dd#1\c!tekst} } - -\def\showdntext#1% - {\doifelsevaluenothing{\??dd#1\c!tekst} - {\ignorespaces} - {\strut\getvalue{\??dd#1\c!tekst}\fixedspace}} - -\def\showdnnummer#1% - {\voorafgaandenummer% - \nummer[\getvalue{\??dd#1\??dd\c!nummer}]} - -\def\showdnsubnummer#1% - {\showdnnummer{#1}% - \getvalue{\??dd#1\c!scheider}% - \nummer[\v!sub\getvalue{\??dd#1\??dd\c!nummer}]} - -\def\showdnsubsubnummer#1% - {\showdnsubnummer{#1}% - \getvalue{\??dd#1\c!scheider}% - \nummer[\v!sub\v!sub\getvalue{\??dd#1\??dd\c!nummer}]} - -\def\showdnsubsubsubnummer#1% - {\showdnsubsubnummer{#1}% - \getvalue{\??dd#1\c!scheider}% - \nummer[\v!sub\v!sub\v!sub\getvalue{\??dd#1\??dd\c!nummer}]} - -\def\domakednnummer#1#2% - {\getvalue{\??dd#2\c!links}% - \strut#1{#2}% - \getvalue{\??dd#2\c!rechts}} - -% #1=name #2=level #3=\show #4[#5]#6=#1[#2]#3 van definitie - -\def\special@@definitiewoord#1#2#3#4[#5]#6% - {\strut - \doifelsevalue{\??dd#1\c!nummer}{\v!nee} - {\!!doneafalse} - {\doifelse{#5}{-} - {\!!doneafalse} - {\!!doneatrue}}% - \if!!donea - \getvalue{\e!volgende#2#1}% - \iflocation - \bgroup - \setvalue{\??dd#1\c!sectienummer}{\v!ja}% - \protectconversion - \maakvoorafgaandenummer[#1]% - \xdef\internaldoornummer{#3{#1}}% - \rawreference{\s!num}{#1:\internaldoornummer}{}% - \egroup - \fi - \maakvoorafgaandenummer[#1]% - \hbox - {\def\kap##1{##1}% \domakednnumer gaat hier fout binnen kap - \doattributes - {\??dd#1\v!kop} - {\showdntext{#2#1}% - \domakednnummer#3{#1}% - \getvalue{\??dd#1\c!afsluiter}}% - \iflocation - \edef\localconnection{\getvalue{\??dd#1\c!koppeling}:\internaldoornummer}% - \doifreferencefoundelse{\localconnection} - {\in[\localconnection]}{}% genereert > of < - \fi}% - \rawreference{\s!num}{#5}{#3{#1}}% - \else - \ExpandBothAfter\doattributes - {\??dd#1\v!kop} - {\showdnpuretext{#2#1}}% - \rawreference{\s!num}{#5}{}% - \fi} - -% De macro's \??dd#1\c!lokaal en \??dd#1\c!commando leveren -% de koppeling tussen \doornummeren en \doordefinieren. Deze -% constructie is nodig omdat doornummeren geen argument -% heeft en omdat subnummers niet worden genest binnen -% het hogere niveau. Het commando \??dd#1\s!do\c!commando -% moet in dat geval \v!ja zijn. - -\def\@@ddleftskip#1#2% - {\do@@ddleftskip{#1}{#2}{}} - -\def\do@@ddleftskip#1#2#3% - {\ExpandFirstAfter\processaction - [\getvalue{\??dd#2#1\c!inspringen}] - [ \v!nee=>, - \v!ja=>\dodo@@ddleftskip{#1}{#2}{#3}% - \doifnot{#2}{\v!sub#3} - {\do@@ddleftskip{#1}{#2}{\v!sub#3}}, - \s!unknown=>\advance\leftskip by \getvalue{\??dd#2#1\c!inspringen}]} - -\def\dodo@@ddleftskip#1#2#3% - {\ExpandFirstAfter\processaction - [\getvalue{\??dd#3\v!sub#1\c!inspringen}] - [ \v!nee=>, - \v!ja=>\ExpandFirstAfter\doifnotinset - {\getvalue{\??dd#3#1\c!breedte}}{\v!passend,\v!ruim} - {\advance\leftskip by \getvalue{\??dd#3#1\c!breedte}}, - \s!unknown=>\advance\leftskip by \commalistelement]} - -\def\@@ddresetsubsubsubnummer#1% - {\edef\doornummer{\getvalue{\??dd#1\??dd\c!nummer}}% - \resetnummer[\v!sub\v!sub\v!sub\doornummer]} - -\def\@@ddresetsubsubnummer#1% - {\@@ddresetsubsubsubnummer{#1}% - \resetnummer[\v!sub\v!sub\doornummer]} - -\def\@@ddresetsubnummer#1% - {\@@ddresetsubsubnummer{#1}% - \resetnummer[\v!sub\doornummer]} - -\def\@@ddresetnummer#1% - {\@@ddresetsubnummer{#1}% - \resetnummer[\doornummer]} - -\def\@@ddvolgendesubsubsubnummer#1[#2]% - {\edef\doornummer{\getvalue{\??dd#1\??dd\c!nummer}}% - \verhoognummer[\v!sub\v!sub\v!sub\doornummer]% - \rawreference{\s!num}{#2}{\showdnsubsubsubnummer{\doornummer}}}% - -\def\@@ddvolgendesubsubnummer#1[#2]% - {\@@ddresetsubsubsubnummer{#1}% - \verhoognummer[\v!sub\v!sub\doornummer]% - \rawreference{\s!num}{#2}{\showdnsubsubnummer{\doornummer}}} - -\def\@@ddvolgendesubnummer#1[#2]% - {\@@ddresetsubsubnummer{#1}% - \verhoognummer[\v!sub\doornummer]% - \rawreference{\s!num}{#2}{\showdnsubnummer{\doornummer}}} - -\def\@@ddvolgendenummer#1[#2]% - {\@@ddresetsubnummer{#1}% - \verhoognummer[\doornummer]% - \rawreference{\s!num}{#2}{\showdnnummer{\doornummer}}} - -\def\dodosteldoornummerenin[#1][#2]% - {\getparameters[\??dd#1][#2]% - \stelnummerin[#1][\c!conversie=\getvalue{\??dd#1\c!conversie}]} % see below - -\def\dosteldoornummerenin[#1][#2]% - {\ConvertToConstant\doifelse{#2}{} - {\getparameters[\??dn][#1]} - {\dodoubleargumentwithset\dodosteldoornummerenin[#1][#2]}} - -\def\steldoornummerenin% - {\dodoubleempty\dosteldoornummerenin} - -\def\dododoornummeren#1#2#3[#4][#5]#6% - {\dodoordefinieren[#3#1]% - [\s!do\c!commando=\v!ja, - \c!lokaal=\@@ddleftskip{#1}{#3}, - \c!commando=\special@@definitiewoord{#1}{#3}{#6}]% - \copyparameters[\??dd#3#1][\??dn] - [\c!plaats,\c!kopletter,\c!letter,\c!kleur,\c!kopkleur, - \c!breedte,\c!nummer,\c!afstand, - \c!monster,\c!hang,\c!uitlijnen,\c!voor,\c!tussen,\c!na, - \c!niveaus,\c!wijze,\c!blokwijze,\c!scheider, % \c!conversie - \c!afsluiter,\c!sectienummer,\c!nummer,\c!inspringen]% - \ConvertToConstant\doifinstringelse{=}{#4} - {\getparameters[\??dd#3#1]% - [\c!tekst=#1,\??dd\c!nummer=#1,\c!conversie=, - \c!links=,\c!rechts=,\c!koppeling=,#4]}% - {\doifelsenothing{#4} - {\getparameters[\??dd#3#1]% - [\c!tekst=#1,\??dd\c!nummer=#1,\c!conversie=, - \c!links=,\c!rechts=,\c!koppeling=,#4]}% - {\copyparameters[\??dd#3#1][\??dd#3#4] - [\c!plaats,\c!kopletter,\c!letter,\c!kleur,\c!kopkleur, - \c!breedte,\c!nummer,\c!afstand, - \c!monster,\c!hang,\c!uitlijnen,\c!voor,\c!tussen,\c!na, - \c!links,\c!rechts,\c!koppeling,\c!inspringen]% - \getparameters[\??dd#3#1] - [\c!tekst=#1,\??dd\c!nummer=#4,\c!conversie=,#5]}}% - \ExpandBothAfter\doif{\getvalue{\??dd#3#1\??dd\c!nummer}}{#1} - {\definieernummer - [#3#1] - [\c!wijze=\getvalue{\??dd#1\c!wijze}, - \c!blokwijze=\getvalue{\??dd#1\c!blokwijze}, - \c!sectienummer=\getvalue{\??dd#1\c!sectienummer}]% - \doifvalue{\??dd#1\c!niveaus}{#2}% % for - {\doifsomething{\getvalue{\??dd#1\c!conversie}}% % old - {\stelnummerin[#3#1] % times - [\c!conversie=\getvalue{\??dd#1\c!conversie}]}}}% % sake - \setvalue{\s!reset#3#1}% - {\getvalue{\??dd\s!reset#3\c!nummer}{#1}}% - \setvalue{\s!complex\e!volgende#3#1}% - {\getvalue{\??dd\c!volgende#3\c!nummer}{#1}}% - \setvalue{\e!volgende#3#1}% - {\complexorsimpleempty{\e!volgende#3#1}}} - -\def\dodoornummeren[#1][#2][#3]% - {\dododoornummeren{#1}{1}{}[#2][#3]\showdnnummer - \dododoornummeren{#1}{2}{\v!sub}[#2][#3]\showdnsubnummer - \dododoornummeren{#1}{3}{\v!sub\v!sub}[#2][#3]\showdnsubsubnummer - \dododoornummeren{#1}{4}{\v!sub\v!sub\v!sub}[#2][#3]\showdnsubsubsubnummer} - -\def\doornummeren% - {\dotripleemptywithset\dodoornummeren} - -%I n=Doorspringen -%I c=\doorspringen,\steldoorspringenin -%I -%I Inspringende opsommingen (bijvoorbeeld dialogen) kunnen -%I worden gezet met: -%I -%I \doorspringen[naam][tekst=,scheider=,breedte=,letter=, -%I kopletter=,voor=,na=] -%I -%I Na dit commando zijn de commando's \naam, \subnaam en -%I \subsubnaam beschikbaar. -%I -%I Er kunnen standaardwaarden worden ingesteld met het -%I commando: -%I -%I \steldoorspringenin[instellingen] -%I -%I Een aantal commando's kan worden omringt met de volgende -%I commando's (wel lege regels ertussen!). -%I -%I \startdoorspringen -%I \stopdoorspringen -%P -%I Het tussentijds bijstellen van de instellingen is mogelijk -%I met: -%I -%I \steldoorspringenin[naam][instellingen] - -% Het default-mechanisme kan mooier: leegtest, enz. -% -% Werkprocedure buiten definitie - -\def\dodosteldoorspringenin[#1][#2]% - {\getparameters[\??ds#1][#2]} - -\def\dosteldoorspringenin[#1][#2]% - {\ConvertToConstant\doifelse{#2}{} - {\dodosteldoorspringenin[][#1]} - {\dodoubleargumentwithset\dodosteldoorspringenin[#1][#2]}} - -\def\steldoorspringenin% - {\dodoubleempty\dosteldoorspringenin} - -\def\startdoorspringen% - {\witruimte - \@@dsvoor - \pagina[\v!voorkeur] - \begingroup - \parskip=\!!zeropoint\relax} - -\def\stopdoorspringen% - {\endgroup - \@@dsna} - -\def\dododoorspringen#1#2#3% - {\par - \getvalue{\??ds#1\c!voor}% - \begingroup - \doifvaluenothing{\??ds#1\c!monster} - {\setvalue{\??ds#1\c!monster}% - {\getvalue{\??ds#1\c!tekst}}}% - \assignwidth - {\!!widtha} - {\getvalue{\??ds#1\c!breedte}} - {\doattributes - {\??ds#1\v!kop} - {\getvalue{\??ds#1\c!monster}\getvalue{\??ds#1\c!scheider}}} - {1em}% - \advance\!!widtha by \tfskipsize - \setbox2=\hbox to \!!widtha - {\doattributes - {\??ds#1\v!kop} - {\strut - \getvalue{\??ds#1\c!tekst}% - \hss - \getvalue{\??ds#1\c!scheider}% - \tfskip}}% - \parindent\!!zeropoint - \hskip#2\!!widtha\indent\box2% - \hangindent#3\!!widtha - \doattributes{\??ds#1}{}% #4}% - \AfterPar% - {\endgroup - \getvalue{\??ds#1\c!na}}% - \GetPar} - -\def\dodoorspringen[#1][#2]% - {\copyparameters[\??ds#1][\??ds] - [\c!tekst,\c!scheider,\c!breedte,\c!letter,\c!kleur, - \c!kopletter,\c!monster,\c!voor,\c!na]% - \getparameters[\??ds#1][#2]% - \setvalue{#1}% - {\dododoorspringen{#1}{0}{1}}% - \setvalue{\v!sub#1}% - {\dododoorspringen{#1}{1}{2}}% - \setvalue{\v!sub\v!sub#1}% - {\dododoorspringen{#1}{2}{3}}} - -\def\doorspringen% - {\dodoubleargumentwithset\dodoorspringen} - -%I n=Doorlabelen -%I c=\doorlabelen,\verhoog,\huidige -%I -%I Het is mogelijk genummerde verwijzingen (bijvoorbeeld -%I naar sheets of video's) in de tekst op te nemen met -%I het commando: -%I -%I \doorlabelen[naam][tekst=,plaats=,voor=,na=,kopletter=] -%I -%I Na dit commando zijn de volgende commando's beschikbaar: -%I -%I \reset<naam> -%I \verhoog<naam> -%I \volgende<naam>[referentie] -%I \huidige<naam> -%I \in<naam>[referentie] -%P -%I Er kan een 'kopje' worden opgeropeen met het commando: -%I -%I \naam -%I -%I In dat geval worden de onder 'voor' en 'na' opgegeven -%I commando's uitgevoerd. -%I -%I Als we voor naam 'sheet' invullen en voor tekst -%I 'transparant' dan leidt het commando \huidigesheet tot -%I de tekst 'transparant 1' en een volgende aanroep tot de -%I tekst 'transparant 2'. - -\def\dodoorlabel[#1][#2]% - {\getvalue{\s!number#1\c!voor}% - \bgroup - %\ExpandFirstAfter\doifinset{\getvalue{\s!number#1\c!plaats}}{\v!marge,\v!inmarge} - % {\setvalue{\s!number#1\c!zetwijze}{\v!inmarge}}% - \doif{\getvalue{\s!number#1\c!plaats}}{\v!marge} - {\setvalue{\s!number#1\c!plaats}{\v!inmarge}}% - \doattributes{\s!number#1\v!kop}{\getvalue{\e!volgende#1}[#2]}% - \egroup - \getvalue{\s!number#1\c!na}}% - -\def\dovolgendedoorlabel[#1][#2]% - {\volgendenummer[#1][\s!lab][#2]} - -\def\dodoorlabelen[#1][#2]% - {\definieernummer - [#1] - [\c!voor=, - \c!na=, - \c!kopletter=, - \c!wijze=\@@nrwijze, - #2]% - \setvalue{#1}% - {\dodoubleempty\dodoorlabel[#1]}% - \setvalue{\s!reset#1}% - {\resetnummer[#1]}% - \setvalue{\e!verhoog#1}% - {\verhoognummer[#1]}% - \setvalue{\e!volgende#1}% - {\dodoubleempty\dovolgendedoorlabel[#1]}% - \setvalue{\c!huidige#1}% - {\huidigenummer[#1]}% - \setvalue{\c!in#1}[##1]% % weghalen - {\innummer[#1][##1]}% % weghalen - \setvalue{\c!op#1}[##1]% % weghalen - {\opnummer[#1][##1]}} % weghalen - -\def\doorlabelen% - {\dodoubleargumentwithset\dodoorlabelen} - -%I n=Uitlijnen -%I c=\startuitlijnen,\steluitlijnenin,\steltolerantiein -%I c=\regellinks,\regelrechts,\regelmidden, -%I c=\woordrechts -%I -%I De regelval kan worden ingesteld met: -%I -%I \steluitlijnenin[instelling] -%I -%I waarbij de volgende instellingen mogelijk zijn: -%I -%I links links niet uitvullen -%I midden links/rechts niet uitvullen = centreren -%I rechts rechts niet uitvullen -%I breedte uitvullen over breedte (default) -%I beide wisselend (afhankelijk bladzijde) -%I onder onderkant niet uitgelijnd (default) -%I hoogte uitvullen over hoogte (op baseline) -%I regel uitvullen over hoogte (binnen kader) -%I reset uitvullen over breedte en hoogte -%I -%I In combinatie met links, midden en rechts kan 'ruim' -%I worden opgegeven. -%P -%I Aanvullend zijn de volgende commando's beschikbaar: -%I -%I \startuitlijnen[instelling] -%I \stopuitlijnen -%I -%I Een regel kan op verschillende manieren worden uitgelijnd -%I met behulp van de commando's: -%I -%I \regellinks{tekst} -%I \regelrechts{tekst} -%I \regelmidden{tekst} -%I -%I Aan het eind van een paragraaf kan een stukje tekst -%I worden geplaatst met: \woordrechts{ziezo} -%P -%I De tolerantie waarbinnen het uitlijnen plaatsvindt kan -%I worden ingesteld met: -%I -%I \steltolerantiein[instelling] -%I -%I Mogelijke waarden zijn: zeerstreng, streng, soepel en -%I zeersoepel. -%I -%I Standaard heeft de tolerantie betrekking op horizontaal -%I uitlijnen. Vertikaal kan het uitlijnen worden beinvloed -%I door het trefwoord 'vertikaal' mee te geven. Standaard -%I geldt [vertikaal,streng] en [horizontaal,zeerstreng]. - -\definetwopasslist{\s!paragraph} - -\newcounter\nofraggedparagraphs - -\def\doparagraphreference% looks very much like domarginreference - {\doglobal\increment\nofraggedparagraphs\relax - \edef\writeparref% - {\writeutilitycommand% - {\twopassentry% - {\s!paragraph}% - {\nofraggedparagraphs}% - {\noexpand\realfolio}}}% - \writeparref} - -\def\setraggedparagraphmode#1#2% - {\ifinner - \ifdubbelzijdig - \gettwopassdata{\s!paragraph}% - \iftwopassdatafound - \ifodd\twopassdata#1\else#2\fi - \else - \ifodd\realfolio#1\else#2\fi - \fi - \doparagraphreference - \else - #2\relax - \fi - \else - #2\relax - \fi} - -% De onderstaande macro's zijn opgenomen in Plain TeX. -% -% \def\raggedright% -% {\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax} -% -% \def\ttraggedright% -% {\tttf\rightskip\z@ plus2em\relax} -% -% \newif\ifr@ggedbottom -% -% \def\raggedbottom% -% {\topskip 10\p@ plus60\p@ \r@ggedbottomtrue} -% -% \def\normalbottom% -% {\topskip 10\p@ \r@ggedbottomfalse} -% -% en worden hieronder wat aangepast. - -\newif\ifn@rmalbottom -\newif\ifr@ggedbottom -\newif\ifb@selinebottom - -\def\normalbottom% - {\n@rmalbottomtrue - \r@ggedbottomfalse - \b@selinebottomfalse - \settopskip} - -\def\raggedbottom% - {\n@rmalbottomfalse - \r@ggedbottomtrue - \b@selinebottomfalse - \settopskip} - -\def\baselinebottom% - {\n@rmalbottomfalse - \r@ggedbottomfalse - \b@selinebottomtrue - \settopskip} - -% \hyphenpenalty = ( 2.5 * \hsize ) / \raggedness -% \tolerance >= 1500 % was 200 -% \raggedness = 2 .. 6\korpsgrootte - -\def\leftraggedness {2\korpsgrootte} -\def\rightraggedness {2\korpsgrootte} -\def\middleraggedness {6\korpsgrootte} - -\def\setraggedness#1% - {\ifnum\tolerance<1500\relax % kleinere waarden - \tolerance=1500\relax % geven ongewenste - \fi % effecten - \spaceskip=2.5\hsize % voorkomt conflict - \xspaceskip=#1\relax % met \dimen0/2 en - \divide\spaceskip by \xspaceskip % deze skips worden - \hyphenpenalty=\spaceskip} % toch al aangepast - -\def\setraggedskips#1#2#3#4#5#6% - {\leftskip=1\leftskip\!!plus#1\relax % zie: Tex By Topic 8.1.3 - \rightskip=1\rightskip\!!plus#2\relax % zie: Tex By Topic 8.1.3 - \spaceskip#3\relax - \xspaceskip#4\relax - \parfillskip\!!zeropoint\!!plus#5\relax - \parindent#6\relax} - -\def\notragged% - {\setraggedskips{0em}{0em}{0em}{0em}{1fil}{\parindent}} % {\voorwit}} - -\def\raggedleft% - {\setraggedness\leftraggedness - \setraggedskips{\leftraggedness}{0em}{.3333em}{.5em}{0em}{0em}} - -\def\raggedcenter% - {\setraggedness\middleraggedness - \setraggedskips{\middleraggedness}{\middleraggedness}{.3333em}{.5em}{0em}{0em}} - -\def\raggedright% - {\setraggedness\rightraggedness - \setraggedskips{0em}{\rightraggedness}{.3333em}{.5em}{0em}{\parindent}} % {\voorwit}} - -\def\veryraggedleft% - {\setraggedskips{1fil}{0em}{.3333em}{.5em}{0em}{0em}} - -\def\veryraggedcenter% - {\setraggedskips{1fil}{1fil}{.3333em}{.5em}{0em}{0em}} - -\def\veryraggedright% - {\setraggedskips{0em}{1fil}{.3333em}{.5em}{0em}{\parindent}} % {\voorwit}} - -\def\ttraggedright% - {\tttf - \setraggedskips{0em}{\rightraggedness}{0em}{0em}{0em}{\parindent}} % {\voorwit}} - -\def\dosteluitlijnenin[#1]% - {\doifinsetelse{\v!ruim}{#1}{\!!doneatrue}{\!!doneafalse}% - \processallactionsinset - [#1] - [ \v!regel=>\baselinebottom, - \v!onder=>\raggedbottom, - \v!hoogte=>\normalbottom, - \v!breedte=>\notragged, - \v!binnen=>\setraggedparagraphmode\raggedleft\raggedright, - \v!buiten=>\setraggedparagraphmode\raggedright\raggedleft, - \v!links=>\if!!donea\veryraggedleft\else\raggedleft\fi, - \v!rechts=>\if!!donea\veryraggedright\else\raggedright\fi, - \v!midden=>\if!!donea\veryraggedcenter\else\raggedcenter\fi, - \v!reset=>\notragged - \normalbottom]} - -\def\steluitlijnenin% - {\dosingleargument\dosteluitlijnenin} - -\def\startuitlijnen% - {\bgroup - \steluitlijnenin} - -\def\stopuitlijnen - {\par - \egroup} - -%\def\regellinks#1% -% {\noindent\leftline{{\strut#1}}} -% -%\def\regelrechts#1% -% {\noindent\rightline{{#1\strut}}} -% -%\def\regelmidden#1% -% {\noindent\centerline{{\strut#1}}} - -\def\doalignline#1#2% - {\dowithnextbox - {\noindent\hbox to \hsize - {\strut#1\unhbox\nextbox#2}} - \hbox} - -\def\regellinks {\doalignline \relax \hss } -\def\regelrechts {\doalignline \hss \relax} -\def\regelmidden {\doalignline \hss \hss } - -\def\doregelplaats#1% - {\getvalue{regel\interfaced{#1}}} - -\def\dosteltolerantiein[#1]% - {\doifinsetelse{\v!vertikaal}{#1}% - {\processfirstactioninset - [#1] - [\v!zeerstreng=>\def\bottomtolerance{}, - \v!streng=>\def\bottomtolerance{.050}, - \v!soepel=>\def\bottomtolerance{.075}, - \v!zeersoepel=>\def\bottomtolerance{.100}]}% - {\processfirstactioninset - [#1] - [\v!zeerstreng=>\tolerance=200, - \v!streng=>\tolerance=1500, - \v!soepel=>\tolerance=3000, - \v!zeersoepel=>\tolerance=4500]}} - -\def\steltolerantiein% - {\dosingleargument\dosteltolerantiein} - -\def\woordrechts% - {\groupedcommand{\hfill\hbox}{\parfillskip\!!zeropoint}} - -%I n=Margeteksten -%I c=\inmarge,\inlinker,\inrechter,\stelinmargein -%I c=\margetitel,\figuurinmarge -%I c=\oplinker -%I -%I Een paragraaf kan worden ingeluid met een tekst in -%I de marge: -%I -%I \inmarge{tekst} -%I \inlinker{tekst} -%I \inrechter{tekst} -%I -%I Met \\ kan binnen een margetekst naar een volgende regel -%I worden gesprongen. -%P -%I Het onderstaande commando kan gebruikt worden om een -%I paragraafaanduiding in de marge te plaatsen. Het commando -%I moet aan het begin van de paragraaf staan. Er wordt -%I gecontroleerd of een en ander nog op de bladzijde past. -%I -%I \margetitel{tekst} -%I -%I Tussen \margetitel{tekst} en de volgende alinea mag, -%I omwille van de overzichtelijkheid, een lege regels staan. -%I Als dit commando wordt gebruikt na een commando als -%I \paragraaf, kan het controlemechanisme leiden tot een -%I ongewenste overgang naar een nieuwe bladzijde. In dat -%I geval kan beter het volgende commando worden gebruikt. -%I -%I \margewoord{tekst} -%I -%I Dit commando komt overeen met \inmarge, alleen is bij -%I \margewoord de lege regel toegestaan. -%P -%I Er kan eventueel voor {tekst} een [referentie] worden -%I meegegeven. In dat geval kan worden verwezen naar het -%I paginanummer waarop het margewoord staat. -%I -%I Als TeX twijfelt in welke marge het woord moet staan, is -%I een tweede verwerkingsslag nodig. Als een margewoord bij -%I herhaling verkeerd wordt geplaatst, dan kan het -%I automatisme worden verstoord door [+] mee te geven. Een -%I margewoord kan lager worden gezet met [laag]. Combinaties -%I kunnen ook: -%I -%I \margewoord[+,laag][referentie]{woord} -%P -%I De wijze van weergeven kan worden ingesteld met het -%I commando: -%I -%I \stelinmargein[letter=,plaats=,voor=,na=,uitlijnen=] -%I -%I Als plaats kan links, rechts of beide worden meegegeven. In -%I het laatste geval hangt de plaats af van het -%I enkel/dubbelzijdig zetten. -%I -%I Uitlijnen kent twee instellingen: 'ja' en 'nee'. Inhet -%I eerste geval (default) worden de margewoorden tegen de -%I kantlijn geplaatst. -%P -%I Vooruitlopend op meer commando's is er al vast het -%I commando: -%I -%I \oplinker{tekst} -%I -%I Dit commando kan bijvoorbeeld worden gebruikt binnen -%I een midden-uitgelijnde tekst. Het commando is nog niet -%I definitief en robuust. - -% %P -% %I Aanvullend zijn commando's beschikbaar om figuren in -% %I de marge te plaatsen: -% %I -% %I \figuurinmarge{figuur} -% %I \figuurinlinker{figuur} -% %I \figuurinrechter{figuur} - -%T n=margetitel -%T m=mar -%T a=m -%T -%T \margetitel{?} -%T - -\newif\iflowinmargin - -\def\stelinmargein% - {\dodoubleempty\dostelinmargein} - -\def\dostelinmargein[#1][#2]% - {\ifsecondargument - \doifundefinedelse{\??im#1\c!offset} - {\presetlocalframed - [\??im#1]% - \getparameters - [\??im#1] - [\c!kader=\v!uit, - \c!offset=\v!overlay, - \c!regel=1, - \c!scheider=, - \c!breedte=\v!ruim, - \c!afstand=\!!zeropoint, - \c!letter=\@@imletter, - \c!kleur=\@@imkleur, - \c!plaats=\@@implaats, - \c!uitlijnen=\@@imuitlijnen, - \c!voor=\@@imvoor, - \c!na=\@@imna, - #2]} - {\getparameters[\??im#1][#2]}% - \else - \getparameters[\??im][#1]% - \fi} - -\let\margetekstafstand = \!!zeropoint -\def\margetekstregels {1} -\def\margetekstnummer {0} -\let\margetekstscheider = \empty - -\def\maakmargetekstblok#1#2#3#4#5#6% - {#4\relax - \bgroup - \mindermeldingen - \hsize#1\relax - \ifnum\margetekstnummer=0 - \def\margetekstnummer{#2}% - \fi - \processaction - [\getvalue{\??im\margetekstnummer\c!uitlijnen}] - [ \v!ja=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#2}, - \v!binnen=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#2}, - \v!buiten=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#3}, - \s!default=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#2}]% - \setbox0=\vbox\localframed - [\??im\margetekstnummer] - [\c!strut=\v!nee] - {\decrement\margetekstregels - \@@imvoor - \doattributes{\??im\margetekstnummer} - {\dorecurse{\margetekstregels}{\strut\\}% - \begstrut#6\endstrut\endgraf}% - \@@imna}% - \ht0=\ht\strutbox - \box0 - \egroup - #5\relax} - -\def\plaatsmargetekstscheider% - {\ifnum\margincontent>0 - \bgroup - \dimen0=\margetekstregels\lineheight - \advance\dimen0 by -\lineheight - \lower\dimen0\hbox{\margetekstscheider}% - \egroup - \fi} - -\def\linkermargetekstblok#1% - {\maakmargetekstblok - {\linkermargebreedte} - {\v!links}{\v!rechts} - {\llap{\plaatsmargetekstscheider}}{\hskip\margetekstafstand} - {#1}} - -\def\rechtermargetekstblok#1% - {\maakmargetekstblok - {\rechtermargebreedte} - {\v!rechts}{\v!links} - {\hskip\margetekstafstand}{\rlap{\plaatsmargetekstscheider}} - {#1}} - -\def\doplacemargintext#1#2#3% - {\strut - \setbox0=\hbox{#1}% - \dimen0=\ht0 - \advance\dimen0 by \dp0 - \ifdim\dimen0>\marginheight - \global\marginheight=\dimen0 - \fi - \setbox0=\hbox - {#2{\hskip#3\strut\iflowinmargin\else\raise\dp\strutbox\fi\box0}}% - \ht0=\!!zeropoint - \dp0=\!!zeropoint - \vadjust{\box0}} - -\def\doinlinker#1% - {\doplacemargintext - {\linkermargetekstblok{#1}\hskip\linkermargeafstand} - \llap\!!zeropoint} - -\def\doinrechter#1% - {\doplacemargintext - {\hskip\rechtermargeafstand\rechtermargetekstblok{#1}} - \rlap\hsize} - -\newcounter \nofmarginnotes -\newif \iftrackingmarginnotes -\newif \ifrightmargin % documenteren - -\definetwopasslist{\s!margin} - -\def\domarginreference% - {\doglobal\increment\nofmarginnotes\relax - \edef\writemarref% - {\writeutilitycommand% - {\twopassentry% - {\s!margin}% - {\nofmarginnotes}% - {\noexpand\realfolio}}}% - \writemarref} - -\def\dodoinmargenormal#1#2#3#4% - {\iffirstsidefloatparagraph\geenwitruimte\fi % zo laat mogelijk - \ifodd#1\relax - \rightmargintrue - #3{#4}% - \else - \rightmarginfalse - #2{#4}% - \fi} - -\def\doinmargenormal#1#2#3% - {\bgroup - \iftrackingmarginnotes - \gettwopassdata{\s!margin}% - \iftwopassdatafound - \dodoinmargenormal\twopassdata#1#2{#3}% - \else - \dodoinmargenormal\realfolio#1#2{#3}% - \fi - \domarginreference - \else - \dodoinmargenormal\realfolio#1#2{#3}% - \fi - \egroup} - -\def\doinmargereverse#1#2#3% - {\dodoinmargenormal\realfolio#2#1{#3}} - -\def\doinmarge[#1][#2][#3][#4][#5]#6% - {\doifcommonelse{+,-,\v!laag}{#4} - {\dodoinmarge[#1][#2][#3][#4][#5]{#6}} - {\dodoinmarge[#1][#2][#3][][#4]{#6}}% - \ignorespaces} - -\def\dodoinmarge[#1][#2][#3][#4][#5]#6% - {\ignorespaces - \doifinsetelse{\v!laag}{#4} - {\lowinmargintrue} - {\lowinmarginfalse}% - \processaction - [#1] - [ \v!links=>#2{#6}, - \v!rechts=>#3{#6}, - \s!unknown=>\ifdubbelzijdig - \doifcommonelse{+,-}{#4} - {\doinmargereverse#2#3{#6}} - {\doinmargenormal#2#3{#6}}% - \else - #2{#6}% - \fi]% - \rawpagereference{\s!mar}{#5}% - \ignorespaces} - -\def\inlinker% - {\indentation\doquintupleempty\doinmarge - [\c!links][\doinlinker][\doinrechter]} - -\def\inrechter% - {\indentation\doquintupleempty\doinmarge - [\c!rechts][\doinlinker][\doinrechter]} - -\def\inmarge% - {\doquintupleempty\doinmarge - [\@@implaats][\doinlinker][\doinrechter]} - -\def\inanderemarge% - {\doquintupleempty\doinmarge - [\@@implaats][\doinrechter][\doinlinker]} - -\newcounter\margincontent - -\def\flushmargincontent% [#1][#2]#3% hier plaats 'globaal' (geen 1,2 enz) - {\doinmarge[\@@implaats][\doinlinker][\doinrechter]} % [#1][#2]{#3}} - -\newdimen\marginheight - -\let\restoreinterlinepenalty=\relax - -\def\flushmargincontents% % links + rechts - {\restoreinterlinepenalty - \ifnum\margincontent>0 - \bgroup - \forgetall - \global\marginheight\!!zeropoint - \dorecurse{\margincontent} - {\bgroup - \edef\margetekstafstand {\getvalue{\??im\recurselevel\c!afstand}}% - \edef\margetekstregels {\getvalue{\??im\recurselevel\c!regel}}% - \edef\margetekstscheider{\getvalue{\??im\recurselevel\c!scheider}}% - \let\margetekstnummer=\recurselevel - \getvalue{\??im\recurselevel}% - \global\setvalue{\??im\recurselevel}{}% - \egroup}% - \ifdim\marginheight>\lineheight % This is something real dirty! - \advance\marginheight by \pagetotal - \advance\marginheight by \lineheight % a sort of bonus - \ifdim\marginheight>\pagegoal - \xdef\restoreinterlinepenalty% - {\global\let\restoreinterlinepenalty\relax - \global\interlinepenalty=\the\interlinepenalty}% - \global\interlinepenalty=10000 - \fi - \else % We need the above because interlinepenalties overrule vadjusted \nobreaks. - %\vadjust - % {\forgetall - % \global\advance\marginheight by \lineheight - % \global\divide\marginheight by \lineheight - % \dorecurse{\number\marginheight} - % {\nobreak\vskip\lineheight}% - % \kern-\number\marginheight\lineheight}% - \vadjust{\nobreak}% - \fi - \doglobal\newcounter\margincontent - \egroup - \fi} - -\def\complexmargewoord[#1][#2]#3% - {\doglobal\increment\margincontent - \stelinmargein[\margincontent][]% - \global\setvalue{\??im\margincontent}% - {\flushmargincontent[#1][#2]{#3}}} - -\def\margewoord% - {\dodoubleempty\complexmargewoord} - -\def\margetitel% - {\margewoord} - -\def\margetekst% - {\margewoord} - -\def\margewoordpositie[#1]#2% - {\ifnum#1>\margincontent - \xdef\margincontent{#1}% - \fi - \stelinmargein[#1][]% - \global\setvalue{\??im#1}% - {\flushmargincontent[][]{#2}}} - -\def\oplinker#1% - {\strut - \vadjust - {\mindermeldingen - \setbox0=\vtop{\forgetall\strut#1}% - \getboxheight\dimen0\of\box0 - \vskip-\dimen0\ - \box0}} - -%D \macros -%D {inleftside,inleftmargin,inrightmargin,inrightside} -%D {} -%D -%D The fast and clean way of putting things in the margin is -%D using \type{\rlap} or \type{\llap}. Unfortunately these -%D macro's don't handle indentation, left and right skips. We -%D therefore embed them in some macro's that (force and) -%D remove the indentation and restore it afterwards. - -\def\inleftmargin#1% - {\pushindentation - \llap{#1\hskip\leftskip\hskip\linkermargeafstand}% - \popindentation - \ignorespaces} - -\def\inrightmargin#1% - {\pushindentation - \rlap{\hskip\hsize\hskip-\rightskip\hskip\rechtermargeafstand#1}% - \popindentation - \ignorespaces} - -\def\inleftside#1% - {\inleftmargin - {#1\relax - \hskip\linkermargebreedte - \hskip\pageseparation - \hskip\linkerrandafstand}} - -\def\inrightside#1% - {\inrightmargin - {\hskip\rechtermargebreedte - \hskip\rechterrandafstand - \hskip\pageseparation - #1}} - -%D We want to keep things efficient and therefore only handle -%D situations like: -%D -%D \startbuffer -%D \inleftside {fine} some text \par -%D \strut \inleftmargin {fine} some text \par -%D \noindent \inrightmargin {fine} some text \par -%D \noindent \strut \inrightside {fine} some text \par -%D \stopbuffer -%D -%D \typebuffer -%D -%D which looks like: -%D -%D \bgroup -%D \haalbuffer -%D \parindent 30pt -%D \haalbuffer -%D \egroup - -%D \macros -%D {pushindentation,popindentation} -%D -%D The pushing and popping is done by: - -\newbox\indentationboxA -\newbox\indentationboxB - -\def\pushindentation% - {\bgroup - \ifhmode - \unskip - \setbox\indentationboxA=\lastbox % get \strut if present - \unskip - \setbox\indentationboxB=\lastbox % get \indent generated box - \unskip - \else - \hskip\!!zeropoint % switch to horizontal mode - \unskip - \setbox\indentationboxA=\lastbox % get \indent generated box - \setbox\indentationboxB=\box\voidb@x - \fi} - -\def\popindentation% - {\box\indentationboxB\box\indentationboxA % put back the boxes - \egroup} - -%D The only complication lays in \type{\strut}. In \PLAIN\ -%D \TEX\ a \type{\strut} is defined as: -%D -%D \starttypen -%D \def\strut% -%D {\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} -%D \stoptypen -%D -%D But what is a \type{\strut}? Normally it's a rule of width -%D zero, but when made visual, it's a rule and a negative skip. -%D The mechanism for putting things in the margins described -%D here cannot handle this situation very well. One -%D characteristic of \type{\strut} is that the \type{\unhcopy} -%D results in entering horizontal mode, which in return leads -%D to some indentation. -%D -%D To serve our purpose a bit better, the macro \type{\strut} -%D can be redefined as: -%D -%D \starttypen -%D \def\strut% -%D {\relax\ifmmode\else\hskip0pt\fi\copy\strutbox} -%D \stoptypen -%D -%D Or more compatible: -%D -%D \starttypen -%D \def\strut% -%D {\relax\ifmmode -%D \copy\strutbox -%D \else -%D \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup -%D \fi} -%D \stoptypen -%D -%D In \CONTEXT\ however we save some processing time by putting -%D an extra \type{\hbox} around the \type{\strutbox}. - -% dit zijn voorlopig lokale commando's - -\def\woordinlinker {\inlinkermarge} -\def\woordinrechter{\inrechtermarge} - -\def\woordinmarge% - {\doquintupleempty\doinmarge - [\@@implaats][\woordinlinker][\woordinrechter]} - -%I n=Paginanummer -%I c=\stelpaginanummerin,\stelsubpaginanummerin -%I -%I Het paginanummer kan worden ingesteld met het commando: -%I -%I \stelpaginanummerin[nummer=,status=] -%I -%I Het nummeren kan gedurende een of meerdere pagina's worden -%I stilgezet door in plaats van een nummer start, stop of -%I handhaaf mee te geven. -%I -%I Het paginanummer is oproepbaar met: -%I -%I \paginanummer -%I -%I en het totaal aantal paginanummers met: -%I -%I \totaalaantalpaginas -%P -%I Er zijn subnummers beschikbaar. De wijze van nummeren -%I wordt ingesteld met: -%I -%I \stelsubpaginanummerin[wijze=,status=] -%I -%I De status kan 'stop', 'start' of 'geen' zijn. In het -%I laatste geval wordt gewoon doorgenummerd, maar wordt het -%I nummer niet geplaatst. -%I -%I Standaard wordt 'perdeel' genummerd. De subnummers zijn -%I oproepbaar met: -%I -%I \subpaginanummer -%I \aantalsubpaginas - -% Standaard is \count0 in Plain TeX de paginateller. Omwille -% van de afhandeling van lokaal nummeren, definieren we -% echter een eigen nummer. - -\definieernummer - [\s!page] - [\c!conversie=\@@nmconversie, - \c!wijze=\@@nmwijze, - \c!status=\@@nmstatus, - \c!start=1] - -\def\dostelpaginanummerin[#1]% - {\getparameters - [\??pn] - [\c!status=\v!start, - #1]% - \doifinstringelse{\c!nummer}{#1} - {\setnummer[\s!page]{\@@pnnummer}% - \setuserpageno{\ruwenummer[\s!page]}}% - {}} - -\def\stelpaginanummerin% - {\dosingleargument\dostelpaginanummerin} - -\def\verlaagpaginanummer% - {\doif{\@@pnstatus}{\v!start} - {\verlaagnummer[\s!page]% - \setuserpageno{\ruwenummer[\s!page]}}} - -\def\verhoogpaginanummer% - {\processaction - [\@@pnstatus] - [ \v!start=>{\verhoognummer[\s!page]% - \setuserpageno{\ruwenummer[\s!page]}}, - \v!handhaaf=>{\doassign[\??pn][\c!status=\v!start]}]} - -\def\checkpagecounter% - {\checknummer{\s!page}} - -%I n=Pagina -%I c=\pagina -%I -%I Het volgende commando kan worden gebruikt om pagina's af -%I te dwingen of blokkeren: -%I -%I \pagina[instelling] -%I -%I Waarbij als instelling kan worden gegeven: -%I -%I ja een geforceerde paginaovergang met \vfill -%I opmaak een geforceerde paginaovergang zonder \vfill -%I nee bij voorkeur geen paginaovergang -%I voorkeur bij voorkeur de paginaovergang hier (3) -%I grotevoorkeur bij voorkeur de paginaovergang hier (7) -%I links ga naar een linker pagina -%I rechts ga naar een rechter pagina -%I leeg een lege pagina -%I blokkeer blokkeer ja ... grotevoorkeur (1 pagina) -%I reset het blokkering ja ... grotevoorkeur op -%I -%I Als geen instelling wordt meegegeven (\pagina), wordt een -%I overgang geforceerd. Als een nummer wordt meegegeven, wordt -%I naar de opgegeven pagina gegaan. - -\newif\ifpaginageblokkeerd -\paginageblokkeerdfalse - -\def\testpagina[#1][#2]% - {\global\!!doneafalse - \ifpaginageblokkeerd - \else - \ifdim\pagetotal<\pagegoal - \dimen0=\lineheight - \multiply\dimen0 by #1\relax - \advance\dimen0 by \pagetotal - \ifdim\lastskip<\parskip - \advance\dimen0 by \parskip - \fi - \advance\dimen0 by #2\relax - \ifdim\dimen0>.99\pagegoal - \penalty-\!!tenthousand\relax - \global\!!doneatrue - \fi - \else - \goodbreak - \fi - \fi} - -\let\resetcurrentsectionmarks=\relax - -% was: \resetsectionmarks[\firstsection], zie \handelpaginaaf - -% dummy page & insert check -% -% \def\complexpagina[#1]% -% {\flushfootnotes -% \processaction -% [#1] -% [ \v!reset=>\global\paginageblokkeerdfalse, -% \v!blokkeer=>\global\paginageblokkeerdtrue, -% \v!ja=>\ifpaginageblokkeerd\else -% \ejectinsert -% \ejectpage -% \ifbinnenkolommen -% \ejectpage % anders soms geen overgang -% \fi -% \fi, -% \v!opmaak=>\ifpaginageblokkeerd\else -% \eject -% \fi, -% \v!nee=>\ifpaginageblokkeerd\else -% \nobreak -% \fi, -% \v!voorkeur=>{\ifpaginageblokkeerd\else -% \ifbinnenkolommen -% \goodbreak -% \else -% \testpagina[3][\!!zeropoint]% -% \fi -% \fi}, -% \v!grotevoorkeur=>{\ifpaginageblokkeerd\else -% \ifbinnenkolommen -% \goodbreak -% \else -% \testpagina[5][\!!zeropoint]% -% \fi -% \fi}, -% \v!leeg=>{\ejectinsert -% \ejectpage -% \doifnotvalue{\??tk\v!hoofd\v!tekst\c!status}{\v!stop} -% {\stelhoofdin[\c!status=\v!leeg]}% -% \doifnotvalue{\??tk\v!voet\v!tekst\c!status}{\v!stop} -% {\stelvoetin[\c!status=\v!leeg]}% -% \hardespatie -% \vfill -% \ejectpage}, -% \v!links=>{\ejectinsert -% \superejectpage -% \doifbothsidesoverruled -% \orsideone -% \resetcurrentsectionmarks -% \hardespatie -% \vfill -% \ejectpage -% \orsidetwo -% \od}, -% \v!rechts=>{\ejectinsert -% \superejectpage -% \doifbothsidesoverruled -% \orsideone -% \orsidetwo -% \resetcurrentsectionmarks -% \hardespatie -% \vfill -% \ejectpage -% \od}, -% \v!even=>\doifonevenpaginaelse -% {\ejectinsert\ejectpage}{}, -% \v!oneven=>\doifonevenpaginaelse -% {}{\ejectinsert\ejectpage}, -% \v!viertal=>{\ifdubbelzijdig -% \!!counta=\realpageno -% \!!countb=\realpageno -% \divide\!!counta by 4\relax -% \divide\!!countb by 2\relax -% \ifnum\!!counta=\!!countb\relax -% \else -% \pagina -% \pagina[\v!leeg]% -% \pagina[\v!leeg]% -% \fi -% \fi}, -% \v!laatste=>{\ejectinsert -% \superejectpage -% \doifbothsidesoverruled -% \naastpagina -% \orsideone -% \orsidetwo -% \ifodd\realpageno \else -% \stelvoetin[\c!status=\v!leeg]% -% \stelhoofdin[\c!status=\v!leeg]% -% \hardespatie -% \vfill -% \ejectpage -% \fi -% \od}, -% \s!unknown=>\doifnumberelse{#1} -% {\ejectinsert -% \ejectpage -% \loop -% \ifnum\userpageno<#1\relax -% \hardespatie -% \vfill -% \ejectinsert -% \ejectpage -% \repeat} -% {}]} - -\def\insertdummypage% - {\ejectinsert % beter - \hardespatie - \vfill - \ejectpage} - -\def\docomplexpagina[#1]% - {\flushfootnotes - \bgroup - \processallactionsinset - [#1] - [ \v!reset=>\global\paginageblokkeerdfalse, - \v!blokkeer=>\global\paginageblokkeerdtrue, - \v!ja=>\ifpaginageblokkeerd\else - \ejectinsert - \ejectpage - \ifbinnenkolommen - \ejectpage % anders soms geen overgang - \fi - \fi, - \v!opmaak=>\ifpaginageblokkeerd\else - \eject - \fi, - \v!blanko=>\pagebodyornamentsfalse, - \v!nee=>\ifpaginageblokkeerd\else - \dosomebreak\nobreak - \fi, - \v!voorkeur=>{\ifpaginageblokkeerd\else - \ifbinnenkolommen - \dosomebreak\goodbreak - \else - \testpagina[3][\!!zeropoint]% - \fi - \fi}, - \v!grotevoorkeur=>{\ifpaginageblokkeerd\else - \ifbinnenkolommen - \dosomebreak\goodbreak - \else - \testpagina[5][\!!zeropoint]% - \fi - \fi}, - \v!leeg=>{\ejectinsert - \ejectpage - \doifnotvalue{\??tk\v!hoofd\v!tekst\c!status}{\v!stop} - {\stelhoofdin[\c!status=\v!leeg]}% - \doifnotvalue{\??tk\v!voet\v!tekst\c!status}{\v!stop} - {\stelvoetin[\c!status=\v!leeg]}% - \insertdummypage}, - \v!links=>{\ejectinsert - \superejectpage - \doifbothsidesoverruled - \orsideone - \resetcurrentsectionmarks - \insertdummypage - \orsidetwo - \od}, - \v!rechts=>{\ejectinsert - \superejectpage - \doifbothsidesoverruled - \orsideone - \orsidetwo - \resetcurrentsectionmarks - \insertdummypage - \od}, - \v!even=>\pagina - \doifonevenpaginaelse - {\resetcurrentsectionmarks\insertdummypage}{}, - \v!oneven=>\pagina - \doifonevenpaginaelse - {}{\resetcurrentsectionmarks\insertdummypage}, - \v!viertal=>{\ifdubbelzijdig - \!!counta=\realpageno - \!!countb=\realpageno - \divide\!!counta by 4 - \divide\!!countb by 2 - \ifnum\!!counta=\!!countb - \else - \pagina - \pagina[\v!leeg]% - \pagina[\v!leeg]% - \fi - \fi}, - \v!laatste=>{\ejectinsert - \superejectpage - \doifbothsidesoverruled - \naastpagina - \orsideone - \orsidetwo - %\ifodd\realpageno \else % kan weer weg - \geenhoofdenvoetregels - \insertdummypage - %\fi - \od - \filluparrangedpages}, - \s!unknown=>\doifnumberelse{#1} - {\ejectinsert - \ejectpage - \loop - \ifnum\userpageno<#1\relax - \insertdummypage - \repeat} - {}]% - \egroup} - -\def\complexpagina[#1]% - {\expanded{\docomplexpagina[#1]}} - -\def\simplepagina% - {\docomplexpagina[\v!ja]} - -\def\pagina% - {\complexorsimple{pagina}} - -\def\resetpagina% - {\global\paginageblokkeerdfalse} - -% \getpagestatus -% \ifrightpage als odd/enkelzijdig - -\newif\ifrightpage \rightpagetrue - -\newcounter \nofpagesets - -\definetwopasslist{\s!page} - -\def\dopagesetreference% - {\doglobal\increment\nofpagesets\relax - \edef\writepagref% - {\writeutilitycommand - {\twopassentry - {\s!page}% - {\nofpagesets}% - {\noexpand\realfolio}}}% - \writepagref} - -\def\getpagestatus% hierboven gebruiken - {\ifdubbelzijdig - \gettwopassdata{\s!page}% - \iftwopassdatafound \else - \let\twopassdata=\realpageno - \fi - \ifodd\twopassdata - \global\rightpagetrue - \else - \global\rightpagefalse - \fi - \dopagesetreference - \else - \global\rightpagetrue - \fi} - -%I n=Hoofdteksten -%I c=\stelnummeringin -%I c=\stelhoofdtekstenin,\stelvoettekstenin,\stelhoofdin,\stelvoetin -%I c=\stelboventekstenin,\stelondertekstenin,\stelbovenin,\stelonderin -%I -%I Zogeheten hoofd- en/of voetteksten kan men instellen -%I met: -%I -%I \stelhoofdtekstenin [linker tekst] [rechter tekst] -%I \stelvoettekstenin [linker tekst] [rechter tekst] -%I -%I Bij dubbelzijdig zetten worden de linker en rechter -%I teksten gespiegeld. -%I -%I In plaats van een tekst kunnen de woorden 'hoofdstuk', -%I 'paragraaf' en 'deel' worden meegegeven. Ook kan het -%I woord 'datum' worden meegegeven. -%P -%I Als men op de even en oneven pagina's een andere tekst -%I wil hebben, dan kan men een tweede paar meegeven. In dat -%I geval zijn er dus vier argumenten: [][][][]. -%I -%I Als men in de marge of randen teksten wil, kan men dat -%I direct achter het commando aangeven: -%I -%I \stelhoofdtekstenin [lokatie] [links] [rechts] -%I \stelvoettekstenin [lokatie] [links] [rechts] -%I -%I Mogelijke lokaties zijn: tekst, marge en rand. -%P -%I In de tekst opgenomen commando's kunnen soms voor -%I problemen zorgen. Commando's kan men daarom laten -%I voorafgaan \geentest, bijvoorbeeld: -%I -%I \stelvoettekstenin[\geentest\lastigcommando][] -%I -%I Meestal geven commando's geen problemen. Wel moet men -%I oppassen met []. Accolades zijn hiervoor de oplossing: -%I -%I \stelvoettekstenin[{{\huidigedatum[mm,/,jj]}}][] -%I -%I of -%I -%I \stelvoettekstenin[\geentest{\huidigedatum[mm,/,jj]}][] -%P -%I De wijze van nummeren wordt gedefinieerd met: -%I -%I \stelnummeringin[variant=,plaats=,conversie=, -%I links=,rechts=,tekst=,tekstscheider=,nummerscheider, -%I wijze=,blok=,status=,letter=,<sectie>nummer=,commando=] -%I -%I De plaats van het nummer hangt af van het eerste -%I meegegeven argument: -%I -%I enkelzijdig dubbelzijdig -%I -%I links, rechts kantlijn (links of rechts) -%I marge marge (links of rechts) -%I midden midden -%I inlinker, inrechter inlinker, inrechter -%P -%I Met plaats geeft men tevens aan of het nummer in het hoofd -%I of in de voet komt {hoofd,midden}. Met 'nummerscheider' geeft -%I men aan wat er binnen een (eventueel) samengestelde nummer -%I als scheider wordt gezet, standaard: 2-3. Met 'tekstscheider' -%I geeft men aan wat er tussen het paginanummer en een hoofd- of -%I voettekst wordt gezet (in geval van plaatsen op de marge). -%I -%I Liefhebbers kunnen aan 'commando' een eigen commando om het -%I nummer te zetten meegeven. Dit eigen commando krijgt als -%I argument het paginanummer mee. -%I -%I Het is mogelijk een dubbelzijdige tekst met enkelzijdige -%I marges te zetten: -%I -%I \stelnummeringin[variant={enkelzijdig,dubbelzijdig}] -%I -%I In dit geval worden de hoofd- en voetregels dus wel -%I gespiegeld en hebben commando's als \pagina[rechts] betekenis. -%P -%I Als 'conversie' is mogelijk: cijfers, letters, Letters, -%I romeins en Romeins. Als 'status' kan 'start' of 'stop' -%I worden meegegeven. Op deze manier kan het aangeven van -%I een paginanummer worden aan- en uitgezet. -%I -%I Er kan per sectienummer (deelnummer, hoofdstuknummer enz.) -%I worden ingesteld of het zichtbaar is ('ja' of 'nee'). -%I -%I Mogelijke wijzen van nummeren zijn: perdeel of perhoofdstuk. -%P -%I Hoofd- en voetregels blijven achterwege of juist niet na het -%I commando: -%I -%I \geenhoofdenvoetregels -%I \welhoofdenvoetregels -%I -%I of na: -%I -%I \stelhoofdin[lokatie][linkerletter=,rechterletter=, -%I letter=,linkerbreedte=,rechterbreedte=,voor=,na=] -%I \stelvoetin[locatie][linkerletter=,rechterletter=, -%I letter=,linkerbreedte=,rechterbreedte=,voor=,na=] -%I -%I mogelijke lokaties zijn: tekst, marge en rand. Als [lokatie] -%I wordt wegelaten, dan wordt tekst verondersteld. -%I -%I Als de breedte wordt ingesteld, dan wordt de weergegeven -%I tekst zonodig ingekort en gevolgd door ... -%P -%I Het is mogelijk het plaatsen van hoofd- en voetregels -%I stop te zetten: -%I -%I \stelhoofdin[status=] -%I \stelvoetin[status=] -%I -%I Aan status kunnen de olgende aarden worden toegekend: -%I -%I geen de kop/voet vervalt (de tekst schuift omhoog) -%I leeg de kop/voet blijft 1 pagina leeg -%I hoog de kop/voet vervalt 1 pagina leeg (idem) -%I normaal de kop/voet wordt gezet -%I stop de kop/voet blijft vanaf nu leeg -%I start de kop/voet wordt vanaf nu weer gevuld -%I -%I Het is ook mogelijk bij \stelhoofdin en \stelvoetin als -%I parameters [voor=] en [na=] mee te geven. De toegekende -%I commando's worden in dat geval voor en na het hoofd en de -%I de voet uitgevoerd. -%P -%I Boven het hoofd en onder de voet is ook ruimte. Deze kan -%I worden gedefinieerd met vergelijkbare commando's: -%I -%I \stelboventekstenin[...][...][...] -%I \stelondertekstenin[...][...][...] -%I -%I \stelbovenin[...] -%I \stelonderin[...] -%I -%I \geenbovenenonderregels -%I \welbovenenonderregels - -% De onderstaande macro's lijken op het eerste gezicht vrij -% ingewikkeld en omslachtig. Dit is het gevolg van een -% dubbel optioneel zijn van argumenten: zowel het eerste als -% de twee laatste argumenten zijn optioneel. Dit is mede het -% gevolg van een uitbreiding naar marges en randen, waarbij -% upward-compatibiliteit zwaar heeft gewogen. - -\def\dostellayouttekstin[#1][#2][#3]% - {\ifthirdargument - \getparameters[\??tk#1#2][#3]% - \else - \getparameters[\??tk#1\v!tekst][#2]% - \fi - \calculatevsizes} - -\def\stelbovenin {\dotripleempty\dostellayouttekstin[\v!boven]} -\def\stelhoofdin {\dotripleempty\dostellayouttekstin[\v!hoofd]} -\def\steltekstin {\dotripleempty\dostellayouttekstin[\v!tekst]} -\def\stelvoetin {\dotripleempty\dostellayouttekstin[\v!voet]} -\def\stelonderin {\dotripleempty\dostellayouttekstin[\v!onder]} - -\letvalue{\??tk\v!boven\v!tekst\c!status}=\v!normaal -\letvalue{\??tk\v!hoofd\v!tekst\c!status}=\v!normaal -\letvalue{\??tk\v!tekst\v!tekst\c!status}=\v!normaal -\letvalue{\??tk\v!voet \v!tekst\c!status}=\v!normaal -\letvalue{\??tk\v!onder\v!tekst\c!status}=\v!normaal - -\def\geenhoofdenvoetregels% - {\stelhoofdin[\c!status=\v!leeg]% - \stelvoetin[\c!status=\v!leeg]} - -\def\geenbovenenonderregels% - {\stelbovenin[\c!status=\v!leeg]% - \stelonderin[\c!status=\v!leeg]} - -\def\dolimitateteksten#1#2% - {\limitatetext{#2}{\getvalue{#1\c!breedte}}{}} - -\def\doteksten#1#2#3#4% - {\bgroup - \convertargument#4\to\ascii - \doifsomething{\ascii} - {\doattributes{#1#2#3} - {\doifvalue{#1\v!tekst\c!strut}{\v!ja}{\setstrut\strut}% hier! - \doifdefinedelse{\??mk\ascii\c!koppeling} % brrr - {\dolimitateteksten{#1#2#3}{\haalmarkering[\ascii][\v!eerste]}} - {\ConvertConstantAfter\doifelse{\v!paginanummer}{#4} - {\@@plaatspaginanummer} - {\ConvertConstantAfter\doifelse{\v!datum}{#4} - %{\currentdate[\v!dag,\v!maand,\v!jaar]} - {\currentdate} - {\opeenregel\dolimitateteksten{#1#2#3}{#4}}}}}}% - \egroup} - -\def\dodoteksten#1#2#3#4#5#6% - {\doifonevenpaginaelse - {\doteksten{#1}{#2}{#3}{#4}} - {\doteksten{#1}{#2}{#5}{#6}}} - -\def\dodododoteksten[#1][#2][#3][#4][#5][#6]% - {\ifsecondargument - \ifsixthargument - \setvalue{\??tk#1#2\c!linkertekst}% - {\dodoteksten{\??tk#1}{#2}{\c!linker}{#3}{\c!rechter}{#6}}% - \setvalue{\??tk#1#2\c!rechtertekst}% - {\dodoteksten{\??tk#1}{#2}{\c!rechter}{#4}{\c!linker}{#5}}% - \else\iffifthargument - \setvalue{\??tk#1\v!tekst\c!linkertekst}% - {\dodoteksten{\??tk#1}{\v!tekst}{\c!linker}{#2}{\c!rechter}{#5}}% - \setvalue{\??tk#1\v!tekst\c!rechtertekst}% - {\dodoteksten{\??tk#1}{\v!tekst}{\c!rechter}{#3}{\c!linker}{#4}}% - \else\iffourthargument - \setvalue{\??tk#1#2\c!linkertekst}% - {\dodoteksten{\??tk#1}{#2}{\c!linker}{#3}{\c!linker}{#3}}% - \setvalue{\??tk#1#2\c!rechtertekst}% - {\dodoteksten{\??tk#1}{#2}{\c!rechter}{#4}{\c!rechter}{#4}}% - \else - \setvalue{\??tk#1\v!tekst\c!linkertekst}% - {\dodoteksten{\??tk#1}{\v!tekst}{\c!linker}{#2}{\c!linker}{#2}}% - \setvalue{\??tk#1\v!tekst\c!rechtertekst}% - {\dodoteksten{\??tk#1}{\v!tekst}{\c!rechter}{#3}{\c!rechter}{#3}}% - \fi\fi\fi - \else - \dosixtupleempty\dodododoteksten[#1][\v!tekst][][][][]% - \dosixtupleempty\dodododoteksten[#1][\v!marge][][][][]% - \dosixtupleempty\dodododoteksten[#1][\v!rand] [][][][]% - \fi - \dosetpagenumberlocation\@@plaatspaginanummer} - -\def\stelboventekstenin {\dosixtupleempty\dodododoteksten[\v!boven]} -\def\stelhoofdtekstenin {\dosixtupleempty\dodododoteksten[\v!hoofd]} -\def\stelteksttekstenin {\dosixtupleempty\dodododoteksten[\v!tekst]} -\def\stelvoettekstenin {\dosixtupleempty\dodododoteksten[\v!voet]} -\def\stelondertekstenin {\dosixtupleempty\dodododoteksten[\v!onder]} - -\def\@@plaatspaginanummer% - {\doif{\@@nmstatus}{\v!start}% - {{\@@nmcommando{\doattributes{\??nm}{\volledigepaginanummer}}}}} - -\def\@@nmpre#1{\setbox0=\hbox{#1}\ifdim\wd0=\!!zeropoint\else\unhbox0\tfskip\fi} -\def\@@nmpos#1{\setbox0=\hbox{#1}\ifdim\wd0=\!!zeropoint\else\tfskip\unhbox0\fi} - -\def\dodoplaatsteksten#1#2#3#4#5#6% \hsize toegevoegd - {\hbox - {\hbox to \linkerrandbreedte - {\hsize\linkerrandbreedte - \hss\getvalue{\??tk#1\v!rand#2}}% - \hskip\linkerrandafstand - \hskip\pageseparation - \hbox to \linkermargebreedte - {\hsize\linkermargebreedte - \hsmash{\hbox to \linkermargebreedte - {\hss\getvalue{\??tk#1\v!marge#2}}}% - \hsmash{\hbox to \linkermargebreedte - {\hss#5{\??tk#1\v!marge\c!margetekst}}}% - \hss}% let op: \smashed - \hskip\linkermargeafstand - \hbox to \zetbreedte - {\hsize\zetbreedte - \hsmash{\hbox to \zetbreedte - {\@@nmpre{#5{\??tk#1\v!tekst\c!kantlijntekst}}% - \getvalue{\??tk#1\v!tekst#2}\hss}}% - \hsmash{\hbox to \zetbreedte - {\hss\getvalue{\??tk#1\v!tekst#3}\hss}}% - \hsmash{\hbox to \zetbreedte - {\hss\getvalue{\??tk#1\v!tekst#4}% - \@@nmpos{#6{\??tk#1\v!tekst\c!kantlijntekst}}}}% - \hss}% - \hskip\rechtermargeafstand - \hbox to \rechtermargebreedte - {\hsize\rechtermargebreedte - \hsmash{\hbox to \rechtermargebreedte - {\getvalue{\??tk#1\v!marge#4}\hss}}% - \hsmash{\hbox to \rechtermargebreedte - {#6{\??tk#1\v!marge\c!margetekst}\hss}}% - \hss}% let op: \smashed - \hskip\pageseparation - \hskip\rechterrandafstand - \hbox to \rechterrandbreedte - {\hsize\rechterrandbreedte - \getvalue{\??tk#1\v!rand#4}\hss}}} - -\def\doplaatslayoutregel#1#2% - {\ifdim#2>\!!zeropoint\relax % prevents pagenumbers when zero height - \goleftonpage - \hbox - {\setbox0=\vbox to #2 - {\forgetall - \vsize#2 - \normalbaselines - \def\\{ \ignorespaces}% - \def\crlf{ \ignorespaces}% - \getvalue{\??tk#1\v!tekst\c!voor}% - \doifbothsidesoverruled - \dodoplaatsteksten#1\c!linkertekst\c!middentekst\c!rechtertekst - \gobbleoneargument\getvalue - \orsideone - \dodoplaatsteksten#1\c!linkertekst\c!middentekst\c!rechtertekst - \gobbleoneargument\getvalue - \orsidetwo - \dodoplaatsteksten#1\c!rechtertekst\c!middentekst\c!linkertekst - \getvalue\gobbleoneargument - \od - \getvalue{\??tk#1\v!tekst\c!na}% - \kern\!!zeropoint}% keep the \dp, beware of \vtops, never change this! - \dp0=\!!zeropoint - \box0}% - \fi} - -% \stelhoofdin[status=normaal] \titel{NORMAAL} \dorecurse{8}{\input tufte} \pagina -% \stelhoofdin[status=hoog] \titel{HOOG} \dorecurse{8}{\input tufte} \pagina -% \stelhoofdin[status=leeg] \titel{LEEG} \dorecurse{8}{\input tufte} \pagina -% \stelhoofdin[status=geen] \titel{GEEN} \dorecurse{8}{\input tufte} \pagina -% \stelhoofdin[status=stop] \titel{STOP} \dorecurse{8}{\input tufte} \pagina - -\def\plaatslayoutregel#1#2% % handelt o.b.v. tekst - {\ExpandFirstAfter\processaction - [\getvalue{\??tk#1\v!tekst\c!status}] - [ \v!geen=>, - \v!hoog=>, % is reset later on - \v!start=>\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}% - \doplaatslayoutregel{#1}{#2}, - \v!stop=>\vskip#2\relax, - \v!leeg=>\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}% - \vskip#2\relax, - \v!geenmarkering=>\bgroup - \setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}% - \let\dohaalmarkering=\nohaalmarkering - \doplaatslayoutregel{#1}{#2}% - \egroup, - \v!normaal=>\doplaatslayoutregel{#1}{#2}, - \s!default=>\doplaatslayoutregel{#1}{#2}, - \s!unknown=>\doplaatslayoutregel{#1}{#2}]} - -\def\resetlayoutregel#1% - {\doifvalue{\??tk#1\v!tekst\c!status}{\v!hoog} - {\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}% ! global - \doglobal\calculatevsizes - \global\newlogostrue - \global\newbackgroundtrue}} - -\def\resetlayoutregels% - {\resetlayoutregel\v!boven - \resetlayoutregel\v!hoofd - \resetlayoutregel\v!tekst - \resetlayoutregel\v!voet - \resetlayoutregel\v!onder} - -\def\plaatsbovenregel {\plaatslayoutregel\v!boven\bovenhoogte} -\def\plaatshoofdregel {\plaatslayoutregel\v!hoofd\hoofdhoogte} -\def\plaatstekstregel {\plaatslayoutregel\v!tekst\teksthoogte} -\def\plaatsvoetregel {\plaatslayoutregel\v!voet\voethoogte} -\def\plaatsonderregel {\plaatslayoutregel\v!onder\onderhoogte} - -\def\gettextboxes% elders weghalen - {\bgroup - \setbox0=\vbox - {\mindermeldingen - \calculatereducedvsizes - \swapmargins - \forgetall - \offinterlineskip - \vskip-\bovenhoogte - \vskip-\bovenafstand - \plaatsbovenregel - \vskip\bovenafstand - \plaatshoofdregel - \vskip\hoofdafstand - \plaatstekstregel - \vskip\voetafstand - \plaatsvoetregel - \vskip\onderafstand - \plaatsonderregel - \plaatsversieaanduiding - \vfilll}% - \smashbox0 - \box0 - \egroup} - -\def\@@plaatspaginascheider% - {\doif{\@@nmstatus}{\v!start}% - {\@@nmtekstscheider}} - -% ook rand ondersteunen, iets als: - -% \def\dodosetpagenumberlocation#1#2% -% {\let\somepagenumberlocation=\v!tekst -% \ExpandFirstAfter\processallactionsinset -% [\@@nmplaats] -% [ \v!midden=>\setvalue{\??tk#1\somepagenumberlocation\c!middentekst}{#2}, -% \v!links=>\setvalue{\??tk#1\somepagenumberlocation\c!linkertekst}{#2}, -% \v!rechts=>\setvalue{\??tk#1\somepagenumberlocation\c!rechtertekst}{#2}, -% \v!inlinker=>\setvalue{\??tk#1\v!marge\c!linkertekst}{#2}, -% \v!inrechter=>\setvalue{\??tk#1\v!marge\c!rechtertekst}{#2}, -% \v!inmarge=>\setvalue{\??tk#1\v!marge\ifdubbelzijdig\c!margetekst\else\c!rechtertekst\fi}{#2}, -% \v!marge=>\setvalue{\??tk#1\v!marge\ifdubbelzijdig\c!margetekst\else\c!rechtertekst\fi}{#2}, -% \v!opmarge=>\setvalue{\??tk#1\v!tekst\c!kantlijntekst}{#2}, -% \v!kantlijn=>\setvalue{\??tk#1\v!tekst\c!kantlijntekst}{#2} -% \v!rand=>\let\somepagenumberlocation=\v!rand, -% %\v!marge=>\let\somepagenumberlocation=\v!marge, -% \v!tekst=>\let\somepagenumberlocation=\v!tekst]} - -\def\dodosetpagenumberlocation#1#2% - {\ExpandFirstAfter\processallactionsinset - [\@@nmplaats] - [ \v!midden=>\setvalue{\??tk#1\v!tekst\c!middentekst}{#2}, - \v!links=>\setvalue{\??tk#1\v!tekst\c!linkertekst}{#2}, - \v!rechts=>\setvalue{\??tk#1\v!tekst\c!rechtertekst}{#2}, - \v!inlinker=>\setvalue{\??tk#1\v!marge\c!linkertekst}{#2}, - \v!inrechter=>\setvalue{\??tk#1\v!marge\c!rechtertekst}{#2}, - \v!inmarge=>\setvalue{\??tk#1\v!marge\ifdubbelzijdig\c!margetekst\else\c!rechtertekst\fi}{#2}, - \v!marge=>\setvalue{\??tk#1\v!marge\ifdubbelzijdig\c!margetekst\else\c!rechtertekst\fi}{#2}, - \v!opmarge=>\setvalue{\??tk#1\v!tekst\c!kantlijntekst}{#2}, - \v!kantlijn=>\setvalue{\??tk#1\v!tekst\c!kantlijntekst}{#2}]} - -\def\dosetpagenumberlocation#1% - {\ExpandBothAfter\doifinsetelse{\v!hoofd}{\@@nmplaats,\@@nmin} - {\dodosetpagenumberlocation{\v!hoofd}{#1}} - {\dodosetpagenumberlocation{\v!voet}{#1}}} - -\def\@@nmin {} % kan vervallen (upward compatibility) -\def\@@nmplaats {} % mag {plaats, in} zijn - -\def\dostelnummeringin[#1]% - {\dosetpagenumberlocation\relax - \getparameters[\??nm][#1]% - \preparepaginaprefix{\??nm}% - \enkelzijdigfalse - \dubbelzijdigfalse - \ExpandFirstAfter\processallactionsinset - [\@@nmvariant] - [ \v!enkelzijdig=>\enkelzijdigtrue, - \v!dubbelzijdig=>\dubbelzijdigtrue]% - \ifdubbelzijdig - \trackingmarginnotestrue - \else - \trackingmarginnotesfalse - \fi - \dosetpagenumberlocation\@@plaatspaginanummer - \global\newbackgroundtrue - \global\newlogostrue} - -\def\stelnummeringin% - {\dosingleempty\dostelnummeringin} - -% listig: hangt af van \@@kolijst - -\def\preparepaginaprefix#1% - {\def\dopreparepaginaprefix##1% - {\doifvalue{#1##1\c!nummer}{\v!ja} - {\setvalue{#1\getvalue{\??by##1}\c!nummer}{\v!ja}}}% - \processcommacommand[\@@kolijst]\dopreparepaginaprefix} - -\def\dopaginaprefix#1#2% - {\doifelsevalue{#1#2\c!nummer}{\v!ja}% - {\@EA\beforesplitstring\@EA{\postprefix}\at:\to\preprefix - \@EA\aftersplitstring\@EA{\postprefix}\at:\to\postprefix - \doifsomething{\preprefix} - {\doifnot{\preprefix}{0}{\preprefix\@@nmnummerscheider}}}% - {\@EA\aftersplitstring\@EA{\postprefix}\at:\to\postprefix}} - -\def\paginaprefix#1[#2::#3::#4]% kan wat sneller ####1:0: - {\bgroup - \edef\postprefix{#3}% - \def\donexttrackcommando##1% - {\dopaginaprefix{#1}{##1}% - \donexttracklevel{##1}}% - \donexttrackcommando\firstsection - \egroup} - -\def\@@plaatspaginanummer% - {\doif{\@@nmstatus}{\v!start}% - {{\@@nmcommando{\doconvertfont{\@@nmletter}{\volledigepaginanummer}}}}} - -\def\@@plaatspaginascheider% - {\doif{\@@nmstatus}{\v!start}% - {\@@nmtekstscheider}} - -\def\userfolio% naast realfolio - {\nummer[\s!page]} - -\def\pagenumber% - {\userfolio} - -\def\volledigepaginanummer% alleen voor paginanummers !! - {\@@nmlinks - \def\donexttrackcommando##1% - {\doifvalue{\??nm##1\c!nummer}{\v!ja} - {\ifnum\countervalue{\??se##1}>0\relax - \getvalue{##1\c!nummer}\@@nmnummerscheider - \fi}% - \doifsomething{\@@nmtekst} - {\@@nmtekst\@@nmnummerscheider}% - \donexttracklevel{##1}}% - \donexttrackcommando{\firstsection}% - \pagenumber - \@@nmrechts} - -\def\translatednumber[#1::#2::#3]% - {#3} - -%I n=Markeringen -%I c=\markeer,\haalmarkering -%I c=\definieermarkering,\stelmarkeringin,\resetmarkering -%I -%I Men kan in een tekst markeringen aanbrengen. Een markering -%I kan bijvoorbeeld worden opgehaald in een kopregel. -%I -%I \definieermarkering[categorie] -%I -%I Een markering wordt aangebracht met het commando: -%I -%I \markeer[categorie]{tekst} -%I -%I Er kunnen drie markeringen worden opgevraagd met het -%I commando: -%I -%I \haalmarkering[categorie][plaats] -%I -%I Mogelijke plaatsen zijn: eerste, laatste, vorige. Vorige -%I staat voor de laatste markering op de vorige bladzijde en -%I eerste en laatste hebben betrekking op de huidige bladzijde. -%P -%I Markeringen worden ge(de)blokkeerd met het commando: -%I -%I \stelmarkeringin[categorie][status=,expansie=] -%I -%I waarbij als instellingen mogelijk zijn: start en stop. -%I Standaard wordt een markering niet ge‰xpandeerd. Wil met -%I wel expanderen (wat bij tellers nodig is), dan kan dat -%I worden ingesteld: expansie=ja. -%I -%I Markeringen kunnen worden geinitialiseerd met: -%I -%I \resetmarkering[categorie] -%I -%I Standaard worden de markeringen 'deel', 'hoofdstuk', 'paragraaf', -%I 'subparagraaf' en 'subsubparagraaf bijgehouden. -%P -%I Soms wordt een argument voor meerdere doeleinden gebruikt, -%I bijvoorbeeld in \hoofdstuk{tekst}. Hierbij is {tekst} -%I zowel de kop van het hoofdstuk als de eventueel te plaatsen -%I markering in de hoofd- of voetregel. Als zo'n tekst te lang -%I wordt, kan ze als volgt worden beperkt: -%I -%I {eerste tweede \geenmarkering{derde vierde} vijfde} -%I -%I De woorden 'derde' en 'vierde' worden in dit geval in de -%I markering vervangen door punten. - -% Het commando \newmark\markering genereert -% -% \markering -% -% en het commando \getmarks\markering genereert -% -% \topmarkering -% \botmarkering -% \firstmarkering -% -% voor 'interne' doeleinden zijn beschikbaar: -% -% \prefetchmark[naam] -% \fetchmark[naam][plaats] - -% nog expansie in hoofdmarkering - -\def\hoofdmarkering#1% - {\getvalue{\??mk#1\c!koppeling}} - -\def\dodoresetmarkering#1% - {\expandafter\newmark\csname\??mk\hoofdmarkering{#1}\endcsname} - -\def\doresetmarkering[#1]% - {\processcommalist[#1]\dodoresetmarkering} - -\def\resetmarkering% - {\dosingleargument\doresetmarkering} - -\def\dostelmarkeringin[#1][#2]% - {\getparameters[\??mk#1][#2]} - -\def\stelmarkeringin% - {\dodoubleargument\dostelmarkeringin} - -\setvalue{\??mk\v!vorige}{top} -\setvalue{\??mk\v!eerste}{first} -\setvalue{\??mk\v!laatste}{bot} - -\def\dododefinieermarkering[#1][#2]% - {\stelmarkeringin[#1] - [% \c!expansie=\v!nee, scheelt weer een macro - \c!status=\v!start]% - \ontkoppelmarkering[#1]% d.w.z. geen koppeling met secties - \setevalue{\??mk#1\c!koppeling}{#2}% - \expandafter\newmark\csname\??mk#2\endcsname - %\setgvalue{\??mk#2\s!check}{0}% - \showmessage{\m!systems}{13}{#1,[#2]}} - -\def\dodefinieermarkering[#1][#2]% - {\doifelsenothing{#2} - {\dododefinieermarkering[#1][#1]} - {\dododefinieermarkering[#1][#2]}} - -\def\definieermarkering% - {\dodoubleempty\dodefinieermarkering} - -\let\geenmarkering=\relax - -\def\prefetchmark[#1]% - {%\ifnum\getvalue{\??mk\hoofdmarkering{#1}\s!check}<\realpageno - % \setxvalue{\??mk\hoofdmarkering{#1}\s!check}{\the\realpageno}% - % \expandafter\getmarks\csname\??mk\hoofdmarkering{#1}\endcsname % mag maar eenmaal per pagina - }%\fi} - -\def\fetchmark[#1][#2]% - {\getvalue{\getvalue{\??mk#2}\??mk\hoofdmarkering{#1}}} - -\def\nohaalmarkering[#1][#2]% tzt anders - {} - -\def\dohaalmarkering[#1][#2]% - {\doifvalue{\??mk#1\c!status}{\v!start} - {\bgroup - %\prefetchmark[#1]% - \def\geenmarkering##1{\onbekend\ }% - \doifelsenothing{#2} - {\fetchmark[#1][\v!eerste]} - {\fetchmark[#1][#2]}% - \egroup}} - -\def\haalmarkering% - {\dodoubleargument\dohaalmarkering} - -\def\domarkeer[#1]#2% - {\bgroup - \doifelsevalue{\??mk#1\c!expansie}{\v!ja} - {\expandmarkstrue} - {\expandmarksfalse}% - \getvalue{\??mk\hoofdmarkering{#1}}{#2}% - \egroup} - -\def\markeer% - {\dosingleargument\domarkeer} - -%I n=Tekstonderdelen -%I c=\hoofdstuk,\paragraaf,\subparagraaf,\subsubparagraaf -%I c=\titel,\onderwerp,\subonderwerp,\subsubonderwerp,\alinea -%I c=\stelkopin,\stelkoppenin,\stelkopnummerin -%I c=\startbijlagen,\bijlage -%I c=\startinleidingen,\startuitleidingen -%I -%I Een tekst wordt gestructureerd met de commando's: -%I -%I \titel [referentie] {titel} -%I \onderwerp [referentie] {onderwerp} -%I \subonderwerp [referentie] {onderwerp} -%I \subsubonderwerp [referentie] {onderwerp} -%I -%I \hoofdstuk [referentie] {titel} -%I \paragraaf [referentie] {titel} -%I \subparagraaf [referentie] {titel} -%I \subsubparagraaf [referentie] {titel} -%I -%I In een {titel} kan het commando \\ worden gebruikt om naar -%I een volgende regel te gaan. Wil men ook in de inhoudsopgave -%I naar een nieuwe regel gaan, dan dient \crlf te worden -%I gebruikt. -%P -%I Op een hoger niveau kunnen delen worden gedefinieerd. In -%I dat geval wordt standaard geen kop geplaatst (het kan -%I wel). -%I -%I \deel [referentie] {titel} -%I -%I In totaal zijn er 7 niveaus voorgedefinieerd. Meer -%I niveaus zijn mogelijk. Het hoogste niveau is op dit -%I moment dus \deel en het laagste \subsubsubsubparagraaf. -%P -%I Naar een hoofdstuk en een paragraaf kan worden -%I terugverwezen met: -%I -%I \inhoofdstuk[referentie] -%I \inparagraaf[referentie] -%I -%I Zodat verwijzingen als 'zie ook hoofdstuk 2' mogelijk -%I zijn (zie ook \inhoofdstuk[alfa]). -%I -%I Ook kunnen de elders besproken commando's worden -%I gebruikt. Een referentie kan eventueel worden weggelaten, -%I bijvoorbeeld \hoofdstuk{titel}. -%P -%I Een overgang naar een nieuwe alinea kan worden afgedwongen -%I met het commando: -%I -%I \alinea -%I -%I Dit commando komt overeen met het commando \par. -%P -%I Aanvullend zijn de volgende commando's beschikbaar. Deze -%I commando's onderdrukken cq. wijzigen de nummering. -%I -%I \startbijlagen hoofdstukken nummeren met a, b, ... -%I \stopbijlagen hoofdstukken nummeren met 1, 2, ... -%I -%I \startinleidingen hoofdstukken niet nummeren -%I \stopinleidingen hoofdstukken wel nummeren -%I \startuitleidingen hoofdstukken niet nummeren -%I \stopuitleidingen hoofdstukken wel nummeren -%I -%I Als men bijlagen apart wil nummeren, dan gebruikt men in -%I plaats van \hoofdstuk het commando: -%I -%I \bijlage[referentie]{titel} -%I -%I waarna de eigenlijke tekst komt of wordt ingelezen uit -%I een file. -%P -%I De wijze waarop hoofdstukken en paragrafen worden genummerd -%I en gezet, kan worden ingesteld met de commando's: -%I -%I \stelkoppenin[variant=,scheider=] -%I -%I Hierbij zijn als varianten mogelijk normaal en inmarge. -%I -%I Daarnaast is het volgende commando beschikbaar: -%I -%I \stelkopin[element][letter=,nummerletter=,tekstletter=, -%I voor=,na=,pagina=,uitlijnen=,hoofd=] -%I -%I Mogelijke elementen zijn: hoofdstuk, paragraaf, -%I subparagraaf, subsubparagraaf en indien gewenst: titel en -%I onderwerp. -%P -%I Aan de parameters voor en na kunnen commando's worden -%I toegekend; 'nummer', 'tekst' en 'letter' staan voor de -%I lettertypen. Standaard zijn 'nummer' en 'tekst' gelijk -%I aan 'letter'. In de regel kan men volstaan met het -%I instellen van hoofdstuk en paragraaf, omdat de andere -%I instellingen hiervan worden afgeleid. Voorbeelden van -%I instellingen zijn 'letter=vet', 'voor={\blanko[groot]}' -%I en 'nummer=\tfa'. -%I -%I Aan 'pagina' kan de waarde 'links', 'rechts' of 'ja' worden -%I toegekend. Er wordt alleen naar een nieuwe pagina gegaan als -%I het nummer van de (sub)(sub)paragraaf groter is dan 1. -%I Wil men altijd overgaan op een nieuwe bladzijde, dan kan -%I men dit aangeven door aan 'doorgaan' de waarde 'nee' toe -%I te kennen. -%P -%I Een hoofdstuk kan worden voorafgegaan door een woord, -%I bijvoorbeeld 'Hoofdstuk'. Dit woord kan worden ingesteld -%I met \stellabeltekstin. -%I -%I Als men aan 'hoofd' de waarde 'geen' toekent, dan wordt -%I geen hoofdregel geplaatst op de bladzijde waarop de kop -%I wordt geplaatst. -%I -%I Het is mogelijk varianten van koppen te definieren met het -%I commando: -%I -%I \definieerkop[dochter][moeder] -%I -%I Na \definieerkop[rubriek][onderwerp] is het commando \rubriek -%I beschikbaar met dezelfde kenmerken als \onderwerp. Deze -%I kenmerken kunnen worden aangepast met \stelkopin. Als de -%I moeder een genummerde kop is, wordt de dochter ook genummerd. -%P -%I Nummers van koppen kunnen worden ingesteld met het commando: -%I -%I \stelkopnummerin[niveau][nummer] -%I -%I Als het nummer wordt vooraf gegaan door + of -, dan is -%I sprake van een verhoging of verlaging: [hoofdstuk][+2]. - -%T n=hoofdstuk -%T m=hfd -%T a=h -%T -%T \hoofdstuk{?} - -%T n=paragraaf -%T m=par -%T a=p -%T -%T \paragraaf{?} - -\newcount\nofsections - -\def\zerosection{\v!tekst} -\def\firstsection{} -\def\lastsection{} - -\makecounter{\??se\v!tekst} -\setevalue{\??se\v!tekst\c!voor}{} -\setevalue{\??se\v!tekst\c!na}{} -\setevalue{\v!tekst\c!nummer}{0} -\setevalue{\v!tekst\s!format}{} - -\setevalue{\??sk\v!tekst}{} -\setevalue{\??sk}{} - -\setvalue{\??by}{\v!tekst} -\setvalue{\??by\v!tekst}{\v!tekst} -\setvalue{\??by\v!alles}{\v!tekst} -\setvalue{\??by\v!per}{\v!tekst} -\setvalue{\??by\v!per\v!tekst}{\v!tekst} -\setvalue{\??by\v!per\v!alles}{\v!tekst} - -\def\dostelsectiein[#1][#2]% - {\getparameters[\??se#1][#2] - \doifelsevalue{\??se#1\c!vorige\c!nummer}{\v!ja} - {\setvalue{#1\c!nummer}{\@@longsectionnumber{#1}}}% - {\setvalue{#1\c!nummer}{\@@shortsectionnumber{#1}}}} - -\def\stelsectiein% - {\dodoubleargument\dostelsectiein} - -\def\dokoppelmarkering[#1][#2]% - {\doifdefinedelse{\??ko#2\c!sectie} - {\dokoppelmarkering[#1][\getvalue{\??ko#2\c!sectie}]} - {\def\donexttrackcommando##1% - {\edef\gekoppeldemarkeringen{\getvalue{\??se##1\c!markering}}% - \doifelse{##1}{#2} - {\addtocommalist{#1}\gekoppeldemarkeringen} - {\removefromcommalist{#1}\gekoppeldemarkeringen}% - \setevalue{\??se##1\c!markering}{\gekoppeldemarkeringen}% - \donexttracklevel{##1}}% - \donexttracklevel{\firstsection}}} - -\def\koppelmarkering% - {\dodoubleargument\dokoppelmarkering} - -\def\ontkoppelmarkering[#1]% - {\koppelmarkering[#1][]} - -\def\definieersectie[#1]% - {\doifundefined{\??se#1} - {\doifelsenothing{\firstsection} - {\def\firstsection{#1}% - \setevalue{\??se#1\c!voor}{\v!tekst}% - \setevalue{\??se\v!tekst\c!na}{#1}}% - {\setevalue{\??se\commalistelement\c!na}{#1}% - \setevalue{\??se#1\c!voor}{\lastsection}% - \setevalue{\??se\lastsection\c!na}{#1}}% - \advance\nofsections by 1 - \setevalue{\??se#1\c!niveau}% - {\the\nofsections}% - \setevalue{\??se#1\c!na}% - {}% - \setvalue{\e!volgende#1}% - {\@@nextsectionnumber{#1}}% - \setvalue{#1\c!nummer}% - {\@@longsectionnumber{#1}}% - \setvalue{#1\s!format}% - {\@@longformatnumber{#1}}% - \setevalue{\??by#1}{#1}% - \setevalue{\??by\v!per#1}{#1}% - \makecounter{\??se#1}% - \def\lastsection{#1}% - \setvalue{\??sk#1}% - {#1}% - \setvalue{\??se#1\c!markering}% - {}% - \stelsectiein[#1] - [\c!vorige\c!nummer=\v!ja]}}% - -\def\previoussection#1% - {\getvalue{\??se#1\c!voor}} - -\def\nextsection#1% - {\getvalue{\??se#1\c!na}} - -\def\@@setsectionnumber#1#2% - {\setgvalue{\??se#1\s!start}{}% % signal i.p.v. boolean - \setcounter{\??se#1}{#2}% - \resetsectioncounters[#1]% - \checkpagecounter} - -\def\@@nextsectionnumber#1% - {\setgvalue{\??se#1\s!start}{}% % signal i.p.v. boolean - \pluscounter{\??se#1}% - \resetsectioncounters[#1]% - \checkpagecounter} - -\def\@@sectionvalue#1% % nog niet overal doorgevoerd - {\countervalue{\??se#1}} % zoeken op \??se - -\def\@@sectionconversion#1% - {\getvalue{\??cv\getvalue{\??se#1\@@sectieblok\c!conversie}}} - -% Omdat een markering kan worden herdefinieerd moeten we -% eerst testen of er wel een keten||afhankelijkheid is. - -\def\resetsectionmarks[#1]% - {\ExpandFirstAfter\doifdefinedelse{\??se#1} - {\def\donexttrackcommando##1% - {\def\docommando####1% - {\ExpandFirstAfter\resetmarkering[####1]}% - \processcommacommand[\getvalue{\??se##1\c!markering}]\docommando - \donexttracklevel{##1}}% - \donexttracklevel{#1}}% - {\ExpandFirstAfter\resetmarkering[\hoofdmarkering{#1}]}} - -\def\resetsectioncounters[#1]% - {\def\donexttrackcommando##1% - {\resetcounter{\??se##1}% - \donexttracklevel{##1}}% - \donexttracklevel{#1}} - -% bij checken kan geen prefix worden bekeken, anders vallen -% er titels buiten de inhoudsopgave - -\def\makesectionformat% - {\@EA\edef\@EA\sectionformat\@EA% - {\@@sectiontype:\getvalue{\lastsection\s!format}}} - -\def\dobacktracklevel#1% - {\doifnot{\previoussection{#1}}{\zerosection} - {\dobacktrackcommando{\previoussection{#1}}}} - -\def\donexttracklevel#1% - {\doifnot{#1}{\lastsection} - {\donexttrackcommando{\nextsection{#1}}}} - -\newif\ifalllevels - -\def\dosetlevel#1% - {\bgroup - \doifelse{#1}{\v!vorige} - {\global\alllevelstrue - \xdef\currentlevel{}% - \def\dobacktrackcommando##1% - {\ifnum\countervalue{\??se##1}>0 - \global\alllevelsfalse - \xdef\currentlevel{\getvalue{\previoussection{##1}\s!format}}% - \else - \dobacktracklevel{##1}% - \fi}% - \dobacktrackcommando\lastsection}% - {\doifelse{\getvalue{\??by#1}}{\v!tekst} - {\global\alllevelstrue - \xdef\currentlevel{}} - {\doifdefinedelse{\??ko#1\c!sectie} % beter alteratief: ook - {\edef\@@sectie{\getvalue{\??ko#1\c!sectie}}} % hoofdstuk\c!format - {\edef\@@sectie{#1}}% - \doifdefinedelse{\??se\@@sectie} - {\global\alllevelsfalse - \xdef\currentlevel{\getvalue{\@@sectie\s!format}}} - {\global\alllevelstrue - \xdef\currentlevel{}% - \def\dobacktrackcommando##1% - {\@EA\ifx\csname\??se##1\c!start\endcsname\relax - \dobacktracklevel{##1}% - \else - \ifnum\countervalue{\??se##1}>0 - \global\alllevelsfalse - \xdef\currentlevel{\getvalue{##1\s!format}}% - \else - \dobacktracklevel{##1}% - \fi - \fi}% - \dobacktrackcommando\lastsection}}}% - \egroup} - -\def\doifnextlevelelse[#1::#2]#3#4% - {\ifalllevels - #3% - \else - \doifelse{\@@sectiontype}{#1} % \@EA kunnen denk ik weg - {\@EA\doifinstringelse\@EA{\@EA=\currentlevel:}{=:#2:} - {\@EA\doifinstringelse\@EA{\@EA=\currentlevel:0}{=:#2:}{#4}{#3}} - {#4}} - {#4}% - \fi} - -\def\doifprevlevelelse[#1::#2]#3#4% - {\ifalllevels - #3% - \else - \doifelse{\@@sectiontype}{#1} - {\@EA\doifinstringelse\@EA{\@EA=\currentlevel:}{=:#2:} - {#3} - {#4}} - {#4}% - \fi} - -\def\dosettoclevel{\dosetlevel} -\def\dosetreglevel{\dosetlevel} -\def\dosetblklevel{\dosetlevel} - -\def\doiftoclevelelse{\doifnextlevelelse} -\def\doifreglevelelse{\doifprevlevelelse} -\def\doifblklevelelse{\doifprevlevelelse} - -\def\@@longformatnumber#1% - {\getvalue{\previoussection{#1}\s!format}:\@@shortsectionnumber{#1}} - -\def\@@longsectionnumber#1% - {\ifnum\countervalue{\??se\previoussection{#1}}>0 - \getvalue{\previoussection{#1}\c!nummer}\@@koscheider - \fi - \@@shortsectionnumber{#1}} - -\def\@@shortsectionnumber#1% - {\@EA\ifx\csname\??se#1\@@sectieblok\c!conversie\endcsname\relax - \@@sectionvalue{#1}% - \else - \@@sectionconversion{#1}{\@@sectionvalue{#1}}% - \fi} - -\def\dodosetlocalsectieblok[#1#2][#3]% - {\def\@@sectiontype{#1}% - \def\@@sectieblok{#1#2}% - \def\@@sectieblokken{#3}} - -\def\dosetlocalsectieblok#1#2% - {\@EA\dodosetlocalsectieblok\@EA[#1][#2]} - -\def\doaroundsectieblok#1% - {\doifvaluesomething{\??sb#1\c!pagina} - {\ExpandFirstAfter\pagina[\getvalue{\??sb#1\c!pagina}]}% - \resetsectioncounters[\firstsection]% - \resetsectionmarks[\firstsection]} - -\def\dostartsectieblok#1#2% - {\begingroup - \doaroundsectieblok{#1}% - \dosetlocalsectieblok{#1}{#2}% - \expandafter\csname#2true\endcsname -\getvalue{\??sb\@@sectieblok\c!voor}% don't move - \showmessage{\m!structures}{1}{\@@sectieblokken}} - -\def\dostopsectieblok% - {\showmessage{\m!structures}{2}{\@@sectieblokken}% -\getvalue{\??sb\@@sectieblok\c!na}% don't move - \doaroundsectieblok{\@@sectieblok}% - \endgroup} - -\def\dostelsectieblokin[#1][#2]% - {\getparameters[\??sb#1][#2]} - -\def\stelsectieblokin% - {\dodoubleargument\dostelsectieblokin} - -\def\dodefinieersectieblok[#1][#2][#3]% - {\getparameters - [\??sb#1] - [\c!nummer=\v!ja, - \c!pagina=\v!rechts, % anders worden marks te vroeg gereset ! - %\c!voor=, - %\c!na=, - #3]% - \expandafter\newif\csname if#2\endcsname - \setvalue{\??sb#1}% - {\dosetlocalsectieblok{#1}{#2}}% - \setvalue{\e!start#2}% - {\dostartsectieblok{#1}{#2}}% - \setvalue{\e!stop#2}% - {\dostopsectieblok}} - -\def\definieersectieblok% - {\dotripleargument\dodefinieersectieblok} - -\def\sectiebloklabel#1% - {\@EA\ifx\csname#1\@@sectieblok\c!label\endcsname\relax - \else - \labeltext{\getvalue{#1\@@sectieblok\c!label}}% - \fi} - -% BETER: - -\def\sectiebloklabel#1% - {\@EA\ifx\csname\??ko#1\@@sectieblok\c!label\endcsname\relax - \labeltext{#1}% - \else - \labeltext{\getvalue{\??ko#1\@@sectieblok\c!label}}% - \fi} - -\dosetlocalsectieblok{\v!hoofdtekst}{\v!hoofdteksten} - -\def\setsectiontype[#1]% - {\getvalue{\??sb#1}} - -\def\writesection#1#2#3% - {\bgroup - \convertargument#3\to\ascii - \edef\!!stringa{#1}% - \@EA\writestatus\@EA - {\!!stringa} - {\ifsectienummer#2\else(#2)\fi\normalspace\ascii}% - \egroup} - -\def\@@koniveau{1} \def\kopniveau{\@@koniveau} - -% \def\dohandelpaginaafA#1% -% {\ifnum\lastpenalty>0 -% \global\paginageblokkeerdtrue -% \fi -% \witruimte -% \flushsidefloats -% \getvalue{\??ko#1\c!voor}% -% \ifpaginageblokkeerd -% \global\paginageblokkeerdfalse -% \else -% \!!countb=\getvalue{\??se\@@sectie\c!niveau}\relax -% \ifnum\!!countb>\@@koniveau\relax -% \!!counta=20000 -% \multiply\!!countb by 500 -% \advance\!!counta by \!!countb -% \dosomebreak{\penalty\!!counta}% -% \else -% \dosomebreak{\allowbreak}% -% \fi -% \fi -% \xdef\@@koniveau{\getvalue{\??se\@@sectie\c!niveau}}} -% -% \def\dohandelpaginaafB#1% -% {\doifinset{\getvalue{\??ko#1\c!pagina}}{\v!ja,\v!rechts,\v!links} -% {\def\resetcurrentsectionmarks% toegevoegd, zie \pagina -% {\resetsectionmarks[\previoussection{\@@sectie}]}% -% \pagina[\getvalue{\??ko#1\c!pagina}]% -% \doifinset{\getvalue{\??tk\v!hoofd\v!tekst\c!status}}{\v!normaal,\v!start} -% {\doifvaluesomething{\??ko#1\c!hoofd} -% {\stelhoofdin[\c!status=\getvalue{\??ko#1\c!hoofd}]}}}} -% -% \def\handelpaginaaf#1% -% {\dohandelpaginaafA{#1}% -% \ifnum\countervalue{\??se\previoussection{\@@sectie}}>0 -% \ifnum\countervalue{\??se\@@sectie}>0 -% \dohandelpaginaafB{#1}% -% \else -% \doifnotvalue{\??ko#1\c!doorgaan}{\v!ja} -% {\dohandelpaginaafB{#1}}% -% \fi -% \else -% \dohandelpaginaafB{#1}% -% \fi} - -\def\dohandelpaginaafAA#1% - {\ifnum\lastpenalty>0 - \global\paginageblokkeerdtrue - \fi} - -\def\dohandelpaginaafAB#1% - {\flushsidefloats - \getvalue{\??ko#1\c!voor}% - %\witruimte vervangen door \noindent elders - \relax - \ifpaginageblokkeerd - \global\paginageblokkeerdfalse - \else - \!!countb=\getvalue{\??se\@@sectie\c!niveau}\relax - \ifnum\!!countb>\@@koniveau\relax - \!!counta=20000 - \multiply\!!countb by 500 - \advance\!!counta by \!!countb - \dosomebreak{\penalty\!!counta}% - \else - \dosomebreak{\allowbreak}% - \fi - \fi - \xdef\@@koniveau{\getvalue{\??se\@@sectie\c!niveau}}} - -\def\dohandelpaginaafB#1% - {\doifinset{\getvalue{\??ko#1\c!pagina}}{\v!ja,\v!rechts,\v!links} - {\def\resetcurrentsectionmarks% toegevoegd, zie \pagina - {\resetsectionmarks[\previoussection{\@@sectie}]}% - \pagina[\getvalue{\??ko#1\c!pagina}]% - \doifinset{\getvalue{\??tk\v!hoofd\v!tekst\c!status}}{\v!normaal,\v!start} - {\doifvaluesomething{\??ko#1\c!hoofd} - {\stelhoofdin[\c!status=\getvalue{\??ko#1\c!hoofd}]}}}} - -\def\handelpaginaaf#1% - {\dohandelpaginaafAA{#1}% - \ifnum\countervalue{\??se\previoussection{\@@sectie}}>0 - \ifnum\countervalue{\??se\@@sectie}>0 - \dohandelpaginaafB{#1}% - \else - \doifnotvalue{\??ko#1\c!doorgaan}{\v!ja} - {\dohandelpaginaafB{#1}}% - \fi - \else - \dohandelpaginaafB{#1}% - \fi - \dohandelpaginaafAB{#1}} - -% - -\def\dolocalkopsetup#1% koppeling met standaard kopcommando - {\forgetall - \ExpandFirstAfter\steluitlijnenin[\getvalue{\??ko#1\c!uitlijnen}]% - \def\\{\crlf\strut}} - -\newif\ifplaatskop -\newif\ifverhoognummer -\newif\ifkopnummer - -\def\setsectieenkoppeling#1% - {\edef\@@koppeling{\getvalue{\??ko#1\c!koppeling}}% - \edef\@@sectie{\getvalue{\??ko#1\c!sectie}}% - \doifnothing{\@@koppeling} - {\edef\@@koppeling{#1}}% - \doifnothing{\@@sectie} - {\edef\@@sectie{\getvalue{\??ko\@@koppeling\c!sectie}}}} - -\newif\ifkopprefix - -% \handelpaginaaf komt het eerst omdat eventueel -% subpaginanummers moeten worden afgehandeld. Vervolgens -% worden de nummers opgehoogd en referenties geset, dan -% volgt de kop en tot slot de worden de marks en de prefix -% geset. - -% \hoofdstuk {tekst} -% \hoofdstuk tekst -% \hoofdstuk <niets> - -\def\dosomekop#1[#2]#3% - {\doifelsevalue{\??ko#1\c!eigennummer}{\v!ja} - {\def\next{\doquadruplegroupempty\dodosomekop{#1}{#2}{#3}}} - {\def\next{\fourthargumentfalse\dodosomekop{#1}{#2}{#3}{}}}% - \next} - -\def\dodosomekop#1#2#3#4% - {\iffourthargument - \dododosomekop{#1}[#2]{\sectiebloklabel{#1}}{#3}{#4}% - \else - \dododosomekop{#1}[#2]{\sectiebloklabel{#1}}{\getvalue{\@@sectie\c!nummer}}{#3}% - \fi} - -\def\dododosomekop#1[#2]#3#4#5% % pas met \ExpandFirstAfter op bij twee||taligheid - {\flushingcolumnfloatsfalse - \setsectieenkoppeling{#1}% - \doifelsevalue{\??ko#1\c!prefix}{} - {\kopprefixfalse} - {\kopprefixtrue}% - \doifelsevalue{\??ko#1\c!plaatskop}{\v!ja} - {\plaatskoptrue} - {\plaatskopfalse}% - \doifelsevalue{\??ko#1\c!verhoognummer}{\v!ja} - {\verhoognummertrue} - {\verhoognummerfalse}% - \ifsectienummer - \doifelsevalue{\??sb\@@sectieblok\c!nummer}{\v!ja} - {\doifelsevalue{\??ko#1\c!nummer}{\v!ja} - {\kopnummertrue} - {\kopnummerfalse}} - {\kopnummerfalse}% - \else - \kopnummerfalse - \fi - \ifverhoognummer - \ifplaatskop - \handelpaginaaf{#1}% - \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...] - \ifkopprefix - \setupreferencing[\c!prefix=-]% - \fi - \getvalue{\e!volgende\@@sectie}% - \getvalue{\??ko#1\c!tussen}% - \ifkopnummer - \noindent % ipv \witruimte elders - \doplaatskopnummertekst - {#1} - {\setsectionlistreference{\@@sectie}{#1}% - \ExpandFirstAfter\soortpagina[\@@koppeling]% - \rawreference{\s!sec}{#2}{#4}% - \resetsectionmarks[\@@sectie]% - \doschrijfnaarlijst{\@@koppeling}{#4}{#5}{\v!kop}} - {#3#4} - {#5} - {\markeer[#1]{#5}% }% - \bepaalkopnummer[#1]% - \expanded{\markeer[#1\v!nummer]{\getvalue{\@@sectie\c!nummer}}}}% - \writesection{#1}{#4}{#5}% - \else - \noindent % ipv \witruimte elders - \doplaatskoptekst - {#1} - {\setsectionlistreference{\@@sectie}{#1}% - \ExpandFirstAfter\soortpagina[\@@koppeling]% - \rawpagereference{\s!sec}{#2}% - \resetsectionmarks[\@@sectie]% - \doschrijfnaarlijst{\@@koppeling}{}{#5}{\v!kop}} - {#5} - {\markeer[#1]{#5}% }% - \bepaalkopnummer[#1]% - \expanded{\markeer[#1\v!nummer]{\getvalue{\@@sectie\c!nummer}}}}% - \writesection{#1}{-}{#5}% - \fi - \ifkopprefix - \ExpandFirstAfter\setupreferencing[\c!prefix=\getvalue{\??ko#1\c!prefix}]% - \fi - \dosomebreak\nobreak - \getvalue{\??ko#1\c!na}% - \else - \dohandelpaginaafB{#1}% toegevoegd ivm subpaginanr / tug sheets - \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...] - \ifkopprefix - \setupreferencing[\c!prefix=-]% - \fi - \getvalue{\e!volgende\@@sectie}% - \getvalue{\??ko#1\c!tussen}% - \setsectionlistreference{\@@sectie}{#1}% - \resetsectionmarks[\@@sectie]% - \markeer[#1]{#5}% - \bepaalkopnummer[#1]% - \expanded{\markeer[#1\v!nummer]{\getvalue{\@@sectie\c!nummer}}}% - \ExpandFirstAfter\soortpagina[\@@koppeling]% - \ifkopnummer - \rawreference{\s!sec}{#2}{#4}% - \doschrijfnaarlijst{\@@koppeling}{#4}{#5}{\v!kop}% - \writesection{#1}{#4}{#5}% - \else - \rawpagereference{\s!sec}{#2}% - \doschrijfnaarlijst{\@@koppeling}{}{#5}{\v!kop}% - \writesection{#1}{-}{#5}% - \fi - \ifkopprefix - \ExpandFirstAfter\setupreferencing[\c!prefix=\getvalue{\??ko#1\c!prefix}]% - \fi - \fi - \else - \ifplaatskop - \handelpaginaaf{#1}% - \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...] - \getvalue{\??ko#1\c!tussen}% - \noindent % ipv \witruimte elders - \doplaatskoptekst - {#1} - {\rawpagereference{\s!sec}{#2}} - {#5} - {}% - \writesection{#1}{-}{#5}% - \dosomebreak\nobreak - \getvalue{\??ko#1\c!na}% - \else - % do nothing - \fi - \fi - \flushingcolumnfloatstrue} - -% \prevdepth\dp\strutbox is belangrijk, vergelijk naast elkaar: -% -% \onderwerp{test} \input tufte -% \onderwerp{test} \strut \input tufte -% \onderwerp{test} \plaatslijst[...] - -\def\doplaatskoptekst#1#2#3#4% - {\bgroup - \forgetall - %\showcomposition - \mindermeldingen - \postponefootnotes - \def\localkopsetup% - {\dolocalkopsetup{#1}}% - \startsynchronisatie - \snaptogrid\hbox - {\getvalue{\??ko#1\c!commando} - {} % no number - {\doattributes{\??ko#1}{\doattributes{\??ko#1\c!tekst} - {\dontconvertfont - \stelinterliniein - #2% - \getvalue{\??ko#1\c!voorcommando}% - \getvalue{\??ko#1\c!tekstcommando}{\setstrut\begstrut#3\endstrut}% - \getvalue{\??ko#1\c!nacommando}% - \endgraf}}}} - \endgraf - \nointerlineskip - \dosomebreak\nobreak - #4% - \prevdepth\openstrutdepth % \dp\strutbox % ivm grid - \stopsynchronisatie - \egroup - \noindentation} - -\def\doplaatskopnummertekst#1#2#3#4#5% - {\bgroup - \forgetall - %\showcomposition - \mindermeldingen - \postponefootnotes - \def\localkopsetup% - {\dolocalkopsetup{#1}}% - \startsynchronisatie - \snaptogrid\hbox - {\getvalue{\??ko#1\c!commando}% - {\doattributes{\??ko#1}{\doattributes{\??ko#1\c!nummer} - {\getvalue{\??ko#1\c!voorcommando}% - \getvalue{\??ko#1\c!nummercommando}{\setstrut\begstrut#3\endstrut}}}} - {\doattributes{\??ko#1}{\doattributes{\??ko#1\c!tekst} - {\dontconvertfont - \stelinterliniein - #2% - \getvalue{\??ko#1\c!tekstcommando}{\setstrut\begstrut#4\endstrut}% - \getvalue{\??ko#1\c!nacommando}% - \endgraf}}}} - \endgraf - \nointerlineskip - \dosomebreak\nobreak - #5% - \prevdepth\openstrutdepth % \dp\strutbox % important, see comment - \stopsynchronisatie - \egroup - \noindentation} - -\def\dostelkopnummerin[#1][#2#3]% - {\bgroup - \setsectieenkoppeling{#1}% - \doifinstringelse{#2}{+-} - {\doifelse{#3}{} - {\@@nextsectionnumber{\@@sectie}} - {\!!counta=#2#3\relax - \advance\!!counta by \@@sectionvalue{\@@sectie}% - \@@setsectionnumber{\@@sectie}{\!!counta}}} - {\@@setsectionnumber{\@@sectie}{#2#3}}% - \egroup} - -\def\stelkopnummerin% - {\dodoubleargument\dostelkopnummerin} - -% \def\dokopnummer[#1]% -% {\bgroup -% \setsectieenkoppeling{#1}% -% \doifnot{\getvalue{\@@sectie\c!nummer}}{0} % kan effienter -% {\getvalue{\@@sectie\c!nummer}}% -% \egroup} -% -% beter : - -\def\huidigekopnummer{0} - -\def\bepaalkopnummer[#1]% - {\bgroup - \setsectieenkoppeling{#1}% - \xdef\huidigekopnummer{\@@sectionvalue{\@@sectie}}% - \egroup} - -\def\dokopnummer[#1]% - {\bgroup - \setsectieenkoppeling{#1}% - \xdef\huidigekopnummer{\@@sectionvalue{\@@sectie}}% - \doifnot{\huidigekopnummer}{0} - {\getvalue{\@@sectie\c!nummer}}% - \egroup} - -\def\kopnummer% - {\dosingleargument\dokopnummer} - -\def\alinea% - {\par} - -\def\plaatskopnormaal#1#2% - {\doifelsenothing{#1} - {\vbox - {\localkopsetup - \noindent - #2}}% - {\setbox0=\hbox{{#1}\hskip0.75em}% - \vbox - {\localkopsetup - \hangindent 1\wd0 - \hangafter 1 - \noindent - \unhbox0 % don't use \strut's here! - #2}}} - -\def\plaatskopinmarge#1#2% - {\vbox - {\localkopsetup - \begstrut % but use one \strut here! - \doifsomething{#1} - {\llap{\hbox to 5em{\hfill{#1}\hskip\linkermargeafstand}}}% - {#2}}} - -\def\plaatskopmidden#1#2% - {\vbox - {\localkopsetup - \raggedcenter - \doifsomething{#1}{\strut#1\par}\begstrut#2}} - -\def\plaatsgeenkop#1#2% - {} - -% default == instellingen -% koppeling == koppen, breaks, marks, enz. -% sectie == nummering - -\let\@@kolijst=\empty - -\def\dodefinieerkop[#1][#2]% % don't preset prefix to much - {\presetlabeltext[#1=]% - \getparameters - [\??ko#1] - [\c!nummerletter=\getvalue{\??ko#1\c!letter}, - \c!tekstletter=\getvalue{\??ko#1\c!letter}, - \c!nummerkleur=\getvalue{\??ko#1\c!kleur}, - \c!tekstkleur=\getvalue{\??ko#1\c!kleur}]% - \ConvertToConstant\doifinstringelse{=}{#2} - {\getparameters - [\??ko#1] - [\c!sectie=\getvalue{\??ko\getvalue{\??ko#1\c!koppeling}\c!sectie}, - \c!default=, - \c!koppeling=, - \c!prefix=, - \c!voor=, - \c!na=, - \c!pagina=, - \c!hoofd=, - \c!letter=, - \c!nummercommando=, - \c!tekstcommando=, - \c!eigennummer=\v!nee, - \c!nummer=\v!ja, - \c!kleur=, - \c!doorgaan=\v!ja, - \c!plaatskop=\v!ja, - \c!verhoognummer=\v!ja, - \c!commando=\@@plaatskop, - #2]% - \ConvertToConstant\doifnot{#1}{\getvalue{\??ko#1\c!default}} - {\doifsomething{\getvalue{\??ko#1\c!default}} - {%\presetlabeltext[#1=\labeltext{\getvalue{\??ko#1\c!default}}]% - \copyparameters - [\??ko#1][\??ko\getvalue{\??ko#1\c!default}] - [\c!voor,\c!na,\c!commando,\c!pagina,\c!doorgaan,\c!hoofd, - \c!nummer,\c!eigennummer,\c!plaatskop,\c!verhoognummer, - \c!letter,\c!kleur, - %\c!nummerletter,\c!tekstletter, - \c!nummercommando,\c!tekstcommando]}}% - \getparameters[\??ko#1][#2]% - \doifsomething{\getvalue{\??ko#1\c!sectie}} - {\doifundefined{\??mk#1} - {\definieermarkering[#1]% - \koppelmarkering[#1][\getvalue{\??ko#1\c!sectie}]% - \definieermarkering[#1\v!nummer]% - \koppelmarkering[#1\v!nummer][\getvalue{\??ko#1\c!sectie}\v!nummer]}}% - \doifundefined{\??li#1}{\definieerlijst[#1]}} - {\ConvertToConstant\doifelse{#1}{#2} - {\doifundefined{\??li#1}{\definieerlijst[#1]}} - {%\presetlabeltext[#1=\labeltext{#2}]% - \copyparameters - [\??ko#1][\??ko#2] - [\c!niveau,\c!sectie,\c!koppeling,\c!prefix, - \c!voor,\c!na,\c!commando,\c!pagina,\c!doorgaan,\c!hoofd, - \c!nummer,\c!eigennummer,\c!plaatskop,\c!verhoognummer, - \c!letter,\c!kleur, - %\c!nummerletter,\c!tekstletter, - \c!nummercommando,\c!tekstcommando]% - \definieermarkering[#1][#2]% - \definieermarkering[#1\v!nummer][#2\v!nummer]% - \doifundefined{\??li#1}{\definieerlijst[#1][#2]}}}% - \addtocommalist{#1}\@@kolijst - \setevalue{\??sk#1}% - {\getvalue{\??ko#1\c!koppeling}}% - \setevalue{\??by#1}% - {\getvalue{\??ko#1\c!sectie}}% - \setevalue{\??by\v!per#1}% - {\getvalue{\??ko#1\c!sectie}}% - \setvalue{#1}% - {\complexorsimpleempty{#1}}% - \setvalue{\s!complex#1}[##1]% - {\dowithpargument{\dosomekop{#1}[##1]}}} - -\def\definieerkop% - {\dodoubleemptywithset\dodefinieerkop} - -\def\dostelkopin[#1][#2]% - {\getparameters[\??ko#1][#2]% - % The next check prevents hard to trace problems. I once - % set \c!commando to nothing and (quite natural) got the - % wrong references etc. The whole bunch should be boxed! - \expandafter\convertcommand\csname\??ko#1\c!commando\endcsname\to\ascii - \doifnothing{\ascii} - {\setvalue{\??ko#1\c!commando}{\@@plaatskop}}} - -\def\stelkopin% - {\dodoubleargumentwithset\dostelkopin} - -\newif\ifsectienummer \sectienummertrue - -\def\dostelkoppenin[#1]% - {\getparameters[\??ko][#1]% - \doifelse{\@@kosectienummer}{\v!ja} - {\sectienummertrue} - {\sectienummerfalse}% - \processaction - [\@@kovariant] - [ \v!normaal=>\def\@@plaatskop{\plaatskopnormaal}, - \v!midden=>\def\@@plaatskop{\plaatskopmidden}, - \v!marge=>\def\@@plaatskop{\plaatskopinmarge}, - \v!inmarge=>\def\@@plaatskop{\plaatskopinmarge}]} - -\def\stelkoppenin% - {\dosingleargument\dostelkoppenin} - -\def\systemsuppliedchapter {\getvalue{\v!hoofdstuk}} -\def\systemsuppliedtitle {\getvalue{\v!titel}} - -\def\complexbijlage[#1]#2% - {\pagina[\v!rechts] - \stelnummeringin[\c!status=\v!stop] - \systemsuppliedchapter[#1]{#2} - \pagina[\v!rechts] - \stelnummeringin[\c!status=\v!start] - \stelpaginanummerin[\c!nummer=1]} - -\setvalue{\v!bijlage}% - {\complexorsimpleempty{bijlage}} - -%I n=Selecteren -%I c=\soortpagina,\verwerkpagina,\koppelpagina -%I -%I Het is mogelijk pagina's te markeren en selectief te -%I verwerken. Markering vindt plaats met het commando: -%I -%I \soortpagina[aanduiding] -%I -%I en selecteren vindt plaats met: -%I -%I \verwerkpagina[aanduiding,...][instelling] -%I -%I waarbij de instelling 'ja' of 'nee' is en meerdere -%I aanduidingen worden gescheiden door een comma. -%P -%I Er kunnen commando's worden gekoppeld aan pagina's: -%I -%I \koppelpagina[aanduiding,...][voor=,na=,optie=] -%I -%I De opgegeven commando's worden voor respectievelijk na het -%I vrijgeven van de pagina uitgevoerd. - -% hier nog uti blokkeren - -\newif\ifgeselecteerd -\geselecteerdtrue - -\newif\ifselecteren -\selecterenfalse - -\newif\ifverwerken -\verwerkentrue - -\def\selectie{} -\def\paginasoort{} - -\let\naastpagina=\relax -\let\napagina=\relax -\let\voorpagina=\relax - -\def\dovoorpagina% - {\doifsomething{\paginasoort} - {\def\dododopagina##1% - {\global\let\voorpagina=\relax - \getvalue{\??pg##1\c!voor}}% - \processcommacommand[\paginasoort]\dododopagina}} - -\def\dododonapagina#1% - {\global\let\napagina=\relax - \gdef\paginasoort{}% - \getvalue{\??pg#1\c!na}} - -\def\donapagina% - {\doifsomething{\paginasoort} - {\def\dodopagina##1% - {\doifelsevalue{\??pg##1\c!optie}{\v!dubbelzijdig} - {\doifbothsidesoverruled - \dododonapagina{##1}% - \orsideone - \dododonapagina{##1}% - \orsidetwo - \od}% - {\dododonapagina{##1}}}% - \processcommacommand[\paginasoort]\dodopagina}} - -\def\dosoortpagina[#1]% - {\doglobal\addtocommalist{#1}{\paginasoort}% - \ifselecteren - \ExpandBothAfter\doifcommon{#1}{\selectie} - {\global\geselecteerdtrue}% - \fi - \gdef\voorpagina{\dovoorpagina}% - \gdef\napagina{\donapagina}} - -\def\soortpagina% - {\dosingleargument\dosoortpagina} - -\def\dokoppelpagina[#1][#2]% - {\getparameters - [\??pg] - [\c!voor=, - \c!na=, - \c!optie=, - #2]% - \def\docommando##1% - {\getparameters - [\??pg##1] - [\c!voor=\@@pgvoor, - \c!na=\@@pgna, - \c!optie=\@@pgoptie]}% - \processcommalist[#1]\docommando}% - -\def\koppelpagina% - {\dodoubleargument\dokoppelpagina} - -\def\doverwerkpagina[#1][#2]% - {\processaction - [#2] - [ \v!ja=>\global\verwerkentrue, - \v!nee=>\global\verwerkenfalse]% - \gdef\selectie{#1}% - \global\selecterentrue - \global\geselecteerdfalse} - -\def\verwerkpagina% - {\dodoubleargument\doverwerkpagina} - -\def\resetselectiepagina% - {\ifselecteren - \doifbothsidesoverruled - \global\geselecteerdfalse - \orsideone - \orsidetwo - \global\geselecteerdfalse - \od - \fi} - -\newif\iflocation - -\def\ifinteractief{\iflocation} - -\def\previoussectionformat{} -\def\currentsectionformat{} - -\let\updatelistreferences=\relax -\def\updatedlistreferences{} - -\def\setsectionlistreference#1#2% - {\ifnum\countervalue{\??se\previoussection{#1}}>0\relax - \xdef\previoussectionformat{\@@longformatnumber{\previoussection{#1}}}% - \else - \xdef\previoussectionformat{}% - \fi - \xdef\currentsectionformat{\@@longformatnumber{#1}}} - -\def\startlistreferences#1% - {\thisissomeinternal{\s!lst}{#1\currentsectionformat}% - \setxvalue{\v!vorige\c!lokale#1}{\s!lst:#1\previoussectionformat}% - \setxvalue{\c!huidige\c!lokale#1}{\s!lst:#1\currentsectionformat}% - \doifelse{\currentsectionformat}{} - {\setglobalcrossreference - {\v!vorige#1}{}{\realfolio}{}} - {\setglobalsystemreference\rt!list - {\v!vorige#1}{\getvalue{\v!vorige\c!lokale#1}}}% - \def\stoplistreferences{\dostoplistreferences}} - -\def\dostoplistreferences#1% - {\iflijstgeplaatst - \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal) - \global\let\updatedlistreferences=\updatedlistreferences % een noodverbandje - \gdef\updatelistreferences% - {\def\docommando####1% - {\setglobalsystemreference\rt!list - {\v!vorige####1}{\getvalue{\c!huidige\c!lokale####1}}}% - \processcommacommand[\updatedlistreferences]\docommando - \global\let\updatelistreferences=\relax - \gdef\updatedlistreferences{}}% - \fi} - -\def\stoplistreferences% - {\gobbleoneargument} - -% de rest - -\newcount\prefixteller - -\def\referenceprefix{} - -% \def\showlocation #1{#1} -% \def\showcontrastlocation#1#2#3{#3} -% \def\showcoloredlocation #1#2{#2} - - -\def\referencepagenumber[#1]% - {\donottest % nodig i.v.m. scannen {tekst} bij [referentie] in \op - {\paginaprefix\??rf[#1]% - \translatednumber[#1]}} - -%I n=Regels -%I c=\startregels,\stelregelsin -%I c=\startregelnummeren,\stelregelnummerenin -%I c=\crlf -%I c=\startregel,\stopregel,\eenregel,\inregel -%I -%I Het is mogelijk de indeling in regels zoals die in de ruwe -%I tekst wordt gehanteerd af te dwingen. Er wordt in dit -%I geval niet ingesprongen. De regels worden gezet tussen de -%I twee commando's: -%I -%I \startregels -%I -%I ................................................... -%I -%I \stopregels -%P -%I Er kan met betrekking tot regels een en ander worden -%I ingesteld: -%I -%I \stelregelsin[voor=,na=,inspringen=] -%I -%I Aan 'inspringen' kan men 'ja', 'nee', 'even' of 'oneven' -%I toekennen. -%P -%I Het is mogelijk regels te nummeren door ze tussen de -%I volgende commando's te plaatsen: -%I -%I \startregelnummeren -%I \stopregelnummeren -%I -%I Als de regelovergangen moeten worden gehandhaafd, dan moet -%I \startregels voor \startregelnummeren worden gegeven. -%I -%I Het nummeren begint steeds opnieuw bij 1. Als verder moet -%I worden genummeren, dan kan achter \startregelnummeren -%I [verder] worden meegegeven. -%I -%I Standaard worden regels alinea-gewijs genummerd. Als men -%I over een paginagrens wil nummeren, dan moet [opelkaar] -%I worden meegegeven. -%P -%I De wijze van nummeren kan worden ingesteld met: -%I -%I \stelregelnummerenin[conversie=,start=,stap=,letter=, -%I plaats=,breedte=,letter=] -%I -%I Als 'conversie' kan worden meegegeven: cijfers, letters, -%I Letters, romeins of Romeins. Aan 'start' en 'stap' kan -%I een getal worden toegekend, aan 'letter' een trefwoord, -%I aan 'breedte' een maat (bij voorkeur in ex) en aan -%I 'plaats' het trefwoord 'inmarge' of 'intekst'. -%P -%I Er kan worden overgegaan naar een nieuwe regel met: -%I -%I \crlf -%P -%I .... testfase ... -%I -%I \startregel[tag] ... \stopregel[tag] -%I \eenregel[tag] -%I -%I \inregel[tag] - -\newif\ifinregels -\newif\ifregelnummersinmarge - -\def\stelregelsin% - {\dodoubleargument\getparameters[\??rg]} - -\def\startregels% - {\@@rgvoor - \pagina[\v!voorkeur]% - \witruimte - \begingroup - \def\@@rgstepyes{\parindent\!!zeropoint}% - \def\@@rgstepno{\parindent\!!zeropoint}% - \edef\@@rgparindent{\the\parindent}% - \def\@@rglinesteptoggle{1}% - \processaction - [\@@rginspringen] - [ \v!ja=>\def\@@rgstepyes{\parindent\@@rgparindent}% - \def\@@rgstepno{\parindent\@@rgparindent}, - \v!oneven=>\def\@@rgstepyes{\parindent\!!zeropoint}% - \def\@@rgstepno{\parindent\@@rgparindent}, - \v!even=>\def\@@rgstepno{\parindent\!!zeropoint}% - \def\@@rgstepyes{\parindent\@@rgparindent}]% - \inregelstrue - \stelwitruimtein[\v!geen]% - \obeylines - \ignorespaces - \def\obeyedline% - {\par - \ifdim\lastskip>\!!zeropoint - \def\@@rglinesteptoggle{0}% - \else - \increment\@@rglinesteptoggle - \fi - \ifodd\@@rglinesteptoggle\relax - \@@rgstepyes - \else - \@@rgstepno - \fi}% - \GotoPar} - -\def\stopregels% - {\endgroup - \@@rgna} - -\newcount\linenumber -\newcount\linestepper - -% het gebruik van \setlocalreference scheelt een hash entry - -\def\regelweergave% - {\convertnumber\@@rnconversie\linenumber}% - -\def\dostelregelnummerenin[#1]% - {\getparameters - [\??rn] - [\c!start=1, - \c!stap=1, - #1]% - \global\linenumber=1\relax} - -\def\stelregelnummerenin% - {\dosingleargument\dostelregelnummerenin} - -\def\dostartnummerenLINE% % !! \everypar !! - {\EveryPar{\schrijfregelnummer}} - -\def\dostopnummerenLINE% - {\egroup} - -\def\dodoschrijfregelnummer% - {\setbox0=\hbox{\regelweergave}% - \vsmashbox0 - \ifregelnummersinmarge - \llap{\hbox{\box0\hskip\linkermargeafstand}}% - \else - \llap{\hbox to \@@rnbreedte{\box0\hss}}% - \fi} - -\def\complexstartregelnummeren[#1]% - {\doifnotinset{\v!verder}{#1} - {\global\linenumber=1\relax}% - \doifinsetelse{\@@rnplaats}{\v!inmarge,\v!marge} - {\regelnummersinmargetrue} - {\regelnummersinmargefalse}% - \ifregelnummersinmarge\else - \advance\leftskip by \@@rnbreedte\relax - \fi - \ifinregels - \let\dostartnummeren=\dostartnummerenLINE - \let\stopregelnummeren=\dostopnummerenLINE - \def\schrijfregelnummer% - {\doschrijfregelnummer - \global\advance\linenumber by 1\relax}% - \else - \let\dostartnummeren=\dostartnummerenPAR - \let\stopregelnummeren=\dostopnummerenPAR - \def\schrijfregelnummer% - {\global\advance\linenumber by -1\relax - \doschrijfregelnummer}% - \fi - \dostartnummeren} - -\def\startregelnummeren% - {\bgroup - \complexorsimpleempty{startregelnummeren}} - -\def\doschrijfregelnummer% - {\ifnum\linenumber<\@@rnstart\relax - \else - \!!counta=\linenumber - \divide\!!counta by \@@rnstap\relax - \multiply\!!counta by \@@rnstap\relax - \ifnum\!!counta=\linenumber - \doattributes{\??rn}{\dodoschrijfregelnummer}% - \fi - \fi} - -\def\regelreferentie#1[#2]% - {\bgroup - \dimen0=\dp\strutbox - \doif{\@@rnrefereren}{\v!aan} - {\doglobal\increment\linereference - \setxvalue{lrf:n:\linereference}{\@@rnprefix#2}% - \setxvalue{lrf:l:\linereference}{0}% - \setxvalue{lrf:p:\linereference}{#1}% - \advance\dimen0 by \linereference sp}% - \prewordbreak - \vrule \!!width \!!zeropoint \!!depth \dimen0 - \prewordbreak - \egroup} - -\def\eenregel[#1]% - {\regelreferentie0[#1]\ignorespaces} - -\def\startregel[#1]% - {\regelreferentie1[#1]\ignorespaces} - -\def\stopregel[#1]% - {\unskip\regelreferentie2[#1]} - -\def\inregellabel#1% - {\doifinstringelse{--}{#1} - {\labeltext{\v!regels}} - {\labeltext{\v!regel}}} - -\def\inregel#1[#2]% - {\doifelsenothing{#1} - {\in{\inregellabel{\currenttextreference}}[\@@rnprefix#2]} - {\in{#1}[\@@rnprefix#2]}} - -\def\dostartnummerenPAR% - {\beginofshapebox - \doglobal\newcounter\linereference} - -% localcrossref heroverwegen - -\def\dostopnummerenPAR% dp's -> openstrutdepth - {\endofshapebox - \linestepper=0 - \reshapebox{\global\advance\linestepper by 1\relax}% - \global\advance\linenumber by \linestepper - \doifelse{\@@rnrefereren}{\v!aan} - {\reshapebox % We are going back! - {\global\advance\linenumber by -1 - \dimen0=\dp\shapebox - \advance\dimen0 by -\dp\strutbox - \ifdim\dimen0>\!!zeropoint\relax - \dostepwiserecurse{1}{\number\dimen0}{1} - {\setxvalue{lrf:l:\recurselevel}{\the\linenumber}}% - \fi}% - \global\advance\linenumber by \linestepper - \ifnum\linereference>0 % anders vreemde loop in paragraphs+recurse - \dorecurse{\linereference} - {\edef\linereferenceplus{\getvalue{lrf:p:\recurselevel}}% - \ifnum\linereferenceplus=2 - \edef\linereferencename{\getvalue{lrf:n:\recurselevel}}% - \edef\linereferenceline{\getvalue{lrf:l:\recurselevel}}% - \setlocalcrossreference{\referenceprefix\linereferencename}{}{}{\linereferenceline}% - \fi}% - \dorecurse{\linereference} - {\edef\linereferenceplus{\getvalue{lrf:p:\recurselevel}}% - \ifnum\linereferenceplus<2 - \edef\linereferencename{\getvalue{lrf:n:\recurselevel}}% - \edef\linereferenceline{\getvalue{lrf:l:\recurselevel}}% - \ifnum\linereferenceplus=1 -\getreferenceelements{\linereferencename}% - \ifnum\linereferenceline<0\currenttextreference\relax % 0 prevents error - \edef\linereferenceline{\linereferenceline--\currenttextreference}% - \fi - \fi -\setlocalcrossreference{\referenceprefix\linereferencename}{}{}{\linereferenceline}% - \fi}% - \global\let\scratchline=\linenumber % We are going back! - \reshapebox - {\doglobal\decrement\scratchline - \hbox - {\dorecurse{\linereference} - {\edef\linereferencename{\getvalue{lrf:n:\recurselevel}}% -\getreferenceelements{\linereferencename}% - \beforesplitstring\currenttextreference--\at--\to\firstline - \ifnum\firstline=\scratchline\relax - % beter een rawtextreference -\textreference[\linereferencename]{\currenttextreference}% -\setlocalcrossreference{\referenceprefix\linereferencename}{}{}{0}% ==done - \fi}% - \dimen0=\dp\shapebox - \advance\dimen0 by -\dp\strutbox - \ifdim\dimen0>\!!zeropoint\relax - \dp\shapebox=\dp\strutbox - \fi - \schrijfregelnummer\box\shapebox}}% - \else - \reshapebox{\hbox{\schrijfregelnummer\box\shapebox}}% - \fi} - {\reshapebox{\global\advance\linenumber by -1}% - \global\advance\linenumber by \linestepper - \reshapebox{\hbox{\schrijfregelnummer\box\shapebox}}}% - \global\advance\linenumber by \linestepper - \flushshapebox - \egroup} - -\def\crlf% - {\unskip\hfil\break} - -\def\opeenregel% - {\let\crlf=\relax - \let\\=\relax} - -%I n=Opmaak -%I c=\definieeropmaak,\testopmaak,\startstandaardopmaak -%I -%I Het is mogelijk een lege pagina op te maken. Hiertoe wordt -%I een blok gereserveerd met het commando: -%I -%I \definieeropmaak[naam][breedte=,hoogte=,voffset=, -%I hoffset=,pagina=,commandos=,voor=,na=,dubbelzijdig=] -%I -%I Hierbij wordt bij de eerste vier parameters een getal -%I meegegeven (5cm, 24pt, enz.). Met 'pagina' geeft men aan -%I of naar een nieuwe pagina wordt gesprongen (standaard -%I 'rechts'). Aan de 'commandos' kunnen commando's worden -%I toekend die tijdens de opmaak gelden. Aan de laatste twee -%I parameters toegekende commando's worden voor en na het -%I opmaken van de pagina uitgevoerd. De opgemaakte pagina -%I kan worden geselecteerd op naam. Met 'dubbelzijdig' geeft -%I men aan of er een lege achterkant moet worden opgemaakt -%I (standaard: ja). Dit geldt aleen bij dubbelzijdig zetten. -%I -%I Naast het bovenstaande commando is er het commando: -%I -%I \stelopmaakin[naam][instellingen] -%P -%I Na het geven van dit commando zijn twee commando's -%I beschikbaar: \startnaamopmaak en \stopnaamopmaak. Tussen -%I deze twee commando's kunnen zetopdrachten en teksten -%I worden opgenomen. Een en ander wordt op een lege bladzijde -%I gezet. -%I -%I Met het commando \testopmaak kunnen hulplijnen worden -%I opgeroepen. -%I -%I De commando's \startstandaardopmaak en \stopstandaardopmaak -%I maken het opmaken binnen de standaard-layout mogelijk. -%P -%I Eventueel kunnen de volgende twee commando's worden gebruikt -%I om een pagina op te maken met hoofd- en voetregels. -%I -%I \startopmaak -%I ..... -%I \stopopmaak - -\newbox\opmaak - -\def\setopmaaklayout[#1]% - {\stelvoetin [\c!status=\getvalue{\??do#1\c!voetstatus}]% - \stelhoofdin[\c!status=\getvalue{\??do#1\c!hoofdstatus}]% - \steltekstin[\c!status=\getvalue{\??do#1\c!tekststatus}]% - \stelonderin[\c!status=\getvalue{\??do#1\c!onderstatus}]% - \stelbovenin[\c!status=\getvalue{\??do#1\c!bovenstatus}]} - -\def\dododostartopmaak[#1]% - {\doifvaluesomething{\??do#1\c!pagina} - {\ExpandFirstAfter\pagina[\getvalue{\??do#1\c!pagina}]}% - \soortpagina[#1]% - \setopmaaklayout[#1]% - \getvalue{\??do#1\c!commandos}% - \global\setbox\opmaak=\vbox to \getvalue{\??do#1\c!hoogte}% - \bgroup - \forgetall - \hsize=\getvalue{\??do#1\c!breedte}% - \getvalue{\??do#1\c!boven}} - -\def\dododostopopmaak[#1]% - {\getvalue{\??do#1\c!onder}% - \egroup} - -\def\doshipoutopmaak[#1]% - {\bgroup - \getvalue{\??do#1\c!voor}% - \box\opmaak - \setopmaaklayout[#1]% - \pagina - \getvalue{\??do#1\c!na}% - \ifdubbelzijdig - \ifodd\realpageno\else - \processaction - [\getvalue{\??do#1\c!dubbelzijdig}] - [ \v!ja=>\null\pagina\verlaagpaginanummer, - \v!leeg=>\pagebodyornamentsfalse - \null\pagina\verlaagpaginanummer]% - \fi - \fi - \verlaagpaginanummer - \egroup} - -\def\doflushopmaak[#1]% - {\ifverwerken - \ifgeselecteerd - \doshipoutopmaak[#1]% - \fi - \else - \ifgeselecteerd - \else - \doshipoutopmaak[#1]% - \fi - \fi - \ifselecteren - \global\geselecteerdfalse - \fi} - -\def\dodostartopmaak[#1][#2]% - {\begingroup - \stelopmaakin[#1][#2]% - \dododostartopmaak[#1]} - -\def\dodostopopmaak[#1]% - {\dododostopopmaak[#1]% - \doflushopmaak[#1]% - \endgroup} - -\def\dostartopmaak[#1][#2]% - {\iffirstargument - \dodostartopmaak[#1][#2]% - \def\stopopmaak% - {\dodostopopmaak[#1]}% - \else - \pagina - \stelhoofdin[\c!status=\v!leeg] - \stelvoetin[\c!status=\v!leeg] - \vbox to \teksthoogte % nog een topskip optie - \bgroup - \def\stopopmaak% - {\egroup - \eject}% - \fi} - -\def\startopmaak% - {\dodoubleempty\dostartopmaak} - -\def\dodefinieeropmaak[#1][#2]% - {\getparameters - [\??do#1]% - [\c!breedte=\zetbreedte, - \c!hoogte=\teksthoogte, - \c!voffset=\!!zeropoint, - \c!hoffset=\!!zeropoint, - \c!commandos=, - \c!pagina=\v!rechts, - \c!dubbelzijdig=\v!leeg, - \c!voor=, - \c!boven=\vss, - \c!onder=\vss, - \c!na=, - \c!onderstatus=\v!normaal, - \c!bovenstatus=\v!normaal, - \c!tekststatus=\v!normaal, - \c!hoofdstatus=\v!stop, - \c!voetstatus=\v!stop, - #2]% - \setvalue{\e!start#1\e!opmaak}% - {\dodoubleempty\dodostartopmaak[#1]}% - \setvalue{\e!stop#1\e!opmaak}% - {\dodostopopmaak[#1]}} - -\def\definieeropmaak% - {\dodoubleargument\dodefinieeropmaak} - -\def\dostelopmaakin[#1]% - {\getparameters[\??do#1]} - -\def\stelopmaakin% - {\dodoubleargument\dostelopmaakin} - -%I n=Smaller -%I c=\startsmaller,\stelsmallerin -%I -%I Een paragraaf kan smaller gezet worden met behulp van de -%I commando's: -%I -%I \startsmaller[afstand] -%I \stopsmaller -%I -%I Als maat wordt links, rechts, midden of een combinatie -%I hiervan meegegeven. Eventueel wordt geen afstand meegegeven. -%I -%I De linker, rechter of dubbele inspringing kan worden -%I ingesteld met: -%I -%I \stelsmallerin[links=,rechts=,midden=] -%I -%I Enkele voorbeelden van smelelr zetten zijn: -%I -%I \startsmaller[2*links,rechts] -%I \stopsmaller -%I -%I \startsmaller[midden,rechts] -%I \stopsmaller - -\newskip\linkssmaller -\newskip\rechtssmaller -\newskip\middensmaller - -\def\dosinglesmaller#1% - {\dosmaller[#1]} - -\def\dosmaller[#1]% - {\processaction - [#1] - [ \v!links=>\global\advance\linkssmaller by \@@sllinks, - \v!midden=>\global\advance\middensmaller by \@@slmidden, - \v!rechts=>\global\advance\rechtssmaller by \@@slrechts, - \s!unknown=>{\herhaalmetcommando[#1]\dosinglesmaller}]} - -\def\complexstartsmaller[#1]% - {\par - \bgroup - \global\linkssmaller=\!!zeropoint - \global\rechtssmaller=\!!zeropoint - \global\middensmaller=\!!zeropoint - \processcommalistwithparameters[#1]\dosmaller - \advance\leftskip by \linkssmaller - \advance\rightskip by \rechtssmaller - \advance\leftskip by \middensmaller - \advance\rightskip by \middensmaller} - -\def\simplestartsmaller% - {\startsmaller[\v!midden]} - -\def\startsmaller% - {\complexorsimple{startsmaller}} - -\def\stopsmaller% - {\par % else skips forgotten - \egroup} - -\def\stelsmallerin% - {\dodoubleargument\getparameters[\??sl]} - -%I n=Boxen -%I c=\definieerhbox,\cbox,\lbox,\rbox,\sbox -%I -%I Het is mogelijk een tekst in een blok met een vaste -%I omvang te zetten. Dit is vergelijkbaar met het opmaken -%I van een tabel. -%I -%I \hbox?{tekst} (horizontaal blok) -%I -%I De box wordt eerst gedefinieerd met: -%I -%I \definieerhbox[?][maat] -%I -%I Er kan een links, rechts of midden uitgelijnde \vbox worden -%I gezet met de commando: -%I -%I \lbox{tekst\\tekst\\tekst} of \lbox to <maat>{...} -%I \rbox{tekst\\tekst\\tekst} of \rbox to <maat>{...} -%I \cbox{tekst\\tekst\\tekst} of \cbox to <maat>{...} -%I -%I Het commando \\ forceert een overgang naar een nieuwe regel. -%I -%I Een (hoge) box kan een gedwongen hoogte gelijk aan die -%I van een strut krijgen met: -%I -%I \sbox{box} - -\def\dodefinieerhbox[#1][#2]% - {\setvalue{hbox#1}##1% - {\hbox to #2{\begstrut##1\endstrut\hss}}} - -\def\definieerhbox% - {\dodoubleargument\dodefinieerhbox} - -\def\lrcbox#1#2#% - {\vbox#2\bgroup - \let\\=\endgraf - \forgetall#1\let\next=} - -\def\lbox% - {\lrcbox\raggedleft} - -\def\rbox% - {\lrcbox\raggedright} - -\def\cbox% - {\lrcbox\raggedcenter} - -\def\dosetraggedbox#1% - {\processaction - [#1] - [ \v!links=>\def\raggedbox{\lbox}, - \v!rechts=>\def\raggedbox{\rbox}, - \v!midden=>\def\raggedbox{\cbox}, - \v!nee=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}, - \s!default=>\def\raggedbox{\vbox}, - \s!unknown=>\def\raggedbox{\vbox}]} - -\def\dosetraggedcommand#1% - {\processaction - [#1] - [ \v!links=>\def\raggedcommand{\raggedleft}, - \v!rechts=>\def\raggedcommand{\raggedright}, - \v!midden=>\def\raggedcommand{\raggedcenter}, - \v!nee=>\def\raggedcommand{\raggedright}, - \s!default=>\def\raggedcommand{\raggedcenter}, - \s!unknown=>\def\raggedcommand{}]} - -%I n=Blokken -%I c=\stelplaatsblokkenin,\stelblokkopjesin -%I c=\definieerplaatsblok,\stelplaatsblokin -%I c=\reserveer,\leeg,\plaats,\volledigelijstmet,\plaatslijstmet -%I -%I Figuren, tabellen, grafieken enz. kunnen in de tekst -%I worden geplaatst met het commando: -%I -%I \plaats<bloknaam>[voorkeur][referentie]{titel}{blok} -%I -%I Als voorkeur kan worden opgegeven: -%I -%I hier bij voorkeur op deze plaats in de tekst -%I forceer per se op deze plaats in de tekst -%I pagina op een nieuwe pagina -%I boven bovenaan de huidige pagina -%I onder onderaan de huidige pagina -%I -%I links links in de paragraaf -%I rechts rechts in de paragraaf -%I -%I inlinker in linker marge (gelijke hoogte) -%I inrechter in rechter marge (gelijke hoogte) -%I inmarge in linker/rechter marge (gelijke hoogte) -%I marge in de marge -%P -%I Als er op de huidige bladzijde geen plaats is, dan wordt -%I standaard de figuur verplaatst (eerste vier opties) en/of -%I wordt overgegaan naar een nieuwe bladzijde (laatste twee -%I opties. -%I -%I Men kan plaatsen afdwingen door het trefwoord altijd -%I mee te geven: \plaats[hier,altijd][]{}{}. Er zijn dan -%I twee runs nodig, omdat de nummering van de blokken moet -%I worden aangepast. -%I -%I Als in plaats van een titel 'geen' wordt meegegeven, wordt -%I geen titel geplaatst. -%I -%I Als het blok nog onbekend is, kan in plaats van het blok -%I een van de volgende commando's worden meegegeven: -%I -%I \leeg<bloknaam> -%I \lege<bloknaam> -%P -%I Het is mogelijk ruimte voor een blok te reserveren: -%I -%I \reserveer<bloknaam>[hoogte=,breedte=,kader=][voorkeur] -%I [referentie]{titel} -%I -%I Beide commando's kunnen ook gegeven worden zonder [], -%I dus in de vorm -%I -%I \plaats<bloknaam>{titel}{blok} -%I \reserveer<bloknaam>{titel} -%I -%I Ten behoeve van een consistente verwijzing wordt het -%I commando: -%I -%I \in<bloknaam>[referentie] -%I -%I gedefinieerd. Dit levert in de tekst op: -%I -%I 'in <bloknaam> <nummer>' -%P -%I Blokken kunnen worden gedefinieerd met het commando: -%I -%I \definieerplaatsblok[blok][blokken] -%I -%I Hierna zijn de volgende commando's beschikbaar: -%I -%I \plaatsblok[plaats][referentie]{titel}{blok} -%I \reserveerblok[afmetingen][plaats][referentie]{titel} -%I \leegblok -%I -%I Het is mogelijk een en ander in te stellen met het -%I commando: -%I -%I \stelplaatsblokin[blok][hoogte=,breedte=,kader=, -%I bovenkader=,onderkader=,linkerkader=,rechterkader=, -%I paginaovergangen=] -%I -%I De hoogte en breedte hebben betrekking op de te reserveren -%I ruimte. -%P -%I Naast de eerder genoemde commando's zijn nog beschikbaar: -%I -%I \plaatslijstmetblokken -%I \volledigelijstmetblokken -%I -%I en een (extra) commando om tekst naast een blok (hier met -%I de naam 'blok') te plaatsen: -%I -%I \startbloktekst[plaats][referentie]{kop}{blok} -%I ... -%I \stopbloktekst -%I -%I Mogelijke plaatsen zijn 'links', 'rechts', 'hoog', 'laag' en -%I 'midden'. Ook is een combinatie van deze instellingen -%I mogelijk, bijvoorbeeld [links,hoog]. De instelling 'offset' -%I resulteert in een verschuiving van 1 regel. -%P -%I Blokken die tussen de tekst staan kunnen links, rechts of in -%I het midden worden uitgelijnd. De plaats wordt ingesteld met: -%I -%I \stelplaatsblokkenin[plaats=,breedte=,kader=,bovenkader=, -%I onderkader=,linkerkader=,rechterkader=,offset=,voorwit=, -%I nawit=,marge=] -%I -%I De genummerde kopjes bij blokken kunnen worden ingesteld -%I met: -%I -%I \stelblokkopjesin[plaats=,voor=,tussen=,na=,letter=, -%I kopletter=,breedte=,nummer=,uitlijnen=] -%I -%I waarbij als plaats kan worden meegegeven: 'boven', 'onder', -%I 'geen', 'hoog', 'laag' of 'midden'. Als breedte kan 'passend' -%I of 'max' worden meegegeven. De parameter nummer kan 'ja' of -%I 'nee' zijn. Als breedte=max, dan wordt het kopje over de -%I hele breedte geplaatst. In dat geval kan uitlijnen worden -%I ingesteld: 'links', 'midden' of 'rechts'. -%P -%I Als er geen plaats is, worden plaatsblokken tijdelijk -%I achtergehouden. De opgespaarde blokken worden op de -%I volgende bladzijde(n) geplaatst. Dit plaatsen is te -%I beinvloeden met: -%I -%I \stelplaatsblokkenin[nboven=,nonder=,nregels=] -%I -%I Standaard worden maximaal 2 blokken bovenaan de -%I bladzijde geplaatst en 0 blokken onder. Er wordt overgegaan -%I op een nieuwe bladzijde als het aantal regels groter is -%I dan 4. Deze waarden kunnen worden ingesteld. -%P -%I Kopjes boven lijsten en labels voor nummers kunnen worden -%I ingesteld met de elders beschreven commando's: -%I -%I \stellabeltekstin[label=...] -%I \stelkoptekstin[tekst=...] -%I -%I Standaard zijn deze ingesteld op de opgegeven namen. - -\def\stelplaatsblokkenin% - {\dodoubleargument\getparameters[\??bk]} - -\def\stelblokkopjesin% - {\dodoubleargument\getparameters[\??kj]}% - -\def\dostelplaatsblokin[#1][#2]% - {\getparameters[\??fl#1][#2]} - -\def\stelplaatsblokin% - {\dodoubleargument\dostelplaatsblokin} - -\def\dostelblokkopjein[#1][#2]% - {\getparameters[\??kj#1][#2]} - -\def\stelblokkopjein% - {\dodoubleargument\dostelblokkopjein} - -\def\doleegblok#1% - {\localframed - [\??fl#1][\c!kader=\v!aan]% - {\getmessage{\m!floatblocks}{12}}} - -\def\docomplexplaatsblok[#1][#2][#3]#4% - {\flushfootnotes - \ifmargeblokken - \doifinset{\v!marge}{#2} - {\bgroup - \everypar{\egroup\the\everypar}% - \hsize=\@@mbbreedte}% - \fi - \global\insidefloattrue - \dowithnextbox - {\docompletefloat - {#1}{#3}{#1}{#2}{\labeltext{#1}}{#4} - {\box\nextbox}}% - \vbox} - -\def\docomplexstarttekstblok[#1][#2][#3]% - {\flushfootnotes - \flushsidefloats % hoort eigenlijk niet hier - \docomplexplaatsblok[#1][\v!tekst,#2,\v!links][#3]} - -\def\docomplexreserveerblok[#1][#2][#3][#4]#5% - {\getvalue{\e!plaats#1}[#3][#4]{#5}{\localframed[\??fl#1][#2]{#1}}} - -\def\docomplexstartreserveertekstblok[#1][#2][#3][#4]% - {\flushsidefloats % hoort eigenlijk niet hier - \docomplexreserveerblok[#1][#2][\v!tekst,#3,\v!links][#4]} - -\def\dodefinieerplaatsblok[#1][#2]% #1=naam #2=meervoud - {\presetlocalframed[\??fl#1]% - \stelplaatsblokin - [#1] - [\c!breedte=15\korpsgrootte, - \c!hoogte=10\korpsgrootte, - \c!kader=\@@bkkader, - \c!straal=\@@bkstraal, - \c!hoek=\@@bkhoek, - \c!achtergrond=\@@bkachtergrond, - \c!achtergrondraster=\@@bkachtergrondraster, - \c!achtergrondkleur=\@@bkachtergrondkleur, - \c!bovenkader=\@@bkbovenkader, - \c!onderkader=\@@bkonderkader, - \c!linkerkader=\@@bklinkerkader, - \c!rechterkader=\@@bkrechterkader, - \c!paginaovergangen=]% - \stelblokkopjein - [#1] - [\c!plaats=\@@kjplaats, - %\c!voor=\@@kjvoor, - \c!tussen=\@@kjtussen, - %\c!na=\@@kjna, - \c!breedte=\@@kjbreedte, - \c!kopletter=\@@kjkopletter, - \c!letter=\@@kjletter, - \c!kleur=\@@kjkleur, - \c!uitlijnen=\@@kjuitlijnen, - \c!nummer=\@@kjnummer, - \c!wijze=\@@kjwijze, - \c!blokwijze=\@@kjblokwijze, - \c!sectienummer=\@@kjsectienummer, - \c!conversie=\@@kjconversie]% - \doorlabelen - [#1] - [\c!tekst=#1, - \c!plaats=\v!intekst, - \c!wijze=\getvalue{\??kj#1\c!wijze}, - \c!blokwijze=\getvalue{\??kj#1\c!blokwijze}, - \c!sectienummer=\getvalue{\??kj#1\c!sectienummer}, - \c!conversie=\getvalue{\??kj#1\c!conversie}]% - \presetlabeltext[#1=\Woord{#1}~]% - \presetheadtext[#2=\Woord{#2}]% - \definieerlijst[#1]% - \setvalue{\e!plaats\e!lijstmet#2}% - {\dodoubleempty\doplaatslijst[#1]}% - \setvalue{\e!volledige\e!lijstmet#2}% - {\dotripleempty\dodovolledigelijst[#1][#2]}% - \setvalue{\e!plaats#1}% - {\dotripleempty\docomplexplaatsblok[#1]}% - \setvalue{\e!reserveer#1}% - {\doquadrupleempty\docomplexreserveerblok[#1]}% - \setvalue{\e!start#1\e!tekst}% - {\dotripleempty\docomplexstarttekstblok[#1]}% - \setvalue{\e!stop#1\e!tekst}% - {\dostoptextfloat}% - \setvalue{\e!start\e!reserveer#1\e!tekst}% - {\doquadrupleempty\docomplexstartreserveertekstblok[#1]}% - \setvalue{\e!stop\e!reserveer#1\e!tekst}% - {\dostoptextfloat}% - \setvalue{\e!lege#1}% - {\doleegblok{#1}}% - \setvalue{\e!leeg#1}% - {\doleegblok{#1}}} - -%\setvalue{\c!in#1}[##1]% -% {\c!in\normalspace\in{\labeltext{#1}}[##1]}} - -\def\definieerplaatsblok% - {\dodoubleargument\dodefinieerplaatsblok} - -% De onderstaande macro's ondersteunen het zetten van tekst -% rond figuren. De macro's zijn ontworpen door Daniel Comenetz -% en gepubliceerd in TUGBoat Volume 14 (1993), No. 1: Anchored -% Figures at Either Margin. De macro's zijn slechts op enkele -% punten door mij aangepast. - -% afhankelijke variabelen -% -% \overgap vervangen door \floatsidetopskip -% \sidegap vervangen door \floatsideskip -% \undergap vervangen door \floatsidebottomskip -% -% \prskp vervangen door \tussenwit - -% toegevoegde macro's/aanroepen -% -% \logsidefloat : loginformatie -% \flushsidefloats : nodig voor koppen - -% recente wijzigingen: -% -% namen aangepast: \float... enz. i.p.v. \pic - -% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}} -% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval -% begint de tekst terecht wat lager. - -\newdimen\sidefloatheight % includes the topskip -\newdimen\sidefloatwidth -\newdimen\sidefloathsize -\newdimen\sidefloatvsize \def\nofloatvsize{-1pt } - -\newbox\floatbottom - -\newif\ifrightfloat -\newif\ifmarginfloat -\newif\ifroomforfloat -\newif\iffloatshort -\newif\iffloatflag -\newif\iffloatrighteqo -\newif\iffloatlefteqo - -\let\floatrighteqo=\eqno -\let\floatleftleqo=\leqno - -% Watch it! - -\everypar ={\flushfootnotes\checksidefloat\checkindentation} - -% Watch it even more! In inner, gaat't mis omdat daar -% pagetotal enz niet zijn aangepast. Inner kan overigens niet -% betrouwbaar worden getest! - -\everypar ={\flushfootnotes\ifinner\else\checksidefloat\fi\flushmargincontents\checkindentation} -\neverypar ={}%\autopostponefootnotes} -\everydisplay={\flushfootnotes\adjustsidefloatdisplaylines} - -\def\flushsidefloats% - {\par - \!!heighta=\sidefloatvsize - \advance\!!heighta by -\pagetotal - \ifdim\!!heighta>\!!zeropoint - \witruimte % nog checken op interferentie - \kern\!!heighta - \fi - \global\sidefloatvsize=\nofloatvsize - \global\floatflagfalse} - -\def\flushsidefloatsafterpar% - {\xdef\oldpagetotal{\the\pagetotal}% - \gdef\checksidefloat% - {\dochecksidefloat - \ifdim\oldpagetotal=\pagetotal \else - \xdef\checksidefloat{\dochecksidefloat}% - \flushsidefloats - \fi}} - -\let\logsidefloat=\relax - -\def\pushpenalties% - {\widowpenalty=1 - \clubpenalty=2 - \brokenpenalty=1 - \let\pushpenalties=\relax - \edef\poppenalties% - {\widowpenalty=\the\widowpenalty - \clubpenalty=\the\clubpenalty - \brokenpenalty=\the\brokenpenalty}} - -\let\poppenalties=\relax - -\def\restorepenalties% - {\ifnum\outputpenalty=\!!tenthousand\relax - \else - \penalty\outputpenalty - \fi} - -\def\sidefloatoutput% - {\iffloatshort - \unvbox\normalpagebox - \setbox\floatbottom=\lastbox - \ifdim\wd\floatbottom>\sidefloathsize - \penalty-201 - \box\floatbottom - \else - \ifvoid\floatbottom - \else - \restoreleftindent - \ifdim\wd\floatbottom<\sidefloathsize - \parskip=\!!zeropoint - %\noindent - \vadjust{\penalty-1}% - \iffloatlefteqo - \global\floatlefteqofalse - \else - \global\advance\sidefloathsize by -\wd\floatbottom - \iffloatrighteqo - \global\floatrighteqofalse - \else - \global\divide\sidefloathsize by 2 - \fi - \hskip\sidefloathsize - \fi - \fi - \box\floatbottom - \restorepenalties - \fi - \fi - \global\holdinginserts=0 - \global\floatshortfalse - \else - \finaloutput\unvbox\normalpagebox - \global\sidefloatvsize=\nofloatvsize - \poppenalties - \fi} - -\def\restoreleftindent% - {\ifrightfloat - \else - \parskip=\!!zeropoint - \noindent - \vadjust{\penalty-1}% - \global\hskip\sidefloatwidth - \fi} - -\def\eqno% - {\iffloatshort - \global\floatrighteqotrue - \fi - \floatrighteqo} - -\def\leftmarginfloat#1% - {\global\rightfloatfalse\marginfloattrue\putsidefloat{#1}} - -\def\rightmarginfloat#1% - {\global\rightfloattrue\marginfloattrue\putsidefloat{#1}} - -\def\leftfloat#1% - {\global\rightfloatfalse\marginfloatfalse\putsidefloat{#1}} - -\def\rightfloat#1% - {\global\rightfloattrue\marginfloatfalse\putsidefloat{#1}} - -\def\putsidefloat#1% - {\par - \witruimte - \previoussidefloat - \stallsidefloat - \setbox\floatbox=\hbox{\vbox{\vskip\sidefloattopoffset#1}} - \measuresidefloat - \ifroomforfloat - \setsidefloat - \else - \tosssidefloat - \measuresidefloat - \stallsidefloat - \setsidefloat - \fi} - -\def\progresssidefloat% - {\!!heighta=\sidefloatvsize - \iffloatflag - \advance\!!heighta by -\dimen3 - \global\floatflagfalse - \else - \advance\!!heighta by -\pagetotal - \fi} - -\def\tosssidefloat% - {\vfill\eject} - -\def\measuresidefloat% - {\global\floatflagtrue - \dimen3=\pagetotal - \ifmarginfloat - \global\sidefloatwidth=\!!zeropoint - \else - \global\sidefloatwidth=\wd\floatbox - \global\advance\sidefloatwidth by \floatsideskip - \fi - \global\sidefloathsize=\hsize - \global\advance\sidefloathsize by -\sidefloatwidth - \global\sidefloatheight=\ht\floatbox -\global\advance\sidefloatheight by \dp\floatbox - \global\advance\sidefloatheight by \sidefloattopskip - \global\sidefloatvsize=\sidefloatheight - \global\advance\sidefloatvsize by \dimen3 - \dimen0=\sidefloatvsize -% \advance\dimen0 by -\baselineskip - \ifdim\dimen0>.99\pagegoal \relax - \roomforfloatfalse - \else - \dimen0=\pagegoal - \advance\dimen0 by -\sidefloatvsize - \ifdim\dimen0<\sidefloatbottomskip - \global\advance\sidefloatvsize by \dimen0 - \global\floatshorttrue - \pushpenalties - \holdinginserts=1 - \else - \global\advance\sidefloatvsize by \sidefloatbottomskip - \global\floatshortfalse - \fi - \roomforfloattrue - \fi} - -\def\setsidefloat% - {\vbox{\strut}\vskip-\lineheight - \kern\sidefloattopskip - \oldprevdepth=\prevdepth - \nointerlineskip - \bgroup - \everypar={}% - \parskip=\!!zeropoint - \logsidefloat - \ifrightfloat - \hfill - \ifmarginfloat - \rlap{\hskip\rechtermargeafstand\unhbox\floatbox}% - \else - \unhbox\floatbox - \fi - \else - \noindent - \ifmarginfloat - \llap{\unhbox\floatbox\hskip\linkermargeafstand}% - \else - \unhbox\floatbox - \fi - \hfill - \fi - \egroup - \par - \kern-\sidefloatheight - \penalty10001 - \normalbaselines - \prevdepth=\oldprevdepth - %\noindent - \resetsidefloatparagraph - \ignorespaces} - -\newcount\sidefloatparagraph - -\def\iffirstsidefloatparagraph% - {\ifnum\sidefloatparagraph=1\relax} - -\def\setsidefloatparagraph% - {\global\advance\sidefloatparagraph by 1\relax} - -\def\resetsidefloatparagraph% - {\global\sidefloatparagraph=0\relax} - -\def\dochecksidefloat% - {\progresssidefloat - \ifdim\!!heighta>\!!zeropoint - \advance\!!heighta by \sidefloatbottomskip - \!!counta=\!!heighta - \divide\!!counta by \baselineskip - \ifnum\!!counta>0 - \ifrightfloat - \hangindent=-\sidefloatwidth - \else - \hangindent=\sidefloatwidth - \fi - \hangafter=-\!!counta - \fi - \setsidefloatparagraph - \else - \resetsidefloatparagraph - \fi - \parskip=\tussenwit} - -\def\checksidefloat% - {\dochecksidefloat} - -\def\doadjustsidefloatdisplaylines% - {\par - \vskip-\parskip - \noindent - \ignorespaces} - -\def\adjustsidefloatdisplaylines% - {\aftergroup\doadjustsidefloatdisplaylines} - -\def\previoussidefloat% - {\progresssidefloat - \ifdim\!!heighta>\!!zeropoint \relax - \iffloatshort - \global\floatshortfalse - \tosssidefloat - \else - \kern\!!heighta - \fi - \fi} - -\def\stallsidefloat% - {\!!counta=\pageshrink - \divide\!!counta by \baselineskip - \advance\!!counta by 1 - \parskip=\!!zeropoint - \dorecurse{\!!counta}{\line{}} - \kern-\!!counta\baselineskip - \penalty0\relax} - -% De onderstaande macro's zijn verantwoordelijk voor het plaatsen -% van floats. De macro's moeten nog worden aangepast en -% uitgebreid: -% -% - nofloatpermitted : top, bot en mid counters en geen topins -% als reeds midfloat of botfloat -% -% - links, rechts, midden als niet hangend - -\newif\ifsomefloatwaiting \somefloatwaitingfalse -\newif\ifroomforfloat \roomforfloattrue -\newif\ifnofloatpermitted \nofloatpermittedfalse -\newif\iffloatsonpage \floatsonpagefalse - -\newcount\totalnoffloats \totalnoffloats=0 -\newcount\savednoffloats \savednoffloats=0 -\newcount\noffloatinserts \noffloatinserts=0 - -\newbox\floatlist - -\newinsert\botins - -\skip\botins=\!!zeropoint -\count\botins=\!!thousand -\dimen\botins=\maxdimen - -\newdimen\topinserted -\topinserted=\!!zeropoint - -\newdimen\botinserted -\botinserted=\!!zeropoint - -\newif\ifflushingfloats -\flushingfloatsfalse - -\newbox\floattext - -\newdimen\floattextwidth -\newdimen\floattextheight - -\newbox\floatbox - -\newdimen\floatwidth -\newdimen\floatheight - -% Er wordt bij \v!altijd als dat nodig is hernummerd. -% Daarbij wordt gebruik gemaakt van de opgeslagen nummers en -% volgorde. - -\definetwopasslist{\s!float} - -\def\dofloatreference% - {\doglobal\increment\numberedfloat - \edef\dodofloatreference% - {\writeutilitycommand% - {\twopassentry% - {\s!float}% - {\numberedfloat}% - {\hetnummer}}}% - \dodofloatreference} - -\def\redofloatorder#1% - {\doglobal\increment\nofplacedfloats\relax - \gettwopassdata{\s!float}% - \iftwopassdatafound - \doifnot{\hetnummer}{\twopassdata} - {\edef\oldhetnummer{\hetnummer}% - \xdef\hetnummer{\twopassdata}% - \showmessage - {\m!floatblocks}{1} - {\nofplacedfloats,#1 \oldhetnummer,\hetnummer}}% - \fi} - -% In \dofloatinfomessage wordt {{ }} gebruikt omdat anders -% binnen \startuitstellen...\stopuitstellen geen goede -% melding in de marge volgt: \ifinner is dan namelijk true. - -\def\dofloatinfomessage#1#2#3% - {\bgroup - \showmessage{\m!floatblocks}{#2}{#3}% - \@EA\floatinfo\@EA#1\@EA{\currentmessagetext}% - \egroup} - -\def\dosavefloatinfo% - {\dofloatinfomessage{>}{2}{\the\totalnoffloats}} - -\def\dofloatflushedinfo% - {\!!counta=\totalnoffloats\relax - \advance\!!counta by -\savednoffloats\relax% - \dofloatinfomessage{<}{3}{\the\!!counta}} - -\def\doinsertfloatinfo% - {\dofloatinfomessage{<}{4}{\the\totalnoffloats}} - -% ook voetnoten saven - -\def\dosavefloat% - {\global\setbox\floatlist=\vbox - {\nointerlineskip - \box\floatbox\relax - \unvbox\floatlist}% - \global\advance\savednoffloats by 1\relax - \global\somefloatwaitingtrue - \dosavefloatinfo} - -\def\doresavefloat% - {\global\setbox\floatlist=\vbox - {\nointerlineskip - \unvbox\floatlist - \box\floatbox}% - \global\advance\savednoffloats by 1\relax - \global\somefloatwaitingtrue} - -\def\doreversesavefloat% - {\global\setbox\floatlist=\vbox - {\nointerlineskip - \unvbox\floatlist - \box\floatbox}% - \global\advance\savednoffloats by 1\relax - \global\somefloatwaitingtrue - \dosavefloatinfo} - -\def\checkwaitingfloats#1% - {\ifsomefloatwaiting - \doifinsetelse{\v!altijd}{#1} - {\showmessage{\m!floatblocks}{5}{}} - {\doflushfloats}% - \fi} - -\def\doflushfloats% - {\global\floatsonpagefalse - \global\flushingfloatstrue - \ifsomefloatwaiting - \par - \ifvmode\prevdepth=\maxdimen\fi % prevents whitespace - \dodoflushfloats - \fi - \global\savednoffloats=0 - \global\somefloatwaitingfalse - \global\flushingfloatsfalse} - -\def\dodoflushfloats% moet nog beter: als precies passend, niet onder baseline - {\ifsomefloatwaiting - \bgroup % \box\floatbox can be in use! - \dogetfloat - %\forgetall % NJET! - \witruimte - \blanko[\@@bkvoorwit] - \flushfloatbox - %\ifnum\savednoffloats>1 % REMOVED - %\else - \blanko[\@@bknawit] - %\fi - \egroup - \dofloatflushedinfo - \expandafter\dodoflushfloats - \fi} - -\newbox\globalscratchbox - -\def\dogetfloat% - {\ifsomefloatwaiting - \global\setbox\floatlist=\vbox - {\unvbox\floatlist - \global\setbox\globalscratchbox=\lastbox}% - \setbox\floatbox=\box\globalscratchbox % local ! - \global\advance\savednoffloats by -1\relax - \ifnum\savednoffloats=0\relax - \global\somefloatwaitingfalse - \fi - \else - \global\savednoffloats=0\relax - \global\setbox\floatbox=\box\voidb@x - \fi} - -\def\dotopfloat% - {\ifdim\topinserted=\!!zeropoint\relax - \topofinserttrue - \else - \topofinsertfalse - \fi - \global\advance\topinserted by \ht\floatbox - \global\advance\topinserted by \dp\floatbox - \global\advance\topinserted by \floatbottomskip - \insert\topins - {\forgetall - \iftopofinsert - \kern-\lineskip\par\prevdepth=\maxdimen - \else - %\blanko[-\@@bknawit,\@@bkvoorwit]% inserts can't look back - \betweenfloatblanko - \fi - \flushfloatbox - \blanko[\@@bknawit]}% - \doinsertfloatinfo} - -% \loop ...\repeat doesn't work here, but why? -% -% \def\dosettopinserts% -% {\ifsomefloatwaiting -% \noffloatinserts=0\relax -% \loop -% \ifnum\noffloatinserts<\noftopfloats -% .... -% \repeat -% \fi} -% -% so: - -\def\dodosettopinserts% - {\ifnum\noffloatinserts<\noftopfloats - \dogetfloat - \ifdim\topinserted=\!!zeropoint\relax - \topofinserttrue - \else - \topofinsertfalse - \fi - \global\advance\topinserted by \ht\floatbox - \global\advance\topinserted by \dp\floatbox - \global\advance\topinserted by \floatbottomskip\relax - \ifdim\topinserted<\teksthoogte\relax - \xdef\totaltopinserted{\the\topinserted}% - \insert\topins - {\forgetall - \iftopofinsert - \kern-\lineskip\par\prevdepth=\maxdimen - \else - %\blanko[-\@@bknawit,\@@bkvoorwit]% inserts can't look back - \betweenfloatblanko - \fi - \flushfloatbox - \blanko[\@@bknawit]}% - \ifsomefloatwaiting - \advance\noffloatinserts by 1 - \else - \noffloatinserts=\noftopfloats\relax - \fi - \dofloatflushedinfo - \else - \doresavefloat - \noffloatinserts=\noftopfloats\relax - \fi - \else - \ifsomefloatwaiting - \showmessage{\m!floatblocks}{6}{\the\noftopfloats}% - \fi - \let\dodosettopinserts=\relax - \fi - \dodosettopinserts} - -\def\dosettopinserts% - {\bgroup - \ifsomefloatwaiting - \noffloatinserts=0\relax - \let\totaltopinserted=\!!zeropoint\relax - \dodosettopinserts - \ifnum\@@bknonder=0\relax - \ifnum\@@bknregels>0\relax - \ifdim\totaltopinserted>\!!zeropoint\relax - \dimen0=\lineheight - \dimen0=\@@bknregels\dimen0\relax - \advance\dimen0 by \totaltopinserted\relax - \ifdim\dimen0>\teksthoogte - \showmessage{\m!floatblocks}{8}{\@@bknregels}% - \vfilll\eject - \fi - \fi - \fi - \fi - \fi - \egroup} - -\def\dodosetbotinserts% - {\ifnum\noffloatinserts<\nofbotfloats\relax - \dogetfloat - \global\advance\botinserted by \ht\floatbox\relax - \global\advance\botinserted by \dp\floatbox\relax - \global\advance\botinserted by \floattopskip\relax - \ifdim\botinserted<\pagegoal\relax - \insert\botins - {\forgetall - \blanko[\@@bkvoorwit]% - \flushfloatbox}% - \ifsomefloatwaiting - \advance\noffloatinserts by 1 - \else - \noffloatinserts=\nofbotfloats - \fi - \dofloatflushedinfo - \else - \doresavefloat - \noffloatinserts=\nofbotfloats\relax - \fi - \global\nofloatpermittedtrue % vgl topfloats s! - \else - \ifsomefloatwaiting - \showmessage{\m!floatblocks}{7}{\the\nofbotfloats}% - \fi - \let\dodosetbotinserts=\relax - \fi - \dodosetbotinserts} - -\def\dosetbotinserts% - {\bgroup - \ifsomefloatwaiting - \noffloatinserts=0\relax - \dodosetbotinserts - \fi - \egroup} - -\def\dobotfloat% - {\global\advance\botinserted by \ht\floatbox - \global\advance\botinserted by \dp\floatbox - \global\advance\botinserted by \floattopskip - \insert\botins - {\forgetall - \blanko[\@@bkvoorwit]% - \flushfloatbox}% - %\global\nofloatpermittedtrue - \doinsertfloatinfo} - -\def\dosetbothinserts% - {\ifflushingfloats - \global\topinserted=\!!zeropoint\relax - \global\botinserted=\!!zeropoint\relax - \else - \global\topinserted=\!!zeropoint\relax - \dosettopinserts - \global\botinserted=\topinserted\relax - \dosetbotinserts - \fi} - -\def\dotopinsertions% - {\ifvoid\topins\else - \ifgridsnapping - %\topsnaptogrid{\box\topins} - \box\topins % already snapped - \else - \unvbox\topins - \fi - \fi - \global\topinserted=\!!zeropoint\relax} - -\def\dobotinsertions% - {\ifvoid\botins\else - \ifgridsnapping - \snaptogrid\hbox{\box\botins} - \else - \unvbox\botins - \fi - \fi - \global\botinserted=\!!zeropoint\relax - \global\nofloatpermittedfalse} - -\newif\iftopofinsert -\newif\iftestfloatbox %\testfloatboxtrue - -%\def\flushfloatbox% nog verder doorvoeren en meer info in marge -% {\iftestfloatbox -% \ruledhbox{\box\floatbox}% -% \else -% \box\floatbox -% \fi} - -% \testfloatboxtrue -% -% testfloatbox gaat mis, niet in midden, dus elders - -\def\flushfloatbox% nog verder doorvoeren en meer info in marge - {\snaptogrid\hbox{\iftestfloatbox\ruledhbox\fi{\box\floatbox}}} - -% beter de laatste skip buiten de \insert uitvoeren, -% bovendien bij volle flush onder baseline. - -\def\betweenfloatblanko% assumes that \@@bknawit is present - {\bgroup - \setbox0=\vbox{\strut\blanko[\@@bkvoorwit]\strut}% - \setbox2=\vbox{\strut\blanko[\@@bknawit]\strut}% - \ifdim\ht0>\ht2 - \blanko[-\@@bknawit,\@@bkvoorwit] - \fi - \egroup} - -\def\doroomfloat% - {\ifnofloatpermitted - \global\roomforfloatfalse - \else - \dimen0=\pagetotal - \advance\dimen0 by \ht\floatbox - \advance\dimen0 by \dp\floatbox - \advance\dimen0 by \floattopskip - \advance\dimen0 by -\pageshrink % toegevoegd - \ifdim\dimen0>\pagegoal - \global\roomforfloatfalse - \else - \global\roomforfloattrue - \fi - \fi} - -\def\doexecfloat% spacing between two successive must be better - {\baselinecorrection - \witruimte - \blanko[\@@bkvoorwit]% - \flushfloatbox - \blanko[\@@bknawit]% - \doinsertfloatinfo} - -\def\somefixdfloat[#1]% - {\doroomfloat - \ifroomforfloat\else - \goodbreak - \fi - \showmessage{\m!floatblocks}{9}{}% - \doexecfloat} - -\def\somesidefloat[#1]% links, rechts NOG TESTEN EN AANPASSEN - {\ifbinnenkolommen - \someelsefloat[\v!hier]% - \else - \checkwaitingfloats{#1}% - \def\logsidefloat% - {\doinsertfloatinfo}% - \setbox\floatbox=\vbox{\box\floatbox}% - \wd\floatbox=\floatwidth - \processfirstactioninset - [#1] - [ \v!links=>\leftfloat{\box\floatbox}, - \v!rechts=>\rightfloat{\box\floatbox}, - \v!inlinker=>\leftmarginfloat{\box\floatbox}, - \v!inrechter=>\rightmarginfloat{\box\floatbox}, - \v!inmarge=>{\doinmargenormal\leftmarginfloat\rightmarginfloat[]{\box\floatbox}}]% - \doifinset{\v!lang}{#1} - {\flushsidefloatsafterpar}% - \fi} - -\def\sometextfloat[#1]% lang, links, rechts, hoog, midden, laag, offset - {\checkwaitingfloats{#1}% - \def\dostoptextfloat{\dodostoptextfloat[#1]}% - \global\floattextwidth=\hsize - \global\floatwidth=\wd\floatbox - \global\floatheight=\ht\floatbox % forget about the depth - \global\advance\floattextwidth by -\floatwidth - \global\advance\floattextwidth by -\@@bkmarge\relax % was \tfskipsize - \doifinsetelse{\v!lang}{#1} - {\floattextheight=\pagegoal - \advance\floattextheight by -\pagetotal - \advance\floattextheight by -\bigskipamount % lelijk - \ifdim\floattextheight>\teksthoogte - \floattextheight=\teksthoogte - \fi - \boxmaxdepth=\!!zeropoint\relax % toegevoegd - \ifdim\floattextheight<\floatheight - \floattextheight=\floatheight - \fi - \setbox\floattext=\vbox to \floattextheight} - {\setbox\floattext=\vbox}% - \bgroup - \blanko[\v!blokkeer] - \hsize\floattextwidth - \ignorespaces} - -\def\dodostoptextfloat[#1]% - {\egroup - \doifnotinset{\v!lang}{#1}% - {\ifdim\ht\floattext<\floatheight - \floattextheight=\floatheight - \else - \floattextheight=\ht\floattext - \fi}% - \setbox\floatbox=\vbox to \floattextheight - {\hsize\floatwidth - \box\floatbox - \vfill}% - \setbox\floattext=\vbox to \floattextheight - {\hsize\floattextwidth - \doifinsetelse{\v!laag}{#1} - {\vfill - \box\floattext - \doifinset{\c!offset}{#1}{\witruimte\blanko}} - {\doifinsetelse{\v!midden}{#1} - {\vfill - \box\floattext - \vfill} - {\doifinset{\v!offset}{#1}{\witruimte\blanko}% - \box\floattext - \vfill}}}% - \doifinsetelse{\v!rechts}{#1}% - {\setbox\floatbox=\hbox to \hsize - {\box\floattext - \hfill - \box\floatbox}} - {\setbox\floatbox=\hbox to \hsize - {\box\floatbox - \hfill - \box\floattext}}% - \baselinecorrection - \witruimte - \blanko[\@@bkvoorwit]% - \doifnotinset{\v!lang}{#1}% - {\dp\floatbox=\openstrutdepth}% dp\strutbox}% % toegevoegd - \box\floatbox - \blanko[\@@bknawit]% - \doinsertfloatinfo} - -\def\somefacefloat[#1]% links, rechts, midden, hoog, midden, laag - {\checkwaitingfloats{#1}% - \startnaast\box\floatbox\stopnaast - \doinsertfloatinfo} - -\def\somepagefloat[#1]% links, rechts, midden, hoog, midden, laag - {\checkwaitingfloats{#1}% - \vbox to \teksthoogte - {\doifnotinset{\v!hoog}{#1}{\vfill}% - \box\floatbox - \doifnotinset{\v!laag}{#1}{\vfill}}% - \doinsertfloatinfo - \pagina} % toegevoegd - -\def\someelsefloat[#1]% - {\doifinsetelse{\v!hier}{#1} - {\doifinsetelse{\v!altijd}{#1} - {\pagina[\v!voorkeur]% - \doroomfloat - \ifroomforfloat - \doexecfloat - \else - \showmessage{\m!floatblocks}{9}{}% - \doreversesavefloat - \fi} - {\ifsomefloatwaiting - \dosavefloat - \else - \pagina[\v!voorkeur]% - \doroomfloat - \ifroomforfloat - \doexecfloat - \else - \dosavefloat - \fi - \fi}} - {\doifinsetelse{\v!altijd}{#1} - {\doroomfloat - \ifroomforfloat - \processallactionsinset - [#1] - [ \v!boven=>\dotopfloat, - \v!onder=>\dobotfloat, - \s!default=>\doexecfloat]% - \else - \showmessage{\m!floatblocks}{9}{}% - \doreversesavefloat - \fi} - {%\ifsomefloatwaiting % from before the renumbering time - % \doflushfloats - %\fi - \doroomfloat - \ifroomforfloat - \processallactionsinset - [#1] - [ \v!boven=>%%\ifdim\topinserted=\!!zeropoint\relax - %\iffloatsonpage - % \dosavefloat - %\else - \dotopfloat - %\fi - %%\else - %% \dosavefloat - %%\fi - , - \v!onder=>%\ifdim\botinserted=\!!zeropoint\relax - \dobotfloat - %\else - % \dosavefloat - %\fi - , - \s!default=>\doexecfloat]% - \else - \dosavefloat - \fi}}} - -% De onderstaande macro wordt gebruikt bij de macros -% voor het plaatsen van tabellen en figuren (klopt niet -% meer). -% -% \dofloat {plaats} {label1} {label2} {kader} -% -% \docompletefloat {nummer} {referentie} {lijst} -% {plaats} {label1} {label2} {inhoud} -% -% \box\floatbox inhoud+referentie -% -% \do???float#1 #1 = boxnummer -% -% \ifinsidefloat wordt \true gezet voor \docompletefloat en \false -% na float plaatsen; kan worden gebruikt om in -% andere commando's witruimte te onderdrukken - -\newdimen\floattopskip \floattopskip=12pt -\newdimen\floatbottomskip \floatbottomskip=12pt -\newdimen\floatsideskip \floatsideskip=12pt - -\newdimen\sidefloattopskip \sidefloattopskip=\floattopskip -\newdimen\sidefloatbottomskip \sidefloatbottomskip=\floatbottomskip -\def\sidefloattopoffset {\openstrutdepth} % {\dp\strutbox} - -\newcount\noftopfloats \noftopfloats=2 -\newcount\nofbotfloats \nofbotfloats=0 - -\def\calculatefloatskips% - {{\def\calculatefloatskips##1##2% - {\doifelsenothing{##2} - {\global##1=\!!zeropoint} - {\doifelse{##2}{\v!geen} - {\global##1=\!!zeropoint} - {\setbox0=\vbox{\witruimte\@EA\blanko\@EA[##2]}% - \global##1=\ht0}}}% - \calculatefloatskips\floattopskip\@@bkvoorwit - \calculatefloatskips\floatbottomskip\@@bknawit - \calculatefloatskips\sidefloattopskip\@@bkzijvoorwit - \calculatefloatskips\sidefloatbottomskip\@@bkzijnawit - \def\sidefloattopoffset{\openstrutdepth}% {\dp\strutbox}% - \global\floatsideskip=\@@bkmarge\relax - \global\noftopfloats=\@@bknboven\relax - \global\nofbotfloats=\@@bknonder\relax}} - -\newif\ifinsidefloat - -\def\floatcaptionsuffix{} % an optional suffix -\def\floatcaptionnumber{} % a logical counter - -\def\dosetfloatcaption#1#2#3% - {\def\dofloattekst% - {{\doattributes{\??kj#1}{#3}}}% - \doifelsevalue{\??kj#1\c!nummer}{\v!ja} - {\def\dofloatnummer% - {{\xdef\floatcaptionnumber{#1}% - \hbox{\doattributes{\??kj#1\v!kop}{\strut#2\floatcaptionsuffix}}}% - \ConvertToConstant\doifnot{#3}{} - {\tfskip - \emergencystretch=.5em}}} - {\let\dofloatnummer=\empty}} - -\def\putborderedfloat#1\in#2\\% - {\setbox#2=\vbox - {\localframed - [\??fl#1] - [\c!breedte=\@@bkbreedte, - \c!hoogte=\@@bkhoogte, - \c!offset=\@@bkoffset]% - {\box\floatbox}}} - -\newbox\captionbox - -\def\putcompletecaption% - {\mindermeldingen - \begstrut\dofloatnummer\dofloattekst\endstrut} - -\def\dosetpagfloat#1#2#3#4% - {\bgroup - \forgetall - %\showcomposition - \putborderedfloat#4\in4\\% - \def\locatefloat% - {\doregelplaats\@@bkplaats}% - \ConvertToConstant\doifelse{#3}{\v!geen} - {\global\setbox\floatbox=\vbox - {\locatefloat{\box4}}} % pas op, nog wd groter dan hsize - {\dosetfloatcaption{#4}{#2}{#3}% -% at another level, prevents reprocessing of footnotes -\setbox\captionbox=\hbox{\putcompletecaption}% -\def\putcompletecaption{\unhcopy\captionbox}% -% - \setbox2=\hbox - {\forgetall - \putcompletecaption}% - \doifinsetelse{\@@kjkjplaats}{\v!hoog,\v!midden,\v!laag} - {\dimen0=\hsize - \advance\dimen0 by -\wd4\relax - \advance\dimen0 by -\@@bkmarge\relax % \was tfskipsize\relax - \ifdim\wd2>\dimen0\relax - \dimen2=1.3\dimen0\relax - \ifdim\wd2<\dimen2\relax - \dimen0=0.8\dimen0\relax - \fi - \fi - \setbox2=\vbox - {\forgetall - \hsize=\dimen0\relax - \raggedright - \begstrut\dofloatnummer - \ifx\@@kjkjtussen\empty \else - \unskip\@@kjkjtussen - \fi - \dofloattekst - \endstrut}} - {\doifelse{\@@kjkjbreedte}{\v!max} - {\dosetraggedbox{\@@kjkjuitlijnen}% - \setbox2=\raggedbox - {\hsize\wd4\relax - \putcompletecaption}} - {\ifdim\wd2>\wd4\relax - \doifelse{\@@kjkjbreedte}{\v!passend} - {\ifdim\wd4<15\korpsgrootte\relax - \dimen0=15\korpsgrootte\relax - \else - \dimen0=\wd4\relax - \fi - \ifdim\wd4>\hsize - \setbox0=\vbox - {\forgetall - \hsize=1.0\wd4 - \putcompletecaption}% - \ifdim\ht0>\lineheight\relax - \setbox2=\vbox - {\forgetall - \hsize=0.9\wd4 - \putcompletecaption}% - \fi - \else - \setbox0=\vbox - {\forgetall - \dimen2=1.5\dimen0\relax - \ifdim\dimen2<\hsize - \hsize=\dimen2\relax - \fi - \putcompletecaption}% - \ifdim\ht0>\lineheight\relax - \setbox2=\vbox - {\forgetall - \dimen2=1.2\dimen0\relax - \ifdim\dimen2<\hsize - \hsize=\dimen2\relax - \fi - \putcompletecaption}% - \fi - \fi} - {\dosetraggedbox{\@@kjkjuitlijnen}% - \setbox2=\raggedbox - {\hsize\@@kjkjbreedte - \putcompletecaption}}% - \fi}}% - \global\setbox\floatbox=\vbox - {\processaction - [\@@kjkjplaats] - [ \v!boven=>\locatefloat{\copy2}% - \@@kjkjtussen - \locatefloat{\copy4}, - \v!onder=>\locatefloat{\copy4}% - \@@kjkjtussen - \locatefloat{\copy2}, - \v!hoog=>\locatefloat - {\doifelse{\@@bkplaats}{\v!links} - {\copy4 - \tfskip - \vbox to\ht4{\@@kjkjtussen\copy2\vfill}} - {\vbox to\ht4{\@@kjkjtussen\copy2\vfill}% - \tfskip - \copy4}}, - \v!laag=>\locatefloat - {\doifelse{\@@bkplaats}{\v!links} - {\copy4 - \tfskip - \vbox to\ht4 - {\vfill\copy2\@@kjkjtussen}} - {\vbox to\ht4 - {\vfill\copy2\@@kjkjtussen}% - \tfskip - \copy4}}, - \v!midden=>\locatefloat - {\doifelse{\@@bkplaats}{\v!links} - {\copy4 - \tfskip - \vbox to\ht4{\vfill\copy2\vfill}} - {\vbox to\ht4{\vfill\copy2\vfill}% - \tfskip - \copy4}}, - \v!geen=>\locatefloat{\copy4}]}}% -% \ifdim\wd2>\wd4 -% \global\wd\floatbox=\wd2 -% \else -% \global\wd\floatbox=\wd4 -% \fi -\ifdim\wd4>\hsize - \global\setbox\floatbox=\hbox to \wd4{\hss\box\floatbox\hss}% -\fi - \egroup} - -\def\dosetparfloat#1#2#3#4% - {\bgroup - %\showcomposition - \forgetall - \putborderedfloat#4\in4\\ - \ConvertToConstant\doifelse{#3}{\v!geen} - {\global\setbox\floatbox=\vbox{\box4}} - {\dosetfloatcaption{#4}{#2}{#3}% - \setbox2=\hbox - {\forgetall - \putcompletecaption}% - \doifelse{\@@kjkjbreedte}{\v!max} - {\dosetraggedbox{\@@kjkjuitlijnen}% - \setbox2=\raggedbox - {\hsize\wd4 - \putcompletecaption}} - {\doifelse{\@@kjkjbreedte}{\v!passend} - {\ifdim\wd2>\wd4\relax - \setbox2=\vbox - {\forgetall - \hsize\wd4 - \putcompletecaption}% - \else - \setbox2=\hbox to \wd4 - {\hss\box2\hss}% - \fi} - {\dosetraggedbox{\@@kjkjuitlijnen}% - \setbox2=\raggedbox - {\hsize\wd4 - \putcompletecaption}}}% - \global\setbox\floatbox=\vbox - {\processaction - [\@@kjkjplaats] - [ \v!boven=>\box2 - \@@kjkjtussen - \box4, - \v!onder=>\box4 - \@@kjkjtussen - \box2, - \v!geen=>\box4]}}% - \egroup} - -\newif\ifparfloat - -\long\def\dosetfloatbox#1#2#3#4% - {\ifvisible - \par - \doifcommonelse - {#1}{\v!links,\v!rechts,\v!inlinker,\v!inrechter,\v!inmarge} - {\global\parfloattrue} - {\global\parfloatfalse}% - \ifbinnenkolommen - \global\parfloatfalse - \fi - \edef\@@kjkjbreedte {\getvalue{\??kj#4\c!breedte}}% - \def \@@kjkjtussen {\getvalue{\??kj#4\c!tussen}}% geen \edef - \edef\@@kjkjplaats {\getvalue{\??kj#4\c!plaats}}% - \edef\@@kjkjuitlijnen {\getvalue{\??kj#4\c!uitlijnen}}% - \ifparfloat - \dosetparfloat{#1}{#2}{#3}{#4}% - \else - \dosetpagfloat{#1}{#2}{#3}{#4}% - \fi - \global\floatheight=\ht\floatbox - \global\advance\floatheight by \dp\floatbox - \global\floatwidth=\wd\floatbox - \global\advance\totalnoffloats by 1\relax - \doifnotinset{\v!marge}{#1} % gaat namelijk nog fout - {\setbox\floatbox=\vbox - {\parindent\!!zeropoint - \ifvoorlopig - \inlinker{\framed{\infofont\the\totalnoffloats}}% - \fi - \box\floatbox}}% - \wd\floatbox=\floatwidth - \dimen0=\floatheight - \advance\dimen0 by \lineheight - \ifdim\dimen0<\teksthoogte - \else - \global\floatheight=\teksthoogte - \global\advance\floatheight by -\lineheight - \ht\floatbox=\floatheight - \dp\floatbox=\!!zeropoint - \showmessage{\m!floatblocks}{10}{\the\totalnoffloats}% - \fi - \fi} - -\def\dogetfloatbox#1% - {\ifvisible - \def\next##1{\global\floatsonpagetrue\def\next{##1}}% - \processfirstactioninset - [#1] - [ \v!hier=>\next{\someelsefloat[#1]}, - \v!forceer=>\next{\somefixdfloat[#1]}, - \v!links=>\next{\somesidefloat[#1]}, - \v!rechts=>\next{\somesidefloat[#1]}, - \v!tekst=>\next{\sometextfloat[#1]}, - \v!boven=>\def\next{\someelsefloat[#1]}, % ! - \v!onder=>\next{\someelsefloat[#1]}, - \v!marge=>\def\next{\somenextfloat[#1]}, % ! - \v!pagina=>\next{\somepagefloat[#1]}, - \v!naast=>\next{\somefacefloat[#1]}, - \v!inmarge=>\next{\somesidefloat[#1]}, - \v!inlinker=>\next{\somesidefloat[#1]}, - \v!inrechter=>\next{\somesidefloat[#1]}, - \s!default=>\next{\someelsefloat[\v!hier,#1]}, - \s!unknown=>\next{\someelsefloat[\v!hier,#1]}]% - \next - \fi} - -\long\def\dofloat#1#2#3#4% - {\dosetfloatbox{#1}{#2}{#3}{#4}% - \dogetfloatbox{#1}}% - -\long\def\docompletefloat#1#2#3#4#5#6#7% - {\flushsidefloats - \calculatefloatskips - \bgroup - \global\setbox\floatbox=\vbox{#7}% - \dimen0=\ht\floatbox - \advance\dimen0 by \dp\floatbox - \ifdim\dimen0=\!!zeropoint\relax - \showmessage{\m!floatblocks}{11}{}% - \global\setbox\floatbox=\vbox{\getvalue{\e!lege#3}}% - \fi - \ConvertToConstant\doifelse{#6}{\v!geen} - {\global\setbox\floatbox=\ruledvbox - {\unvbox\floatbox - \vss % gets rid of the depth - \rawpagereference{\s!flt}{#2}}% - \egroup\dofloat{#4}{}{#6}{#1}} - {\doifelsevalue{\??kj#1\c!nummer}{\v!ja} - {\verhoognummer[#1]% - \maakhetnummer[#1]% - \global\setbox\floatbox=\vbox - {\unvbox\floatbox % no \vss, keep the depth - \dofloatreference - \redofloatorder{#1}% - \rawreference{\s!flt}{#2}{\hetnummer}% - \doschrijfnaarlijst{#3}{\hetnummer}{#6}{#3}}% - \egroup\dofloat{#4}{#5\hetnummer}{#6}{#1}} - {\global\setbox\floatbox=\vbox - {\unvbox\floatbox % no \vss, keep the depth - \rawpagereference{\s!flt}{#2}}% - \egroup\dofloat{#4}{}{#6}{#1}}}% - \global\insidefloatfalse} - -\def\plaatsvolledig#1#2#3#4% kop, ref, tit, do - {#1[#2]{#3}% - #4% - \pagina[\v!ja]} - -%I n=Figuren -%I c=\plaatsfiguur,\reserveerfiguur,\startfiguurtekst -%I c=\leegfiguur,\volledigelijstmetfiguren -%I c=\plaatstabel,\reserveertabel,\starttabeltekst -%I c=\legetabel,\volledigelijstmettabellen -%I -%I Figuren en tabellen (gebruik ..tabel.. in plaats van -%I ..figuur..) kunnen in de tekst worden geplaatst met het -%I commando: -%I -%I \plaatsfiguur[plaats][referentie]{titel}{figuur} -%I -%I Als voorkeur kan worden opgegeven 'hier', 'forceer', -%I 'pagina', 'boven', 'onder', 'links' en 'rechts'. In plaats -%I van een titel kan 'geen' worden meegegeven, in dat geval -%I wordt geen titel geplaatst. Eventueel kan in combinatie -%I met links en rechts 'lang' worden opgegeven. -%I -%I De volgorde kan worden afgedwongen met 'altijd', -%I bijvoorbeeld [hier,altijd]. In dat geval wordt bij een -%I volgende run zonodig de nummering aangepast. -%I -%I In plaats van een titel kan {geen} worden ingevuld. In -%I dat geval blijft de titel achterwege. -%P -%I Het is mogelijk ruimte voor een figuur te reserveren: -%I -%I \reserveerfiguur[hoogte=,breedte=,kader=][voorkeur] -%I [referentie]{titel} -%P -%I Een lijst met figuren kan worden opgeroepen met: -%I -%I \plaatslijstmetfiguren -%I \volledigelijstmetfiguren -%I -%I Men kan een tekst naast een figuur zetten met: -%I -%I \startfiguurtekst[plaats][referentie]{kop}{figuur} -%I ... -%I \stopfiguurtekst -%I -%I Mogelijke plaatsen zijn (combinaties van) 'links', 'rechts', -%I 'hoog', 'laag' en 'midden'. Met 'offset' dwingt men een -%I verschuiving omlaag van van 1 regel af. -%I -%I Zie verder onder plaatsblokken. - -%I n=Tabellen -%I -%I Zie figuren. - -%I n=Intermezzo -%I -%I Zie figuren. - -%I n=Grafieken -%I -%I Zie figuren. - -%T n=figuur -%T m=fig -%T a=f -%T -%T \plaatsfiguur -%T [hier] -%T [fig:] -%T {} -%T {\naam{?}} -%T - -\definieernummer - [\??si] - [\c!wijze=\v!per\v!tekst, - \c!conversie=\@@siconversie] - -\def\stelplaatsbloksplitsenin% - {\dodoubleargument\getparameters[\??si]} - -% ook (continued) - -\def\dosplitsplaatsblok[#1]#2% nog dubbele refs - {\ifbinnenkolommen % tzt ook nog figuren splitten - % not yet supported - \else - \bgroup - \insidefloattrue - \getparameters[\??si][#1]% - \resetnummer[\??si]% - \def\floatcaptionsuffix{\nummer[\??si]}% - \TABLEcaptionheight=\@@siregels\lineheight - \dowithnextbox - {\forgetall - \mindermeldingen - \doloop - {\setbox2\vsplit\nextbox to \lineheight - \setbox2=\vbox{\unvbox2} - \ifdim\ht2>\lineheight - \verhoognummer[\??si]% - \ifnum\ruwenummer[\??si]=1 \ifdim\ht\nextbox=\!!zeropoint - \let\floatcaptionsuffix=\empty - \fi\fi - \bgroup - #2{\unvbox2} - \egroup - \pagina - \ifdim\ht\nextbox>\!!zeropoint - \verlaagnummer[\floatcaptionnumber]% - \fi - \fi - \ifdim\ht\nextbox>\!!zeropoint\else - \expandafter\exitloop - \fi}% - \egroup} - \vbox - \fi} - -\def\splitsplaatsblok% - {\dosingleempty\dosplitsplaatsblok} - -%I n=Formules -%I c=\plaatsformule,\plaatssubformule,\stelformulesin -%I -%I Formules kunnen in de tekst worden geplaatst met -%I het commando: -%I -%I \plaatsformule[referentie]subnummer$$formule$$ -%I -%I Dit commando handelt de witruimtes om de formules af en -%I plaatst nummers. Als geen nummer nodig is, en dus ook -%I geen referentie, dan moet met het commando als volgt -%I gebruiken: -%I -%I \plaatsformule-$$...$$ of \plaatsformule[-]$$...$$ -%I -%I Als het nummer niet moet worden opgehoogd, gebruikt men -%I -%I \plaatssubformule[referentie]subnummer$$formule$$ -%P -%I PAS OP: -%I -%I Binnen een aantal wiskundige commando's, zoals -%I \displaylines, moet men het nummer zelf plaatsen. Dit -%I kan gebeuren met: \formulenummer of \subformulenummer. -%I Ook hier kan een [referentie] en een {subnummer} worden -%I meegegeven. -%I -%I \plaatsformule -%I $$\displaylines -%I {x \hfill\formulenummer[eerste]{}\cr -%I y \hfill\cr -%I z \hfill\formulenummer[derde]{}\cr} -%I $$ -%P -%I De wijze waarop formules worden genummerd kan worden -%I be‹nvloed door het commando: -%I -%I \stelformulesin[links=,rechts=,plaats=] -%I -%I De nummers kunnen links en rechts worden gezet. Standaard -%I worden de symbolen ( en ) gebruikt. -%I -%I Tussen twee formules kan witruimte worden geforceerd met -%I het commando: -%I -%I \blanko[formule] - -\abovedisplayskip = \!!zeropoint\relax -\abovedisplayshortskip = \!!zeropoint\relax % evt. 0pt minus 3pt -\belowdisplayskip = \!!zeropoint\relax -\belowdisplayshortskip = \!!zeropoint\relax % evt. 0pt minus 3pt - -\predisplaypenalty = 0 -\postdisplaypenalty = 0 % -5000 gaat mis, zie penalty bij \paragraaf - -\doorlabelen - [\v!formule] - [\c!tekst=\v!formule, - \c!wijze=\@@fmwijze, - \c!blokwijze=\@@fmblokwijze, - \c!plaats=\v!intekst] - -\def\stelformulesin% - {\dodoubleargument\getparameters[\??fm]} - -\def\dodoplaatsformule#1[#2]#3$$#4$$% - {\begingroup - \setdisplayskips - \!!doneafalse - \doif{#2}{-}{\!!doneatrue}% - \doif{#3}{-}{\!!doneatrue}% - \if!!donea % no number - \def\complexformulenummer[##1]##2% - {}% - \def\formulenummer% - {\complexorsimpleempty{formulenummer}}% - \def\subformulenummer% - {\formulenummer}% - \snaptomathgrid{$$#4$$} - \else - \doifelse{#1}{\v!ja} - {\def\verhoogformulenummer{\verhoognummer[\v!formule]}} - {\let\verhoogformulenummer=\relax}% - \def\simpleformulenummer% - {\gdef\doeqno{}% - \gdef\doleqno{}% - \gdef\formulenummer{\doformulenummer}% - \doformulenummer[#2]{#3}}% - \def\complexformulenummer% - {\gdef\doeqno{}% - \gdef\doleqno{}% - \gdef\formuleummer{\doformulenummer}% - \doformulenummer}% - \def\formulenummer% - {\complexorsimple{formulenummer}}% - \def\subformulenummer% - {\let\verhoogformulenummer=\relax - \complexorsimple{formulenummer}}% - \gdef\doleqno{\leqno{\formulenummer}}% - \gdef\doeqno{\eqno{\formulenummer}}% - \doifelse{\@@fmplaats}{\v!links} - {\snaptomathgrid{$$#4\doleqno$$}} - {\snaptomathgrid{$$#4\doeqno$$}} - \fi - \par - \ignorespaces - \endgroup} - -\def\complexdoformulenummer[#1]#2% - {\verhoogformulenummer - \doifelse{#2}{ } - {\def\hetsubnummer{}} - {\def\hetsubnummer{#2}}% - {\rm\strut\@@fmlinks\lossenummer[\v!formule]\hetsubnummer\@@fmrechts}% - \rawreference{\s!for}{#1}{\hetnummer\hetsubnummer}} - -\letvalue{\e!start\e!formule}=\undefined -\letvalue{\e!stop \e!formule}=\undefined - -%\def\dodoplaatsstartformule#1[#2]#3\startformule#4\stopformule% -% {\dodoplaatsformule#1[#2]#3$$#4$$} - -\expanded - {\def\noexpand\dodoplaatsstartformule##1[##2]##3\csname\e!start\e!formule\endcsname##4\csname\e!stop\e!formule\endcsname% - {\noexpand\dodoplaatsformule##1[##2]##3$$##4$$}} - -\setvalue{\e!start\e!formule}{\snaptomathgrid\bgroup\setdisplayskips$$} -\setvalue{\e!stop \e!formule}{$$\egroup} - -\def\doplaatsformule#1[#2]#3% % #3 gobbles spaces between [] and $$ or \startformule - {\def\redoplaatsformule% % we can't lose {} after $$ - {\expandafter\ifx\csname\e!start\e!formule\endcsname\next - \let\next=\dodoplaatsstartformule - \else - \let\next=\dodoplaatsformule - \fi - \next#1[#2]}% - \futurelet\next\redoplaatsformule#3} - -\def\complexplaatsformule% - {\doplaatsformule{\v!ja}} - -\def\complexplaatssubformule% - {\doplaatsformule{\v!nee}} - -\definecomplexorsimpleempty\doformulenummer -\definecomplexorsimpleempty\plaatsformule -\definecomplexorsimpleempty\plaatssubformule - -%I n=Naast -%I c=\startnaast,\stelnaastplaatsenin -%I -%I Experiment: -%I -%I \startnaast -%I ... -%I \stopnaast -%I -%I \stelnaastplaatsenin[status=] -%I - -% \newbox\facingbox -% \newbox\facingpage -% -% \newdimen\facingboxsize -% \newdimen\facingpagetotal -% -% \facingpagetotal=\!!zeropoint -% -% \newif\iffacingpages \facingpagesfalse -% -% \def\shipoutfacingpage% -% {\iffacingpages -% \setbox\facingpage=\vbox to \zethoogte -% {\kern\hoofdhoogte -% \kern\ht\topins % ? -% \kern\dp\topins % ? -% \kern\dp\strutbox % checken -% \box\facingpage -% \vfill}% -% \myshipout{\buildpagebody\box\facingpage}% -% \fi -% \global\setbox\facingpage=\box\voidb@x -% \global\facingpagetotal=\!!zeropoint\relax} -% -% \def\flushfacingpage% -% {\penalty-\!!tenthousand -% \global\facingpagetotal=\facingboxsize -% \setbox\facingpage=\vbox{\box\facingbox}} -% -% \def\startnaast#1\stopnaast% -% {\iffacingpages -% \setbox\facingbox=\vbox -% {\hsize=\zetbreedte\relax -% #1}% -% \global\facingboxsize=\ht\facingbox -% \global\advance\facingboxsize by \dp\facingbox -% \ifdim\pagetotal<\facingpagetotal -% \dimen2=\facingpagetotal -% \advance\dimen2 by -\pagetotal -% \vskip\dimen2\relax -% \else -% \dimen2=\!!zeropoint\relax -% \fi -% \dimen0=\pagetotal -% \advance\dimen0 by \facingboxsize -% \ifdim\dimen0>\pagegoal -% \flushfacingpage -% \else -% \global\advance\facingpagetotal by \facingboxsize -% \ifdim\facingpagetotal>\pagegoal -% \flushfacingpage -% \else -% \setbox\facingpage=\vbox -% {\offinterlineskip -% \mindermeldingen -% \ht\facingpage=\!!zeropoint -% \ifdim\pagetotal=\topskip -% \vskip-\topskip -% \fi -% \box\facingpage -% \advance\dimen2 by \pagetotal -% \vskip\dimen2\relax -% \ifdim\facingpagetotal>\facingboxsize -% \vskip\tussenwit -% \fi -% \box\facingbox}% -% \fi -% \fi -% \fi} -% -% \def\dostelnaastplaatsenin[#1]% -% {\getparameters[\??np][#1]% -% \doifelse{\@@npstatus}{\v!start} -% {\global\facingpagestrue} -% {\global\facingpagesfalse}} -% -% \def\stelnaastplaatsenin% -% {\dosingleargument\dostelnaastplaatsenin} -% -% \def\naastpagina% -% {\shipoutfacingpage} -% -% \def\facefloat% redefined -% {\startnaast\box\floatbox\stopnaast} - -\newbox\facingbox -\newbox\facingpage - -\newif\iffacingpages \facingpagesfalse - -\def\shipoutfacingpage% - {\iffacingpages - \ifnum\realpageno>1 - \bgroup - \pagebodyornamentsfalse - \setbox\facingpage=\vbox to \zethoogte - {\unvbox\facingpage\vfil}% - \myshipout{\buildpagebody\box\facingpage}% - \egroup - \else - \global\setbox\facingpage=\box\voidb@x - \fi - \fi} - -\def\naastpagina% - {\shipoutfacingpage} - -\def\facefloat% redefined - {\startnaast\box\floatbox\stopnaast} - -\def\startnaast% beter: \dowithnextbox - {\iffacingpages - \global\setbox\facingbox=\ruledvbox - \bgroup - \hsize=\zetbreedte - \else - \def\next{\gobbleuntil\stopnaast}% - \expandafter\next - \fi} - -\def\stopnaast% - {\egroup - \global\setbox\facingpage=\vbox - {\ifvoid\facingpage - \vskip\openstrutdepth % \dp\strutbox - \else - \unvbox\facingpage - \fi - \box\facingbox - \blanko}} - -\def\dostelnaastplaatsenin[#1]% - {\getparameters[\??np][#1]% - \doifelse{\@@npstatus}{\v!start} - {\global\facingpagestrue} - {\global\facingpagesfalse}} - -\def\stelnaastplaatsenin% - {\dosingleargument\dostelnaastplaatsenin} - -%I n=Lijsten -%I c=\definieerlijst,\stellijstin,\plaatslijst -%I -%I Er kunnen lijsten worden aangemaakt en opgeroepen. Een -%I lijst wordt gedefinieerd met: -%I -%I \definieerlijst[naam] -%I -%I en zonodig ingesteld met: -%I -%I \stellijstin[naam][status=,variant=,marge=,breedte=, -%I scheider=,afstand=,paginanummer=,deelnummer=, -%I titeluitlijnen=,label=,letter=,tekstletter=,nummerletter=, -%I paginaletter=,paginaovergangen=,voor=,na=,niveau=, -%I criterium=,symbool=,prefix=,links=,rechts=] -%I -%I De instellingen mogen ook direkt worden opgegeven: -%I -%I \definieerlijst[naam][instellingen] -%I -%I Ook kunnen kenmerken van andere lijsten worden overgenomen: -%I -%I \definieerlijst[naam][andere naam] -%P -%I De vorm van de lijst wordt onder meer bepaald door de variant -%I (a,b,c). In grote lijnen ziet een lijst er als volgt uit: -%I -%I <marge+breedte+scheider+afstand> <variant> -%I -%I Mogelijke varianten zijn: -%I -%I variant a : nummer - titel - pagina -%I variant b : nummer - titel - spaties - pagina -%I variant c : nummer - titel - punten - pagina -%I variant d : nummer - titel - pagina (doorlopend) -%P -%I Een of meer lijsten kunnen wordt opgeroepen met: -%I -%I \plaatslijst[naam,naam,...] -%I -%I Standaard zijn lijsten gedefinieerd voor deel, hoofdstuk, -%I paragraaf, subparagraaf en subsubparagraaf. Deze lijsten -%I zijn dus afzonderlijk in te stellen. Deze lijsten zijn -%I gegroepeerd tot een samengestelde lijst (zie elders). -%I -%I De layout van een lijst kan worden beinvloed door -%I commando's tussen te voegen met: -%I -%I \schrijftussenlijst[naam]{commandos} -%I -%I Voor eigen gebruik is \iflijstgeplaatst beschikbaar. -%P -%I Gevorderde gebruikers kunnen eigen lijstcommando's maken. -%I Deze commando's kunnen worden toegekend met: -%I -%I [...,nummercommando=,tekstcommando=,paginacommando=,...] -%I -%I en hebben de vorm -%I -%I \commando{argument} -%I -%I bijvoorbeeld -%I -%i nummercommando=\omlijnd -%I -%I Volledige vrijheid krijgt men met de instelling -%I -%I variant=geen - -% \getlistlevel[hoofdstuk]\test{0} \test - -\def\getlistlevel[#1]#2#3% [list] \variable \default - {\doifdefinedelse{\??ko#1\c!sectie} - {\edef#2{\getvalue{\??ko#1\c!sectie}}% - \doifdefinedelse{\??se#2\c!niveau} - {\edef#2{\getvalue{\??se#2\c!niveau}}} - {\edef#2{#3}}} - {\edef#2{#3}}} - -\def\doschrijfnaarlijst#1#2#3#4% - {\doifvalue{\??li#1\c!status}{\v!start} - {\begingroup - \thisisnextinternal{#1}% - % - % Dit gaat goed als #2 geen commando's bevat. Dit is - % bij interactieve teksten echter soms wel het geval. - % Vandaar dat we dit optioneel moeten maken, bijvoorbeeld - % met \stellijstin[referentie=ja]. - % - \ExpandFirstAfter\processaction - [\getvalue{\??li#1\c!expansie}] - [ \v!ja=>{\edef\ascii{#3}}, - \v!commando=>{\convertcommand#3\to\ascii}, - \s!unknown=>{\convertargument#3\to\ascii}]% - \makesectionformat - \doifelse{\@@nmstatus}{\v!start} - {\def\dopaginanummer{\noexpand\pagenumber}} - {\def\dopaginanummer{0}}% - \edef\schrijfwegnaarlijst% - {\writeutilitycommand% - {\listentry% - {#1}% - {\nextinternalreference}% - {#2}% - {\ascii}% - {\sectionformat::\dopaginanummer}% - {\noexpand\realfolio}}}% - \schrijfwegnaarlijst - \endgroup}} - -\def\doschrijftussenlijst#1#2% - {\doif{\getvalue{\??li#1\c!status}}{\v!start} - {\begingroup - \convertargument#2\to\ascii - \makesectionformat - \doifelse{\@@nmstatus}{\v!start} - {\def\dopaginanummer{\noexpand\pagenumber}} - {\def\dopaginanummer{0}}% - \edef\schrijfwegnaarlijst% - {\writeutilitycommand% - {\listbetween% - {#1}% - {\ascii}% - {\sectionformat::\dopaginanummer}% - {\noexpand\realfolio}}}% - \schrijfwegnaarlijst - \endgroup}} - -\def\listentry#1% - {\executeifdefined{#1\c!lijst}\gobblefivearguments} - -\def\listbetween#1% - {\executeifdefined{#1\c!tussen}\gobblethreearguments} - -\def\@@livarianta% nr - tit - pag - {\def\lijstfill{\hskip 1.25em}% - \def\lijstskip{0em}} - -\def\@@livariantb% nr - tit - fill - pag - {\def\lijstfill{\hfill}% - \def\lijstskip{5em}} - -\def\@@livariantc% nr - tit - dots - pag - {\def\lijstfill{\leaders\hbox to .5em{\hss.\hss}\hfill\hskip.5em}% - \def\lijstskip{5em}} - -\def\@@livariant% - {\lijstvariantb} - -\@@livariantb - -\def\dostellijstin[#1][#2]% - {\def\docommando##1% - {\getparameters[\??li##1][#2] - \preparepaginaprefix{\??li##1}}% - \processcommalist[#1]\docommando} - -\def\stellijstin% - {\dodoubleargument\dostellijstin} - -\def\dodosetlijst#1% - {\setvalue{#1\c!tussen}{\dotussenlijst{#1}}% - \setvalue{#1\c!lijst}{\dolijstelement{#1}}} - -\def\dodoresetlijst#1% - {\setvalue{#1\c!tussen}{\gobblefourarguments{#1}}% - \setvalue{#1\c!lijst}{\gobblesixarguments{#1}}} - -%\def\dodoresetlijst#1% -% {\setvalue{#1\c!tussen}{\gobblethreearguments}% -% \setvalue{#1\c!lijst}{\gobblefivearguments}} - -\def\dodefinieerlijst[#1][#2][#3]% - {\presetlocalframed[\??li#1]% - \getparameters - [\??li#1] - [\c!hoogte=\v!ruim, - \c!diepte=\v!ruim, - \c!offset=0.25em, - % - \c!status=\v!start, - \c!koppeling=\v!uit, - \c!criterium=\v!lokaal, - \c!breedte=3em, - \c!variant=\c!b, - \c!letter=\v!normaal, - \c!tekstletter=\getvalue{\??li#1\c!letter}, - \c!nummerletter=\getvalue{\??li#1\c!letter}, - \c!paginaletter=\getvalue{\??li#1\c!letter}, - \c!kleur=, - \c!tekstkleur=\getvalue{\??li#1\c!kleur}, - \c!nummerkleur=\getvalue{\??li#1\c!kleur}, - \c!paginakleur=\getvalue{\??li#1\c!kleur}, - \c!nummercommando=\lijstnummercommando, - \c!tekstcommando=\lijsttekstcommando, - \c!paginacommando=\lijstpaginacommando, - \c!paginanummer=\v!ja, - \c!paginaovergangen=, - \c!marge=\!!zeropoint, - \c!titeluitlijnen=, - \c!voor=, - \c!na=, - \c!symbool=, - \c!interactie=\v!sectienummer, - \v!deel\c!nummer=\v!ja, % nodig ? - \c!label=\v!nee, - \c!afstand=\!!zeropoint, - \c!scheider=]% - \ConvertToConstant\doifinstringelse{=}{#2} - {\getparameters[\??li#1][#2]} - {\ConvertToConstant\doifnot{#2}{} - {\copyparameters - [\??li#1][\??li#2] - [\c!status,\c!breedte,\c!variant,\c!letter,\c!kleur, - \c!tekstletter,\c!tekstkleur,\c!tekstcommando, - \c!paginaletter,\c!paginacommando,\c!paginakleur, - \c!nummerletter,\c!nummerkleur,\c!nummercommando, - \c!paginanummer,\c!paginaovergangen,\c!marge,\c!symbool, - \c!titeluitlijnen,\c!voor,\c!na,\v!deel\c!nummer,\c!label]% - \getparameters[\??li#1][#3]}}% - \addutilityreset{#1}% - \setvalue{\s!set#1}% - {\dodosetlijst{#1}}% - \setvalue{\s!reset#1}% - {\dodoresetlijst{#1}}} - -\def\definieerlijst% - {\dotripleempty\dodefinieerlijst} - -\def\iflijstgeplaatst{\ifutilitydone} - -\def\dobeginoflist% - {\begingroup - \startopelkaar[\v!blanko]} - -\def\doendoflist% - {\stopopelkaar - \endgroup} - -\def\doplaatslijst[#1][#2]% - {\dobeginoflist - \getfromcommalist[#1][1]% - \let\firstlistelement=\commalistelement - \dostellijstin[#1][#2]% - \doifvalue{\??li\firstlistelement\c!koppeling}{\v!aan} - {\startlistreferences{#1}}% - \dosettoclevel{\getvalue{\??li\firstlistelement\c!criterium}}% - \doutilities{#1}{\jobname}{#1}{}{\par}% - \stoplistreferences{#1}% - \doendoflist} - -\def\plaatslijst% - {\dodoubleempty\doplaatslijst} - -\def\dodovolledigelijst[#1][#2][#3]% enkelvoud, meervoud, instellingen - {\systemsuppliedtitle[#2]{\headtext{#2}} - \doplaatslijst[#1][#3]} - -\def\dovolledigelijst[#1][#2]% - {\dodovolledigelijst[#1][#1][#2]} - -\def\volledigelijst% - {\dodoubleempty\dovolledigelijst} - -\def\lijstelementen{} % bevat lijst met paginaovergangen -\def\lijstnummercommando#1{#1} % geen strut i.v.m. intractieve versie -\def\lijsttekstcommando#1{\begstrut#1\endstrut} -\def\lijstpaginacommando#1{\strut#1} - -\def\doassigndimen#1#2#3% - {\doifinsetelse{#2}{\v!passend,\v!ruim} - {#1=#3\relax} - {#1=#2\relax}} - -\def\dosetlistsymbol#1#2% - {\processaction - [\getvalue{\??li#1\c!symbool}] - [ \v!geen=>\def\listsymbol% - {\doassigndimen{\dimen0}{\getvalue{\??li#1\c!breedte}}{1.5em}% - \hbox to \dimen0{}}, - 1=>\def\listsymbol% - {\strut$\bullet$}, - 2=>\def\listsymbol% - {\vrule\!!width1em\!!height1ex\!!depth\!!zeropoint}, - 3=>\def\listsymbol% very slow - {{\doassigndimen{\dimen0}{\getvalue{\??li#1\c!breedte}}{1.5em}% - \doassigndimen{\dimen2}{\getvalue{\??li#1\c!hoogte}}{1ex}% - \doassigndimen{\dimen4}{\getvalue{\??li#1\c!diepte}}{0pt}% - \vrule\!!width\dimen0\!!height\dimen2\!!depth\dimen4}}, - \s!unknown=>\def\listsymbol{\getvalue{\??li#1\c!symbool}}, - \s!default=>\doifelsevalue{\??li#1\c!prefix}{\v!nee} - {\aftersplitstring#2\at.\to\splitlistsymbol} - {\def\splitlistsymbol{#2}}% geen \edef ivm enz - \def\listsymbol% - {\doifvalue{\??li#1\c!label}{\v!ja}{\labeltext{#1}}% - \strut\splitlistsymbol - \getvalue{\??li#1\c!scheider}}]} - -\def\dosomelijstelement#1#2#3{#1 #2 \translatednumber[#3]} - -\def\dodolijstelementa{\let\dosomelijstelement\dodofixdlijstelementABC} -\def\dodolijstelementb{\let\dosomelijstelement\dodofixdlijstelementABC} -\def\dodolijstelementc{\let\dosomelijstelement\dodofixdlijstelementABC} -\def\dodolijstelementd{\let\dosomelijstelement\dodofixdlijstelementD} -\def\dodolijstelemente{\let\dosomelijstelement\dodofixdlijstelementE} -\def\dodolijstelementf{\let\dosomelijstelement\dodofixdlijstelementF} -\def\dodolijstelementg{\let\dosomelijstelement\dodofixdlijstelementG} - -\setvalue{dodolijstelement\v!geen}{\let\dosomelijstelement\dodofreelijstelement} - -% Here I learned something new: \leftskip can be changed -% within a paragraph and the last one counts. Therefore we -% cannot use \bgroup's! The placement of the \leftskip -% assignment and the \endgraf's may not be changed. We have to -% end the preceding paragraph before changing \leftskip. This is -% because every listelement sets the \leftskip. - -% \strippedcsname\dodolijstelement - -\def\dolijstelement#1#2#3#4#5#6% pas op: wordt ook elders gedefinieerd - {\doiftoclevelelse[#5] - {\getvalue{dodolijstelement\getvalue{\??li#1\c!variant}}% - %\showcomposition - \let\@@iabreedte=\!!zeropoint % moet boolean worden - \bgroup - \edef\lijstelementen% - {\getvalue{\??li#1\c!paginaovergangen}}% - \ExpandSecondAfter\doifinset{#3}{\lijstelementen}% - {\showmessage{\m!systems}{14}{#3}% - \pagina}% - \egroup - \mindermeldingen - \dosetlistsymbol{#1}{#3}% - \dosomelijstelement{#1}{#2}{#3}{#4}{#5}{#6}% - \global\utilitydonetrue} - {}} - -\def\dolistattributes#1#2#3% - {\doifvaluesomething{\??li#1#2} - {\stelinteractiein[\c!kleur=,\c!contrastkleur=]}% - \doattributes - {\??li#1#3}} - -\def\dodofreelijstelement#1#2#3#4#5#6% - {\def\makelijstelement##1##2% - {\hbox - {\doifelsevalue{\??li#1\c!interactie}{##1} - {\setbox0=\hbox{\showcontrastlocation{\??ia}{#6}{##2}}% - \gotonextinternal{#1}{#2}{#6}{\copy0}} - {##2}}}% - \getvalue{\??li#1\c!voor}% can be \hskip - \doifdefinedelse{\??li#1\c!commando} - {\makelijstelement{\getvalue{\??li#1\c!interactie}}% this forces all - {\getvalue{\??li#1\c!commando}% - {#3}% geen conversies etc - {#4}% geen conversies etc - {\paginaprefix\??li#1[#5]% - \translatednumber[#5]}}} - {\ifvmode\nointerlineskip\fi % recently added - \vbox - {\forgetall - \makelijstelement\v!alles - {\makelijstelement\v!sectienummer - {\dolistattributes{#1}\c!nummerkleur\c!nummer - {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}}% - \makelijstelement\v!tekst - {\dolistattributes{#1}\c!tekstkleur\c!tekst - {\def\\{ }% - \dontconvertfont - \getvalue{\??li#1\c!tekstcommando}{#4}}}% - \doifvalue{\??li#1\c!paginanummer}{\v!ja} - {\doifsomething{#5} - {\makelijstelement\v!paginanummer - {\dolistattributes{#1}\c!paginakleur\c!pagina - {\getvalue{\??li#1\c!paginacommando} - {\paginaprefix\??li#1[#5]% - \translatednumber[#5]}}}}}}}% -\nointerlineskip % anders verkeerde spatiering bij multi-line - \endgraf}% - \getvalue{\??li#1\c!na}} - -\def\dodofixdlijstelementABC#1#2#3#4#5#6% weeden - {\endgraf - \leftskip=\getvalue{\??li#1\c!marge}% na de \endgraf ! - \getvalue{\??li#1\c!voor}% - \doifelsenothing{#3} - {\doifelsevalue{\??li#1\c!titeluitlijnen}{\v!ja} - {\!!widtha=\!!zeropoint} - {\!!widtha=\getvalue{\??li#1\c!breedte}}} - {\!!widtha=\getvalue{\??li#1\c!breedte}}% - \getvalue{\??li\c!variant\getvalue{\??li#1\c!variant}}% - \endgraf - \def\makelijstelement##1##2% - {\doifelsevalue{\??li#1\c!interactie}{##1} - {\setbox0=\hbox{\showcontrastlocation{\??ia}{#6}{##2}}% - \gotonextinternal{#1}{#2}{#6}{\copy0}} - {\hbox{##2}}}% - \doifvalue{\??li#1\c!interactie}{\v!tekst} % not supported - {\doassign[\??li#1][\c!interactie=\v!alles]}% - \makelijstelement\v!alles - {\hbox to \hsize - {\!!widthb=\hsize - \setbox2=\hbox \ifdim\!!widtha>\!!zeropoint to \!!widtha \fi - {\makelijstelement\v!sectienummer - {\dolistattributes{#1}\c!nummerkleur\c!nummer - {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}% - \hfill}}% - \setbox4=\hbox - {\doifvalue{\??li#1\c!paginanummer}{\v!ja} - {\doifsomething{#5} - {\hbox to 2em - {\hfill - \makelijstelement\v!paginanummer - {\dolistattributes{#1}\c!paginakleur\c!pagina - {\getvalue{\??li#1\c!paginacommando} - {\paginaprefix\??li#1[#5]% - \translatednumber[#5]}}}}}}}% - \vbox - {\hsize\!!widthb - \ifdim\!!widtha<\hsize - \hangindent=\wd2 - \dimen2=\getvalue{\??li#1\c!afstand}% - \advance\hangindent by \dimen2 - \hangafter=1 - \ifvoid4 - % we kunnen gewoon afbreken aan het eind - \else - \ifdim\lijstskip>\!!zeropoint\relax - \rightskip=\lijstskip\!!plus10em\relax - \parfillskip=-\rightskip - \fi - \fi - \else - \dimen2=\!!zeropoint - \fi - \parindent=\!!zeropoint\relax - \leavevmode - \box2\relax - \hskip\dimen2 - \bgroup - \dolistattributes{#1}\c!tekstkleur\c!tekst - {\def\\{ }% - \dontconvertfont - \getvalue{\??li#1\c!tekstcommando}{#4}}% - \egroup - \ifvoid4 - \ifdim\!!widtha<\hsize - \hfill\strut - \fi - \else - \nobreak\hskip.5em\lijstfill - \box4\relax - \relax - \fi}% - \hss}}% -\nointerlineskip % anders verkeerde spatiering bij multi-line - \endgraf - \getvalue{\??li#1\c!na}} - -% overrulen interactie kan sneller, bv door hulpconstanten -% te gebruiken en die te letten - -\def\dodofixdlijstelementD#1#2#3#4#5#6% - {\leftskip=\getvalue{\??li#1\c!marge}% - \bgroup - \ifvmode - \noindent\leavevmode - \fi - \doifvalue{\??li#1\c!interactie}{\v!tekst} % not supported - {\doassign[\??li#1][\c!interactie=\v!sectienummer]}% - \doifvalue{\??li#1\c!interactie}{\v!alles} % not supported - {\doassign[\??li#1][\c!interactie=\v!sectienummer]}% - \def\makelijstelement##1##2% - {\doifelsevalue{\??li#1\c!interactie}{##1} - {\setbox0=\hbox{\showcontrastlocation{\??ia}{#6}{##2}}% - \gotonextinternal{#1}{#2}{#6}{\copy0}} - {\hbox{##2}}}% - \setbox4=\hbox - {\doifvalue{\??li#1\c!paginanummer}{\v!ja} - {\doifsomething{#5} - {\makelijstelement\v!paginanummer - {\dolistattributes{#1}\c!paginakleur\c!pagina - {\getvalue{\??li#1\c!paginacommando} - {\paginaprefix\??li#1[#5]% - \translatednumber[#5]}}}}}}% - \hbox - {\getvalue{\??li#1\c!links}% - \makelijstelement\v!sectienummer - {\dolistattributes{#1}\c!nummerkleur\c!nummer - {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}}% - \getvalue{\??li#1\c!rechts}% - \hskip.5em}% - \nobreak - \tolerance3500 - \dolistattributes{#1}\c!tekstkleur\c!tekst - {\def\\{ }% - \dontconvertfont - \getvalue{\??li#1\c!tekstcommando}{#4}}% - \ifvoid4\else - \nobreak - \hskip.75em\relax - \nobreak - \box4 - \fi - \dimen0=\getvalue{\??li#1\c!afstand}\relax - \ifdim\dimen0<1em\relax - \hskip1em\!!plus1em\!!minus.25em\relax - \else - \hskip\dimen0\!!plus.5\dimen0\!!minus.25\dimen0\relax - \fi - \egroup} - -\def\dodofixdlijstelementE#1% - {\dodofixdlijstelementEFG{\localframed[\??li#1][\c!kleur=]}{#1}} - -\def\dodofixdlijstelementF% - {\dodofixdlijstelementEFG\relax} - -\def\dodofixdlijstelementG#1% - {\dodofixdlijstelementEFG\regelmidden{#1}} - -\def\dodofixdlijstelementEFG#1#2#3#4#5#6#7% - {\hbox - {\let\\=\relax - \dontconvertfont - \setbox0=\hbox - {#1{\dolocationattributes{\??li#2} - {\ignorespaces\showcontrastlocation{\??ia}{#7}{#5}}}}% - \gotonextinternal{#2}{#3}{#7}{\copy0}}} - -\def\schrijfnaarlijst[#1]#2#3% - {\doifsomething{#1} - {\convertargument#2\to\firstlistelement - \@EA\doschrijfnaarlijst\@EA{#1}{\firstlistelement}{#3}{\v!kop}}} - -\def\dotussenlijst#1#2#3#4% pas op: wordt ook elders gedefinieerd - {\doiftoclevelelse[#3] - {#2} - {}} - -\def\schrijftussenlijst[#1]#2% - {\@EA\doschrijftussenlijst\@EA{#1}{#2}} % #2 weg en \expanded - -% NOG ENGELS MAKEN - -\def\lijstlengte {\utilitylistlength} -\def\lijstbreedte {\utilitylistwidth} -\def\lijsthoogte {\utilitylistheight} - -\def\utilitylistlength {0} -\def\utilitylistwidth {0pt} -\def\utilitylistheight {0pt} - -\def\dobepaallijstkenmerken[#1][#2]% - {\begingroup - \doglobal\newcounter\utilitylistlength - \def\dolijstelement##1##2##3##4##5##6% - {\doiftoclevelelse[##5] - {\doglobal\increment\utilitylistlength - \hbox - {\doattributes - {\??li##1\c!tekst} - {\def\\{ }% - \dontconvertfont - \getvalue{\??li##1\c!tekstcommando}{##4}}}% - \global\utilitydonetrue} - {}}% - \dostellijstin[#1][#2]% - \getfromcommalist[#1][1]% - \dosettoclevel{\getvalue{\??li\commalistelement\c!criterium}}% - \setbox0=\vbox - {\doutilities{#1}{\jobname}{#1}{}{\par}}% - \xdef\utilitylistheight {\the\ht0}% - \xdef\utilitylistwidth {\the\wd0}% - \endgroup} - -\def\bepaallijstkenmerken% - {\dodoubleempty\dobepaallijstkenmerken} - -% \definieerreferentielijst -% [externalfigure] -% [commando=\toongrootfiguur, -% voor=\pagina, -% na=\pagina] -% -% \definieerreferentielijst -% [externaltable] -% [commando=\toongrotetabel, -% voor=\pagina, -% na=\pagina] -% -% \def\toongrootfiguur#1% -% {\externfiguur[#1][kader=aan,factor=max]} -% -% \def\toongrotetabel#1% -% {\switchtobodyfont[12pt]\haalbuffer[#1]} -% -% \schrijfnaarreferentielijst[externalfigure]{koe}{\externfiguur[koe][breedte=3cm,kader=aan]} -% \schrijfnaarreferentielijst[externalfigure]{paard}{\externfiguur[paard][breedte=3cm,kader=aan]} -% -% \startbuffer[kanweg] -% \starttabel[|||] -% \HL -% \VL test \VL test \VL\SR -% \HL -% \VL test \VL test \VL\FR -% \VL test \VL test \VL\MR -% \VL test \VL test \VL\LR -% \HL -% \stoptabel -% \stopbuffer -% -% \schrijfnaarreferentielijst[externaltable]{kanweg}{\switchtbodyfont[5pt]\haalbuffer[kanweg]} -% -% \plaatsreferentielijst -% [externalfigure,externaltable] - -% algemeen - -\def\referentiebutton#1[#2]% - {\bgroup - \let\referenceprefix=\empty - \setbox0=\hbox{\ignorespaces#1}% - \naarbox{\copy0}[#2]% - \egroup} - -\newcounter\referencecounter - -\def\doreferentielijstelement#1#2#3#4#5% - {\doiftoclevelelse[#4] - {\getvalue{\??rl#1\c!voor}% - \referentiebutton - {\getvalue{\??rl#1\c!commando}{#3}\pagereference[\r!to#2]}% - [\r!from#2]% - \global\utilitydonetrue - \getvalue{\??rl#1\c!na}} - {}} - -\def\doplaatsreferentielijst[#1][#2]% - {\begingroup -% \let\doschrijfnaarreferentielijst=\gobblethreearguments - \stelreferentielijstin[#1][#2,\c!status=\v!stop]% - \getfromcommalist[#1][1]% - \dosettoclevel{\getvalue{\??rl\commalistelement\c!criterium}}% - \doutilities{#1}{\jobname}{#1}{}{\par}% - \endgroup} - -\def\plaatsreferentielijst% - {\dodoubleempty\doplaatsreferentielijst} - -\def\doschrijfnaarreferentielijst#1#2#3% - {\doifvalue{\??rl#1\c!status}{\v!start} - {\begingroup - \makesectionformat - \doifelse{\@@nmstatus}{\v!start} - {\def\dopaginanummer{\noexpand\pagenumber}} - {\def\dopaginanummer{0}}% - \edef\schrijfwegnaarlijst% - {\writeutilitycommand% - {\referencelistentry% - {#1}% tag - {#2}% number - {#3}% data - {\sectionformat::\dopaginanummer}% - {\noexpand\realfolio}}}% - \schrijfwegnaarlijst - \endgroup}} - -\def\schrijfnaarreferentielijst[#1]#2#3% #1=class #2=data #3=visualization - {\doifelsevalue{\??rl#1\c!status}{\v!start} - {\referentiebutton% - {#3% - \doglobal\increment\referencecounter - \pagereference[\r!from\referencecounter]% - \doschrijfnaarreferentielijst{#1}{\referencecounter}{#2}}% - [\r!to\referencecounter]} - {#3}} - -\def\referencelistentry#1% - {\executeifdefined{#1\c!lijst}\gobblefourarguments} - -\def\dodosetreferentielijst#1% - {\setvalue{#1\c!lijst}{\doreferentielijstelement{#1}}} - -\def\dodoresetreferentielijst#1% - {\setvalue{#1\c!lijst}{\gobblefourarguments}} - -\def\dodefinieerreferentielijst[#1][#2]% - {\stelreferentielijstin[#1] - [\c!commando=, - \c!status=\v!start, - \c!criterium=\v!alles, - \c!voor=, - \c!na=, - #2] - \setcounter{#1}{0}% - \addutilityreset{#1}% - \setvalue{\s!set#1}% - {\dodosetreferentielijst{#1}}% - \setvalue{\s!reset#1}% - {\dodoresetreferentielijst{#1}}} - -\def\definieerreferentielijst% - {\dodoubleempty\dodefinieerreferentielijst} - -\def\dostelreferentielijstin[#1][#2]% - {\getparameters[\??rl#1][#2]} - -\def\stelreferentielijstin% - {\dodoubleempty\dostelreferentielijstin} - -%I n=Inhoudsopgave -%I c=\volledigeinhoud,\plaatsinhoud -%I c=\stelinhoudin -%I -%I Er kan een inhoudsopgave worden opgeroepen met: -%I -%I \plaatsinhoud -%I \volledigeinhoud -%I -%I De wijze waarop de inhoudsopgave wordt aangemaakt wordt -%I ingesteld met: -%I -%I \stelinhoudin[instellingen] -%I -%I De instellingen komen overeen met de van lijsten. -%P -%I Een inhoudsopgave is een zogenaamde samengestelde lijst. -%I Op termijn komt het mechanisme van samengestelde lijsten -%I ook voor de gebruiker beschikbaar. Vooralsnog werkt het -%I achter de schermen. -%I -%I De commando's zijn slim genoeg om meestal automatisch de -%I juiste lijsten te genereren. Men kan echter met 'criterium' -%I het niveau specificeren. Met 'niveau' geeft men aan tot welk -%I niveau de inhoudsopgave moet worden weergegeven. - -\def\dostelsamengesteldelijstin[#1][#2]% - {\getparameters[\??ih#1][#2]% - \ExpandFirstAfter\stellijstin[\getvalue{\??ih#1\c!lijst}][#2]} - -\def\stelsamengesteldelijstin% - {\dodoubleargument\dostelsamengesteldelijstin} - -\def\doplaatssamengesteldelijst[#1][#2]% - {\begingroup - \getparameters[\??ih#1][#2]% - \dosettoclevel{\getvalue{\??ih#1\c!criterium}}% - \edef\samengesteldelijst{\getvalue{\??ih#1\c!lijst}}% om voorlopig nog - \stripspaces\from\samengesteldelijst\to\samengesteldelijst % compatible te - \ExpandFirstAfter\doifnumberelse{\getvalue{\??ih#1\c!niveau}}% blijven - {\!!counta=\getvalue{\??ih#1\c!niveau}% met de vorige implementatie - \advance\!!counta by 1\relax% accepteren we ook nummers (0==deel) - \getfromcommacommand[\samengesteldelijst][\!!counta]% - \edef\maximumlijst{\commalistelement}}% - {\edef\maximumlijst{\getvalue{\??ih#1\c!niveau}}}% - \!!counta=\getvalue{\??se\getvalue{\??ko\maximumlijst \c!sectie}\c!niveau}% - \let\!!stringa=\samengesteldelijst - \let\samengesteldelijst=\empty - \def\docommando##1% - {\ifnum\getvalue{\??se\getvalue{\??ko##1\c!sectie}\c!niveau}>\!!counta - \else - \addtocommalist{##1}\samengesteldelijst - \fi}% - \processcommacommand[\!!stringa]\docommando - \doifvalue{\??ih#1\c!koppeling}{\v!aan} - {\startlistreferences{#1}}% - \ExpandFirstAfter\dodoplaatssamengesteldelijst[\samengesteldelijst][#2]% - \stoplistreferences{#1}% - \endgroup} - -\def\dodoplaatssamengesteldelijst[#1][#2]% - {\dobeginoflist - \dostellijstin[#1][#2]% - \doutilities{#1}{\jobname}{#1}{}{\par}% - \doendoflist} - -\def\dovolledigesamengesteldelijst[#1][#2]% - {\systemsuppliedtitle[#1]{\headtext{#1}}% - \doplaatssamengesteldelijst[#1][#2]} - -\def\dodefinieersamengesteldelijst[#1][#2][#3]% - {\setvalue{\??ih#1\c!lijst}{#2}% - \getcommalistsize[#2]% - \getfromcommalist[#2][\commalistsize]% - \doeassign[\??ih#1][\c!niveau=\commalistelement]% - \getparameters - [\??ih#1] - [\c!criterium=\v!lokaal, - #3]% - \setvalue{\e!stel#1\e!in}% - {\dodoubleempty\dostelsamengesteldelijstin[#1]}% - \setvalue{\e!plaats#1}% - {\dodoubleempty\doplaatssamengesteldelijst[#1]}% - \setvalue{\e!volledige#1}% - {\dodoubleempty\dovolledigesamengesteldelijst[#1]}} - -\def\definieersamengesteldelijst% - {\dotripleempty\dodefinieersamengesteldelijst} - -%I n=Synoniemen -%I c=\definieersynoniemen,\stelsynoniemenin -%I -%I Er kunnen meerdere lijsten worden gedefinieerd door middel -%I van het commando: -%I -%I \definieersynoniemen[naam][namen][commando] -%I -%I Na dit commando zijn de volgende commando's beschikbaar: -%I -%I \naam{tekst}{synoniem} -%I \commando{tekst} -%I \volledigelijstmetnamen -%I \plaatslijstmetnamen -%P -%I De commando's rond de lijst met afkortingen zijn gedefinieerd -%I met de waarden: [afkorting][afkortingen][\voluit]. Beschikbare -%I commando's zijn dus: -%I -%I \afkorting{afkorting}{betekenis} -%I \voluit{afkorting} -%I \volledigelijstmetafkortingen -%I \plaatslijstmetafkortingen -%I -%I De betekenis kan worden opgeroepen met \voluit{afkorting}. -%P -%I De wijze van zetten kan worden ingesteld met het commando: -%I -%I \stelsynoniemenin[naam][synoniemletter=,tekstletter=, -%I status=,plaats=,breedte=,criterium=,conversie=, -%I expansie=] -%I -%I Als de status 'stop' is, dan worden geen synoniemen naar -%I de lijst weggeschreven. Als het criterium 'alles' is, -%I dan worden alle synoniemen in het overzicht opgenomen, zoniet, -%I dan worden alleen gebruikte synoniemen opgenomen. Omdat -%I standaard 'conversie' op 'nee' staat, worden afkortingen -%I getoond. -%P -%I In principe is een synoniem pas beschikbaar als het is -%I gedefinieerd. Het is echter mogelijk synoniemen te laden, -%I mits de tekst tenminste eenmaal is verwerkt. Het is dus -%I mogelijk synoniemen op te roepen die pas later worden -%I gedefinieerd. Alleen de omschrijvingen zijn beschikbaar, -%I dus niet de commando's (doordenkertje). Het laden vindt -%I plaats met: -%I -%I \laadnamen -%I -%I of, zoals bij afkortingen: -%I -%I \laadafkortingen - -% Formaat tex-utility-input-file <jobname.tui>: -% -% synonym entry {tag} {pure} {text} {synonym} -% -% Deze file wordt met het programma TeXUtil omgezet in een -% in te lezen TeXFile met de commando's: -% -% \synonymentry {tag} {pure} {text} {synonym} - -\newif\ifsynonymmeaning - -\def\dostelsynoniemenin[#1][#2]% - {\getparameters[\??sm#1][#2]} - -\def\stelsynoniemenin% - {\dodoubleargument\dostelsynoniemenin} - -\def\doresetsynonym#1% - {\letvalue{#1\s!entry}=\gobblethreearguments} - -\def\dohandlesynonymentry#1#2#3% - {\bgroup - \syndef - {\doattributes{\??sm#1\c!tekst}{#2}} - \ConvertToConstant\doifelse{#3}{}{\onbekend}{#3} - \par - \egroup} - -\def\synonymentry#1% - {\executeifdefined{#1\s!entry}\gobblethreearguments} - -\def\dosetsynonym#1% - {\doifdefinedelse{\??sm#1\c!commando} - {\global\utilitydonetrue - \setvalue{#1\s!entry}{\getvalue{\??sm#1\c!commando}}} - {\global\utilitydonetrue - \setvalue{#1\s!entry}{\dohandlesynonymentry}}% - \doordefinieren - [syndef] - [\c!plaats=\synplaats, - \c!breedte=\synbreedte, - \c!kopletter=, - \c!voor=, - \c!tussen=, - \c!na=]} - -\def\doplaatslijstmetsynoniemen#1#2% - {\witruimte - \begingroup - \def\currentsynonym{#1}% - \def\synplaats{\getvalue{\??sm#1\c!plaats}}% - \def\synbreedte{\getvalue{\??sm#1\c!breedte}}% - \stelwitruimtein[\v!geen]% - \doutilities{#1}{\jobname}{#2}{}{\par}% - \endgroup - \ifutilitydone\else\geenwitruimte\fi} - -\def\dovolledigelijstmetsynoniemen#1#2% - {\plaatsvolledig - {\systemsuppliedchapter}{#1}{\headtext{#2}}% - {\doplaatslijstmetsynoniemen{#1}{#2}}} - -\def\processsynonym#1#2#3% - {\begingroup % anders in mathmode lege \hbox, zie eenheden - \ifsynonymmeaning - \doattributes{\??sm#1\c!synoniem}{\synonymmeaningfalse#3}% - \else - \explicithmode - \doattributes{\??sm#1\c!tekst}{#2}% - \fi - \endgroup} - -\def\getsynonymmeaning#1#2% - {\doifdefinedelse{#2} - {{\synonymmeaningtrue\getvalue{#2}}} - {\showmessage{\m!systems}{18}{#1,#2}}} - -\def\dowritesynonym#1#2#3#4% - {\begingroup % anders in mathmode lege \hbox - \doifelsevalue{\??sm#1\c!expansie}{\v!ja} - {\immediatewriteutility{s e {#1} {#2} {#3} {#4}}} - {\convertargument#3\to\asciia - \convertargument#4\to\asciib - \immediatewriteutility{s e {#1} {#2} {\asciia} {\asciib}}}% - \endgroup} - -\def\preexecutesynonym#1#2#3#4% - {\ifdoinpututilities \else - \dowritesynonym{#1}{#2}{#3}{#4}% - \setgvalue{#2}{\donottest\processsynonym{#1}{#3}{#4}}% - \fi} - -\def\executesynonym#1#2#3#4% - {\preexecutesynonym{#1}{#2}{#3}{#4}% - \processsynonym{#1}{#3}{#4}} - -\def\expandsynonym#1#2#3#4% - {{\synonymmeaningtrue - \processsynonym{#1}{#3}{#4}}} - -\def\dodoloadsynonym#1#2#3#4% - {\setgvalue{#2}{\executesynonym{#1}{#2}{#3}{#4}}} - -\def\doloadsynonym#1% - {\setvalue{#1\s!entry}##1##2##3% - {\doifelsenothing{##1} - {\dodoloadsynonym{#1}{##2}{##2}{##3}} - {\dodoloadsynonym{#1}{##1}{##2}{##3}}% - \global\utilitydonetrue}} - -\def\dolaadsynoniemen#1#2% - {\bgroup - \let\dosetsynonym=\doloadsynonym - \showmessage{\m!systems}{19}{#2}% - \doutilities{#1}{\jobname}{}{}{}% - \egroup - \setvalue{\s!check#1}##1{}} - -\def\dodocomplexsynonym[#1][#2]#3#4% - {\getvalue{\s!check#1}{#2}% - \doifelsevalue{\??sm#1\c!conversie}{\v!ja} - {\setgvalue{#2}{\donottest\expandsynonym{#1}{#2}{#3}{#4}}} - {\doifelsevalue{\??sm#1\c!status}{\v!start} - {\doifelsevalue{\??sm#1\c!criterium}{\v!alles} - {\preexecutesynonym{#1}{#2}{#3}{#4}} - {\setgvalue{#2}{\donottest\executesynonym{#1}{#2}{#3}{#4}}}} - {\setgvalue{#2}{\donottest\processsynonym{#1}{#3}{#4}}}}} - -\def\docomplexsynonym[#1][#2][#3]#4#5% - {\ifthirdargument - \dodocomplexsynonym[#2][#1#3]{#4}{#5}% - \else - \dodocomplexsynonym[#2][#1#4]{#4}{#5}% - \fi} - -\def\dodefinieersynoniemen[#1][#2][#3][#4]% - {\stelsynoniemenin - [#1] - [\c!synoniemletter=, - \c!tekstletter=, - \c!status=\v!start, - \c!plaats=\v!links, - \c!criterium=, - \c!breedte=5em]% - \presetheadtext - [#2=\Woord{#2}]% - \setvalue{\e!stel#2\e!in}% - {\dodoubleargument\getparameters[\??sm#1]}% - \iffourthargument - \def#4##1% - {\donottest\getsynonymmeaning{#1}{\??sm:#1:##1}}% - \ifthirdargument - \def#3##1% - {\donottest\getvalue{\??sm:#1:##1}}% - \fi - \setvalue{#1}% - {\dotripleempty\docomplexsynonym[\??sm:#1:][#1]}% - \else - \ifthirdargument - \def#3##1% - {\donottest\getsynonymmeaning{#1}{##1}}% - \fi - \setvalue{#1}% - {\dotripleempty\docomplexsynonym[][#1]}% - \fi - \setvalue{\s!set#1}% - {\dosetsynonym{#1}}% - \setvalue{\s!reset#1}% - {\doresetsynonym{#1}}% - \setvalue{\s!check#1}##1% - {\checkdefined{synoniemen}{#1}{##1}}% - \addutilityreset{#1}% - \setvalue{\e!laad#2}% - {\dolaadsynoniemen{#1}{#2}}% - \setvalue{\e!plaats\e!lijstmet#2}% - {\doplaatslijstmetsynoniemen{#1}{#2}}% - \setvalue{\e!volledige\e!lijstmet#2}% - {\dovolledigelijstmetsynoniemen{#1}{#2}}} - -\def\definieersynoniemen% - {\doquadrupleempty\dodefinieersynoniemen} - -%I n=Sorteren -%I c=\definieersorteren,\stelsorterenin -%I -%I Sorteren is een vereenvoudigde variant van 'synoniemen': -%I -%I \definieersorteren[naam][namen] -%I -%I Na dit commando zijn de volgende commando's beschikbaar: -%I -%I \naam{tekst} -%I \volledigelijstmetnamen -%I \plaatslijstmetnamen -%P -%I De wijze van zetten kan worden ingesteld met het commando: -%I -%I \stelsorterenin[naam][status=,commando=,voor=,na=, -%I letter=,criterium=,expansie=] -%I -%I Met 'commando' kan met een bewerking uitvoeren op de -%I onderdelen van een lijst. -%I -%I Als de status 'stop' is, dan worden geen sorteringen naar -%I de lijst weggeschreven. Als het criterium 'alles' is, -%I dan worden alle sorteringen in het overzicht opgenomen, -%I zoniet, dan worden alleen gebruikte opgenomen. -%P -%I In principe is een item pas beschikbaar als het is -%I gedefinieerd. Het is echter mogelijk items te laden, -%I mits de tekst tenminste eenmaal is verwerkt. Het is dus -%I mogelijk items op te roepen die pas later worden -%I gedefinieerd. -%I -%I \laadnamen -%I -%I of, zoals bij logo's: -%I -%I \laadlogos -%I -%I Bij een eerste run zijn de commando's nog niet -%I beschikbaar. Een logo kan dus het best worden opgeroepen -%I met: \naam{...}, bijvoorbeeld \naam{PRAGMA} in plaats van -%I \PRAGMA. - -% Formaat tex-utility-input-file <jobname.tui>: -% -% synonym entry {tag} {pure} {text} {} -% -% Deze file wordt met het programma TeXUtil omgezet in een -% in te lezen TeXFile met de commando's: -% -% \synonymentry {tag} {pure} {text} {} - -\def\dostelsorterenin[#1][#2]% - {\getparameters[\??so#1][#2]} - -\def\stelsorterenin% - {\dodoubleargument\dostelsorterenin} - -\def\doresetsorteren#1% - {\letvalue{#1\s!entry}=\gobblethreearguments} - -\def\dosetsorteren#1% - {\setvalue{#1\s!entry}##1##2##3% - {\def\dowritesort####1####2####3{}% - \global\utilitydonetrue - \bgroup - \doifdefinedelse{\??so#1\c!commando} - {\getvalue{\??so#1\c!commando}{##2}} - {\getvalue{\??so#1\c!voor}% - \doattributes{\??so#1}{##2}% - \getvalue{\??so#1\c!na}}% - \egroup}} - -\def\doplaatslijstmetsorteren#1% NOG EEN RUWE VERSIE MAKEN - {\witruimte % ZONDER WITRUIMTE ETC ETC - \begingroup - \stelwitruimtein[\v!geen]% - \doutilities{#1}{\jobname}{#1}{}{\par}% - \endgroup - \ifutilitydone\else\geenwitruimte\fi} - -\def\dovolledigelijstmetsorteren#1#2% - {\plaatsvolledig - {\systemsuppliedchapter}{#1}{\headtext{#2}} - {\doplaatslijstmetsorteren{#1}}} - -\def\processsort#1#2#3% - {\explicithmode - \bgroup - \doattributes{\??so#1}{#2}% - \egroup} - -\def\dowritesort#1#2#3% - {\bgroup - \doifelsevalue{\??so#1\c!expansie}{\v!ja} - {\immediatewriteutility{s e {#1} {#2} {#3} {}}} - {\convertargument#3\to\asciia - \immediatewriteutility{s e {#1} {#2} {\asciia} {}}}% - \egroup} - -\def\synonymentry#1% - {\executeifdefined{#1\s!entry}\gobblethreearguments} - -\def\preexecutesort#1#2#3% - {\ifdoinpututilities \else - \dowritesort{#1}{#2}{#3}% - \setgvalue{#2}{\donottest\processsort{#1}{#3}{#2}}% - \fi} - -\def\executesort#1#2#3% - {\preexecutesort{#1}{#2}{#3}% - \processsort{#1}{#3}{#2}} - -\def\doloadsort#1% - {\setvalue{#1\s!entry}##1##2##3% - {\setgvalue{##1}{##2}% - \global\utilitydonetrue}} - -\def\dolaadsorteren#1#2% - {\bgroup - \let\dosetsorteren=\doloadsort - \showmessage{\m!systems}{20}{#2}% - \doutilities{#1}{\jobname}{}{}{}% - \egroup - \setvalue{\s!check#1}##1{}} - -\def\dodocomplexsort[#1][#2]#3% - {\getvalue{\s!check#1}{#2}% - \doifelsevalue{\??so#1\c!status}{\v!start} - {\doifelsevalue{\??so#1\c!criterium}{\v!alles} - {\preexecutesort{#1}{#2}{#3}} - {\setgvalue{#2}{\donottest\executesort{#1}{#2}{#3}}}} - {\setgvalue{#2}{\donottest\processsort{#1}{#3}{#2}}}} - -\def\docomplexsort[#1][#2][#3]#4% - {\ifthirdargument - \dodocomplexsort[#2][#1#3]{#4} - \else - \dowritesort{#2}{#4}{#4}% - \fi} - -\def\dodefinieersorteren[#1][#2][#3]% - {\getparameters[\??so#1] - [\c!commando=, - \c!status=\v!start, - \c!criterium=, - \c!letter=, - \c!voor=, - \c!na=\endgraf]% - \presetheadtext[#2=\Woord{#2}]% - \setvalue{\e!stel#2\e!in}[##1]% - {\getparameters[\??so#1][##1]}% - \ifthirdargument - \def#3##1% - {\getvalue{\??so:#1:##1}} - \setvalue{#1}% - {\dotripleempty\docomplexsort[\??so:#1:][#1]}% - \else - \setvalue{#1}% - {\dotripleempty\docomplexsort[][#1]}% - \fi - \setvalue{\s!set#1}% - {\dosetsorteren{#1}}% - \setvalue{\s!reset#1}% - {\doresetsorteren{#1}}% - \addutilityreset{#1}% - \setvalue{\e!laad#2}% - {\dolaadsorteren{#1}{#2}}% - \setvalue{\s!check#1}##1% - {\checkdefined{sorteren}{#1}{##1}}% - \setvalue{\e!plaats\e!lijstmet#2}% - {\doplaatslijstmetsorteren{#1}}% - \setvalue{\e!volledige\e!lijstmet#2}% - {\dovolledigelijstmetsorteren{#1}{#2}}} - -\def\definieersorteren% - {\dotripleempty\dodefinieersorteren} - -%I n=Afkortingen -%I c=\afkorting,\volledigelijstmetafkortingen -%I -%I Een afkorting wordt gedefinieerd met: -%I -%I \afkorting{afkorting}{betekenis} -%I -%I en opgeroepen met: -%I -%I \voluit{afkorting} -%I -%I Een lijst met afkortingen wordt gegenereerd met: -%I -%I \plaatslijstmetafkortingen -%I \volledigelijstmetafkortingen - -%T n=afkorting -%T m=afk -%T a=a -%T -%T \afkorting {?} {} - -%I n=Eenheden -%I c=\eenheid,\betekenis,\wiskunde -%I -%I Een afkorting wordt gedefinieerd met: -%I -%I \eenheid [eenheid] {dimensie} {betekenis} -%I -%I en opgeroepen met: -%I -%I \betekenis {eenheid} -%I -%I Een voorbeeld van een definitie is: -%I -%I \eenheid [KUUB] {m^3} {inhoud} -%I -%I Een lijst met eenheden wordt gegenereerd met: -%I -%I \plaatslijstmeteenheden -%I \volledigelijstmeteenheden -%P -%I Aanvullend zijn twee commando's beschikbaar die worden -%I gebruikt bij het zetten van eenheden: -%I -%I \wiskunde{wiskundige commando's} -%I \dimensie{wiskundige eenheid} -%I -%I Het eerste commando maakt $ binnen $ mogelijk, het -%I laatste commando handelt ook de spatiering af. -%I -%I Een teveel aan spatiering kan ongedaan worden voorkomen -%I met: -%I -%I \geendimensie{wiskundige eenheid} - -% documenteren \bmath ..\emath - -\def\bmath% - {\begingroup - \ifmmode - \let\emath=\endgroup - \else - $\def\emath{$\endgroup}% - \fi} - -\def\mathematics#1% % \bmath ...\emath kan ook maar - {\ifmmode#1\else$#1$\fi} % dit alternatief scheelt grouping - -\def\dimensionsignal{0.000058pt} - -\def\dimension#1% - {\def\dodimensionsignal{\kern\dimensionsignal}% - \ifdim\lastskip=\!!zeropoint\relax - \ifdim\lastkern=\!!zeropoint\relax - \ifmmode - \mathematics{\,\,\tf#1}% - \else - \mathematics{\tf#1}% - \fi - \else\ifdim\lastkern=\dimensionsignal - \mathematics{\,\tf#1}% - \else - \unkern\mathematics{\,\,\tf#1}% - \fi\fi - \else - \unskip\mathematics{\,\,\tf#1}% - \fi - \dodimensionsignal} - -\def\nodimension#1% - {\unskip#1\gdef\dodimensionsignal{}} - -%I n=Registers -%I c=\definieerregister,\stelregisterin -%I c=\volledigregister,\plaatsregister -%I -%I Er kunnen registers worden gedefinieerd met het commando: -%I -%I \definieerregister[naam][namen] -%I -%I Vanaf dat moment zijn de volgende commando's beschikbaar: -%I -%I \naam[ascii]{ingang+ingang+ingang} -%I \zienaam[ascii]{ingang+ingang+ingang}{andere ingang} -%I \plaatsnaam -%I \volledigenaam -%I -%I of -%I -%I \plaatsregister[naam] -%I \volledigregister[naam] -%I -%I De commando's rond de standaard index zijn gedefinieerd -%I met de waarden: [index][indices] -%P -%I In de tekst dient een registerverwijzing voor het woord -%I te staan, dus: we verwijzen naar \index{woord}woord. -%I -%I Bij koppen daarentegen plaatsen we \index na de kop: -%I -%I \subparagraaf{dat is dat} -%I \index{ziezo} -%I -%I ........... tekst ..... -%I -%I of -%I -%I \margewoord{ziezo} -%I \index{ziezo} -%I -%I ........... tekst ..... -%I -%I Ongewenste spaties na \index worden verwijderd! Wil men -%I dus een spatie, dan moet dit worden afgedwongen met \ . -%P -%I Mocht het hierboven beschreven mechanisme interfereren -%I met andere mechanismen, dan kan ook het volgende commando -%I worden gebruikt: -%I -%I \schrijfnaarregister[naam][ascii]{ingang+ingang+ingang} -%I -%I waarbij [ascii] optioneel is. -%P -%I De registers kunnen worden ingesteld met het commando: -%I -%I \stelregisterin[naam][letter=,aanduiding=,n=, -%I balanceren=,uitlijnen=,criterium=,afstand=,symbool=, -%I expansie=] -%I -%I waarbij 'aanduiding' betrekking heeft op het al dan niet -%I plaatsen van een letter ('ja' of 'nee') en 'letter' op de -%I weergave van de letter. -%I -%I Met 'criterium' kan een subindex worden opgeroepen, -%I bijvoorbeeld 'deel' of 'hoofdstuk', of als het niveau -%I onbekend is: 'lokaal'. Standaard wordt een volledige index -%I gegenereerd ('alles'). -%I -%I In plaats van een paginanummer kan een symbool worden -%I gezet: n (1,2,3,..), a (a,b,c,..), 1 (bolletjes) en -%I 2 (rechthoekjes). Een symbool heeft alleen zin bij -%I interactieve teksten. -%I -%I Voor eigen gebruik is \ifregistergeplaatst beschikbaar. -%P -%I In plaats van een + als scheider kan ook & worden -%I gebruikt. Bovendien kan als eerste karakter worden opgegeven -%I wat de scheider is: -%I -%I \index[abcformule]{&formule&$ax^2+bx+c$} -%I -%I Overigens gaat de & voor de +, zodat hier de specificatie -%I niet per se nodig is. Let wel: dit is een kenmerk van -%I texutil, en niet zozeer van ConTeXt. - -% Formaat tex-utility-input-file <jobname.tui>: -% -% i e {tag} {loc} {pure} {entry+..} {p:c:p:sp:ssp=>page} {realpage} -% i s {tag} {loc} {pure} {entry+..} {other entry} -% -% In plaats van + kan een & worden gebruikt. Ook kan als -% eerste karakter worden opgegeven wat de scheider is. -% -% Deze file wordt met het programma TeXUtil omgezet in -% een in te lezen TeXFile met de commando's: -% -% \registerentrya {tag} {ingang} -% \registerentryb {tag} {subingang} -% \registerentryc {tag} {subsubingang} -% -% \registerpage {tag} {volgnummer} {paginanummer} {volgnummer} -% -% \registersee {tag} {andere ingang} -% -% \registerentry {tag} {letter} - -\def\dostelregisterin[#1][#2]% - {\getparameters[\??id#1][#2]% - \preparepaginaprefix{\??id#1}} - -\def\stelregisterin% - {\dodoubleargumentwithset\dostelregisterin} - -\def\getlastregisterentry#1% - {\def\docommando##1% - {\def\!!stringa{##1}}% - \processconcanatedlist[#1][+]\docommando - \!!stringa} - -\def\doprocessregister[#1]#2% - {\begingroup - \thisisnextinternal{\s!ind}% - \ifduplicate\getlastregisterentry{#2}\fi - \doifelsevalue{\??id\currentregister\c!expansie}{\v!ja} - {\edef\ascii{#2}} - {\convertargument#2\to\ascii}% - \makesectionformat - \edef\schrijfwegnaarregister% - {\writeutility% - {r e % - {\currentregister} % - {\nextinternalreference} % - {#1} % - {\ascii} % - {\sectionformat::\noexpand\pagenumber} % - {\noexpand\realfolio}}}% - \schrijfwegnaarregister - \getfirstcharacter\currentregister - \registerinfo{> \firstcharacter}{#2}% - \endgroup} - -\def\complexdoregister[#1]#2% - {\doprocessregister[#1]{#2}% - \ifvmode\nobreak\fi - \GotoPar} - -\def\doregister#1% - {\def\currentregister{#1}% - \complexorsimpleempty{doregister}} - -\def\complexdozieregister[#1]#2#3% - {\begingroup - \thisisnextinternal{\s!ind}% - \ifduplicate\getlastregisterentry{#2}\fi - \doifelsevalue{\??id\currentregister\c!expansie}{\v!ja} - {\edef\ascii{#2}} - {\convertargument#2\to\ascii}% - \makesectionformat - \edef\schrijfwegnaarregister% - {\writeutility% - {r s % - {\currentregister} % - {\nextinternalreference} % - {#1} % - {\ascii} % - {#3} % - {\sectionformat}}}% - \schrijfwegnaarregister - \endgroup - \registerinfo{> zie}{#2}% - \GotoPar} - -\def\dozieregister#1% - {\def\currentregister{#1}% - \complexorsimpleempty{dozieregister}} - -\def\doschrijfnaarregister[#1]% % de twee-traps-aanroep is nodig - {\edef\currentregister{#1}% % om gebruik van \ExpandBothAfter - \doprocessregister} % mogelijk te maken - -\def\schrijfnaarregister% - {\dodoubleempty\doschrijfnaarregister} - -\def\ifregistergeplaatst{\ifutilitydone} - -\newif\iffirstregisterpage - -\def\c!entrya{} -\def\c!entryb{} -\def\c!entryc{} - -\def\nextregisterpage% - {\iffirstregisterpage - \doglobal\newcounter\registerpagenumber - \fi - \doglobal\increment\registerpagenumber} - -\def\doregisterpagelocation#1% - {\nextregisterpage - \hbox to 1em{\hss#1\hss}} - -\def\setregisterpage#1% - {\let\registerpageseparator=\relax - \processaction - [\getvalue{\??id#1\c!symbool}] - [ \c!n=>{\def\doregisterpage##1[##2]% - {\doregisterpagelocation{\sl\registerpagenumber}\/}}, - \c!a=>{\def\doregisterpage##1[##2]% - {\doregisterpagelocation{\sl\character{\registerpagenumber}\/}}}, - 1=>{\def\doregisterpage##1[##2]% - {\doregisterpagelocation{$\bullet$}}}, - 2=>{\def\doregisterpage##1[##2]% - {\doregisterpagelocation{\vrule\!!width1em\!!height1ex\!!depth\!!zeropoint}}}, - \s!unknown=>{\def\registerpagesymbol{\getvalue{\??id#1\c!symbool}}% - \def\doregisterpage##1[##2]% - {\doregisterpagelocation{\registerpagesymbol}}}, - \s!default=>{\def\registerpageseparator% - {{\sl,}}% - \def\doregisterpage##1[##2]% - {{\strut\sl\paginaprefix{\??id##1}[##2]\translatednumber[##2]}}}]} - -\def\doresetregister#1% - {\letvalue{#1\s!entrya}=\gobbleoneargument - \letvalue{#1\s!entryb}=\gobbleoneargument - \letvalue{#1\s!entryc}=\gobbleoneargument - \letvalue{#1\s!see}=\gobbletwoarguments - \letvalue{#1\s!page}=\gobblethreearguments - \letvalue{#1\s!entry}=\gobbleoneargument} - -\def\registerentrya#1{\executeifdefined{#1\s!entrya}\gobbleoneargument} -\def\registerentryb#1{\executeifdefined{#1\s!entryb}\gobbleoneargument} -\def\registerentryc#1{\executeifdefined{#1\s!entryc}\gobbleoneargument} -\def\registersee #1{\executeifdefined{#1\s!see}\gobbletwoarguments} -\def\registerpage #1{\executeifdefined{#1\s!page}\gobblethreearguments} -\def\registerentry #1{\executeifdefined{#1\s!entry}\gobbleoneargument} - -\newif\iffirstsubentry -\newif\iffirstsubsubentry - -\newcounter\currententrylevel - -\let\c!entryletter=\empty -\let\c!entrya =\relax -\let\c!entryb =\relax -\let\c!entryc =\relax - -\def\dosetpageregister#1% - {\dosetreglevel{\getvalue{\??id#1\c!criterium}}% - \setregisterpage{#1}% - \setvalue{#1\s!entrya}##1% - {\edef\currententrylevel{1}% - \global\let\c!entryb=\relax - \global\let\c!entryc=\relax - \gdef\c!entrya% - {\global\firstregisterpagetrue - \endgraf - \hangindent1em\noindent - \dohandleregisterentry{##1}% - \global\firstsubentrytrue - \global\firstsubsubentrytrue}}% - \setvalue{#1\s!entryb}##1% - {\edef\currententrylevel{2}% - \global\let\c!entryc=\relax - \global\def\c!entryb% - {\global\firstregisterpagetrue -\global\let\c!entrya=\relax - \endgraf - \iffirstsubentry\nobreak\fi - \hangindent2em\noindent\hskip1em\relax - \dohandleregisterentry{##1}% - \global\firstsubentryfalse - \global\firstsubsubentrytrue}}% - \setvalue{#1\s!entryc}##1% - {\edef\currententrylevel{3}% - \gdef\c!entryc% - {\global\firstregisterpagetrue -\global\let\c!entrya=\relax -\global\let\c!entryb=\relax - \endgraf - \iffirstsubsubentry\nobreak\fi - \hangindent3em\noindent\hskip2em\relax - \dohandleregisterentry{(##1)}% - \global\firstsubsubentryfalse}}% - \setvalue{#1\s!page}##1##2##3% - {\doifreglevelelse[##2] - {\global\utilitydonetrue - \c!entryletter - \def\dohandleregisterentry####1% - {\bgroup - \if!!donea - \setbox0=\hbox{\showlocation{\getvalue{\??id#1\c!tekstcommando}{####1}}}% - \gotonextinternal{\s!ind}{##1}{##3}{\copy0}% - \else - \getvalue{\??id#1\c!tekstcommando}{####1}% - \fi - \egroup - \!!doneafalse}% - \!!doneafalse - \doifelsevalue{\??id#1\c!interactie}{\v!tekst} - {\ifcase\currententrylevel - \or - \!!doneatrue\c!entrya\c!entryb\c!entryc - \or - \c!entrya\!!doneatrue\c!entryb\c!entryc - \or - \c!entrya\c!entryb\!!doneatrue\c!entryc - \fi} - {\c!entrya\c!entryb\c!entryc}% - \global\let\c!entrya=\relax - \global\let\c!entryb=\relax - \global\let\c!entryc=\relax - \global\let\c!entryletter=\relax - \iffirstregisterpage - \expandafter\hskip\getvalue{\??id#1\c!afstand}\relax - \else - \registerpageseparator % || Moet anders - |\spatie|\relax % \relax needed because | looks ahead - \fi - \doifelsevalue{\??id#1\c!interactie}{\v!paginanummer} - {\bgroup - \setbox0=\hbox{\showlocation{\doregisterpage{#1}[##2]}}% - \gotonextinternal{\s!ind}{##1}{##3}{\copy0}% - \egroup} - {\hbox{\doregisterpage{#1}[##2]}}% - \ignorespaces - \global\firstregisterpagefalse} - {}}% - \setvalue{#1\s!see}##1##2% - {\doifreglevelelse[##2::0] - {{\global\utilitydonetrue - \endgraf - \noindent\hskip\getvalue{\??id#1\c!afstand}% - \sl\e!zie: ##1}} - {}}% - \setvalue{#1\s!entry}##1% - {\gdef\c!entryletter% - {\global\let\c!entryletter=\relax - \global\utilitydonetrue - \getvalue{\??id#1\c!voor}% - %\vskip\lineheight\vskip-\lineheight\goodbreak - \vskip\lineheight\goodbreak\vskip-\lineheight - \doifelsevalue{\??id#1\c!aanduiding}{\v!ja} - {\ifhmode\unskip\else\noindent\fi - \getvalue{\??id#1\c!commando}% % needed - {\doattributes{\??id#1} - {\doifvalue{\??id#1\c!refereren}{\v!aan} - {\pagereference[#1:##1]}% - \strut\ignorespaces##1}}% - \getvalue{\??id#1\c!na}% - \par\nobreak} % don't use \string##1, other hack - {\goodbreak % needed ##1 can be \string... - \doifvalue{\??id#1\c!refereren}{\v!aan} - {\pagereference[#1:##1]}}}}} - -\def\getalllistreferences#1#2% - {\convertargument#2\to\currentregisterentry - \doifdefinedelse{\??id#1\??id\currentregisterentry} - {\edef\alllistreferences% - {\getvalue{\??id#1\??id\currentregisterentry}}% - \beforesplitstring\alllistreferences\at::\to\internallistreference - \aftersplitstring\alllistreferences\at::\to\alllistreferences} - {\let\alllistreferences=\empty - \def\internallistreference{0}}} - -\def\dosetlinkregister#1% - {\dosetreglevel{\getvalue{\??id#1\c!criterium}}% - \setregisterpage{#1}% - \setvalue{#1\s!entrya}##1% - {\global\utilitydonetrue - \c!entryletter - \iflocation - \getalllistreferences{#1}{##1}% - \endgraf\hangindent1em\noindent - % - %\thisissomeinternal{\s!lin}{\internallistreference}% - % - \pagereference[\s!lin:\internallistreference]% - % - \getcommacommandsize[\alllistreferences]% - \getfromcommacommand[\alllistreferences][1]% - \ifnum\commalistsize=1 - \let\firstlistreference=\empty - \let\midlistreference=\commalistelement - \let\lastlistreference=\empty - \else - \let\firstlistreference=\commalistelement - \getfromcommacommand[\alllistreferences][\commalistsize]% - \let\lastlistreference=\commalistelement - \ifnum\commalistsize=2 - \let\midlistreference=\empty - \else - \!!counta=\commalistsize - \divide\!!counta by 2 - \getfromcommacommand[\alllistreferences][\!!counta]% - \let\midlistreference=\commalistelement - \fi - \fi - \hskip-.25em\relax - \getvalue{\??id#1\c!tekstcommando}{##1}% - \hskip\getvalue{\??id#1\c!afstand}% - \def\dodocommando[####1-####2]% - {\gotonextinternal{\s!ind}{####1}{####2}{\copy0}}% - \def\docommando####1####2% - {\setbox0=\hbox{\showlocation{\hbox to 1em{\hss####2\hss}}}% - \ifx####1\empty - % \hskip\wd0 % (optioneel maken) - \else - \expandafter\dodocommando\expandafter[####1]% - \fi}% - {\docommando\firstlistreference\gobackwardcharacter}% - {\docommando\midlistreference\gotosomewherecharacter}% - {\docommando\lastlistreference\goforwardcharacter}% - \else - ##1% - \fi}% - \setvalue{#1\s!entry}##1% hetzelfde dus gemeenschappelijk - {\gdef\c!entryletter% - {\global\utilitydonetrue - \global\let\c!entryletter=\relax - \getvalue{\??id#1\c!voor}% - %\vskip\lineheight\vskip-\lineheight\goodbreak - \vskip\lineheight\goodbreak\vskip-\lineheight - \doifelsevalue{\??id#1\c!aanduiding}{\v!ja} - {\ifhmode\unskip\else\noindent\fi - \getvalue{\??id#1\c!commando}% % needed - {\doattributes{\??id#1} - {\doifvalue{\??id#1\c!refereren}{\v!aan} - {\pagereference[#1:##1]}% - \strut##1}}% - \getvalue{\??id#1\c!na}% - \par\nobreak} % don't use \string##1, other hack - {\goodbreak % needed ##1 can be \string... - \doifvalue{\??id#1\c!refereren}{\v!aan} - {\pagereference[#1:##1]}}}}} - -\def\dosetregister#1% - {\doifelsevalue{\??id#1\c!koppeling}{\v!ja} - {\dosetlinkregister{#1}} - {\dosetpageregister{#1}}} - -\newcounter\internallistreference - -\def\doloadregisterlinks#1% - {\dosetreglevel{\getvalue{\??id#1\c!criterium}}% - \setregisterpage{#1}% - \setvalue{#1\s!entrya}##1% - {\global\firstregisterpagetrue - \doglobal\convertargument##1\to\currentregisterentry % \doglobal nodig? - \doglobal\increment\internallistreference}% - \setvalue{#1\s!page}##1##2##3% - {\doifreglevelelse[##2] - {\global\utilitydonetrue - \iffirstregisterpage - \global\firstregisterpagefalse - \setxvalue{\??id#1\??id\currentregisterentry}% - {\internallistreference::##1-##3}% - \else - \setxvalue{\??id#1\??id\currentregisterentry}% - {\getvalue{\??id#1\??id\currentregisterentry},##1-##3}% - \fi} - {}}} - -\def\dokoppelregister[#1][#2]% - {\iflocation - \begingroup - \let\dosetregister=\doloadregisterlinks - \stelregisterin[#1][#2]% - \doutilities{#1}{\jobname}{#1}{}{}% - \endgroup - \fi} - -\def\koppelregister% - {\dodoubleempty\dokoppelregister} - -\def\doprocesslinkedregister[#1][#2]#3% - {\hbox - {\doprocessregister[#2]{#3}% - \let\firstlistreference=\empty - \let\lastlistreference=\empty - \let\selflistreference=\empty - \let\prevlistreference=\empty - \let\nextlistreference=\empty - \getalllistreferences{#1}{#3}% - \doifnot{\alllistreferences}{} - {\def\dodocommando[##1-##2]% - {\ifx\firstlistreference\empty - \def\firstlistreference{##1-##2}% - \fi - \def\lastlistreference{##1-##2}% - \ifnum##1<\nextinternalreference\relax - \def\prevlistreference{##1-##2}% - \else\ifnum##1>\nextinternalreference\relax - \def\nextlistreference{##1-##2}% - \def\dodocommando[####1-####2]% - {\def\lastlistreference{####1-####2}}% - \else - \def\selflistreference{##1-##2}% - \fi\fi}% - \def\docommando##1% - {\dodocommando[##1]}% - \processcommacommand[\alllistreferences]\docommando}% - \ifx\prevlistreference\empty - \let\prevlistreference=\lastlistreference - %\let\gobackwardcharacter=\gotoendcharacter - \fi - \ifx\nextlistreference\empty - \let\nextlistreference=\firstlistreference - %\let\goforwardcharacter=\gotobegincharacter - \fi - \ifx\prevlistreference\selflistreference - \let\prevlistreference=\empty - \let\nextlistreference=\empty - \fi - \def\dodocommando[##1-##2]% - {\gotonextinternal{\s!ind}{##1}{##2}{\copy0}}% - \def\docommando##1##2% - {\setbox0=\hbox to 1em{\hss\showlocation{##2}\hss}% - \ifx##1\empty - \hskip\wd0 % (optioneel maken) - \else - \expandafter\dodocommando\expandafter[##1]% - \fi}% - \bgroup - \docommando\prevlistreference{\gobackwardcharacter}% - \egroup - \bgroup - \doifreferencefoundelse{\s!lin:\internallistreference} - {\gotosomeinternal - {\s!lin}{\internallistreference}{\currentrealreference} - {\showlocation{#3}}} - {\hbox{#3}}% - \egroup - \bgroup - \docommando\nextlistreference{\goforwardcharacter}% - \egroup}} - -\def\dodolinkedregister[#1][#2]#3% - {\bgroup - \def\currentregister{#1}% - \iflocation - \doifelsevalue{\??id#1\c!koppeling}{\v!ja} - {\def\next{\doprocesslinkedregister[#1][#2]{#3}}} - {\def\next{\doprocessregister[#2]{#3}}}% ook hier [#1] - \else - \def\next{\doprocessregister[#2]{#3}}% - \fi - \next - \egroup - \ifvmode\nobreak\fi - \GotoPar} - -\def\dolinkedregister#1% - {\dodoubleempty\dodolinkedregister[#1]} - -\def\complexdoplaatsregister[#1]% - {\begingroup - \stelregisterin[\currentregister][#1]% - \raggedright - \startkolommen - [\c!n=\getvalue{\??id\currentregister\c!n}, - \c!balanceren=\getvalue{\??id\currentregister\c!balanceren}, - \c!uitlijnen=\getvalue{\??id\currentregister\c!uitlijnen}]% - \mindermeldingen - \startopelkaar[\v!blanko]% - \doutilities{\currentregister}{\jobname}{\currentregister}{}{\par}% - \stopopelkaar - \stopkolommen - \endgroup} - -\def\doplaatsregister[#1]% - {\def\currentregister{#1}% - \complexorsimpleempty{doplaatsregister}} - -\def\plaatsregister% - {\dosingleargument\doplaatsregister} - -\def\complexdovolledigregister[#1]% \@EA's kunnen weg - {\@EA\plaatsvolledig\@EA{\@EA\systemsuppliedchapter\@EA}% - \@EA{\@EA\currentregister\@EA}% - \@EA{\@EA\headtext\@EA{\currentregister}}% - {\complexdoplaatsregister[#1]}} - -\def\dovolledigregister[#1]% - {\def\currentregister{#1}% - \complexorsimpleempty{dovolledigregister}} - -\def\volledigregister% - {\dosingleargument\doplaatsregister} - -\def\dodefinieerregister[#1][#2]% - {\stelregisterin[#1]% - [\c!n=2, - \c!balanceren=\v!ja, % \v!nee komt niet zo vaak voor - \c!uitlijnen=\v!nee, - \c!voor=\blanko, % binnen kolommen: \blanko[\v!regel] - \c!na=, - \c!symbool=, - \c!interactie=\v!paginanummer, - \c!afstand=1em, - \c!letter=\v!vet, - \c!aanduiding=\v!ja, - \v!deel\c!nummer=\v!ja, - \v!hoofdstuk\c!nummer=\v!nee, - \c!criterium=\v!alles, - \c!commando=, - \c!refereren=\v!aan]% - \presetheadtext[#1=\Woord{#1}]% - \setvalue{#1}% - {\doregister{#1}}% - \setvalue{\e!gekoppelde#1}% - {\dolinkedregister{#1}}% - \setvalue{\s!set#1}% - {\dosetregister{#1}}% - \setvalue{\s!reset#1}% - {\doresetregister{#1}}% - \addutilityreset{#1}% - \setvalue{\e!zie#1}% - {\dozieregister{#1}}% - \setvalue{\e!plaats#1}% - {\doplaatsregister[#1]}% - \setvalue{\e!volledige#1}% - {\dovolledigregister[#1]}% - \setvalue{\e!stel#1\e!in}[##1]% - {\getparameters[\??id#1][##1]}} - -\def\definieerregister% - {\dodoubleargument\dodefinieerregister} - -\def\registerlengte {\utilityregisterlength} - -\def\utilityregisterlength {0} - -\def\dobepaalregisterkenmerken[#1][#2]% - {\begingroup - \stelregisterin[#1][#2]% - \dosetreglevel{\getvalue{\??id#1\c!criterium}}% - \setvalue{#1\s!page}##1##2##3% - {\doifreglevelelse[##2] - {\doglobal\increment\utilitylistlength - \global\utilitydonetrue} - {}}% - \doglobal\newcounter\utilityregisterlength - \setbox0=\vbox - {\doutilities{#1}{\jobname}{#1}{}{}}% - \endgroup} - -\def\bepaalregisterkenmerken% - {\dodoubleempty\dobepaalregisterkenmerken} - -%I n=Index -%I c=\index,\zieindex,\volledigeindex -%I -%I Een ingang naar de index wordt gecreeerd met: -%I -%I \index[ascii]{ingang+ingang+ingang} -%I -%I Een verwijzing wordt gecreerd met: -%I -%I \zieindex[ascii]{ingang+ingang+ingang}{andere ingang} -%I -%I Een index kan (vooralsnog) alleen een eenvoudig -%I zetcommando afhandelen, bijvoorbeeld: \index{\bf{test}} of -%I \index{\kap{anwb}}. Meer is vaak niet nodig. -%I -%I Als een ingang niet goed gesorteerd wordt, dient [ascii] -%I te worden meegegeven: \index[anwb]{\kap{anwb}}. -%I -%I Een index wordt gegenereerd met: -%I -%I \plaatsindex -%I \volledigeindex - -%T n=index -%T m=ind -%T a=i -%T -%T \index{?} - -%I n=Buffers -%I c=\startbuffer,\haalbuffer,\typebuffer -%I -%I Een stuk tekst kan in een buffer worden opgeslagen en -%I later worden opgeroepen. Dit kan de opbouw van de -%I ruwe ASCII-file ten goede komen. -%I -%I \startbuffer[naam] -%I \stopbuffer -%I -%I Een buffer is eigenlijk een tijdelijke file. Deze file -%I heeft de extensie 'tmp' en overschrijft dus een file met -%I dezelfde naam! -%I -%I Een buffer kan worden opgeroepen met: -%I -%I \haalbuffer[naam] -%I \typebuffer[naam] -%I -%I In alle gevallen is de naam optioneel en mag dus worden -%I weggelaten. -%P -%I Voor en na het wegschrijven kunnen commando's worden -%I uitgevoerd. Deze worden ingesteld met: -%I -%I \stelbufferin[voor=,na=] -%P -%I Omdat het argument optioneel is, wat moet worden getest, -%I worden alle spaties tot het eerste woord onderdrukt. Dit -%I betekent dat als er moet worden getypt (\typebuffer) en -%I terwijl voor het eerste woord spaties moeten staan, er -%I bewust wel (!) een naam moet worden opgegeven. - -% nog \definieerbuffer[naam] -% -% \startnaam == \startbuffer[#1][naam] - -% \EveryPar% -% {\doglobal\newcounter\NOfLines} -% -% \EveryLine% -% {\doglobal\increment\NOfLines% -% \hskip-3em% -% \hbox to 3em{\hss\NOfLines\hskip1em}} - -%\def\dostartbuffer[#1][#2]% -% {\showmessage{\m!systems}{15}{#1}% -% \doifelse{#2}{} -% {\let\stopbuffer=\relax % \undefined -% \convertargument\stopbuffer\to\endofblock} -% {\letvalue{#2}=\relax % \undefined -% \@EA\convertargument\csname#2\endcsname\to\endofblock}% -% \def\closeblock% -% {\immediate\closeout\tmpblocks -% \egroup -% \getvalue{#2}}% -% \doifelsenothing{#1} -% {\immediate\openout\tmpblocks=\jobname.\f!temporaryextension} -% {\immediate\openout\tmpblocks=#1.\f!temporaryextension}% -% \setupcopyblock -% \def\writeoutblocks##1{}% -% \copyblockline} - -\def\processnextbufferline#1#2#3% - {\relax % checken waarom eerdere macro dit nodig heeft / supp-mps run - \convertargument#1 \to\next - \doifinstringelse{\endofblock}{\next} - {\ifnum\nestedbufferlevel=0\relax % \relax ? - \def\next{#2}% - \else - \decrement\nestedbufferlevel\relax - \def\next{#3}% - \fi} - {\doifinstringelse{\beginofblock}{\next} - {\increment\nestedbufferlevel\relax - \def\next{#3}} - {\def\next{#3}}}% - \next} - -\def\dostartbuffer[#1][#2][#3]% - {\showmessage{\m!systems}{15}{#1}% - \doifelse{#3}{} - {\let\stopbuffer=\relax % \undefined - \convertargument startbuffer\to\beginofblock % else a space - \let\processnextblockline=\processnextbufferline - \convertargument\stopbuffer\to\endofblock} - {\letvalue{#3}=\relax % \undefined - \@EA\convertargument\csname#2\endcsname\to\beginofblock - \@EA\convertargument\csname#3\endcsname\to\endofblock}% - \def\closeblock% - {\immediate\closeout\tmpblocks - \egroup - \getvalue{#3}}% - \doifelsenothing{#1} - {\immediate\openout\tmpblocks=\jobname.\f!temporaryextension} - {\immediate\openout\tmpblocks=#1.\f!temporaryextension}% - \newcounter\nestedbufferlevel - \setupcopyblock - \def\writeoutblocks##1{}% - \copyblockline} - -\def\startbuffer% - {\bgroup - \obeylines % nodig, anders gaat 't fout als direct \starttabel (bv) - \dotripleempty\dostartbuffer} - -\def\dobuffer[#1]#2% - {\doifelsenothing{#1} - {#2{\jobname.\f!temporaryextension}{}{}} - {#2{#1.\f!temporaryextension}{}{}}} - -\def\dohaalbuffer[#1]% - {\@@buvoor -\beginrestorecatcodes - \showmessage{\m!systems}{16}{#1}% - \dobuffer[#1]\readjobfile -\endrestorecatcodes - \@@buna} - -\def\haalbuffer% - {\dosingleempty\dohaalbuffer} - -\def\dotypebuffer[#1]% - {\bgroup - % no, just like \starttyping % \setuptyping[\c!voor=\@@buvoor,\c!na=\@@buna]% - \showmessage{\m!systems}{17}{#1}% - \dobuffer[#1]\typefile - \egroup} - -\def\typebuffer% - {\dosingleempty\dotypebuffer} - -\def\stelbufferin% - {\dodoubleargument\getparameters[\??bu]} - -%I n=Tekstblokken -%I c=\definieerblok,\verbergblokken,\handhaafblokken -%I c=\gebruikblokken,\selecteerblokken,\stelblokin -%I -%I Het is mogelijk blokken tekst te verbergen en op andere -%I plaatsen in de tekst op te roepen. Voorbeelden hiervan -%I zijn vragen en antwoorden. De antwoorden kunnen onder de -%I vragen worden ingetypt en bijvoorbeeld in een apart -%I hoofdstuk worden opgenomen. -%I -%I Een tekstblok wordt gedefinieerd met het commando -%I -%I \definieerblok[naam] -%I -%I en wordt vervolgens steeds omringd door de commando's -%I -%I \beginvannaam -%I tekst -%I \eindvannaam -%P -%I Het zetten van blokken kan worden onderdrukt met het -%I commando -%I -%I \verbergblokken[naam,naam,...] -%I -%I wat weer ongedaan gemaakt kan worden met: -%I -%I \handhaafblokken[naam,naam,...] -%I -%I Blokken kunnen worden opgeroepen met de commando's -%I -%I \gebruikblokken[naam,naam,...] -%I \selecteerblokken[naam,naam,...][criterium=] -%I -%I Als criterium kan worden opgegeven: alles of hoofdstuk. In het -%I laatste geval worden alleen de bij het actulele hoofdstuk horende -%I blokken tussengevoegd. -%P -%I Men moet zonodig eerst het (opnieuw) aanmaken van referenties -%I onderdrukken met het commando \stelrefererenin[status=stop]. -%I -%I Genummerde tekstonderdelen (b.v. \doornummeren[vraag]) moeten -%I desgewenst worden gereset (b.v.\resetvraag) -%P -%I De met het volgende commando in te stellen parameters hebben -%I betrekking op het gebruiken van blokken: -%I -%I \stelblokin[naam][voor=,na=,binnen=,letter=] -%I -%I Een blok wordt altijd binnen een groep uitgevoerd ({ }). -%I Zowel 'voor' als 'na' worden buiten deze groep -%I uitgevoerd, en 'binnen' binnen de groep. -%P -%I Soms is het wenselijk tijdens \gebruikblokken sommige blokken -%I wel 'uit te voeren' maar niet (nogmaals) in de tekst op te -%I nemen. Als een blok wordt definieerd met: -%I -%I \beginvannaam[-] -%I tekst -%I \eindvannaam -%I -%I dan wordt het ter plaatse al dan niet gezet en bij het later -%I oproepen wel verwerkt maar niet gezet. -%I -%I Als in de tekst een blok wel moet worden verwerkt, maar niet -%I gezet, dan kan [+] worden opgegeven. -%P -%I Het handhaven, verbergen en gebruiken van blokken kan door -%I de hele tekst plaatsvinden. Binnen ieder hoofdstuk kunnen -%I bijvoorbeeld blokken worden gedefinieerd die aan het eind van -%I het hoofdstuk worden opgeroepen. Dit mechanisme noodzaakt -%I tenminste twee maal verwerken van de file met TeX. -%I -%I Een tweede pass is echter niet nodig als na het gebruik geen -%I nieuwe blokken meer worden gedefinieerd. In dat geval kan -%I vlak voordat de blokken worden opgeroepen, het commando -%I -%I \geenblokkenmeer -%I -%I worden gegeven. Dit scheelt tijd. - -% In eerste instantie is gebruik gemaakt van een utilityfile. Dit -% is echter niet perse noodzakelijk. Wellicht dat als er blokken -% moeten worden gesorteerd, toch weer texutil moet worden -% gebruikt. - -% In de block-move variant hieronder wordt gebruik gemaakt van -% de in de \answer-macro van Knuth gebruikte copieermethode. -% Blokken kunnen worden -% -% \gehandhaafd : in de tekst worden opgenomen ‚n gecopieerd -% \verborgen : alleen worden gecopieerd -% \gebruikt : later in de tekst worden opgenomen -% \geselecteerd : later selectief in de tekst worden opgenomen -% -% Ieder blok wordt gecopieerd naar de file 'jobname.tmp'. -% Daarnaast wordt een blok tijdelijk opgeslagen in de file -% 'texutil.tmp'. Handhaven kom tneer op het opnieuw inlezen van -% deze file. -% -% De file 'jobname.tmp' wordt later gecopieerd naar de file -% 'jobname.tum'. Dit is nodig om in een eerdere run verzamelde -% blokken te kunnen verwerken. - -% Werken met \copie gaat fout. Bovendien zijn de spaties -% belangrijk! -% -% \def\c!copie{copie} % vervalt, verkeerde catcodes - -% The use of \string prevents spaces kreeping in when -% converting the string. Although we can use \meaning in a -% more direct way, we prfer to use \convertargument, because -% this way the macro's are more readible. - -\def\blockversion {1996.03.10} - -\def\@@blockerrormessage% - {\showmessage{\m!textblocks}{1}{}% - \global\let\@@blockerrormessage=\relax} - -\def\thisisblockversion#1% - {\doifnot{\blockversion}{#1}% - {\@@blockerrormessage - \endinput}} - -\def\stopcopyingblocks% - {\ifcopyingblocks - \immediate\closeout\outblocks - \copyblockfile - \global\copyingblocksfalse - \fi} - -\def\dodosetblockcounters[#1:#2]#3% - {\setvalue{\??se\s!old#3}{#1}% - \doifnot{#3}{\lastsection} - {\dodosetblockcounters[#2:0]{\getvalue{\??se#3\c!na}}}} - -\def\dosetblockcounters[#1#2::#3]% - {\ifblockpermitted - \dodosetblockcounters[#3:0]\firstsection - \setsectiontype[#1]% - \def\@@sectionvalue##1{\getvalue{\??se\s!old##1}}% - \def\@@sectionconversion##1##2{##2}% to get rid of {##2} - \fi} - -\def\setblockcounters% - {\@EA\dosetblockcounters\@EA[\blockstatus]} - -\def\getblockstatus#1% - {\dosetblklevel{\getvalue{\??by\@@bscriterium}}% - \doifblklevelelse[#1] - {\global\blockpermittedtrue} - {\global\blockpermittedfalse}% - \def\blockstatus{#1}} - -\newwrite\outblocks -\newread\inpblocks -\newwrite\tmpblocks - -\newif\ifcopyingblocks - -\newbox\blockbox - -\newif\ifvisible -\visibletrue - -\newif\ifblockpermitted - -\newcount\blocklevel -\blocklevel=0 - -\newif\ifoldinbijlagen - -\def\opentmpblock% - {\immediate\openout\tmpblocks=\f!utilityfilename.\f!temporaryextension} - -\def\closetmpblock% - {\immediate\write\tmpblocks{}% een lege regel is handig voor \par commando's - \immediate\closeout\tmpblocks} - -\newif\iftmpblockstarted - -\def\writetmpblock#1% - {\iftmpblockstarted - \immediate\write\tmpblocks{#1}% - \else - \doifsomething{#1} - {\tmpblockstartedtrue - \immediate\write\tmpblocks{\string#1}}% - \fi} - -\def\startcopyingblocks% - {\global\copyingblocksfalse} - -\def\checkcopyingblocks% - {\ifcopyingblocks - \else - \immediate\openout\outblocks\f!utilityfilename.\f!blockextension - \immediate\write\outblocks{\string\thisisblockversion{\blockversion}}% - \global\copyingblockstrue - \fi} - -\def\stopcopyingblocks% - {\ifcopyingblocks - \immediate\closeout\outblocks - \copyblockfile - \global\copyingblocksfalse - \fi} - -\def\geenblokkenmeer% - {\stopcopyingblocks} - -\def\copyblockfile - {\ifcopyingblocks - \begingroup - \showmessage{\m!textblocks}{2}{\jobname.\f!blockextension}% - \openlocin{\inpblocks}{\f!utilityfilename.\f!blockextension}% - \immediate\openout\outblocks\jobname.\f!blockextension - \setupcopyblock - \catcode`\^^M=\@@ignore\relax - \def\copynextline - {\read\inpblocks to \!!stringa - \immediate\write\outblocks{\!!stringa}% - \ifeof\inpblocks - \def\copynextline{}% - \fi - \copynextline}% - \copynextline - \immediate\closein\inpblocks - \immediate\closeout\outblocks - \immediate\openout\tmpblocks\f!utilityfilename.\f!blockextension - \immediate\closeout\tmpblocks - \endgroup - \fi} - -\def\loadallblocks#1% - {\beginrestorecatcodes -\catcode`\^^M=\@@endofline\relax - \readjobfile{#1.\f!blockextension} - {\showmessage{\m!textblocks}{3}{#1.\f!blockextension}} - {\showmessage{\m!textblocks}{4}{}}% - \endrestorecatcodes} - -\def\setupcopyblock% - {\!!counta=1\relax - \loop - \catcode\!!counta=\@@other - \advance\!!counta by 1\relax - \ifnum\!!counta<255\relax - \repeat - \obeylines} - -\def\writeoutblocks% - {\immediate\write\outblocks} - -\def\processnextblocklineAB#1#2#3% - {\convertargument#1 \to\next - \doifinstringelse{\endofblockA}{\next} - {\def\next{#2}} - {\doifinstringelse{\endofblockB}{\next} - {\def\next{#2}} - {\def\next{#3}}}% - \next} - -\bgroup -\obeylines -\gdef\copyblocklineAB#1 - {\processnextblocklineAB{#1}% - {\closeblock}% - {\writeoutblocks{#1}% - \writetmpblock{#1}% - \copyblocklineAB}} -\gdef\skipblocklineAB#1 - {\processnextblocklineAB{#1}% - {\closeblock}% - {\skipblocklineAB}} -\egroup - -\def\processnextblockline#1#2#3% - {\convertargument#1 \to\next - \doifinstringelse{\endofblock}{\next} - {\def\next{#2}} - {\def\next{#3}}% - \next} - -\bgroup -\obeylines -\gdef\copyblockline#1 - {\processnextblockline{#1}% - {\closeblock}% - {\writeoutblocks{#1}% - \writetmpblock{#1}% - \copyblockline}} -\gdef\skipblockline#1 - {\processnextblockline{#1}% - {\closeblock}% - {\skipblockline}} -\egroup - -\def\skipblock#1% - {\checkcopyingblocks - \@EA\convertargument\string\thiswasblock{#1}\to\endofblock -%testen : \expanded{\convertargument\string\thiswasblock{#1}\noexpand\to\noexpand\endofblock}% - \let\openblock=\begingroup - \let\closeblock=\endgroup - \openblock - \setupcopyblock - \skipblockline} - -\def\doafterblock#1#2{} -\def\dobeforeblock#1#2{} - -\def\thisisblock#1% - {\executeifdefined{\s!thisisblock#1}{\skipblock{#1}}} - -\def\thiswasblock#1% - {\getvalue{\s!thiswasblock#1}} - -\def\saveblock#1#2% - {\checkcopyingblocks - \obeylines - %\@EA\convertargument\string\eindvan#1\to\endofblockA - \@EA\@EA\@EA\convertargument\@EA\string\csname\e!eindvan#1\endcsname\to\endofblockA -%testen: \expanded{\convertargument\string\csname\e!eindvan#1\endcsname\to\endofblockA}% - \@EA\convertargument\string\eindvanblok[#1]\to\endofblockB % MULTI LINGUAL MAKEN - \def\openblock% - {\dobeforeblock{#1}{#2}% - \opentmpblock - \begingroup - \makesectionformat - \immediate\write\outblocks{}% - \immediate\write\outblocks{\string\thisisblock{#1}{\sectionformat}[#2]}}% - \def\closeblock% - {\immediate\write\outblocks{}% handig voor \par commando's - \immediate\write\outblocks{\string\thiswasblock{#1}}% - \endgroup - \closetmpblock - \doafterblock{#1}{#2}% - \egroup}% - \openblock - \setupcopyblock - \copyblocklineAB} - -\def\copyblock% - {\def\opentmpblock{}% - \def\closetmpblock{}% - \def\writetmpblock##1{}% - \saveblock} - -\def\loadoneblock% - {\readjobfile{\f!utilityfilename.\f!temporaryextension}{}{}} - -\def\dodefinieerblok[#1]% - {\passeerblok[#1]% - \handhaafblokken[#1]% - \stelblokin - [#1] - [\c!voor=\blanko, - \c!na=\blanko, - \c!binnen=, - \c!letter=, - \c!file=\jobname]} - -\def\definieerblok% - {\dosingleargument\dodefinieerblok} - -\def\dostelblokin[#1][#2]% - {\getparameters[\??tb#1][#2]} - -\def\stelblokin% - {\dodoubleargument\dostelblokin} - -\def\passeerblok[#1]% - {\setvalue{\s!thisisblock#1}##1[##2]% - {\skipblock{#1}}} - -\def\doverbergblok[#1][#2][#3]% - {\doifelsenothing{#2} - {\global\blockpermittedfalse - \edef\bloktitel{#1}} - {\doifelsenothing{#3} - {\global\blockpermittedtrue - \edef\bloktitel{#1}} - {\doifcommonelse{#2}{#3} - {\global\blockpermittedfalse - \edef\bloktitel{#1:#2}} - {\global\blockpermittedtrue - \edef\bloktitel{#1:#3}}}}% - \ifblockpermitted - \showwarning{\m!textblocks}{5}{\bloktitel}% - \def\next% - {\def\dobeforeblock####1####2% - {\begingroup}% - \def\doafterblock####1####2% - {\endgroup - \doexecuteloadedblock{#1}}% - \saveblock{#1}{#3}}% - \else - \doifinsetelse{+}{#3} - {\showwarning{\m!textblocks}{6}{\bloktitel}% - \def\next% - {\def\dobeforeblock####1####2% - {\begingroup - \global\visiblefalse}% - \def\doafterblock####1####2% - {{\setbox0=\vbox - {\catcode`\^^M=\@@endofline\relax - \loadoneblock - \par}}% - \endgroup}% - \saveblock{#1}{#3}}}% - {\showwarning{\m!textblocks}{7}{\bloktitel}% - \def\next% - {\def\dobeforeblock####1####2% - {\begingroup - \globaldefs=-1\relax}% - \def\doafterblock####1####2% - {\endgroup}% - \copyblock{#1}{#3}}}% - \fi - \next} - -\def\doverbergblokken[#1][#2]% - {\def\docommando##1% - {\setvalue{\e!beginvan##1}% - {\bgroup\obeylines\dotripleempty\doverbergblok[##1][#2]}}% - \processcommalist[#1]\docommando} - -\def\verbergblokken% - {\dodoubleempty\doverbergblokken} - -\def\doexecuteloadedblock#1% - {\blockpermittedtrue % ? - \getvalue{\??tb#1\c!voor}% - \bgroup - \doattributes{\??tb#1}{}% - \visibletrue - \catcode`\^^M=\@@endofline\relax - \getvalue{\??tb#1\c!binnen}% - \loadoneblock - \par - \egroup - \getvalue{\??tb#1\c!na}} - -\def\dohandhaafblok[#1][#2][#3]% - {\doifelsenothing{#2} - {\global\blockpermittedtrue - \edef\bloktitel{#1}} - {\doifcommonelse{#2}{#3} - {\global\blockpermittedtrue - \edef\bloktitel{#1:#2}} - {\doifinsetelse{\v!alles}{#2} - {\doifelse{#3}{} - {\global\blockpermittedtrue - \edef\bloktitel{#1}} - {\global\blockpermittedfalse - \edef\bloktitel{#1:#3}}} - {\global\blockpermittedfalse - \doifelse{#3}{} - {\edef\bloktitel{#1}} - {\edef\bloktitel{#1:#3}}}}}% - \ifblockpermitted - \showwarning{\m!textblocks}{8}{\bloktitel}% - \def\dobeforeblock##1##2% - {\begingroup}% - \def\doafterblock##1##2% - {\endgroup - \doexecuteloadedblock{#1}}% - \else - \showwarning{\m!textblocks}{9}{\bloktitel}% - \fi - \saveblock{#1}{#3}} - -\def\dohandhaafblokken[#1][#2]% - {\def\docommando##1% - {\setvalue{\e!beginvan##1}% - {\bgroup\obeylines\dotripleempty\dohandhaafblok[##1][#2]}}% - \processcommalist[#1]\docommando} - -\def\handhaafblokken% - {\dodoubleempty\dohandhaafblokken} - -\def\dodogebruikblok#1#2#3#4% - {\getblockstatus{#2}% - \ifblockpermitted% - \doifelsenothing{#4} - {\edef\bloktitel{#1}} - {\doifnotcommon{#3}{#4} - {\global\blockpermittedfalse}% - \edef\bloktitel{#1:#3}}% - \else - \edef\bloktitel{#1}% - \fi - \ifblockpermitted - \def\next% - {\global\advance\blocklevel by 1\relax - \doifinsetelse{-}{#3} - {\showwarning{\m!textblocks}{10}{\bloktitel}% - \setvalue{\s!thiswasblock#1}% - {\par\egroup}% - \setbox0=\vbox\bgroup} - {\showwarning{\m!textblocks}{11}{\bloktitel}% - \setvalue{\s!thiswasblock#1}% - {\par - \egroup - \getvalue{\??tb#1\c!na}% - \global\advance\blocklevel by -1\relax}% - \getvalue{\??tb#1\c!voor}% - \bgroup - \doattributes{\??tb#1}{}% - \visibletrue - \getvalue{\??tb#1\c!binnen}}}% - \else - \def\next% - {\showwarning{\m!textblocks}{12}{\bloktitel}% - \skipblock{#1}}% - \fi - \next} - -\def\dogebruikblok[#1][#2]% - {\setvalue{\s!thisisblock#1}##1[##2]% - {\dodogebruikblok{#1}{##1}{##2}{#2}}} - -\def\dogebruikblokken[#1][#2]% - {\def\docommando##1% - {\dogebruikblok[##1][#2]}% - \processcommalist[#1]\docommando - \getfromcommalist[#1][1]% - \doifdefined{\??tb\commalistelement\c!file} - {\loadallblocks{\getvalue{\??tb\commalistelement\c!file}}}% - \endgroup} - -\def\gebruikblokken% - {\begingroup - \doassign[\??bs][\c!criterium=\v!alles]% - \dodoubleempty\dogebruikblokken} - -\def\doselecteerblokken[#1][#2][#3]% - {\doifelsenothing{#3} - {\getparameters[\??bs][#2]% - \dogebruikblokken[#1][]} - {\getparameters[\??bs][#3]% - \dogebruikblokken[#1][#2]}}% - -\def\selecteerblokken% - {\begingroup - \doassign[\??bs][\c!criterium=\v!alles]% - \dotripleempty\doselecteerblokken} - -\def\beginvanblok[#1]% % er wordt ook gechecked op \eindvanblok[..] - {\getvalue{\e!beginvan#1}} - -%I n=Achtergronden -%I c=\stelachtergrondenin -%I -%I Achter de tekst kan een achtergrond worden geplaatst. -%I Voor de afzonderlijke elementen van een tekst wordt een -%I achtergrond gedefinieerd met het commando: -%I -%I \stelachtergrondenin -%I [boven,hoofd,tekst,voet,onder] -%I [linkerrand,rechterrand,linkermarge,reachtermarge,tekst] -%I [achtergrond=,kleur=,raster=] -%I -%I Voor de hele bladzijde gebruiken we: -%I -%I \stelachtergrondenin -%I [pagina] -%I [achtergrond=,kleur=,raster=] -%P -%I Het is mogelijk elk blok iets ruimer om de tekst te -%I plaatsen met: -%I -%I \stelachtergrondenin -%I [pagina] -%I [offset=,diepte=] -%I -%I Een offset van .25\korpsgrootte en een diepte van -%I .5\korpsgrootte voldoen aardig. -%I -%I Er kunnen ronde hoeken worden gezet met: -%I -%I \stelachtergrondenin -%I [pagina] -%I [hoek=,straal=] -%I -%I Hierbij kan voor hoek de instelling rond of recht worden -%I meegegeven en voor straal een dimensie. - -% Don't use \@@mawhatevercommand directly, use \getvalue instead. - -\newif\ifnewbackground -\newif\ifsomebackground - -\newbox\leftbackground -\newbox\rightbackground - -\def\doaddpagebackground#1#2% - {\doifvaluesomething{\??ma#1\c!achtergrond} - {\setbox2=\vbox - {\offinterlineskip - \localframed - [\??ma#1] - [\c!breedte=\papierbreedte,\c!hoogte=\papierhoogte]%, \c!offset=\v!overlay] - {\getvalue{\??ma#1\c!commando}}}% - \wd2=\!!zeropoint - \dp2=\!!zeropoint - \setbox#2=\vbox - {\hbox{\box2\box#2}}}} - -\def\addpagebackground#1% - {\doifbothsidesoverruled - \doaddpagebackground{\v!rechterpagina}{#1}% - \orsideone - \doaddpagebackground{\v!rechterpagina}{#1}% - \orsidetwo - \doaddpagebackground{\v!linkerpagina}{#1}% - \od - \doaddpagebackground{\v!pagina}{#1}} - -\let\pagebackgroundhoffset = \!!zeropoint -\let\pagebackgroundvoffset = \!!zeropoint -\let\pagebackgrounddepth = \!!zeropoint - -% #1 = breedte -% #2 = hoogte -% #3 = pos -% #4 = pos - -% \def\dododopagebodybackground#1#2#3#4% -% {\doifelsevaluenothing{\??ma#3#4\c!achtergrond} -% {\doifelsevalue{\??ma#3#4\c!kader}{\v!aan} % niet waterdicht, ook deelkaders -% {\!!doneatrue} -% {\!!doneafalse}} -% {\!!doneatrue}% -% \if!!donea -% \localframed -% [\??ma#3#4] -% [\c!breedte=#1,\c!hoogte=#2,\c!offset=\v!overlay] -% {\getvalue{\??ma#3#4\c!commando}}% -% \else -% \hskip#1% -% \fi} - -\def\dododopagebodybackground#1#2#3#4% - {\edef\!!stringe{\??ma#3#4}% - \doifelsevaluenothing{\!!stringe\c!achtergrond } - {\doifelsevalue{\!!stringe\c!kader }\v!aan\!!doneatrue - {\doifelsevalue{\!!stringe\c!linker\c!kader }\v!aan\!!doneatrue - {\doifelsevalue{\!!stringe\c!rechter\c!kader}\v!aan\!!doneatrue - {\doifelsevalue{\!!stringe\c!boven\c!kader }\v!aan\!!doneatrue - {\doifelsevalue{\!!stringe\c!onder\c!kader }\v!aan\!!doneatrue - \!!doneafalse}}}}} - \!!doneatrue - \if!!donea - \localframed - [\??ma#3#4] - [\c!breedte=#1,\c!hoogte=#2,\c!offset=\v!overlay] - {\getvalue{\??ma#3#4\c!commando}}% - \else - \hskip#1% - \fi} - -\def\dodopagebodybackground#1#2% - {\setbox0=\vbox to #2 - \bgroup\hbox\bgroup - \swapmargins - \goleftonpage - \dododopagebodybackground\linkerrandbreedte#2#1\v!linkerrand - \hskip\linkerrandafstand - \hskip\pageseparation - \dododopagebodybackground\linkermargebreedte#2#1\v!linkermarge - \hskip\linkermargeafstand - \dododopagebodybackground\zetbreedte#2#1\v!tekst - \hskip\rechtermargeafstand - \dododopagebodybackground\rechtermargebreedte#2#1\v!rechtermarge - \hskip\pageseparation - \hskip\rechterrandafstand - \dododopagebodybackground\rechterrandbreedte#2#1\v!rechterrand - \egroup\egroup - \wd0=\!!zeropoint\relax - \box0\relax} - -\def\setbackgroundbox#1#2% - {\global\setbox#1=\vbox - {\offinterlineskip - \mindermeldingen - \calculatereducedvsizes - #2\relax - \vskip-\bovenhoogte - \vskip-\bovenafstand - \dodopagebodybackground\v!boven\bovenhoogte - \vskip\bovenafstand - \dodopagebodybackground\v!hoofd\hoofdhoogte - \vskip\hoofdafstand - \dodopagebodybackground\v!tekst\teksthoogte - \vskip\voetafstand - \dodopagebodybackground\v!voet\voethoogte - \vskip\onderafstand - \dodopagebodybackground\v!onder\onderhoogte - \vfilll}% - \smashbox#1} - -\def\setbackgroundboxes% - {\ifsomebackground\ifnewbackground - \showmessage{\m!layouts}{8}{}% - \docheckbackgrounddefinitions - \setbackgroundbox\leftbackground\relax - \ifdubbelzijdig - \setbackgroundbox\rightbackground\doswapmargins - \fi - \global\newbackgroundfalse - \doifelsevaluenothing{\??ma\v!tekst\v!tekst\c!achtergrond} - {\global\let\pagebackgroundhoffset=\!!zeropoint - \global\let\pagebackgroundvoffset=\!!zeropoint - \global\let\pagebackgrounddepth=\!!zeropoint} - {\bgroup - \dimen0=\getvalue{\??ma\v!pagina\c!offset}% - \doifnothing - {\getvalue{\??ma\v!boven\v!tekst\c!achtergrond}% - \getvalue{\??ma\v!onder\v!tekst\c!achtergrond}} - {\xdef\pagebackgroundhoffset{\the\dimen0}}% - \doifnothing - {\getvalue{\??ma\v!tekst\v!rechterrand\c!achtergrond}% - \getvalue{\??ma\v!tekst\v!linkerrand\c!achtergrond}} - {\xdef\pagebackgroundvoffset{\the\dimen0}% - \dimen0=\getvalue{\??ma\v!pagina\c!diepte}% - \xdef\pagebackgrounddepth{\the\dimen0}}% - \egroup}% - \fi\fi} - -\def\getbackgroundbox% - {\ifsomebackground - \setbackgroundboxes - \startinteractie - \doifmarginswapelse - {\copy\leftbackground} - {\copy\rightbackground}% - \stopinteractie - \fi} - -% saves us hundreds of unused hash entries if not needed - -\def\docheckbackgrounddefinitions% allocates about 1000 hash-entries - {\doifdefined{\??ma\v!pagina\c!achtergrond}% skip first pass - {\def\dodocommando##1##2% - {\copylocalframed[\??ma##1##2][\??ma\v!pagina]% - \getparameters[\??ma##1##2] - [\c!achtergrond=,\c!kader=,\c!kleur=,\c!raster=]% - \copyparameters - [\??ma##1##2\c!kader][\??ma##1##2] - [\c!kleur,\c!raster]% - \copyparameters - [\??ma##1##2\c!achtergrond][\??ma##1##2] - [\c!kleur,\c!raster]}% - \def\docommando##1% - {\dodocommando##1\v!linkerrand \dodocommando##1\v!linkermarge - \dodocommando##1\v!tekst - \dodocommando##1\v!rechtermarge \dodocommando##1\v!rechterrand}% - \docommando\v!boven \docommando\v!hoofd - \docommando\v!tekst - \docommando\v!voet \docommando\v!onder - \def\docheckbackgrounddefinitions% - {\global\somebackgroundtrue}}} - -\def\dostelachtergrondenin[#1][#2][#3]% - {\docheckbackgrounddefinitions - \global\newbackgroundtrue - \iffirstargument % \dostelachtergrondenin zonder arg mag - \ifthirdargument - \def\docommando##1% - {\doifinsetelse{##1}{\v!pagina,\v!linkerpagina,\v!rechterpagina} - {\getparameters[\??ma##1][#3]% - \dosetpageseparation} - {\def\dodocommando####1% - {\getparameters[\??ma##1####1][#3]} - \processcommalist[#2]\dodocommando}}% - \processcommalist[#1]\docommando - \else - \doifcommonelse{#1}{\v!pagina,\v!linkerpagina,\v!rechterpagina} - {\def\docommando##1% - {\getparameters[\??ma##1][#2]}% - \processcommalist[#1]\docommando - \dosetpageseparation} - {\dostelachtergrondenin - [#1] - [\v!linkerrand,\v!linkermarge,\v!tekst,\v!rechtermarge,\v!rechterrand] - [#2]}% - \fi - \fi} - -\def\stelachtergrondenin% - {\dotripleempty\dostelachtergrondenin} - -% a lot of setups, including short ones - -\presetlocalframed [\??ma\v!pagina] -\presetlocalframed [\??ma\v!linkerpagina] -\presetlocalframed [\??ma\v!rechterpagina] - -\copyparameters - [\??ma\v!pagina\c!kader][\??ma\v!pagina] - [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster] - -\copyparameters - [\??ma\v!pagina\c!achtergrond][\??ma\v!pagina] - [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster] - -\copyparameters - [\??ma\v!linkerpagina\c!kader][\??ma\v!linkerpagina] - [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster] - -\copyparameters - [\??ma\v!linkerpagina\c!achtergrond][\??ma\v!linkerpagina] - [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster] - -\copyparameters - [\??ma\v!rechterpagina\c!kader][\??ma\v!rechterpagina] - [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster] - -\copyparameters - [\??ma\v!rechterpagina\c!achtergrond][\??ma\v!rechterpagina] - [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster] - -\def\@@pageseparation {6pt} -\def\pageseparation {0pt} - -\def\paginascheiding {\pageseparation} - -\def\dosetpageseparation% - {\let\pageseparation=\!!zeropoint - \let\showpageseparation=\relax - \processaction - [\getvalue{\??ma\v!pagina\c!scheider}] - [ \v!ruim=>\let\pageseparation=\@@pageseparation - \let\showpageseparation=\showloosepageseparation, - \v!passend=>\let\pageseparation=\@@pageseparation - \let\showpageseparation=\showtightpageseparation]} - -\def\showloosepageseparation% - {\ifdim\pageseparation>\!!zeropoint\relax - \bgroup - \setbox0=\hbox - {\vrule - \!!width\pageseparation - \!!depth\papierhoogte - \!!height\papierhoogte}% - \ht0=\!!zeropoint - \dp0=\!!zeropoint - \box0 - \egroup - \fi} - -\def\showtightpageseparation% - {\ifdim\pageseparation>\!!zeropoint\relax - \bgroup - \dimen0=\teksthoogte - \advance\dimen0 by \kopwit - \doifsometextlineelse{\v!hoofd} - {\advance\dimen0 by \hoofdhoogte - \advance\dimen0 by \hoofdafstand} - {}% - \dimen2=\papierhoogte - \advance\dimen2 by -\dimen0 -%\advance\dimen0 by -1cm % nog eens optie -%\advance\dimen2 by -1cm % nog eens optie - \setbox0=\hbox - {\vrule - \!!width\pageseparation - \!!depth\dimen2 - \!!height\dimen0}% - \ht0=\!!zeropoint - \dp0=\!!zeropoint - \box0 - \egroup - \fi} - -%I n=File-management -%I c=\starttekst,\startprojekt,\startonderdeel,\startprodukt -%I c=\startomgeving,\startdeelomgeving -%I -%I Een eenvoudige tekst wordt gestart en gestopt met de -%I commando's: -%I -%I \starttekst -%I \stoptekst -%P -%I Het is mogelijk een projektstructuur op te zetten. Per -%I projekt wordt een file aangemaakt waarin de volgende -%I commando's voorkomen: -%I -%I \startprojekt naam -%I \stopprojekt -%I -%I Als deze file in TeX wordt geladen, dan worden alle -%I produkten achter elkaar gezet. -%I -%I Een produkt wordt gedefinieerd met: -%I -%I \startprodukt naam -%I \stopprodukt -%I -%I Deze file kan zelfstandig door TeX worden gehaald. -%P -%I Een omgeving wordt gedefinieerd door: -%I -%I \startomgeving naam -%I \stopomgeving -%I -%I Een onderdeel wordt gedefinieerd door: -%I -%I \startonderdeel naam -%I \stoponderdeel -%I -%I Files worden eerst gezocht op het actuele gebied. Als een -%I file niet aanwezig is wordt op de 'roots' gezocht. -%I -%I Een onderdeel kan zelfstandig door TeX worden gehaald. -%P -%I Binnen een projekt, produkt, omgeving of onderdeel komen -%I de volgende instellingen voor (tussen haakjes=facultatief): -%I -%I projekt omgeving produkt onderdeel -%I -%I \projekt naam * * -%I \omgeving naam (*) (*) (*) (*) -%I \produkt naam * -%I \onderdeel naam (*) (*) -%I -%I Binnen een omgeving kunnen deelomgevingen worden gedefinieerd -%I die alleen voor bepaalde produkten, onderdelen enz. gelden. -%I -%I \startdeelomgeving[naam,...,naam] -%I commando's -%I \stopdeelomgeving -%P -%I Het programma TeXEdit doorzoekt bij het aanmaken van een -%I file-menu de hele tekst op de genoemde commando's. Bij een -%I lange tekst kan dit misschien 'te' lang duren. Met het -%I commando: -%I -%I \geenfilesmeer -%I -%I kan worden aangegeven dat er geen structuurcommando's meer -%I volgen. -%I -%I Ten behoeve van TeXUtil moet in plaats van het commando -%I \input het commando \verwerkfile{naam} worden gebruikt. -%P -%I Als men standaard een en ander wil instellen, dan kan men -%I dit doen in de file 'cont-sys.tex'. Deze file wordt direkt -%I na het opstarten geladen cq. uitgevoerd. Daarnaast wordt, -%I indien aanwezig, de file 'cont-new.tex' geladen. - -%T n=starttekst -%T m=sta -%T a=x -%T -%T \starttekst -%T -%T ? -%T -%T \stoptekst - -\def\currentproject {} -\def\currentproduct {} -\def\currentenvironment {} -\def\currentcomponent {} - -\def\loadedfiles {} -\def\processedfiles {} - -\let\geenfilesmeer=\relax - -\newcounter\textlevel -\newcounter\fileprocesslevel - -\setvalue{\c!file::0}{\jobname} - -\def\processedfile% - {\getvalue{\c!file::\fileprocesslevel}} - -\def\processfile#1% - {\doglobal\increment\fileprocesslevel - \setxvalue{\c!file::\fileprocesslevel}{#1}% - \@EA\doglobal\@EA\addtocommalist\@EA{#1}\processedfiles - \readlocfile{#1}{}{} - \doglobal\decrement\fileprocesslevel} - -\def\registreerfileinfo#1#2% - {\immediatewriteutility{f #1 {#2}}} - -\doifundefined{preloadfonts} {\let\preloadfonts=\relax} -\doifundefined{preloadspecials} {\let\preloadspecials=\relax} - -\def\loadsystemfiles% - {\readsysfile{\f!newfilename} - {\showmessage{\m!systems}{2}{\f!newfilename}}{}% - \readsysfile{\f!oldfilename} - {\showmessage{\m!systems}{2}{\f!oldfilename}}{}% - \readsysfile{\f!filfilename} - {\showmessage{\m!systems}{2}{\f!filfilename}}{}% - \readsysfile{\f!sysfilename} - {\showmessage{\m!systems}{2}{\f!sysfilename}}{}} - -\def\loadoptionfile% - {\readsysfile{\f!optfilename} - {\showmessage{\m!systems}{2}{\f!optfilename}}{}} - -% \newevery \everyjob \EveryJob -% \appendtoks ... \to \everyjob - -\appendtoks \meldaanmaakdatum \to \everyjob -\appendtoks \loadsystemfiles \to \everyjob -\appendtoks \preloadfonts \to \everyjob -\appendtoks \settopskip \to \everyjob -\appendtoks \preloadspecials \to \everyjob -\appendtoks \openspecialfile \to \everyjob -\appendtoks \checkutilityfile \to \everyjob -\appendtoks \openutilities \to \everyjob -\appendtoks \loadoptionfile \to \everyjob -\appendtoks \loadtwopassdata \to \everyjob -\appendtoks \setupfootnotes \to \everyjob % eigenlijk ergens anders - % hangt af van korps -\let\normalend=\end -\newevery \everybye \EveryBye - -\def\end% - {\the\everybye - \normalend} - -\appendtoks \pagina[\v!laatste] \pagina - \ifarrangingpages\poparrangedpages\fi \to \everybye - -\appendtoks \registreerfileinfo{e}{\jobname} \to \everybye -\appendtoks \stopcopyingblocks \to \everybye -\appendtoks \closeutilities \to \everybye -\appendtoks \closespecialfile \to \everybye - -\def\starttekst% - {\ifnum\textlevel=0\relax - \registreerfileinfo{b}{\jobname}% - \startcopyingblocks - \fi - \doglobal\increment\textlevel\relax} - -\def\stoptekst% - {\doglobal\decrement\textlevel\relax - \ifnum\textlevel>0\relax - \let\next=\relax - \else - \let\next=\end - \fi - \next} - -\def\doexecutefileonce#1% - {\beforesplitstring#1\at.\to\currentfile - \ExpandBothAfter\doifnotinset{\currentfile}{\loadedfiles}% - {\ExpandFirstAfter\addtocommalist{\currentfile}\loadedfiles - \doexecutefile{#1}}} - -\def\doexecutefile#1% - {\registreerfileinfo{b}{#1} - \processfile{#1}% - \registreerfileinfo{e}{#1}} - -\def\donotexecutefile#1% - {} - -\def\verwerkfile#1 % - {\doexecutefile{#1}} - -\def\omgeving #1 % at outermost level only - {\def\startomgeving ##1 {}% - \let\stopomgeving=\relax - \startreadingfile - \readlocfile{#1}{}{}% - \stopreadingfile} - -\newcounter\filelevel - -\def\!!donextlevel#1#2#3#4#5#6\\% - {\beforesplitstring#6\at.\to#1 - \ifnum\filelevel=0\relax - \starttekst - \def\projekt ##1 {#2{##1}}% - \def\omgeving ##1 {#3{##1}}% - \def\produkt ##1 {#4{##1}}% - \def\onderdeel ##1 {#5{##1}}% - \fi - \increment\filelevel\relax - \ExpandFirstAfter\addtocommalist{#1}\loadedfiles} - -\def\doprevlevel% - {\ifnum\filelevel=1\relax - \let\next=\stoptekst - \else - \decrement\filelevel\relax - \let\next=\endinput - \fi - \next} - -\def\startprojekt #1 % - {\!!donextlevel\currentproject - \donotexecutefile\doexecutefileonce - \doexecutefileonce\doexecutefile#1\\} - -\def\stopprojekt% - {\doprevlevel} - -\def\startprodukt #1 % - {\!!donextlevel\currentproduct - \doexecutefileonce\doexecutefileonce - \donotexecutefile\doexecutefile#1\\} - -\def\stopprodukt% - {\doprevlevel} - -\def\startonderdeel #1 % - {\!!donextlevel\currentcomponent - \doexecutefileonce\doexecutefileonce - \donotexecutefile\doexecutefile#1\\} - -\def\stoponderdeel% - {\doprevlevel} - -\def\startomgeving #1 % - {\!!donextlevel\currentenvironment - \donotexecutefile\doexecutefileonce - \donotexecutefile\donotexecutefile#1\\} - -\def\stopomgeving% - {\doprevlevel} - -\long\def\skipdeelomgeving#1\stopdeelomgeving% - {} - -\def\startdeelomgeving[#1]% - {\def\partialenvironments{}% - \def\docommando##1% - {\beforesplitstring##1\at.\to\someevironment - \ExpandFirstAfter\addtocommalist{\someevironment}\partialenvironments}% - \processcommalist[#1]\docommando - \ExpandBothAfter\doifcommonelse - {\currentproject,\currentproduct, - \currentcomponent,\currentenvironment} - {\partialenvironments} - {\let\stopdeelomgeving=\relax - \let\next=\relax} - {\let\next=\skipdeelomgeving}% - \next} - -\def\startproduct{\startproduct} -\def\stopproduct {\stopproduct} -\def\startproject{\startprojekt} -\def\stopproject {\stopprojekt} - -\def\project{\projekt} -\def\product{\produkt} - -\def\deelomgeving #1 % - {\doexecutefileonce{#1}} - -\expanded - {\long\noexpand\def\csname\e!start\e!instellingen\endcsname##1 ##2\csname\e!stop\e!instellingen\endcsname% - {\noexpand\long\noexpand\setvalue{\??su##1}{##2}}} - -\long\def\startsetups#1 #2\stopsetups% for international purposes - {\long\setvalue{\??su#1}{#2}} - -\def\dodosetups#1% - {\getvalue{\??su#1}} - -\def\dosetups[#1]% - {\iffirstargument - \dodosetups{#1}% - \else - \expandafter\dodosetups - \fi} - -\def\setups% - {\dosingleargument\dosetups} - -\newif\ifvoorlopig -\voorlopigfalse - -\newif\ifconcept -\conceptfalse - -\def\infofont% - {\getvalue{7pttttf}} - -%\def\mathinfofont% -% {\eightpoint\tt} - -\edef\utilityversion {1996.03.15} -\edef\contextversion {\the\normalyear.\the\normalmonth.\the\normalday\normalspace} -\edef\copyrightversion {Copyright 1990-\the\normalyear\normalspace / PRAGMA / J. Hagen - A.F. Otten} - -% Nog toevoegen: -% -% For calculating random numbers we use Donald Arseneau's macros. - -\def\meldaanmaakdatum% - {\writeline - \writestring{This is CONTEXT version <\contextversion> - interface <\currentinterface> - responses <\currentresponses>}% - \writeline - \writestring{This package is based on Plain TeX. It uses an adapted version of the}% - \writestring{extended mark mechanism of J. Fox (1987) and a few parts of the sidefloat}% - \writestring{mechanism of D. Comenetz (1993). Most of D.E. Knuth's Plain TeX}% - \writestring{(\fmtversion) is available and can be used without problems. This package}% - \writestring{uses TaBlE, a package designed and copyrighted by M.J. Wichura (1988).}% - \writestring{Only a few auxiliary files are generated, of which some must be processed}% - \writestring{by TeXUtil (\utilityversion). The current blockversion is \blockversion.}% - \writeline - \writestring{\copyrightversion}% - \writeline} - -\startinterface dutch - -\def\meldaanmaakdatum% - {\writeline - \writestring{Dit is CONTEXT versie <\contextversion> - interface <\currentinterface> - meldingen <\currentresponses>}% - \writeline - \writestring{Dit pakket is gebaseerd op Plain TeX. Er wordt gebruik gemaakt van een}% - \writestring{aangepaste versie van het mark mechanisme van J. Fox (1987) en onderdelen}% - \writestring{van het sidefloat mechanisme van D. Comenetz (1993). De functionaliteit}% - \writestring{van D.E. Knuth's Plain TeX (\fmtversion) is grotendeels beschikbaar en kan}% - \writestring{zonder problemen worden gebruikt. Dit pakket gebruikt TaBlE, ontworpen door}% - \writestring{M.J. Wichura (1988), die ook het auteursrecht bezit. Er worden slechts een}% - \writestring{paar hulpfiles gegenereerd, waarvan er enkele moeten worden bewerkt door}% - \writestring{TeXUtil (\utilityversion). Het blokmechanisme heeft versienummer \blockversion.}% - \writeline - \writestring{\copyrightversion}% - \writeline} - -\stopinterface - -\startinterface german - -\def\meldaanmaakdatum% - {\writeline - \writestring{Dies ist CONTEXT Version <\contextversion> - Interface <\currentinterface> - Meldungen <\currentresponses>}% - \writeline - \writestring{Dieses Paket basiert auf Plain-TeX und benutzt eine angepasste Version}% - \writestring{des erweiterten mark-Mechanismus von J. Fox (1987) und einige Teile des}% - \writestring{sidefloat-Mechanismus von D. Comenetz (1993). Ein Grossteil D.E. Knuths}% - \writestring{Plain-TeX (\fmtversion) ist verfuegbar und kann ohne Probleme benutzt werden.}% - \writestring{Dieses Paket benutzt TaBlE, ein von M.J. Wichura (1988) erstelltes und}% - \writestring{geschuetztes Paket. Nur einige Hilfsdateien werden erstellt; einige davon}% - \writestring{muessen von TeXUtil (\utilityversion) bearbeitet werden. Die aktuelle Block-}% - \writestring{version ist \blockversion.}% - \writeline - \writestring{\copyrightversion}% - \writeline} - -\stopinterface - -\def\meldveranderingen% - {\writeline - \writestring{Currently, the reference mechanism of ConTeXt is optimized as well as}% - \writestring{extended. There is also beta grid snapping in combination with some}% - \writestring{more footnote features. Please report any anomalities to pragma@pi.net.}% - \writeline - \writestring{At this moment some pdfTeX primitives and functionality are under}% - \writestring{reconstruction. Please use the most recent tpd special driver!}% - \writeline - \writestring{Interactive floats are temporary out of order. Sorry.}} - -\appendtoks \meldveranderingen \to \everybye - -\def\doplaatsversieaanduiding#1#2% - {\doifsomething{#2} - {\@EA\convertargument#2\to\ascii - \ #1: \ascii\ - \!!doneatrue}} - -\def\plaatsversieaanduiding% - {\ifvoorlopig - \vskip\!!sixpoint - \hbox to \zetbreedte - {\infofont - Versie: \currentdate\ - \doplaatsversieaanduiding{Project}\currentproject - \doplaatsversieaanduiding{Produkt}\currentproduct - \doplaatsversieaanduiding{Onderdeel}\currentcomponent - \if!!donea\else\ File: \jobname\fi - \hss\reportpagedimensions}% - \fi - \ifconcept - \vskip\!!sixpoint - \hbox to \zetbreedte - {\infofont - Concept: \currentdate - \hss\reportpagedimensions}% - \fi} - -% tot hier - -\def\doversie[#1]% - {\voorlopigfalse - \conceptfalse - \overfullrule=\!!zeropoint - \processaction - [#1] - [\v!voorlopig=>\voorlopigtrue - \overfullrule=5pt, - \v!concept=>\concepttrue]} - -\def\versie% - {\dosingleargument\doversie} - -\newbox\referentieinfobox -\newbox\registerinfobox -\newbox\floatinfobox - -\def\dotestinfo#1#2#3% - {\ifvoorlopig - \begingroup - \convertargument#3\to\ascii - \xdef\extratestinfo% - {#2 \ascii}% - \gdef\totaltestinfo% - {\global\setbox#1=\vbox - {\unvbox#1\relax - \hbox - {\infofont - \strut - \expandafter\doboundtext\expandafter - {\extratestinfo} - {\rechtermargebreedte} - {..}% - \quad}}}% - \endgroup - \ifinner - \aftergroup\totaltestinfo - \else - \totaltestinfo - \fi - \fi} - -\def\referentieinfo% - {\dotestinfo\referentieinfobox} - -\def\registerinfo% - {\dotestinfo\registerinfobox} - -\def\floatinfo% - {\dotestinfo\floatinfobox} - -\def\plaatstestinfo% - {\setbox0=\vbox to \teksthoogte - {\forgetall - \hsize\rechtermargebreedte - \ifvoid\floatinfobox\else - \infofont\strut Plaatsblokken - \vskip\!!sixpoint - \unvbox\floatinfobox - \vskip\!!twelvepoint - \fi - \ifvoid\referentieinfobox\else - \infofont\strut Verwijzingen - \vskip\!!sixpoint - \unvbox\referentieinfobox - \vskip\!!twelvepoint - \fi - \ifvoid\registerinfobox\else - \infofont\strut Registers - \vskip\!!sixpoint - \unvbox\registerinfobox - \fi - \vss}% - \wd0=\!!zeropoint - \box0\relax} - -%I n=Commando's -%I c=\definieer,\naam -%I c=\gebruikcommandos -%I -%I Het is mogelijk eigen commando's te definieren met behulp -%I van het commando: -%I -%I \definieer[aantal argumenten]\commando{betekenis} -%I -%I Een argument kan worden opgeroepen door een # gevolgd -%I een nummer, bijvoorbeeld #2. -%I -%I \definieer\test{ziezo} \ziezo -%I \definieer[1]\test{ziezo #1} \ziezo{} -%I \definieer[2]\test{ziezo #1 en #2} \ziezo{}{} -%P -%I In commandonamen mogen alleen karakters voorkomen. Mocht -%I onverhoopt een cijfer nodig zijn, dan kunnen dergelijke -%I commando's worden opgeroepen met: -%I -%I \naam{} -%I -%I In een aantal gevallen, bijvoorbeeld bij het wegschrijven -%I naar lijsten, worden commando's \noexpand-ed. Dit is -%I bijvoorbeeld het geval bij synoniemen en sorteren, als -%I het criterium ongelijk is aan 'alles'. Dergelijke (zelf) -%I gedefinieerde commando's dienen eerst te worden -%I geactiveerd met : -%I -%I \gebruikcommandos{\commando} -%I -%I Er mogen meerdere commando's tegelijk worden opgegeven: -%I -%I \gebruikcommandos{\alfa,\beta,gamma} -%I -%I waarbij de \ facultatief is. Er wordt niets gezet! - -% \docommando kan niet worden gebruikt omdat deze macro -% soms lokaal wordt gebruikt - -% te zijner tijd: -% -% \definevariable {pc} % ProtectedCommand -% -% \def\executeprotected#1% -% {\csname\??pc\string#1\endcsname} -% -% \def\defineprotected#1#2% -% {\expandafter\def\csname\??pc\string#2\endcsname} -% -% \def\defineunprotected#1% -% {\def#1} -% -% \def\doprotected% -% {\ifx\next\define -% \let\next=\defineprotected -% \else -% \let\next=\executeprotected -% \fi -% \next} -% -% \def\unexpanded% -% {\futurelet\next\doprotected} -% -% \unexpanded\define\ziezo{ziezo} -% -% \unexpanded\ziezo - -\def\complexdodefinieer[#1]#2#3% - {\ifx#2\undefined - \else - \showmessage{\m!systems}{4}{\string#2}% - \fi - \ifcase0#1\def#2{#3}% - \or\def#2##1{#3}% - \or\def#2##1##2{#3}% - \or\def#2##1##2##3{#3}% - \or\def#2##1##2##3##4{#3}% - \or\def#2##1##2##3##4##5{#3}% - \or\def#2##1##2##3##4##5##6{#3}% - \or\def#2##1##2##3##4##5##6##7{#3}% - \or\def#2##1##2##3##4##5##6##7##8{#3}% - \or\def#2##1##2##3##4##5##6##7##8##9{#3}% - \else\def#2{#3}% - \fi} - -\def\definieer% - {\complexorsimpleempty{dodefinieer}} - -\def\naam#1% - {\donottest\getvalue{#1}} - -\def\gebruikcommandos#1% - {\bgroup - \def\docommando##1% - {\setbox0=\hbox{\getvalue{\string##1}##1}}% - \processcommalist[#1]\docommando - \egroup} - -%I n=Groeperen -%I c=\start,\definieerstartstop -%I -%I Met behulp van de volgende commando's kan de werking van -%I andere commando's worden beperkt: -%I -%I \start[label] -%I \stop[label] -%I -%I Men is vrij in de keuze van het commentaar. Het gebruik -%I van deze commando's komt overeen met het gebruiken van {}. -%P -%I Er kunnen \start-\stop-paren worden gedefinieerd en -%I ingesteld met: -%I -%I \definieerstartstop[label][voor=,na=,commandos=, -%I letter=] -%I -%I De aan 'voor' en 'na' toegekende commando's worden voor -%I \start en na \stop uitgevoerd; de aan 'commando' -%I toegekende commando's direct na \start. -%I -%I Naast het \start-\stop-paar is ook het verkorte commando -%I beschikbaar: -%I -%I \label{tekst} - -\def\complexstart[#1]% % bgroup toegevoegd - {\bgroup\getvalue{\e!start#1}} - -\def\simplestart% - {\bgroup} - -\def\complexstop[#1]% - {\getvalue{\e!stop#1}\egroup} % egroup toegevoegd - -\def\simplestop% - {\egroup} - -\def\start% - {\complexorsimple{\e!start}} - -\def\stop% - {\complexorsimple{\e!stop}} - -\def\dodefinieerstartstop[#1][#2]% - {\getparameters - [\??be#1] - [\c!voor=, - \c!na=, - \c!commandos=, - \c!letter=, - #2]% - \setvalue{#1}##1% - {\bgroup - \getvalue{\??be#1\c!commandos}% - \doattributes{\??be#1}{##1}% - \egroup}% - \setvalue{\e!start#1}% - {\getvalue{\??be#1\c!voor}% - \bgroup - \getvalue{\??be#1\c!commandos}% - \dostartattributes{\??be#1}{}}% - \setvalue{\e!stop#1}% - {\dostopattributes - \egroup - \getvalue{\??be#1\c!na}}} - -\def\definieerstartstop% - {\dodoubleargument\dodefinieerstartstop} - -%I n=Verbergen -%I c=\startverbergen -%I -%I Een deel van de tekst kan (tijdelijk) worden -%I overgeslagen door deze te omhullen met de commando's: -%I -%I \startverbergen -%I \stopverbergen - -% the buffer mechanism handles nesting, add some switch - -\setvalue{\e!start\e!verbergen}% - {\startbuffer[buf-\nofpostponedblocks] - [\e!start\e!verbergen][\e!stop\e!verbergen]} - -% gejat van Knuth (zie \copyright, p356) - -\def\omcirkeld#1% - {{\ooalign{\hfil\raise0.07ex\hbox{{\tfx#1}}\hfil\crcr\mathhexbox20D}}} - -\def\copyright - {\omcirkeld{c}} - -%I n=Systeem -%I c=\stelsysteemin -%I -%I Systeemvariabelen kunnen worden ingesteld met het -%I commando: -%I -%I \stelsysteemin[resolutie=,korps=] -%I -%I Aan 'resolutie' dient het aantal dpi (300). - -\def\dostelsysteemin[#1]% - {\getparameters[\??sv][#1]% - \beforesplitstring\@@svresolutie\at dpi\to\@@svresolutie - \let\outputresolution=\@@svresolutie} - -\def\stelsysteemin% - {\dosingleargument\dostelsysteemin} - -% Default-instellingen (verborgen) - -\resetutilities - -% Uitgestelde instellingen - -\def\dooutput{\sidefloatoutput} % redefinition of \dooutput - -% Default-instellingen (zichtbaar) - -\stelsysteemin - [\c!resolutie=300dpi, - \c!korps=\normalizedlocalbodyfontsize] % of iets anders - -% Pas op: -% -% Omdat er geen fonts geladen zijn kunnen we bij de maten geen -% em's gebruiken. Bij afstanden is dit geen probleem, omdat -% deze pas een rol spelen als er al een font geladen is. - -\stellayoutin - [ \c!kopwit=.08417508418\papierhoogte, % .08333 2.5cm - %\c!boven=.03367003367\papierhoogte, % .03331 1.0cm - \c!boven=\!!zeropoint, - \c!bovenafstand=\!!zeropoint, - \c!hoofd=.06734006734\papierhoogte, % .06667 2.0cm - \c!hoofdafstand=\!!zeropoint, - \c!hoogte=.84175084175\papierhoogte, % .83333 25.0cm - \c!voetafstand=\@@lyhoofdafstand, - \c!voet=.06734006734\papierhoogte, % .06667 2.0cm - \c!onderafstand=\@@lybovenafstand, - \c!onder=\!!zeropoint, - \c!rugwit=.11904761905\papierbreedte, % 2.5cm - %\c!rand=.14285714286\papierbreedte, % 3.0cm - \c!rand=\!!zeropoint, - \c!randafstand=\@@lymargeafstand, - %\c!marge=\@@lyrugwit, - %\c!marge=.07888078409\papierbreedte, % rugwit-2*afstand - \c!marge=.12649983170\papierbreedte, % snijwit-2*afstand - \c!margeafstand=.02008341748\papierbreedte, % 12.0pt - \c!linkerrand=\@@lyrand, - \c!linkerrandafstand=\@@lyrandafstand, - \c!linkermarge=\@@lymarge, - \c!linkermargeafstand=\@@lymargeafstand, - \c!breedte=.71428571429\papierbreedte, % 15.0cm - \c!rechtermargeafstand=\@@lymargeafstand, - \c!rechtermarge=\@@lymarge, - \c!rechterrandafstand=\@@lyrandafstand, - \c!rechterrand=\@@lyrand, - \c!kopoffset=\!!zeropoint, - \c!rugoffset=\!!zeropoint, - \c!letter=, - \c!markering=\v!uit, - \c!plaats=\v!enkelzijdig, - \c!schaal=1, - \c!nx=1, - \c!ny=1, - \c!grid=\v!nee, - \c!regels=] - -% instellingen hierop terugvallen, bijvoorbeeld de volgende: - -\definieerpapierformaat [A0] [\c!breedte=841mm, \c!hoogte=1189mm] -\definieerpapierformaat [A1] [\c!breedte=594mm, \c!hoogte=841mm] -\definieerpapierformaat [A2] [\c!breedte=420mm, \c!hoogte=594mm] -\definieerpapierformaat [A3] [\c!breedte=297mm, \c!hoogte=420mm] -\definieerpapierformaat [A4] [\c!breedte=210mm, \c!hoogte=297mm] -\definieerpapierformaat [A5] [\c!breedte=148mm, \c!hoogte=210mm] -\definieerpapierformaat [A6] [\c!breedte=105mm, \c!hoogte=148mm] -\definieerpapierformaat [A7] [\c!breedte=74mm, \c!hoogte=105mm] -\definieerpapierformaat [A8] [\c!breedte=52mm, \c!hoogte=74mm] -\definieerpapierformaat [A9] [\c!breedte=37mm, \c!hoogte=52mm] - -\definieerpapierformaat [B0] [\c!breedte=1000mm,\c!hoogte=1414mm] -\definieerpapierformaat [B1] [\c!breedte=707mm, \c!hoogte=1000mm] -\definieerpapierformaat [B2] [\c!breedte=500mm, \c!hoogte=707mm] -\definieerpapierformaat [B3] [\c!breedte=354mm, \c!hoogte=500mm] -\definieerpapierformaat [B4] [\c!breedte=250mm, \c!hoogte=354mm] -\definieerpapierformaat [B5] [\c!breedte=177mm, \c!hoogte=250mm] -\definieerpapierformaat [B6] [\c!breedte=125mm, \c!hoogte=177mm] -\definieerpapierformaat [B7] [\c!breedte=88mm, \c!hoogte=125mm] -\definieerpapierformaat [B8] [\c!breedte=63mm, \c!hoogte=88mm] -\definieerpapierformaat [B9] [\c!breedte=44mm, \c!hoogte=63mm] - -\definieerpapierformaat [C0] [\c!breedte=917mm, \c!hoogte=1297mm] -\definieerpapierformaat [C1] [\c!breedte=649mm, \c!hoogte=917mm] -\definieerpapierformaat [C2] [\c!breedte=459mm, \c!hoogte=649mm] -\definieerpapierformaat [C3] [\c!breedte=324mm, \c!hoogte=459mm] -\definieerpapierformaat [C4] [\c!breedte=229mm, \c!hoogte=324mm] -\definieerpapierformaat [C5] [\c!breedte=162mm, \c!hoogte=229mm] -\definieerpapierformaat [C6] [\c!breedte=115mm, \c!hoogte=162mm] -\definieerpapierformaat [C7] [\c!breedte=81mm, \c!hoogte=115mm] -\definieerpapierformaat [C8] [\c!breedte=57mm, \c!hoogte=81mm] -\definieerpapierformaat [C9] [\c!breedte=40mm, \c!hoogte=57mm] - -\definieerpapierformaat [S3] [\c!breedte=300pt, \c!hoogte=225pt] -\definieerpapierformaat [S4] [\c!breedte=400pt, \c!hoogte=300pt] -\definieerpapierformaat [S5] [\c!breedte=500pt, \c!hoogte=375pt] -\definieerpapierformaat [S6] [\c!breedte=600pt, \c!hoogte=450pt] - -\definieerpapierformaat [CD] [\c!breedte=120mm, \c!hoogte=120mm] - -\definieerpapierformaat [letter] [\c!breedte=8.5in, \c!hoogte=11in] -\definieerpapierformaat [legal] [\c!breedte=8.5in, \c!hoogte=14in] -\definieerpapierformaat [folio] [\c!breedte=8.5in, \c!hoogte=13in] -\definieerpapierformaat [executive] [\c!breedte=7.25in, \c!hoogte=10.5in] - -\definieerpapierformaat [envelope 9] [\c!breedte=8.88in, \c!hoogte=3.88in] -\definieerpapierformaat [envelope 10] [\c!breedte=9.5in, \c!hoogte=4.13in] -\definieerpapierformaat [envelope 11] [\c!breedte=10.38in,\c!hoogte=4.5in] -\definieerpapierformaat [envelope 12] [\c!breedte=11.0in, \c!hoogte=4.75in] -\definieerpapierformaat [envelope 14] [\c!breedte=11.5in, \c!hoogte=5.0in] -\definieerpapierformaat [monarch] [\c!breedte=7.5in, \c!hoogte=3.88in] -\definieerpapierformaat [check] [\c!breedte=8.58in, \c!hoogte=3.88in] -\definieerpapierformaat [DL] [\c!breedte=220mm, \c!hoogte=110mm] - -% Let op: na \stellayoutin (omdat dit wordt aangeroepen). - -\stelpapierformaatin - [A4][A4] - -\stelinterliniein - [\c!hoogte=.72, - \c!diepte=.28, - \c!boven=1.0, - \c!onder=0.4, - \c!regel=2.8ex] - -\stelkolommenin - [\c!n=2, - \c!lijn=\v!uit, - \c!tolerantie=\v!soepel, - \c!afstand=1.5\korpsgrootte, % influenced by switching - \c!hoogte=, - \c!balanceren=\v!ja, - \c!uitlijnen=\v!tekst, - \c!blanko={\v!regel,\v!vast}, - \c!optie=, - \c!lijndikte=\linewidth, - \c!offset=.5\korpsgrootte] - -\stelhoofdtekstenin [\v!tekst] [] [] -\stelhoofdtekstenin [\v!marge] [] [] -\stelhoofdtekstenin [\v!rand] [] [] - -\stelvoettekstenin [\v!tekst] [] [] -\stelvoettekstenin [\v!marge] [] [] -\stelvoettekstenin [\v!rand] [] [] - -\stelteksttekstenin [\v!tekst] [] [] -\stelteksttekstenin [\v!marge] [] [] -\stelteksttekstenin [\v!rand] [] [] - -\stelondertekstenin [\v!tekst] [] [] -\stelondertekstenin [\v!marge] [] [] -\stelondertekstenin [\v!rand] [] [] - -\stelboventekstenin [\v!tekst] [] [] -\stelboventekstenin [\v!marge] [] [] -\stelboventekstenin [\v!rand] [] [] - -\stelhoofdin [\c!status=\v!normaal,\c!voor=,\c!na=] -\stelvoetin [\c!status=\v!normaal,\c!voor=,\c!na=] -\steltekstin [\c!status=\v!normaal,\c!voor=,\c!na=] -\stelbovenin [\c!status=\v!normaal,\c!voor=,\c!na=] -\stelonderin [\c!status=\v!normaal,\c!voor=,\c!na=] - -\stelhoofdin [\c!na=\vss] -\steltekstin [\c!voor=\vss,\c!na=\vss] -\stelvoetin [\c!voor=\vss] - -\stelbovenin [\c!voor=\vss,\c!na=\vss] -\stelonderin [\c!voor=\vss,\c!na=\vss] - -\stelhoofdin - [\v!tekst] - [\c!strut=\v!ja, - \c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!hoofd\v!tekst\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!hoofd\v!tekst\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!hoofd\v!tekst\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!hoofd\v!tekst\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelhoofdin - [\v!marge] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!hoofd\v!marge\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!hoofd\v!marge\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!hoofd\v!marge\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!hoofd\v!marge\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelhoofdin - [\v!rand] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!hoofd\v!rand\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!hoofd\v!rand\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!hoofd\v!rand\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!hoofd\v!rand\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelvoetin - [\v!tekst] - [\c!strut=\v!ja, - \c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!voet\v!tekst\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!voet\v!tekst\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!voet\v!tekst\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!voet\v!tekst\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelvoetin - [\v!marge] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!voet\v!marge\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!voet\v!marge\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!voet\v!marge\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!voet\v!marge\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelvoetin - [\v!rand] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!voet\v!rand\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!voet\v!rand\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!voet\v!rand\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!voet\v!rand\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelbovenin - [\v!tekst] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!boven\v!tekst\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!boven\v!tekst\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!boven\v!tekst\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!boven\v!tekst\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelbovenin - [\v!marge] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!boven\v!marge\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!boven\v!marge\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!boven\v!marge\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!boven\v!marge\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelbovenin - [\v!rand] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!boven\v!rand\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!boven\v!rand\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!boven\v!rand\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!boven\v!rand\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelonderin - [\v!tekst] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!boven\v!rand\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!boven\v!rand\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!boven\v!rand\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!boven\v!rand\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelonderin - [\v!marge] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!onder\v!marge\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!onder\v!marge\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!onder\v!marge\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!onder\v!marge\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelonderin - [\v!rand] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!onder\v!rand\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!onder\v!rand\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!onder\v!rand\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!onder\v!rand\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\steltekstin - [\v!tekst] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!tekst\v!tekst\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!tekst\v!tekst\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!tekst\v!tekst\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!tekst\v!tekst\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\steltekstin - [\v!marge] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!tekst\v!marge\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!tekst\v!marge\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!tekst\v!marge\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!tekst\v!marge\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\steltekstin - [\v!rand] - [\c!letter=, - \c!kleur=, - \c!linkertekst=, - \c!middentekst=, - \c!rechtertekst=, - \c!kantlijntekst=, - \c!margetekst=, - \c!linkerletter=\getvalue{\??tk\v!tekst\v!rand\c!letter}, - \c!rechterletter=\getvalue{\??tk\v!tekst\v!rand\c!letter}, - \c!linkerkleur=\getvalue{\??tk\v!tekst\v!rand\c!kleur}, - \c!rechterkleur=\getvalue{\??tk\v!tekst\v!rand\c!kleur}, - \c!linkerbreedte=, - \c!rechterbreedte=] - -\stelnummeringin - [\c!variant=\v!enkelzijdig, - \c!plaats={\v!hoofd,\v!midden}, - \c!conversie=\v!cijfers, - \c!links=, - \c!rechts=, - \c!wijze=\v!per\v!deel, - \c!tekst=, - \v!hoofdstuk\c!nummer=\v!nee, - \v!deel\c!nummer=\v!ja, - \c!nummerscheider=--, - \c!tekstscheider=\tfskip, - \c!status=\v!start, - \c!commando=, - \c!letter=\v!normaal, - \c!kleur=] - -\stelblankoin - [\v!standaard, - \v!groot] - -\stelkoppenin - [\c!variant=\v!normaal, - \c!sectienummer=\v!ja, - \c!scheider=., - \c!commando=] - -\definieersectieblok [\v!hoofdtekst] [\v!hoofdteksten] [\c!nummer=\v!ja] -\definieersectieblok [\v!bijlage] [\v!bijlagen] [\c!nummer=\v!ja] -\definieersectieblok [\v!inleiding] [\v!inleidingen] [\c!nummer=\v!nee] -\definieersectieblok [\v!uitleiding] [\v!uitleidingen] [\c!nummer=\v!nee] - -\definieersectie[\v!sectie-1] % deel -\definieersectie[\v!sectie-2] % hoofdstuk -\definieersectie[\v!sectie-3] % paragraaf -\definieersectie[\v!sectie-4] % subparagraaf -\definieersectie[\v!sectie-5] % subsubparagraaf -\definieersectie[\v!sectie-6] % subsubsubparagraaf -\definieersectie[\v!sectie-7] % subsubsubsubparagraaf - -% \c!eigennummer ook hier? - -\definieerkop - [\v!deel] - [\c!sectie=\v!sectie-1] - -\definieerkop - [\v!hoofdstuk] - [\c!sectie=\v!sectie-2] - -\definieerkop - [\v!paragraaf] - [\c!sectie=\v!sectie-3] - -\definieerkop - [\v!sub\v!paragraaf] - [\c!sectie=\v!sectie-4, - \c!default=\v!paragraaf] - -\definieerkop - [\v!sub\v!sub\v!paragraaf] - [\c!sectie=\v!sectie-5, - \c!default=\v!paragraaf] - -\definieerkop - [\v!sub\v!sub\v!sub\v!paragraaf] - [\c!sectie=\v!sectie-6, - \c!default=\v!paragraaf] - -\definieerkop - [\v!sub\v!sub\v!sub\v!sub\v!paragraaf] - [\c!sectie=\v!sectie-7, - \c!default=\v!paragraaf] - -\definieerkop - [\v!titel] - [\c!koppeling=\v!hoofdstuk, - \c!default=\v!hoofdstuk, - \c!verhoognummer=\v!nee] - -\definieerkop - [\v!onderwerp] - [\c!koppeling=\v!paragraaf, - \c!default=\v!paragraaf, - \c!verhoognummer=\v!nee] - -\definieerkop - [\v!sub\v!onderwerp] - [\c!koppeling=\v!sub\v!paragraaf, - \c!default=\v!sub\v!paragraaf, - \c!verhoognummer=\v!nee] - -\definieerkop - [\v!sub\v!sub\v!onderwerp] - [\c!koppeling=\v!sub\v!sub\v!paragraaf, - \c!default=\v!sub\v!sub\v!paragraaf, - \c!verhoognummer=\v!nee] - -\definieerkop - [\v!sub\v!sub\v!sub\v!onderwerp] - [\c!koppeling=\v!sub\v!sub\v!sub\v!paragraaf, - \c!default=\v!sub\v!sub\v!sub\v!paragraaf, - \c!verhoognummer=\v!nee] - -\definieerkop - [\v!sub\v!sub\v!sub\v!sub\v!onderwerp] - [\c!koppeling=\v!sub\v!sub\v!sub\v!sub\v!paragraaf, - \c!default=\v!sub\v!sub\v!sub\v!sub\v!paragraaf, - \c!verhoognummer=\v!nee] - -\stelsectiein - [\v!sectie-2] - [\v!bijlage\c!conversie=\v!Letter, - \c!vorigenummer=\v!nee] - -\stelkopin - [\v!deel] - [\c!plaatskop=\v!nee] - -\stelkopin - [\v!hoofdstuk] - [\v!bijlage\c!label=\v!bijlage, - \v!hoofdtekst\c!label=\v!hoofdstuk] % bijlageconversie=\Character - -\stelkopin - [\v!paragraaf] - [\v!bijlage\c!label=\v!paragraaf, - \v!hoofdtekst\c!label=\v!paragraaf] % bijlageconversie=\Character - -\stelkopin - [\v!sub\v!paragraaf] - [\v!bijlage\c!label=\v!sub\v!paragraaf, - \v!hoofdtekst\c!label=\v!sub\v!paragraaf] % bijlageconversie=\Character - -\stelkopin - [\v!sub\v!sub\v!paragraaf] - [\v!bijlage\c!label=\v!sub\v!sub\v!paragraaf, - \v!hoofdtekst\c!label=\v!sub\v!sub\v!paragraaf] % bijlageconversie=\Character - -\stelkopin - [\v!deel,\v!hoofdstuk] - [\c!uitlijnen=\v!normaal, - \c!doorgaan=\v!nee, - \c!pagina=\v!rechts, - \c!hoofd=, - \c!letter=\tfc, - \c!voor={\blanko[2*\v!groot]}, - \c!na={\blanko[2*\v!groot]}] - -\stelkopin - [\v!paragraaf] - [\c!uitlijnen=\v!normaal, - \c!letter=\tfa, - \c!voor={\blanko[2*\v!groot]}, - \c!na=\blanko] - -\definieersamengesteldelijst - [\v!inhoud] - [\v!deel, - \v!hoofdstuk, - \v!paragraaf, - \v!sub\v!paragraaf, - \v!sub\v!sub\v!paragraaf, - \v!sub\v!sub\v!sub\v!paragraaf, - \v!sub\v!sub\v!sub\v!sub\v!paragraaf] - [\c!niveau=\v!sub\v!sub\v!sub\v!sub\v!paragraaf, - \c!criterium=\v!lokaal] - -\stelblokkopjesin - [\c!plaats=\v!onder, - \c!voor=\blanko, - \c!tussen={\blanko[\v!middel]}, - \c!na=\blanko, - \c!breedte=\v!passend, - \c!kopletter=\v!vet, - \c!letter=\v!normaal, - \c!kleur=, - \c!uitlijnen=, - \c!nummer=\v!ja, - \c!wijze=\@@nrwijze, - \c!blokwijze=\@@nrblokwijze, - \c!sectienummer=\@@nrsectienummer, - \c!conversie=\v!cijfers] - -\stelplaatsblokkenin - [\c!plaats=\v!midden, - \c!breedte=\v!passend, - \c!hoogte=\v!passend, - \c!offset=\v!overlay, - \c!kader=\v!uit, - \c!straal=.5\korpsgrootte, - \c!hoek=\v!recht, - \c!achtergrond=, - \c!achtergrondraster=\@@rsraster, - \c!achtergrondkleur=, - \c!bovenkader=, - \c!onderkader=, - \c!linkerkader=, - \c!rechterkader=, - \c!voor=, - \c!na=, - \c!voor\c!wit=\v!groot, - \c!na\c!wit=\v!groot, - \c!zij\c!voor\c!wit=\@@bkvoorwit, - \c!zij\c!na\c!wit=\@@bknawit, - \c!marge=1em, - \c!nboven=2, - \c!nonder=0, - \c!nregels=4] - -\stelplaatsbloksplitsenin - [\c!conversie=\v!letter, % \v!romeins - \c!regels=3] - -\stelwitruimtein - [\v!geen] - -\inspringen - [\v!nooit] - -\stelinspringenin - [\v!geen] - -\stelopsommingenin % undocumented - [\c!niveaus=6, - \c!marge=\!!zeropoint, - \c!breedte=1.5em, - \c!factor=0, - \c!afstand=.5em, - \c!marletter=\c!type, - \c!symletter=, - \c!kopletter=, - \c!markleur=, - \c!symkleur=, - \c!kopkleur=, - \c!kopvoor=, - \c!kopna=\blanko, - \c!voor=\blanko, - \c!tussen=\blanko, - \c!na=\blanko, - \c!afsluiter=., - \c!plaatsafsluiter=\v!ja, - \c!binnen=, - \c!n=2, - \c!items=4, - \c!symbool=\itemlevel] - -\steldoorspringenin - [\c!letter=\v!normaal, - \c!kopletter=\v!normaal, - \c!kleur=, - \c!kopkleur=, - \c!breedte=\v!passend, - \c!tekst=..., - \c!monster=, - \c!voor=\blanko, - \c!na=\blanko, - \c!scheider={ :}] - -\stelnummerenin - [\c!wijze=\v!per\v!hoofdstuk, - \c!blokwijze=, - \c!sectienummer=\v!ja, - \c!status=\v!start] - -\stelformulesin - [\c!wijze=\@@nrwijze, - \c!blokwijze=, - \c!sectienummer=\@@nrsectienummer, - \c!plaats=\v!rechts, - \c!links=(, - \c!rechts=)] - -\stelreferentielijstin - [\c!letter=\v!normaal] - -\stelinmargein - [\c!letter=\v!vet, - \c!kleur=, - \c!plaats=\v!beide, - \c!uitlijnen=\v!binnen, - \c!voor=, - \c!na=] - -\stelinmargein - [\v!links] - [\c!plaats=\v!links, - \c!uitlijnen=\v!links] - -\stelinmargein - [\v!rechts] - [\c!plaats=\v!rechts, - \c!uitlijnen=\v!rechts] - -\versie - [\v!definitief] - -\stelpaginanummerin - [\c!nummer=1] - -\stelsubpaginanummerin - [\c!wijze=\v!per\v!deel, - \c!status=\v!stop] - -\stelsmallerin - [\c!links=1.5em, - \c!rechts=1.5em, - \c!midden=1.5em] - -\stelregelnummerenin - [\c!conversie=\v!cijfers, - \c!start=1, - \c!stap=1, - \c!plaats=\v!inmarge, - \c!letter=, - \c!kleur=, - \c!breedte=2em, - \c!prefix=, - \c!refereren=\v!aan] - -\definieeropmaak - [\v!standaard] - [\c!breedte=\zetbreedte, - \c!hoogte=\teksthoogte, - \c!voffset=\!!zeropoint, - \c!hoffset=\!!zeropoint, - \c!pagina=\v!rechts, - \c!dubbelzijdig=\v!leeg] - -\stelpositionerenin - [\c!eenheid=\s!cm, - \c!factor=1, - \c!schaal=1, - \c!xstap=\v!absoluut, - \c!ystap=\v!absoluut, - \c!offset=\v!ja, - \c!xoffset=\!!zeropoint, - \c!yoffset=\!!zeropoint] - -\stelregelsin - [\c!voor=\blanko, - \c!na=\blanko, - \c!inspringen=\v!nee] - -\steldoordefinierenin - [\c!plaats=\v!links, - \c!kopletter=\v!vet, - \c!letter=\v!normaal, - \c!kleur=, - \c!kopkleur=, - \c!breedte=8em, - \c!afstand=0pt, - \c!hang=, - \c!monster=, - \c!uitlijnen=, - \c!inspringen=\v!nee, - \c!voor=\blanko, - \c!tussen=\blanko, - \c!na=\blanko, - \c!commando=] - -\steldoornummerenin - [\c!plaats=\v!boven, - \c!kopletter=\v!vet, - \c!kopkleur=, - \c!letter=\v!normaal, - \c!kleur=, - \c!breedte=8em, - \c!afstand=0pt, - \c!hang=, - \c!monster=, - \c!uitlijnen=, - \c!inspringen=\v!nee, - \c!voor=\blanko, - \c!tussen=\blanko, - \c!na=\blanko, - \c!tekst=, - \c!niveaus=3, % to be upward compatible - \c!conversie=, % to be upward compatible - \c!wijze=\v!per\v!tekst, - \c!sectienummer=\v!ja, - \c!scheider=., - \c!afsluiter=, - \c!nummer=] - -\stelkoppeltekenin - [\c!teken=\compoundhyphen] - -\stelnaastplaatsenin - [\c!status=\v!stop] - -\steltolerantiein - [\v!horizontaal,\v!zeerstreng] - -\steltolerantiein - [\v!vertikaal,\v!streng] - -\steluitlijnenin - [\v!onder, - \v!breedte] - -\stelspatieringin - [\v!opelkaar] - -\definieerregister - [\v!index] - [\v!indices] - -\definieerplaatsblok - [\v!figuur] - [\v!figuren] - -\definieerplaatsblok - [\v!tabel] - [\v!tabellen] - -\stelplaatsblokin - [\v!tabel] - [\c!kader=\v!uit] - -\definieerplaatsblok - [\v!intermezzo] - [\v!intermezzos] - -\definieerplaatsblok - [\v!grafiek] - [\v!grafieken] - -\definieersynoniemen - [\v!afkorting] - [\v!afkortingen] - [\voluit] - -\stelsynoniemenin - [\v!afkorting] - [\c!tekstletter=\v!kapitaal, - \c!synoniemletter=, - \c!tekstkleur=, - \c!synoniemkleur=, - \c!plaats=\v!links, - \c!breedte=5em, - \c!status=\v!start] - -\definieersorteren - [\v!logo] - [\v!logos] - -\definieersynoniemen - [\v!eenheid] - [\v!eenheden] - [\betekenis] - -\stelsynoniemenin - [\v!eenheid] - [\c!tekstletter=\donottest\dimension] - -\stelmargeblokkenin - [\c!status=\v!start, - \c!plaats=\v!inmarge, - \c!breedte=\rechtermargebreedte, - \c!letter=, - \c!kleur=, - \c!uitlijnen=, - \c!links=, - \c!rechts=, - \c!boven=, - \c!tussen=\blanko, - \c!onder=\vfill, - \c!voor=, - \c!na=] - -\stelachtergrondenin - [\v!pagina,\v!linkerpagina,\v!rechterpagina] - [\c!kader=\v!uit, - \c!straal=.5\korpsgrootte, - \c!hoek=\v!recht, - \c!achtergrond=, - \c!raster=\@@rsraster, - \c!kleur=, - \c!kaderoffset=\getvalue{\??ma\v!pagina\c!offset}, - \c!achtergrondoffset=\getvalue{\??ma\v!pagina\c!offset}, - \c!offset=\!!zeropoint, - \c!diepte=\!!zeropoint, - \c!scheider=\v!nee] - -\stelbufferin - [\c!voor=, - \c!na=] - -\stellijstin - [\v!deel] - [\c!breedte=0em, - \c!voor={\blanko\pagina[\v!voorkeur]}, - \c!na=\blanko, - \c!label=\v!ja, - \c!scheider=:, - \c!afstand=1em] - -\stellijstin - [\v!hoofdstuk] - [\c!breedte=2em, - \c!voor={\blanko\pagina[\v!voorkeur]}, - \c!na=] - -\stellijstin - [\v!paragraaf] - [\c!breedte=3em] - -\stellijstin - [\v!sub\v!paragraaf] - [\c!breedte=4em] - -\stellijstin - [\v!sub\v!sub\v!paragraaf] - [\c!breedte=5em] - -\stellijstin - [\v!sub\v!sub\v!sub\v!paragraaf] - [\c!breedte=6em] - -\stellijstin - [\v!sub\v!sub\v!sub\v!sub\v!paragraaf] - [\c!breedte=7em] - -\def\documentstyle% - {\showmessage{\m!systems}{3}{} - \stoptekst} - -\protect - -\endinput +%D \module
+%D [ file=core-01a,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=1A (to be split),
+%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.
+
+% nog oplossen: voetnoot setten ivm later veranderde
+% witruimte; probleem: als lijn graphic
+
+% \ifinfloat \ifinpagebody \ifintable \ifincolumns etc naar
+% core-sta(tus)
+% nieuw/nb:
+%
+% in handleiding: eerste in set float [hier..] telt!
+% [hier,altijd] en niet [altijd,hier]
+%
+% \switchnaarkorps[globaal] voor bv grote figuren in klein
+% \interactiebuttons[][]
+% lijstalternatieven: e, f,g
+% \lastreference
+% \pagina[ja,blanko,rechts]
+% \stelkopin[tussen] % precies aangeven waar voor/tussen/na
+% \stelpapierformaatin[liggend,A4][liggend,A4]
+
+% kopletter: letter=,tekstletter=\bfa,nummerletter=\bf (anders ook \bfa)
+
+% in handleiding vermelden dat \definieerinteractiemenu 3 args behoeft!
+% in handleiding: \steloffsetin vervangen door \stellayoutin
+% in handleiding: \stellayoutin optie [markering=aan]
+% in handleiding: \stellayoutin schaalt naar paginamaten
+% in handleiding: \stellayoutin optie [plaats=midden|..zijdig]
+% in handleiding: \stelinteractieschermin optie [..wit=, ..=passend]
+% in handleiding: \stelinteractieschermin optie [..offset=, ..=passend]
+% in handleiding: \definieerpapierformaat [A3,S3456][..]
+% in handleiding: \stellayoutin optie [breedte|hoogte=passend]
+% in handleiding: meer achtergrond opties
+% in handleiding: \stelregelsin[inspringen=ja,nee,even,oneven]
+% in handleiding: \stelkolommenin[optie=achtergrond]
+% in handleiding: \omlijnd[breedte=passend,uitlijnen=midden] (auto mode)
+% in handleiding: \omlijnd[achtergrondcommando ...]
+% in handleiding: \stelhoofdin[status=hoog]
+% in handleiding: \stellijstin[koppeling=aan] % interactieve optie, was standaard aan, nu uit
+% in handleiding: \stelvoetin[voor=,na=,strut=]
+% in handleiding: \stelmenuin[][links=,rechts=,midden=,voor=,...]
+
+% in handleiding: \definecolorgroup[a][b]
+% \stelinteractiebalkin[symbool=ja|nee]
+% \stelinteractiemenuin[zelfdepagina|onbekendeverwijzing=ja|nee|leeg|geen]
+% \definieerconversie[aa][*,**,***]
+% \stelkopin[eigennummer=ja]
+% \stel...tekstenin (zonder argumenten == reset)
+
+% in handleiding: \definieeroverlay[naam]{commando}
+% in handleiding: \plaatsonderelkaar
+%
+% in handleiding preview bij figuren
+
+% nb: als subpage: dan ook op eerste pag nummer ophogen (i.g.v. \standaardopmaak)
+% execute command interactive commands
+
+% \stelsubpaginanummerin[reset]
+% \bepaallijstkenmerken
+% \bepaalregisterkenmerken
+
+% in handleiding cmyk/rgb/k
+% in handleiding: \raggedright etc fontswitch afhankelijk (em)
+
+\newevery \everybodyfont \Everybodyfont % just to be sure
+
+\appendtoks \presetnormallineheight \to \everybodyfont
+\appendtoks \setnormalbaselines \to \everybodyfont
+\appendtoks \setstrut \to \everybodyfont
+\appendtoks \settopskip \to \everybodyfont
+\appendtoks \setmaxdepth \to \everybodyfont
+\appendtoks \stelinspringenin \to \everybodyfont
+\appendtoks \stelblankoin \to \everybodyfont
+\appendtoks \stelwitruimtein \to \everybodyfont
+%\appendtoks\setupfootnotes \to \everybodyfont
+
+% \appendtoks .. \to \everypar
+% \appendtoks .. \to \everypar
+% \appendtoks .. \to \everypar
+
+% kan elders ook worden gebruikt i.i.g ongeveer
+% \v!tekst EN \c!tekst etc checken
+
+\unprotect
+
+\def\gobbleassigndimen#1\\{}
+
+\def\assigndimen#1#2%
+ {\afterassignment\gobbleassigndimen#1=#2\!!zeropoint\\}
+
+\protect
+
+\writestatus{loading}{Context Core Macros (a)}
+
+\unprotect
+
+\startmessages dutch library: systems
+ title: systeem
+ 1: laden hulpfile uitgesteld (typemode)
+ 2: -- geladen
+ 3: probeer LaTeX eens
+ 4: commando -- is al gedefinieerd
+ 5: macro's uit -- geladen
+ 6: geen macro's in -- gevonden
+ 7: macro's uit -- reeds geladen
+ 8: nieuwe versie hulpfile, tweede run nodig
+ 9: -- niet gevonden/geplaatst
+ 10: gebruik geen em in --
+ 11: aanmaken basale hulpfile
+ 12: de hulpfile is niet gesorteerd, gebruik texutil
+ 13: markering -- gedefinieerd --
+ 14: geforceerde paginaovergang in lijst voor --
+ 15: wegschrijven buffer --
+ 16: inlezen buffer --
+ 17: verbatim inlezen buffer --
+ 18: synoniem -- -- bestaat niet
+ 19: betekenissen (synoniemen) van -- geladen
+ 20: betekenissen (sorteren) van -- geladen
+ 21: de hulpfile is niet geladen
+ 22: gebruik een goede hulpfile
+ 23: -- gearrangeerd op --
+\stopmessages
+
+\startmessages english library: systems
+ title: system
+ 1: loading utility-file postponed (typemode)
+ 2: -- loaded
+ 3: try LaTeX
+ 4: command -- is already defined
+ 5: macros of -- loaded
+ 6: no macros found in --
+ 7: macros of -- already loaded
+ 8: new version of utility file, second pass needed
+ 9: -- not found/processed
+ 10: don't use em in --
+ 11: building simple util
+ 12: the utility-file is not sorted, use texutil
+ 13: mark -- defined --
+ 14: forced newpage in list at --
+ 15: saving buffer --
+ 16: typesetting buffer --
+ 17: typesetting verbatim buffer --
+ 18: synonym -- -- does not exist
+ 19: meaning (synonyms) of -- loaded
+ 20: meaning (sorts) of -- loaded
+ 21: no utility data is loaded
+ 22: use a valid utilityfile
+ 23: -- arranged at --
+\stopmessages
+
+% - TOBIAS: check 21/22/23
+
+\startmessages german library: systems
+ title: system
+ 1: Laden der Hilfsdatei verschoben (tippenmodus)
+ 2: -- geladen
+ 3: Versuche LaTeX
+ 4: Befehl -- ist bereits definiert
+ 5: Makros in -- geladen
+ 6: Keine Makros in -- gefunden
+ 7: Makros in -- bereits geladen
+ 8: Neue Version der Hilfsdatei, zweiter Durchlauf benoetigt
+ 9: -- nicht gefunden/verarbeitet
+ 10: Benutzte kein em in --
+ 11: Erstelle einfache Hilfdatei
+ 12: Die Hilfdatei ist nicht sortiert, verwende texutil
+ 13: Beschriftung -- definiert --
+ 14: Erzwungendes Seitenumbruch in Liste bei --
+ 15: Speichere Buffer --
+ 16: Setzte Buffer --
+ 17: Setzte tippen-Buffer --
+ 18: Synonym -- -- existiert nicht
+ 19: Bedeutung (synonyme) von -- geladen
+ 20: Bedeutung (sortieren) von -- geladen
+ 21: Die Hilfsdatei ist nicht geladen
+ 22: Brauche gute Hilfsdateien
+ 23: -- arrangiert auf --
+\stopmessages
+
+\startmessages dutch library: textblocks
+ title: tekstblokken
+ 1: nieuwe versie, tweede run nodig
+ 2: wegschrijven blokken naar --
+ 3: inlezen blokken uit --
+ 4: er is een tweede run nodig
+ 5: -- niet verborgen
+ 6: -- verborgen en verwerkt
+ 7: -- verborgen
+ 8: -- gehandhaafd
+ 9: -- niet gehandhaafd
+ 10: -- geladen en verwerkt
+ 11: -- geladen en geplaatst
+ 12: -- overgeslagen
+\stopmessages
+
+\startmessages english library: textblocks
+ title: textblocks
+ 1: new version, second pass needed
+ 2: writing blocks to --
+ 3: reading blocks from --
+ 4: second pass needed
+ 5: -- not hidden
+ 6: -- hidden and processed
+ 7: -- hidden
+ 8: -- typeset
+ 9: -- not typeset
+ 10: -- loaded and processed
+ 11: -- loaded and typeset
+ 12: -- skipped
+\stopmessages
+
+\startmessages german library: textblocks
+ title: textblock
+ 1: neue Version, zweiter Durchlauf benoetigt
+ 2: schreibe Bloecke zu --
+ 3: lese Bloecke von --
+ 4: zweiter Durchlauf benoetigt
+ 5: -- nicht verborgen
+ 6: -- verborgen und verarbeitet
+ 7: -- verborgen
+ 8: -- gesetzt
+ 9: -- nicht gesetzt
+ 10: -- geladen und verarbeitet
+ 11: -- geladen und gesetzt
+ 12: -- ausgelassen
+\stopmessages
+
+\startmessages dutch library: floatblocks
+ title: plaatsblokken
+ 1: -- hernummerd / -- => --
+ 2: -- bewaard
+ 3: -- verplaatst
+ 4: -- geplaatst
+ 5: volgorde aangepast
+ 6: maximaal -- boven
+ 7: maximaal -- onder
+ 8: minder dan -- regels
+ 9: volgorde verstoord
+ 10: -- begrensd
+ 11: geen blok opgegeven
+ 12: niet gedefinieerd
+\stopmessages
+
+\startmessages english library: floatblocks
+ title: floatblocks
+ 1: -- renumbered / -- => --
+ 2: -- saved
+ 3: -- moved
+ 4: -- placed
+ 5: order adapted
+ 6: n of top floats limited to --
+ 7: n of bottom floats limited to --
+ 8: less than -- lines
+ 9: order disturbed
+ 10: -- limited
+ 11: no block given
+ 12: undefined
+\stopmessages
+
+\startmessages german library: floatblocks
+ title: Gleitobjektbloecke
+ 1: -- neu nummeriert / -- => --
+ 2: -- gespeichert
+ 3: -- verschoben
+ 4: -- plaziert
+ 5: Reihenfolge angepasst
+ 6: Anz. der oberen Gleitobjekte beschraengt auf --
+ 7: Anz. der unteren Gleitobjekte beschraengt auf --
+ 8: weniger als -- zeilen
+ 9: Reigenfolge gestoert
+ 10: -- begrenzt
+ 11: kein Block gegeben
+ 12: undefiniert
+\stopmessages
+
+\startmessages dutch library: layouts
+ title: layout
+ 1: teksthoogte aangepast met -- op pagina --
+ 2: -- maal uitgestelde tekst tussengevoegd
+ 3: -- maal tekst plaatsen uitstellen
+ 4: margeblokken actief
+ 5: margeblokken inactief
+ 6: subpagina reeks -- verwerkt (aantal --)
+ 7: beeldmerken berekenen
+ 8: achtergronden berekenen
+ 9: momenteen maximaal -- niveaus in opsommingen
+ 10: -- en -- tellen niet op tot 1.0
+ 11: interlinie -- niet toegestaan in gridmode
+\stopmessages
+
+\startmessages english library: layouts
+ title: layout
+ 1: textheight adapted with -- at page --
+ 2: -- times postponed text placed
+ 3: -- times text postponed
+ 4: marginblocks active
+ 5: marginblocks inactive
+ 6: subpage set -- processed (size --)
+ 7: calculating logospace
+ 8: calculating backgrounds
+ 9: currently no more than -- levels in itimezations
+ 10: -- and -- don't add up to 1.0
+ 11: spacing -- not permitted in gridmode
+\stopmessages
+
+% TOBIAS: 10 and 11!
+
+\startmessages german library: layouts
+ title: Layout
+ 1: Texthoehe angepasst mit -- auf Seite --
+ 2: -- mal verschobener Text plaziert
+ 3: -- mal Text verschoben
+ 4: marginalbloecke aktiv
+ 5: marginalbloecke inaktiv
+ 6: Unterseitenfolge -- verarbeitet (Groesse --)
+ 7: berechne Platz des Logo
+ 8: berechne Hintergrund
+ 9: z.Z. nicht mehr als -- Niveaus in Posten
+ 10: -- and -- don't add up to 1.0
+ 11: spacing -- not permitted in gridmode
+\stopmessages
+
+\startmessages dutch library: structures
+ title: structuur
+ 1: begin van sectieblok --
+ 2: eind van sectieblok --
+\stopmessages
+
+\startmessages english library: structures
+ title: structure
+ 1: begin of sectionblock --
+ 2: end of sectionblock --
+\stopmessages
+
+\startmessages german library: structures
+ title: struktur
+ 1: Begin des Abschnittsblock --
+ 2: Ende des Abschnittsblock --
+\stopmessages
+
+% \CONTEXTtrue % Now we know that we can use ConTeXt commands.
+
+% \def\teststatus{stop}
+%
+% \def\doiftrue {\iftrue}
+% \def\doiffalse {\iffalse}
+%
+% \def\setstatus#1#2%
+% {\doifelse{\getvalue{#1\c!status}}{\v!start}
+% {\let#2=\doiftrue}
+% {\let#2=\doiffalse}}
+%
+% \setstatus{test}\iftest
+%
+% \iftest
+% \message{JA}
+% \else
+% \message{NEE}
+% \fi
+
+% om problemen te voorkomen:
+%
+% \ascii => \@@ascii@@
+% \asciiA => \@@ascii@@A
+% \asciiB => \@@ascii@@B
+
+% Nodig i.v.m. inspringen eerste alineas
+
+\def\explicithmode%
+ {\unhbox\voidb@x}
+
+% Nodig voor gebruikers
+
+\def\geentest{\donottest}
+
+% Dit moet nog ergens een plaats krijgen:
+
+\def\stelfactorenin%
+ {\stelwitruimtein
+ \stelblankoin
+ \settopskip
+ \setmaxdepth}
+
+% Nog doen:
+%
+% \goodbreak -> \allowbreak en \dosomebreak{..} in koppen
+%
+% bij koppen zowieso: \blanko[reset]
+
+% Nog in commando verwerken:
+%
+% \voorkeur … la \blanko
+%
+% Om ongewenste witruimte te voorkomen kan met \dosomebreak{\break}
+% een \penalty v¢¢r witruimte worden geplaatst.
+
+\def\dosomebreak#1%
+ {\skip0=\lastskip
+ \removelastskip
+ %\type{#1}%
+ #1\relax
+ \ifdim\skip0=\!!zeropoint
+ \else
+ \vskip\skip0
+ \fi}
+
+% beter, vooral in \vbox; nog in \pagina toepassen s!
+
+\def\doifoutervmode#1%
+ {\ifvmode\ifinner\else#1\fi\fi}
+
+\def\dosomebreak#1%
+ {\doifoutervmode
+ {\skip0=\lastskip
+ \removelastskip
+ %\leavevmode\type{#1}%
+ #1\relax
+ \ifdim\skip0=\!!zeropoint % else interference with footnotes
+ \else
+ \vskip\skip0
+ \fi}}
+
+% Idem:
+%
+% \springin
+
+%\def\noindentation% vervallen
+% {\EveryPar
+% {\ifdim\parindent=\!!zeropoint
+% \else
+% \bgroup
+% \setbox0=\lastbox
+% \egroup
+% \fi
+% \EveryPar{}}}
+
+\newif\ifindentation \indentationtrue % documenteren, naar buiten
+
+\let\checkindentation=\relax
+
+\def\donoindentation%
+ {\ifdim\parindent=\!!zeropoint
+ \else
+ \bgroup
+ \setbox0=\lastbox
+ \egroup
+ \fi}
+
+\def\noindentation% made global
+ {\global\indentationfalse
+ \gdef\checkindentation%
+ {\donoindentation
+ \gdef\checkindentation{\global\indentationtrue}}}
+
+\def\indentation%
+ {\ifvmode
+ \ifdim\parindent=\!!zeropoint
+ \else
+ \hskip\parindent
+ \fi
+ \fi}
+
+% vergeten
+
+% \def\forgetall%
+% {\everypar{}% % i.v.m. sidefloats
+% \let\par=\endgraf % i.v.m. getpar etc
+% \stelwitruimtein[\v!geen]%
+% \stelinspringenin[\v!geen]%
+% \leftskip\!!zeropoint
+% \rightskip\!!zeropoint
+% \relax}
+%
+% \def\forgetparindent%
+% {\everypar{}%
+% \voorwit\!!zeropoint % toegevoegd
+% \parindent\!!zeropoint}
+
+\def\forgeteverypar%
+ {\everypar{}}
+
+\def\forgeteverypar%
+ {\everypar{\the\neverypar}}
+
+\def\forgetparindent%
+ {\forgeteverypar
+ \stelinspringenin[\v!geen]}
+
+\def\forgetparskip%
+ {\stelwitruimtein[\v!geen]}
+
+\def\forgetbothskips%
+ {\tolerance=1500
+ \leftskip\!!zeropoint
+ \rightskip\!!zeropoint\relax}
+
+\def\forgetspacing%
+ {\emergencystretch\!!zeropoint\relax}
+
+\def\forgetall%
+ {\let\par=\endgraf % i.v.m. getpar etc
+ \forgetparskip
+ \forgetparindent
+ \forgetbothskips
+ \forgetspacing} % i.v.m. funny spacing in pagebody
+
+\def\localvbox#1#%
+ {\vbox#1\bgroup
+ \forgetparskip
+ \setlocalhsize
+ \hsize=\localhsize
+ \forgetparindent
+ \forgetbothskips
+ \forgeteverypar
+ \let\next=}
+
+% ach ja
+
+\unexpanded\def\dostartattributes#1%
+ {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+ \doifdefinedelse{#1\c!kleur}
+ {\def\colorattribute{\getvalue{#1\c!kleur}}}
+ {\let\colorattribute=\empty}%
+ \doifdefinedelse{#1\c!letter}
+ {\def\fontattribute{\getvalue{#1\c!letter}}}
+ {\let\fontattribute=\empty}%
+ \startcolor[\colorattribute]%
+ \doconvertfont{\fontattribute}}
+
+\unexpanded\def\dostopattributes%
+ {\stopcolor
+ \endgroup}
+
+\unexpanded\def\doattributes#1#2%
+ {\dostartattributes{#1}{#2}\dostopattributes}
+
+% \dotextprefix{tekst}
+%
+% als {tekst} niet leeg is: tekst~
+
+\def\dotextprefix#1%
+ {\ConvertToConstant\doifnot{#1}{}{#1~}}
+
+% kan vaker worden toegepast:
+
+\def\doadaptleftskip#1%
+ {\processaction[#1] % \ExpandFirstAfter
+ [\v!standaard=>\advance\leftskip by
+ \ifdim\voorwit=\!!zeropoint\@@sllinks\else\voorwit\fi,
+ \v!ja=>\advance\leftskip by
+ \ifdim\voorwit=\!!zeropoint\@@sllinks\else\voorwit\fi,
+ \v!nee=>,
+ \s!unknown=>\advance\leftskip by #1]}
+
+\def\herhaal {\dorepeat}
+\def\herhaler {\repeater}
+\def\herhaalmetcommando {\dorepeatwithcommand}
+
+% This permits things like ^\index{hans}^, where hans is
+% duplicated in the text.
+
+\newif\ifduplicate
+
+\bgroup
+\gdef\checkduplication% in line with Knuth
+ {\ifmmode
+ \def\next{^}%
+ \else
+ \let\next=\startduplication
+ \fi
+ \next}
+\gdef\insideduplication%
+ {\ifmmode
+ \def\next{^}%
+ \else
+ \let\next=\egroup
+ \fi
+ \next}
+\catcode`\^=\@@active
+\gdef\enableduplication%
+ {\catcode`\^=\@@active
+ \let^=\checkduplication}
+\gdef\disableduplication%
+ {\catcode`\^=\@@superscript}
+\gdef\startduplication%
+ {\bgroup
+ \duplicatetrue
+ \let^=\insideduplication}
+\egroup
+
+\def\verbatim#1%
+ {\convertargument#1\to\ascii\ascii}
+
+% mogelijke optimalisaties:
+%
+% \ifx ...\else ...\fi
+% \ifvisible ... \fi
+
+% De opbouw van deze file
+%
+% Deze file bevat naast de verschillende Pragma-Macro's ook
+% helpinformatie bij deze macro's en templates. Een blok
+% helpinformatie wordt gekenmerkt door een %I.
+%
+% Een blok kan zijn opgedeeld in pagina's. In dat geval is
+% %I vervangen door %P. De eerste regel van een blok bevat
+% de titel van de informatie.
+%
+% Een template (voorgedefinieerde structuur) wordt gekenmerkt
+% door %T. Ook hier bevat de eerste regel een titel,
+% eventueel gevolgd door een mnemonic.
+%
+% Zowel de helpinformatie als de templates zijn in het
+% programma TeXEdit oproepbaar.
+%
+% Het programma TeXEdit kan t.z.t. worden ingesteld met
+% behulp van de onderstaande, door %S voorafgegane,
+% setupcommando's. Vooralsnog is een en ander 'hard' in het
+% programma geprogrammeerd.
+
+%S InputFile \input
+%S InputFile \omgeving \environment
+%S InputFile \projekt \project
+%S InputFile \produkt \product
+%S InputFile \onderdeel \component
+%S
+%S CheckStrings \start \stop
+%S CheckStrings \begin \end
+%S CheckStrings \begin \eind
+%S
+%S CheckChars { }
+%S CheckChars [ ]
+%S CheckChars ( )
+%S
+%S CheckChar $
+
+% Het <pagina>-karakter (FormFeed), wordt omgezet in \par
+
+\edef\oldlinefeed{\the\catcode`\^^L}
+
+\catcode`\^^L=\oldlinefeed
+
+\catcode`\^^L=\@@endofline
+
+%I n=Struts
+%I c=\strut,\setnostrut,\setstrut,\toonstruts
+%I
+%I Struts zijn onzichtbare 'karakters' met alleen een hoogte
+%I en diepte. De volgende commando's hebben betrekking op
+%I struts
+%I
+%I \strut
+%I \setstrut
+%I \setnostrut
+%I \toonstruts
+
+\def\toonstruts%
+ {\setteststrut}
+
+% Hieronder volgen enkele instellingen en macro's ten behoeve
+% van de interlinie en \strut. De waarden 2.8, 0.07, 0.72 en
+% 0.28 zijn ooit eens ontleend aan INRS-TEX en moeten wellicht
+% nog eens instelbaar worden.
+%
+% \lineheight : de hoogte van een regel
+% \spacing{getal} : instellen interlinie
+% \normalbaselines : instellen regelafstend
+%
+% \setstrut : instellen \strut
+% \setnostrut : resetten \strut, \endstrut, \begstrut
+%
+% \setteststrut : instellen zichtbare struts
+% \resetteststrut : instellen onzichtbare struts
+%
+% \setfontparameters : instellen na fontset
+%
+% De hoogte van een regel (\lineheight) is gelijk aan de
+% som van de hoogte (\ht) en diepte (\dp) van \strutbox.
+%
+% \strut : denkbeeldig blokje met hoogte en diepte
+%
+% Een \hbox kan als deze aan het begin van een regel staat
+% een breedte \hsize krijgen. Dit is soms te voorkomen met het
+% commando \leavevmode. Binnen een \vbox geeft dit echter
+% niet altijd het gewenste resultaat, vandaar het commando
+%
+% \leaveoutervmode
+
+% Pas op: niet zomaar \topskip en \baselineskip aanpassen
+% en zeker niet \widowpenalty. Dit kan ernstige gevolgen
+% hebben voor kolommen.
+%
+% Enige glue kan op zich geen kwaad, echter als blanko=vast,
+% dan moet ook de rek 0 zijn. Binnen kolommen is rek ook
+% niet bepaald mooi. Een hele kleine waarde (0.025) voldoet,
+% omdat een positieve glue eindeloos rekbaar is.
+
+\newdimen\strutdimen
+\newdimen\lineheight
+\newdimen\openlineheight
+\newdimen\openstrutheight
+\newdimen\openstrutdepth
+
+\def\strutheightfactor {.72}
+\def\strutdepthfactor {.28}
+
+\def\baselinefactor {2.8}
+\def\baselinegluefactor {0}
+
+\def\normallineheight {\baselinefactor ex}
+
+\def\strutheight {0pt}
+\def\strutdepth {0pt}
+\def\strutwidth {0pt}
+
+\def\spacingfactor {1}
+
+\def\topskipfactor {1.0}
+\def\maxdepthfactor {0.4}
+
+\def\systemtopskipfactor {\topskipfactor}
+\def\systemmaxdepthfactor {\maxdepthfactor}
+
+% De onderstaande definitie wordt in de font-module overruled
+
+\ifx\globalbodyfontsize\undefined
+ \newdimen\globalbodyfontsize
+ \globalbodyfontsize=12pt
+\fi
+\ifx\normalizedbodyfontsize\undefined
+ \def\normalizedbodyfontsize{12pt}
+\fi
+
+% door een \dimen. Dit is geen probleem omdat (1) de default
+% korpsgrootte 12pt is en (2) de fonts nog niet geladen zijn
+% en de instellingen bij het laden nogmaals plaatsvinden.
+
+\def\topskipcorrection%
+ {\ifdim\topskip>\openstrutheight
+ \vskip\topskip
+ \vskip-\openstrutheight
+ \fi
+ \vbox{\strut}
+ \vskip-\openlineheight}
+
+\def\settopskip% the extra test is needed for the lbr family
+ {\topskip=\systemtopskipfactor\globalbodyfontsize
+ \ifgridsnapping \else
+ \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi
+ \fi
+ \relax % the skip
+ \ifdim\topskip<\strutheightfactor\openlineheight
+ \topskip=\strutheightfactor\openlineheight\relax
+ \fi}
+
+\def\setmaxdepth%
+ {\maxdepth=\systemmaxdepthfactor\globalbodyfontsize}
+
+\def\normalbaselines%
+ {\baselineskip\normalbaselineskip
+ \lineskip\normallineskip
+ \lineskiplimit\normallineskiplimit}
+
+\def\setnormalbaselines%
+ {\lineheight=\normallineheight
+ \openlineheight=\spacingfactor\lineheight
+\openstrutheight=\strutheightfactor\openlineheight
+\openstrutdepth =\strutdepthfactor \openlineheight
+ \normalbaselineskip=
+ \openlineheight
+ \!!plus\baselinegluefactor\openlineheight
+ \!!minus\baselinegluefactor\openlineheight
+ \normallineskip\!!onepoint\relax
+ \normallineskiplimit\!!zeropoint\relax
+ \normalbaselines}
+
+\def\setspacingfactor#1\to#2\by#3\\%
+ {\strutdimen=#2pt\relax
+ \strutdimen=#3\strutdimen
+ \edef#1{\withoutpt{\the\strutdimen}}}
+
+\def\spacing#1%
+ {\ifgridsnapping
+ \edef\spacingfactor{1}%
+ \showmessage{\m!layouts}{11}{#1}%
+ \else
+ \edef\spacingfactor{#1}%
+ \fi
+ \setspacingfactor\systemtopskipfactor\to\topskipfactor\by#1\\%
+ \setspacingfactor\systemmaxdepthfactor\to\maxdepthfactor\by#1\\%
+ \setnormalbaselines
+ \setstrut}
+
+\def\setstrutdimen#1#2#3% % een strut is n.m maal ex
+ {\strutdimen=\normallineheight % wat niet per se \lineheight
+ \strutdimen=#2\strutdimen % is omdat een strut lokaal
+ \strutdimen=#3\strutdimen % kan afwijken van de globale
+ \edef#1{\the\strutdimen}} % strut
+
+\let\normalstrut=\strut
+
+% The double \hbox construction enables us to \backtrack
+% boxes.
+
+\def\setstrut%
+ {\setstrutdimen\strutheight\strutheightfactor\spacingfactor
+ \setstrutdimen\strutdepth \strutdepthfactor \spacingfactor
+ \let\strut=\normalstrut
+ \setbox\strutbox=\normalhbox
+ {\normalhbox
+ {\vrule
+ \!!width \strutwidth
+ \!!height \strutheight
+ \!!depth \strutdepth
+ \normalkern-\strutwidth}}}
+
+\def\setteststrut%
+ {\def\strutwidth{.8pt}%
+ \setstrut}
+
+\def\begstrut%
+ {\relax\ifdim\ht\strutbox=\!!zeropoint \else
+ \strut
+ \normalpenalty\!!tenthousand
+ \normalhskip\!!zeropoint
+ \ignorespaces
+ \fi}
+
+\def\endstrut%
+ {\relax\ifdim\ht\strutbox=\!!zeropoint \else
+ \unskip
+ \normalpenalty\!!tenthousand
+ \normalhskip\!!zeropoint
+ \strut
+ \fi}
+
+\def\setnostrut%
+ {\setbox\strutbox=\normalhbox{\normalhbox{}}%
+ \let\strut=\empty
+ \let\endstrut=\empty
+ \let\begstrut=\empty}
+
+\def\resetteststrut%
+ {\let\strutwidth=\!!zeropoint
+ \setstrut}
+
+\def\setfontparameters%
+ {\the\everybodyfont}
+
+% \setnormalbaselines
+% \setstrut
+% \settopskip
+% \setmaxdepth
+% \the\EveryFontSwitch
+
+%D We need \type{\normaloffinterlineskip} because the new
+%D definition contains an assignment, and |<|don't ask me
+%D why|>| this assignment gives troubles in for instance the
+%D visual debugger.
+
+\ifx\undefined\normaloffinterlineskip
+ \let\normaloffinterlineskip=\offinterlineskip % knuth's original
+\fi
+
+\def\offinterlineskip%
+ {\edef\oninterlineskip%
+ {\baselineskip=\the\baselineskip
+ \lineskip=\the\lineskip
+ \lineskiplimit=\the\lineskiplimit
+ \noexpand\let\noexpand\offinterlineskip=\noexpand\normaloffinterlineskip}%
+ \normaloffinterlineskip}
+
+\let\oninterlineskip=\relax
+
+\def\leaveoutervmode%
+ {\ifvmode\ifinner\else
+ \leavevmode
+ \fi\fi}
+
+% We passen ook de \displayskip's wat aan (nog eens uitzoeken):
+
+\def\displayskipsize#1#2%
+ {#1\lineheight\!!plus#2\lineheight\!!minus#2\lineheight}
+
+\def\displayskipfactor {1.0}
+\def\displayshortskipfactor {0.8}
+
+\def\displayskipgluefactor {0.3}
+\def\displayshortskipgluefactor {0.2}
+
+\def\abovedisplayskipsize% doet niets ?
+ {\displayskipsize\displayskipfactor\displayskipgluefactor}
+
+\def\belowdisplayskipsize% doet niets ?
+ {\displayskipsize\displayskipfactor\displayskipgluefactor}
+
+\def\abovedisplayshortskipsize%
+ {\displayskipsize\displayshortskipfactor\displayshortskipgluefactor}
+
+\def\belowdisplayshortskipsize%
+ {\displayskipsize\displayshortskipfactor\displayshortskipgluefactor}
+
+\def\setdisplayskip#1#2#3%
+ {#1=#2\relax
+ \advance#1 by -\parskip
+ \advance#1 by -#3\relax}
+
+\def\setdisplayskips%
+ {\setdisplayskip\abovedisplayskip\abovedisplayskipsize\baselineskip
+ \setdisplayskip\belowdisplayskip\belowdisplayskipsize\!!zeropoint
+ \setdisplayskip\abovedisplayshortskip\abovedisplayshortskipsize\baselineskip
+ \setdisplayskip\belowdisplayshortskip\belowdisplayshortskipsize\!!zeropoint}
+
+% We stellen enkele penalties anders in dan Plain TEX:
+
+\def\defaultwidowpenalty{2000} % was: 1000
+\def\defaultclubpenalty {2000} % was: 800
+
+\widowpenalty=\defaultwidowpenalty\relax
+\clubpenalty =\defaultclubpenalty \relax
+
+% Bovendien definieren we enkele extra \fill's:
+
+\def\hfilll%
+ {\hskip\!!zeropoint\!!plus1filll\relax}
+
+\def\vfilll%
+ {\vskip\!!zeropoint\!!plus1filll\relax}
+
+% De onderstaande hulpmacro's moeten nog eens instelbaar worden
+% gemaakt.
+
+\def\tfskipsize{1em\relax}
+
+\def\tfkernsize{1ex\relax}
+
+\def\tfskip%
+ {{\tf\hskip\tfskipsize}}
+
+\def\tfkern%
+ {{\tf\kern\tfkernsize}}
+
+% Dit hoort eigenlijk thuis onder het kopje boodschappen cq,
+% meldingen.
+
+\def\mindermeldingen%
+ {\hbadness=10000
+ \hfuzz=\maxdimen
+ \vbadness=10000
+ \vfuzz=\maxdimen}
+
+% Utility-file
+%
+% De onderstaande macro's ondersteunen het gebruik van de
+% zogeheten utility-file. Alle extern onder te brengen
+% informatie wordt opgeslagen in de file \jobname.tui, tenzij
+% er selectief pagina's worden gezet. In dat geval wordt de
+% file \jobname.tmp gebruikt. Informatie wordt ingelezen uit
+% de file \jobname.tuo, welke door TeXUtil wordt aangemaakt.
+
+% Bepaalde commando's worden als string weggeschreven. Deze
+% zijn aan het eind van deze file gedefinieerd.
+
+% Om een opbouw van spaties te voorkomen (???) moet ^^M een
+% andere betekenis krijgen:
+%
+% \catcode`\^^M=14 (comment)
+%
+% read file
+%
+% \catcode`\^^M=5 (end of line)
+
+\newwrite\uti
+\newif\ifutilitydone
+
+\def\@@utilityerrormessage%
+ {\showmessage{\m!systems}{8}{}%
+ \global\let\@@utilityerrormessage=\relax}
+
+\def\thisisutilityversion#1%
+ {\doifnot{\utilityversion}{#1}%
+ {\@@utilityerrormessage
+ \resetutilities
+ \endinput}}
+
+\def\writeutility%
+ {\write\uti}
+
+\def\immediatewriteutility%
+ {\immediate\write\uti}
+
+\def\writeutilitycommand#1%
+ {\writeutility{c \string#1}}
+
+\def\immediatewriteutilitycommand#1%
+ {\immediatewriteutility{c \string#1}}
+
+\def\openutilities%
+ {\immediate\openout\uti=\jobname.\f!inputextension
+ \immediatewriteutilitycommand%
+ {\thisisutilityversion{\utilityversion}}}
+
+\def\closeutilities%
+ {\savenofsubpages
+ \savenofpages
+ \immediate\closeout\uti
+ \reportutilityproblems}
+
+\def\abortutilitygeneration%
+ {\immediatewriteutilitycommand{\utilitygenerationaborted}%
+ \immediatewriteutility{q {quit}}}
+
+\def\utilitygenerationaborted%
+ {\showmessage{\m!systems}{21}{}%
+ \global\let\utilitygenerationaborted=\endinput
+ \gdef\reportutilityproblems{\showmessage{\m!systems}{22}{}}%
+ \endinput}
+
+\let\reportutilityproblems=\relax
+
+\let\utilityresetlist=\empty
+
+\def\addutilityreset#1%
+ {\addtocommalist{\s!reset#1}\utilityresetlist}
+
+\def\resetutilities%
+ {\processcommacommand[\utilityresetlist]\getvalue}
+
+% #1=type
+% #2=file
+% #3=melding
+
+% #4=voor
+% #5=na
+
+% Er wordt gegroepeerd. Als binnen een lijst (bijvoorbeeld) de
+% \leftskip is aangepast, maar nog geen \par is gegeven, dan
+% geldt buiten de groep de oude \leftskip. Aan #5 kan dan
+% ook \par worden meegegeven om de paragraaf af te sluiten.
+
+\newif\ifdoinpututilities
+\newif\ifunprotectutilities % voor't geval er \v!xxxxxx's zijn
+
+\def\utilitycheckmessage%
+ {\showmessage{\m!systems}{12}{}%
+ \global\let\utilitycheckmessage=\relax}
+
+\def\saveutilityline#1 #2\txen% tricky maar ok, want achter \command
+ {\if #1c% commands % in \ascii staat een spatie; #1 kan
+ \write\scratchwrite{#2}% % \par in stringvorm zijn (eof)!
+ \else\if#1s% synoniems
+ \utilitycheckmessage
+ \else\if#1r% registers
+ \utilitycheckmessage
+ \fi\fi\fi}
+
+\def\checkutilityfile%
+ {\doiflocfileelse{\jobname.\f!outputextension}
+ {}
+ {\doiflocfileelse{\jobname.\f!inputextension}
+ {\bgroup
+ \showmessage{\m!systems}{11}{}%
+ \openout\scratchwrite=\jobname.\f!outputextension
+ \openlocin\scratchread{\jobname.\f!inputextension}%
+ \def\doprocessline%
+ {\ifeof\scratchread
+ \def\doprocessline{\closein\scratchread}%
+ \else
+ \read\scratchread to \ascii
+ \convertcommand\ascii\to\ascii
+ \expandafter\saveutilityline\ascii\txen
+ \fi
+ \doprocessline}%
+ \doprocessline
+ \closeout\scratchwrite
+ \egroup}
+ {}}}
+
+\long\def\doutilities#1#2#3#4#5% % introduceren in utility file
+ {%\ifprocessingverbatim
+ % \showmessage{\m!systems}{1}{}%
+ %\else
+\restorecatcodes
+ \resetutilities
+ \def\docommando##1% % zo kunnen meerdere dingen
+ {\getvalue{\s!set##1}}% % in een pass worden gedaan,
+ \processcommacommand[#1]\docommando % zie bijvoorbeeld lijsten
+ \begingroup
+ \footnotesenabledfalse
+ \doinpututilitiestrue
+ \global\utilitydonefalse
+ \catcode`\%=\@@comment\relax
+ \pushendofline % geeft problemen zodra andere file wordt ingelezen
+ \ifunprotectutilities % nog nodig ?
+ \unprotect
+ \fi
+ \ifnum\catcode`\@=\@@active \else
+ \catcode`\@=\@@letter % permits expanded commands with \@'s
+ \fi
+ \ifnum\catcode`\!=\@@active \else
+ \catcode`\!=\@@letter % permits multilingual constants
+ \fi
+ #4\readjobfile{#2.\f!outputextension}{}{}#5%
+ \relax
+ \ifunprotectutilities
+ \protect
+ \fi
+ \popendofline
+ \ifutilitydone\else
+ \doifnot{#3}{}
+ {\showmessage{\m!systems}{9}{{#3}}%
+ \ifvoorlopig
+ \blanko
+ \type{[\currentmessagetext]}%
+ \blanko
+ \fi}%
+ \fi
+ \endgroup
+ }%\fi}
+
+% Commando's ten behoeve van two-pass lists. In principe
+% kan alles in een keer worden ingelezen. Omdat de macro's
+% groeien is de kans groot dat het (main) geheugen door
+% (de)allocatie volloopt. Vandaar dat we het toch maar niet
+% doen.
+%
+% \definetwopasslist{\s!xxx}
+%
+% \gettwopassdata{\s!xxx}
+% \getfrompassdata{\s!xxx}{n} n=index (getal)
+% \findtwopassdata{\s!xxx}{tag} bijvoorbeeld {label:}
+% \iftwopassdatafound
+% \twopassdata
+%
+% \twopassentry{\s!xxx}{nr}{data} nr alleen voor testdoeleinden
+
+\def\alltwopasslists{}
+
+\newif\iftwopassdatafound
+
+\def\twopassentry#1%
+ {\executeifdefined{@@#1\s!pass}\gobbletwoarguments}
+
+\def\definetwopasslist#1%
+ {\doifundefined{#1:\s!list}
+ {\addtocommalist{#1}\alltwopasslists
+ \doglobal\addutilityreset{#1\s!pass}%
+ \setgvalue{\s!set#1\s!pass}%
+ {\setgvalue{@@#1\s!pass}####1####2%
+ {\debuggerinfo{\m!systems}{twopass data #1 - ####1 = ####2}%
+ \setxvalue{#1:\s!list}{\getvalue{#1:\s!list}####2,}}}%
+ \setgvalue{\s!reset#1\s!pass}%
+ {\setgvalue{@@#1\s!pass}####1####2{}}%
+ \getvalue{\s!reset#1\s!pass}}}
+
+\def\doloadtwopassdata#1%
+ {\doifundefined{#1:\s!list}
+ {\setgvalue{#1:\s!list}{}%
+ \doutilities{#1\s!pass}{\jobname}{}{}{}%
+ \setxvalue{#1:\s!list}{\getvalue{#1:\s!list}0,0}}}
+
+\def\loadtwopassdata%
+ {\processcommacommand[\alltwopasslists]\doloadtwopassdata}
+
+\def\twopassdata{}
+
+\def\dogettwopassdata[#1,#2]#3%
+ {\doifelse{#1}{0}
+ {\twopassdatafoundfalse}
+ {\twopassdatafoundtrue
+ \setxvalue{#3:\s!list}{#2}%
+ \edef\twopassdata{#1}}}
+
+\def\gettwopassdata#1%
+ {\edef\!!stringa{\getvalue{#1:\s!list}}%
+ \debuggerinfo{\m!systems}{twopass get #1 - \!!stringa}%
+ \expandafter\dogettwopassdata\expandafter[\!!stringa]{#1}}
+
+\def\dofindtwopassdata#1#2%
+ {\edef\!!stringa{,\getvalue{#1:\s!list}}%
+ \debuggerinfo{\m!systems}{twopass find #2 - \!!stringa}%
+ \def\dodofindtwopassdata[##1,##2#2##3,##4]%
+ {\def\twopassdata{##3}%
+ \doifelse{##3}{}
+ {\twopassdatafoundfalse}
+ {\twopassdatafoundtrue}}%
+ \@EA\dodofindtwopassdata\@EA[\!!stringa,#2,#2,]}
+
+\def\findtwopassdata%
+ {\ExpandBothAfter\dofindtwopassdata}
+
+\def\dogetfirsttwopassdata[#1,#2]#3%
+ {\doifelse{#1}{0}
+ {\twopassdatafoundfalse}
+ {\twopassdatafoundtrue
+ \edef\twopassdata{#1}}}
+
+\def\getfirsttwopassdata#1%
+ {\edef\!!stringa{\getvalue{#1:\s!list}}%
+ \expandafter\dogetfirsttwopassdata\expandafter[\!!stringa]{#1}}
+
+\def\getlasttwopassdata#1%
+ {\edef\twopassdata{0}\twopassdatafoundfalse
+ \newcounter\noftwopassitems
+ \def\docommando##1%
+ {\doifnot{##1}{0}
+ {\increment\noftwopassitems
+ \edef\twopassdata{##1}\twopassdatafoundtrue}}%
+ \processcommacommand[\getvalue{#1:\s!list}]\docommando}
+
+\def\getfromtwopassdata#1#2%
+ {\getfromcommacommand[\getvalue{#1:\s!list}][#2]%
+ \doifelsenothing{\commalistelement}
+ {\twopassdatafoundfalse}
+ {\twopassdatafoundtrue
+ \let\twopassdata=\commalistelement}}
+
+% Maten
+%
+% De onderstaande instellingen worden gebruikt voor het
+% vastleggen van de zetspiegel en marges.
+
+\voffset=0pt % setting this to -1in let's go metapost crazy
+\hoffset=0pt % setting this to -1in let's go metapost crazy
+
+\newdimen\papierhoogte
+\newdimen\papierbreedte
+
+\newdimen\printpapierhoogte
+\newdimen\printpapierbreedte
+
+\newdimen\zethoogte
+\newdimen\zetbreedte
+
+\newdimen\teksthoogte
+\newdimen\tekstbreedte
+
+\newdimen\kopwit \kopwit=2cm
+\newdimen\rugwit \rugwit=2cm
+
+\newdimen\hoofdhoogte \hoofdhoogte=2cm
+\newdimen\voethoogte \voethoogte=2cm
+
+%\newdimen\kopkopwit \kopkopwit=0cm
+
+\newdimen\kopoffset \kopoffset=\!!zeropoint
+\newdimen\rugoffset \rugoffset=\!!zeropoint
+
+\newdimen\linkermargebreedte \linkermargebreedte=3cm
+\newdimen\rechtermargebreedte \rechtermargebreedte=\linkermargebreedte
+
+\newdimen\linkerrandbreedte \linkerrandbreedte=3cm
+\newdimen\rechterrandbreedte \rechterrandbreedte=\linkerrandbreedte
+
+\newdimen\bovenhoogte \bovenhoogte=1cm
+\newdimen\onderhoogte \onderhoogte=\bovenhoogte
+
+\def\margeafstand%
+ {\@@lymargeafstand}
+
+\def\randafstand%
+ {\@@lyrandafstand}
+
+\def\margebreedte%
+ {\@@lymarge}
+
+\def\randbreedte%
+ {\@@lyrand}
+
+\def\linkerrandafstand%
+ {\ifdim\!!zeropoint<\linkerrandbreedte
+ \@@lylinkerrandafstand
+ \else
+ \!!zeropoint
+ \fi}
+
+\def\rechterrandafstand%
+ {\ifdim\!!zeropoint<\rechterrandbreedte
+ \@@lyrechterrandafstand
+ \else
+ \!!zeropoint
+ \fi}
+
+\def\linkermargeafstand%
+ {\ifdim\!!zeropoint<\linkermargebreedte
+ \@@lylinkermargeafstand
+ \else
+ \!!zeropoint
+ \fi}
+
+\def\rechtermargeafstand%
+ {\ifdim\!!zeropoint<\rechtermargebreedte
+ \@@lyrechtermargeafstand
+ \else
+ \!!zeropoint
+ \fi}
+
+\def\bovenafstand%
+ {\ifdim\!!zeropoint<\bovenhoogte
+ \@@lybovenafstand
+ \else
+ \!!zeropoint
+ \fi}
+
+\def\hoofdafstand%
+ {\ifdim\!!zeropoint<\hoofdhoogte
+ \@@lyhoofdafstand
+ \else
+ \!!zeropoint
+ \fi}
+
+\def\voetafstand%
+ {\ifdim\!!zeropoint<\voethoogte
+ \@@lyvoetafstand
+ \else
+ \!!zeropoint
+ \fi}
+
+\def\onderafstand%
+ {\ifdim\!!zeropoint<\onderhoogte
+ \@@lyonderafstand
+ \else
+ \!!zeropoint
+ \fi}
+
+\newif\ifdubbelzijdig
+\dubbelzijdigfalse
+
+\newif\ifenkelzijdig
+\enkelzijdigtrue
+
+\def\doifsometextlineelse#1#2#3% ! omgekeerd !
+ {\doifinsetelse{\getvalue{\??tk#1\v!tekst\c!status}}{\v!geen,\v!hoog}
+ {#3}{#2}}
+
+\def\calculatevsizes% global needed in \resetlayoutregel
+ {\redoglobal\teksthoogte=\zethoogte
+ %\redoglobal\kopkopwit=\kopwit
+ %\redoglobal\advance\kopkopwit by \hoofdhoogte
+ %\redoglobal\advance\kopkopwit by \hoofdafstand
+ \doifsometextlineelse{\v!hoofd}
+ {\redoglobal\advance\teksthoogte by -\hoofdhoogte
+ \redoglobal\advance\teksthoogte by -\hoofdafstand}
+ {}%
+ \doifsometextlineelse{\v!voet}
+ {\redoglobal\advance\teksthoogte by -\voethoogte
+ \redoglobal\advance\teksthoogte by -\voetafstand}
+ {}%
+ \resetglobal
+ \setvsize}
+
+\def\calculatereducedvsizes%
+ {\teksthoogte=\zethoogte
+ \doifsometextlineelse{\v!hoofd}
+ {\advance\teksthoogte by -\hoofdhoogte
+ \advance\teksthoogte by -\hoofdafstand}
+ {\hoofdhoogte=\!!zeropoint}%
+ \doifsometextlineelse{\v!voet}
+ {\advance\teksthoogte by -\voethoogte
+ \advance\teksthoogte by -\voetafstand}
+ {\voethoogte=\!!zeropoint}}
+
+\def\calculatehsizes%
+ {\tekstbreedte=\zetbreedte
+ \sethsize}
+
+\def\sethsize%
+ {\global\hsize=\tekstbreedte}
+
+\def\setvsize%
+ {\ifdim\vsize=\teksthoogte
+ \else
+ \bgroup
+ \dimen0=-\vsize
+ \advance\dimen0 by \teksthoogte
+ \global\advance\vsize by \dimen0
+%\ifgridsnapping % evt altijd, nog testen
+% \getnoflines\vsize
+% \vsize=\noflines\openlineheight % local is better and ok
+% \advance\vsize by .5\openlineheight % collect enough data
+%\fi
+ \ifdim\pagegoal<\maxdimen
+ \advance\dimen0 by \pagegoal
+ \global\pagegoal=\dimen0
+ \fi
+ \egroup
+ \fi}
+
+% Algemeen
+%
+% De Pragma-macros zijn samengesteld met behulp van de
+% commandos van PlainTeX- en enkele TugBoat routines.
+%
+% Voor de volledigheid zijn in de definitie steeds de
+% {}-haakjes vermeld. Deze haakjes zijn niet altijd
+% nodig, Als bijvoorbeeld een paragraaf bewerkt wordt,
+% kunnen ze achterwege blijven.
+%
+% Instellingen worden opgegeven tussen []-haakjes,
+% meestal direct na het commando. Instellingen mogen
+% soms achterwege blijven.
+%
+% Een aantal veelgebruikte macro's zijn in TeXEdit op
+% naam en/of door middel van een mnemonic oproepbaar.
+
+% %I n=Offset
+% %I c=\steloffsetin
+% %I
+% %I De totale bladzijde kan verschoven worden ten opzichte
+% %I van de linkerbovenhoek met:
+% %I
+% %I \steloffsetin[rug=,kop=]
+% %I
+% %I Dit commando moet worden gegeven aan het begin van de
+% %I pagina waarvoor het moet gelden. Er kunnen positieve
+% %I en negatieve waarden worden ingevuld: -10pt, 1.5cm.
+%
+% \def\dosteloffsetin[#1]%
+% {\getparameters
+% [\??os]
+% [\c!rug=\rugoffset,
+% \c!kop=\kopoffset,
+% #1]%
+% \rugoffset=\@@osrug
+% \kopoffset=\@@oskop}
+%
+% \def\steloffsetin%
+% {\dosingleargument\dosteloffsetin}
+
+% De onderstaande macro voert commando's uit, afhankelijk van
+% het karakter van het paginanummer.
+%
+% \doifonevenpaginaelse{then-commando}{else-commando}
+
+% NB \userpageno vervangen door \realpageno
+
+\def\doifonevenpaginaelse#1#2%
+ {\ifodd\realpageno#1\else#2\fi}
+
+\def\doifbothsidesoverruled#1\orsideone#2\orsidetwo#3\od%
+ {\ifdubbelzijdig
+ \ifodd\realpageno#2\relax\else#3\relax\fi
+ \else
+ #1\relax
+ \fi}
+
+\def\doifbothsides#1\orsideone#2\orsidetwo#3\od%
+ {\ifdubbelzijdig
+ \ifenkelzijdig
+ #1\relax
+ \else
+ \ifodd\realpageno#2\relax\else#3\relax\fi
+ \fi
+ \else
+ #1\relax
+ \fi}
+
+\def\dostartglobaldefs#1#2%
+ {\edef\!!stringa{\the\globaldefs}%
+ \ifnum\globaldefs#10
+ \globaldefs=-\globaldefs
+ \fi
+ \advance\globaldefs by #21
+ \setevalue{@gd@\the\globaldefs}{\!!stringa}}
+
+\def\dostopglobaldefs%
+ {\doifdefinedelse{@gd@\the\globaldefs}
+ {\globaldefs=\getvalue{@gd@\the\globaldefs}\relax}
+ {\globaldefs=0\relax}}
+
+\def\startlocal {\dostartglobaldefs>-}
+\def\stoplocal {\dostopglobaldefs}
+\def\startglobal {\dostartglobaldefs<+}
+\def\stopglobal {\dostopglobaldefs}
+
+%I n=Zetspiegel
+%I c=\stellayoutin,\definieerpapierformaat,\stelpapierformaatin
+%I c=\paslayoutaan
+%I
+%I De zetspiegel is het door de tekst gevormde vlak.
+%I Hiertoe behoren ¢¢k de hoofd- en voetmarge. De zetspiegel
+%I wordt ingesteld met:
+%I
+%I \stellayoutin[breedte=,hoogte=,rugwit=,kopwit=]
+%I
+%I Er dienen maten te worden ingevuld, waarbij de eenheid
+%I direkt achter het getal staat: 10pt, 100mm, 5cm, 3.5in.
+%I
+%I De parameters hebben de volgende betekenis:
+%I
+%I breedte breedte van het tekstvlak, inclusief marges
+%I hoogte hoogte van het tekstvlak, inclusief marges
+%I rugwit witruimte aan de binnenzijde, zonder marge
+%I kopwit witruimte aan de bovenzijde, zonder marge
+%P
+%I Rond de zetspiegel vinden we marges, randen, het hoofd en
+%I de voet. Ook deze worden ingesteld met:
+%I
+%I \stellayoutin[breedte=,hoogte=,rugwit=,kopwit=]
+%I
+%I hoofd hoogte van de bovenmarge binnen de zetspiegel
+%I voet hoogte van de ondermarge binnen de zetspiegel
+%I marge breedte van de marge naast de zetspiegel
+%I
+%I en
+%I
+%I rand breedte van de rand naast de marge
+%I boven hoogte van de rand boven het hoofd
+%I onder hoogte van de rand onder de voet
+%I
+%I Alleen het hoofd en de voet hangen dus samen met de
+%I zetspiegel.
+%P
+%I Eventueel kunnen de linker- en rechtermarge en apart
+%I worden ingesteld:
+%I
+%I \stellayoutin[linkermarge=,rechtermarge=]
+%I
+%I Het zelfde geldt voor de randen. In dat geval wordt bij
+%I dubbelzijdig zetten gespiegeld. Oppassen dus!
+%I
+%I De afstanden tussen marges, randen enz. kunnen worden
+%I ingesteld met:
+%I
+%I bovenafstand, onderafstand
+%I hoofdafstand,voetafstand
+%I linkermargeafstand,rechtermargeafstand,
+%I linkerrandafstand,rechterrandafstand
+%P
+%I De zetspiegel kan (tijdelijk) worden aangepast met het
+%I commando:
+%I
+%I \paslayoutaan[hoogte=]
+%I
+%I Men dient een positieve (+) of negatieve (-) maat op te
+%I geven. De zethoogte blijft gelijk, maar de teksthoogte
+%I wordt aangepast ten koste van de voethoogte. Eventueel
+%I kan 'max' worden opgegeven.
+%I
+%I Er kan een reeks aanpassingen worden opgegeven:
+%I
+%I \paslayoutaan[nr,nr,nr,...][hoogte=]
+%I
+%I Hierbij is staat nr voor het paginanummer, dat wil
+%I zeggen: het volgnummer in de tekst.
+%I
+%I Bij voorlopige versies wordt onderaan de pagina de
+%I aanpassing weergegeven.
+%P
+%I Beeldmerken en achtergronden worden uit oogpunt van
+%I verwerkingssnelheid niet vaker berekend dan nodig. Mocht
+%I om een of andere reden een beeldmerk of achtergrond niet
+%I overeenkomen komen met de wensen, dan kan herberekenen
+%I worden geforceerd met:
+%I
+%I \stellayoutin[reset]
+%P
+%I Het papierformaat is in te stellen met het commando
+%I
+%I \stelpapierformaatin[DIN-formaat]
+%I
+%I Mogelijke DIN-formaten zijn A4 tot en met A9. De
+%I afmetingen van een A4 zijn:
+%I
+%I breedte : 21.0cm = 8.18in = 589pt
+%I hoogte : 29.7cm = 11.58in = 834pt
+%I
+%I Optioneel kan men het printer papierformaat instellen door
+%I een tweede argument mee te geven. Standaard wordt
+%I uitgegaan van A4.
+%I
+%I \stelpapierformaatin[A5][A4]
+%I
+%P Men kan zelf een papierformaat definieren met
+%I
+%I \definieerpapierformaat [naam] [hoogte=,breedte=]
+%I
+%I waarbij de offset betrekking heeft op dubbelzijdig zetten.
+
+\def\dodefinieerpapierformaat[#1][#2]%
+ {\getparameters
+ [\??pp#1] % geen \c!schaal, scheelt hash ruimte
+ [\c!breedte=\@@ppbreedte,\c!hoogte=\@@pphoogte,#2]}
+
+\def\definieerpapierformaat%
+ {\dodoubleargument\dodefinieerpapierformaat}
+
+\definieerpapierformaat[][\c!breedte=210mm,\c!hoogte=297mm]
+
+\chardef\papermirror =0
+\chardef\printmirror =0
+\chardef\paperrotation =0
+\chardef\paperreverse =0
+\chardef\printrotation =0
+\chardef\printreverse =0
+\chardef\paperlandscape=0
+\chardef\printlandscape=0
+
+\def\papierschaal{1}
+
+\newif\ifnegateprintbox
+
+\def\dostelpapierrichtingin#1#2#3#4#5%
+ {\global\chardef#2=0
+ \global\chardef#5=0
+ \gdef#3{0}%
+ \gdef#4{0}%
+ \global\negateprintboxfalse
+ \processallactionsinset
+ [#1]
+ [ \v!liggend=>\global\chardef#2=1,
+ \v!gespiegeld=>\global\chardef#5=1,
+ \v!geroteerd=>\gdef#3{90}\gdef#4{270},
+ \v!negatief=>\global\negateprintboxtrue,
+ 90=>\gdef#3{90}\gdef#4{270},
+ 180=>\gdef#3{180}\gdef#4{0},
+ 270=>\gdef#3{270}\gdef#4{90}]}
+
+\def\dostelpapierformaatin[#1][#2]%
+ {\dostelpapierrichtingin{#1}\paperlandscape\paperrotation\paperreverse\papermirror
+ \dostelpapierrichtingin{#2}\printlandscape\printrotation\printreverse\printmirror
+ \def\docommando##1%
+ {\doifsomething{##1}{\doifdefined{\??pp##1\c!breedte}
+ {\gdef\papierformaat{##1}%
+ \global\papierbreedte=\getvalue{\??pp##1\c!breedte}%
+ \global\papierhoogte=\getvalue{\??pp##1\c!hoogte}}}}%
+ \processcommalist[#1]\docommando
+ \doifdefinedelse{\??pp#1\c!schaal}
+ {\edef\papierschaal{\getvalue{\??pp#1\c!schaal}}}
+ {\edef\papierschaal{1}}%
+ \def\docommando##1%
+ {\doifsomething{##1}{\doifdefined{\??pp##1\c!breedte}
+ {\global\printpapierbreedte=\getvalue{\??pp##1\c!breedte}%
+ \global\printpapierhoogte=\getvalue{\??pp##1\c!hoogte}}}}%
+ \processcommalist[#2]\docommando
+ \ifnum\paperlandscape>0
+ \doglobal\swapdimens\papierbreedte\papierhoogte
+ \fi
+ \ifnum\printlandscape>0
+ \doglobal\swapdimens\printpapierbreedte\printpapierhoogte
+ \fi
+ \ifdim\papierhoogte>\printpapierhoogte
+ \global\printpapierhoogte=\papierhoogte
+ \fi
+ \ifdim\papierbreedte>\printpapierbreedte
+ \global\printpapierbreedte=\papierbreedte
+ \fi
+ \calculatehsizes
+ \calculatevsizes
+ \global\newlogostrue
+ \global\newbackgroundtrue
+ \resetlayout}
+
+\def\stelpapierformaatin%
+ {\dodoubleempty\dostelpapierformaatin}
+
+\def\checkforems[#1]%
+ {\def\docommando##1%
+ {\beforesplitstring##1\at em\to\asciia
+ \doifnot{\asciia}{##1}
+ {\aftersplitstring\asciia\at=\to\asciia
+ \doifsomething{\asciia}
+ {\showmessage{\m!systems}{10}{##1}}}}%
+ \processcommalist[#1]\docommando}
+
+\def\resetlayout%
+ {\global\linkermargebreedte=\@@lylinkermarge
+ \global\rechtermargebreedte=\@@lyrechtermarge
+ \global\linkerrandbreedte=\@@lylinkerrand
+ \global\rechterrandbreedte=\@@lyrechterrand
+ \global\hoofdhoogte=\@@lyhoofd
+ \global\voethoogte=\@@lyvoet
+ \global\onderhoogte=\@@lyonder
+ \global\bovenhoogte=\@@lyboven
+ \global\rugwit=\@@lyrugwit
+ \global\kopwit=\@@lykopwit
+ \doifelse{\@@lygrid}{\v!ja}
+ {\gridsnappingtrue}
+ {\gridsnappingfalse}%
+\ifgridsnapping
+ \widowpenalty=0 % is gewoon beter
+ \clubpenalty =0 % zeker bij grids
+\else
+ \widowpenalty=\defaultwidowpenalty
+ \clubpenalty=\defaultclubpenalty
+\fi
+ \stelwitruimtein
+ \stelblankoin
+ \doifelse{\@@lybreedte}{\v!midden}
+ {\global\zetbreedte=\papierbreedte
+ \global\advance\zetbreedte by -2\rugwit}
+ {\doifelse{\@@lybreedte}{\v!passend}
+ {\global\zetbreedte=\papierbreedte
+ \global\advance\zetbreedte by -\rugwit
+ \scratchdimen=\rugwit
+ \advance\scratchdimen by -\linkerrandbreedte
+ \advance\scratchdimen by -\linkerrandafstand
+ \advance\scratchdimen by -\paginascheiding
+ \advance\scratchdimen by -\linkermargebreedte
+ \advance\scratchdimen by -\linkermargeafstand
+ \ifdim\scratchdimen<\!!zeropoint
+ \scratchdimen=\!!zeropoint
+ \fi
+ \global\advance\zetbreedte by -\rechtermargeafstand
+ \global\advance\zetbreedte by -\rechtermargebreedte
+ \global\advance\zetbreedte by -\paginascheiding
+ \global\advance\zetbreedte by -\rechterrandafstand
+ \global\advance\zetbreedte by -\rechterrandbreedte
+ \global\advance\zetbreedte by -\scratchdimen}
+ {\global\zetbreedte=\@@lybreedte}}%
+ \doifelse{\@@lyregels}{}
+ {\doifelse{\@@lyhoogte}{\v!midden}
+ {\global\zethoogte=\papierhoogte
+ \global\advance\zethoogte by -2\kopwit}
+ {\doifelse{\@@lyhoogte}{\v!passend}
+ {\global\zethoogte=\papierhoogte
+ \global\advance\zethoogte by -\kopwit
+ \scratchdimen=\kopwit
+ \advance\scratchdimen by -\bovenhoogte
+ \advance\scratchdimen by -\bovenafstand
+ \ifdim\scratchdimen<\!!zeropoint
+ \scratchdimen=\!!zeropoint
+ \fi
+ \global\advance\zethoogte by -\onderafstand
+ \global\advance\zethoogte by -\onderhoogte
+ \global\advance\zethoogte by -\scratchdimen}
+ {\global\zethoogte=\@@lyhoogte}}}
+ {\global\zethoogte=\@@lyregels\baselineskip
+ \global\advance\zethoogte by \hoofdhoogte
+ \global\advance\zethoogte by \voethoogte}%
+ \rugoffset=\@@lyrugoffset
+ \kopoffset=\@@lykopoffset
+ \calculatehsizes
+ \calculatevsizes
+ \global\newlogostrue
+ \global\newbackgroundtrue}
+
+\newif\ifdoublesidedprint
+
+\def\setcenterpagebox#1#2#3#4%
+ {\let\leftpagebox =#1%
+ \let\rightpagebox =#2%
+ \let\toppagebox =#3%
+ \let\bottompagebox=#4}%
+
+\def\presetcenterpagebox% in \stellayoutin !!!!!!!!!!!!!!!!
+ {\setcenterpagebox\relax\hss\relax\vss
+ \doublesidedprintfalse
+ \ExpandFirstAfter\processallactionsinset
+ [\@@lyplaats]
+ [ \v!midden=>\setcenterpagebox\hss\hss\vss\vss,
+ \v!links=>\setcenterpagebox\relax\hss\toppagebox\bottompagebox,
+ \v!rechts=>\setcenterpagebox\hss\relax\toppagebox\bottompagebox,
+ \v!onder=>\setcenterpagebox\leftpagebox\rightpagebox\vss\relax,
+ \v!boven=>\setcenterpagebox\leftpagebox\rightpagebox\relax\vss,
+ \v!dubbelzijdig=>\doublesidedprinttrue,
+ \v!enkelzijdig=>\doublesidedprintfalse]}
+
+\def\complexstellayoutin[#1]%
+ {\ConvertToConstant\doifnot{#1}{\v!reset}
+ {\getparameters[\??ly][#1]%
+ \checkforems[#1]}%
+ \resetlayout
+ \presetcenterpagebox}
+
+\def\simplestellayoutin%
+ {\resetlayout
+ \presetcenterpagebox}
+
+\def\stellayoutin%
+ {\complexorsimpleempty{stellayoutin}}
+
+\let\@@zahoogte=\!!zeropoint
+
+\def\dopushpagedimensions%
+ {\xdef\oldteksthoogte{\the\teksthoogte}%
+ \xdef\oldvoethoogte{\the\voethoogte}%
+ \global\let\@@zahoogte=\@@zahoogte}
+
+\def\dopoppagedimensions%
+ {\global\teksthoogte=\oldteksthoogte
+ \global\voethoogte=\oldvoethoogte
+ \resetlayout
+ \global\let\pushpagedimensions=\dopushpagedimensions
+ \global\let\poppagedimensions=\relax}
+
+\let\poppagedimensions=\relax
+\let\pushpagedimensions=\dopushpagedimensions
+
+% Elke \csname ... \endcsname wordt ook aangemaakt, dus ook
+% in een test met \doifdefined. Bij veel bladzijden kan dit
+% te veel macro's kosten. Vandaar de set \adaptedpages. Het
+% kost tijd, maar scheelt macro's.
+
+\def\adaptedpages{}
+
+\def\adaptpagedimensions%
+ {\rawdoifinsetelse{\realfolio}{\adaptedpages}
+ {\getvalue{\??za\realfolio}%
+ \letvalue{\??za\realfolio}=\relax}
+ {}}
+
+\def\checkpagedimensions%
+ {\poppagedimensions
+ \adaptpagedimensions}
+
+\def\reportpagedimensions%
+ {\ifx\poppagedimensions\relax
+ \else
+ \spatie\@@zahoogte\spatie-
+ \fi
+ \realfolio}
+
+\def\dodopaslayoutaan[#1]%
+ {\getparameters[\??za][\c!hoogte=,\c!regels=,#1]%
+ \pushpagedimensions
+ \doifelsenothing{\@@zaregels}
+ {\showmessage{\m!layouts}{1}{\@@zahoogte,\realfolio}}
+ {\showmessage{\m!layouts}{1}{\@@zaregels\space\v!regels,\realfolio}%
+ \def\@@zahoogte{\@@zaregels\openlineheight}}%
+ \doifelse{\@@zahoogte}{\v!max}
+ {\balancedimensions{\teksthoogte}{\voethoogte}{\voethoogte}}
+ {\balancedimensions{\teksthoogte}{\voethoogte}{\@@zahoogte}}%
+ \ifdim\voethoogte<\!!zeropoint
+ \global\advance\teksthoogte by \voethoogte
+ \global\voethoogte=\!!zeropoint
+ \global\xdef\@@zahoogte{\@@lyvoet\spatie(\v!max)}%
+ \fi
+ \setvsize
+ \global\pagegoal=\vsize % nog corrigeren voor insertions ?
+ \global\newlogostrue
+ \global\newbackgroundtrue
+ \global\let\pushpagedimensions=\relax
+ \global\let\poppagedimensions=\dopoppagedimensions}
+
+\def\dopaslayoutaan[#1][#2]%
+ {\doifelsenothing{#2}
+ {\dodopaslayoutaan[#1]}
+ {\def\docommando##1%
+ {\addtocommalist{##1}\adaptedpages
+ \setgvalue{\??za##1}{\dodopaslayoutaan[#2]}}%
+ \processcommalist[#1]\docommando
+ \adaptpagedimensions}}
+
+\def\paslayoutaan%
+ {\dodoubleempty\dopaslayoutaan}
+
+%I n=Margeblokken
+%I c=\startmargeblok,\stelmargeblokkenin
+%I
+%I voorlopig:
+%I
+%I \stelmargeblokkenin
+%I [plaats=,breedte,letter=,uitlijnen=,
+%I voor=,na=,links=,rechts=,boven=,onder=,tussen=]
+%I
+%I plaats = inmarge, links, rechts, midden
+%I links, rechts, voor, na = rule
+%I boven, onder, tussen = skip
+%I status=
+%I
+%I \startmargeblok
+%I \stopmargeblok
+
+\newif\ifmargeblokken
+
+\def\dostelmargeblokkenin[#1]%
+ {\getparameters[\??mb][#1]%
+ \doifelse{\@@mbstatus}{\v!start}%
+ {\showmessage{\m!layouts}{4}{}%
+ \margeblokkentrue
+ \let\somenextfloat=\dosomenextfloat
+ \let\startmargeblok=\dostartmargeblok
+ \let\stopmargeblok=\dostopmargeblok}%
+ {\showmessage{\m!layouts}{5}{}%
+ \margeblokkenfalse
+ \def\somenextfloat[##1]%
+ {\someelsefloat[##1,\v!hier]}%
+ \let\startmargeblok=\dontstartmargeblok
+ \let\stopmargeblok=\dontstopmargeblok}}
+
+\def\stelmargeblokkenin%
+ {\dosingleargument\dostelmargeblokkenin}
+
+\newbox\marginbox
+
+\def\dosomenextfloat[#1]%
+ {\global\setbox\marginbox=\vbox
+ {\hsize\@@mbbreedte
+ \unvbox\marginbox
+ \ifvoid\marginbox\else
+ \@@mbtussen
+ \fi
+ \box\floatbox\filbreak}%
+ \ifdim\ht\marginbox>\teksthoogte
+ \dosavefloatinfo
+ \else
+ \doinsertfloatinfo
+ \fi}
+
+\newbox\preparedmarginbox
+
+\def\reshapemargin%
+ {\beginofshapebox
+ \unvbox\preparedmarginbox
+ \endofshapebox
+ \reshapebox
+ {\box\shapebox}%
+ \setbox\preparedmarginbox=\vbox to \teksthoogte
+ {\@@mbboven
+ \flushshapebox
+ \@@mbonder}}
+
+\def\plaatsrechtermargeblok%
+ {\hskip\rechtermargebreedte}
+
+\def\plaatslinkermargeblok%
+ {\hskip\linkermargebreedte}
+
+\def\checkmargeblokken%
+ {\setbox\preparedmarginbox=\vbox
+ {\forgetall
+ \splittopskip\topskip
+ \ifvoid\marginbox\else
+ \ifdim\ht\marginbox>\teksthoogte
+ \vsplit\marginbox to \teksthoogte
+ \else
+ \unvbox\marginbox
+ \fi
+ \fi}%
+ \reshapemargin
+ \setbox\preparedmarginbox=\vbox
+ {\@@mbvoor\box\preparedmarginbox\@@mbna}%
+ \def\rightmarginbox%
+ {\def\plaatsrechtermargeblok%
+ {\setbox\preparedmarginbox=\hbox to \rechtermargebreedte
+ {\@@mblinks\box\preparedmarginbox\@@mbrechts}%
+ \vsmashbox\preparedmarginbox
+ \box\preparedmarginbox}}%
+ \def\leftmarginbox%
+ {\def\plaatslinkermargeblok%
+ {\setbox\preparedmarginbox=\hbox to \linkermargebreedte
+ {\@@mbrechts\box\preparedmarginbox\@@mblinks}%
+ \vsmashbox\preparedmarginbox
+ \box\preparedmarginbox}}%
+ \processaction
+ [\@@mbplaats]
+ [ \v!inmarge=>\doifbothsidesoverruled
+ \rightmarginbox
+ \orsideone
+ \rightmarginbox
+ \orsidetwo
+ \leftmarginbox
+ \od,
+ \v!midden=>\doifbothsidesoverruled
+ \rightmarginbox
+ \orsideone
+ \leftmarginbox
+ \orsidetwo
+ \rightmarginbox
+ \od,
+ \v!links=>\leftmarginbox,
+ \v!rechts=>\rightmarginbox,
+ \s!unknown=>\setbox\preparedmarginbox=\hbox{}]}
+
+\def\dostartmargeblok% % 2 maal \vbox ivm \unvbox elders
+ {\global\setbox\marginbox=\vtop\bgroup\vbox\bgroup
+ \hsize\@@mbbreedte
+ \ifvoid\marginbox\else
+ \unvbox\marginbox
+ \@@mbtussen
+ \fi
+ \steluitlijnenin[\@@mbuitlijnen]%
+ \dostartattributes{\??mb}{}%
+ \begstrut\ignorespaces}
+
+\def\dostopmargeblok%
+ {\unskip\endstrut
+ \dostopattributes
+ \egroup
+ \egroup}
+
+\def\dontstartmargeblok%
+ {\@@mbvoor
+ \bgroup
+ \dostartattributes{\??mb}{}}
+
+\def\dontstopmargeblok%
+ {\dostopattributes
+ \egroup
+ \@@mbna}
+
+%I n=Uitstellen
+%I c=\startuitstellen
+%I
+%I Zetcommando's kunnen in een wachtrij worden gezet en na
+%I een pagina worden uitgevoerd. Dit gebeurt met het commando:
+%I
+%I \startuitstellen
+%I ...
+%I \stopuitstellen
+%I
+%I Dit kan handig zijn bij bijvoorbeeld grote tussen te voegen
+%I figuren, tabellen, formulieren enz.
+%I
+%I \startuitstellen
+%I \plaatsfiguur[pagina][]{...}{...}
+%I \stopuitstellen
+%I
+%I Er kunnen meerdere commando's in de wachtrij worden
+%I geplaatst.
+%P
+%I Het mechanisme werkt nog niet vlekkeloos. Zo wordt
+%I nog gerekend met waarden van de vorige pagina. Dit heeft
+%I bijvoorbeeld als gevolg dat figuren kunnen worden
+%I opgespaard.
+%I
+%I Het kan gebeuren dat een (te) groot figuur er voor zorgt
+%I dat ook andere figuren worden verplaatst. De volgorde
+%I blijft immers gehandhaafd. In dat geval kan zo'n groot
+%I figuur worden verplaatst naar de eerstvolgende voor de
+%I handliggende pagina:
+%I
+%I \startuitstellen
+%I \plaatsfiguur[pagina][]{...}{...}
+%I \pagina
+%I \stopuitstellen
+
+\newcounter\nofpostponedblocks
+
+\def\douitstellen%
+ {\dorecurse{\nofpostponedblocks}
+ {\haalbuffer[buf-\recurselevel]}%
+ \doglobal\newcounter\nofpostponedblocks}
+
+\setvalue{\e!start\e!uitstellen}%
+ {\doglobal\increment\nofpostponedblocks
+ \showmessage{\m!layouts}{3}{\nofpostponedblocks}%
+ \startbuffer[buf-\nofpostponedblocks]
+ [\e!start\e!uitstellen][\e!stop\e!uitstellen]}
+
+%I n=Nummeren
+%I c=\stelnummerenin
+%I
+%I Automatische nummering kan worden ingesteld met het
+%I commando:
+%I
+%I \stelnummerenin[wijze=,blok=,status=]
+%I
+%I Mogelijke wijzen van nummeren zijn: 'pertekst',
+%I 'perhoofdstuk' en 'perparagraaf'. Als status kan worden
+%I meegegeven 'start' of 'stop'. Met blok wordt aangegeven
+%I of moet worden uitgegaan van het huidige hoofdstuk ('nee')
+%I of het blokhoofdstuk ('ja').
+
+% Commando's ten behoeve van nummeren:
+%
+% \definieernummer[naam]
+% \stelnummerin[naam][wijze=,blok=,tekst=plaats=,conversie=,start=]
+% \setnummer[naam]{waarde}
+% \resetnummer[naam]
+% \verhoognummer[naam]
+% \verlaagnummer[naam]
+% \volgendenummer[naam][tag][referentie]
+% \nummer[naam]
+% \huidigenummer[naam]
+% \innummer[naam][referentie]
+% \opnummer[naam][referentie]
+% \savenumber[naam]
+% \restorenumber[naam]
+
+\newif\ifnummeren
+
+\def\dostelnummerenin[#1]% globaal
+ {\getparameters[\??nr][#1]%
+ \doifelse{\@@nrstatus}{\v!start}
+ {\global\nummerentrue}
+ {\global\nummerenfalse}}%
+
+\def\stelnummerenin%
+ {\dosingleargument\dostelnummerenin}
+
+\def\dostelnummerin[#1][#2]%
+ {\getparameters[\s!number#1][#2]}
+
+\def\stelnummerin%
+ {\dodoubleargument\dostelnummerin}
+
+\def\dodefinieernummer[#1][#2]% ook overal class als localframed
+ {\makecounter{\s!number#1}%
+ \getparameters
+ [\s!number#1]
+ [\s!check=,
+ \c!wijze=\@@nrwijze,
+ \c!wijze\c!lokaal=\getvalue{\s!number#1\c!wijze},
+ \c!sectienummer=\v!ja,
+ \c!tekst=,
+ \c!plaats=, % was: \c!zetwijze
+ \c!conversie=\v!cijfers,
+ \c!start=0,
+ #2]%
+ \setcounter{\s!number#1}{\getvalue{\s!number#1\c!start}}}
+
+\def\definieernummer%
+ {\dodoubleempty\dodefinieernummer}
+
+\def\setnummer[#1]#2%
+ {\setcounter{\s!number#1}{#2}}
+
+\def\resetnummer[#1]%
+ {\setcounter{\s!number#1}{0\getvalue{\s!number#1\c!start}}}
+
+\def\dodoreset#1%
+ {\getvalue{\s!reset#1}}%
+
+\def\doreset[#1]%
+ {\processcommalist[#1]\dodoreset}
+
+\def\reset%
+ {\dosingleargument\doreset}
+
+\def\verhoognummer[#1]%
+ {\checknummer{#1}%
+ \ifnummeren
+ \else
+ \resetcounter{\s!number#1}%
+ \fi
+ \pluscounter{\s!number#1}}
+
+\def\savenumber[#1]%
+ {\savecounter{\s!number#1}}
+
+\def\restorenumber[#1]%
+ {\restorecounter{\s!number#1}}
+
+% nieuw, maar kan dit (i.v.m. (sub)page?)
+
+\def\verhoognummer[#1]%
+ {\checknummer{#1}%
+ \ifnummeren
+ \pluscounter{\s!number#1}%
+ \else
+ \setcounter{\s!number#1}{0\getvalue{\s!number#1\c!start}}%
+ \fi}
+
+\def\verlaagnummer[#1]%
+ {\minuscounter{\s!number#1}}
+
+\def\dodochecknummer#1#2#3%
+ {\bgroup
+ \doifinstringelse{.0}{.#2} % waarom \instring en \@koscheider
+ {\doifnot{#3}{\v!per}
+ {\debuggerinfo{\m!systems}{number #1 #3 becomes \getvalue{\s!number#1\c!wijze}}%
+ \setevalue{\s!number#1\c!wijze}% geen \xdef, gaat mis met \subpage
+ {#3}%
+ \dochecknummer{#1}}} % tricky and ugly
+ {\doifnotvalue{\s!number#1\s!check}{#2}
+ {\setcounter{\s!number#1}{0\getvalue{\s!number#1\c!start}}%
+ \setxvalue{\s!number#1\c!wijze\c!lokaal}%
+ {\getvalue{\s!number#1\c!wijze}}%
+ \setxvalue{\s!number#1\s!check}%
+ {#2}}}%
+ \egroup}
+
+\def\dochecknummer#1%
+ {\edef\currentsection{\getvalue{\??by\getvalue{\s!number#1\c!wijze}}}%
+ \doifsomething{\currentsection}
+ {\dodochecknummer
+ {#1}
+ {\getvalue{\currentsection\c!nummer}}
+ {\v!per\previoussection{\currentsection}}}}
+
+\def\checknummer#1%
+ {\bgroup
+ \ifnum\blocklevel>0
+ \doifelsevalue{\s!number#1\c!blokwijze}{\v!nee}
+ {\dochecknummer{#1}}
+ {\setblockcounters % dit kan sneller omdat de waarden
+ \dochecknummer{#1}}% % en het type bekend zijn
+ \else
+ \dochecknummer{#1}%
+ \fi
+ \egroup}
+
+\def\domaakvoorafgaandenummer[#1]%
+ {\gdef\voorafgaandenummer{}%
+ \ifsectienummer
+ \doifvalue{\??sb\@@sectieblok\c!nummer}{\v!ja} % toegevoegd
+ {\doifvalue{\s!number#1\c!sectienummer}{\v!ja}
+ {\edef\currentsection%
+ {\getvalue{\??by\getvalue{\s!number#1\c!wijze\c!lokaal}}}%
+ \doifnot{\currentsection}{\zerosection}
+ {\doifnot{\@@sectionvalue{\currentsection}}{0}
+ {\xdef\voorafgaandenummer%
+ {\getvalue{\currentsection\c!nummer}.}}}}}%
+ \fi}
+
+\def\maakvoorafgaandenummer[#1]%
+ {\bgroup
+ \ifnum\blocklevel>0
+ \doifelsevalue{\s!number#1\c!blokwijze}{\v!nee}
+ {\domaakvoorafgaandenummer[#1]}%
+ {\setblockcounters % dit kan sneller omdat de waarden
+ \domaakvoorafgaandenummer[#1]}% % en het type bekend zijn
+ \else
+ \domaakvoorafgaandenummer[#1]%
+ \fi
+ \egroup}
+
+\def\nummer[#1]%
+ {\convertnumber
+ {\getvalue{\s!number#1\c!conversie}}
+ {\countervalue{\s!number#1}}}
+
+\def\ruwenummer[#1]%
+ {\countervalue{\s!number#1}}
+
+\def\maakhetnummer[#1]%
+ {\maakvoorafgaandenummer[#1]%
+ \global\edef\hetnummer%
+ {\voorafgaandenummer\nummer[#1]}}%
+
+\def\lossenummer[#1]%
+ {\maakhetnummer[#1]%
+ \hetnummer}
+
+\def\huidigenummer[#1]%
+ {%\getvalue{\getvalue{\s!number#1\c!zetwijze}}%
+ \getvalue{\getvalue{\s!number#1\c!plaats}}%
+ {\dotextprefix{\getvalue{\s!number#1\c!tekst}}\lossenummer[#1]}}
+
+\def\volgendenummer[#1][#2][#3]%
+ {\verhoognummer[#1]%
+ \huidigenummer[#1]%
+ \rawreference{#2}{#3}{\hetnummer}}
+
+\def\innummer[#1][#2]%
+ {\c!in \in{\getvalue{\s!number#1\c!tekst}}[#2]}%
+
+\def\opnummer[#1][#2]%
+ {\c!op \op{\getvalue{\s!number#1\c!tekst}}[#2]}%
+
+% \gotonextsubpage : voor de pagebody
+% \subpaginanummer : alleen in de voet/kopregels
+% \aantalsubpaginas : alleen in de voet/kopregels
+
+% \firstsubpage : eerste \realpageno, voor interne doeleinden
+% \prevsubpage : vorige \realpageno, voor interne doeleinden
+% \nextsubpage : volgende \realpageno, voor interne doeleinden
+% \lastsubpage : laatste \realpageno, voor interne doeleinden
+% \nofsubpages : laatste subpage (in berekeningen)
+% \subpageno : huidige subpage (in berekeningen)
+
+\newif\ifsubpaging
+\newif\ifshowingsubpage
+
+\definieernummer
+ [\s!subpage]
+
+\stelnummerin
+ [\s!subpage]
+ [\c!wijze=\@@snwijze]
+
+\def\resetsubpaginanummer%
+ {\resetnummer[\s!subpage]%
+ \global\subpageno=\ruwenummer[\s!subpage]}
+
+\def\dostelsubpaginanummerin[#1]%
+ {\doifelse{#1}{\v!reset}
+ {\resetnummer[\s!subpage]}
+ {\getparameters[\??sn][#1]%
+ \processaction
+ [\@@snstatus]
+ [ \v!stop=>\ifsubpaging
+ \else
+ \subpagingfalse
+ \fi
+ \showingsubpagefalse,
+ \v!start=>\subpagingtrue
+ \showingsubpagetrue,
+ \v!geen=>\subpagingtrue
+ \showingsubpagefalse]}}
+
+\def\aantalsubpaginas%
+ {\ifshowingsubpage
+ \nofsubpages
+ \else
+ 0%
+ \fi}
+
+\def\subpaginanummer%
+ {\ifshowingsubpage
+ \the\subpageno
+ \else
+ 0%
+ \fi}
+
+\def\stelsubpaginanummerin%
+ {\dosingleargument\dostelsubpaginanummerin}
+
+\def\newnofsubpages {0}
+\def\nofsubpages {0}
+\def\firstsubpage {1}
+\def\prevsubpage {1}
+\def\nextsubpage {1}
+\def\lastsubpage {1}
+
+\def\nextpage {1}
+\def\prevpage {1}
+
+\definetwopasslist{\s!subpage}
+
+\def\savenofsubpages%
+ {\ifsubpaging
+ \showmessage{\m!layouts}{6}{\newnofsubpages,\the\subpageno}%
+ \immediatewriteutilitycommand%
+ {\twopassentry%
+ {\s!subpage}%
+ {\newnofsubpages}%
+ {\the\subpageno}}%
+ \fi}
+
+\def\setsubpagenumbers%
+ {\iftwopassdatafound
+ \bgroup
+ \xdef\nofsubpages{\twopassdata}%
+ \xdef\firstsubpage{\realfolio}%
+ \advance\realpageno by \nofsubpages
+ \advance\realpageno by -1
+ \xdef\lastsubpage{\realfolio}%
+ \egroup
+ \else
+ \xdef\nofsubpages{0}%
+ \fi}
+
+\def\gotonextsubpage%
+ {\global\let\checksubpages=\relax
+ \ifsubpaging
+ \edef\oldsubpage{\the\subpageno}%
+ \verhoognummer[\s!subpage]%
+ \global\subpageno=\ruwenummer[\s!subpage]\relax
+ \ifnum\subpageno=1
+ \gettwopassdata{\s!subpage}%
+ \setsubpagenumbers
+ \ifnum\oldsubpage>0
+ \showmessage{\m!layouts}{6}{\newnofsubpages,\oldsubpage}%
+ \edef\next%
+ {\writeutilitycommand%
+ {\twopassentry%
+ {\s!subpage}%
+ {\newnofsubpages}%
+ {\oldsubpage}}}%
+ \next
+ \fi
+ \doglobal\increment\newnofsubpages\relax
+ \fi
+ \setglobalsystemreference\rt!page{\v!eerste\v!sub\v!pagina}\firstsubpage
+ \setglobalsystemreference\rt!page{\v!laatste\v!sub\v!pagina}\lastsubpage
+ \bgroup
+ \ifnum\realpageno=\firstsubpage\relax
+ \global\let\prevsubpage=\firstsubpage
+ \else
+ \xdef\prevsubpage{\realfolio}%
+ \doglobal\decrement\prevsubpage
+ \fi
+ \setglobalsystemreference\rt!page{\v!vorige\v!sub\v!pagina}\prevsubpage
+ \ifnum\realpageno=\lastsubpage\relax
+ \global\let\nextsubpage=\lastsubpage
+ \else
+ \xdef\nextsubpage{\realfolio}%
+ \doglobal\increment\nextsubpage
+ \fi
+ \setglobalsystemreference\rt!page{\v!volgende\v!sub\v!pagina}\nextsubpage
+ \egroup
+ \fi}
+
+\def\checksubpages%
+ {\getfromtwopassdata{\s!subpage}{1}%
+ \setsubpagenumbers
+ \global\let\checksubpages=\relax}
+
+% Omdat \gotonextrealpage gebruik maakt van de hulpfile,
+% moet het initialiseren van \realpageno plaatsvinden in
+% een later stadium, namelijk zodra referenties worden
+% gebruikt (anders gaat het mis op nog niet gedefinieerde
+% lijstcommando's e.d.). De eerst aanroep vindt dan ook
+% plaats vlak nadat de hulpfile voor de eerste maal is
+% ingelezen.
+
+\countdef\realpageno = 0 \realpageno = 1
+\countdef\userpageno = 1 \userpageno = 1
+\countdef\subpageno = 2 \subpageno = 0 % !!
+\countdef\arrangeno = 3 \arrangeno = 0 % !!
+
+% we don't want conflicts when \pageno is used by other
+% packages, like CWEB, so we redefine \pageno
+
+\newcount\pageno \pageno = 1
+
+\def\setuserpageno#1%
+ {\global\userpageno=#1\relax
+ \global\pageno=\userpageno}
+
+\def\realfolio {\the\realpageno}
+\def\folio {\the\userpageno}
+\def\firstpage {1}
+\def\lastpage {1}
+\def\currentpage {\the\realpageno}
+
+\def\gotonextrealpage%
+ {\global\advance\realpageno by 1
+ \ifnum\realpageno>\lastpage
+ \xdef\lastpage{\realfolio}%
+ \fi
+ \setglobalsystemreference\rt!page{\v!eerste\v!pagina}\firstpage
+ \setglobalsystemreference\rt!page{\v!laatste\v!pagina}\lastpage
+ \bgroup
+ \ifnum\realpageno>1
+ \advance\realpageno by -1
+ \xdef\prevpage{\realfolio}%
+\setglobalsystemreference\rt!page{\v!achteruit}\prevpage
+ \else
+ \global\let\prevpage=\firstpage
+\setglobalsystemreference\rt!page{\v!achteruit}\lastpage
+ \fi
+ \setglobalsystemreference\rt!page{\v!vorige\v!pagina}\realfolio
+ \egroup
+ \bgroup
+ \ifnum\realpageno<\lastpage\relax
+ \advance\realpageno by 1
+ \xdef\nextpage{\realfolio}%
+ \setglobalsystemreference\rt!page{\v!pagina}\realfolio
+\setglobalsystemreference\rt!page{\v!vooruit}\realfolio
+ \else
+ \global\let\nextpage=\lastpage
+ \setglobalsystemreference\rt!page{\v!pagina}\firstpage
+\setglobalsystemreference\rt!page{\v!vooruit}\firstpage
+ \fi
+ \setglobalsystemreference\rt!page{\v!volgende\v!pagina}\realfolio
+ \egroup}
+
+\def\checkrealpage%
+ {\global\realpageno=0
+ \gotonextrealpage
+ \global\let\checkrealpage=\relax}
+
+\def\realnumberofpages#1% meteen laden, voor andere files (met refs)
+ {\gdef\lastpage{#1}%
+ \global\let\realnumberofpages=\gobbleoneargument}
+
+\def\savenofpages%
+ {\advance\realpageno by -1
+ \immediatewriteutilitycommand{\realnumberofpages{\realfolio}}}%
+
+\def\totaalaantalpaginas%
+ {\lastpage}
+
+\def\myshipout#1%
+ {\voorpagina
+ \dontshowcomposition
+ \dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}%
+ \ifarrangingpages
+ \actualarrange
+ {\thisisrealpage{\realfolio}#1}%
+ \else
+ \actualshipout
+ {\thisisrealpage{\realfolio}#1}%
+ \fi
+ \gotonextrealpage
+ \napagina}
+
+\newbox\postponedcontent
+
+\def\flushatshipout%
+ {\dowithnextbox
+ {\global\setbox\postponedcontent=\hbox
+ {\box\postponedcontent\box\nextbox}%
+ \global\ht\postponedcontent=\!!zeropoint
+ \global\dp\postponedcontent=\!!zeropoint
+ \global\wd\postponedcontent=\!!zeropoint}%
+ \hbox}
+
+\def\actualshipout#1%
+ {\shipout\vbox
+ {\forgetall
+ \offinterlineskip
+ \mindermeldingen
+ \vskip-1in
+ \hskip-1in
+ \hbox
+ {\setbox0=\hbox{#1}% just in case there are objects there
+ \setbox\scratchbox=\hbox{\the\everyshipout}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \box\postponedcontent % evt ver naar links !
+ \box0}}}
+
+\def\actualarrange#1%
+ {\setbox0=\hbox{\thisisrealpage{\realfolio}#1}%
+ \pusharrangedpage0
+ \deadcycles=0}
+
+\def\goleftonpage%
+ {\hskip-\linkermargeafstand
+ \hskip-\linkermargebreedte
+ \hskip-\paginascheiding
+ \hskip-\linkerrandafstand
+ \hskip-\linkerrandbreedte}
+
+\def\doswapmargins%
+ {\let\doswapmargins=\relax % to prevent local swapping
+ \swapmacros\@@lylinkermargeafstand\@@lyrechtermargeafstand
+ \swapmacros\@@lylinkerrandafstand\@@lyrechterrandafstand
+ \swapdimens\linkermargebreedte\rechtermargebreedte
+ \swapdimens\linkerrandbreedte\rechterrandbreedte}
+
+\def\doifmarginswapelse#1#2%
+ {\doifbothsides#1\orsideone#1\orsidetwo#2\od}
+
+\def\swapmargins%
+ {\doifmarginswapelse{}{\doswapmargins}}
+
+% Output routines
+%
+% \dopagecontents#1#2 : tekst, floats en footnotes
+% \dopagebody#1#2 : hoofd, \pagecontents, voet
+% \dooutput : outputroutine
+%
+% \ifinpagebody
+
+\def\doejectpage#1%
+ {\bgroup % de \ifdim is nodig omdat
+ \par % anders een eventuele
+ \ifdim\pagetotal>\pagegoal\else % laatste regel boven de
+ %\normalvfill % baseline te staan terwijl
+ \normalvfil % baseline te staan terwijl
+ \fi % de vorige bladzijden op
+ #1% % de baseline staan
+ \egroup}
+
+% ^^ NOG NETTER MAKEN, TEGELIJK MET MULTI COLUMNS EN ACHTERGRONDEN!
+
+\def\ejectpage%
+ {\doejectpage\eject}
+
+\def\superejectpage%
+ {\doejectpage\supereject}
+
+\def\ejectinsert%
+ {\flushfootnotes
+ \bgroup
+ \noftopfloats=\!!thousand
+ \doflushfloats
+ \egroup}
+
+% De volgende macro's worden gedefinieerd in de module
+% colo-ini. Om resetten bij twee maal laden te voorkomen
+% checken we wel even. Anders krijgen we een mark-build-up.
+
+\newif\ifinpagebody
+
+\doifundefined{pushcolor} {\def\pushcolor{}}
+\doifundefined{popcolor} {\def\popcolor{}}
+\doifundefined{startcolorpage} {\def\startcolorpage{}}
+\doifundefined{stopcolorpage} {\def\stopcolorpage{}}
+
+% bewaren tvb documentatie
+%
+% \hbox to \hsize
+% {\en
+% \switchnaarkorps[5pt]%
+% \emergencystretch2em
+% \dimen0=\baselineskip
+% \baselineskip=\dimen0 plus 1pt
+% \hsize=.2\hsize
+% \vsize=2\hsize
+% \ruledvbox to \vsize{\input tufte \par}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern0pt}\hss
+% \ruledvbox to \vsize{\input tufte \par\vfill}\hss
+% \ruledvbox to \vsize{\input tufte \par\kern-\prevdepth\vfill}}
+%
+% \hbox to \hsize
+% {\en
+% \switchnaarkorps[5pt]%
+% \emergencystretch2em
+% \dimen0=\baselineskip
+% \baselineskip=\dimen0 plus 1pt
+% \hsize=.18\hsize
+% \vsize=2.5\hsize
+% \setbox0=\vbox{\input tufte\relax}%
+% \ruledvbox to \vsize{\unvcopy0}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern-\dp0}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern0pt}\hss
+% \ruledvbox to \vsize{\unvcopy0\vfill}\hss
+% \ruledvbox to \vsize{\unvcopy0\kern-\dp0\vfill}}
+
+% \def\dopagecontents#1#2%
+% {\dotopinsertions
+% \bgroup
+% \forgetall
+% \boxmaxdepth=\maxdepth
+% \dimen0=\dp#2%
+% \bgroup
+% #1#2\relax
+% \pushcolor
+% \dobotinsertions
+% \egroup
+% \ifr@ggedbottom
+% \kern-\dimen0
+% \vfil
+% \fi
+% \ifb@selinebottom
+% \kern-\dimen0
+% \kern\maxdepth
+% \fi
+% \egroup
+% \placefootnotes}
+
+\def\dopagecontents#1#2% \box<n> \unvbox<n>
+ {\bgroup
+ \forgetall
+ \boxmaxdepth=\maxdepth
+ \setbox0=\vbox to \teksthoogte
+ {\edef\currentpagedepth{\the\dp#2}% still to be derived from #1
+ \dotopinsertions
+ \fuzzysnappedbox{#1}{#2}%
+ \pushcolor
+ \ifgridsnapping
+ \vskip-\currentpagedepth
+ \vskip\openstrutdepth % \dp\strutbox
+ \prevdepth\openstrutdepth % \dp\strutbox
+ \dobotinsertions
+ \vfil
+ \else\ifr@ggedbottom
+ \vskip-\currentpagedepth
+ \vskip\openstrutdepth % \dp\strutbox
+ \prevdepth\openstrutdepth % \dp\strutbox
+ \dobotinsertions
+ \vfil
+ \else\ifb@selinebottom
+ \kern-\currentpagedepth
+ \kern\maxdepth
+ \dobotinsertions
+ \fi\fi\fi
+ \ifdim\ht\footins>\!!zeropoint % beter dan \ifvoid\footins\else
+ \kern\skip\footins
+ \kern\ht\footins
+ \fi}%
+ \ifgridsnapping
+ \getnoflines\teksthoogte
+ \advance\noflines by -1
+ \scratchdimen=\noflines\lineheight
+ \advance\scratchdimen by \topskip
+ \else
+ \scratchdimen=\ht0
+ \fi
+ \setbox2=\hbox
+ {\ifvoid\savedfootins \else
+ \setbox\footins=\box\savedfootins
+ \fi
+ \lower\scratchdimen\vbox{\placefootnotes}}%
+ \smashbox2
+ \ht0=\!!zeropoint
+ \vbox to \teksthoogte
+ {\box0\box2}%
+ \egroup}
+
+\def\dodummypageskip#1%
+ {\getvalue{\s!dummy\c!commando#1}}
+
+\setvalue{\s!dummy\c!commando\v!links}%
+ {\hskip\linkerrandbreedte}
+
+\setvalue{\s!dummy\c!commando\v!rechts}%
+ {\hskip\rechterrandbreedte}
+
+\setvalue{\s!dummy\c!commando\v!boven}%
+ {} % \vbox to \bovenhoogte{\vss}}
+
+\setvalue{\s!dummy\c!commando\v!onder}%
+ {} % \vbox to \onderhoogte{\vss}}
+
+\def\plaatslinkerrandblok {\dodummypageskip\v!links}
+\def\plaatsrechterrandblok {\dodummypageskip\v!rechts}
+
+\newtoks\afterpage \newtoks\aftereverypage
+\newtoks\beforepage \newtoks\beforeeverypage
+
+\newif\ifshowgrid
+
+\def\toongrid%
+ {\tracegridsnappingtrue
+ \showgridtrue}
+
+\def\doplaatstekstblok#1#2%
+ {\bgroup
+ \setbox0=\hbox to \zetbreedte
+ {\vbox to \teksthoogte
+ {\offinterlineskip
+ \boxmaxdepth\maxdepth
+ \dopagecontents#1#2}}%
+ \ht0=\teksthoogte
+ \wd0=\zetbreedte
+ \ifshowgrid
+ \setgridbox2\zetbreedte\teksthoogte
+ \hbox{\color[red]{\box2}\hskip-\zetbreedte\box0}%
+ \else
+ \box0
+ \fi
+ \egroup}
+
+\def\getmainbox#1#2%
+ {\setbox0=\vbox
+ {\offinterlineskip % na \paginaletter !
+ \calculatereducedvsizes
+ \calculatehsizes
+ \swapmargins
+ \vskip\hoofdhoogte
+ \vskip\hoofdafstand
+ \hbox
+ {\bgroup
+ \swapmargins
+ \goleftonpage
+ \plaatslinkerrandblok
+ \hskip\linkerrandafstand
+ \showpageseparation
+ \plaatslinkermargeblok
+ \hskip\linkermargeafstand
+ \egroup
+ \doplaatstekstblok#1#2%
+ \bgroup
+ \hskip\rechtermargeafstand
+ \plaatstestinfo
+ \plaatsrechtermargeblok
+ \showpageseparation
+ \hskip\rechterrandafstand
+ \plaatsrechterrandblok
+ \egroup}%
+ \vfill}
+ \smashbox0
+ \box0}
+
+%\def\setpagedisplacement%
+% {\global\voffset=\kopoffset
+% \global\hoffset=\rugoffset
+% \global\advance\voffset by -1in
+% \global\advance\hoffset by -1in}
+
+\def\centerpagebox#1%
+ {\printpapierbreedte=\papierschaal\printpapierbreedte
+ \printpapierhoogte =\papierschaal\printpapierhoogte
+ \setbox#1=\vbox to \printpapierhoogte
+ {\toppagebox
+ \hbox to \printpapierbreedte
+ {\ifdoublesidedprint
+ \doifbothsides
+ \leftpagebox\box#1\rightpagebox
+ \orsideone
+ \leftpagebox\box#1\rightpagebox
+ \orsidetwo
+ \rightpagebox\box#1\leftpagebox
+ \od
+ \else
+ \leftpagebox\box#1\rightpagebox
+ \fi}
+ \bottompagebox}}
+
+\def\offsetprintbox#1%
+ {\dimen0=\wd#1\dimen2=\ht#1\dimen4=\dp#1%
+ \setbox#1=\vbox
+ {\forgetall
+ \offinterlineskip
+ \vskip\kopoffset
+ \doifbothsides
+ \hskip\rugoffset
+ \orsideone
+ \hskip\rugoffset
+ \orsidetwo
+ \hskip-\rugoffset
+ \od
+ \box#1}%
+ \wd#1=\dimen0\ht#1=\dimen2\dp#1=\dimen4}
+
+\def\replicatebox#1#2#3%
+ {\setbox#1=\vbox
+ {\forgetall
+ \offinterlineskip
+ \dorecurse{#3}{\hbox{\dorecurse{#2}{\copy#1}}}}}
+
+\def\replicatepagebox#1%
+ {\ifnum\@@lynx>0 \ifnum\@@lyny>0
+ \replicatebox{#1}{\@@lynx}{\@@lyny}%
+ \fi\fi}
+
+\def\rotatepagebodybox#1#2#3%
+ {\ifnum#2#3>0
+ \setbox#1=\vbox
+ {\edef\somerotation%
+ {\ifdubbelzijdig\ifodd\realpageno#2\else#3\fi\else#2\fi}%
+ \dorotatebox\somerotation\hbox{\box#1}}%
+ \fi}
+
+\def\rotatepaperbox#1%
+ {\rotatepagebodybox{#1}\paperrotation\paperreverse}
+
+\def\rotateprintbox#1%
+ {\rotatepagebodybox{#1}\printrotation\printreverse}
+
+\def\mirrorpagebodybox#1#2%
+ {\ifcase#2\or
+ \setbox#1=\vbox
+ {\domirrorbox\vbox{\box#1}}%
+ \fi}
+
+\def\mirrorpaperbox#1%
+ {\mirrorpagebodybox{#1}\papermirror}
+
+\def\mirrorprintbox#1%
+ {\mirrorpagebodybox{#1}\printmirror}
+
+\def\scalepagebox#1%
+ {\ifdim\@@lyschaal pt=1pt \else
+ \setbox#1=\vbox
+ {\schaal[\c!sx=\@@lyschaal,\c!sy=\@@lyschaal]{\box#1}}%
+ \papierbreedte=\@@lyschaal\papierbreedte
+ \papierhoogte =\@@lyschaal\papierhoogte
+ \fi}
+
+\def\negateprintbox#1%
+ {\ifnegateprintbox
+ \negatecolorbox{#1}%
+ \fi}
+
+\def\buildpagebox#1%
+ {\setbox#1=\vbox to \papierhoogte
+ {\hsize\papierbreedte
+ \vskip\kopwit
+ \doifbothsides
+ \hskip\rugwit
+ \orsideone
+ \hskip\rugwit
+ \orsidetwo
+ \hskip\papierbreedte
+ \hskip-\rugwit
+ \hskip-\zetbreedte
+ \od
+ \box#1}%
+ \dp#1=\!!zeropoint}
+
+\def\pagecutmarksymbol%
+ {\the\realpageno}%
+
+\def\addpagecutmarks#1%
+ {\doif{\@@lymarkering}{\v!aan}
+ {\let\cutmarksymbol=\pagecutmarksymbol
+ \makecutbox{#1}}}
+
+\def\addpagecolormarks#1%
+ {\doif{\@@lymarkering}{\v!kleur}
+ {\let\cutmarksymbol=\pagecutmarksymbol
+ \makecutbox{#1}%
+ \ifnum\horizontalcutmarks>1 \chardef\colormarkoffset=4 \fi
+ \ifnum\verticalcutmarks >1 \chardef\colormarkoffset=4 \fi
+ \colormarkbox{#1}}}
+
+\newif\ifpagebodyornaments \pagebodyornamentstrue
+\newif\ifarrangingpages \arrangingpagesfalse
+
+\let\poparrangedpages=\relax
+\let\pusharrangedpage=\relax
+
+\def\reportarrangedpage#1%
+ {\showmessage
+ {\m!systems}{23}
+ {\the\realpageno.\the\pageno\ifnum\subpageno>0 .\the\subpageno\fi,#1}}
+
+\def\buildpagebody#1#2%
+ {\vbox
+ {\forgetall % igv problemen, check: \boxmaxdepth\maxdimen
+ \mindermeldingen
+ \setbox0=\vbox
+ {\doconvertfont{\@@lyletter}{}%
+ \offinterlineskip
+ \ifpagebodyornaments
+ \getbackgroundbox
+ \getlogobox
+ \gettextboxes
+ \fi
+ \getmainbox#1#2}%
+ \buildpagebox0
+ \ifpagebodyornaments
+ \addpagebackground0
+ \fi
+ \ifarrangingpages \else
+ \addpagecutmarks0
+ \replicatepagebox0
+ \scalepagebox0
+ \mirrorpaperbox0
+ \rotatepaperbox0
+ \addpagecolormarks0
+ \centerpagebox0
+ \mirrorprintbox0
+ \rotateprintbox0
+ \offsetprintbox0
+ \negateprintbox0
+ \fi
+ \box0}}
+
+\def\finishpagebox#1%
+ {\ifarrangingpages
+ \addpagecutmarks#1%
+ \addpagecolormarks#1%
+ \centerpagebox#1%
+ \mirrorprintbox#1%
+ \rotateprintbox#1%
+ \offsetprintbox#1%
+ \negateprintbox#1%
+ \fi}
+
+% TBV testdoeleinden:
+
+\def\dotoonprint[#1][#2][#3]%
+ {\omlijnd
+ [\c!offset=\v!overlay,
+ \c!strut=\v!nee]
+ {\forgetall
+ \mindermeldingen
+ \globaldefs=-1
+ \dimen0=\pagegoal
+ \definieerpapierformaat[X][\c!breedte=4em, \c!hoogte=6em]%
+ \definieerpapierformaat[Y][\c!breedte=12em,\c!hoogte=14em]%
+ \stelpapierformaatin[#1,X][#2,Y]%
+ \stellayoutin[#3]%
+ \setbox0=\vbox
+ {\omlijnd
+ [\c!offset=\v!overlay,\c!strut=\v!nee,
+ \c!breedte=\papierbreedte,\c!hoogte=\papierhoogte]
+ {\ss ABC\par DEF}}%
+ \dubbelzijdigfalse
+ \def\cutmarklength{.5em}%
+ \addpagecutmarks0%
+ \replicatepagebox0%
+ \scalepagebox0%
+ \mirrorpaperbox0%
+ \rotatepaperbox0%
+ \centerpagebox0%
+ \mirrorprintbox0%
+ \rotateprintbox0%
+ \offsetprintbox0%
+ \pagegoal=\dimen0
+ \box0}}
+
+\def\toonprint%
+ {\dotripleempty\dotoonprint}
+
+% \switchnaarkorps[8pt]
+%
+% \startcombinatie[4*4]
+% {\toonprint} {\strut}
+% {\toonprint[][][plaats=midden]} {\type{plaats=midden}}
+% {\toonprint[][][plaats=midden,markering=aan]} {\type{markering=aan}\break
+% \type{plaats=midden}}
+% {\toonprint[][][plaats=midden,markering=aan,nx=2]} {\type{markering=aan}\break
+% \type{plaats=midden}\break
+% \type{nx=2}}
+% {\toonprint[][][plaats=links]} {\type{plaats=links}}
+% {\toonprint[][][plaats=rechts]} {\type{plaats=rechts}}
+% {\toonprint[][][plaats={links,onder}]} {\type{plaats={links,onder}}}
+% {\toonprint[][][plaats={rechts,onder}]} {\type{plaats={rechts,onder}}}
+% {\toonprint[][][nx=2,ny=1]} {\type{nx=2,ny=1}}
+% {\toonprint[][][nx=1,ny=2]} {\type{nx=1,ny=2}}
+% {\toonprint[][][nx=2,ny=2]} {\type{nx=2,ny=2}}
+% {\toonprint[][][nx=2,ny=2,plaats=midden]} {\type{nx=2,ny=2}\break
+% \type{plaats=midden}}
+% {\toonprint[][][rugoffset=3pt]} {\type{rugoffset=.5cm}}
+% {\toonprint[][][kopoffset=3pt]} {\type{kopoffset=.5cm}}
+% {\toonprint[][][schaal=1.5]} {\type{schaal=1.5}}
+% {\toonprint[][][schaal=0.8]} {\type{schaal=0.8}}
+% \stopcombinatie
+%
+% \startcombinatie[3*4]
+% {\toonprint[liggend][][plaats=midden]} {\type{liggend}}
+% {\toonprint[][liggend][plaats=midden]} {\strut\break\type{liggend}}
+% {\toonprint[liggend][liggend][plaats=midden]} {\type{liggend}\break\type{liggend}}
+% {\toonprint[90][][plaats=midden]} {\type{90}}
+% {\toonprint[][90][plaats=midden]} {\strut\break\type{90}}
+% {\toonprint[90][90][plaats=midden]} {\type{90}\break\type{90}}
+% {\toonprint[180][][plaats=midden]} {\type{180}}
+% {\toonprint[][180][plaats=midden]} {\strut\break\type{180}}
+% {\toonprint[180][180][plaats=midden]} {\type{180}\break\type{180}}
+% {\toonprint[gespiegeld][][plaats=midden]} {\type{gespiegeld}}
+% {\toonprint[][gespiegeld][plaats=midden]} {\strut\break\type{gespiegeld}}
+% {\toonprint[gespiegeld][gespiegeld][plaats=midden]} {\type{gespiegeld}\break\type{gespiegeld}}
+% \stopcombinatie
+
+\chardef\normalpagebox=255
+
+\def\dopagebody#1#2%
+ {\getallmarks
+ \restoreglobalbodyfont
+ \startcolorpage
+ \gotonextsubpage
+ \dontshowboxes
+ \naastpagina
+ \checkreferences
+ \checkmargeblokken
+ \dotoks\beforeeverypage
+ \flushtoks\beforepage
+ \inpagebodytrue
+ \buildpagebody#1#2%
+ \flushtoks\afterpage
+ \dotoks\aftereverypage
+ \resetpagina
+ \updatelistreferences
+ \resetlayoutregels % mischien in shipout
+ \stopcolorpage}
+
+\def\beforefinaloutput%
+ {}
+
+\def\afterfinaloutput%
+ {\forgetall
+ \vskip\!!zeropoint\relax
+ \ifvoid\normalpagebox
+ \else
+ \unvbox\normalpagebox
+ \penalty\outputpenalty
+ \fi
+ \ifnum\outputpenalty>-\@MM\relax
+ \else
+ \dosupereject
+ \fi
+ \inpagebodytrue % needed for enabling \blanko !
+ \dosetbothinserts
+ \setvsize % this is needed for interacting components, like floats and multicolumns
+ \adaptfuzzypagegoal} % watch this hack!
+
+\def\setpagecounters%
+ {\setuserpageno{\ruwenummer[\s!page]}%
+ \doifelse{\@@snstatus}{\v!stop}
+ {\global\subpageno=0}
+ {\global\subpageno=\ruwenummer[\s!subpage]}}
+
+\def\dofinaloutput#1#2%
+ {\beforefinaloutput
+ \myshipout{\hbox{\dopagebody#1#2\setpagecounters}}%
+ \afterfinaloutput
+ \popcolor} % ... and here ...
+
+\def\donofinaloutput#1#2%
+ {\beforefinaloutput
+ \setpagecounters
+ \message{[-\the\realpageno]}%
+ \setbox0=\hbox
+ {\the\everyshipout
+ \dopagebody#1#2}%
+ \deadcycles=0
+ \gotonextrealpage
+ \afterfinaloutput
+ \popcolor} % ... and here
+
+\let\checkpageversion=\relax
+
+\def\finaloutput#1#2%
+ {\checkpageversion
+ \ifverwerken
+ \ifgeselecteerd
+ \dofinaloutput#1#2%
+ \else
+ \donofinaloutput#1#2%
+ \fi
+ \else
+ \ifgeselecteerd
+ \donofinaloutput#1#2%
+ \else
+ \dofinaloutput#1#2%
+ \fi
+ \fi
+ \resetselectiepagina
+ \verhoogpaginanummer
+ \checkpagedimensions
+ \ifnum\outputpenalty>-\@MM\relax
+ \else
+ \dosupereject
+ \fi
+ \douitstellen}
+
+\def\dooutput%
+ {\finaloutput\unvbox\normalpagebox}
+
+\output={\dooutput}
+
+%I n=Beeldmerken
+%I c=\definieerbeeldmerk,\plaatsbeeldmerken
+%I
+%I In het hoofd of in de voet kan een logo worden gezet met
+%I het commando:
+%I
+%I \plaatsbeeldmerken[naam]
+%I
+%I Plaatsen kan dan ook pas nadat een beeldmerk is gedefinieerd:
+%I
+%I \definieerbeeldmerk[naam][lokatie][plaats][commando=,status=]
+%I
+%I waarbij status 'start' of 'stop' kan zijn. In geval van
+%I 'start' wordt op elke bladzijde het logo geplaatst.
+%I
+%I Mogelijke lokaties zijn 'boven', 'hoofd', 'voet' en 'onder' en
+%I als plaats kan worden opgegeven 'linkerrand', 'linkermarge',
+%I 'links', 'midden', 'rechts', 'rechtermarge' en 'rechterrand'.
+%I
+%I Logo's worden boven, onder of in de hoofd- of voetregel gezet,
+%I zo hoog of laag mogelijk. Verdere positionering zal dus in
+%I het commando moeten plaatsvinden!
+
+\newbox\leftlogos
+\newbox\rightlogos
+
+\newif\ifnewlogos
+
+% \logostatus
+%
+% 0 = niet plaatsen > 0
+% 1 = direkt plaatsen > 1
+% 2 = berekenen en plaatsen > 1
+% 3 = een pagina berekenen en plaatsen > 2
+
+\def\logostatus{0}
+
+\def\gedefinieerdebeeldmerken{}
+\def\teplaatsenbeeldmerken{}
+
+\def\dodefinieerbeeldmerk[#1][#2][#3][#4]%
+ {\addtocommalist{#1}\gedefinieerdebeeldmerken
+ \setvalue{\??lo#2#3}{#1}%
+ \getparameters[\??lo#2#3][#4]%
+ \gdef\logostatus{2}}
+
+\def\definieerbeeldmerk%
+ {\doquadrupleargument\dodefinieerbeeldmerk}
+
+\def\complexplaatsbeeldmerken[#1]%
+ {\xdef\teplaatsenbeeldmerken{#1}%
+ \gdef\logostatus{3}}
+
+\def\simpleplaatsbeeldmerken%
+ {\global\let\teplaatsenbeeldmerken=\gedefinieerdebeeldmerken
+ \gdef\logostatus{3}}
+
+\definecomplexorsimple\plaatsbeeldmerken
+
+\def\doplaatsbeeldmerken#1#2%
+ {\bgroup
+ \setbox0=\vbox
+ {\hbox
+ {\ifnum\logostatus=3
+ \def\docommando##1%
+ {\ExpandBothAfter\doifinset{\getvalue{\??lo#1##1}}{\teplaatsenbeeldmerken}
+ {#2{\hbox{\getvalue{\??lo#1##1\c!commando}}}}}%
+ \else
+ \def\docommando##1%
+ {\doifvalue{\??lo#1##1\c!status}{\v!start}
+ {#2{\hbox{\getvalue{\??lo#1##1\c!commando}}}}}%
+ \fi
+ \def\dodocommando##1##2##3##4##5##6%
+ {\hskip\linkerrandafstand
+ \hskip\pageseparation
+ \hbox to \linkermargebreedte{\docommando{##2}\hss}%
+ \hskip\linkermargeafstand
+ \hbox to \zetbreedte{\docommando{##3}\hss\docommando{##4}}%
+ \hskip\rechtermargeafstand
+ \hbox to \rechtermargebreedte{\hss\docommando{##5}}%
+ \hskip\pageseparation
+ \hskip\rechterrandafstand
+ \hbox to \rechterrandbreedte{\hss\docommando{##6}}}%
+ \normalbaselines
+ \hsmash
+ {\hbox to \zetbreedte{\hss\docommando\c!midden\hss}}%
+ \hsmash
+ {\doifbothsides
+ \hskip-\rugwit
+ \orsideone
+ \hskip-\rugwit
+ \orsidetwo
+ \hskip-\papierbreedte
+ \hskip+\rugwit
+ \hskip+\zetbreedte
+ \od
+ \hbox to \papierbreedte{\docommando\v!pagina\hss}}%
+ \swapmargins
+ \goleftonpage
+ \doifbothsidesoverruled
+ \dodocommando
+ {\v!linkerrand}{\v!linkermarge}{\v!links}
+ {\v!rechts}{\v!rechtermarge}{\v!rechterrand}%
+ \orsideone
+ \dodocommando
+ {\v!linkerrand}{\v!linkermarge}{\v!links}
+ {\v!rechts}{\v!rechtermarge}{\v!rechterrand}%
+ \orsidetwo
+ \dodocommando
+ {\v!rechterrand}{\v!rechtermarge}{\v!rechts}
+ {\v!links}{\v!linkermarge}{\v!linkerrand}%
+ \od}}%
+ \getboxheight\dimen0\of\box0\relax
+ \vskip-\dimen0
+ \box0
+ \egroup}
+
+\def\setlogobox#1#2%
+ {\global\setbox#1=\vbox to \papierhoogte
+ {\offinterlineskip
+ \mindermeldingen
+ \calculatereducedvsizes
+ #2\relax
+ \vskip-\kopwit
+ \doplaatsbeeldmerken\v!boven\vsmash
+ \vskip\kopwit
+ \doplaatsbeeldmerken\v!hoofd\vsmash
+ \vskip\hoofdhoogte
+ \vskip\hoofdafstand
+ \doplaatsbeeldmerken\v!tekst\vsmash % evt \vbox
+ \vskip\teksthoogte
+ \vskip\voetafstand
+ \vskip\voethoogte
+ \doplaatsbeeldmerken\v!voet\vbox
+ \vfilll
+ \doplaatsbeeldmerken\v!onder\vbox%
+ \vskip\kopwit}
+ \smashbox#1}
+
+\def\setlogoboxes%
+ {\showmessage{\m!layouts}{7}{}%
+ \setlogobox\leftlogos\relax
+ \ifdubbelzijdig
+ \setlogobox\rightlogos\doswapmargins
+ \fi}
+
+\def\getlogobox%
+ {\ifnum\logostatus>0
+ \ifnum\logostatus=3
+ \setlogoboxes
+ \gdef\logostatus{2}%
+ \else\ifnum\logostatus=2
+ \setlogoboxes
+ \gdef\logostatus{1}%
+ \else\ifnewlogos
+ \gdef\logostatus{2}%
+ \setlogoboxes
+ \gdef\logostatus{1}%
+ \global\newlogosfalse
+ \fi\fi\fi
+ \doifmarginswapelse
+ {\copy\leftlogos}
+ {\copy\rightlogos}%
+ \fi}
+
+%I n=Spatiering
+%I c=\stelspatieringin
+%I c=\omlaag,\opelkaar,\spatie,\vastespaties
+%I
+%I De ruimte na interpunctie worden ingesteld met:
+%I
+%I \stelspatieringin[instelling]
+%I
+%I waarbij de volgende instellingen mogelijk zijn:
+%I
+%I ruim flexibele ruimte na interpunctie
+%I opelkaar een spatie na interpunctie
+%I
+%I Bij een smalle layout levert de instelling 'ruim' minder
+%I in de marge uitstekende (niet af te breken) woorden op.
+%I
+%P
+%I Andere commando's zijn:
+%I
+%I \omlaag[afstand] een vaste afstand omlaag
+%I \opelkaar ruimte tussen regels weghalen
+%I
+%I \spatie een (harde) spatie
+%I \geenspatie geen vorige/volgende spatie
+%I
+%I \hfil \hfill \hfilll opvullen met horizontaal wit
+%I \vfil \vfill \vfilll opvullen met vertikaal wit
+%I
+%I \strut karakter-box zonder breedte
+%I
+%I \vastespaties geeft ~ de breedte van een cijfer
+
+% \frenchspacing leidt soms tot afbreken tussen -, vandaar
+% de variant \newfrenchspacing.
+
+\def\dofrenchspacing#1%
+ {\sfcode`\.#1 \sfcode`\,#1\relax
+ \sfcode`\?#1 \sfcode`\!#1\relax
+ \sfcode`\:#1 \sfcode`\;#1\relax}
+
+\def\frenchspacing%
+ {\dofrenchspacing{1000}} % \@m
+
+\def\newfrenchspacing%
+ {\dofrenchspacing{1050}} % \@ml
+
+\def\dostelspatieringin[#1]%
+ {\processaction
+ [#1]
+ [\v!opelkaar=>\newfrenchspacing,
+ \v!ruim=>\nonfrenchspacing]}
+
+\def\stelspatieringin%
+ {\dosingleargument\dostelspatieringin}
+
+\def\space%
+ { }
+
+\def\spatie% kan tzt vervallen, eerst overal in zetten
+ { }
+
+\def\hardespatie%
+ {~}
+
+\bgroup
+\catcode`\~=\@@active % eigenlijk is ~ al actief
+\gdef\fixedspaces% % in Plain \TeX, maar we weten
+ {\catcode`\~=\@@active % nooit wat er inmiddels is
+ \def~{\hskip.5em}} % gebeurd, vandaar.
+\egroup
+
+\def\nospace%
+ {\unskip\ignorespaces}
+
+\def\geenspatie% % kan tzt vervallen, eerst overal in zetten
+ {\unskip\ignorespaces}
+
+\def\geenspaties{\geenspaties} % kan weg
+
+\def\opelkaar%
+ {\nointerlineskip}
+
+\def\omlaag[#1]%
+ {\nointerlineskip%
+ \vskip#1 }
+
+%I n=Witruimte
+%I c=\stelwitruimtein,\witruimte,\geenwitruimte
+%I c=\startopelkaar,\startvanelkaar
+%I c=\startregelcorrectie,\corrigeerwitruimte
+%I
+%I De afstand tussen paragrafen is in te stellen met:
+%I
+%I \stelwitruimtein[maat]
+%I
+%I In te vullen op de plaats van 'maat' (12pt, 1cm) of een
+%I van de aanduidingen klein, middel of groot. Als niets
+%I wordt meegegeven, dus alleen \stelwitruimtein, dan
+%I wordt de ingestelde witruimte aangepast aan het formaat
+%I letter.
+%I
+%I Voor elke lege regel in de ASCII-file voegt TEX de
+%I ingestelde witruimte tussen.
+%I
+%I Het commando \witruimte dwingt witruimte af en het
+%I commando \geenwitruimte maakt witruimte ongedaan.
+%I
+%I Behalve met de hier beschreven witruimte-commando's is de
+%I witruimte tussen paragrafen te be‹nvloeden met behulp van
+%I de elders beschreven blanko-commando's.
+%P
+%I Een stuk tekst kan zonder witruimte worden gezet door het
+%I tussen de volgende commando's op te nemen:
+%I
+%I \startopelkaar
+%I \stopopelkaar
+%I
+%I Waarbij een optioneel argument [blanko] mogelijk is. De
+%I tegenhanger hiervan is:
+%I
+%I \startvanelkaar
+%I \stopvanelkaar
+%P
+%I TeX handelt de interlinie van een (omlijnde) box of een
+%I rule anders af dan van een regel tekst. In dergelijke
+%I gevallen kan de volgende constructie worden gebruikt:
+%I
+%I \startregelcorrectie
+%I \omlijnd{tekst}
+%I \stopregelcorrectie
+
+\newskip\tussenwit
+\tussenwit=\!!zeropoint
+
+\def\blankokleinmaat%
+ {\smallskipamount}
+
+\def\blankomiddelmaat%
+ {\medskipamount}
+
+\def\blankogrootmaat%
+ {\bigskipamount}
+
+\def\currentwitruimte%
+ {\!!zeropoint}
+
+\def\stelwitruimteopnieuwin%
+ {\expanded{\stelwitruimtein[\currentwitruimte]}}
+
+% \def\dodostelwitruimtein[#1]%
+% {\processallactionsinset
+% [#1]
+% [\v!herstel=>\parskip=\tussenwit,
+% \v!regel=>\edef\currentwitruimte{#1}%
+% \tussenwit=\baselineskip
+% \parskip=\tussenwit,
+% \v!vast=>\tussenwit=1\tussenwit
+% \parskip=1\parskip,
+% \s!default=>\doifnot{\currentwitruimte}{\v!geen}
+% {\stelwitruimteopnieuwin},
+% \s!unknown=>\edef\currentwitruimte{#1}%
+% \assigndimension{#1}
+% {\tussenwit}{\blankokleinmaat}
+% {\blankomiddelmaat}{\blankogrootmaat}%
+% \parskip=\tussenwit]}
+
+\newif\ifwitruimteflexibel
+
+\def\dodostelwitruimtein[#1]%
+ {\witruimteflexibeltrue
+ \processallactionsinset
+ [#1]
+ [\v!herstel=>,
+ \v!vast=>\witruimteflexibelfalse,
+ \v!flexibel=>\witruimteflexibeltrue,
+ \v!regel=>\tussenwit=\baselineskip,
+ \v!halveregel=>\tussenwit=.5\baselineskip,
+ \s!default=>\doifnot{\currentwitruimte}{\v!geen}
+ {\stelwitruimteopnieuwin},
+ \s!unknown=>\@EA\assigndimension\@EA{\commalistelement} % \@EA is nodig
+ {\tussenwit}{\blankokleinmaat} % om loops af
+ {\blankomiddelmaat}{\blankogrootmaat}]% % te vangen
+ \edef\currentwitruimte%
+ {\ifdim\tussenwit=\!!zeropoint
+ \v!geen
+ \else
+ \ifgridsnapping\the\baselineskip\else\the\tussenwit\fi
+ \fi}%
+ \ifgridsnapping
+ \witruimteflexibelfalse
+ \tussenwit=1\tussenwit
+ \ifdim\tussenwit>\!!zeropoint
+ \tussenwit=\baselineskip
+ \fi
+ \else
+ \ifwitruimteflexibel \else \tussenwit=1\tussenwit \fi
+ \fi
+ \parskip=\tussenwit}
+
+\def\dostelwitruimtein[#1]%
+ {\expanded{\dodostelwitruimtein[#1]}}
+
+\def\stelwitruimtein%
+ {\dosingleempty\dostelwitruimtein}
+
+\def\geenwitruimte%
+ {\ifdim\parskip>\!!zeropoint\relax
+ \ifdim\lastskip=-\parskip
+ \else
+ \vskip-\parskip
+ \fi
+ \fi}
+
+% deze variant is nodig binnen \startopelkaar
+% steeds testen:
+%
+% \hoofdstuk{..}
+% \plaatslijst[..]
+% \hoofdstuk{..}
+% \input tufte
+%
+% met/zonder witruimte
+
+\def\witruimte%
+ {\par
+ \ifdim\parskip>\!!zeropoint\relax
+ %\ifdim\lastskip>\parskip \else
+ % \removelastskip interferes with blanko blokkeer en klein
+ \vskip\parskip
+ %\fi
+ \fi}
+
+
+\def\nonoblanko[#1]%
+ {\par}
+
+\def\noblanko%
+ {\dosingleempty\nonoblanko}
+
+% De onderstaande macro handelt ook de situatie dat er geen
+% tekst tussen \start ... \stop is geplaatst. Daartoe wordt de
+% laatste skip over de lege tekst heen gehaald. Dit komt goed
+% van pas bij het plaatsen van (mogelijk lege) lijsten.
+
+\newif\ifopelkaar
+
+\def\noparskipsignal {0.00001pt}
+\def\lastdoneparskip {0pt}
+
+\def\startopelkaar%
+ {\dosingleempty\dostartopelkaar}
+
+\def\dostartopelkaar[#1]% nesting afvangen
+ {\par
+ \ifvmode
+ \edef\lastdoneparskip{\the\lastskip}%
+\edef\lastdoneprevdepth{\the\prevdepth}% zeer recent toegevoegd
+ \ifdim\prevdepth=-1000pt % toegevoegd omdat binnen
+ \else % een vbox een extra skip
+ \witruimte % ongewenst is; dit kan
+ \vskip\noparskipsignal % waarschijnlijk ook in
+ \fi % blanko blokkeer
+ \bgroup
+ \doifelse{#1}{\v!blanko}
+ {\opelkaarfalse}
+ {\opelkaartrue}%
+ \blanko[\v!blokkeer]%
+ \stelwitruimtein[\v!geen]
+ \fi}
+
+\def\stopopelkaar%
+ {\par
+\ifvmode
+ \egroup
+ \ifdim\lastskip=\noparskipsignal\relax
+ \removelastskip
+ \geenwitruimte
+ \vskip-\lastdoneparskip
+ \vskip+\lastdoneparskip
+\prevdepth-\lastdoneprevdepth % zeer recent toegevoegd
+ \fi
+\fi}
+
+\def\startvanelkaar%
+ {\blanko
+ \leavevmode
+ \bgroup}
+
+\def\stopvanelkaar%
+ {\egroup
+ \blanko}
+
+% De onderstaande macro's moeten nog eens nader worden uitgewerkt.
+% Ze spelen een rol bij de spatiering rond omkaderde teksten
+% en/of boxen zonder diepte.
+
+\def\toonregelcorrectie {\showbaselinecorrection}
+\def\regelcorrectie {\baselinecorrection}
+%\def\startregelcorrectie {\startbaselinecorrection}
+%\def\stopregelcorrectie {\stopbaselinecorrection}
+
+\definecomplexorsimpleempty\startregelcorrectie
+
+% \prevdepth crosses pageboundaries!
+
+\let\dorondomregelcorrectie=\relax
+
+\def\complexstartregelcorrectie[#1]%
+ {\bgroup
+ \processaction
+ [#1]
+ [ \v!blanko=>\let\dorondomregelcorrectie=\blanko,
+ \s!default=>\let\dorondomregelcorrectie=\relax,
+ \s!unknown=>{\def\dorondomregelcorrectie{\blanko[#1]}}]%
+ \dorondomregelcorrectie
+ \startbaselinecorrection
+ \offbaselinecorrection}
+
+\def\stopregelcorrectie%
+ {\stopbaselinecorrection
+ \dorondomregelcorrectie
+ \egroup}
+
+\def\corrigeerwitruimte%
+ {\dowithnextbox
+ {\startbaselinecorrection
+ \box\nextbox
+ \stopbaselinecorrection}%
+ \vbox}
+
+%I n=Regelafstand
+%I c=\stelinterliniein
+%I
+%I De regelafstand is in te stellen met het commando:
+%I
+%I \stelinterliniein[factor]
+%I
+%I Invulmogelijkheden voor 'factor' zijn: klein (1.00),
+%I middel (1.25), groot (1.50) of een getal. OOk kan
+%I aan of uit worden opgegeven.
+%I
+%I Als het commando zonder [factor] wordt gegeven, dan
+%I worden de interlinie aangepast aan het formaat van het
+%I actuele letterformaat. Een aan het formaat aangepaste
+%I interlinie kan ook worden ingesteld met:
+%I
+%I \stelinterliniein[reset,factor]
+%I
+%I In z'n eenvoudigste vorm \stelinterliniein wordt de
+%I interlinie aangepast aan het formaat letter.
+
+%D There are two ways to influence the interline spacing. The
+%D most general and often most consistent way is using
+%D
+%D \showsetup{\y!stelinterliniein}
+%D
+%D For instance
+%D
+%D \starttypen
+%D \setupinterlinespace[line=2.8ex]
+%D \stoptypen
+%D
+%D This setting adapts itself to the bodyfontsize, while for
+%D instance saying
+%D
+%D \starttypen
+%D \setupinterlinespace[line=12pt]
+%D \stoptypen
+%D
+%D sets things fixed for all sizes, which is definitely not
+%D what we want. Therefore one can also say:
+%D
+%D \starttypen
+%D \definecorpsenvironment[9pt][interlinespace=11pt]
+%D \stoptypen
+%D
+%D One can still use \type{\setupinterlinespace} (without
+%D arguments) to set the interline space according to the
+%D current font, e.g. a \type{\bfa}.
+
+\newif\iflocalinterlinespace
+
+\def\bodyfontinterlinespecs%
+ {\??ft\normalizedbodyfontsize\c!interlinie}
+
+\def\bodyfontinterlinespace%
+ {\csname\bodyfontinterlinespecs\endcsname}
+
+\def\presetnormallineheight%
+ {\edef\normallineheight{\@@itregel}%
+ \iflocalinterlinespace \else
+ \doifdefined{\bodyfontinterlinespecs}
+ {\doifsomething{\bodyfontinterlinespace}
+ {\edef\normallineheight{\bodyfontinterlinespace}}}%
+ \fi}
+
+\def\complexstelinterliniein[#1]% \commalistelement ipv #1
+ {\doifassignmentelse{#1}
+ {\getparameters[\??it][#1]%
+ \scratchdimen=0\@@ithoogte pt
+ \advance\scratchdimen by 0\@@itdiepte pt
+ \ifdim\scratchdimen>1pt
+ \showmessage{\m!layouts}{10}{\@@ithoogte,\@@itdiepte}%
+ \let\@@ithoogte=\strutheightfactor
+ \let\@@itdiepte=\strutdepthfactor
+ \else
+ \let\strutheightfactor=\@@ithoogte
+ \let\strutdepthfactor =\@@itdiepte
+ \fi
+ \let\normallineheight=\@@itregel
+ \let\topskipfactor =\@@itboven
+ \let\maxdepthfactor =\@@itonder
+ \setfontparameters} % overbodig \setstrut
+ {\processallactionsinset % \regelwit = dummy !
+ [#1]
+ [ \v!aan=>\oninterlineskip,
+ \v!uit=>\offinterlineskip,
+ \v!reset=>\setfontparameters,
+ \s!unknown=>\assignvalue{#1}{\regelwit}{1.00}{1.25}{1.50}%
+ \spacing{\regelwit}]}}
+
+\def\simplestelinterliniein%
+ {\localinterlinespacetrue
+ \setfontparameters
+ \localinterlinespacefalse}
+
+\definecomplexorsimple\stelinterliniein
+
+%I n=Blanko
+%I c=\blanko,\geenblanko,\stelblankoin
+%I c=\startregelcorrectie
+%I
+%I Behalve met de hier beschreven blanko-commando's is de
+%I witruimte tussen paragrafen te be‹nvloeden met behulp van
+%I de elders beschreven witruimte-commando's.
+%I
+%I Het commando
+%I
+%I \blanko[sprong]
+%I
+%I voegt witruimte tussen paragrafen toe.
+%I
+%I Mogelijke instellingen voor 'sprong' zijn: terug, klein,
+%I middel, groot. Per blanko is elke combinatie van
+%I instellingen toegestaan. Ook een veelvoud van een instelling
+%I is mogelijk. Enkele voorbeelden:
+%I
+%I \blanko[terug,3*groot]
+%I \blanko[klein,middel]
+%P
+%I Naast de genoemde instellingen zijn enkele bijzondere
+%I instellingen mogelijk:
+%I
+%I wit tussenvoegen van \witruimte
+%I geenwit terugspringen van \witruimte
+%I blokkeer overslaan van de volgende \blanko
+%I reset opheffen van \blanko[blokkeer]
+%I forceer afdwingen van een blanko (bovenaan)
+%I
+%I Ook deze instellingen zijn in combinatie met andere te
+%I gebruiken. Een voorbeeld: \blanko[forceer,wit,2*middel].
+%I
+%I Het commando \blanko (zonder instelling) is gelijk aan
+%I \blanko[groot].
+%I
+%I Het commando \geenblanko maakt het commando \blanko
+%I ongedaan.
+%P
+%I Met het commando's
+%I
+%I \stelblankoin[maat]
+%I
+%I is het mogelijk de spronggrootte in te stellen. De maat
+%I kan worden opgegeven in getallen en eenheden (12pt, 1cm).
+%I De standaard instellingen krijgt met met 'normaal',
+%I regelafstanden met 'regel'.
+%I
+%I Het commando \stelblankoin (zonder argument) past de sprong
+%I aan het formaat letter aan.
+%P
+%I Rond omlijnde tekst, of algemener: rond lijnen, wordt
+%I geen witruimte gegenereerd. Wil men dit wel, dan dient men
+%I de betreffende tekst te omringen met:
+%I
+%I \startregelcorrectie
+%I \stopregelcorrectie
+
+% In earlier versions \type{\bigskipamount} was
+% \type{\ht\strutbox} and the stretch was plus or minus
+% \type{.4\dp\strutbox}. Don't ask me why. The most recent
+% implementation is based on a user supplied distance, which
+% is by default \type{.75\normalskipamount} where
+% \type{\normalskipamount} equals the current baseline
+% distance.
+
+\newif\ifblankoreset \blankoresetfalse
+\newif\ifblankoblokkeer \blankoblokkeerfalse
+\newif\ifblankogeenwit \blankogeenwitfalse
+\newif\ifdoeblanko \doeblankofalse
+\newif\ifblankoflexibel \blankoflexibeltrue
+\newif\ifblankobuiten
+
+\newskip\blankoskip \blankoskip=\bigskipamount
+\newskip\blankoskipamount
+
+\def\skipfactor {.75}
+\def\skipgluefactor {.25}
+
+%\def\normalskipamount%
+% {\openlineheight
+% \ifblankoflexibel
+% \!!plus\skipgluefactor\openlineheight
+% \!!minus\skipgluefactor\openlineheight
+% \fi
+% \relax}
+
+\def\normalskipamount%
+ {\openlineheight
+ \ifgridsnapping \else \ifblankoflexibel
+ \!!plus\skipgluefactor\openlineheight
+ \!!minus\skipgluefactor\openlineheight
+ \fi \fi
+ \relax}
+
+\def\regelafstand{\normalskipamount}
+
+\def\deblankoskip{\skipfactor\regelafstand}
+
+\def\laatsteblankoskip%
+ {\blankoskip}
+
+\def\geenblanko%
+ {\removelastskip}
+
+\def\dosingleblanko#1% ook nog \v!halveregel+fuzzysnap
+ {\doifelse{#1}{\v!regel}
+ {\blankoskipamount=\openlineheight}
+ {\ifgridsnapping
+ \assigndimension{#1}{\blankoskipamount}%
+ {.25\openlineheight}{.5\openlineheight}{\openlineheight}%
+ \else
+ \assigndimension{#1}{\blankoskipamount}%
+ {\smallskipamount}{\medskipamount}{\bigskipamount}%
+ \fi}%
+ \global\advance\blankoskip by \blankoskipamount}
+
+\newif\iffuzzyvskip
+
+\def\doblanko#1%
+ {\processallactionsinset
+ [#1]
+ [ \v!groot=>\dosingleblanko\v!groot, % happens often
+ \v!buiten=>\ifvmode\ifinner\blankobuitentrue\fi\fi,
+ \v!reset=>\global\blankoresettrue,
+ \v!terug=>\geenblanko,
+ \v!wit=>\global\advance\blankoskip by \parskip,
+ \v!formule=>\global\advance\blankoskip by \medskipamount,
+ \v!geenwit=>\global\blankogeenwittrue,
+ -\v!wit=>\global\advance\blankoskip by -\parskip,
+ \v!blokkeer=>\global\blankoblokkeertrue,
+ \v!forceer=>\endgraf\ifdim\prevdepth>0pt\else\line{}\kern-\lineheight\fi,
+ \v!regel=>\global\advance\blankoskip by \lineheight,
+ \v!halveregel=>\global\fuzzyvskiptrue\global\advance\blankoskip by .5\lineheight,
+ \s!unknown=>{\herhaalmetcommando[#1]\dosingleblanko}]}
+
+\def\oldprevdepth{\prevdepth}%
+\def\newprevdepth{-1001pt}
+
+\def\mindimen{0.00002pt}
+
+\def\docomplexdoblanko[#1]% pas op \relax's zijn nodig ivm volgende \if
+ {\global\blankoresetfalse
+ \global\blankoblokkeerfalse
+ \global\blankogeenwitfalse
+ \global\blankoskip=\!!zeropoint\relax
+ \blankobuitenfalse
+ \processcommalist[#1]\doblanko
+ \ifblankobuiten
+ \else
+ \par
+ \ifvmode
+ \ifblankoblokkeer
+ \global\doeblankofalse
+ \edef\oldprevdepth{\the\prevdepth}%
+ \prevdepth=\newprevdepth
+ \else
+ \global\doeblankotrue
+ \fi
+ \ifblankoreset
+ \global\doeblankotrue
+ \ifdim\prevdepth=\newprevdepth
+ \prevdepth=\oldprevdepth
+ \fi
+ \fi
+ \ifdoeblanko
+ \ifdim\lastskip<\blankoskip\relax
+ % else when \blanko[2*groot] + \blanko[3*groot] with parskip
+ % equaling 1*groot, gives a groot=\parskip so adding a small
+ % value makes it distinguishable; can also be done at parskip
+ % setting time (better)
+ \global\advance\blankoskip by \mindimen\relax % = skip
+ % test this on 2* + 3* and parskip groot
+ \ifblankogeenwit
+ \global\advance\blankoskip by -\parskip
+ \else
+ \ifdim\lastskip=\parskip
+ \else % force this due to previous comment
+ \ifdim\parskip>\!!zeropoint\relax
+ \ifdim\blankoskip<\parskip\relax
+ \global\blankoskip=\!!zeropoint
+ \else
+ \global\advance\blankoskip by -\parskip
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifdim\prevdepth=\newprevdepth
+ \else
+ \iffuzzyvskip
+ \removelastfuzzyvskip
+ \fuzzyvskip\blankoskip\relax
+ \else
+ \removelastskip
+ \vskip\blankoskip\relax
+ \fi
+ \fi
+ \else
+ % Now, what happens to fuzzy skips?
+ \fi
+ \fi
+ \fi
+ \fi
+ \global\fuzzyvskipfalse
+ \presetindentation}
+
+\def\complexdoblanko[#1]%
+ {\flushfootnotes
+ \ifopelkaar
+ \ifinpagebody
+ \expanded{\docomplexdoblanko[#1]}% \expanded=nieuw
+ \else
+ \par
+ \fi
+ \else
+ \expanded{\docomplexdoblanko[#1]}% \expanded = nieuw
+ \fi}
+
+\def\currentblanko%
+ {\v!groot}
+
+\def\simpledoblanko%
+ {\doifelse{\currentwitruimte}{\v!geen}
+ {\blanko[\currentblanko]}
+ {\blanko[\currentwitruimte]}}
+
+\def\blanko%
+ {\complexorsimple{doblanko}}
+
+\def\dostelblankoin#1%
+ {\bgroup
+ \skip0=#1\relax
+ \xdef\globalblanko{\the\skip0}%
+ \egroup
+ \bigskipamount=\globalblanko
+ \smallskipamount=\globalblanko
+ \medskipamount=\globalblanko
+ \divide\medskipamount by 2\relax
+ \divide\smallskipamount by 4\relax}%
+
+\def\complexstelblankoin[#1]%
+ {\ExpandFirstAfter\processallactionsinset
+ [#1]
+ [ \v!flexibel=>\blankoflexibeltrue,
+ \v!vast=>\blankoflexibelfalse]%
+ \ExpandFirstAfter\processallactionsinset
+ [#1]
+ [ \v!flexibel=>\dostelblankoin{\deblankoskip},
+ \v!vast=>\dostelblankoin{\deblankoskip},
+ \v!regel=>\edef\deblankoskip{\regelafstand}%
+ \dostelblankoin{\deblankoskip}%
+ \let\deblanko=\v!groot,
+ \v!groot=>\ifgridsnapping
+ \edef\deblankoskip{\regelafstand}%
+ \dostelblankoin{\deblankoskip}%
+ \fi
+ \def\currentblanko{\v!groot}%
+ \let\deblanko=\v!groot,
+ \v!middel=>\def\currentblanko{\v!middel}%
+ \let\deblanko=\v!middel,
+ \v!klein=>\def\currentblanko{\v!klein}%
+ \let\deblanko=\v!klein,
+ \v!normaal=>\dostelblankoin{\deblankoskip}%
+ \let\deblanko=\v!groot,
+ \v!standaard=>\edef\deblankoskip{\skipfactor\regelafstand}%
+ \dostelblankoin{\deblankoskip}%
+ \let\deblanko=\v!groot,
+ \s!default=>\dostelblankoin{\deblankoskip}%
+ \let\deblanko=\v!groot,
+ \s!unknown=>\let\deblankoskip=\commalistelement
+ \dostelblankoin{\deblankoskip}%
+ \let\deblanko=\v!groot]%
+ \stelwitruimtein}
+
+\def\stelblankoin%
+ {\complexorsimpleempty{stelblankoin}}
+
+%I n=Inspringen
+%I c=\inspringen,\nietinspringen,\welinspringen
+%I c=\stelinspringenin
+%I
+%I Het inspringen van de eerste regel van een paragraaf
+%I wordt ingesteld met het commando:
+%I
+%I \inspringen[parameter]
+%I
+%I waarbij als parameter kan worden meegegeven:
+%I
+%I niet de volgende paragraaf niet inspringen
+%I nooit de volgende paragrafen niet inspringen
+%I altijd de volgende paragrafen inspringen
+%I
+%I De mate van inspringen wordt ingesteld met:
+%I
+%I \stelinspringenin[maat]
+%I
+%I waarbij maat staat voor een TeX-maat of het woord klein,
+%I middel, groot of geen.
+
+\let\currentvoorwit=\empty
+
+\newdimen\voorwit
+
+\newif\ifindentfirstparagraph % \indentfirstparagraphtrue
+
+\def\presetindentation%
+ {\ifindentfirstparagraph\else\noindentation\fi}
+
+\def\dostelinspringenin[#1]%
+ {\processallactionsinset
+ [#1]
+ [ \v!eerste=>\indentfirstparagraphtrue,
+ \v!volgende=>\indentfirstparagraphfalse,
+ \s!default=>\dodostelinspringenin,
+ \s!unknown=>\let\currentvoorwit=\commalistelement
+ \dodostelinspringenin]}
+
+\def\dodostelinspringenin%
+ {\assigndimension{\currentvoorwit}{\voorwit}{1em}{1.5em}{2em}%
+ \parindent=\voorwit\relax}
+
+\def\stelinspringenin%
+ {\dosingleempty\dostelinspringenin}
+
+\def\doinspringen[#1]%
+ {\processallactionsinset
+ [#1]
+ [ \v!nee=>\parindent=\voorwit\relax\noindent,
+ \v!niet=>\parindent=\voorwit\relax\noindent,
+ \v!ja=>\parindent=\voorwit\relax, % geen \indent !
+ \v!eerste=>\indentfirstparagraphtrue,
+ \v!volgende=>\indentfirstparagraphfalse,
+ \v!altijd=>\parindent=\voorwit\relax, % geen \indent !
+ \v!nooit=>\parindent=\!!zeropoint\relax]}
+
+\def\inspringen%
+ {\dosingleargument\doinspringen}
+
+\def\nietinspringen{\inspringen[\v!nee,\v!volgende]}
+\def\welinspringen {\inspringen[\v!ja,\v!eerste]}
+
+%I n=Verhogen,Verlagen
+%I c=\laag,\hoog,\laho
+%I
+%I Met de volgende commando's kunnen letters en woorden
+%I worden verhoogd en verlaagd.
+%I
+%I \laag{tekst}
+%I \hoog{tekst}
+%I \laho{lage tekst}{hoge tekst}
+
+\def\holatextfont{\tx}
+\def\holamathfont{\the\scriptfont\fam}
+
+\def\dodohooglaag#1%
+ {\doifelsenothing{\fontsize}
+ %{\ifnum\fam<0 \holatextfont\else\holamathfont\fi#1}
+ {\ifmmode
+ \ifnum\fam<0
+ \holatextfont
+ \else
+ \holamathfont
+ \fi
+ \else
+ \holatextfont
+ \fi#1}
+ {\holatextfont#1}}
+
+\def\dohooglaag#1#2#3#4#5%
+ {\bgroup
+ \ifdim\fontdimen5\textfont2=1ex
+ \dimen0=\fontdimen#1\textfont2
+ \else
+ \dimen0=#2ex
+ \fi
+ \advance\dimen0 by #3\relax
+ \kern.1ex
+ \setbox0=\hbox{#4\dimen0\hbox{\dodohooglaag{#5}}}%
+ \ht0=\ht\strutbox
+ \dp0=\dp\strutbox
+ \box0
+ \egroup}
+
+\unexpanded\def\hoog%
+ {\dohooglaag{14}{.86}\!!zeropoint\raise}
+
+\unexpanded\def\laag%
+ {\dohooglaag{16}{.48}\!!zeropoint\lower}
+
+\unexpanded\def\laho#1#2%
+ {\hbox%
+ {\setbox4=\hbox{\dohooglaag{16}{.48}{.1ex}{\lower}{#1}}%
+ \setbox6=\hbox{\dohooglaag{14}{.86}{.1ex}{\raise}{#2}}%
+ \ifdim\wd4<\wd6\relax
+ \wd4=\!!zeropoint\box4\box6\relax
+ \else
+ \wd6=\!!zeropoint\box6\box4\relax
+ \fi}}
+
+%I n=Kapitalen
+%I c=\kap,\Kap,\KAP,\Kaps,\Woord,\Woorden,\opgerekt
+%I
+%I Kapitalen kunnen in een kleiner letterformaat worden
+%I weergegeven met de commando's:
+%I
+%I \kap{tekst}
+%I \Kap{tekst}
+%I \KAP{tekst}
+%I
+%I Bij het eerste commando wordt de hele tekst in kapitalen
+%I gezet, bij het tweede alleen de eerste letter en bij het
+%I laatste commando de letters die worden voorafgegaan door
+%I \\, bijvoorbeeld \KAP{\\Commissie \\Ziezo}.
+%I
+%I Als de tekst van het laatste commando uit woorden bestaat,
+%I kan ook het volgende commando worden gebruikt:
+%I
+%I \Kaps{tekst tekst tekst}
+%I
+%I In dat geval zijn geen \\ nodig.
+%P
+%I Binnen \kap kan \nokap worden gebruikt om een kleine
+%I letter af te dwingen: \kap{AM\nokap{v}B}.
+%I
+%I Een eerste letter(s) van een of meer woorden kunnen worden
+%I omgezet in een hoofdletter met het commando
+%I
+%I \Woord{woord}
+%I \Woorden{woord woord woord ...}
+%I
+%I Een heel woord kan in hoofdletters worden omgezet met:
+%I
+%I \WOORD{tekst}
+%P
+%I Woorden kunnen worden uitgerekt over de actuele breedte
+%I met:
+%I
+%I \opgerekt{tekst}
+%I
+%I bijvoorbeeld:
+%I
+%I \hbox to 20em{\opgerekt{abcdef\\ghijk}}
+%I
+%I met \\ of {} wordt een spatie afgedwongen.
+
+%T n=kap
+%T m=kap
+%T a=k
+%T
+%T \kap{?}
+
+%I n=Afbreken
+%I c=\stelkoppeltekenin
+%I
+%I Met streepjes (-, --, ---) verbonden worden alleen afgebroken
+%I op de plaats van het streepje. Wil men kunnen afbreken op
+%I andere plaatsen, dan moet men de volgende constructie
+%I gebruiken:
+%I
+%I ditiseen|---|heellangwoord|--|hoeweleigenlijkis|-|heteenzin
+%I
+%I Het is ook mogelijk geen teken mee te geven:
+%I
+%I ditiseen||heellangwoord
+%I
+%I In dat geval wordt het ingestelde teken tussengevoegd. Het
+%I teken kan worden ingesteld met:
+%I
+%I \stelkoppeltekenin[teken=]
+%I
+%I Betekenisvolle waarden zijn: - en --, eventueel kan ~
+%I worden meegegeven. In dat geval wordt een \thinspace
+%I geplaatst.
+%P
+%I Een |~| levert midden in de zin een spatie en aan het
+%I eind van de zin een streepje, || is standaard equivalent
+%I met |--|.
+%I
+%I Het koppelteken zelf kan worden opgeroepen met |=|,
+%I bijvoorbeeld in alfa|=| en beta||deeltjes. Dit levert
+%I dus alfa- en beta-deeltjes of alfa-- en beta--deeltjes.
+%I Andere instellingen worden afgevangen.
+%I
+%I Ook ( en ) worden afgevangen. Hierbij wordt bij het
+%I afbreken van voor(na) op de volgende regel (-na)
+%I geplaatst. En wat te denken van |<| en |>|.
+
+% we use module supp-lan.tex
+
+\installdiscretionaries || \@@kpteken
+
+\newsignal\subsentencesignal
+\newcounter\subsentencelevel
+\def\subsentenceskip{.25em\relax}
+
+\def\stelkoppeltekenin%
+ {\dodoubleargument\getparameters[\??kp]}
+
+\def\beginofsubsentence%
+ {\ifdim\lastkern=\subsentencesignal
+ \unskip
+ \kern\subsentenceskip
+ \fi
+ \doglobal\increment\subsentencelevel
+ \ifnum\subsentencelevel=1
+ \leaveoutervmode
+ \fi
+ \ifodd\subsentencelevel
+ \getvalue{\??la\currentlanguage\c!leftsentence}%
+ \else
+ \getvalue{\??la\currentlanguage\c!leftsubsentence}%
+ \fi
+ \ignorespaces}
+
+\def\beginofsubsentencespacing%
+ {\kern\subsentencesignal\ignorespaces}
+
+\def\endofsubsentence%
+ {\ifodd\subsentencelevel
+ \getvalue{\??la\currentlanguage\c!rightsentence}%
+ \else
+ \getvalue{\??la\currentlanguage\c!rightsubsentence}%
+ \fi
+ \doglobal\decrement\subsentencelevel
+ \unskip
+ \kern\subsentencesignal}
+
+\def\endofsubsentencespacing%
+ {%\ifdim\lastkern=\subsentencesignal \else
+ % \unskip
+ %\fi
+ \ifdim\lastkern=\subsentencesignal
+ \unskip
+ \hskip\subsentenceskip
+ \ignorespaces
+ \else
+ \unskip
+ \fi}
+
+% test |<|test |<|test|>| test|>| test \par
+% test|<|test|<|test|>|test|>|test \par
+% test |<||<|test|>||>| test \par
+
+\enableactivediscretionaries
+
+%I n=Positioneren
+%I c=\startpositioneren,\stelpositionerenin
+%I
+%I Er kan (binnen zekere grenzen) gepositioneerd worden met
+%I de commando's:
+%I
+%I \startpositioneren
+%I \stoppositioneren
+%I
+%I met daartussen
+%I
+%I \positioneer(x,y){...}
+%I
+%I waarbij x en y alleen getallen worden ingevuld. Ongewenste
+%I spaties moeten zonodig met worden voorkomen met een %-teken.
+%P
+%I Een en ander kan worden ingesteld met:
+%I
+%I \stelpositionerenin[eenheid=,factor=,schaal=,xstap=,
+%I ystap=,xoffset=,yoffset=,offset=]
+%I
+%I Standaard is de eenheid cm en de factor 1. Mogelijke
+%I stapaanduidingen zijn 'absoluut' en 'relatief'. Deze
+%I instellingen kunnen \resetpositioneren worden hersteld.
+%I
+%I Als men negatieve coordinaten (of een negatieve offset)
+%I gebruikt, dan kan het soms wenselijk zijn het nulpunt te
+%I laten samenvallen met de linkerbovenhoek van de omringende
+%I box. In dat geval kan met offset=nee instellen. De negatieve
+%I posities vallen in dat geval buiten de box.
+
+% Het gebruik van \skip's spaart \dimen's.
+
+\newskip\xpositie
+\newskip\ypositie
+
+\newskip\xafmeting
+\newskip\yafmeting
+
+\newskip\xoffset
+\newskip\yoffset
+
+\newbox\positiebox
+
+\def\startpositioneren%
+ {\bgroup
+ \xpositie=\!!zeropoint
+ \ypositie=\!!zeropoint
+ \xafmeting=\!!zeropoint
+ \yafmeting=\!!zeropoint
+ \xoffset=\!!zeropoint
+ \yoffset=\!!zeropoint
+ \hfuzz=30cm
+ \vfuzz=30cm
+ \setbox\positiebox=\hbox\bgroup}
+
+\def\stoppositioneren%
+ {\doifnot{\@@psoffset}{\v!ja}
+ {\global\xoffset=\!!zeropoint
+ \global\yoffset=\!!zeropoint}%
+ \global\advance\xafmeting by \xoffset
+ \global\advance\yafmeting by \yoffset
+ \egroup
+ \vbox to \yafmeting
+ {\vskip\yoffset
+ \hbox to \xafmeting
+ {\hskip\xoffset
+ \box\positiebox
+ \hfill}%
+ \vfill}%
+ \egroup}
+
+\def\resetpositioneren%
+ {\getparameters[\??ps]
+ [\c!eenheid=\s!cm,
+ \c!factor=1,
+ \c!xfactor=\@@psfactor,
+ \c!yfactor=\@@psfactor,
+ \c!schaal=1,
+ \c!xschaal=\@@psschaal,
+ \c!yschaal=\@@psschaal,
+ \c!xstap=\v!absoluut,
+ \c!ystap=\v!absoluut,
+ \c!xoffset=\!!zeropoint,
+ \c!yoffset=\!!zeropoint]}
+
+\resetpositioneren
+
+\def\stelpositionerenin%
+ {\resetpositioneren%
+ \dodoubleargument\getparameters[\??ps]}%
+
+\def\positioneer(#1,#2)#3% \nextbox
+ {\setbox0=\hbox{#3}%
+ \def\berekenpositioneren##1##2##3##4##5##6##7##8##9%
+ {\skip0=##1\@@pseenheid\relax
+ \skip0=##8\skip0\relax
+ \skip0=##9\skip0\relax
+ \doifelse{##2}{\v!relatief}%
+ {\advance\skip0 by ##3\relax
+ \advance\skip0 by ##4\relax
+ \def##4{\!!zeropoint}}%
+ {\advance\skip0 by ##4\relax}%
+ ##3=\skip0\relax
+ \ifdim##3<-##7\relax
+ \global##7=-##3\relax
+ \fi
+ \skip2=##5\relax
+ \advance\skip2 by ##3\relax
+ \ifdim\skip2>##6\relax
+ \global##6=\skip2\relax
+ \fi}%
+ \berekenpositioneren{#1}{\@@psxstap}{\xpositie}
+ {\@@psxoffset}{\wd0}{\xafmeting}{\xoffset}
+ {\@@psxschaal}{\@@psxfactor}%
+ \skip4=\ht0 \advance\skip4 by \dp0
+ \berekenpositioneren{#2}{\@@psystap}{\ypositie}
+ {\@@psyoffset}{\skip4}{\yafmeting}{\yoffset}
+ {\@@psyschaal}{\@@psyfactor}%
+ \vbox to \!!zeropoint
+ {\vskip\ypositie
+ \hbox to \!!zeropoint
+ {\hskip\xpositie
+ \box0
+ \hskip-\xpositie}%
+ \vskip-\ypositie}%
+ \ignorespaces}
+
+\def\dorooster[#1]%
+ {\bgroup
+ \getparameters[\??rt]
+ [\c!nx=10,\c!ny=10,
+ \c!dx=.5,\c!dy=.5,
+ \c!xstap=0,\c!ystap=0,
+ \c!eenheid=\s!cm,
+ \c!schaal=1,
+ \c!factor=1,
+ \c!offset=\v!ja,
+ #1]%
+ \startpositioneren
+ \dimen0=\@@rtdx\@@rteenheid
+ \dimen0=\@@rtschaal\dimen0
+ \dimen0=\@@rtfactor\dimen0
+ \multiply\dimen0 by \@@rtnx
+ \dimen2=\@@rtdy\@@rteenheid
+ \dimen2=\@@rtschaal\dimen2
+ \dimen2=\@@rtfactor\dimen2
+ \multiply\dimen2 by \@@rtny
+ \def\horline
+ {\vbox
+ {\hrule
+ \!!width \dimen0
+ \!!height \lijndikte
+ \!!depth \!!zeropoint}}%
+ \def\verline%
+ {\vrule
+ \!!width \lijndikte
+ \!!height \dimen2
+ \!!depth \!!zeropoint}%
+ \def\setlegend##1##2%
+ {\global\!!countc=0
+ \dimen0=2em
+ \dimen2=##2\@@rteenheid
+ \dimen2=\@@rtschaal\dimen2
+ \dimen2=\@@rtfactor\dimen2
+ \divide\dimen0 by \dimen2
+ \global\!!counte=\dimen0
+ \ifnum\!!counte>50
+ \global\!!counte=100
+ \else\ifnum\!!counte>10
+ \global\!!counte=50
+ \else\ifnum\!!counte>5
+ \global\!!counte=10
+ \else\ifnum\!!counte>1
+ \global\!!counte=5
+ \else
+ \global\!!counte=1
+ \fi\fi\fi\fi
+ \global\!!countd=0
+ \def\legend%
+ {\ifnum\!!countd=0
+ \vbox
+ {\hbox to 2em{\hss\the\!!countc\hss}}%
+ \global\!!countd=\!!counte
+ \fi
+ \global\advance\!!countd by -1
+ \global\advance\!!countc by ##1}}%
+ \def\draw##1##2##3##4##5##6##7%
+ {\stelpositionerenin
+ [\c!xstap=\v!absoluut,
+ \c!ystap=\v!absoluut,
+ \c!eenheid=\@@rteenheid,
+ \c!schaal=\@@rtschaal,
+ \c!factor=\@@rtfactor,
+ \c!offset=\@@rtoffset,
+ \c!xoffset=##6,
+ \c!yoffset=##7]%
+ \positioneer(0,0){##1}%
+ \stelpositionerenin
+ [\c!xstap=\v!relatief,
+ \c!ystap=\v!relatief,
+ \c!schaal=\@@rtschaal,
+ \c!factor=\@@rtfactor,
+ \c!offset=\@@rtoffset,
+ \c!eenheid=\@@rteenheid]%
+ \dorecurse{##2}{\positioneer(##3,##4){##5}}}%
+ \draw{\verline}{\@@rtnx}{\@@rtdx}{0}{\verline}{\!!zeropoint}{\!!zeropoint}%
+ \draw{\horline}{\@@rtny}{0}{\@@rtdy}{\horline}{\!!zeropoint}{\!!zeropoint}%
+ \tfx
+ \doifnot{\@@rtxstap}{0}
+ {\setlegend{\@@rtxstap}{\@@rtdx}%
+ \draw{\legend}{\@@rtnx}{\@@rtdx}{0}{\legend}{-1em}{-1.5em}}%
+ \doifnot{\@@rtystap}{0}
+ {\setlegend{\@@rtystap}{\@@rtdy}%
+ \draw{\legend}{\@@rtny}{0}{\@@rtdy}{\legend}{-2em}{-.75ex}}%
+ \stoppositioneren
+ \egroup}
+
+\def\rooster%
+ {\dosingleempty\dorooster}
+
+%I n=Kolommen
+%I c=\stelkolommenin,\startkolommen,\kolom
+%I
+%I Tekst kan in kolommen worden gezet. Het aantal kolommen
+%I en het al dan niet opnemen van een vertikale lijn kan
+%I worden ingesteld.
+%I
+%I \stelkolommenin[n=,lijn=,tolerantie=,afstand=,
+%I balanceren=,uitlijnen=,hoogte=]
+%I
+%I Hierin staat n voor het aantal kolommen. Aan lijn
+%I kan aan of uit worden toegekend. Aan voor en na kan
+%I een commando worden toegekend, bijvoorbeeld ~~.
+%I
+%I Mogelijke waarden voor de tolerantie zijn: zeerstreng,
+%I streng, soepel en zeersoepel.
+%P
+%I De in kolommen te zetten tekst moet worden opgenomen
+%I tussen de commando's:
+%I
+%I \startkolommen
+%I \stopkolommen
+%I
+%I Er wordt naar een nieuwe kolom gesprongen met:
+%I
+%I \kolom
+
+\newif\ifbinnenkolommen
+\newif\if@@klbalanceren
+\newif\if@@kluitlijnen
+
+\binnenkolommenfalse
+
+\def\stelkolommenin%
+ {\dodoubleargument\getparameters[\??kl]}
+
+\def\linebetweencolumns%
+ {\bgroup
+ \startcolorpage
+ \ifdim\@@klafstand>\!!zeropoint
+ \dimen0=\@@klafstand
+ \else
+ \dimen0=\linewidth
+ \fi
+ \advance\dimen0 by -\linewidth
+ \hskip.5\dimen0
+ \vrule
+ \!!width\linewidth
+ \ifb@selinebottom\!!depth\strutdepth\fi
+ \hskip.5\dimen0\relax
+ \stopcolorpage
+ \egroup}
+
+\def\spacebetweencolumns%
+ {\hskip\@@klafstand}
+
+\presetlocalframed[\??kl]
+
+\def\backgroundfinishcolumnbox%
+ {\dimen0=\@@kloffset
+ \advance\dimen0 by -\@@kllijndikte
+ \localframed
+ [\??kl]
+ [\c!offset=\dimen0,
+ \c!strut=\v!nee,
+ \c!breedte=\v!passend,
+ \c!hoogte=\v!passend,
+ \c!uitlijnen=]}
+
+\def\backgroundsetcolumntextheight%
+ {\dimen0=-\@@kloffset
+ \multiply\dimen0 by 2
+ \advance\dimen0 by \teksthoogte
+ \edef\columntextheight{\the\dimen0}}
+
+\def\backgroundsetcolumntextwidth%
+ {\dimen0=-\@@kloffset
+ \multiply\dimen0 by \nofcolumns
+ \multiply\dimen0 by 2
+ \advance\dimen0 by \tekstbreedte
+ \edef\columntextwidth{\the\dimen0}}
+
+\def\complexstartkolommen[#1]% %% \startkolommen
+ {\bgroup
+ \let\stopkolommen=\egroup
+ \ifbinnenkolommen
+ \else
+ \stelkolommenin[#1]%
+ \ifnum\@@kln>1\relax
+ \witruimte
+ \begingroup
+ \doif{\@@kloptie}{\v!achtergrond}
+ {\let\finishcolumnbox = \backgroundfinishcolumnbox
+ \let\setcolumntextheight = \backgroundsetcolumntextheight
+ \let\setcolumntextwidth = \backgroundsetcolumntextwidth}%
+% \doifelse{\@@kllijn}{\v!aan}
+% {\let\betweencolumns=\linebetweencolumns}
+% {\let\betweencolumns=\spacebetweencolumns}%
+ \processaction
+ [\@@kllijn]
+ [ \v!aan=>\let\betweencolumns=\linebetweencolumns,
+ \v!uit=>\let\betweencolumns=\spacebetweencolumns,
+ \s!default=>\let\betweencolumns=\spacebetweencolumns,
+ \s!unknown=>\let\betweencolumns=\@@kllijn]%
+ \doifelsenothing{\@@klhoogte}
+ {\heightencolumnsfalse}
+ {\heightencolumnstrue}%
+ \doifelse{\@@klbalanceren}{\v!ja}
+ {\balancecolumnstrue}
+ {\balancecolumnsfalse}%
+ \processaction % ook nog: laatsteuitlijnen
+ [\@@kluitlijnen]
+ [ \v!ja=>\stretchcolumnstrue
+ \inheritcolumnsfalse,
+ \v!nee=>\stretchcolumnsfalse
+ \inheritcolumnsfalse,
+ \v!tekst=>\stretchcolumnsfalse
+ \inheritcolumnstrue]%
+ \nofcolumns=\@@kln
+ \edef\fixedcolumnheight{\@@klhoogte}%
+ \steltolerantiein[\@@kltolerantie]% %% \startkolommen
+ \stelblankoin[\@@klblanko]%
+ \ifdim\tussenwit>\!!zeropoint
+ \stelwitruimtein[\@@klblanko]%
+ \fi
+ \def\stopkolommen%
+ {\endmulticolumns
+ \global\binnenkolommenfalse
+ \endgroup
+ \egroup}%
+ \global\binnenkolommentrue
+ \beginmulticolumns
+ \fi
+ \fi}
+
+\def\startkolommen%
+ {\complexorsimpleempty{startkolommen}}
+
+\def\kolom%
+ {\ifbinnenkolommen
+ \ejectcolumn
+ \fi}
+
+%I n=Kader
+%I c=\toonkader,\tooninstellingen,\toonlayout
+%I
+%I Met behulp van de drie commando's:
+%I
+%I \toonkader
+%I \tooninstellingen
+%I
+%I kan de zetspiegel zichtbaar worden gemaakt, of eventueel
+%I met:
+%I
+%I \toonkader [rand,tekst,marge]
+%I
+%I Het commando:
+%I
+%I \toonlayout
+%I
+%I genereert enkele (linker en rechter) pagina's.
+
+\def\complextoonkader[#1]%
+ {\stelachtergrondenin
+ [\v!hoofd,\v!tekst,\v!voet]
+ [#1]
+ [\c!achtergrond=,
+ \c!kader=\v!aan,
+ \c!hoek=\v!recht,
+ \c!kaderoffset=\!!zeropoint,
+ \c!kaderdiepte=\!!zeropoint,
+ \c!kaderkleur=]
+ \let\pageseparation=\!!zeropoint}
+
+\def\simpletoonkader%
+ {\complextoonkader
+ [\v!linkerrand,\v!linkermarge,
+ \v!tekst,
+ \v!rechtermarge,\v!rechterrand]}
+
+\definecomplexorsimple\toonkader
+
+\def\tooninstellingA#1#2%
+ {\ifx#2\??ly
+ #1&\dimen0=\getvalue{#2#1}\PtToCm{\the\dimen0}&\dimen0=\getvalue{#2#1}\the\dimen0&\cr
+ \else
+ #1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr
+ \fi}
+
+\def\tooninstellingB#1#2#3%
+ {#1&#3&\tttf\string#3\cr}
+
+\def\tooninstellingen% % engels maken
+ {\noindent
+ \vbox
+ {\forgetall
+ \mindermeldingen
+ \switchtobodyfont[\v!klein]
+ \tabskip\!!zeropoint
+ \halign
+ {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
+ \tooninstellingA{papierhoogte} \papierhoogte
+ \tooninstellingA{papierbreedte} \papierbreedte
+ \tooninstellingA{printpapierhoogte} \printpapierhoogte
+ \tooninstellingA{printpapierbreedte} \printpapierbreedte
+ \tooninstellingA{kopwit} \kopwit
+ \tooninstellingA{rugwit} \rugwit
+ \tooninstellingA{hoogte} \zethoogte
+ \tooninstellingA{breedte} \zetbreedte
+ \tooninstellingA{teksthoogte} \teksthoogte
+ \tooninstellingA{tekstbreedte} \tekstbreedte
+ \tooninstellingA{bovenafstand} \??ly
+ \tooninstellingA{hoofd} \hoofdhoogte
+ \tooninstellingA{hoofdafstand} \??ly
+ \tooninstellingA{boven} \bovenhoogte
+ \tooninstellingA{voetafstand} \??ly
+ \tooninstellingA{voet} \voethoogte
+ \tooninstellingA{onderafstand} \??ly
+ \tooninstellingA{onder} \onderhoogte
+ \tooninstellingA{linkerrand} \linkerrandbreedte
+ \tooninstellingA{linkerrandafstand} \??ly
+ \tooninstellingA{linkermarge} \linkermargebreedte
+ \tooninstellingA{linkermargeafstand} \??ly
+ \tooninstellingA{rechtermargeafstand}\??ly
+ \tooninstellingA{rechtermarge} \rechtermargebreedte
+ \tooninstellingA{rechterrandafstand} \??ly
+ \tooninstellingA{rechterrand} \rechterrandbreedte
+ \noalign{\blanko}
+ \tooninstellingB{korps} \the \globalbodyfontsize
+ \noalign{\blanko}
+ \tooninstellingB{regel} \relax \normallineheight
+ \tooninstellingB{hoogte} \relax \strutheightfactor
+ \tooninstellingB{diepte} \relax \strutdepthfactor
+ \tooninstellingB{boven} \relax \topskipfactor
+ \tooninstellingB{onder} \relax \maxdepthfactor}}}
+
+\def\toonlayout%
+ {\bgroup
+ \pagina
+ \toonkader
+ \stellayoutin[\c!markering=\v!aan]
+ \herhaal[4*\tooninstellingen\pagina]
+ \egroup}
+
+% - meerdere niveaus (moet niet moeilijk zijn)
+% - instellingen in macro
+
+%I n=Opsomming
+%I c=\startopsomming,\som,\sub,\kop,\sym,\mar,\but
+%I c=\stelopsommingin
+%I
+%I Opsommingen kunnen tot op vier niveaus automatisch worden
+%I aangemaakt met het commando:
+%I
+%I \startopsomming[aanduiding][instellingen]
+%I
+%I \som ........
+%I \som ........
+%I \som[referentie] ........
+%I \som ........
+%I
+%I \stopopsomming
+%I
+%I Eventueel kan direct achter \som een [referentie] worden
+%I opgegeven, zodat men bijvoorbeeld kan verwijzen naar
+%I 'punt \in[referentie]' (hier punt 3).
+%P
+%I De volgende genummerde aanduidingen zijn mogelijk:
+%I
+%I wijze van 'nummeren' instelling
+%I
+%I 1, 2, 3, 4 n (normaal) / o (oldstyle)
+%I a, b, c, d a
+%I A, B, C, D A (normaal) / KA (kap)
+%I i, ii, iii, iv r
+%I I, II, III, IV R (normaal) / KR (kap)
+%I
+%I doornummeren verder
+%P
+%I De volgende niet-genummerde aanduidingen zijn mogelijk
+%I (de aanduiding kan eventueel achterwege blijven):
+%I
+%I wijze van 'markeren' instelling
+%I
+%I dot 1
+%I streepje 2
+%I sterretje 3
+%I driehoekje 4
+%I bolletje 5
+%I groter bolletje 6
+%I nog groter bolletje 7
+%I
+%I alleen inspringen leeg laten
+%P
+%I Het al dan niet inspringen en de eventuele ruimte tussen
+%I de onderdelen wordt globaal of lokaal ingesteld met de
+%I commando's:
+%I
+%I \stelopsommingin[niveau][instelling]
+%I
+%I waarbij de volgende instellingen mogelijk zijn:
+%I
+%I standaard standaard instellingen
+%I opelkaar geen witruimte tussen onderdelen
+%I aanelkaar weinig witruimte na het symbool
+%I aansluitend geen wit voor en na de opsomming
+%I ruim meer witruimte na het symbool (n*ruim)
+%I inmarge markering in de kantlijn
+%I opmarge markering op de 'kantlijn'
+%I afsluiter afsluiter achter markering
+%I kolommen in twee kolommen zetten
+%I intro aansluiten op vorige regel(s)
+%P
+%I In plaats van een cijfer bij niveau kan ook het woord
+%I 'elk' worden gegeven. De instellingen mogen ook direkt
+%I achter de aanduiding worden meegegeven: [1,opelkaar].
+%I
+%I Als alternatief voor \som is \kop beschikbaar. In dat geval
+%I wordt de eerste alinea (of een eerste woord) afwijkend gezet.
+%I
+%I Met \sym{symbool} kan een eigen symbool worden geplaatst.
+%I Als dit symbool breed is (bijvoorbeeld ++), kan men de
+%I breedte aanpassen, bijvoorbeeld: \startopsomming[2*ruim].
+%I
+%I Een ander alternatief is \mar{tekst}. De tekst wordt in
+%I dat geval in de marge geplaatst.
+%I
+%I Een leeg item (dus zonder aanduiding) kan worden
+%I opgeroepen met \nop. Op deze manier kunnen opsommingen in
+%I kolommen worden uitgelijnd (gemanipuleerd). Het commando
+%I \nop komt overeen met \sym{\strut} \strut.
+%P
+%I Met \som[aanduiding] (zonder \start... \stop...) kan snel een
+%I opsomming met ‚‚n item worden gezet. In dat geval wordt er
+%I geen referentie aangemaakt.
+%I
+%I Als men een item tussenvoegt maar (vooralsnog) de nummering
+%I niet wil verhogen, dan kan men \sub gebruiken. Het oude nummer
+%I wordt dan in het zetwerk voorafgegaan door een +.
+%I
+%I Interactieve items kunnen worden gemaakt met \but, waarbij
+%I de bestemming tussen [] moet worden meegegeven.
+%P
+%I Een nauwkeuriger (globale) instelling is eveneens mogelijk met
+%I het commando:
+%I
+%I \stelopsommingin[niveau][breedte=,voor=,tussen=,na=,
+%I kopvoor=,kopna=,kopletter=,marletter=,symlettter=,
+%I afsluiter=,n=,factor=,afstand=]
+%I
+%I Standaard gelden voor de letters de volgende instellingen:
+%I
+%I kopletter normaal
+%I marletter type
+%I symletter vet
+%I
+%I De commando's \sym{symbool} en \som zijn ook buiten
+%I opsommingen beschikbaar.
+
+%T n=opsomming
+%T m=ops
+%T a=o
+%T
+%T \startopsomming
+%T
+%T \som ?
+%T
+%T \stopopsomming
+
+%T n=som
+%T m=som
+%T a=s
+%T
+%T \som ?
+
+%
+% NOG [0] voor start op 0
+%
+
+\newif\ifsomkolommen \somkolommenfalse
+\newif\ifsubsom \subsomfalse
+\newif\ifsymsom \symsomfalse
+\newif\ifkopsom \kopsomfalse
+\newif\ifsomintro \somintrofalse
+\newif\ifsomautointro \somautointrofalse
+\newif\ifpackeditems \packeditemsfalse
+\newif\iffirstlist \firstlistfalse
+
+\definetwopasslist{\s!list}
+
+\newcounter\noflists
+\newcounter\itemlevel
+
+\def\dolistreference%
+ {\immediatewriteutilitycommand%
+ {\twopassentry%
+ {\s!list}%
+ {\currentlist}%
+ {\currentlist:\noflistelements}}}
+
+\def\setnextitemlevel#1%
+ {\doifundefined{\??op#1\c!breedte}
+ {\edef\itemreferences{\itemreferences,#1}%
+ \copyparameters
+ [\??op#1][\??oo]
+ [\c!breedte,\c!factor,\c!afstand,
+ \c!marletter,\c!symletter,\c!kopletter,
+ \c!markleur,\c!symkleur,\c!kopkleur,
+ \c!kopvoor,\c!kopna,\c!voor,\c!tussen,\c!na,
+ \c!afsluiter,\c!plaatsafsluiter,
+ \c!n,\c!binnen,\c!symbool,\c!marge]%
+ \makecounter{\s!itemcount#1}%
+ \setvalue{\??op\c!symbool\s!global#1}{#1}}}
+
+\def\maxitemlevel{0}
+\def\itemreferences{0}
+
+\def\dostelopsommingenin[#1]% % still undocumented
+ {\getparameters[\??oo][\c!niveaus=4,#1]%
+ \ifnum\@@ooniveaus>\maxitemlevel
+ \edef\maxitemlevel{\@@ooniveaus}%
+ \herhaal[\maxitemlevel*\setnextitemlevel{\herhaler}]%
+ \fi}
+
+\def\stelopsommingenin%
+ {\dosingleargument\dostelopsommingenin}
+
+\def\doitemreference#1,#2,#3\\%
+ {\ifnum\itemlevel>#1
+ \ifnum#1>0
+ \tempsymbool
+ \fi
+ \getvalue{\??op\c!symbool#2}%
+ \doitemreference#2,#3\\%
+ \fi}
+
+\def\itemreference%
+ {\expandafter\doitemreference\itemreferences,,\\}
+
+\def\itemuse#1%
+ {\getvalue{\??op\itemlevel#1}}%
+
+\def\packitems%
+ {\ifnum\itemlevel=0 \else\packeditemstrue\fi}
+
+\def\dostelopsomminginvariable[#1][#2]% niveau instellingen
+ {\doifelsenothing{#1}
+ {\getparameters[\??op\itemlevel][#2]}%
+ {\getparameters[\??op#1][#2]}}
+
+\def\dododostelopsomminginconstant[#1][#2#3]%
+ {\processaction
+ [#2#3]
+ [ \v!opelkaar=>\packitems,
+ \v!intro=>\somintrotrue,
+ \v!autointro=>\somautointrotrue,
+ \v!ruim=>{\doassign[\??op#1][\c!factor=1]},
+ #2*\v!ruim=>{\doassign[\??op#1][\c!factor=#2]},
+ \v!marge=>{\doassign[\??op#1][\c!breedte=-2em]}, % signal
+ \v!inmarge=>{\doassign[\??op#1][\c!breedte=-2em]}, % signal
+ \v!opmarge=>\doifnot{#1}{1}{\doassign[\??op#1][\c!breedte=0em]}, % signal
+ \v!kolommen=>\packitems,
+ \v!aansluitend=>{\getparameters[\??op#1]
+ [\c!kopvoor=,\c!kopna=,
+ \c!voor=,\c!tussen=,\c!na=]%
+ \packitems},
+ \v!aanelkaar=>{\doassign[\??op#1][\c!factor=-1]},
+ #2*\v!aanelkaar=>{\doassign[\??op#1][\c!factor=-#2]},
+ \v!afsluiter=>{\doassign[\??op#1][\c!plaatsafsluiter=\v!ja]},
+ \v!standaard=>{\getparameters[\??op#1]
+ [\c!breedte=1.5em,
+ \c!factor=0,
+ \c!afstand=.5em,
+ \c!kopvoor=,
+ \c!kopna=\blanko,
+ \c!voor=\blanko,
+ \c!tussen=\blanko,
+ \c!na=\blanko,
+ \c!binnen=]}]}
+
+\def\dostelopsomminginconstant[#1][#2]%
+ {\def\dodostelopsomminginconstant##1%
+ {\dododostelopsomminginconstant[#1][##1]}%
+ \processcommalist[#2]\dodostelopsomminginconstant}
+
+\def\dodododostelopsommingin[#1][#2]%
+ {\ConvertToConstant\doifinstringelse{=}{#2}
+ {\dostelopsomminginvariable[#1][#2]}
+ {\setvalue{\??op#1}{\dostelopsomminginconstant[#1][#2]}}}%
+
+\def\dododostelopsommingin[#1][#2]%
+ {\ConvertToConstant\doifnot{#2}{}
+ {\doifelse{#1}{\v!elk}
+ {\herhaal[\maxitemlevel*{\ExpandFirstAfter\dodododostelopsommingin[\herhaler][#2]}]}
+ {\ExpandFirstAfter\dodododostelopsommingin[#1][#2]}}}
+
+\def\dodostelopsommingin[#1][#2]%
+ {\ConvertToConstant\doifelse{#2}{}
+ {\ifnum\itemlevel=0\relax
+ \dododostelopsommingin[\v!elk][#1]%
+ \else
+ \dododostelopsommingin[\itemlevel][#1]%
+ \fi}
+ {\doifelsenothing{#1}
+ {\dododostelopsommingin[\itemlevel][#2]}
+ {\dododostelopsommingin[#1][#2]}}}
+
+\def\dostelopsommingin[#1][#2][#3]%
+ {\dodostelopsommingin[#1][#2]%
+ \ConvertToConstant\doifnot{#3}{} % anders wordt #2 overruled
+ {\dodostelopsommingin[#1][#3]}}
+
+\def\stelopsommingin%
+ {\dotripleempty\dostelopsommingin}
+
+\def\doadvanceitem%
+ {\ifsubsom\else\ifsymsom\else
+ \pluscounter{\s!itemcount\itemlevel}%
+ \fi\fi}
+
+\def\setitemlevel#1%
+ {\ifnum\itemlevel>0\relax
+ \firstlisttrue
+ \doifnotinset{\v!verder}{#1}
+ {\resetcounter{\s!itemcount\itemlevel}}%
+ \def\tempnumber%
+ {\countervalue{\s!itemcount\itemlevel}}%
+ \doifelsevalue{\??op\itemlevel\c!plaatsafsluiter}{\v!ja}
+ {\def\tempsymbool{\getvalue{\??op\itemlevel\c!afsluiter}}}
+ {\def\tempsymbool{}}%
+ \fi}
+
+\def\setitemmark#1% % maakt gebruik van \??ss en \??cv
+ {\doifdefinedelse{\??ss#1} % en pas op: resets \docommando
+ {\setxvalue{\??op\c!symbool\s!global\itemlevel}%
+ {#1}%
+ \setgvalue{\??op\c!symbool\s!local\itemlevel}%
+ {?}%
+ \def\listitem%
+ {\symbol[#1]}%
+ \def\docommando##1{}}
+ {\doifdefined{\??cv#1}
+ {\setxvalue{\??op\c!symbool\s!global\itemlevel}%
+ {#1}%
+ \setgvalue{\??op\c!symbool\s!local\itemlevel}%
+ {\convertnumber{#1}{\countervalue{\s!itemcount\itemlevel}}}%
+ \def\listitem%
+ {\getvalue{\??op\c!symbool\s!local\itemlevel}\tempsymbool}%
+ \def\docommando##1{}}}}
+
+\def\calculatelistwidth#1#2%
+ {#2=\getvalue{\??op#1\c!afstand}\relax
+ \multiply#2 by \getvalue{\??op#1\c!factor}\relax
+ \advance#2 by \getvalue{\??op#1\c!breedte}\relax}
+
+\def\dodostartopsomming[#1][#2]%
+ {\ifhmode
+ \par
+ \fi
+ \ifnum\itemlevel=\maxitemlevel\relax
+ \showmessage{\m!layouts}{9}{\maxitemlevel}%
+ \def\itemincrement{0}%
+ \else
+ \def\itemincrement{1}%
+ \fi
+ \doglobal\increment(\itemlevel,\itemincrement)%
+ \begingroup
+ \ifnum\itemlevel=1 % NIEUW
+ \doadaptleftskip{\getvalue{\??op1\c!marge}}%
+ \dosetraggedcommand{\@@oouitlijnen}\raggedcommand
+ \fi
+ \doifinset{\v!kolommen}{#1}%
+ {\ifbinnenkolommen\else
+ \global\somkolommentrue
+ \getvalue{\??op\itemlevel\c!voor}%
+ \processfirstactioninset
+ [#1]
+ [ \v!een=>\!!counta=1\relax,
+ \v!twee=>\!!counta=2\relax,
+ \v!drie=>\!!counta=3\relax,
+ \v!vier=>\!!counta=4\relax,
+ \v!vijf=>\!!counta=5\relax,
+ \s!unknown=>\@EA\!!counta\getvalue{\??op\itemlevel\c!n}]%
+ \startkolommen
+ [\c!n=\!!counta,
+ \c!hoogte=,
+ \c!lijn=\v!uit,
+ \c!balanceren=\v!ja,
+ \c!uitlijnen=\v!nee]%
+ \fi}%
+ \doifinsetelse{\v!intro}{#1}
+ {\somintrotrue}
+ {\somintrofalse}%
+ \doglobal\increment\noflists
+ \let\currentlist=\noflists
+ \newcounter\noflistelements
+ \kopsomfalse
+ \subsomfalse
+ \symsomfalse
+ \let\marsymbol=\relax
+ \let\somdestination=\empty
+ \def\symsymbol{}%
+ \def\som%
+ {\dosom}%
+ \def\but[##1]%
+ {\def\somdestination{##1}%
+ \dosom}%
+ \def\nop%
+ {\sym{\strut}\strut}%
+ \definecomplexorsimple\its
+ \setvalue{\v!mar}##1%
+ {\def\marsymbol%
+ {\llap
+ {\doattributes{\??op\itemlevel\v!mar}{##1}%
+ \hskip\leftskip\hskip\linkermargeafstand}}%
+ \dosom}%
+ \setvalue{\v!kop}%
+ {\kopsomtrue\dokop}%
+ \setvalue{\v!sub}%
+ {\subsomtrue\dosom}%
+ \setvalue{\v!sym}##1%
+ {\def\symsymbol%
+ {\doattributes{\??op\itemlevel\v!sym}{##1}}%
+ \symsomtrue
+ \dosom}%
+ \setvalue{\v!its}%
+ {\getvalue{\v!sym}%
+ {\calculatelistwidth{\itemlevel}{\dimen0}%
+ \hbox to \dimen0
+ {\dorecurse{\getvalue{\??op\itemlevel\c!items}}{\listitem\hss}%
+ \unskip
+ \hskip\getvalue{\??op\itemlevel\c!afstand}}}}%
+ \setitemlevel{#1}%
+ \getvalue{\??op\itemlevel}%
+ \doifelsenothing{#1} % iffirstargument
+ {\edef\@@opsymbool{\getvalue{\??op\itemlevel\c!symbool}}%
+ \setgvalue{\??op\c!symbool\s!global\itemlevel}{}%
+ \setgvalue{\??op\v!verder\itemlevel}{}%
+ \setitemmark{\@@opsymbool}%
+ \dostelopsomminginvariable[\itemlevel][#2]}
+ {\dostelopsomminginconstant[\itemlevel][#1]%
+ \dostelopsomminginvariable[\itemlevel][#2]%
+ \doifinsetelse{\v!verder}{#1}%
+ {\edef\@@opsymbool{\getvalue{\??op\c!symbool\s!global\itemlevel}}%
+ \getvalue{\??op\v!verder\itemlevel}}
+ {\edef\@@opsymbool{\getvalue{\??op\itemlevel\c!symbool}}%
+ \setgvalue{\??op\v!verder\itemlevel}%
+ {\dostelopsomminginconstant[\itemlevel][#1]%
+ \dostelopsomminginvariable[\itemlevel][#2]}}%
+ \def\docommando{\setitemmark}% \setitemmark resets \docommando
+ \processcommalist[#1,\@@opsymbool]\docommando}%
+ \ifsomautointro\ifnum\prevgraf<3
+ \somintrotrue
+ \fi\fi
+ \ifpackeditems
+ \doassign[\??op\itemlevel][\c!tussen=]%
+ \fi
+ \calculatelistwidth{\itemlevel}{\dimen0}%
+ \ifdim\dimen0>\!!zeropoint\relax
+ \advance\leftskip by \dimen0\relax
+ \fi}
+
+\def\dostartopsomming[#1][#2]%
+ {\ifsecondargument
+ \dodostartopsomming[#1][#2]%
+ \else
+ \doifassignmentelse{#1}
+ {\dodostartopsomming[][#1]}
+ {\dodostartopsomming[#1][]}%
+ \fi}
+
+\def\startopsomming%
+ {\bgroup
+ \dodoubleempty\dostartopsomming}
+
+\def\stopopsomming%
+ {\par
+ \dolistreference
+ \endgroup
+ \ifsomkolommen
+ \global\somkolommenfalse
+ \stopkolommen
+ \getvalue{\??op\itemlevel\c!na}%
+ \else
+ \ifnum\itemlevel=1
+ \dosomebreak\allowbreak % toegevoegd
+ \getvalue{\??op1\c!na}%
+ \doif{\@@oospringvolgendein}{\v!nee}{\noindentation}%
+ \fi
+ \fi
+ \endgroup
+ \doglobal\decrement(\itemlevel,\itemincrement)%
+ \egroup}
+
+\def\sombreak%
+ {\flushfootnotes\penalty-5\relax} % -10
+
+\def\somnobreak%
+ {\flushfootnotes\penalty+5\relax} % \nobreak
+
+\def\dolistitem%
+ {\par
+ \ignorespaces
+ \increment\noflistelements
+ \ifnum\noflistelements=1\relax % als gevolg van nesting
+ \findtwopassdata{\s!list}{\noflists:}% % van wordt soms de volgorde
+ \fi % verstoord, vandaar \find
+ \ifsomkolommen\else
+ \iftwopassdatafound
+ \ifnum\twopassdata=3\relax
+ \ifnum\noflistelements>1\relax
+ \dosomebreak\somnobreak
+ \fi
+ \else\ifnum\twopassdata>3\relax
+ \ifnum\noflistelements=2\relax
+ \ifsomkolommen\else
+ \ifsomintro
+ \dosomebreak\nobreak
+ \else
+ \dosomebreak\somnobreak
+ \fi
+ \fi
+ \else\ifnum\twopassdata=\noflistelements\relax
+ \dosomebreak\somnobreak
+ \else\ifnum\noflistelements>2\relax
+ \dosomebreak\sombreak
+ \else
+ \ifsomintro\else\dosomebreak\sombreak\fi
+ \fi\fi\fi
+ \fi\fi
+ \fi
+ \fi
+ \noindent
+ \ifkopsom
+ \setbox8=\hbox{\doattributes{\??op\itemlevel\v!kop}{\listitem}}%
+ \else\ifsymsom
+ \setbox8=\hbox{\symsymbol}%
+ \else
+ \setbox8=\hbox{\listitem}%
+ \fi\fi
+ \doifsomething{\somdestination}
+ {\setbox8=\hbox{\naar{\copy8}[\somdestination]}}%
+ \dimen2=\getvalue{\??op\itemlevel\c!breedte}\relax
+ \ifdim\dimen2<\!!zeropoint\relax
+ \llap{\ifsubsom\llap{+}\fi\box8\hskip\linkermargeafstand}%
+ \else
+ \ifdim\dimen2=\!!zeropoint\relax
+ \calculatelistwidth{1}{\dimen0}%
+ \else
+ \calculatelistwidth{\itemlevel}{\dimen0}%
+ \fi
+ \llap{\hbox to \dimen0{\ifsubsom\llap{+}\fi\box8\hfill}}%
+ \fi
+ \setevalue{\??op\c!symbool\itemlevel}%
+ {\getvalue{\??op\c!symbool\s!local\itemlevel}}%
+ \kopsomfalse
+ \subsomfalse
+ \symsomfalse
+ \EveryPar{\ignorespaces}%
+ \ignorespaces}
+
+\def\complexdosom[#1]%
+ {\par
+ \ignorespaces
+ \doadvanceitem
+ \ifsomkolommen\else
+ \ifnum\noflistelements>0\relax\dosomebreak\nobreak\fi
+ \fi
+ \iffirstlist
+ \firstlistfalse
+ \begingroup
+ \ifcase\itemlevel
+ \or % 1
+ \ifsomkolommen\else
+ \ifsomintro\dosomebreak\nobreak\fi
+ \getvalue{\??op1\c!voor}%
+ \ifsomintro\dosomebreak\nobreak\fi
+ \fi
+ \else % 2 en hoger
+ \let\previtemlevel=\itemlevel
+ \decrement\previtemlevel
+ \getvalue{\??op\previtemlevel\c!tussen}% = itemlevel-1
+ \fi
+ \else
+ \itemuse{\c!tussen}%
+ \fi
+ \ignorespaces
+ \dolistitem
+ \ifpackeditems
+ \stelwitruimtein[\v!geen]%
+ \fi
+ \itemuse{\c!binnen}%
+ \marsymbol
+ \let\marsymbol=\relax
+ \doifsomething{#1}
+ {\bgroup
+ \protectconversion
+ \rawreference{\s!lst}{#1}{\itemreference}%
+ \egroup}%
+ \ignorespaces}
+
+\def\complexsom[#1]#2\par%
+ {\startopsomming[#1]
+ \complexdosom[]\ignorespaces#2\par
+ \stopopsomming}
+
+\def\som%
+ {\complexorsimpleempty{som}}
+
+\def\dosom%
+ {\complexorsimpleempty{dosom}}
+
+\def\complexdokop[#1]#2\par%
+ {\ifpackeditems\else\itemuse{\c!kopvoor}\fi%
+ \dosomebreak{\pagina[\v!voorkeur]}% geen \goodbreak ! \allowbreak testen
+ \complexdosom[#1]{\doattributes{\??op\itemlevel\v!kop}{\ignorespaces#2}}\par%
+ \ifpackeditems\else\itemuse{\c!kopna}\fi%
+ \dosomebreak\nobreak}
+
+\def\complexkop[#1]#2\par#3\par%
+ {\startopsomming[#1]%
+ \complexdokop[]\ignorespaces#2\par#3\par%
+ \stopopsomming}
+
+\setvalue{\v!kop}%
+ {\complexorsimpleempty{kop}}
+
+\def\dokop%
+ {\complexorsimpleempty{dokop}}
+
+\def\sym#1%
+ {\noindent
+ \setbox0=\hbox{#1}%
+ \ifdim\wd0<1em\relax
+ \setbox0=\hbox to 1.5em{#1\hfil}%
+ \else
+ \setbox0=\hbox spread 1em{#1\hfil}%
+ \fi
+ \hangindent=\wd0\relax
+ \box0
+ \ignorespaces}
+
+%I n=Doordefinieren
+%I c=\doordefinieren,\steldoordefinierenin
+%I
+%I Er kunnen (eenvoudige) definitie-lijsten worden
+%I gemaakt met behulp van het commando:
+%I
+%I \doordefinieren[naam][plaats=,breedte=,uitlijnen=,
+%I monster=,letter=,kopletter=,voor=,tussen=,na=,hang=,
+%I inspringen=,tekst=]
+%I
+%I Een definitie is vervolgens op naam op te roepen:
+%I
+%I \naam{begrip} definitie
+%P
+%I Een definitie heeft de vorm:
+%I
+%I links Dit is een linker tekst. Een tekst wordt
+%I links geplaatst als 'links' wordt meegegeven.
+%I
+%I Dit is een rechter tekst. Een tekst wordt rechts
+%I rechts geplaatst als 'rechts' wordt meegegeven.
+%I
+%I boven
+%I
+%I Dit is een tekst waarbij het woord erboven staat. Voor
+%I dit soort teksten wordt 'boven' meegegeven.
+%I
+%I Tot slot is het mogelijk de tekst in de marge of
+%I aansluitend te plaatsen, in dat geval wordt 'inmarge',
+%I 'inlinker', 'inrechter' of 'aanelkaar' meegegeven.
+%P
+%I Aan 'voor', 'tussen' of 'na' kan een commando worden
+%I toegekend, bijvoorbeeld \blanko[groot]. Als letter kan
+%I normaal, vet, kapitaal, type, schuin, klein en kleinvet
+%I worden meegegeven.
+%I
+%I Als 'breedte' kan een maat worden meegegeven of een van de
+%I instellingen 'passend' en 'ruim'. In dat geval wordt de
+%I aan 'monster' toegekende tekst als uitgangspunt genomen.
+%P
+%I Met 'hang' kan men aangeven hoe lang er links of rechts
+%I moet worden ingesprongen. Er kan een aantal regels worden
+%I meegegeven maar ook 'passend' of 'ruim'. Een overgang naar
+%I een nieuwe regel binnen een linker- of rechtertekst wordt
+%I afgedwongen met \\ (vergelijk \margeteksten).
+%I
+%I Defaultwaarden kunnen worden ingesteld met het commando:
+%I
+%I \steldoordefinierenin[instellingen]
+%I
+%I Het tussentijds bijstellen van de instellingen is mogelijk
+%I met:
+%I
+%I \steldoordefinieren[naam][instellingen]
+
+% Dit kan en moet dus anders:
+%
+% \start... : \vbox\bgroup
+% \stop... : \egroup
+% llap enz.
+% geen indent!
+%
+% enz. enz.
+%
+% Op die manier is meer mogelijk en worden \par's geskipt.
+%
+% De macro \??dd#1\s!do\c!commando levert de koppeling tussen
+% \doornummeren en \doordefinieren. Deze constructie is nodig
+% omdat doornummeren geen argument heeft en omdat subnummers
+% niet worden genest binnen het hogere niveau. Het commando
+% \??dd#1\s!do\c!status moet in dat geval \v!start zijn.
+%
+% herimplementeren met \nextbox en \unhbox\unvbox
+
+\newbox\@@definitiebox
+
+\def\@@definitiewoord#1%
+ {\getvalue{\??dd#1\s!do\c!commando}{#1}}
+
+\def\normal@@definitiewoord#1[#2]#3%
+ {\doattributes
+ {\??dd#1\v!kop}
+ {\getvalue{\??dd#1\c!commando}%
+ {\begstrut\getvalue{\??dd#1\c!tekst}#3\endstrut}}%
+ \rawreference{\s!def}{#2}{#3}}
+
+\def\@@definitielinks#1%
+ {\@@definitiehang{#1}\@@definitielinkspure\@@definitielinkshang}
+
+\def\@@definitierechts#1%
+ {\@@definitiehang{#1}\@@definitierechtspure\@@definitierechtshang}
+
+\def\@@definitiehang#1#2#3%
+ {\processaction
+ [\getvalue{\??dd#1\c!hang}]
+ [ \v!geen=>\let\next=#2,
+ 0=>\let\next=#2,
+ \s!unknown=>\let\next=#3,
+ \s!default=>\let\next=#2]%
+ \next{#1}}
+
+\def\@@definitielinkspure#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \advance\leftskip by \!!widtha
+ \@@makedefinitiepurebox{#1}\raggedright%
+ \advance\leftskip by \!!widthb
+ \llap
+ {\hbox to \leftskip{\copy\@@definitiebox\hss}}%
+ \@@dodefinitie{#1}}
+
+\def\@@definitierechtspure#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \advance\rightskip by \!!widtha
+ \@@makedefinitiepurebox{#1}\raggedleft%
+ \rlap
+ {\hskip\hsize
+ \hskip-\leftskip
+ \hskip-\rightskip
+ \copy\@@definitiebox}%
+ \advance\rightskip by \!!widthb
+ \@@dodefinitie{#1}}
+
+\def\@@makedefinitiepurebox#1#2%
+ {\setbox\@@definitiebox=\vtop
+ {\hsize\!!widtha
+ \leftskip\!!zeropoint
+ \rightskip\!!zeropoint
+ #2\steluitlijnenin[\getvalue{\??dd#1\c!uitlijnen}]%
+ \unhcopy\@@definitiebox}%
+ \ht\@@definitiebox=\ht\strutbox
+ \dp\@@definitiebox=\dp\strutbox}
+
+\def\@@definitielinkshang#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \mindermeldingen
+ \advance\!!widtha by \!!widthb
+ \hangindent=\!!widtha
+ \@@makedefinitiehangbox{#1}{\raggedright}{\advance\rightskip by \!!widthb}%
+ \llap
+ {\dontshowcomposition
+ \vtop to \!!zeropoint{\box\@@definitiebox}}%
+ \@@dodefinitie{#1}}%
+
+\def\@@definitierechtshang#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \mindermeldingen
+ \advance\!!widtha by \!!widthb
+ \hangindent=-\!!widtha
+ \@@makedefinitiehangbox{#1}{\raggedleft}{\advance\leftskip by \!!widthb}%
+ \rlap
+ {\dontshowcomposition
+ \dimen0=\hsize
+ \advance\dimen0 by -\leftskip
+ \advance\dimen0 by -\rightskip
+ \hbox to \dimen0
+ {\hss\vtop to \!!zeropoint{\box\@@definitiebox}}}%
+ \@@dodefinitie{#1}}
+
+\def\@@makedefinitiehangbox#1#2#3%
+ {\setbox\@@definitiebox=\vtop % \vbox gaat fout in hang
+ {\forgetall
+ \hsize\!!widtha
+ #2\steluitlijnenin[\getvalue{\??dd#1\c!uitlijnen}]#3%
+ \unhcopy\@@definitiebox}%
+ \ht\@@definitiebox=\ht\strutbox
+ \dp\@@definitiebox=\dp\strutbox
+ \doifinsetelse{\getvalue{\??dd#1\c!hang}}{\v!passend,\v!ruim}
+ {\dimen0=\ht\@@definitiebox
+ \advance\dimen0 by \dp\@@definitiebox
+ \doifvalue{\??dd#1\c!hang}{\v!ruim}
+ {\advance\dimen0 by .5\ht\strutbox}%
+ \getnoflines{\dimen0}%
+ \hangafter=-\noflines}
+ {\hangafter=-\getvalue{\??dd#1\c!hang}}}%
+
+\def\@@definitieboven#1[#2]#3%
+ {%\pagina[\v!voorkeur]% % Weg ermee!
+ \dosomebreak{\goodbreak}% % Dit is beter en nodig!
+ \@@dostartdefinitie{#1}[#2]{\let\\=\space#3}%
+ \copy\@@definitiebox
+ \nobreak
+ \getvalue{\??dd#1\c!tussen}%
+ \@@dodefinitie{#1}}
+
+\def\@@definitieinmarge#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \inmarge{\unhcopy\@@definitiebox}%
+ \@@dodefinitie{#1}}
+
+\def\@@definitieinlinker#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \inlinker{\unhcopy\@@definitiebox}%
+ \@@dodefinitie{#1}}
+
+\def\@@definitieinrechter#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \inrechter{\unhcopy\@@definitiebox}%
+ \@@dodefinitie{#1}}
+
+\def\@@definitieaanelkaarpassend#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \unhcopy\@@definitiebox
+ \@@dodefinitie{#1}}
+
+\def\@@definitieaanelkaarruim#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \hbox spread \!!widthb
+ {\unhcopy\@@definitiebox\hss}%
+ \@@dodefinitie{#1}}
+
+\def\@@definitieaanelkaarbreed#1[#2]#3%
+ {\@@dostartdefinitie{#1}[#2]{#3}%
+ \hbox to \!!widtha
+ {\unhcopy\@@definitiebox\hss}%
+ \kern\!!widthb
+ \ignorespaces
+ \@@dodefinitie{#1}}
+
+\def\@@definitieaanelkaar#1[#2]#3%
+ {\processaction
+ [\getvalue{\??dd#1\c!breedte}]
+ [\v!passend=>\let\next=\@@definitieaanelkaarpassend,
+ \v!ruim=>\let\next=\@@definitieaanelkaarruim,
+ \s!unknown=>\let\next=\@@definitieaanelkaarbreed,
+ \s!default=>\let\next=\@@definitieaanelkaarruim]%
+ \next{#1}[#2]{#3}}
+
+\def\@@definitiehangend#1[#2]#3%
+ {\skip0=-\leftskip % uggly trick
+ \@@dostartdefinitie{#1}[#2]{#3}% % adds \c!marge to \leftskip
+ \advance\skip0 by \leftskip % but useful
+ \ifdim\skip0=\!!zeropoint
+ \skip0=1.5em % just some default
+ \advance\leftskip by \skip0
+ \fi
+ \hskip-\skip0 % no hang in the first line
+ \unhcopy\@@definitiebox
+ \ifdim\!!widthb=\!!zeropoint
+ \kern.75em % another default
+ \else
+ \kern\!!widthb
+ \fi
+ \ignorespaces
+ \@@dodefinitie{#1}}
+
+\def\@@dostartdefinitie#1[#2]#3%
+ {\getvalue{\??dd#1\c!voor}%
+ \begingroup
+ \doadaptleftskip{\getvalue{\??dd#1\c!marge}}%
+ \showcomposition
+ \setbox\@@definitiebox=\hbox
+ {\forgetall
+ \def\\{\crcr}%
+ \doattributes
+ {\??dd#1\v!kop}
+ {\@@definitiewoord{#1}[#2]{\vbox{\halign{\strut##\hss\cr#3\crcr}}}}}%
+ \!!widthb=\getvalue{\??dd#1\c!afstand}\relax
+ \ifdim\!!widthb=\!!zeropoint\relax
+ \doifvalue{\??dd#1\c!breedte}{\v!ruim}{\!!widthb=1em}%
+ \fi
+ \assignwidth
+ {\!!widtha}
+ {\getvalue{\??dd#1\c!breedte}}
+ {\doifelsevaluenothing{\??dd#1\c!monster}
+ {\unhcopy\@@definitiebox}
+ {\doattributes{\??dd#1\v!kop}
+ {\getvalue{\??dd#1\c!tekst}\getvalue{\??dd#1\c!monster}}}}
+ {\!!widthb}%
+ %\getvalue{\??dd#1\s!do\c!lokaal}%
+ \parindent=\!!zeropoint\relax
+ \noindent
+ \ignorespaces}
+
+\def\@@stopdefinitie#1%
+ {\par
+ \dostopattributes
+ \endgroup
+ \egroup % temporary hack
+ \getvalue{\??dd#1\c!na}%
+ \doifvalue{\??dd#1\c!springvolgendein}{\v!nee}{\noindentation}%
+ \pagina[\v!voorkeur]} % toegevoegd maar heroverwegen
+
+\def\@@dodefinitie#1%
+ {\dostartattributes
+ {\??dd#1}
+ {}%
+ \ignorespaces}
+
+\def\@@somedefinitie#1[#2]#3%
+ {\bgroup % temporary hack
+ \BeforePar{\getvalue{\??dd#1}[#2]{#3}}%
+ \AfterPar{\@@stopdefinitie{#1}}%
+ \GetPar}
+
+\def\@@startdefinitie#1[#2]#3%
+ {\bgroup % temporary hack
+ \BeforePar{\getvalue{\??dd#1}[#2]{#3}}%
+ \GotoPar}
+
+\def\dodosteldoordefinierenin[#1][#2]%
+ {\getparameters[\??dd#1][#2]}
+
+\def\dosteldoordefinierenin[#1][#2]% % beter: \ifsingleargument
+ {\ConvertToConstant\doifelse{#2}{}
+ {\dodosteldoordefinierenin[][#1]}
+ {\dodoubleargumentwithset\dodosteldoordefinierenin[#1][#2]}}
+
+\def\steldoordefinierenin%
+ {\dodoubleempty\dosteldoordefinierenin}
+
+% kan zonder \interfaced wanneer \setvalue{...\v!...}
+
+\def\executedoordefinitie#1[#2]%
+ {\ExpandAfter\doifundefined{@@definitie\interfaced{\getvalue{\??dd#1\c!plaats}}}
+ {\setvalue{\??dd#1\c!plaats}{\v!links}}%
+ \getvalue{@@definitie\interfaced{\getvalue{\??dd#1\c!plaats}}}{#1}[#2]}
+
+\def\dodoordefinieren[#1][#2]%
+ {\copyparameters[\??dd#1][\??dd]
+ [\c!plaats,\c!kopletter,\c!letter,\c!kleur,\c!kopkleur,
+ \c!breedte,\c!hang,\c!monster,\c!voor,\c!tussen,\c!na,\c!marge,
+ \c!springvolgendein,\c!uitlijnen,\c!tekst,\c!afstand,\c!commando]%
+ \getparameters[\??dd#1]
+ [\s!do\c!status=\v!stop,
+ \s!do\c!commando=\normal@@definitiewoord,
+ #2]%
+ \doifvalue{\??dd#1\c!plaats}{\v!boven}%
+ {\doassign[\??dd#1][\c!tussen={\blanko}]}%
+ \setvalue{\??dd#1}[##1]%
+ {\executedoordefinitie{#1}[##1]}%
+ \doifelsevalue{\??dd#1\s!do\c!status}{\v!start}
+ {\setvalue{\s!complex\??dd#1}[##1]%
+ {\@@somedefinitie{#1}[##1]{}}%
+ \setvalue{\s!complex\??dd\s!start#1}[##1]%
+ {\@@startdefinitie{#1}[##1]{}}}%
+ {\setvalue{\s!complex\??dd#1}[##1]%
+ {\dowithwargument{\@@somedefinitie{#1}[##1]}}%
+ \setvalue{\s!complex\??dd\s!start#1}[##1]%
+ {\dowithwargument{\@@startdefinitie{#1}[##1]}}}%
+ \setvalue{#1}%
+ {\complexorsimpleempty{\??dd#1}}%
+ \setvalue{\e!start#1}%
+ {\complexorsimpleempty{\??dd\s!start#1}}%
+ \setvalue{\e!stop#1}%
+ {\@@stopdefinitie{#1}}}%
+
+\def\doordefinieren%
+ {\dodoubleemptywithset\dodoordefinieren}
+
+%I n=Doornummeren
+%I c=\doornummeren,\steldoornummerenin
+%I c=\reset,\volgende,\vorige
+%I
+%I Het is mogelijk door een tekst heen genummerde opsommingen
+%I te gebruiken. Het beschikbare commando is:
+%I
+%I \doornummeren[naam][plaats=,niveaus=,conversie=,
+%I kopletter=,letter=,breedte=,monster=,tekst=,voor=,tussen=,
+%I na=,wijze=,blok=,scheider=,afsluiter=,hang=,links=,rechts=,
+%I sectienummer=,nummer=,koppeling=,uitlijnen=,inspringen]
+%I
+%I De naam bestaat uit letters.
+%I
+%I Na het commando 'doornummeren' zijn de volgende commando's
+%I beschikbaar:
+%I
+%I \naam
+%I \subnaam
+%I \subsubnaam
+%I
+%I waarbij naam staat voor de opgegeven naam.
+%P
+%I Dit commando komt in grote lijnen overeen met het
+%I commando \doordefinieren. Als de plaats 'links' is
+%I en de tekst is 'vraag', dan krijgen we na het
+%I geven van \vraag Wat ... was?:
+%I
+%I vraag 1 Wat zouden we krijgen als de plaats 'rechts'
+%I en de tekst 'antwoord' was?
+%I
+%I We kunnen een referentie meegeven, dus \vraag[ref]. Als
+%I we geen nummer willen, maar wel de tekst, dan is de
+%I aanroep \vraag[-]. Er wordt in dat geval niet opgehoogd.
+%I Hetzelfde kan worden bereikt door 'nummer' de waarde
+%I nee te geven.
+%P
+%I De wijze waarop het laatste niveau wordt weergegeven kan
+%I worden ingesteld met conversie: cijfers, letters, Letters,
+%I romeins en Romeins). Conversie heeft pas effect als ook
+%I niveaus is ingesteld (2 of 3, standaard 3).
+%I
+%I Voor of na de te nummeren tekst op te nemen commando's
+%I kunnen worden ingesteld. Ook kan een voor het nummer op te
+%I nemen tekst worden meegegeven en kan de plaats van de tekst
+%I en het nummer worden ingesteld (… la \doordefinieren!).
+%I
+%I Er kan een koppeling worden gelegd met een ander item. Zo
+%I kunnen bijvoorbeeld vragen worden gekoppeld aan antwoorden.
+%I Dergelijke koppelingen hebben pas betekenis bij
+%I interactieve teksten.
+%I
+%I Defaultwaarden kunnen worden ingesteld met het commando:
+%I
+%I \steldoornummerenin[instellingen]
+%P
+%I Het is mogelijk het nummeren opnieuw te starten met het
+%I commando:
+%I
+%I \reset<naam>
+%I
+%I en een (sub)nummer op te hogen met:
+%I
+%I \volgende<naam>
+%I \volgendesub<naam>
+%I
+%I Het tussentijds bijstellen van de instellingen is mogelijk
+%I met:
+%I
+%I \steldoornummerenin[naam][instellingen]
+
+\def\showdnpuretext#1%
+ {\strut\getvalue{\??dd#1\c!tekst} }
+
+\def\showdntext#1%
+ {\doifelsevaluenothing{\??dd#1\c!tekst}
+ {\ignorespaces}
+ {\strut\getvalue{\??dd#1\c!tekst}\fixedspace}}
+
+\def\showdnnummer#1%
+ {\voorafgaandenummer%
+ \nummer[\getvalue{\??dd#1\??dd\c!nummer}]}
+
+\def\showdnsubnummer#1%
+ {\showdnnummer{#1}%
+ \getvalue{\??dd#1\c!scheider}%
+ \nummer[\v!sub\getvalue{\??dd#1\??dd\c!nummer}]}
+
+\def\showdnsubsubnummer#1%
+ {\showdnsubnummer{#1}%
+ \getvalue{\??dd#1\c!scheider}%
+ \nummer[\v!sub\v!sub\getvalue{\??dd#1\??dd\c!nummer}]}
+
+\def\showdnsubsubsubnummer#1%
+ {\showdnsubsubnummer{#1}%
+ \getvalue{\??dd#1\c!scheider}%
+ \nummer[\v!sub\v!sub\v!sub\getvalue{\??dd#1\??dd\c!nummer}]}
+
+\def\domakednnummer#1#2%
+ {\getvalue{\??dd#2\c!links}%
+ \strut#1{#2}%
+ \getvalue{\??dd#2\c!rechts}}
+
+% #1=name #2=level #3=\show #4[#5]#6=#1[#2]#3 van definitie
+
+\def\special@@definitiewoord#1#2#3#4[#5]#6%
+ {\strut
+ \doifelsevalue{\??dd#1\c!nummer}{\v!nee}
+ {\!!doneafalse}
+ {\doifelse{#5}{-}
+ {\!!doneafalse}
+ {\!!doneatrue}}%
+ \if!!donea
+ \getvalue{\e!volgende#2#1}%
+ \iflocation
+ \bgroup
+ \setvalue{\??dd#1\c!sectienummer}{\v!ja}%
+ \protectconversion
+ \maakvoorafgaandenummer[#1]%
+ \xdef\internaldoornummer{#3{#1}}%
+ \rawreference{\s!num}{#1:\internaldoornummer}{}%
+ \egroup
+ \fi
+ \maakvoorafgaandenummer[#1]%
+ \hbox
+ {\def\kap##1{##1}% \domakednnumer gaat hier fout binnen kap
+ \doattributes
+ {\??dd#1\v!kop}
+ {\showdntext{#2#1}%
+ \domakednnummer#3{#1}%
+ \getvalue{\??dd#1\c!afsluiter}}%
+ \iflocation
+ \edef\localconnection{\getvalue{\??dd#1\c!koppeling}:\internaldoornummer}%
+ \doifreferencefoundelse{\localconnection}
+ {\in[\localconnection]}{}% genereert > of <
+ \fi}%
+ \rawreference{\s!num}{#5}{#3{#1}}%
+ \else
+ \ExpandBothAfter\doattributes
+ {\??dd#1\v!kop}
+ {\showdnpuretext{#2#1}}%
+ \rawreference{\s!num}{#5}{}%
+ \fi}
+
+\def\@@ddresetsubsubsubnummer#1%
+ {\edef\doornummer{\getvalue{\??dd#1\??dd\c!nummer}}%
+ \resetnummer[\v!sub\v!sub\v!sub\doornummer]}
+
+\def\@@ddresetsubsubnummer#1%
+ {\@@ddresetsubsubsubnummer{#1}%
+ \resetnummer[\v!sub\v!sub\doornummer]}
+
+\def\@@ddresetsubnummer#1%
+ {\@@ddresetsubsubnummer{#1}%
+ \resetnummer[\v!sub\doornummer]}
+
+\def\@@ddresetnummer#1%
+ {\@@ddresetsubnummer{#1}%
+ \resetnummer[\doornummer]}
+
+\def\@@ddvolgendesubsubsubnummer#1[#2]%
+ {\edef\doornummer{\getvalue{\??dd#1\??dd\c!nummer}}%
+ \verhoognummer[\v!sub\v!sub\v!sub\doornummer]%
+ \rawreference{\s!num}{#2}{\showdnsubsubsubnummer{\doornummer}}}%
+
+\def\@@ddvolgendesubsubnummer#1[#2]%
+ {\@@ddresetsubsubsubnummer{#1}%
+ \verhoognummer[\v!sub\v!sub\doornummer]%
+ \rawreference{\s!num}{#2}{\showdnsubsubnummer{\doornummer}}}
+
+\def\@@ddvolgendesubnummer#1[#2]%
+ {\@@ddresetsubsubnummer{#1}%
+ \verhoognummer[\v!sub\doornummer]%
+ \rawreference{\s!num}{#2}{\showdnsubnummer{\doornummer}}}
+
+\def\@@ddvolgendenummer#1[#2]%
+ {\@@ddresetsubnummer{#1}%
+ \verhoognummer[\doornummer]%
+ \rawreference{\s!num}{#2}{\showdnnummer{\doornummer}}}
+
+\def\dodosteldoornummerenin[#1][#2]%
+ {\getparameters[\??dd#1][#2]%
+ \stelnummerin[#1][\c!conversie=\getvalue{\??dd#1\c!conversie}]} % see below
+
+\def\dosteldoornummerenin[#1][#2]%
+ {\ConvertToConstant\doifelse{#2}{}
+ {\getparameters[\??dn][#1]}
+ {\dodoubleargumentwithset\dodosteldoornummerenin[#1][#2]}}
+
+\def\steldoornummerenin%
+ {\dodoubleempty\dosteldoornummerenin}
+
+\def\dododoornummeren#1#2#3[#4][#5]#6%
+ {\dodoordefinieren[#3#1]%
+ [\s!do\c!status=\v!start,
+ \s!do\c!commando=\special@@definitiewoord{#1}{#3}{#6}]%
+ \copyparameters[\??dd#3#1][\??dn]
+ [\c!plaats,\c!kopletter,\c!letter,\c!kleur,\c!kopkleur,
+ \c!breedte,\c!nummer,\c!afstand,\c!commando,
+ \c!monster,\c!hang,\c!uitlijnen,\c!voor,\c!tussen,\c!na,
+ \c!niveaus,\c!wijze,\c!blokwijze,\c!scheider,\c!marge,
+ \c!springvolgendein,\c!afsluiter,\c!sectienummer,\c!nummer]%
+ \ConvertToConstant\doifinstringelse{=}{#4}
+ {\getparameters[\??dd#3#1]%
+ [\c!tekst=#1,\??dd\c!nummer=#1,\c!conversie=,
+ \c!links=,\c!rechts=,\c!koppeling=,#4]}%
+ {\doifelsenothing{#4}
+ {\getparameters[\??dd#3#1]%
+ [\c!tekst=#1,\??dd\c!nummer=#1,\c!conversie=,
+ \c!links=,\c!rechts=,\c!koppeling=,#4]}%
+ {\copyparameters[\??dd#3#1][\??dd#3#4]
+ [\c!plaats,\c!kopletter,\c!letter,\c!kleur,\c!kopkleur,
+ \c!breedte,\c!nummer,\c!afstand,\c!commando,\c!marge,
+ \c!monster,\c!hang,\c!uitlijnen,\c!voor,\c!tussen,\c!na,
+ \c!springvolgendein,\c!links,\c!rechts,\c!koppeling]%
+ \getparameters[\??dd#3#1]
+ [\c!tekst=#1,\??dd\c!nummer=#4,\c!conversie=,#5]}}%
+ \ExpandBothAfter\doif{\getvalue{\??dd#3#1\??dd\c!nummer}}{#1}
+ {\definieernummer
+ [#3#1]
+ [\c!wijze=\getvalue{\??dd#1\c!wijze},
+ \c!blokwijze=\getvalue{\??dd#1\c!blokwijze},
+ \c!sectienummer=\getvalue{\??dd#1\c!sectienummer}]%
+ \doifvalue{\??dd#1\c!niveaus}{#2}% % for
+ {\doifsomething{\getvalue{\??dd#1\c!conversie}}% % old
+ {\stelnummerin[#3#1] % times
+ [\c!conversie=\getvalue{\??dd#1\c!conversie}]}}}% % sake
+ \setvalue{\s!reset#3#1}%
+ {\getvalue{\??dd\s!reset#3\c!nummer}{#1}}%
+ \setvalue{\s!complex\e!volgende#3#1}%
+ {\getvalue{\??dd\c!volgende#3\c!nummer}{#1}}%
+ \setvalue{\e!volgende#3#1}%
+ {\complexorsimpleempty{\e!volgende#3#1}}}
+
+\def\dodoornummeren[#1][#2][#3]%
+ {\dododoornummeren{#1}{1}{}[#2][#3]\showdnnummer
+ \dododoornummeren{#1}{2}{\v!sub}[#2][#3]\showdnsubnummer
+ \dododoornummeren{#1}{3}{\v!sub\v!sub}[#2][#3]\showdnsubsubnummer
+ \dododoornummeren{#1}{4}{\v!sub\v!sub\v!sub}[#2][#3]\showdnsubsubsubnummer}
+
+\def\doornummeren%
+ {\dotripleemptywithset\dodoornummeren}
+
+%I n=Doorspringen
+%I c=\doorspringen,\steldoorspringenin
+%I
+%I Inspringende opsommingen (bijvoorbeeld dialogen) kunnen
+%I worden gezet met:
+%I
+%I \doorspringen[naam][tekst=,scheider=,breedte=,letter=,
+%I kopletter=,voor=,na=]
+%I
+%I Na dit commando zijn de commando's \naam, \subnaam en
+%I \subsubnaam beschikbaar.
+%I
+%I Er kunnen standaardwaarden worden ingesteld met het
+%I commando:
+%I
+%I \steldoorspringenin[instellingen]
+%I
+%I Een aantal commando's kan worden omringt met de volgende
+%I commando's (wel lege regels ertussen!).
+%I
+%I \startdoorspringen
+%I \stopdoorspringen
+%P
+%I Het tussentijds bijstellen van de instellingen is mogelijk
+%I met:
+%I
+%I \steldoorspringenin[naam][instellingen]
+
+% Het default-mechanisme kan mooier: leegtest, enz.
+%
+% Werkprocedure buiten definitie
+
+\def\dodosteldoorspringenin[#1][#2]%
+ {\getparameters[\??ds#1][#2]}
+
+\def\dosteldoorspringenin[#1][#2]%
+ {\ConvertToConstant\doifelse{#2}{}
+ {\dodosteldoorspringenin[][#1]}
+ {\dodoubleargumentwithset\dodosteldoorspringenin[#1][#2]}}
+
+\def\steldoorspringenin%
+ {\dodoubleempty\dosteldoorspringenin}
+
+\def\startdoorspringen%
+ {\witruimte
+ \@@dsvoor
+ \pagina[\v!voorkeur]
+ \begingroup
+ \parskip=\!!zeropoint\relax}
+
+\def\stopdoorspringen%
+ {\endgroup
+ \@@dsna}
+
+\def\dododoorspringen#1#2#3%
+ {\par
+ \getvalue{\??ds#1\c!voor}%
+ \begingroup
+ \doifvaluenothing{\??ds#1\c!monster}
+ {\setvalue{\??ds#1\c!monster}%
+ {\getvalue{\??ds#1\c!tekst}}}%
+ \assignwidth
+ {\!!widtha}
+ {\getvalue{\??ds#1\c!breedte}}
+ {\doattributes
+ {\??ds#1\v!kop}
+ {\getvalue{\??ds#1\c!monster}\getvalue{\??ds#1\c!scheider}}}
+ {1em}%
+ \advance\!!widtha by \tfskipsize
+ \setbox2=\hbox to \!!widtha
+ {\doattributes
+ {\??ds#1\v!kop}
+ {\strut
+ \getvalue{\??ds#1\c!tekst}%
+ \hss
+ \getvalue{\??ds#1\c!scheider}%
+ \tfskip}}%
+ \parindent\!!zeropoint
+ \hskip#2\!!widtha\indent\box2%
+ \hangindent#3\!!widtha
+ \doattributes{\??ds#1}{}% #4}%
+ \AfterPar%
+ {\endgroup
+ \getvalue{\??ds#1\c!na}}%
+ \GetPar}
+
+\def\dodoorspringen[#1][#2]%
+ {\copyparameters[\??ds#1][\??ds]
+ [\c!tekst,\c!scheider,\c!breedte,\c!letter,\c!kleur,
+ \c!kopletter,\c!monster,\c!voor,\c!na]%
+ \getparameters[\??ds#1][#2]%
+ \setvalue{#1}%
+ {\dododoorspringen{#1}{0}{1}}%
+ \setvalue{\v!sub#1}%
+ {\dododoorspringen{#1}{1}{2}}%
+ \setvalue{\v!sub\v!sub#1}%
+ {\dododoorspringen{#1}{2}{3}}}
+
+\def\doorspringen%
+ {\dodoubleargumentwithset\dodoorspringen}
+
+%I n=Doorlabelen
+%I c=\doorlabelen,\verhoog,\huidige
+%I
+%I Het is mogelijk genummerde verwijzingen (bijvoorbeeld
+%I naar sheets of video's) in de tekst op te nemen met
+%I het commando:
+%I
+%I \doorlabelen[naam][tekst=,plaats=,voor=,na=,kopletter=]
+%I
+%I Na dit commando zijn de volgende commando's beschikbaar:
+%I
+%I \reset<naam>
+%I \verhoog<naam>
+%I \volgende<naam>[referentie]
+%I \huidige<naam>
+%I \in<naam>[referentie]
+%P
+%I Er kan een 'kopje' worden opgeropeen met het commando:
+%I
+%I \naam
+%I
+%I In dat geval worden de onder 'voor' en 'na' opgegeven
+%I commando's uitgevoerd.
+%I
+%I Als we voor naam 'sheet' invullen en voor tekst
+%I 'transparant' dan leidt het commando \huidigesheet tot
+%I de tekst 'transparant 1' en een volgende aanroep tot de
+%I tekst 'transparant 2'.
+
+\def\dodoorlabel[#1][#2]%
+ {\getvalue{\s!number#1\c!voor}%
+ \bgroup
+ %\ExpandFirstAfter\doifinset{\getvalue{\s!number#1\c!plaats}}{\v!marge,\v!inmarge}
+ % {\setvalue{\s!number#1\c!zetwijze}{\v!inmarge}}%
+ \doif{\getvalue{\s!number#1\c!plaats}}{\v!marge}
+ {\setvalue{\s!number#1\c!plaats}{\v!inmarge}}%
+ \doattributes{\s!number#1\v!kop}{\getvalue{\e!volgende#1}[#2]}%
+ \egroup
+ \getvalue{\s!number#1\c!na}}%
+
+\def\dovolgendedoorlabel[#1][#2]%
+ {\volgendenummer[#1][\s!lab][#2]}
+
+\def\dodoorlabelen[#1][#2]%
+ {\definieernummer
+ [#1]
+ [\c!voor=,
+ \c!na=,
+ \c!kopletter=,
+ \c!wijze=\@@nrwijze,
+ #2]%
+ \setvalue{#1}%
+ {\dodoubleempty\dodoorlabel[#1]}%
+ \setvalue{\s!reset#1}%
+ {\resetnummer[#1]}%
+ \setvalue{\e!verhoog#1}%
+ {\verhoognummer[#1]}%
+ \setvalue{\e!volgende#1}%
+ {\dodoubleempty\dovolgendedoorlabel[#1]}%
+ \setvalue{\c!huidige#1}%
+ {\huidigenummer[#1]}%
+ \setvalue{\c!in#1}[##1]% % weghalen
+ {\innummer[#1][##1]}% % weghalen
+ \setvalue{\c!op#1}[##1]% % weghalen
+ {\opnummer[#1][##1]}} % weghalen
+
+\def\doorlabelen%
+ {\dodoubleargumentwithset\dodoorlabelen}
+
+%I n=Uitlijnen
+%I c=\startuitlijnen,\steluitlijnenin,\steltolerantiein
+%I c=\regellinks,\regelrechts,\regelmidden,
+%I c=\woordrechts
+%I
+%I De regelval kan worden ingesteld met:
+%I
+%I \steluitlijnenin[instelling]
+%I
+%I waarbij de volgende instellingen mogelijk zijn:
+%I
+%I links links niet uitvullen
+%I midden links/rechts niet uitvullen = centreren
+%I rechts rechts niet uitvullen
+%I breedte uitvullen over breedte (default)
+%I beide wisselend (afhankelijk bladzijde)
+%I onder onderkant niet uitgelijnd (default)
+%I hoogte uitvullen over hoogte (op baseline)
+%I regel uitvullen over hoogte (binnen kader)
+%I reset uitvullen over breedte en hoogte
+%I
+%I In combinatie met links, midden en rechts kan 'ruim'
+%I worden opgegeven.
+%P
+%I Aanvullend zijn de volgende commando's beschikbaar:
+%I
+%I \startuitlijnen[instelling]
+%I \stopuitlijnen
+%I
+%I Een regel kan op verschillende manieren worden uitgelijnd
+%I met behulp van de commando's:
+%I
+%I \regellinks{tekst}
+%I \regelrechts{tekst}
+%I \regelmidden{tekst}
+%I
+%I Aan het eind van een paragraaf kan een stukje tekst
+%I worden geplaatst met: \woordrechts{ziezo}
+%P
+%I De tolerantie waarbinnen het uitlijnen plaatsvindt kan
+%I worden ingesteld met:
+%I
+%I \steltolerantiein[instelling]
+%I
+%I Mogelijke waarden zijn: zeerstreng, streng, soepel en
+%I zeersoepel.
+%I
+%I Standaard heeft de tolerantie betrekking op horizontaal
+%I uitlijnen. Vertikaal kan het uitlijnen worden beinvloed
+%I door het trefwoord 'vertikaal' mee te geven. Standaard
+%I geldt [vertikaal,streng] en [horizontaal,zeerstreng].
+
+\definetwopasslist{\s!paragraph}
+
+\newcounter\nofraggedparagraphs
+
+\def\doparagraphreference% looks very much like domarginreference
+ {\doglobal\increment\nofraggedparagraphs\relax
+ \edef\writeparref%
+ {\writeutilitycommand%
+ {\twopassentry%
+ {\s!paragraph}%
+ {\nofraggedparagraphs}%
+ {\noexpand\realfolio}}}%
+ \writeparref}
+
+\def\setraggedparagraphmode#1#2%
+ {\ifinner
+ \ifdubbelzijdig
+ \gettwopassdata{\s!paragraph}%
+ \iftwopassdatafound
+ \ifodd\twopassdata#1\else#2\fi
+ \else
+ \ifodd\realfolio#1\else#2\fi
+ \fi
+ \doparagraphreference
+ \else
+ #2\relax
+ \fi
+ \else
+ #2\relax
+ \fi}
+
+% De onderstaande macro's zijn opgenomen in Plain TeX.
+%
+% \def\raggedright%
+% {\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}
+%
+% \def\ttraggedright%
+% {\tttf\rightskip\z@ plus2em\relax}
+%
+% \newif\ifr@ggedbottom
+%
+% \def\raggedbottom%
+% {\topskip 10\p@ plus60\p@ \r@ggedbottomtrue}
+%
+% \def\normalbottom%
+% {\topskip 10\p@ \r@ggedbottomfalse}
+%
+% en worden hieronder wat aangepast.
+
+\newif\ifn@rmalbottom
+\newif\ifr@ggedbottom
+\newif\ifb@selinebottom
+
+\def\normalbottom%
+ {\n@rmalbottomtrue
+ \r@ggedbottomfalse
+ \b@selinebottomfalse
+ \settopskip}
+
+\def\raggedbottom%
+ {\n@rmalbottomfalse
+ \r@ggedbottomtrue
+ \b@selinebottomfalse
+ \settopskip}
+
+\def\baselinebottom%
+ {\n@rmalbottomfalse
+ \r@ggedbottomfalse
+ \b@selinebottomtrue
+ \settopskip}
+
+% \hyphenpenalty = ( 2.5 * \hsize ) / \raggedness
+% \tolerance >= 1500 % was 200
+% \raggedness = 2 .. 6\korpsgrootte
+
+\def\leftraggedness {2\korpsgrootte}
+\def\rightraggedness {2\korpsgrootte}
+\def\middleraggedness {6\korpsgrootte}
+
+\def\setraggedness#1%
+ {\ifnum\tolerance<1500\relax % kleinere waarden
+ \tolerance=1500\relax % geven ongewenste
+ \fi % effecten
+ \spaceskip=2.5\hsize % voorkomt conflict
+ \xspaceskip=#1\relax % met \dimen0/2 en
+ \divide\spaceskip by \xspaceskip % deze skips worden
+ \hyphenpenalty=\spaceskip} % toch al aangepast
+
+\def\setraggedskips#1#2#3#4#5#6%
+ {\leftskip=1\leftskip\!!plus#1\relax % zie: Tex By Topic 8.1.3
+ \rightskip=1\rightskip\!!plus#2\relax % zie: Tex By Topic 8.1.3
+ \spaceskip#3\relax
+ \xspaceskip#4\relax
+ \parfillskip\!!zeropoint\!!plus#5\relax
+ \parindent#6\relax}
+
+\def\notragged%
+ {\setraggedskips{0em}{0em}{0em}{0em}{1fil}{\parindent}} % {\voorwit}}
+
+\def\raggedleft%
+ {\setraggedness\leftraggedness
+ \setraggedskips{\leftraggedness}{0em}{.3333em}{.5em}{0em}{0em}}
+
+\def\raggedcenter%
+ {\setraggedness\middleraggedness
+ \setraggedskips{\middleraggedness}{\middleraggedness}{.3333em}{.5em}{0em}{0em}}
+
+\def\raggedright%
+ {\setraggedness\rightraggedness
+ \setraggedskips{0em}{\rightraggedness}{.3333em}{.5em}{0em}{\parindent}} % {\voorwit}}
+
+\def\veryraggedleft%
+ {\setraggedskips{1fil}{0em}{.3333em}{.5em}{0em}{0em}}
+
+\def\veryraggedcenter%
+ {\setraggedskips{1fil}{1fil}{.3333em}{.5em}{0em}{0em}}
+
+\def\veryraggedright%
+ {\setraggedskips{0em}{1fil}{.3333em}{.5em}{0em}{\parindent}} % {\voorwit}}
+
+\def\ttraggedright%
+ {\tttf
+ \setraggedskips{0em}{\rightraggedness}{0em}{0em}{0em}{\parindent}} % {\voorwit}}
+
+\def\dosteluitlijnenin[#1]%
+ {\doifinsetelse{\v!ruim}{#1}{\!!doneatrue}{\!!doneafalse}%
+ \processallactionsinset
+ [#1]
+ [ \v!regel=>\baselinebottom,
+ \v!onder=>\raggedbottom,
+ \v!hoogte=>\normalbottom,
+ \v!breedte=>\notragged,
+ \v!binnen=>\setraggedparagraphmode\raggedleft\raggedright,
+ \v!buiten=>\setraggedparagraphmode\raggedright\raggedleft,
+ \v!links=>\if!!donea\veryraggedleft\else\raggedleft\fi,
+ \v!rechts=>\if!!donea\veryraggedright\else\raggedright\fi,
+ \v!midden=>\if!!donea\veryraggedcenter\else\raggedcenter\fi,
+ \v!reset=>\notragged
+ \normalbottom]}
+
+\def\steluitlijnenin%
+ {\dosingleargument\dosteluitlijnenin}
+
+\def\startuitlijnen%
+ {\bgroup
+ \steluitlijnenin}
+
+\def\stopuitlijnen
+ {\par
+ \egroup}
+
+%\def\regellinks#1%
+% {\noindent\leftline{{\strut#1}}}
+%
+%\def\regelrechts#1%
+% {\noindent\rightline{{#1\strut}}}
+%
+%\def\regelmidden#1%
+% {\noindent\centerline{{\strut#1}}}
+
+\def\doalignline#1#2%
+ {\dowithnextbox
+ {\noindent\hbox to \hsize
+ {\strut#1\unhbox\nextbox#2}}
+ \hbox}
+
+\def\regellinks {\doalignline \relax \hss }
+\def\regelrechts {\doalignline \hss \relax}
+\def\regelmidden {\doalignline \hss \hss }
+
+\def\doregelplaats#1%
+ {\getvalue{regel\interfaced{#1}}}
+
+\def\dosteltolerantiein[#1]%
+ {\doifinsetelse{\v!vertikaal}{#1}%
+ {\processfirstactioninset
+ [#1]
+ [\v!zeerstreng=>\def\bottomtolerance{},
+ \v!streng=>\def\bottomtolerance{.050},
+ \v!soepel=>\def\bottomtolerance{.075},
+ \v!zeersoepel=>\def\bottomtolerance{.100}]}%
+ {\processfirstactioninset
+ [#1]
+ [\v!zeerstreng=>\tolerance=200,
+ \v!streng=>\tolerance=1500,
+ \v!soepel=>\tolerance=3000,
+ \v!zeersoepel=>\tolerance=4500]}}
+
+\def\steltolerantiein%
+ {\dosingleargument\dosteltolerantiein}
+
+\def\woordrechts%
+ {\groupedcommand{\hfill\hbox}{\parfillskip\!!zeropoint}}
+
+%I n=Margeteksten
+%I c=\inmarge,\inlinker,\inrechter,\stelinmargein
+%I c=\margetitel,\figuurinmarge
+%I c=\oplinker
+%I
+%I Een paragraaf kan worden ingeluid met een tekst in
+%I de marge:
+%I
+%I \inmarge{tekst}
+%I \inlinker{tekst}
+%I \inrechter{tekst}
+%I
+%I Met \\ kan binnen een margetekst naar een volgende regel
+%I worden gesprongen.
+%P
+%I Het onderstaande commando kan gebruikt worden om een
+%I paragraafaanduiding in de marge te plaatsen. Het commando
+%I moet aan het begin van de paragraaf staan. Er wordt
+%I gecontroleerd of een en ander nog op de bladzijde past.
+%I
+%I \margetitel{tekst}
+%I
+%I Tussen \margetitel{tekst} en de volgende alinea mag,
+%I omwille van de overzichtelijkheid, een lege regels staan.
+%I Als dit commando wordt gebruikt na een commando als
+%I \paragraaf, kan het controlemechanisme leiden tot een
+%I ongewenste overgang naar een nieuwe bladzijde. In dat
+%I geval kan beter het volgende commando worden gebruikt.
+%I
+%I \margewoord{tekst}
+%I
+%I Dit commando komt overeen met \inmarge, alleen is bij
+%I \margewoord de lege regel toegestaan.
+%P
+%I Er kan eventueel voor {tekst} een [referentie] worden
+%I meegegeven. In dat geval kan worden verwezen naar het
+%I paginanummer waarop het margewoord staat.
+%I
+%I Als TeX twijfelt in welke marge het woord moet staan, is
+%I een tweede verwerkingsslag nodig. Als een margewoord bij
+%I herhaling verkeerd wordt geplaatst, dan kan het
+%I automatisme worden verstoord door [+] mee te geven. Een
+%I margewoord kan lager worden gezet met [laag]. Combinaties
+%I kunnen ook:
+%I
+%I \margewoord[+,laag][referentie]{woord}
+%P
+%I De wijze van weergeven kan worden ingesteld met het
+%I commando:
+%I
+%I \stelinmargein[letter=,plaats=,voor=,na=,uitlijnen=]
+%I
+%I Als plaats kan links, rechts of beide worden meegegeven. In
+%I het laatste geval hangt de plaats af van het
+%I enkel/dubbelzijdig zetten.
+%I
+%I Uitlijnen kent twee instellingen: 'ja' en 'nee'. Inhet
+%I eerste geval (default) worden de margewoorden tegen de
+%I kantlijn geplaatst.
+%P
+%I Vooruitlopend op meer commando's is er al vast het
+%I commando:
+%I
+%I \oplinker{tekst}
+%I
+%I Dit commando kan bijvoorbeeld worden gebruikt binnen
+%I een midden-uitgelijnde tekst. Het commando is nog niet
+%I definitief en robuust.
+
+% %P
+% %I Aanvullend zijn commando's beschikbaar om figuren in
+% %I de marge te plaatsen:
+% %I
+% %I \figuurinmarge{figuur}
+% %I \figuurinlinker{figuur}
+% %I \figuurinrechter{figuur}
+
+%T n=margetitel
+%T m=mar
+%T a=m
+%T
+%T \margetitel{?}
+%T
+
+\newif\iflowinmargin
+
+\def\stelinmargein%
+ {\dodoubleempty\dostelinmargein}
+
+\def\dostelinmargein[#1][#2]%
+ {\ifsecondargument
+ \doifundefinedelse{\??im#1\c!offset}
+ {\presetlocalframed
+ [\??im#1]%
+ \getparameters
+ [\??im#1]
+ [\c!kader=\v!uit,
+ \c!offset=\v!overlay,
+ \c!regel=1,
+ \c!scheider=,
+ \c!breedte=\v!ruim,
+ \c!afstand=\!!zeropoint,
+ \c!letter=\@@imletter,
+ \c!kleur=\@@imkleur,
+ \c!plaats=\@@implaats,
+ \c!uitlijnen=\@@imuitlijnen,
+ \c!voor=\@@imvoor,
+ \c!na=\@@imna,
+ #2]}
+ {\getparameters[\??im#1][#2]}%
+ \else
+ \getparameters[\??im][#1]%
+ \fi}
+
+\let\margetekstafstand = \!!zeropoint
+\def\margetekstregels {1}
+\def\margetekstnummer {0}
+\let\margetekstscheider = \empty
+
+\def\maakmargetekstblok#1#2#3#4#5#6%
+ {#4\relax
+ \bgroup
+ \mindermeldingen
+ \hsize#1\relax
+ \ifnum\margetekstnummer=0
+ \def\margetekstnummer{#2}%
+ \fi
+ \processaction
+ [\getvalue{\??im\margetekstnummer\c!uitlijnen}]
+ [ \v!ja=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#2},
+ \v!binnen=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#2},
+ \v!buiten=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#3},
+ \s!default=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#2}]%
+ \setbox0=\vbox\localframed
+ [\??im\margetekstnummer]
+ [\c!strut=\v!nee]
+ {\decrement\margetekstregels
+ \@@imvoor
+ \doattributes{\??im\margetekstnummer}
+ {\dorecurse{\margetekstregels}{\strut\\}%
+ \begstrut#6\endstrut\endgraf}%
+ \@@imna}%
+ \ht0=\ht\strutbox
+ \box0
+ \egroup
+ #5\relax}
+
+\def\plaatsmargetekstscheider%
+ {\ifnum\margincontent>0
+ \bgroup
+ \dimen0=\margetekstregels\lineheight
+ \advance\dimen0 by -\lineheight
+ \lower\dimen0\hbox{\margetekstscheider}%
+ \egroup
+ \fi}
+
+\def\linkermargetekstblok#1%
+ {\maakmargetekstblok
+ {\linkermargebreedte}
+ {\v!links}{\v!rechts}
+ {\llap{\plaatsmargetekstscheider}}{\hskip\margetekstafstand}
+ {#1}}
+
+\def\rechtermargetekstblok#1%
+ {\maakmargetekstblok
+ {\rechtermargebreedte}
+ {\v!rechts}{\v!links}
+ {\hskip\margetekstafstand}{\rlap{\plaatsmargetekstscheider}}
+ {#1}}
+
+\def\doplacemargintext#1#2#3%
+ {\strut
+ \setbox0=\hbox{#1}%
+ \dimen0=\ht0
+ \advance\dimen0 by \dp0
+ \ifdim\dimen0>\marginheight
+ \global\marginheight=\dimen0
+ \fi
+ \setbox0=\hbox
+ {#2{\hskip#3\strut\iflowinmargin\else\raise\dp\strutbox\fi\box0}}%
+ \ht0=\!!zeropoint
+ \dp0=\!!zeropoint
+ \vadjust{\box0}}
+
+\def\doinlinker#1%
+ {\doplacemargintext
+ {\linkermargetekstblok{#1}\hskip\linkermargeafstand}
+ \llap\!!zeropoint}
+
+\def\doinrechter#1%
+ {\doplacemargintext
+ {\hskip\rechtermargeafstand\rechtermargetekstblok{#1}}
+ \rlap\hsize}
+
+\newcounter \nofmarginnotes
+\newif \iftrackingmarginnotes
+\newif \ifrightmargin % documenteren
+
+\definetwopasslist{\s!margin}
+
+\def\domarginreference%
+ {\doglobal\increment\nofmarginnotes\relax
+ \edef\writemarref%
+ {\writeutilitycommand%
+ {\twopassentry%
+ {\s!margin}%
+ {\nofmarginnotes}%
+ {\noexpand\realfolio}}}%
+ \writemarref}
+
+\def\dodoinmargenormal#1#2#3#4%
+ {\iffirstsidefloatparagraph\geenwitruimte\fi % zo laat mogelijk
+ \ifodd#1\relax
+ \rightmargintrue
+ #3{#4}%
+ \else
+ \rightmarginfalse
+ #2{#4}%
+ \fi}
+
+\def\doinmargenormal#1#2#3%
+ {\bgroup
+ \iftrackingmarginnotes
+ \gettwopassdata{\s!margin}%
+ \iftwopassdatafound
+ \dodoinmargenormal\twopassdata#1#2{#3}%
+ \else
+ \dodoinmargenormal\realfolio#1#2{#3}%
+ \fi
+ \domarginreference
+ \else
+ \dodoinmargenormal\realfolio#1#2{#3}%
+ \fi
+ \egroup}
+
+\def\doinmargereverse#1#2#3%
+ {\dodoinmargenormal\realfolio#2#1{#3}}
+
+\def\doinmarge[#1][#2][#3][#4][#5]#6%
+ {\doifcommonelse{+,-,\v!laag}{#4}
+ {\dodoinmarge[#1][#2][#3][#4][#5]{#6}}
+ {\dodoinmarge[#1][#2][#3][][#4]{#6}}%
+ \ignorespaces}
+
+\def\dodoinmarge[#1][#2][#3][#4][#5]#6%
+ {\ignorespaces
+ \doifinsetelse{\v!laag}{#4}
+ {\lowinmargintrue}
+ {\lowinmarginfalse}%
+ \processaction
+ [#1]
+ [ \v!links=>#2{#6},
+ \v!rechts=>#3{#6},
+ \s!unknown=>\ifdubbelzijdig
+ \doifcommonelse{+,-}{#4}
+ {\doinmargereverse#2#3{#6}}
+ {\doinmargenormal#2#3{#6}}%
+ \else
+ #2{#6}%
+ \fi]%
+ \rawpagereference{\s!mar}{#5}%
+ \ignorespaces}
+
+\def\inlinker%
+ {\indentation\doquintupleempty\doinmarge
+ [\c!links][\doinlinker][\doinrechter]}
+
+\def\inrechter%
+ {\indentation\doquintupleempty\doinmarge
+ [\c!rechts][\doinlinker][\doinrechter]}
+
+\def\inmarge%
+ {\doquintupleempty\doinmarge
+ [\@@implaats][\doinlinker][\doinrechter]}
+
+\def\inanderemarge%
+ {\doquintupleempty\doinmarge
+ [\@@implaats][\doinrechter][\doinlinker]}
+
+\newcounter\margincontent
+
+\def\flushmargincontent% [#1][#2]#3% hier plaats 'globaal' (geen 1,2 enz)
+ {\doinmarge[\@@implaats][\doinlinker][\doinrechter]} % [#1][#2]{#3}}
+
+\newdimen\marginheight
+
+\let\restoreinterlinepenalty=\relax
+
+\def\flushmargincontents% % links + rechts
+ {\restoreinterlinepenalty
+ \ifnum\margincontent>0
+ \bgroup
+ \forgetall
+ \global\marginheight\!!zeropoint
+ \dorecurse{\margincontent}
+ {\bgroup
+ \edef\margetekstafstand {\getvalue{\??im\recurselevel\c!afstand}}%
+ \edef\margetekstregels {\getvalue{\??im\recurselevel\c!regel}}%
+ \edef\margetekstscheider{\getvalue{\??im\recurselevel\c!scheider}}%
+ \let\margetekstnummer=\recurselevel
+ \getvalue{\??im\recurselevel}%
+ \global\setvalue{\??im\recurselevel}{}%
+ \egroup}%
+ \ifdim\marginheight>\lineheight % This is something real dirty!
+ \advance\marginheight by \pagetotal
+ \advance\marginheight by \lineheight % a sort of bonus
+ \ifdim\marginheight>\pagegoal
+ \xdef\restoreinterlinepenalty%
+ {\global\let\restoreinterlinepenalty\relax
+ \global\interlinepenalty=\the\interlinepenalty}%
+ \global\interlinepenalty=10000
+ \fi
+ \else % We need the above because interlinepenalties overrule vadjusted \nobreaks.
+ %\vadjust
+ % {\forgetall
+ % \global\advance\marginheight by \lineheight
+ % \global\divide\marginheight by \lineheight
+ % \dorecurse{\number\marginheight}
+ % {\nobreak\vskip\lineheight}%
+ % \kern-\number\marginheight\lineheight}%
+ \vadjust{\nobreak}%
+ \fi
+ \doglobal\newcounter\margincontent
+ \egroup
+ \fi}
+
+\def\complexmargewoord[#1][#2]#3%
+ {\doglobal\increment\margincontent
+ \stelinmargein[\margincontent][]%
+ \global\setvalue{\??im\margincontent}%
+ {\flushmargincontent[#1][#2]{#3}}}
+
+\def\margewoord%
+ {\dodoubleempty\complexmargewoord}
+
+\def\margetitel%
+ {\margewoord}
+
+\def\margetekst%
+ {\margewoord}
+
+\def\margewoordpositie[#1]#2%
+ {\ifnum#1>\margincontent
+ \xdef\margincontent{#1}%
+ \fi
+ \stelinmargein[#1][]%
+ \global\setvalue{\??im#1}%
+ {\flushmargincontent[][]{#2}}}
+
+\def\oplinker#1%
+ {\strut
+ \vadjust
+ {\mindermeldingen
+ \setbox0=\vtop{\forgetall\strut#1}%
+ \getboxheight\dimen0\of\box0
+ \vskip-\dimen0\
+ \box0}}
+
+%D \macros
+%D {inleftside,inleftmargin,inrightmargin,inrightside}
+%D {}
+%D
+%D The fast and clean way of putting things in the margin is
+%D using \type{\rlap} or \type{\llap}. Unfortunately these
+%D macro's don't handle indentation, left and right skips. We
+%D therefore embed them in some macro's that (force and)
+%D remove the indentation and restore it afterwards.
+
+\def\inleftmargin#1%
+ {\pushindentation
+ \llap{#1\hskip\leftskip\hskip\linkermargeafstand}%
+ \popindentation
+ \ignorespaces}
+
+\def\inrightmargin#1%
+ {\pushindentation
+ \rlap{\hskip\hsize\hskip-\rightskip\hskip\rechtermargeafstand#1}%
+ \popindentation
+ \ignorespaces}
+
+\def\inleftside#1%
+ {\inleftmargin
+ {#1\relax
+ \hskip\linkermargebreedte
+ \hskip\pageseparation
+ \hskip\linkerrandafstand}}
+
+\def\inrightside#1%
+ {\inrightmargin
+ {\hskip\rechtermargebreedte
+ \hskip\rechterrandafstand
+ \hskip\pageseparation
+ #1}}
+
+%D We want to keep things efficient and therefore only handle
+%D situations like:
+%D
+%D \startbuffer
+%D \inleftside {fine} some text \par
+%D \strut \inleftmargin {fine} some text \par
+%D \noindent \inrightmargin {fine} some text \par
+%D \noindent \strut \inrightside {fine} some text \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D which looks like:
+%D
+%D \bgroup
+%D \haalbuffer
+%D \parindent 30pt
+%D \haalbuffer
+%D \egroup
+
+%D \macros
+%D {pushindentation,popindentation}
+%D
+%D The pushing and popping is done by:
+
+\newbox\indentationboxA
+\newbox\indentationboxB
+
+\def\pushindentation%
+ {\bgroup
+ \ifhmode
+ \unskip
+ \setbox\indentationboxA=\lastbox % get \strut if present
+ \unskip
+ \setbox\indentationboxB=\lastbox % get \indent generated box
+ \unskip
+ \else
+ \hskip\!!zeropoint % switch to horizontal mode
+ \unskip
+ \setbox\indentationboxA=\lastbox % get \indent generated box
+ \setbox\indentationboxB=\box\voidb@x
+ \fi}
+
+\def\popindentation%
+ {\box\indentationboxB\box\indentationboxA % put back the boxes
+ \egroup}
+
+%D The only complication lays in \type{\strut}. In \PLAIN\
+%D \TEX\ a \type{\strut} is defined as:
+%D
+%D \starttypen
+%D \def\strut%
+%D {\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+%D \stoptypen
+%D
+%D But what is a \type{\strut}? Normally it's a rule of width
+%D zero, but when made visual, it's a rule and a negative skip.
+%D The mechanism for putting things in the margins described
+%D here cannot handle this situation very well. One
+%D characteristic of \type{\strut} is that the \type{\unhcopy}
+%D results in entering horizontal mode, which in return leads
+%D to some indentation.
+%D
+%D To serve our purpose a bit better, the macro \type{\strut}
+%D can be redefined as:
+%D
+%D \starttypen
+%D \def\strut%
+%D {\relax\ifmmode\else\hskip0pt\fi\copy\strutbox}
+%D \stoptypen
+%D
+%D Or more compatible:
+%D
+%D \starttypen
+%D \def\strut%
+%D {\relax\ifmmode
+%D \copy\strutbox
+%D \else
+%D \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup
+%D \fi}
+%D \stoptypen
+%D
+%D In \CONTEXT\ however we save some processing time by putting
+%D an extra \type{\hbox} around the \type{\strutbox}.
+
+% dit zijn voorlopig lokale commando's
+
+\def\woordinlinker {\inlinkermarge} % vervallen
+\def\woordinrechter{\inrechtermarge} % vervallen
+
+\def\woordinmarge%
+ {\doquintupleempty\doinmarge
+ [\@@implaats][\woordinlinker][\woordinrechter]}
+
+%I n=Paginanummer
+%I c=\stelpaginanummerin,\stelsubpaginanummerin
+%I
+%I Het paginanummer kan worden ingesteld met het commando:
+%I
+%I \stelpaginanummerin[nummer=,status=]
+%I
+%I Het nummeren kan gedurende een of meerdere pagina's worden
+%I stilgezet door in plaats van een nummer start, stop of
+%I handhaaf mee te geven.
+%I
+%I Het paginanummer is oproepbaar met:
+%I
+%I \paginanummer
+%I
+%I en het totaal aantal paginanummers met:
+%I
+%I \totaalaantalpaginas
+%P
+%I Er zijn subnummers beschikbaar. De wijze van nummeren
+%I wordt ingesteld met:
+%I
+%I \stelsubpaginanummerin[wijze=,status=]
+%I
+%I De status kan 'stop', 'start' of 'geen' zijn. In het
+%I laatste geval wordt gewoon doorgenummerd, maar wordt het
+%I nummer niet geplaatst.
+%I
+%I Standaard wordt 'perdeel' genummerd. De subnummers zijn
+%I oproepbaar met:
+%I
+%I \subpaginanummer
+%I \aantalsubpaginas
+
+% Standaard is \count0 in Plain TeX de paginateller. Omwille
+% van de afhandeling van lokaal nummeren, definieren we
+% echter een eigen nummer.
+
+\definieernummer
+ [\s!page]
+ [\c!conversie=\@@nmconversie,
+ \c!wijze=\@@nmwijze,
+ \c!status=\@@nmstatus,
+ \c!start=1]
+
+\def\dostelpaginanummerin[#1]%
+ {\getparameters
+ [\??pn]
+ [\c!status=\v!start,
+ #1]%
+ \doifinstringelse{\c!nummer}{#1}
+ {\setnummer[\s!page]{\@@pnnummer}%
+ \setuserpageno{\ruwenummer[\s!page]}}%
+ {}}
+
+\def\stelpaginanummerin%
+ {\dosingleargument\dostelpaginanummerin}
+
+\def\verlaagpaginanummer%
+ {\doif{\@@pnstatus}{\v!start}
+ {\verlaagnummer[\s!page]%
+ \setuserpageno{\ruwenummer[\s!page]}}}
+
+\def\verhoogpaginanummer%
+ {\processaction
+ [\@@pnstatus]
+ [ \v!start=>{\verhoognummer[\s!page]%
+ \setuserpageno{\ruwenummer[\s!page]}},
+ \v!handhaaf=>{\doassign[\??pn][\c!status=\v!start]}]}
+
+\def\checkpagecounter%
+ {\checknummer{\s!page}}
+
+%I n=Pagina
+%I c=\pagina
+%I
+%I Het volgende commando kan worden gebruikt om pagina's af
+%I te dwingen of blokkeren:
+%I
+%I \pagina[instelling]
+%I
+%I Waarbij als instelling kan worden gegeven:
+%I
+%I ja een geforceerde paginaovergang met \vfill
+%I opmaak een geforceerde paginaovergang zonder \vfill
+%I nee bij voorkeur geen paginaovergang
+%I voorkeur bij voorkeur de paginaovergang hier (3)
+%I grotevoorkeur bij voorkeur de paginaovergang hier (7)
+%I links ga naar een linker pagina
+%I rechts ga naar een rechter pagina
+%I leeg een lege pagina
+%I blokkeer blokkeer ja ... grotevoorkeur (1 pagina)
+%I reset het blokkering ja ... grotevoorkeur op
+%I
+%I Als geen instelling wordt meegegeven (\pagina), wordt een
+%I overgang geforceerd. Als een nummer wordt meegegeven, wordt
+%I naar de opgegeven pagina gegaan.
+
+\newif\ifpaginageblokkeerd
+\paginageblokkeerdfalse
+
+\def\testpagina[#1][#2]%
+ {\global\!!doneafalse
+ \ifpaginageblokkeerd
+ \else
+ \ifdim\pagetotal<\pagegoal
+ \dimen0=\lineheight
+ \multiply\dimen0 by #1\relax
+ \advance\dimen0 by \pagetotal
+ \ifdim\lastskip<\parskip
+ \advance\dimen0 by \parskip
+ \fi
+ \advance\dimen0 by #2\relax
+ \ifdim\dimen0>.99\pagegoal
+ \penalty-\!!tenthousand\relax
+ \global\!!doneatrue
+ \fi
+ \else
+ \goodbreak
+ \fi
+ \fi}
+
+\let\resetcurrentsectionmarks=\relax
+
+% was: \resetsectionmarks[\firstsection], zie \handelpaginaaf
+
+% dummy page & insert check
+%
+% \def\complexpagina[#1]%
+% {\flushfootnotes
+% \processaction
+% [#1]
+% [ \v!reset=>\global\paginageblokkeerdfalse,
+% \v!blokkeer=>\global\paginageblokkeerdtrue,
+% \v!ja=>\ifpaginageblokkeerd\else
+% \ejectinsert
+% \ejectpage
+% \ifbinnenkolommen
+% \ejectpage % anders soms geen overgang
+% \fi
+% \fi,
+% \v!opmaak=>\ifpaginageblokkeerd\else
+% \eject
+% \fi,
+% \v!nee=>\ifpaginageblokkeerd\else
+% \nobreak
+% \fi,
+% \v!voorkeur=>{\ifpaginageblokkeerd\else
+% \ifbinnenkolommen
+% \goodbreak
+% \else
+% \testpagina[3][\!!zeropoint]%
+% \fi
+% \fi},
+% \v!grotevoorkeur=>{\ifpaginageblokkeerd\else
+% \ifbinnenkolommen
+% \goodbreak
+% \else
+% \testpagina[5][\!!zeropoint]%
+% \fi
+% \fi},
+% \v!leeg=>{\ejectinsert
+% \ejectpage
+% \doifnotvalue{\??tk\v!hoofd\v!tekst\c!status}{\v!stop}
+% {\stelhoofdin[\c!status=\v!leeg]}%
+% \doifnotvalue{\??tk\v!voet\v!tekst\c!status}{\v!stop}
+% {\stelvoetin[\c!status=\v!leeg]}%
+% \hardespatie
+% \vfill
+% \ejectpage},
+% \v!links=>{\ejectinsert
+% \superejectpage
+% \doifbothsidesoverruled
+% \orsideone
+% \resetcurrentsectionmarks
+% \hardespatie
+% \vfill
+% \ejectpage
+% \orsidetwo
+% \od},
+% \v!rechts=>{\ejectinsert
+% \superejectpage
+% \doifbothsidesoverruled
+% \orsideone
+% \orsidetwo
+% \resetcurrentsectionmarks
+% \hardespatie
+% \vfill
+% \ejectpage
+% \od},
+% \v!even=>\doifonevenpaginaelse
+% {\ejectinsert\ejectpage}{},
+% \v!oneven=>\doifonevenpaginaelse
+% {}{\ejectinsert\ejectpage},
+% \v!viertal=>{\ifdubbelzijdig
+% \!!counta=\realpageno
+% \!!countb=\realpageno
+% \divide\!!counta by 4\relax
+% \divide\!!countb by 2\relax
+% \ifnum\!!counta=\!!countb\relax
+% \else
+% \pagina
+% \pagina[\v!leeg]%
+% \pagina[\v!leeg]%
+% \fi
+% \fi},
+% \v!laatste=>{\ejectinsert
+% \superejectpage
+% \doifbothsidesoverruled
+% \naastpagina
+% \orsideone
+% \orsidetwo
+% \ifodd\realpageno \else
+% \stelvoetin[\c!status=\v!leeg]%
+% \stelhoofdin[\c!status=\v!leeg]%
+% \hardespatie
+% \vfill
+% \ejectpage
+% \fi
+% \od},
+% \s!unknown=>\doifnumberelse{#1}
+% {\ejectinsert
+% \ejectpage
+% \loop
+% \ifnum\userpageno<#1\relax
+% \hardespatie
+% \vfill
+% \ejectinsert
+% \ejectpage
+% \repeat}
+% {}]}
+
+\def\insertdummypage%
+ {\ejectinsert % beter
+ \hardespatie
+ \vfill
+ \ejectpage}
+
+\def\docomplexpagina[#1]%
+ {\flushfootnotes
+ \bgroup
+ \processallactionsinset
+ [#1]
+ [ \v!reset=>\global\paginageblokkeerdfalse,
+ \v!blokkeer=>\global\paginageblokkeerdtrue,
+ \v!ja=>\ifpaginageblokkeerd\else
+ \ejectinsert
+ \ejectpage
+ \ifbinnenkolommen
+ \ejectpage % anders soms geen overgang
+ \fi
+ \fi,
+ \v!opmaak=>\ifpaginageblokkeerd\else
+ \eject
+ \fi,
+ \v!blanko=>\pagebodyornamentsfalse,
+ \v!nee=>\ifpaginageblokkeerd\else
+ \dosomebreak\nobreak
+ \fi,
+ \v!voorkeur=>{\ifpaginageblokkeerd\else
+ \ifbinnenkolommen
+ \dosomebreak\goodbreak
+ \else
+ \testpagina[3][\!!zeropoint]%
+ \fi
+ \fi},
+ \v!grotevoorkeur=>{\ifpaginageblokkeerd\else
+ \ifbinnenkolommen
+ \dosomebreak\goodbreak
+ \else
+ \testpagina[5][\!!zeropoint]%
+ \fi
+ \fi},
+ \v!leeg=>{\ejectinsert
+ \ejectpage
+ \doifnotvalue{\??tk\v!hoofd\v!tekst\c!status}{\v!stop}
+ {\stelhoofdin[\c!status=\v!leeg]}%
+ \doifnotvalue{\??tk\v!voet\v!tekst\c!status}{\v!stop}
+ {\stelvoetin[\c!status=\v!leeg]}%
+ \insertdummypage},
+ \v!links=>{\ejectinsert
+ \superejectpage
+ \doifbothsidesoverruled
+ \orsideone
+ \resetcurrentsectionmarks
+ \insertdummypage
+ \orsidetwo
+ \od},
+ \v!rechts=>{\ejectinsert
+ \superejectpage
+ \doifbothsidesoverruled
+ \orsideone
+ \orsidetwo
+ \resetcurrentsectionmarks
+ \insertdummypage
+ \od},
+ \v!even=>\pagina
+ \doifonevenpaginaelse
+ {\resetcurrentsectionmarks\insertdummypage}{},
+ \v!oneven=>\pagina
+ \doifonevenpaginaelse
+ {}{\resetcurrentsectionmarks\insertdummypage},
+ \v!viertal=>{\ifdubbelzijdig
+ \!!counta=\realpageno
+ \!!countb=\realpageno
+ \divide\!!counta by 4
+ \divide\!!countb by 2
+ \ifnum\!!counta=\!!countb
+ \else
+ \pagina
+ \pagina[\v!leeg]%
+ \pagina[\v!leeg]%
+ \fi
+ \fi},
+ \v!laatste=>{\ejectinsert
+ \superejectpage
+ \doifbothsidesoverruled
+ \naastpagina
+ \orsideone
+ \orsidetwo
+ %\ifodd\realpageno \else % kan weer weg
+ \geenhoofdenvoetregels
+ \insertdummypage
+ %\fi
+ \od
+ \filluparrangedpages},
+ \s!unknown=>\doifnumberelse{#1}
+ {\ejectinsert
+ \ejectpage
+ \loop
+ \ifnum\userpageno<#1\relax
+ \insertdummypage
+ \repeat}
+ {}]%
+ \egroup}
+
+\def\complexpagina[#1]%
+ {\expanded{\docomplexpagina[#1]}}
+
+\def\simplepagina%
+ {\docomplexpagina[\v!ja]}
+
+\def\pagina%
+ {\complexorsimple{pagina}}
+
+\def\resetpagina%
+ {\global\paginageblokkeerdfalse}
+
+% \getpagestatus
+% \ifrightpage als odd/enkelzijdig
+
+\newif\ifrightpage \rightpagetrue
+
+\newcounter \nofpagesets
+
+\definetwopasslist{\s!page}
+
+\def\dopagesetreference%
+ {\doglobal\increment\nofpagesets\relax
+ \edef\writepagref%
+ {\writeutilitycommand
+ {\twopassentry
+ {\s!page}%
+ {\nofpagesets}%
+ {\noexpand\realfolio}}}%
+ \writepagref}
+
+\def\getpagestatus% hierboven gebruiken
+ {\ifdubbelzijdig
+ \gettwopassdata{\s!page}%
+ \iftwopassdatafound \else
+ \let\twopassdata=\realpageno
+ \fi
+ \ifodd\twopassdata
+ \global\rightpagetrue
+ \else
+ \global\rightpagefalse
+ \fi
+ \dopagesetreference
+ \else
+ \global\rightpagetrue
+ \fi}
+
+%I n=Hoofdteksten
+%I c=\stelnummeringin
+%I c=\stelhoofdtekstenin,\stelvoettekstenin,\stelhoofdin,\stelvoetin
+%I c=\stelboventekstenin,\stelondertekstenin,\stelbovenin,\stelonderin
+%I
+%I Zogeheten hoofd- en/of voetteksten kan men instellen
+%I met:
+%I
+%I \stelhoofdtekstenin [linker tekst] [rechter tekst]
+%I \stelvoettekstenin [linker tekst] [rechter tekst]
+%I
+%I Bij dubbelzijdig zetten worden de linker en rechter
+%I teksten gespiegeld.
+%I
+%I In plaats van een tekst kunnen de woorden 'hoofdstuk',
+%I 'paragraaf' en 'deel' worden meegegeven. Ook kan het
+%I woord 'datum' worden meegegeven.
+%P
+%I Als men op de even en oneven pagina's een andere tekst
+%I wil hebben, dan kan men een tweede paar meegeven. In dat
+%I geval zijn er dus vier argumenten: [][][][].
+%I
+%I Als men in de marge of randen teksten wil, kan men dat
+%I direct achter het commando aangeven:
+%I
+%I \stelhoofdtekstenin [lokatie] [links] [rechts]
+%I \stelvoettekstenin [lokatie] [links] [rechts]
+%I
+%I Mogelijke lokaties zijn: tekst, marge en rand.
+%P
+%I In de tekst opgenomen commando's kunnen soms voor
+%I problemen zorgen. Commando's kan men daarom laten
+%I voorafgaan \geentest, bijvoorbeeld:
+%I
+%I \stelvoettekstenin[\geentest\lastigcommando][]
+%I
+%I Meestal geven commando's geen problemen. Wel moet men
+%I oppassen met []. Accolades zijn hiervoor de oplossing:
+%I
+%I \stelvoettekstenin[{{\huidigedatum[mm,/,jj]}}][]
+%I
+%I of
+%I
+%I \stelvoettekstenin[\geentest{\huidigedatum[mm,/,jj]}][]
+%P
+%I De wijze van nummeren wordt gedefinieerd met:
+%I
+%I \stelnummeringin[variant=,plaats=,conversie=,
+%I links=,rechts=,tekst=,tekstscheider=,nummerscheider,
+%I wijze=,blok=,status=,letter=,<sectie>nummer=,commando=]
+%I
+%I De plaats van het nummer hangt af van het eerste
+%I meegegeven argument:
+%I
+%I enkelzijdig dubbelzijdig
+%I
+%I links, rechts kantlijn (links of rechts)
+%I marge marge (links of rechts)
+%I midden midden
+%I inlinker, inrechter inlinker, inrechter
+%P
+%I Met plaats geeft men tevens aan of het nummer in het hoofd
+%I of in de voet komt {hoofd,midden}. Met 'nummerscheider' geeft
+%I men aan wat er binnen een (eventueel) samengestelde nummer
+%I als scheider wordt gezet, standaard: 2-3. Met 'tekstscheider'
+%I geeft men aan wat er tussen het paginanummer en een hoofd- of
+%I voettekst wordt gezet (in geval van plaatsen op de marge).
+%I
+%I Liefhebbers kunnen aan 'commando' een eigen commando om het
+%I nummer te zetten meegeven. Dit eigen commando krijgt als
+%I argument het paginanummer mee.
+%I
+%I Het is mogelijk een dubbelzijdige tekst met enkelzijdige
+%I marges te zetten:
+%I
+%I \stelnummeringin[variant={enkelzijdig,dubbelzijdig}]
+%I
+%I In dit geval worden de hoofd- en voetregels dus wel
+%I gespiegeld en hebben commando's als \pagina[rechts] betekenis.
+%P
+%I Als 'conversie' is mogelijk: cijfers, letters, Letters,
+%I romeins en Romeins. Als 'status' kan 'start' of 'stop'
+%I worden meegegeven. Op deze manier kan het aangeven van
+%I een paginanummer worden aan- en uitgezet.
+%I
+%I Er kan per sectienummer (deelnummer, hoofdstuknummer enz.)
+%I worden ingesteld of het zichtbaar is ('ja' of 'nee').
+%I
+%I Mogelijke wijzen van nummeren zijn: perdeel of perhoofdstuk.
+%P
+%I Hoofd- en voetregels blijven achterwege of juist niet na het
+%I commando:
+%I
+%I \geenhoofdenvoetregels
+%I \welhoofdenvoetregels
+%I
+%I of na:
+%I
+%I \stelhoofdin[lokatie][linkerletter=,rechterletter=,
+%I letter=,linkerbreedte=,rechterbreedte=,voor=,na=]
+%I \stelvoetin[locatie][linkerletter=,rechterletter=,
+%I letter=,linkerbreedte=,rechterbreedte=,voor=,na=]
+%I
+%I mogelijke lokaties zijn: tekst, marge en rand. Als [lokatie]
+%I wordt wegelaten, dan wordt tekst verondersteld.
+%I
+%I Als de breedte wordt ingesteld, dan wordt de weergegeven
+%I tekst zonodig ingekort en gevolgd door ...
+%P
+%I Het is mogelijk het plaatsen van hoofd- en voetregels
+%I stop te zetten:
+%I
+%I \stelhoofdin[status=]
+%I \stelvoetin[status=]
+%I
+%I Aan status kunnen de olgende aarden worden toegekend:
+%I
+%I geen de kop/voet vervalt (de tekst schuift omhoog)
+%I leeg de kop/voet blijft 1 pagina leeg
+%I hoog de kop/voet vervalt 1 pagina leeg (idem)
+%I normaal de kop/voet wordt gezet
+%I stop de kop/voet blijft vanaf nu leeg
+%I start de kop/voet wordt vanaf nu weer gevuld
+%I
+%I Het is ook mogelijk bij \stelhoofdin en \stelvoetin als
+%I parameters [voor=] en [na=] mee te geven. De toegekende
+%I commando's worden in dat geval voor en na het hoofd en de
+%I de voet uitgevoerd.
+%P
+%I Boven het hoofd en onder de voet is ook ruimte. Deze kan
+%I worden gedefinieerd met vergelijkbare commando's:
+%I
+%I \stelboventekstenin[...][...][...]
+%I \stelondertekstenin[...][...][...]
+%I
+%I \stelbovenin[...]
+%I \stelonderin[...]
+%I
+%I \geenbovenenonderregels
+%I \welbovenenonderregels
+
+% De onderstaande macro's lijken op het eerste gezicht vrij
+% ingewikkeld en omslachtig. Dit is het gevolg van een
+% dubbel optioneel zijn van argumenten: zowel het eerste als
+% de twee laatste argumenten zijn optioneel. Dit is mede het
+% gevolg van een uitbreiding naar marges en randen, waarbij
+% upward-compatibiliteit zwaar heeft gewogen.
+
+\def\dostellayouttekstin[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??tk#1#2][#3]%
+ \else
+ \getparameters[\??tk#1\v!tekst][#2]%
+ \fi
+ \calculatevsizes}
+
+\def\stelbovenin {\dotripleempty\dostellayouttekstin[\v!boven]}
+\def\stelhoofdin {\dotripleempty\dostellayouttekstin[\v!hoofd]}
+\def\steltekstin {\dotripleempty\dostellayouttekstin[\v!tekst]}
+\def\stelvoetin {\dotripleempty\dostellayouttekstin[\v!voet]}
+\def\stelonderin {\dotripleempty\dostellayouttekstin[\v!onder]}
+
+\letvalue{\??tk\v!boven\v!tekst\c!status}=\v!normaal
+\letvalue{\??tk\v!hoofd\v!tekst\c!status}=\v!normaal
+\letvalue{\??tk\v!tekst\v!tekst\c!status}=\v!normaal
+\letvalue{\??tk\v!voet \v!tekst\c!status}=\v!normaal
+\letvalue{\??tk\v!onder\v!tekst\c!status}=\v!normaal
+
+\def\geenhoofdenvoetregels%
+ {\stelhoofdin[\c!status=\v!leeg]%
+ \stelvoetin[\c!status=\v!leeg]}
+
+\def\geenbovenenonderregels%
+ {\stelbovenin[\c!status=\v!leeg]%
+ \stelonderin[\c!status=\v!leeg]}
+
+\def\dolimitateteksten#1#2%
+ {\limitatetext{#2}{\getvalue{#1\c!breedte}}{}}
+
+\def\doteksten#1#2#3#4%
+ {\bgroup
+ \convertargument#4\to\ascii
+ \doifsomething{\ascii}
+ {\doattributes{#1#2#3}
+ {\doifvalue{#1\v!tekst\c!strut}{\v!ja}{\setstrut\strut}% hier!
+ \doifdefinedelse{\??mk\ascii\c!koppeling} % brrr
+ {\dolimitateteksten{#1#2#3}{\haalmarkering[\ascii][\v!eerste]}}
+ {\ConvertConstantAfter\doifelse{\v!paginanummer}{#4}
+ {\@@plaatspaginanummer}
+ {\ConvertConstantAfter\doifelse{\v!datum}{#4}
+ %{\currentdate[\v!dag,\v!maand,\v!jaar]}
+ {\currentdate}
+ {\opeenregel\dolimitateteksten{#1#2#3}{#4}}}}}}%
+ \egroup}
+
+\def\dodoteksten#1#2#3#4#5#6%
+ {\doifonevenpaginaelse
+ {\doteksten{#1}{#2}{#3}{#4}}
+ {\doteksten{#1}{#2}{#5}{#6}}}
+
+\def\dodododoteksten[#1][#2][#3][#4][#5][#6]%
+ {\ifsecondargument
+ \ifsixthargument
+ \setvalue{\??tk#1#2\c!linkertekst}%
+ {\dodoteksten{\??tk#1}{#2}{\c!linker}{#3}{\c!rechter}{#6}}%
+ \setvalue{\??tk#1#2\c!rechtertekst}%
+ {\dodoteksten{\??tk#1}{#2}{\c!rechter}{#4}{\c!linker}{#5}}%
+ \else\iffifthargument
+ \setvalue{\??tk#1\v!tekst\c!linkertekst}%
+ {\dodoteksten{\??tk#1}{\v!tekst}{\c!linker}{#2}{\c!rechter}{#5}}%
+ \setvalue{\??tk#1\v!tekst\c!rechtertekst}%
+ {\dodoteksten{\??tk#1}{\v!tekst}{\c!rechter}{#3}{\c!linker}{#4}}%
+ \else\iffourthargument
+ \setvalue{\??tk#1#2\c!linkertekst}%
+ {\dodoteksten{\??tk#1}{#2}{\c!linker}{#3}{\c!linker}{#3}}%
+ \setvalue{\??tk#1#2\c!rechtertekst}%
+ {\dodoteksten{\??tk#1}{#2}{\c!rechter}{#4}{\c!rechter}{#4}}%
+ \else
+ \setvalue{\??tk#1\v!tekst\c!linkertekst}%
+ {\dodoteksten{\??tk#1}{\v!tekst}{\c!linker}{#2}{\c!linker}{#2}}%
+ \setvalue{\??tk#1\v!tekst\c!rechtertekst}%
+ {\dodoteksten{\??tk#1}{\v!tekst}{\c!rechter}{#3}{\c!rechter}{#3}}%
+ \fi\fi\fi
+ \else
+ \dosixtupleempty\dodododoteksten[#1][\v!tekst][][][][]%
+ \dosixtupleempty\dodododoteksten[#1][\v!marge][][][][]%
+ \dosixtupleempty\dodododoteksten[#1][\v!rand] [][][][]%
+ \fi
+ \dosetpagenumberlocation\@@plaatspaginanummer}
+
+\def\stelboventekstenin {\dosixtupleempty\dodododoteksten[\v!boven]}
+\def\stelhoofdtekstenin {\dosixtupleempty\dodododoteksten[\v!hoofd]}
+\def\stelteksttekstenin {\dosixtupleempty\dodododoteksten[\v!tekst]}
+\def\stelvoettekstenin {\dosixtupleempty\dodododoteksten[\v!voet]}
+\def\stelondertekstenin {\dosixtupleempty\dodododoteksten[\v!onder]}
+
+\def\@@plaatspaginanummer%
+ {\doif{\@@nmstatus}{\v!start}%
+ {{\@@nmcommando{\doattributes{\??nm}{\volledigepaginanummer}}}}}
+
+\def\@@nmpre#1{\setbox0=\hbox{#1}\ifdim\wd0=\!!zeropoint\else\unhbox0\tfskip\fi}
+\def\@@nmpos#1{\setbox0=\hbox{#1}\ifdim\wd0=\!!zeropoint\else\tfskip\unhbox0\fi}
+
+\def\dodoplaatsteksten#1#2#3#4#5#6% \hsize toegevoegd
+ {\hbox
+ {\hbox to \linkerrandbreedte
+ {\hsize\linkerrandbreedte
+ \hss\getvalue{\??tk#1\v!rand#2}}%
+ \hskip\linkerrandafstand
+ \hskip\pageseparation
+ \hbox to \linkermargebreedte
+ {\hsize\linkermargebreedte
+ \hsmash{\hbox to \linkermargebreedte
+ {\hss\getvalue{\??tk#1\v!marge#2}}}%
+ \hsmash{\hbox to \linkermargebreedte
+ {\hss#5{\??tk#1\v!marge\c!margetekst}}}%
+ \hss}% let op: \smashed
+ \hskip\linkermargeafstand
+ \hbox to \zetbreedte
+ {\hsize\zetbreedte
+ \hsmash{\hbox to \zetbreedte
+ {\@@nmpre{#5{\??tk#1\v!tekst\c!kantlijntekst}}%
+ \getvalue{\??tk#1\v!tekst#2}\hss}}%
+ \hsmash{\hbox to \zetbreedte
+ {\hss\getvalue{\??tk#1\v!tekst#3}\hss}}%
+ \hsmash{\hbox to \zetbreedte
+ {\hss\getvalue{\??tk#1\v!tekst#4}%
+ \@@nmpos{#6{\??tk#1\v!tekst\c!kantlijntekst}}}}%
+ \hss}%
+ \hskip\rechtermargeafstand
+ \hbox to \rechtermargebreedte
+ {\hsize\rechtermargebreedte
+ \hsmash{\hbox to \rechtermargebreedte
+ {\getvalue{\??tk#1\v!marge#4}\hss}}%
+ \hsmash{\hbox to \rechtermargebreedte
+ {#6{\??tk#1\v!marge\c!margetekst}\hss}}%
+ \hss}% let op: \smashed
+ \hskip\pageseparation
+ \hskip\rechterrandafstand
+ \hbox to \rechterrandbreedte
+ {\hsize\rechterrandbreedte
+ \getvalue{\??tk#1\v!rand#4}\hss}}}
+
+\def\doplaatslayoutregel#1#2%
+ {\ifdim#2>\!!zeropoint\relax % prevents pagenumbers when zero height
+ \goleftonpage
+ \hbox
+ {\setbox0=\vbox to #2
+ {\forgetall
+ \vsize#2
+ \normalbaselines
+ \def\\{ \ignorespaces}%
+ \def\crlf{ \ignorespaces}%
+ \getvalue{\??tk#1\v!tekst\c!voor}%
+ \doifbothsidesoverruled
+ \dodoplaatsteksten#1\c!linkertekst\c!middentekst\c!rechtertekst
+ \gobbleoneargument\getvalue
+ \orsideone
+ \dodoplaatsteksten#1\c!linkertekst\c!middentekst\c!rechtertekst
+ \gobbleoneargument\getvalue
+ \orsidetwo
+ \dodoplaatsteksten#1\c!rechtertekst\c!middentekst\c!linkertekst
+ \getvalue\gobbleoneargument
+ \od
+ \getvalue{\??tk#1\v!tekst\c!na}%
+ \kern\!!zeropoint}% keep the \dp, beware of \vtops, never change this!
+ \dp0=\!!zeropoint
+ \box0}%
+ \fi}
+
+% \stelhoofdin[status=normaal] \titel{NORMAAL} \dorecurse{8}{\input tufte} \pagina
+% \stelhoofdin[status=hoog] \titel{HOOG} \dorecurse{8}{\input tufte} \pagina
+% \stelhoofdin[status=leeg] \titel{LEEG} \dorecurse{8}{\input tufte} \pagina
+% \stelhoofdin[status=geen] \titel{GEEN} \dorecurse{8}{\input tufte} \pagina
+% \stelhoofdin[status=stop] \titel{STOP} \dorecurse{8}{\input tufte} \pagina
+
+\def\plaatslayoutregel#1#2% % handelt o.b.v. tekst
+ {\ExpandFirstAfter\processaction
+ [\getvalue{\??tk#1\v!tekst\c!status}]
+ [ \v!geen=>,
+ \v!hoog=>, % is reset later on
+ \v!start=>\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}%
+ \doplaatslayoutregel{#1}{#2},
+ \v!stop=>\vskip#2\relax,
+ \v!leeg=>\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}%
+ \vskip#2\relax,
+ \v!geenmarkering=>\bgroup
+ \setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}%
+ \let\dohaalmarkering=\nohaalmarkering
+ \doplaatslayoutregel{#1}{#2}%
+ \egroup,
+ \v!normaal=>\doplaatslayoutregel{#1}{#2},
+ \s!default=>\doplaatslayoutregel{#1}{#2},
+ \s!unknown=>\doplaatslayoutregel{#1}{#2}]}
+
+\def\resetlayoutregel#1%
+ {\doifvalue{\??tk#1\v!tekst\c!status}{\v!hoog}
+ {\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}% ! global
+ \doglobal\calculatevsizes
+ \global\newlogostrue
+ \global\newbackgroundtrue}}
+
+\def\resetlayoutregels%
+ {\resetlayoutregel\v!boven
+ \resetlayoutregel\v!hoofd
+ \resetlayoutregel\v!tekst
+ \resetlayoutregel\v!voet
+ \resetlayoutregel\v!onder}
+
+\def\plaatsbovenregel {\plaatslayoutregel\v!boven\bovenhoogte}
+\def\plaatshoofdregel {\plaatslayoutregel\v!hoofd\hoofdhoogte}
+\def\plaatstekstregel {\plaatslayoutregel\v!tekst\teksthoogte}
+\def\plaatsvoetregel {\plaatslayoutregel\v!voet\voethoogte}
+\def\plaatsonderregel {\plaatslayoutregel\v!onder\onderhoogte}
+
+\def\gettextboxes% elders weghalen
+ {\bgroup
+ \setbox0=\vbox
+ {\mindermeldingen
+ \calculatereducedvsizes
+ \swapmargins
+ \forgetall
+ \offinterlineskip
+ \vskip-\bovenhoogte
+ \vskip-\bovenafstand
+ \plaatsbovenregel
+ \vskip\bovenafstand
+ \plaatshoofdregel
+ \vskip\hoofdafstand
+ \plaatstekstregel
+ \vskip\voetafstand
+ \plaatsvoetregel
+ \vskip\onderafstand
+ \plaatsonderregel
+ \plaatsversieaanduiding
+ \vfilll}%
+ \smashbox0
+ \box0
+ \egroup}
+
+\def\@@plaatspaginascheider%
+ {\doif{\@@nmstatus}{\v!start}%
+ {\@@nmtekstscheider}}
+
+% ook rand ondersteunen, iets als:
+
+% \def\dodosetpagenumberlocation#1#2%
+% {\let\somepagenumberlocation=\v!tekst
+% \ExpandFirstAfter\processallactionsinset
+% [\@@nmplaats]
+% [ \v!midden=>\setvalue{\??tk#1\somepagenumberlocation\c!middentekst}{#2},
+% \v!links=>\setvalue{\??tk#1\somepagenumberlocation\c!linkertekst}{#2},
+% \v!rechts=>\setvalue{\??tk#1\somepagenumberlocation\c!rechtertekst}{#2},
+% \v!inlinker=>\setvalue{\??tk#1\v!marge\c!linkertekst}{#2},
+% \v!inrechter=>\setvalue{\??tk#1\v!marge\c!rechtertekst}{#2},
+% \v!inmarge=>\setvalue{\??tk#1\v!marge\ifdubbelzijdig\c!margetekst\else\c!rechtertekst\fi}{#2},
+% \v!marge=>\setvalue{\??tk#1\v!marge\ifdubbelzijdig\c!margetekst\else\c!rechtertekst\fi}{#2},
+% \v!opmarge=>\setvalue{\??tk#1\v!tekst\c!kantlijntekst}{#2},
+% \v!kantlijn=>\setvalue{\??tk#1\v!tekst\c!kantlijntekst}{#2}
+% \v!rand=>\let\somepagenumberlocation=\v!rand,
+% %\v!marge=>\let\somepagenumberlocation=\v!marge,
+% \v!tekst=>\let\somepagenumberlocation=\v!tekst]}
+
+\def\dodosetpagenumberlocation#1#2%
+ {\ExpandFirstAfter\processallactionsinset
+ [\@@nmplaats]
+ [ \v!midden=>\setvalue{\??tk#1\v!tekst\c!middentekst}{#2},
+ \v!links=>\setvalue{\??tk#1\v!tekst\c!linkertekst}{#2},
+ \v!rechts=>\setvalue{\??tk#1\v!tekst\c!rechtertekst}{#2},
+ \v!inlinker=>\setvalue{\??tk#1\v!marge\c!linkertekst}{#2},
+ \v!inrechter=>\setvalue{\??tk#1\v!marge\c!rechtertekst}{#2},
+ \v!inmarge=>\setvalue{\??tk#1\v!marge\ifdubbelzijdig\c!margetekst\else\c!rechtertekst\fi}{#2},
+ \v!marge=>\setvalue{\??tk#1\v!marge\ifdubbelzijdig\c!margetekst\else\c!rechtertekst\fi}{#2},
+ \v!opmarge=>\setvalue{\??tk#1\v!tekst\c!kantlijntekst}{#2},
+ \v!kantlijn=>\setvalue{\??tk#1\v!tekst\c!kantlijntekst}{#2}]}
+
+\def\dosetpagenumberlocation#1%
+ {\ExpandBothAfter\doifinsetelse{\v!hoofd}{\@@nmplaats,\@@nmin}
+ {\dodosetpagenumberlocation{\v!hoofd}{#1}}
+ {\dodosetpagenumberlocation{\v!voet}{#1}}}
+
+\def\@@nmin {} % kan vervallen (upward compatibility)
+\def\@@nmplaats {} % mag {plaats, in} zijn
+
+\def\dostelnummeringin[#1]%
+ {\dosetpagenumberlocation\relax
+ \getparameters[\??nm][#1]%
+ \preparepaginaprefix{\??nm}%
+ \enkelzijdigfalse
+ \dubbelzijdigfalse
+ \ExpandFirstAfter\processallactionsinset
+ [\@@nmvariant]
+ [ \v!enkelzijdig=>\enkelzijdigtrue,
+ \v!dubbelzijdig=>\dubbelzijdigtrue]%
+ \ifdubbelzijdig
+ \trackingmarginnotestrue
+ \else
+ \trackingmarginnotesfalse
+ \fi
+ \dosetpagenumberlocation\@@plaatspaginanummer
+ \global\newbackgroundtrue
+ \global\newlogostrue}
+
+\def\stelnummeringin%
+ {\dosingleempty\dostelnummeringin}
+
+% listig: hangt af van \@@kolijst
+
+\def\preparepaginaprefix#1%
+ {\def\dopreparepaginaprefix##1%
+ {\doifvalue{#1##1\c!nummer}{\v!ja}
+ {\setvalue{#1\getvalue{\??by##1}\c!nummer}{\v!ja}}}%
+ \processcommacommand[\@@kolijst]\dopreparepaginaprefix}
+
+\def\dopaginaprefix#1#2%
+ {\doifelsevalue{#1#2\c!nummer}{\v!ja}%
+ {\@EA\beforesplitstring\@EA{\postprefix}\at:\to\preprefix
+ \@EA\aftersplitstring\@EA{\postprefix}\at:\to\postprefix
+ \doifsomething{\preprefix}
+ {\doifnot{\preprefix}{0}{\preprefix\@@nmnummerscheider}}}%
+ {\@EA\aftersplitstring\@EA{\postprefix}\at:\to\postprefix}}
+
+\def\paginaprefix#1[#2::#3::#4]% kan wat sneller ####1:0:
+ {\bgroup
+ \edef\postprefix{#3}%
+ \def\donexttrackcommando##1%
+ {\dopaginaprefix{#1}{##1}%
+ \donexttracklevel{##1}}%
+ \donexttrackcommando\firstsection
+ \egroup}
+
+\def\@@plaatspaginanummer%
+ {\doif{\@@nmstatus}{\v!start}%
+ {{\@@nmcommando{\doconvertfont{\@@nmletter}{\volledigepaginanummer}}}}}
+
+\def\@@plaatspaginascheider%
+ {\doif{\@@nmstatus}{\v!start}%
+ {\@@nmtekstscheider}}
+
+\def\userfolio% naast realfolio
+ {\nummer[\s!page]}
+
+\def\pagenumber%
+ {\userfolio}
+
+\def\volledigepaginanummer% alleen voor paginanummers !!
+ {\@@nmlinks
+ \def\donexttrackcommando##1%
+ {\doifvalue{\??nm##1\c!nummer}{\v!ja}
+ {\ifnum\countervalue{\??se##1}>0\relax
+ \getvalue{##1\c!nummer}\@@nmnummerscheider
+ \fi}%
+ \doifsomething{\@@nmtekst}
+ {\@@nmtekst\@@nmnummerscheider}%
+ \donexttracklevel{##1}}%
+ \donexttrackcommando{\firstsection}%
+ \pagenumber
+ \@@nmrechts}
+
+\def\translatednumber[#1::#2::#3]%
+ {#3}
+
+%I n=Markeringen
+%I c=\markeer,\haalmarkering
+%I c=\definieermarkering,\stelmarkeringin,\resetmarkering
+%I
+%I Men kan in een tekst markeringen aanbrengen. Een markering
+%I kan bijvoorbeeld worden opgehaald in een kopregel.
+%I
+%I \definieermarkering[categorie]
+%I
+%I Een markering wordt aangebracht met het commando:
+%I
+%I \markeer[categorie]{tekst}
+%I
+%I Er kunnen drie markeringen worden opgevraagd met het
+%I commando:
+%I
+%I \haalmarkering[categorie][plaats]
+%I
+%I Mogelijke plaatsen zijn: eerste, laatste, vorige. Vorige
+%I staat voor de laatste markering op de vorige bladzijde en
+%I eerste en laatste hebben betrekking op de huidige bladzijde.
+%P
+%I Markeringen worden ge(de)blokkeerd met het commando:
+%I
+%I \stelmarkeringin[categorie][status=,expansie=]
+%I
+%I waarbij als instellingen mogelijk zijn: start en stop.
+%I Standaard wordt een markering niet ge‰xpandeerd. Wil met
+%I wel expanderen (wat bij tellers nodig is), dan kan dat
+%I worden ingesteld: expansie=ja.
+%I
+%I Markeringen kunnen worden geinitialiseerd met:
+%I
+%I \resetmarkering[categorie]
+%I
+%I Standaard worden de markeringen 'deel', 'hoofdstuk', 'paragraaf',
+%I 'subparagraaf' en 'subsubparagraaf bijgehouden.
+%P
+%I Soms wordt een argument voor meerdere doeleinden gebruikt,
+%I bijvoorbeeld in \hoofdstuk{tekst}. Hierbij is {tekst}
+%I zowel de kop van het hoofdstuk als de eventueel te plaatsen
+%I markering in de hoofd- of voetregel. Als zo'n tekst te lang
+%I wordt, kan ze als volgt worden beperkt:
+%I
+%I {eerste tweede \geenmarkering{derde vierde} vijfde}
+%I
+%I De woorden 'derde' en 'vierde' worden in dit geval in de
+%I markering vervangen door punten.
+
+% Het commando \newmark\markering genereert
+%
+% \markering
+%
+% en het commando \getmarks\markering genereert
+%
+% \topmarkering
+% \botmarkering
+% \firstmarkering
+%
+% voor 'interne' doeleinden zijn beschikbaar:
+%
+% \prefetchmark[naam]
+% \fetchmark[naam][plaats]
+
+% nog expansie in hoofdmarkering
+
+\def\hoofdmarkering#1%
+ {\getvalue{\??mk#1\c!koppeling}}
+
+\def\dodoresetmarkering#1%
+ {\expandafter\newmark\csname\??mk\hoofdmarkering{#1}\endcsname}
+
+\def\doresetmarkering[#1]%
+ {\processcommalist[#1]\dodoresetmarkering}
+
+\def\resetmarkering%
+ {\dosingleargument\doresetmarkering}
+
+\def\dostelmarkeringin[#1][#2]%
+ {\getparameters[\??mk#1][#2]}
+
+\def\stelmarkeringin%
+ {\dodoubleargument\dostelmarkeringin}
+
+\setvalue{\??mk\v!vorige}{top}
+\setvalue{\??mk\v!eerste}{first}
+\setvalue{\??mk\v!laatste}{bot}
+
+\def\dododefinieermarkering[#1][#2]%
+ {\stelmarkeringin[#1]
+ [% \c!expansie=\v!nee, scheelt weer een macro
+ \c!status=\v!start]%
+ \ontkoppelmarkering[#1]% d.w.z. geen koppeling met secties
+ \setevalue{\??mk#1\c!koppeling}{#2}%
+ \expandafter\newmark\csname\??mk#2\endcsname
+ %\setgvalue{\??mk#2\s!check}{0}%
+ \showmessage{\m!systems}{13}{#1,[#2]}}
+
+\def\dodefinieermarkering[#1][#2]%
+ {\doifelsenothing{#2}
+ {\dododefinieermarkering[#1][#1]}
+ {\dododefinieermarkering[#1][#2]}}
+
+\def\definieermarkering%
+ {\dodoubleempty\dodefinieermarkering}
+
+\let\geenmarkering=\relax
+
+\def\prefetchmark[#1]%
+ {%\ifnum\getvalue{\??mk\hoofdmarkering{#1}\s!check}<\realpageno
+ % \setxvalue{\??mk\hoofdmarkering{#1}\s!check}{\the\realpageno}%
+ % \expandafter\getmarks\csname\??mk\hoofdmarkering{#1}\endcsname % mag maar eenmaal per pagina
+ }%\fi}
+
+\def\fetchmark[#1][#2]%
+ {\getvalue{\getvalue{\??mk#2}\??mk\hoofdmarkering{#1}}}
+
+\def\nohaalmarkering[#1][#2]% tzt anders
+ {}
+
+\def\dohaalmarkering[#1][#2]%
+ {\doifvalue{\??mk#1\c!status}{\v!start}
+ {\bgroup
+ %\prefetchmark[#1]%
+ \def\geenmarkering##1{\onbekend\ }%
+ \doifelsenothing{#2}
+ {\fetchmark[#1][\v!eerste]}
+ {\fetchmark[#1][#2]}%
+ \egroup}}
+
+\def\haalmarkering%
+ {\dodoubleargument\dohaalmarkering}
+
+\def\domarkeer[#1]#2%
+ {\bgroup
+ \doifelsevalue{\??mk#1\c!expansie}{\v!ja}
+ {\expandmarkstrue}
+ {\expandmarksfalse}%
+ \getvalue{\??mk\hoofdmarkering{#1}}{#2}%
+ \egroup}
+
+\def\markeer%
+ {\dosingleargument\domarkeer}
+
+%I n=Tekstonderdelen
+%I c=\hoofdstuk,\paragraaf,\subparagraaf,\subsubparagraaf
+%I c=\titel,\onderwerp,\subonderwerp,\subsubonderwerp,\alinea
+%I c=\stelkopin,\stelkoppenin,\stelkopnummerin
+%I c=\startbijlagen,\bijlage
+%I c=\startinleidingen,\startuitleidingen
+%I
+%I Een tekst wordt gestructureerd met de commando's:
+%I
+%I \titel [referentie] {titel}
+%I \onderwerp [referentie] {onderwerp}
+%I \subonderwerp [referentie] {onderwerp}
+%I \subsubonderwerp [referentie] {onderwerp}
+%I
+%I \hoofdstuk [referentie] {titel}
+%I \paragraaf [referentie] {titel}
+%I \subparagraaf [referentie] {titel}
+%I \subsubparagraaf [referentie] {titel}
+%I
+%I In een {titel} kan het commando \\ worden gebruikt om naar
+%I een volgende regel te gaan. Wil men ook in de inhoudsopgave
+%I naar een nieuwe regel gaan, dan dient \crlf te worden
+%I gebruikt.
+%P
+%I Op een hoger niveau kunnen delen worden gedefinieerd. In
+%I dat geval wordt standaard geen kop geplaatst (het kan
+%I wel).
+%I
+%I \deel [referentie] {titel}
+%I
+%I In totaal zijn er 7 niveaus voorgedefinieerd. Meer
+%I niveaus zijn mogelijk. Het hoogste niveau is op dit
+%I moment dus \deel en het laagste \subsubsubsubparagraaf.
+%P
+%I Naar een hoofdstuk en een paragraaf kan worden
+%I terugverwezen met:
+%I
+%I \inhoofdstuk[referentie]
+%I \inparagraaf[referentie]
+%I
+%I Zodat verwijzingen als 'zie ook hoofdstuk 2' mogelijk
+%I zijn (zie ook \inhoofdstuk[alfa]).
+%I
+%I Ook kunnen de elders besproken commando's worden
+%I gebruikt. Een referentie kan eventueel worden weggelaten,
+%I bijvoorbeeld \hoofdstuk{titel}.
+%P
+%I Een overgang naar een nieuwe alinea kan worden afgedwongen
+%I met het commando:
+%I
+%I \alinea
+%I
+%I Dit commando komt overeen met het commando \par.
+%P
+%I Aanvullend zijn de volgende commando's beschikbaar. Deze
+%I commando's onderdrukken cq. wijzigen de nummering.
+%I
+%I \startbijlagen hoofdstukken nummeren met a, b, ...
+%I \stopbijlagen hoofdstukken nummeren met 1, 2, ...
+%I
+%I \startinleidingen hoofdstukken niet nummeren
+%I \stopinleidingen hoofdstukken wel nummeren
+%I \startuitleidingen hoofdstukken niet nummeren
+%I \stopuitleidingen hoofdstukken wel nummeren
+%I
+%I Als men bijlagen apart wil nummeren, dan gebruikt men in
+%I plaats van \hoofdstuk het commando:
+%I
+%I \bijlage[referentie]{titel}
+%I
+%I waarna de eigenlijke tekst komt of wordt ingelezen uit
+%I een file.
+%P
+%I De wijze waarop hoofdstukken en paragrafen worden genummerd
+%I en gezet, kan worden ingesteld met de commando's:
+%I
+%I \stelkoppenin[variant=,scheider=]
+%I
+%I Hierbij zijn als varianten mogelijk normaal en inmarge.
+%I
+%I Daarnaast is het volgende commando beschikbaar:
+%I
+%I \stelkopin[element][letter=,nummerletter=,tekstletter=,
+%I voor=,na=,pagina=,uitlijnen=,hoofd=]
+%I
+%I Mogelijke elementen zijn: hoofdstuk, paragraaf,
+%I subparagraaf, subsubparagraaf en indien gewenst: titel en
+%I onderwerp.
+%P
+%I Aan de parameters voor en na kunnen commando's worden
+%I toegekend; 'nummer', 'tekst' en 'letter' staan voor de
+%I lettertypen. Standaard zijn 'nummer' en 'tekst' gelijk
+%I aan 'letter'. In de regel kan men volstaan met het
+%I instellen van hoofdstuk en paragraaf, omdat de andere
+%I instellingen hiervan worden afgeleid. Voorbeelden van
+%I instellingen zijn 'letter=vet', 'voor={\blanko[groot]}'
+%I en 'nummer=\tfa'.
+%I
+%I Aan 'pagina' kan de waarde 'links', 'rechts' of 'ja' worden
+%I toegekend. Er wordt alleen naar een nieuwe pagina gegaan als
+%I het nummer van de (sub)(sub)paragraaf groter is dan 1.
+%I Wil men altijd overgaan op een nieuwe bladzijde, dan kan
+%I men dit aangeven door aan 'doorgaan' de waarde 'nee' toe
+%I te kennen.
+%P
+%I Een hoofdstuk kan worden voorafgegaan door een woord,
+%I bijvoorbeeld 'Hoofdstuk'. Dit woord kan worden ingesteld
+%I met \stellabeltekstin.
+%I
+%I Als men aan 'hoofd' de waarde 'geen' toekent, dan wordt
+%I geen hoofdregel geplaatst op de bladzijde waarop de kop
+%I wordt geplaatst.
+%I
+%I Het is mogelijk varianten van koppen te definieren met het
+%I commando:
+%I
+%I \definieerkop[dochter][moeder]
+%I
+%I Na \definieerkop[rubriek][onderwerp] is het commando \rubriek
+%I beschikbaar met dezelfde kenmerken als \onderwerp. Deze
+%I kenmerken kunnen worden aangepast met \stelkopin. Als de
+%I moeder een genummerde kop is, wordt de dochter ook genummerd.
+%P
+%I Nummers van koppen kunnen worden ingesteld met het commando:
+%I
+%I \stelkopnummerin[niveau][nummer]
+%I
+%I Als het nummer wordt vooraf gegaan door + of -, dan is
+%I sprake van een verhoging of verlaging: [hoofdstuk][+2].
+
+%T n=hoofdstuk
+%T m=hfd
+%T a=h
+%T
+%T \hoofdstuk{?}
+
+%T n=paragraaf
+%T m=par
+%T a=p
+%T
+%T \paragraaf{?}
+
+\newcount\nofsections
+
+\def\zerosection{\v!tekst}
+\def\firstsection{}
+\def\lastsection{}
+
+\makecounter{\??se\v!tekst}
+\setevalue{\??se\v!tekst\c!voor}{}
+\setevalue{\??se\v!tekst\c!na}{}
+\setevalue{\v!tekst\c!nummer}{0}
+\setevalue{\v!tekst\s!format}{}
+
+\setevalue{\??sk\v!tekst}{}
+\setevalue{\??sk}{}
+
+\setvalue{\??by}{\v!tekst}
+\setvalue{\??by\v!tekst}{\v!tekst}
+\setvalue{\??by\v!alles}{\v!tekst}
+\setvalue{\??by\v!per}{\v!tekst}
+\setvalue{\??by\v!per\v!tekst}{\v!tekst}
+\setvalue{\??by\v!per\v!alles}{\v!tekst}
+
+\def\dostelsectiein[#1][#2]%
+ {\getparameters[\??se#1][#2]
+ \doifelsevalue{\??se#1\c!vorige\c!nummer}{\v!ja}
+ {\setvalue{#1\c!nummer}{\@@longsectionnumber{#1}}}%
+ {\setvalue{#1\c!nummer}{\@@shortsectionnumber{#1}}}}
+
+\def\stelsectiein%
+ {\dodoubleargument\dostelsectiein}
+
+\def\dokoppelmarkering[#1][#2]%
+ {\doifdefinedelse{\??ko#2\c!sectie}
+ {\dokoppelmarkering[#1][\getvalue{\??ko#2\c!sectie}]}
+ {\def\donexttrackcommando##1%
+ {\edef\gekoppeldemarkeringen{\getvalue{\??se##1\c!markering}}%
+ \doifelse{##1}{#2}
+ {\addtocommalist{#1}\gekoppeldemarkeringen}
+ {\removefromcommalist{#1}\gekoppeldemarkeringen}%
+ \setevalue{\??se##1\c!markering}{\gekoppeldemarkeringen}%
+ \donexttracklevel{##1}}%
+ \donexttracklevel{\firstsection}}}
+
+\def\koppelmarkering%
+ {\dodoubleargument\dokoppelmarkering}
+
+\def\ontkoppelmarkering[#1]%
+ {\koppelmarkering[#1][]}
+
+\def\definieersectie[#1]%
+ {\doifundefined{\??se#1}
+ {\doifelsenothing{\firstsection}
+ {\def\firstsection{#1}%
+ \setevalue{\??se#1\c!voor}{\v!tekst}%
+ \setevalue{\??se\v!tekst\c!na}{#1}}%
+ {\setevalue{\??se\commalistelement\c!na}{#1}%
+ \setevalue{\??se#1\c!voor}{\lastsection}%
+ \setevalue{\??se\lastsection\c!na}{#1}}%
+ \advance\nofsections by 1
+ \setevalue{\??se#1\c!niveau}%
+ {\the\nofsections}%
+ \setevalue{\??se#1\c!na}%
+ {}%
+ \setvalue{\e!volgende#1}%
+ {\@@nextsectionnumber{#1}}%
+ \setvalue{#1\c!nummer}%
+ {\@@longsectionnumber{#1}}%
+ \setvalue{#1\s!format}%
+ {\@@longformatnumber{#1}}%
+ \setevalue{\??by#1}{#1}%
+ \setevalue{\??by\v!per#1}{#1}%
+ \makecounter{\??se#1}%
+ \def\lastsection{#1}%
+ \setvalue{\??sk#1}%
+ {#1}%
+ \setvalue{\??se#1\c!markering}%
+ {}%
+ \stelsectiein[#1]
+ [\c!vorige\c!nummer=\v!ja]}}%
+
+\def\previoussection#1%
+ {\getvalue{\??se#1\c!voor}}
+
+\def\nextsection#1%
+ {\getvalue{\??se#1\c!na}}
+
+\def\@@setsectionnumber#1#2%
+ {\setgvalue{\??se#1\s!start}{}% % signal i.p.v. boolean
+ \setcounter{\??se#1}{#2}%
+ \resetsectioncounters[#1]%
+ \checkpagecounter}
+
+\def\@@nextsectionnumber#1%
+ {\setgvalue{\??se#1\s!start}{}% % signal i.p.v. boolean
+ \pluscounter{\??se#1}%
+ \resetsectioncounters[#1]%
+ \checkpagecounter}
+
+\def\@@sectionvalue#1% % nog niet overal doorgevoerd
+ {\countervalue{\??se#1}} % zoeken op \??se
+
+\def\@@sectionconversion#1%
+ {\getvalue{\??cv\getvalue{\??se#1\@@sectieblok\c!conversie}}}
+
+% Omdat een markering kan worden herdefinieerd moeten we
+% eerst testen of er wel een keten||afhankelijkheid is.
+
+\def\resetsectionmarks[#1]%
+ {\ExpandFirstAfter\doifdefinedelse{\??se#1}
+ {\def\donexttrackcommando##1%
+ {\def\docommando####1%
+ {\ExpandFirstAfter\resetmarkering[####1]}%
+ \processcommacommand[\getvalue{\??se##1\c!markering}]\docommando
+ \donexttracklevel{##1}}%
+ \donexttracklevel{#1}}%
+ {\ExpandFirstAfter\resetmarkering[\hoofdmarkering{#1}]}}
+
+\def\resetsectioncounters[#1]%
+ {\def\donexttrackcommando##1%
+ {\resetcounter{\??se##1}%
+ \donexttracklevel{##1}}%
+ \donexttracklevel{#1}}
+
+% bij checken kan geen prefix worden bekeken, anders vallen
+% er titels buiten de inhoudsopgave
+
+\def\makesectionformat%
+ {\@EA\edef\@EA\sectionformat\@EA%
+ {\@@sectiontype:\getvalue{\lastsection\s!format}}}
+
+\def\dobacktracklevel#1%
+ {\doifnot{\previoussection{#1}}{\zerosection}
+ {\dobacktrackcommando{\previoussection{#1}}}}
+
+\def\donexttracklevel#1%
+ {\doifnot{#1}{\lastsection}
+ {\donexttrackcommando{\nextsection{#1}}}}
+
+\newif\ifalllevels
+
+\def\dosetlevel#1%
+ {\bgroup
+ \doifelse{#1}{\v!vorige}
+ {\global\alllevelstrue
+ \xdef\currentlevel{}%
+ \def\dobacktrackcommando##1%
+ {\ifnum\countervalue{\??se##1}>0
+ \global\alllevelsfalse
+ \xdef\currentlevel{\getvalue{\previoussection{##1}\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi}%
+ \dobacktrackcommando\lastsection}%
+ {\doifelse{\getvalue{\??by#1}}{\v!tekst}
+ {\global\alllevelstrue
+ \xdef\currentlevel{}}
+ {\doifdefinedelse{\??ko#1\c!sectie} % beter alteratief: ook
+ {\edef\@@sectie{\getvalue{\??ko#1\c!sectie}}} % hoofdstuk\c!format
+ {\edef\@@sectie{#1}}%
+ \doifdefinedelse{\??se\@@sectie}
+ {\global\alllevelsfalse
+ \xdef\currentlevel{\getvalue{\@@sectie\s!format}}}
+ {\global\alllevelstrue
+ \xdef\currentlevel{}%
+ \def\dobacktrackcommando##1%
+ {\@EA\ifx\csname\??se##1\c!start\endcsname\relax
+ \dobacktracklevel{##1}%
+ \else
+ \ifnum\countervalue{\??se##1}>0
+ \global\alllevelsfalse
+ \xdef\currentlevel{\getvalue{##1\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi
+ \fi}%
+ \dobacktrackcommando\lastsection}}}%
+ \egroup}
+
+\def\doifnextlevelelse[#1::#2]#3#4%
+ {\ifalllevels
+ #3%
+ \else
+ \doifelse{\@@sectiontype}{#1} % \@EA kunnen denk ik weg
+ {\@EA\doifinstringelse\@EA{\@EA=\currentlevel:}{=:#2:}
+ {\@EA\doifinstringelse\@EA{\@EA=\currentlevel:0}{=:#2:}{#4}{#3}}
+ {#4}}
+ {#4}%
+ \fi}
+
+\def\doifprevlevelelse[#1::#2]#3#4%
+ {\ifalllevels
+ #3%
+ \else
+ \doifelse{\@@sectiontype}{#1}
+ {\@EA\doifinstringelse\@EA{\@EA=\currentlevel:}{=:#2:}
+ {#3}
+ {#4}}
+ {#4}%
+ \fi}
+
+\def\dosettoclevel{\dosetlevel}
+\def\dosetreglevel{\dosetlevel}
+\def\dosetblklevel{\dosetlevel}
+
+\def\doiftoclevelelse{\doifnextlevelelse}
+\def\doifreglevelelse{\doifprevlevelelse}
+\def\doifblklevelelse{\doifprevlevelelse}
+
+\def\@@longformatnumber#1%
+ {\getvalue{\previoussection{#1}\s!format}:\@@shortsectionnumber{#1}}
+
+\def\@@longsectionnumber#1%
+ {\ifnum\countervalue{\??se\previoussection{#1}}>0
+ \getvalue{\previoussection{#1}\c!nummer}\@@koscheider
+ \fi
+ \@@shortsectionnumber{#1}}
+
+\def\@@shortsectionnumber#1%
+ {\@EA\ifx\csname\??se#1\@@sectieblok\c!conversie\endcsname\relax
+ \@@sectionvalue{#1}%
+ \else
+ \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+ \fi}
+
+\def\dodosetlocalsectieblok[#1#2][#3]%
+ {\def\@@sectiontype{#1}%
+ \def\@@sectieblok{#1#2}%
+ \def\@@sectieblokken{#3}}
+
+\def\dosetlocalsectieblok#1#2%
+ {\@EA\dodosetlocalsectieblok\@EA[#1][#2]}
+
+\def\doaroundsectieblok#1%
+ {\doifvaluesomething{\??sb#1\c!pagina}
+ {\ExpandFirstAfter\pagina[\getvalue{\??sb#1\c!pagina}]}%
+ \resetsectioncounters[\firstsection]%
+ \resetsectionmarks[\firstsection]}
+
+\def\dostartsectieblok#1#2%
+ {\begingroup
+ \doaroundsectieblok{#1}%
+ \dosetlocalsectieblok{#1}{#2}%
+ \expandafter\csname#2true\endcsname
+\getvalue{\??sb\@@sectieblok\c!voor}% don't move
+ \showmessage{\m!structures}{1}{\@@sectieblokken}}
+
+\def\dostopsectieblok%
+ {\showmessage{\m!structures}{2}{\@@sectieblokken}%
+\getvalue{\??sb\@@sectieblok\c!na}% don't move
+ \doaroundsectieblok{\@@sectieblok}%
+ \endgroup}
+
+\def\dostelsectieblokin[#1][#2]%
+ {\getparameters[\??sb#1][#2]}
+
+\def\stelsectieblokin%
+ {\dodoubleargument\dostelsectieblokin}
+
+\def\dodefinieersectieblok[#1][#2][#3]%
+ {\getparameters
+ [\??sb#1]
+ [\c!nummer=\v!ja,
+ \c!pagina=\v!rechts, % anders worden marks te vroeg gereset !
+ %\c!voor=,
+ %\c!na=,
+ #3]%
+ \expandafter\newif\csname if#2\endcsname
+ \setvalue{\??sb#1}%
+ {\dosetlocalsectieblok{#1}{#2}}%
+ \setvalue{\e!start#2}%
+ {\dostartsectieblok{#1}{#2}}%
+ \setvalue{\e!stop#2}%
+ {\dostopsectieblok}}
+
+\def\definieersectieblok%
+ {\dotripleargument\dodefinieersectieblok}
+
+\def\sectiebloklabel#1%
+ {\@EA\ifx\csname#1\@@sectieblok\c!label\endcsname\relax
+ \else
+ \labeltext{\getvalue{#1\@@sectieblok\c!label}}%
+ \fi}
+
+% BETER:
+
+\def\sectiebloklabel#1%
+ {\@EA\ifx\csname\??ko#1\@@sectieblok\c!label\endcsname\relax
+ \labeltext{#1}%
+ \else
+ \labeltext{\getvalue{\??ko#1\@@sectieblok\c!label}}%
+ \fi}
+
+\dosetlocalsectieblok{\v!hoofdtekst}{\v!hoofdteksten}
+
+\def\setsectiontype[#1]%
+ {\getvalue{\??sb#1}}
+
+\def\writesection#1#2#3%
+ {\bgroup
+ \convertargument#3\to\ascii
+ \edef\!!stringa{#1}%
+ \@EA\writestatus\@EA
+ {\!!stringa}
+ {\ifsectienummer#2\else(#2)\fi\normalspace\ascii}%
+ \egroup}
+
+\def\@@koniveau{1} \def\kopniveau{\@@koniveau}
+
+% \def\dohandelpaginaafA#1%
+% {\ifnum\lastpenalty>0
+% \global\paginageblokkeerdtrue
+% \fi
+% \witruimte
+% \flushsidefloats
+% \getvalue{\??ko#1\c!voor}%
+% \ifpaginageblokkeerd
+% \global\paginageblokkeerdfalse
+% \else
+% \!!countb=\getvalue{\??se\@@sectie\c!niveau}\relax
+% \ifnum\!!countb>\@@koniveau\relax
+% \!!counta=20000
+% \multiply\!!countb by 500
+% \advance\!!counta by \!!countb
+% \dosomebreak{\penalty\!!counta}%
+% \else
+% \dosomebreak{\allowbreak}%
+% \fi
+% \fi
+% \xdef\@@koniveau{\getvalue{\??se\@@sectie\c!niveau}}}
+%
+% \def\dohandelpaginaafB#1%
+% {\doifinset{\getvalue{\??ko#1\c!pagina}}{\v!ja,\v!rechts,\v!links}
+% {\def\resetcurrentsectionmarks% toegevoegd, zie \pagina
+% {\resetsectionmarks[\previoussection{\@@sectie}]}%
+% \pagina[\getvalue{\??ko#1\c!pagina}]%
+% \doifinset{\getvalue{\??tk\v!hoofd\v!tekst\c!status}}{\v!normaal,\v!start}
+% {\doifvaluesomething{\??ko#1\c!hoofd}
+% {\stelhoofdin[\c!status=\getvalue{\??ko#1\c!hoofd}]}}}}
+%
+% \def\handelpaginaaf#1%
+% {\dohandelpaginaafA{#1}%
+% \ifnum\countervalue{\??se\previoussection{\@@sectie}}>0
+% \ifnum\countervalue{\??se\@@sectie}>0
+% \dohandelpaginaafB{#1}%
+% \else
+% \doifnotvalue{\??ko#1\c!doorgaan}{\v!ja}
+% {\dohandelpaginaafB{#1}}%
+% \fi
+% \else
+% \dohandelpaginaafB{#1}%
+% \fi}
+
+\def\dohandelpaginaafAA#1%
+ {\ifnum\lastpenalty>0
+ \global\paginageblokkeerdtrue
+ \fi}
+
+\def\dohandelpaginaafAB#1%
+ {\flushsidefloats
+ \getvalue{\??ko#1\c!voor}%
+ %\witruimte vervangen door \noindent elders
+ \relax
+ \ifpaginageblokkeerd
+ \global\paginageblokkeerdfalse
+ \else
+ \!!countb=\getvalue{\??se\@@sectie\c!niveau}\relax
+ \ifnum\!!countb>\@@koniveau\relax
+ \!!counta=20000
+ \multiply\!!countb by 500
+ \advance\!!counta by \!!countb
+ \dosomebreak{\penalty\!!counta}%
+ \else
+ \dosomebreak{\allowbreak}%
+ \fi
+ \fi
+ \xdef\@@koniveau{\getvalue{\??se\@@sectie\c!niveau}}}
+
+\def\dohandelpaginaafB#1%
+ {\doifinset{\getvalue{\??ko#1\c!pagina}}{\v!ja,\v!rechts,\v!links}
+ {\def\resetcurrentsectionmarks% toegevoegd, zie \pagina
+ {\resetsectionmarks[\previoussection{\@@sectie}]}%
+ \pagina[\getvalue{\??ko#1\c!pagina}]%
+ \doifinset{\getvalue{\??tk\v!hoofd\v!tekst\c!status}}{\v!normaal,\v!start}
+ {\doifvaluesomething{\??ko#1\c!hoofd}
+ {\stelhoofdin[\c!status=\getvalue{\??ko#1\c!hoofd}]}}}}
+
+\def\handelpaginaaf#1%
+ {\dohandelpaginaafAA{#1}%
+ \ifnum\countervalue{\??se\previoussection{\@@sectie}}>0
+ \ifnum\countervalue{\??se\@@sectie}>0
+ \dohandelpaginaafB{#1}%
+ \else
+ \doifnotvalue{\??ko#1\c!doorgaan}{\v!ja}
+ {\dohandelpaginaafB{#1}}%
+ \fi
+ \else
+ \dohandelpaginaafB{#1}%
+ \fi
+ \dohandelpaginaafAB{#1}}
+
+%
+
+\def\dolocalkopsetup#1% koppeling met standaard kopcommando / engels
+ {\forgetall
+ \ExpandFirstAfter\steluitlijnenin[\getvalue{\??ko#1\c!uitlijnen}]%
+ \def\\{\crlf\strut}}
+
+\newif\ifplaatskop
+\newif\ifverhoognummer
+\newif\ifkopnummer
+
+\def\setsectieenkoppeling#1%
+ {\edef\@@koppeling{\getvalue{\??ko#1\c!koppeling}}%
+ \edef\@@sectie{\getvalue{\??ko#1\c!sectie}}%
+ \doifnothing{\@@koppeling}
+ {\edef\@@koppeling{#1}}%
+ \doifnothing{\@@sectie}
+ {\edef\@@sectie{\getvalue{\??ko\@@koppeling\c!sectie}}}}
+
+\newif\ifkopprefix
+
+% \handelpaginaaf komt het eerst omdat eventueel
+% subpaginanummers moeten worden afgehandeld. Vervolgens
+% worden de nummers opgehoogd en referenties geset, dan
+% volgt de kop en tot slot de worden de marks en de prefix
+% geset.
+
+% \hoofdstuk {tekst}
+% \hoofdstuk tekst
+% \hoofdstuk <niets>
+
+\def\dosomekop#1[#2]#3%
+ {\doifelsevalue{\??ko#1\c!eigennummer}{\v!ja}
+ {\def\next{\doquadruplegroupempty\dodosomekop{#1}{#2}{#3}}}
+ {\def\next{\fourthargumentfalse\dodosomekop{#1}{#2}{#3}{}}}%
+ \next}
+
+\def\dodosomekop#1#2#3#4%
+ {\iffourthargument
+ \def\next%
+ {\dododosomekop{#1}[#2]{\sectiebloklabel{#1}}{#3}{#4}}%
+ \else
+ \def\next%
+ {\dododosomekop{#1}[#2]{\sectiebloklabel{#1}}{\getvalue{\@@sectie\c!nummer}}{#3}}%
+ \fi
+ \next}
+
+\def\dododosomekop#1[#2]#3#4#5% % pas met \ExpandFirstAfter op bij twee||taligheid
+ {\flushingcolumnfloatsfalse
+ \setsectieenkoppeling{#1}%
+ \doifelsevalue{\??ko#1\c!prefix}{}
+ {\kopprefixfalse}
+ {\kopprefixtrue}%
+ \doifelsevalue{\??ko#1\c!plaatskop}{\v!ja}
+ {\plaatskoptrue}
+ {\plaatskopfalse}%
+ \doifelsevalue{\??ko#1\c!verhoognummer}{\v!ja}
+ {\verhoognummertrue}
+ {\verhoognummerfalse}%
+ \edef\numberheaddistance {\getvalue{\??ko#1\c!afstand}}%
+ \edef\numberheadalternative{\getvalue{\??ko#1\c!variant}}%
+ \dostelkopvariantin[\numberheadalternative]%
+ \ifsectienummer
+ \doifelsevalue{\??sb\@@sectieblok\c!nummer}{\v!ja}
+ {\doifelsevalue{\??ko#1\c!nummer}{\v!ja}
+ {\kopnummertrue}
+ {\kopnummerfalse}}
+ {\kopnummerfalse}%
+ \else
+ \kopnummerfalse
+ \fi
+ \ifverhoognummer
+ \ifplaatskop
+ \handelpaginaaf{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \ifkopprefix
+ \setupreferencing[\c!prefix=-]%
+ \fi
+ \getvalue{\e!volgende\@@sectie}%
+ \getvalue{\??ko#1\c!tussen}%
+ \ifkopnummer
+ \noindent % ipv \witruimte elders
+ \doplaatskopnummertekst
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \ExpandFirstAfter\soortpagina[\@@koppeling]%
+ \rawreference{\s!sec}{#2}{#4}%
+ \resetsectionmarks[\@@sectie]%
+ \doschrijfnaarlijst{\@@koppeling}{#4}{#5}{\v!kop}}
+ {#3#4}
+ {#5}
+ {\markeer[#1]{#5}% }%
+ \bepaalkopnummer[#1]%
+ \expanded{\markeer[#1\v!nummer]{\getvalue{\@@sectie\c!nummer}}}}%
+ \writesection{#1}{#4}{#5}%
+ \else
+ \noindent % ipv \witruimte elders
+ \doplaatskoptekst
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \ExpandFirstAfter\soortpagina[\@@koppeling]%
+ \rawpagereference{\s!sec}{#2}%
+ \resetsectionmarks[\@@sectie]%
+ \doschrijfnaarlijst{\@@koppeling}{}{#5}{\v!kop}}
+ {#5}
+ {\markeer[#1]{#5}% }%
+ \bepaalkopnummer[#1]%
+ \expanded{\markeer[#1\v!nummer]{\getvalue{\@@sectie\c!nummer}}}}%
+ \writesection{#1}{-}{#5}%
+ \fi
+ \ifkopprefix
+ \ExpandFirstAfter\setupreferencing[\c!prefix=\getvalue{\??ko#1\c!prefix}]%
+ \fi
+ \dosomebreak\nobreak
+ \ifdisplaysectionhead\getvalue{\??ko#1\c!na}\fi
+ \else
+ \dohandelpaginaafB{#1}% toegevoegd ivm subpaginanr / tug sheets
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \ifkopprefix
+ \setupreferencing[\c!prefix=-]%
+ \fi
+ \getvalue{\e!volgende\@@sectie}%
+ \getvalue{\??ko#1\c!tussen}%
+ \setsectionlistreference{\@@sectie}{#1}%
+ \resetsectionmarks[\@@sectie]%
+ \markeer[#1]{#5}%
+ \bepaalkopnummer[#1]%
+ \expanded{\markeer[#1\v!nummer]{\getvalue{\@@sectie\c!nummer}}}%
+ \ExpandFirstAfter\soortpagina[\@@koppeling]%
+ \ifkopnummer
+ \rawreference{\s!sec}{#2}{#4}%
+ \doschrijfnaarlijst{\@@koppeling}{#4}{#5}{\v!kop}%
+ \writesection{#1}{#4}{#5}%
+ \else
+ \rawpagereference{\s!sec}{#2}%
+ \doschrijfnaarlijst{\@@koppeling}{}{#5}{\v!kop}%
+ \writesection{#1}{-}{#5}%
+ \fi
+ \ifkopprefix
+ \ExpandFirstAfter\setupreferencing[\c!prefix=\getvalue{\??ko#1\c!prefix}]%
+ \fi
+ \fi
+ \else
+ \ifplaatskop
+ \handelpaginaaf{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \getvalue{\??ko#1\c!tussen}%
+ \noindent % ipv \witruimte elders
+ \doplaatskoptekst
+ {#1}
+ {\rawpagereference{\s!sec}{#2}}
+ {#5}
+ {}%
+ \writesection{#1}{-}{#5}%
+ \dosomebreak\nobreak
+ \ifdisplaysectionhead\getvalue{\??ko#1\c!na}\fi
+ \else
+ % do nothing
+ \fi
+ \fi
+ \flushingcolumnfloatstrue
+ \ifdisplaysectionhead\else\expandafter\GotoPar\fi}
+
+% \prevdepth\dp\strutbox is belangrijk, vergelijk naast elkaar:
+%
+% \onderwerp{test} \input tufte
+% \onderwerp{test} \strut \input tufte
+% \onderwerp{test} \plaatslijst[...]
+
+\def\doplaatskoptekst#1#2#3#4%
+ {\bgroup
+ \forgetall
+ %\showcomposition
+ \mindermeldingen
+ \postponefootnotes
+ \def\localkopsetup%
+ {\dolocalkopsetup{#1}}%
+ \startsynchronisatie
+ \ifdisplaysectionhead\@EA\snaptogrid\@EA\hbox\fi
+ {\getvalue{\??ko#1\c!commando}
+ {} % no number
+ {\doattributes{\??ko#1}{\doattributes{\??ko#1\c!tekst}
+ {\dontconvertfont
+ \stelinterliniein
+ #2%
+ \getvalue{\??ko#1\c!voorcommando}%
+ \getvalue{\??ko#1\c!tekstcommando}{\setstrut\begstrut#3\endstrut}%
+ \getvalue{\??ko#1\c!nacommando}%
+ \ifdisplaysectionhead\endgraf\fi}}}}%
+ \ifdisplaysectionhead
+ \endgraf
+ \nointerlineskip
+ \dosomebreak\nobreak
+ \fi
+ #4%
+ \ifdisplaysectionhead
+ \prevdepth\openstrutdepth % \dp\strutbox % ivm grid
+ \fi
+ \stopsynchronisatie
+ \egroup
+ \doifvalue{\??ko#1\c!springvolgendein}{\v!nee}{\noindentation}}
+
+\def\doplaatskopnummertekst#1#2#3#4#5%
+ {\bgroup
+ \forgetall
+ %\showcomposition
+ \mindermeldingen
+ \postponefootnotes
+ \def\localkopsetup%
+ {\dolocalkopsetup{#1}}%
+ \startsynchronisatie
+ \ifdisplaysectionhead\@EA\snaptogrid\@EA\hbox\fi
+ {\getvalue{\??ko#1\c!commando}%
+ {\doattributes{\??ko#1}{\doattributes{\??ko#1\c!nummer}
+ {\getvalue{\??ko#1\c!voorcommando}%
+ \getvalue{\??ko#1\c!nummercommando}{\setstrut\begstrut#3\endstrut}}}}
+ {\doattributes{\??ko#1}{\doattributes{\??ko#1\c!tekst}
+ {\dontconvertfont
+ \stelinterliniein
+ #2%
+ \getvalue{\??ko#1\c!tekstcommando}{\setstrut\begstrut#4\endstrut}%
+ \getvalue{\??ko#1\c!nacommando}%
+ \ifdisplaysectionhead\endgraf\fi}}}}%
+ \ifdisplaysectionhead
+ \endgraf
+ \nointerlineskip
+ \dosomebreak\nobreak
+ \fi
+ #5%
+ \ifdisplaysectionhead
+ \prevdepth\openstrutdepth % \dp\strutbox % important, see comment
+ \fi
+ \stopsynchronisatie
+ \egroup
+ \doifvalue{\??ko#1\c!springvolgendein}{\v!nee}{\noindentation}}
+
+\def\dostelkopnummerin[#1][#2#3]%
+ {\bgroup
+ \setsectieenkoppeling{#1}%
+ \doifinstringelse{#2}{+-}
+ {\doifelse{#3}{}
+ {\@@nextsectionnumber{\@@sectie}}
+ {\!!counta=#2#3\relax
+ \advance\!!counta by \@@sectionvalue{\@@sectie}%
+ \@@setsectionnumber{\@@sectie}{\!!counta}}}
+ {\@@setsectionnumber{\@@sectie}{#2#3}}%
+ \egroup}
+
+\def\stelkopnummerin%
+ {\dodoubleargument\dostelkopnummerin}
+
+% \def\dokopnummer[#1]%
+% {\bgroup
+% \setsectieenkoppeling{#1}%
+% \doifnot{\getvalue{\@@sectie\c!nummer}}{0} % kan effienter
+% {\getvalue{\@@sectie\c!nummer}}%
+% \egroup}
+%
+% beter :
+
+\def\huidigekopnummer{0}
+
+\def\bepaalkopnummer[#1]%
+ {\bgroup
+ \setsectieenkoppeling{#1}%
+ \xdef\huidigekopnummer{\@@sectionvalue{\@@sectie}}%
+ \egroup}
+
+\def\dokopnummer[#1]%
+ {\bgroup
+ \setsectieenkoppeling{#1}%
+ \xdef\huidigekopnummer{\@@sectionvalue{\@@sectie}}%
+ \doifnot{\huidigekopnummer}{0}
+ {\getvalue{\@@sectie\c!nummer}}%
+ \egroup}
+
+\def\kopnummer%
+ {\dosingleargument\dokopnummer}
+
+\def\alinea%
+ {\par}
+
+\def\plaatskopnormaal#1#2%
+ {\doifelsenothing{#1}
+ {\vbox
+ {\localkopsetup
+ \noindent
+ #2}}%
+ {\setbox0=\hbox{{#1}\hskip\numberheaddistance}%
+ \vbox
+ {\localkopsetup
+ \hangindent 1\wd0
+ \hangafter 1
+ \noindent
+ \unhbox0 % don't use \strut's here!
+ #2}}}
+
+\def\plaatskopinmarge#1#2%
+ {\vbox
+ {\localkopsetup
+ \begstrut % but use one \strut here!
+ \doifsomething{#1}
+ {\llap{\hbox to 5em{\hfill{#1}\hskip\linkermargeafstand}}}%
+ {#2}}}
+
+\def\plaatskopmidden#1#2%
+ {\vbox
+ {\localkopsetup
+ \raggedcenter
+ \doifsomething{#1}{\strut#1\par}\begstrut#2}}
+
+\def\plaatskopunknown#1#2%
+ {}
+
+\def\plaatskopintekst#1#2%
+ {\bgroup
+ \localkopsetup
+ \doifsomething{#1}{{#1}\hskip\numberheaddistance}%
+ {\begstrut#2}%
+ \hskip\numberheaddistance
+ \egroup}
+
+% default == instellingen
+% koppeling == koppen, breaks, marks, enz.
+% sectie == nummering
+
+\let\@@kolijst=\empty
+
+\def\dodefinieerkop[#1][#2]% % don't preset prefix to much
+ {\presetlabeltext[#1=]%
+ \getparameters
+ [\??ko#1]
+ [\c!nummerletter=\getvalue{\??ko#1\c!letter},
+ \c!tekstletter=\getvalue{\??ko#1\c!letter},
+ \c!nummerkleur=\getvalue{\??ko#1\c!kleur},
+ \c!tekstkleur=\getvalue{\??ko#1\c!kleur}]%
+ \ConvertToConstant\doifinstringelse{=}{#2}
+ {\getparameters
+ [\??ko#1]
+ [\c!sectie=\getvalue{\??ko\getvalue{\??ko#1\c!koppeling}\c!sectie},
+ \c!default=,
+ \c!koppeling=,
+ \c!prefix=,
+ \c!voor=,
+ \c!na=,
+ \c!afstand=,
+ \c!pagina=,
+ \c!hoofd=,
+ \c!letter=,
+ \c!nummercommando=,
+ \c!tekstcommando=,
+ \c!eigennummer=\v!nee,
+ \c!nummer=\v!ja,
+ \c!kleur=,
+ \c!springvolgendein=\v!nee,
+ \c!doorgaan=\v!ja,
+ \c!plaatskop=\v!ja,
+ \c!verhoognummer=\v!ja,
+ \c!variant=\@@kovariant,
+ \c!commando=\@@plaatskop,
+ #2]%
+ \ConvertToConstant\doifnot{#1}{\getvalue{\??ko#1\c!default}}
+ {\doifsomething{\getvalue{\??ko#1\c!default}}
+ {%\presetlabeltext[#1=\labeltext{\getvalue{\??ko#1\c!default}}]%
+ \copyparameters
+ [\??ko#1][\??ko\getvalue{\??ko#1\c!default}]
+ [\c!voor,\c!na,\c!commando,\c!pagina,\c!doorgaan,\c!hoofd,
+ \c!nummer,\c!eigennummer,\c!plaatskop,\c!verhoognummer,
+ \c!letter,\c!kleur,\c!afstand,\c!variant,\c!springvolgendein,
+ %\c!nummerletter,\c!tekstletter,
+ \c!nummercommando,\c!tekstcommando]}}%
+ \getparameters[\??ko#1][#2]%
+ \doifsomething{\getvalue{\??ko#1\c!sectie}}
+ {\doifundefined{\??mk#1}
+ {\definieermarkering[#1]%
+ \koppelmarkering[#1][\getvalue{\??ko#1\c!sectie}]%
+ \definieermarkering[#1\v!nummer]%
+ \koppelmarkering[#1\v!nummer][\getvalue{\??ko#1\c!sectie}\v!nummer]}}%
+ \doifundefined{\??li#1}{\definieerlijst[#1]}}
+ {\ConvertToConstant\doifelse{#1}{#2}
+ {\doifundefined{\??li#1}{\definieerlijst[#1]}}
+ {%\presetlabeltext[#1=\labeltext{#2}]%
+ \copyparameters
+ [\??ko#1][\??ko#2]
+ [\c!niveau,\c!sectie,\c!koppeling,\c!prefix,
+ \c!voor,\c!na,\c!commando,\c!pagina,\c!doorgaan,\c!hoofd,
+ \c!nummer,\c!eigennummer,\c!plaatskop,\c!verhoognummer,
+ \c!letter,\c!kleur,\c!afstand,\c!variant,\c!springvolgendein,
+ %\c!nummerletter,\c!tekstletter,
+ \c!nummercommando,\c!tekstcommando]%
+ \definieermarkering[#1][#2]%
+ \definieermarkering[#1\v!nummer][#2\v!nummer]%
+ \doifundefined{\??li#1}{\definieerlijst[#1][#2]}}}%
+ \addtocommalist{#1}\@@kolijst
+ \setevalue{\??sk#1}%
+ {\getvalue{\??ko#1\c!koppeling}}%
+ \setevalue{\??by#1}%
+ {\getvalue{\??ko#1\c!sectie}}%
+ \setevalue{\??by\v!per#1}%
+ {\getvalue{\??ko#1\c!sectie}}%
+ \setvalue{#1}%
+ {\complexorsimpleempty{#1}}%
+ \setvalue{\s!complex#1}[##1]%
+ {\dowithpargument{\dosomekop{#1}[##1]}}}
+
+\def\definieerkop%
+ {\dodoubleemptywithset\dodefinieerkop}
+
+\def\dostelkopin[#1][#2]%
+ {\getparameters[\??ko#1][#2]%
+ % The next check prevents hard to trace problems. I once
+ % set \c!commando to nothing and (quite natural) got the
+ % wrong references etc. The whole bunch should be boxed!
+ \expandafter\convertcommand\csname\??ko#1\c!commando\endcsname\to\ascii
+ \doifnothing{\ascii}
+ {\setvalue{\??ko#1\c!commando}{\@@plaatskop}}}
+
+\def\stelkopin%
+ {\dodoubleargumentwithset\dostelkopin}
+
+\newif\ifsectienummer \sectienummertrue
+\newif\ifdisplaysectionhead \displaysectionheadtrue
+
+\def\dostelkopvariantin[#1]%
+ {\displaysectionheadtrue
+ \processaction
+ [#1]
+ [ \v!normaal=>\def\@@plaatskop{\plaatskopnormaal},
+ \v!midden=>\def\@@plaatskop{\plaatskopmidden},
+ \v!marge=>\def\@@plaatskop{\plaatskopinmarge},
+ \v!inmarge=>\def\@@plaatskop{\plaatskopinmarge},
+ \v!tekst=>\def\@@plaatskop{\plaatskopintekst}\displaysectionheadfalse,
+ \v!unknown=>\def\@@plaatskop{\plaatskopunknown}]}
+
+\def\dostelkoppenin[#1]%
+ {\getparameters[\??ko][#1]%
+ \doifelse{\@@kosectienummer}{\v!ja}
+ {\sectienummertrue}
+ {\sectienummerfalse}%
+ \dostelkopvariantin[\@@kovariant]}
+
+\def\stelkoppenin%
+ {\dosingleargument\dostelkoppenin}
+
+\def\systemsuppliedchapter {\getvalue{\v!hoofdstuk}}
+\def\systemsuppliedtitle {\getvalue{\v!titel}}
+
+\def\complexbijlage[#1]#2%
+ {\pagina[\v!rechts]
+ \stelnummeringin[\c!status=\v!stop]
+ \systemsuppliedchapter[#1]{#2}
+ \pagina[\v!rechts]
+ \stelnummeringin[\c!status=\v!start]
+ \stelpaginanummerin[\c!nummer=1]}
+
+\setvalue{\v!bijlage}%
+ {\complexorsimpleempty{bijlage}}
+
+%I n=Selecteren
+%I c=\soortpagina,\verwerkpagina,\koppelpagina
+%I
+%I Het is mogelijk pagina's te markeren en selectief te
+%I verwerken. Markering vindt plaats met het commando:
+%I
+%I \soortpagina[aanduiding]
+%I
+%I en selecteren vindt plaats met:
+%I
+%I \verwerkpagina[aanduiding,...][instelling]
+%I
+%I waarbij de instelling 'ja' of 'nee' is en meerdere
+%I aanduidingen worden gescheiden door een comma.
+%P
+%I Er kunnen commando's worden gekoppeld aan pagina's:
+%I
+%I \koppelpagina[aanduiding,...][voor=,na=,optie=]
+%I
+%I De opgegeven commando's worden voor respectievelijk na het
+%I vrijgeven van de pagina uitgevoerd.
+
+% hier nog uti blokkeren
+
+\newif\ifgeselecteerd
+\geselecteerdtrue
+
+\newif\ifselecteren
+\selecterenfalse
+
+\newif\ifverwerken
+\verwerkentrue
+
+\def\selectie{}
+\def\paginasoort{}
+
+\let\naastpagina=\relax
+\let\napagina=\relax
+\let\voorpagina=\relax
+
+\def\dovoorpagina%
+ {\doifsomething{\paginasoort}
+ {\def\dododopagina##1%
+ {\global\let\voorpagina=\relax
+ \getvalue{\??pg##1\c!voor}}%
+ \processcommacommand[\paginasoort]\dododopagina}}
+
+\def\dododonapagina#1%
+ {\global\let\napagina=\relax
+ \gdef\paginasoort{}%
+ \getvalue{\??pg#1\c!na}}
+
+\def\donapagina%
+ {\doifsomething{\paginasoort}
+ {\def\dodopagina##1%
+ {\doifelsevalue{\??pg##1\c!optie}{\v!dubbelzijdig}
+ {\doifbothsidesoverruled
+ \dododonapagina{##1}%
+ \orsideone
+ \dododonapagina{##1}%
+ \orsidetwo
+ \od}%
+ {\dododonapagina{##1}}}%
+ \processcommacommand[\paginasoort]\dodopagina}}
+
+\def\dosoortpagina[#1]%
+ {\doglobal\addtocommalist{#1}{\paginasoort}%
+ \ifselecteren
+ \ExpandBothAfter\doifcommon{#1}{\selectie}
+ {\global\geselecteerdtrue}%
+ \fi
+ \gdef\voorpagina{\dovoorpagina}%
+ \gdef\napagina{\donapagina}}
+
+\def\soortpagina%
+ {\dosingleargument\dosoortpagina}
+
+\def\dokoppelpagina[#1][#2]%
+ {\getparameters
+ [\??pg]
+ [\c!voor=,
+ \c!na=,
+ \c!optie=,
+ #2]%
+ \def\docommando##1%
+ {\getparameters
+ [\??pg##1]
+ [\c!voor=\@@pgvoor,
+ \c!na=\@@pgna,
+ \c!optie=\@@pgoptie]}%
+ \processcommalist[#1]\docommando}%
+
+\def\koppelpagina%
+ {\dodoubleargument\dokoppelpagina}
+
+\def\doverwerkpagina[#1][#2]%
+ {\processaction
+ [#2]
+ [ \v!ja=>\global\verwerkentrue,
+ \v!nee=>\global\verwerkenfalse]%
+ \gdef\selectie{#1}%
+ \global\selecterentrue
+ \global\geselecteerdfalse}
+
+\def\verwerkpagina%
+ {\dodoubleargument\doverwerkpagina}
+
+\def\resetselectiepagina%
+ {\ifselecteren
+ \doifbothsidesoverruled
+ \global\geselecteerdfalse
+ \orsideone
+ \orsidetwo
+ \global\geselecteerdfalse
+ \od
+ \fi}
+
+\newif\iflocation
+
+\def\ifinteractief{\iflocation}
+
+\def\previoussectionformat{}
+\def\currentsectionformat{}
+
+\let\updatelistreferences=\relax
+\def\updatedlistreferences{}
+
+\def\setsectionlistreference#1#2%
+ {\ifnum\countervalue{\??se\previoussection{#1}}>0\relax
+ \xdef\previoussectionformat{\@@longformatnumber{\previoussection{#1}}}%
+ \else
+ \xdef\previoussectionformat{}%
+ \fi
+ \xdef\currentsectionformat{\@@longformatnumber{#1}}}
+
+\def\startlistreferences#1%
+ {\thisissomeinternal{\s!lst}{#1\currentsectionformat}%
+ \setxvalue{\s!lst:#1\currentsectionformat}{\realfolio}%
+ \setxvalue{\v!vorige\v!lokale#1}{\s!lst:#1\previoussectionformat}%
+ \setxvalue{\v!huidige\v!lokale#1}{\s!lst:#1\currentsectionformat}%
+ \doifelse{\currentsectionformat}{}
+ {\setglobalcrossreference
+ {\v!vorige#1}{}{\realfolio}{}}
+ {\setglobalsystemreference\rt!list
+ {\v!vorige#1}{\getvalue{\v!vorige\v!lokale#1}}}%
+ \def\stoplistreferences{\dostoplistreferences}}
+
+\def\dostoplistreferences#1%
+ {\iflijstgeplaatst
+ \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal)
+ \global\let\updatedlistreferences=\updatedlistreferences % een noodverbandje
+ \gdef\updatelistreferences%
+ {\def\docommando####1%
+ {\setglobalsystemreference\rt!list
+ {\v!vorige####1}{\getvalue{\v!huidige\v!lokale####1}}}%
+ \processcommacommand[\updatedlistreferences]\docommando
+ \global\let\updatelistreferences=\relax
+ \global\let\updatedlistreferences=\empty}%
+ \fi}
+
+\def\stoplistreferences%
+ {\gobbleoneargument}
+
+% de rest
+
+\newcount\prefixteller
+
+\def\referenceprefix{}
+
+% \def\showlocation #1{#1}
+% \def\showcontrastlocation#1#2#3{#3}
+% \def\showcoloredlocation #1#2{#2}
+
+
+\def\referencepagenumber[#1]%
+ {\donottest % nodig i.v.m. scannen {tekst} bij [referentie] in \op
+ {\paginaprefix\??rf[#1]%
+ \translatednumber[#1]}}
+
+%I n=Regels
+%I c=\startregels,\stelregelsin
+%I c=\startregelnummeren,\stelregelnummerenin
+%I c=\crlf
+%I c=\startregel,\stopregel,\eenregel,\inregel
+%I
+%I Het is mogelijk de indeling in regels zoals die in de ruwe
+%I tekst wordt gehanteerd af te dwingen. Er wordt in dit
+%I geval niet ingesprongen. De regels worden gezet tussen de
+%I twee commando's:
+%I
+%I \startregels
+%I
+%I ...................................................
+%I
+%I \stopregels
+%P
+%I Er kan met betrekking tot regels een en ander worden
+%I ingesteld:
+%I
+%I \stelregelsin[voor=,na=,inspringen=]
+%I
+%I Aan 'inspringen' kan men 'ja', 'nee', 'even' of 'oneven'
+%I toekennen.
+%P
+%I Het is mogelijk regels te nummeren door ze tussen de
+%I volgende commando's te plaatsen:
+%I
+%I \startregelnummeren
+%I \stopregelnummeren
+%I
+%I Als de regelovergangen moeten worden gehandhaafd, dan moet
+%I \startregels voor \startregelnummeren worden gegeven.
+%I
+%I Het nummeren begint steeds opnieuw bij 1. Als verder moet
+%I worden genummeren, dan kan achter \startregelnummeren
+%I [verder] worden meegegeven.
+%I
+%I Standaard worden regels alinea-gewijs genummerd. Als men
+%I over een paginagrens wil nummeren, dan moet [opelkaar]
+%I worden meegegeven.
+%P
+%I De wijze van nummeren kan worden ingesteld met:
+%I
+%I \stelregelnummerenin[conversie=,start=,stap=,letter=,
+%I plaats=,breedte=,letter=]
+%I
+%I Als 'conversie' kan worden meegegeven: cijfers, letters,
+%I Letters, romeins of Romeins. Aan 'start' en 'stap' kan
+%I een getal worden toegekend, aan 'letter' een trefwoord,
+%I aan 'breedte' een maat (bij voorkeur in ex) en aan
+%I 'plaats' het trefwoord 'inmarge' of 'intekst'.
+%P
+%I Er kan worden overgegaan naar een nieuwe regel met:
+%I
+%I \crlf
+%P
+%I .... testfase ...
+%I
+%I \startregel[tag] ... \stopregel[tag]
+%I \eenregel[tag]
+%I
+%I \inregel[tag]
+
+\newif\ifinregels
+\newif\ifregelnummersinmarge
+
+\def\stelregelsin%
+ {\dodoubleargument\getparameters[\??rg]}
+
+\def\startregels%
+ {\@@rgvoor
+ \pagina[\v!voorkeur]%
+ \witruimte
+ \begingroup
+ \def\@@rgstepyes{\parindent\!!zeropoint}%
+ \def\@@rgstepno{\parindent\!!zeropoint}%
+ \edef\@@rgparindent{\the\parindent}%
+ \def\@@rglinesteptoggle{1}%
+ \processaction
+ [\@@rginspringen]
+ [ \v!ja=>\def\@@rgstepyes{\parindent\@@rgparindent}%
+ \def\@@rgstepno{\parindent\@@rgparindent},
+ \v!oneven=>\def\@@rgstepyes{\parindent\!!zeropoint}%
+ \def\@@rgstepno{\parindent\@@rgparindent},
+ \v!even=>\def\@@rgstepno{\parindent\!!zeropoint}%
+ \def\@@rgstepyes{\parindent\@@rgparindent}]%
+ \inregelstrue
+ \stelwitruimtein[\v!geen]%
+ \obeylines
+ \ignorespaces
+ \def\obeyedline%
+ {\par
+ \ifdim\lastskip>\!!zeropoint
+ \def\@@rglinesteptoggle{0}%
+ \else
+ \increment\@@rglinesteptoggle
+ \fi
+ \ifodd\@@rglinesteptoggle\relax
+ \@@rgstepyes
+ \else
+ \@@rgstepno
+ \fi}%
+ \GotoPar}
+
+\def\stopregels%
+ {\endgroup
+ \@@rgna}
+
+\newcount\linenumber
+\newcount\linestepper
+
+% het gebruik van \setlocalreference scheelt een hash entry
+
+\def\regelweergave%
+ {\convertnumber\@@rnconversie\linenumber}%
+
+\def\dostelregelnummerenin[#1]%
+ {\getparameters
+ [\??rn]
+ [\c!start=1,
+ \c!stap=1,
+ #1]%
+ \global\linenumber=1\relax}
+
+\def\stelregelnummerenin%
+ {\dosingleargument\dostelregelnummerenin}
+
+\def\dostartnummerenLINE% % !! \everypar !!
+ {\EveryPar{\schrijfregelnummer}}
+
+\def\dostopnummerenLINE%
+ {\egroup}
+
+\def\dodoschrijfregelnummer%
+ {\setbox0=\hbox{\regelweergave}%
+ \vsmashbox0
+ \ifregelnummersinmarge
+ \llap{\hbox{\box0\hskip\linkermargeafstand}}%
+ \else
+ \llap{\hbox to \@@rnbreedte{\box0\hss}}%
+ \fi}
+
+\def\complexstartregelnummeren[#1]%
+ {\doifnotinset{\v!verder}{#1}
+ {\global\linenumber=1\relax}%
+ \doifinsetelse{\@@rnplaats}{\v!inmarge,\v!marge}
+ {\regelnummersinmargetrue}
+ {\regelnummersinmargefalse}%
+ \ifregelnummersinmarge\else
+ \advance\leftskip by \@@rnbreedte\relax
+ \fi
+ \ifinregels
+ \let\dostartnummeren=\dostartnummerenLINE
+ \let\stopregelnummeren=\dostopnummerenLINE
+ \def\schrijfregelnummer%
+ {\doschrijfregelnummer
+ \global\advance\linenumber by 1\relax}%
+ \else
+ \let\dostartnummeren=\dostartnummerenPAR
+ \let\stopregelnummeren=\dostopnummerenPAR
+ \def\schrijfregelnummer%
+ {\global\advance\linenumber by -1\relax
+ \doschrijfregelnummer}%
+ \fi
+ \dostartnummeren}
+
+\def\startregelnummeren%
+ {\bgroup
+ \complexorsimpleempty{startregelnummeren}}
+
+\def\doschrijfregelnummer%
+ {\ifnum\linenumber<\@@rnstart\relax
+ \else
+ \!!counta=\linenumber
+ \divide\!!counta by \@@rnstap\relax
+ \multiply\!!counta by \@@rnstap\relax
+ \ifnum\!!counta=\linenumber
+ \doattributes{\??rn}{\dodoschrijfregelnummer}%
+ \fi
+ \fi}
+
+\def\regelreferentie#1[#2]%
+ {\bgroup
+ \dimen0=\dp\strutbox
+ \doif{\@@rnrefereren}{\v!aan}
+ {\doglobal\increment\linereference
+ \setxvalue{lrf:n:\linereference}{\@@rnprefix#2}%
+ \setxvalue{lrf:l:\linereference}{0}%
+ \setxvalue{lrf:p:\linereference}{#1}%
+ \advance\dimen0 by \linereference sp}%
+ \prewordbreak
+ \vrule \!!width \!!zeropoint \!!depth \dimen0
+ \prewordbreak
+ \egroup}
+
+\def\eenregel[#1]%
+ {\regelreferentie0[#1]\ignorespaces}
+
+\def\startregel[#1]%
+ {\regelreferentie1[#1]\ignorespaces}
+
+\def\stopregel[#1]%
+ {\unskip\regelreferentie2[#1]}
+
+\def\inregellabel#1%
+ {\doifinstringelse{--}{#1}
+ {\labeltext{\v!regels}}
+ {\labeltext{\v!regel}}}
+
+\def\inregel#1[#2]%
+ {\doifelsenothing{#1}
+ {\in{\inregellabel{\currenttextreference}}[\@@rnprefix#2]}
+ {\in{#1}[\@@rnprefix#2]}}
+
+\def\dostartnummerenPAR%
+ {\beginofshapebox
+ \doglobal\newcounter\linereference}
+
+% localcrossref heroverwegen
+
+\def\dostopnummerenPAR% dp's -> openstrutdepth
+ {\endofshapebox
+ \linestepper=0
+ \reshapebox{\global\advance\linestepper by 1\relax}%
+ \global\advance\linenumber by \linestepper
+ \doifelse{\@@rnrefereren}{\v!aan}
+ {\reshapebox % We are going back!
+ {\global\advance\linenumber by -1
+ \dimen0=\dp\shapebox
+ \advance\dimen0 by -\dp\strutbox
+ \ifdim\dimen0>\!!zeropoint\relax
+ \dostepwiserecurse{1}{\number\dimen0}{1}
+ {\setxvalue{lrf:l:\recurselevel}{\the\linenumber}}%
+ \fi}%
+ \global\advance\linenumber by \linestepper
+ \ifnum\linereference>0 % anders vreemde loop in paragraphs+recurse
+ \dorecurse{\linereference}
+ {\edef\linereferenceplus{\getvalue{lrf:p:\recurselevel}}%
+ \ifnum\linereferenceplus=2
+ \edef\linereferencename{\getvalue{lrf:n:\recurselevel}}%
+ \edef\linereferenceline{\getvalue{lrf:l:\recurselevel}}%
+ \setlocalcrossreference{\referenceprefix\linereferencename}{}{}{\linereferenceline}%
+ \fi}%
+ \dorecurse{\linereference}
+ {\edef\linereferenceplus{\getvalue{lrf:p:\recurselevel}}%
+ \ifnum\linereferenceplus<2
+ \edef\linereferencename{\getvalue{lrf:n:\recurselevel}}%
+ \edef\linereferenceline{\getvalue{lrf:l:\recurselevel}}%
+ \ifnum\linereferenceplus=1
+\getreferenceelements{\linereferencename}%
+ \ifnum\linereferenceline<0\currenttextreference\relax % 0 prevents error
+ \edef\linereferenceline{\linereferenceline--\currenttextreference}%
+ \fi
+ \fi
+\setlocalcrossreference{\referenceprefix\linereferencename}{}{}{\linereferenceline}%
+ \fi}%
+ \global\let\scratchline=\linenumber % We are going back!
+ \reshapebox
+ {\doglobal\decrement\scratchline
+ \hbox
+ {\dorecurse{\linereference}
+ {\edef\linereferencename{\getvalue{lrf:n:\recurselevel}}%
+\getreferenceelements{\linereferencename}%
+ \beforesplitstring\currenttextreference--\at--\to\firstline
+ \ifnum\firstline=\scratchline\relax
+ % beter een rawtextreference
+\textreference[\linereferencename]{\currenttextreference}%
+\setlocalcrossreference{\referenceprefix\linereferencename}{}{}{0}% ==done
+ \fi}%
+ \dimen0=\dp\shapebox
+ \advance\dimen0 by -\dp\strutbox
+ \ifdim\dimen0>\!!zeropoint\relax
+ \dp\shapebox=\dp\strutbox
+ \fi
+ \schrijfregelnummer\box\shapebox}}%
+ \else
+ \reshapebox{\hbox{\schrijfregelnummer\box\shapebox}}%
+ \fi}
+ {\reshapebox{\global\advance\linenumber by -1}%
+ \global\advance\linenumber by \linestepper
+ \reshapebox{\hbox{\schrijfregelnummer\box\shapebox}}}%
+ \global\advance\linenumber by \linestepper
+ \flushshapebox
+ \egroup}
+
+\def\crlf%
+ {\unskip\hfil\break}
+
+\def\opeenregel%
+ {\let\crlf=\relax
+ \let\\=\relax}
+
+%I n=Opmaak
+%I c=\definieeropmaak,\testopmaak,\startstandaardopmaak
+%I
+%I Het is mogelijk een lege pagina op te maken. Hiertoe wordt
+%I een blok gereserveerd met het commando:
+%I
+%I \definieeropmaak[naam][breedte=,hoogte=,voffset=,
+%I hoffset=,pagina=,commandos=,voor=,na=,dubbelzijdig=]
+%I
+%I Hierbij wordt bij de eerste vier parameters een getal
+%I meegegeven (5cm, 24pt, enz.). Met 'pagina' geeft men aan
+%I of naar een nieuwe pagina wordt gesprongen (standaard
+%I 'rechts'). Aan de 'commandos' kunnen commando's worden
+%I toekend die tijdens de opmaak gelden. Aan de laatste twee
+%I parameters toegekende commando's worden voor en na het
+%I opmaken van de pagina uitgevoerd. De opgemaakte pagina
+%I kan worden geselecteerd op naam. Met 'dubbelzijdig' geeft
+%I men aan of er een lege achterkant moet worden opgemaakt
+%I (standaard: ja). Dit geldt aleen bij dubbelzijdig zetten.
+%I
+%I Naast het bovenstaande commando is er het commando:
+%I
+%I \stelopmaakin[naam][instellingen]
+%P
+%I Na het geven van dit commando zijn twee commando's
+%I beschikbaar: \startnaamopmaak en \stopnaamopmaak. Tussen
+%I deze twee commando's kunnen zetopdrachten en teksten
+%I worden opgenomen. Een en ander wordt op een lege bladzijde
+%I gezet.
+%I
+%I Met het commando \testopmaak kunnen hulplijnen worden
+%I opgeroepen.
+%I
+%I De commando's \startstandaardopmaak en \stopstandaardopmaak
+%I maken het opmaken binnen de standaard-layout mogelijk.
+%P
+%I Eventueel kunnen de volgende twee commando's worden gebruikt
+%I om een pagina op te maken met hoofd- en voetregels.
+%I
+%I \startopmaak
+%I .....
+%I \stopopmaak
+
+\newbox\opmaak
+
+\def\setopmaaklayout[#1]%
+ {\stelvoetin [\c!status=\getvalue{\??do#1\c!voetstatus}]%
+ \stelhoofdin[\c!status=\getvalue{\??do#1\c!hoofdstatus}]%
+ \steltekstin[\c!status=\getvalue{\??do#1\c!tekststatus}]%
+ \stelonderin[\c!status=\getvalue{\??do#1\c!onderstatus}]%
+ \stelbovenin[\c!status=\getvalue{\??do#1\c!bovenstatus}]}
+
+\def\dododostartopmaak[#1]%
+ {\doifvaluesomething{\??do#1\c!pagina}
+ {\ExpandFirstAfter\pagina[\getvalue{\??do#1\c!pagina}]}%
+ \soortpagina[#1]%
+ \setopmaaklayout[#1]%
+ \getvalue{\??do#1\c!commandos}%
+ \global\setbox\opmaak=\vbox to \getvalue{\??do#1\c!hoogte}%
+ \bgroup
+ \forgetall
+ \hsize=\getvalue{\??do#1\c!breedte}%
+ \getvalue{\??do#1\c!boven}}
+
+\def\dododostopopmaak[#1]%
+ {\getvalue{\??do#1\c!onder}%
+ \egroup}
+
+\def\doshipoutopmaak[#1]%
+ {\bgroup
+ \getvalue{\??do#1\c!voor}%
+ \box\opmaak
+ \setopmaaklayout[#1]%
+ \pagina
+ \getvalue{\??do#1\c!na}%
+ \ifdubbelzijdig
+ \ifodd\realpageno\else
+ \processaction
+ [\getvalue{\??do#1\c!dubbelzijdig}]
+ [ \v!ja=>\null\pagina\verlaagpaginanummer,
+ \v!leeg=>\pagebodyornamentsfalse
+ \null\pagina\verlaagpaginanummer]%
+ \fi
+ \fi
+ \verlaagpaginanummer
+ \egroup}
+
+\def\doflushopmaak[#1]%
+ {\ifverwerken
+ \ifgeselecteerd
+ \doshipoutopmaak[#1]%
+ \fi
+ \else
+ \ifgeselecteerd
+ \else
+ \doshipoutopmaak[#1]%
+ \fi
+ \fi
+ \ifselecteren
+ \global\geselecteerdfalse
+ \fi}
+
+\def\dodostartopmaak[#1][#2]%
+ {\begingroup
+ \stelopmaakin[#1][#2]%
+ \dododostartopmaak[#1]}
+
+\def\dodostopopmaak[#1]%
+ {\dododostopopmaak[#1]%
+ \doflushopmaak[#1]%
+ \endgroup}
+
+\def\dostartopmaak[#1][#2]%
+ {\iffirstargument
+ \dodostartopmaak[#1][#2]%
+ \def\stopopmaak%
+ {\dodostopopmaak[#1]}%
+ \else
+ \pagina
+ \stelhoofdin[\c!status=\v!leeg]
+ \stelvoetin[\c!status=\v!leeg]
+ \vbox to \teksthoogte % nog een topskip optie
+ \bgroup
+ \def\stopopmaak%
+ {\egroup
+ \eject}%
+ \fi}
+
+\def\startopmaak%
+ {\dodoubleempty\dostartopmaak}
+
+\def\dodefinieeropmaak[#1][#2]%
+ {\getparameters
+ [\??do#1]%
+ [\c!breedte=\zetbreedte,
+ \c!hoogte=\teksthoogte,
+ \c!voffset=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,
+ \c!commandos=,
+ \c!pagina=\v!rechts,
+ \c!dubbelzijdig=\v!leeg,
+ \c!voor=,
+ \c!boven=\vss,
+ \c!onder=\vss,
+ \c!na=,
+ \c!onderstatus=\v!normaal,
+ \c!bovenstatus=\v!normaal,
+ \c!tekststatus=\v!normaal,
+ \c!hoofdstatus=\v!stop,
+ \c!voetstatus=\v!stop,
+ #2]%
+ \setvalue{\e!start#1\e!opmaak}%
+ {\dodoubleempty\dodostartopmaak[#1]}%
+ \setvalue{\e!stop#1\e!opmaak}%
+ {\dodostopopmaak[#1]}}
+
+\def\definieeropmaak%
+ {\dodoubleargument\dodefinieeropmaak}
+
+\def\dostelopmaakin[#1]%
+ {\getparameters[\??do#1]}
+
+\def\stelopmaakin%
+ {\dodoubleargument\dostelopmaakin}
+
+%I n=Smaller
+%I c=\startsmaller,\stelsmallerin
+%I
+%I Een paragraaf kan smaller gezet worden met behulp van de
+%I commando's:
+%I
+%I \startsmaller[afstand]
+%I \stopsmaller
+%I
+%I Als maat wordt links, rechts, midden of een combinatie
+%I hiervan meegegeven. Eventueel wordt geen afstand meegegeven.
+%I
+%I De linker, rechter of dubbele inspringing kan worden
+%I ingesteld met:
+%I
+%I \stelsmallerin[links=,rechts=,midden=]
+%I
+%I Enkele voorbeelden van smelelr zetten zijn:
+%I
+%I \startsmaller[2*links,rechts]
+%I \stopsmaller
+%I
+%I \startsmaller[midden,rechts]
+%I \stopsmaller
+
+\newskip\linkssmaller
+\newskip\rechtssmaller
+\newskip\middensmaller
+
+\def\dosinglesmaller#1%
+ {\dosmaller[#1]}
+
+\def\dosmaller[#1]%
+ {\processaction
+ [#1]
+ [ \v!links=>\global\advance\linkssmaller by \@@sllinks,
+ \v!midden=>\global\advance\middensmaller by \@@slmidden,
+ \v!rechts=>\global\advance\rechtssmaller by \@@slrechts,
+ \s!unknown=>{\herhaalmetcommando[#1]\dosinglesmaller}]}
+
+\def\complexstartsmaller[#1]%
+ {\par
+ \bgroup
+ \global\linkssmaller=\!!zeropoint
+ \global\rechtssmaller=\!!zeropoint
+ \global\middensmaller=\!!zeropoint
+ \processcommalistwithparameters[#1]\dosmaller
+ \advance\leftskip by \linkssmaller
+ \advance\rightskip by \rechtssmaller
+ \advance\leftskip by \middensmaller
+ \advance\rightskip by \middensmaller}
+
+\def\simplestartsmaller%
+ {\startsmaller[\v!midden]}
+
+\def\startsmaller%
+ {\complexorsimple{startsmaller}}
+
+\def\stopsmaller%
+ {\par % else skips forgotten
+ \egroup}
+
+\def\stelsmallerin%
+ {\dodoubleargument\getparameters[\??sl]}
+
+%I n=Boxen
+%I c=\definieerhbox,\cbox,\lbox,\rbox,\sbox
+%I
+%I Het is mogelijk een tekst in een blok met een vaste
+%I omvang te zetten. Dit is vergelijkbaar met het opmaken
+%I van een tabel.
+%I
+%I \hbox?{tekst} (horizontaal blok)
+%I
+%I De box wordt eerst gedefinieerd met:
+%I
+%I \definieerhbox[?][maat]
+%I
+%I Er kan een links, rechts of midden uitgelijnde \vbox worden
+%I gezet met de commando:
+%I
+%I \lbox{tekst\\tekst\\tekst} of \lbox to <maat>{...}
+%I \rbox{tekst\\tekst\\tekst} of \rbox to <maat>{...}
+%I \cbox{tekst\\tekst\\tekst} of \cbox to <maat>{...}
+%I
+%I Het commando \\ forceert een overgang naar een nieuwe regel.
+%I
+%I Een (hoge) box kan een gedwongen hoogte gelijk aan die
+%I van een strut krijgen met:
+%I
+%I \sbox{box}
+
+\def\dodefinieerhbox[#1][#2]%
+ {\setvalue{hbox#1}##1%
+ {\hbox to #2{\begstrut##1\endstrut\hss}}}
+
+\def\definieerhbox%
+ {\dodoubleargument\dodefinieerhbox}
+
+\def\lrcbox#1#2#%
+ {\vbox#2\bgroup
+ \let\\=\endgraf
+ \forgetall#1\let\next=}
+
+\def\lbox%
+ {\lrcbox\raggedleft}
+
+\def\rbox%
+ {\lrcbox\raggedright}
+
+\def\cbox%
+ {\lrcbox\raggedcenter}
+
+\def\dosetraggedbox#1%
+ {\processaction
+ [#1]
+ [ \v!links=>\def\raggedbox{\lbox},
+ \v!rechts=>\def\raggedbox{\rbox},
+ \v!midden=>\def\raggedbox{\cbox},
+ \v!nee=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=},
+ \s!default=>\def\raggedbox{\vbox},
+ \s!unknown=>\def\raggedbox{\vbox}]}
+
+\def\dosetraggedcommand#1%
+ {\processaction
+ [#1]
+ [ \v!links=>\def\raggedcommand{\raggedleft},
+ \v!rechts=>\def\raggedcommand{\raggedright},
+ \v!midden=>\def\raggedcommand{\raggedcenter},
+ \v!nee=>\def\raggedcommand{\raggedright},
+ \s!default=>\def\raggedcommand{\raggedcenter},
+ \s!unknown=>\def\raggedcommand{}]}
+
+%I n=Blokken
+%I c=\stelplaatsblokkenin,\stelblokkopjesin
+%I c=\definieerplaatsblok,\stelplaatsblokin
+%I c=\reserveer,\leeg,\plaats,\volledigelijstmet,\plaatslijstmet
+%I
+%I Figuren, tabellen, grafieken enz. kunnen in de tekst
+%I worden geplaatst met het commando:
+%I
+%I \plaats<bloknaam>[voorkeur][referentie]{titel}{blok}
+%I
+%I Als voorkeur kan worden opgegeven:
+%I
+%I hier bij voorkeur op deze plaats in de tekst
+%I forceer per se op deze plaats in de tekst
+%I pagina op een nieuwe pagina
+%I boven bovenaan de huidige pagina
+%I onder onderaan de huidige pagina
+%I
+%I links links in de paragraaf
+%I rechts rechts in de paragraaf
+%I
+%I inlinker in linker marge (gelijke hoogte)
+%I inrechter in rechter marge (gelijke hoogte)
+%I inmarge in linker/rechter marge (gelijke hoogte)
+%I marge in de marge
+%P
+%I Als er op de huidige bladzijde geen plaats is, dan wordt
+%I standaard de figuur verplaatst (eerste vier opties) en/of
+%I wordt overgegaan naar een nieuwe bladzijde (laatste twee
+%I opties.
+%I
+%I Men kan plaatsen afdwingen door het trefwoord altijd
+%I mee te geven: \plaats[hier,altijd][]{}{}. Er zijn dan
+%I twee runs nodig, omdat de nummering van de blokken moet
+%I worden aangepast.
+%I
+%I Als in plaats van een titel 'geen' wordt meegegeven, wordt
+%I geen titel geplaatst.
+%I
+%I Als het blok nog onbekend is, kan in plaats van het blok
+%I een van de volgende commando's worden meegegeven:
+%I
+%I \leeg<bloknaam>
+%I \lege<bloknaam>
+%P
+%I Het is mogelijk ruimte voor een blok te reserveren:
+%I
+%I \reserveer<bloknaam>[hoogte=,breedte=,kader=][voorkeur]
+%I [referentie]{titel}
+%I
+%I Beide commando's kunnen ook gegeven worden zonder [],
+%I dus in de vorm
+%I
+%I \plaats<bloknaam>{titel}{blok}
+%I \reserveer<bloknaam>{titel}
+%I
+%I Ten behoeve van een consistente verwijzing wordt het
+%I commando:
+%I
+%I \in<bloknaam>[referentie]
+%I
+%I gedefinieerd. Dit levert in de tekst op:
+%I
+%I 'in <bloknaam> <nummer>'
+%P
+%I Blokken kunnen worden gedefinieerd met het commando:
+%I
+%I \definieerplaatsblok[blok][blokken]
+%I
+%I Hierna zijn de volgende commando's beschikbaar:
+%I
+%I \plaatsblok[plaats][referentie]{titel}{blok}
+%I \reserveerblok[afmetingen][plaats][referentie]{titel}
+%I \leegblok
+%I
+%I Het is mogelijk een en ander in te stellen met het
+%I commando:
+%I
+%I \stelplaatsblokin[blok][hoogte=,breedte=,kader=,
+%I bovenkader=,onderkader=,linkerkader=,rechterkader=,
+%I paginaovergangen=]
+%I
+%I De hoogte en breedte hebben betrekking op de te reserveren
+%I ruimte.
+%P
+%I Naast de eerder genoemde commando's zijn nog beschikbaar:
+%I
+%I \plaatslijstmetblokken
+%I \volledigelijstmetblokken
+%I
+%I en een (extra) commando om tekst naast een blok (hier met
+%I de naam 'blok') te plaatsen:
+%I
+%I \startbloktekst[plaats][referentie]{kop}{blok}
+%I ...
+%I \stopbloktekst
+%I
+%I Mogelijke plaatsen zijn 'links', 'rechts', 'hoog', 'laag' en
+%I 'midden'. Ook is een combinatie van deze instellingen
+%I mogelijk, bijvoorbeeld [links,hoog]. De instelling 'offset'
+%I resulteert in een verschuiving van 1 regel.
+%P
+%I Blokken die tussen de tekst staan kunnen links, rechts of in
+%I het midden worden uitgelijnd. De plaats wordt ingesteld met:
+%I
+%I \stelplaatsblokkenin[plaats=,breedte=,kader=,bovenkader=,
+%I onderkader=,linkerkader=,rechterkader=,offset=,voorwit=,
+%I nawit=,marge=]
+%I
+%I De genummerde kopjes bij blokken kunnen worden ingesteld
+%I met:
+%I
+%I \stelblokkopjesin[plaats=,voor=,tussen=,na=,letter=,
+%I kopletter=,breedte=,nummer=,uitlijnen=]
+%I
+%I waarbij als plaats kan worden meegegeven: 'boven', 'onder',
+%I 'geen', 'hoog', 'laag' of 'midden'. Als breedte kan 'passend'
+%I of 'max' worden meegegeven. De parameter nummer kan 'ja' of
+%I 'nee' zijn. Als breedte=max, dan wordt het kopje over de
+%I hele breedte geplaatst. In dat geval kan uitlijnen worden
+%I ingesteld: 'links', 'midden' of 'rechts'.
+%P
+%I Als er geen plaats is, worden plaatsblokken tijdelijk
+%I achtergehouden. De opgespaarde blokken worden op de
+%I volgende bladzijde(n) geplaatst. Dit plaatsen is te
+%I beinvloeden met:
+%I
+%I \stelplaatsblokkenin[nboven=,nonder=,nregels=]
+%I
+%I Standaard worden maximaal 2 blokken bovenaan de
+%I bladzijde geplaatst en 0 blokken onder. Er wordt overgegaan
+%I op een nieuwe bladzijde als het aantal regels groter is
+%I dan 4. Deze waarden kunnen worden ingesteld.
+%P
+%I Kopjes boven lijsten en labels voor nummers kunnen worden
+%I ingesteld met de elders beschreven commando's:
+%I
+%I \stellabeltekstin[label=...]
+%I \stelkoptekstin[tekst=...]
+%I
+%I Standaard zijn deze ingesteld op de opgegeven namen.
+
+\def\stelplaatsblokkenin%
+ {\dodoubleargument\getparameters[\??bk]}
+
+\def\stelblokkopjesin%
+ {\dodoubleargument\getparameters[\??kj]}%
+
+\def\dostelplaatsblokin[#1][#2]%
+ {\getparameters[\??fl#1][#2]}
+
+\def\stelplaatsblokin%
+ {\dodoubleargument\dostelplaatsblokin}
+
+\def\dostelblokkopjein[#1][#2]%
+ {\getparameters[\??kj#1][#2]}
+
+\def\stelblokkopjein%
+ {\dodoubleargument\dostelblokkopjein}
+
+\def\doleegblok#1%
+ {\localframed
+ [\??fl#1][\c!kader=\v!aan]%
+ {\getmessage{\m!floatblocks}{12}}}
+
+\def\docomplexplaatsblok[#1][#2][#3]#4%
+ {\flushfootnotes
+ \ifmargeblokken
+ \doifinset{\v!marge}{#2}
+ {\bgroup
+ \everypar{\egroup\the\everypar}%
+ \hsize=\@@mbbreedte}%
+ \fi
+ \global\insidefloattrue
+ \dowithnextbox
+ {\docompletefloat
+ {#1}{#3}{#1}{#2}{\labeltext{#1}}{#4}
+ {\box\nextbox}}%
+ \vbox}
+
+\def\docomplexstarttekstblok[#1][#2][#3]%
+ {\flushfootnotes
+ \flushsidefloats % hoort eigenlijk niet hier
+ \docomplexplaatsblok[#1][\v!tekst,#2,\v!links][#3]}
+
+\def\docomplexreserveerblok[#1][#2][#3][#4]#5%
+ {\getvalue{\e!plaats#1}[#3][#4]{#5}{\localframed[\??fl#1][#2]{#1}}}
+
+\def\docomplexstartreserveertekstblok[#1][#2][#3][#4]%
+ {\flushsidefloats % hoort eigenlijk niet hier
+ \docomplexreserveerblok[#1][#2][\v!tekst,#3,\v!links][#4]}
+
+\def\dodefinieerplaatsblok[#1][#2]% #1=naam #2=meervoud
+ {\presetlocalframed[\??fl#1]%
+ \stelplaatsblokin
+ [#1]
+ [\c!breedte=15\korpsgrootte,
+ \c!hoogte=10\korpsgrootte,
+ \c!kader=\@@bkkader,
+ \c!straal=\@@bkstraal,
+ \c!hoek=\@@bkhoek,
+ \c!achtergrond=\@@bkachtergrond,
+ \c!achtergrondraster=\@@bkachtergrondraster,
+ \c!achtergrondkleur=\@@bkachtergrondkleur,
+ \c!bovenkader=\@@bkbovenkader,
+ \c!onderkader=\@@bkonderkader,
+ \c!linkerkader=\@@bklinkerkader,
+ \c!rechterkader=\@@bkrechterkader,
+ \c!paginaovergangen=]%
+ \stelblokkopjein
+ [#1]
+ [\c!plaats=\@@kjplaats,
+ %\c!voor=\@@kjvoor,
+ \c!tussen=\@@kjtussen,
+ %\c!na=\@@kjna,
+ \c!breedte=\@@kjbreedte,
+ \c!kopletter=\@@kjkopletter,
+ \c!letter=\@@kjletter,
+ \c!kleur=\@@kjkleur,
+ \c!uitlijnen=\@@kjuitlijnen,
+ \c!nummer=\@@kjnummer,
+ \c!wijze=\@@kjwijze,
+ \c!blokwijze=\@@kjblokwijze,
+ \c!sectienummer=\@@kjsectienummer,
+ \c!conversie=\@@kjconversie]%
+ \doorlabelen
+ [#1]
+ [\c!tekst=#1,
+ \c!plaats=\v!intekst,
+ \c!wijze=\getvalue{\??kj#1\c!wijze},
+ \c!blokwijze=\getvalue{\??kj#1\c!blokwijze},
+ \c!sectienummer=\getvalue{\??kj#1\c!sectienummer},
+ \c!conversie=\getvalue{\??kj#1\c!conversie}]%
+ \presetlabeltext[#1=\Woord{#1}~]%
+ \presetheadtext[#2=\Woord{#2}]%
+ \definieerlijst[#1]%
+ \setvalue{\e!plaats\e!lijstmet#2}%
+ {\dodoubleempty\doplaatslijst[#1]}%
+ \setvalue{\e!volledige\e!lijstmet#2}%
+ {\dotripleempty\dodovolledigelijst[#1][#2]}%
+ \setvalue{\e!plaats#1}%
+ {\dotripleempty\docomplexplaatsblok[#1]}%
+ \setvalue{\e!reserveer#1}%
+ {\doquadrupleempty\docomplexreserveerblok[#1]}%
+ \setvalue{\e!start#1\e!tekst}%
+ {\dotripleempty\docomplexstarttekstblok[#1]}%
+ \setvalue{\e!stop#1\e!tekst}%
+ {\dostoptextfloat}%
+ \setvalue{\e!start\e!reserveer#1\e!tekst}%
+ {\doquadrupleempty\docomplexstartreserveertekstblok[#1]}%
+ \setvalue{\e!stop\e!reserveer#1\e!tekst}%
+ {\dostoptextfloat}%
+ \setvalue{\e!lege#1}%
+ {\doleegblok{#1}}%
+ \setvalue{\e!leeg#1}%
+ {\doleegblok{#1}}}
+
+%\setvalue{\c!in#1}[##1]%
+% {\c!in\normalspace\in{\labeltext{#1}}[##1]}}
+
+\def\definieerplaatsblok%
+ {\dodoubleargument\dodefinieerplaatsblok}
+
+% De onderstaande macro's ondersteunen het zetten van tekst
+% rond figuren. De macro's zijn ontworpen door Daniel Comenetz
+% en gepubliceerd in TUGBoat Volume 14 (1993), No. 1: Anchored
+% Figures at Either Margin. De macro's zijn slechts op enkele
+% punten door mij aangepast.
+
+% afhankelijke variabelen
+%
+% \overgap vervangen door \floatsidetopskip
+% \sidegap vervangen door \floatsideskip
+% \undergap vervangen door \floatsidebottomskip
+%
+% \prskp vervangen door \tussenwit
+
+% toegevoegde macro's/aanroepen
+%
+% \logsidefloat : loginformatie
+% \flushsidefloats : nodig voor koppen
+
+% recente wijzigingen:
+%
+% namen aangepast: \float... enz. i.p.v. \pic
+
+% Pas op: \EveryPar{\EveryPar{}\margetitel{whatever}}
+% \plaatsfiguur[links]{}{} moet goed gaan. In dat geval
+% begint de tekst terecht wat lager.
+
+\newdimen\sidefloatheight % includes the topskip
+\newdimen\sidefloatwidth
+\newdimen\sidefloathsize
+\newdimen\sidefloatvsize \def\nofloatvsize{-1pt }
+
+\newbox\floatbottom
+
+\newif\ifrightfloat
+\newif\ifmarginfloat
+\newif\ifroomforfloat
+\newif\iffloatshort
+\newif\iffloatflag
+\newif\iffloatrighteqo
+\newif\iffloatlefteqo
+
+\let\floatrighteqo=\eqno
+\let\floatleftleqo=\leqno
+
+% Watch it!
+
+\everypar ={\flushfootnotes\checksidefloat\checkindentation}
+
+% Watch it even more! In inner, gaat't mis omdat daar
+% pagetotal enz niet zijn aangepast. Inner kan overigens niet
+% betrouwbaar worden getest!
+
+\everypar ={\flushfootnotes\ifinner\else\checksidefloat\fi\flushmargincontents\checkindentation}
+\neverypar ={}%\autopostponefootnotes}
+\everydisplay={\flushfootnotes\adjustsidefloatdisplaylines}
+
+\def\flushsidefloats%
+ {\par
+ \!!heighta=\sidefloatvsize
+ \advance\!!heighta by -\pagetotal
+ \ifdim\!!heighta>\!!zeropoint
+ \witruimte % nog checken op interferentie
+ \kern\!!heighta
+ \fi
+ \global\sidefloatvsize=\nofloatvsize
+ \global\floatflagfalse}
+
+\def\flushsidefloatsafterpar%
+ {\xdef\oldpagetotal{\the\pagetotal}%
+ \gdef\checksidefloat%
+ {\dochecksidefloat
+ \ifdim\oldpagetotal=\pagetotal \else
+ \xdef\checksidefloat{\dochecksidefloat}%
+ \flushsidefloats
+ \fi}}
+
+\let\logsidefloat=\relax
+
+\def\pushpenalties%
+ {\widowpenalty=1
+ \clubpenalty=2
+ \brokenpenalty=1
+ \let\pushpenalties=\relax
+ \edef\poppenalties%
+ {\widowpenalty=\the\widowpenalty
+ \clubpenalty=\the\clubpenalty
+ \brokenpenalty=\the\brokenpenalty}}
+
+\let\poppenalties=\relax
+
+\def\restorepenalties%
+ {\ifnum\outputpenalty=\!!tenthousand\relax
+ \else
+ \penalty\outputpenalty
+ \fi}
+
+\def\sidefloatoutput%
+ {\iffloatshort
+ \unvbox\normalpagebox
+ \setbox\floatbottom=\lastbox
+ \ifdim\wd\floatbottom>\sidefloathsize
+ \penalty-201
+ \box\floatbottom
+ \else
+ \ifvoid\floatbottom
+ \else
+ \restoreleftindent
+ \ifdim\wd\floatbottom<\sidefloathsize
+ \parskip=\!!zeropoint
+ %\noindent
+ \vadjust{\penalty-1}%
+ \iffloatlefteqo
+ \global\floatlefteqofalse
+ \else
+ \global\advance\sidefloathsize by -\wd\floatbottom
+ \iffloatrighteqo
+ \global\floatrighteqofalse
+ \else
+ \global\divide\sidefloathsize by 2
+ \fi
+ \hskip\sidefloathsize
+ \fi
+ \fi
+ \box\floatbottom
+ \restorepenalties
+ \fi
+ \fi
+ \global\holdinginserts=0
+ \global\floatshortfalse
+ \else
+ \finaloutput\unvbox\normalpagebox
+ \global\sidefloatvsize=\nofloatvsize
+ \poppenalties
+ \fi}
+
+\def\restoreleftindent%
+ {\ifrightfloat
+ \else
+ \parskip=\!!zeropoint
+ \noindent
+ \vadjust{\penalty-1}%
+ \global\hskip\sidefloatwidth
+ \fi}
+
+\def\eqno%
+ {\iffloatshort
+ \global\floatrighteqotrue
+ \fi
+ \floatrighteqo}
+
+\def\leftmarginfloat#1%
+ {\global\rightfloatfalse\marginfloattrue\putsidefloat{#1}}
+
+\def\rightmarginfloat#1%
+ {\global\rightfloattrue\marginfloattrue\putsidefloat{#1}}
+
+\def\leftfloat#1%
+ {\global\rightfloatfalse\marginfloatfalse\putsidefloat{#1}}
+
+\def\rightfloat#1%
+ {\global\rightfloattrue\marginfloatfalse\putsidefloat{#1}}
+
+\def\putsidefloat#1%
+ {\par
+ \witruimte
+ \previoussidefloat
+ \stallsidefloat
+ \setbox\floatbox=\hbox{\vbox{\vskip\sidefloattopoffset#1}}
+ \measuresidefloat
+ \ifroomforfloat
+ \setsidefloat
+ \else
+ \tosssidefloat
+ \measuresidefloat
+ \stallsidefloat
+ \setsidefloat
+ \fi}
+
+\def\progresssidefloat%
+ {\!!heighta=\sidefloatvsize
+ \iffloatflag
+ \advance\!!heighta by -\dimen3
+ \global\floatflagfalse
+ \else
+ \advance\!!heighta by -\pagetotal
+ \fi}
+
+\def\tosssidefloat%
+ {\vfill\eject}
+
+\def\measuresidefloat%
+ {\global\floatflagtrue
+ \dimen3=\pagetotal
+ \ifmarginfloat
+ \global\sidefloatwidth=\!!zeropoint
+ \else
+ \global\sidefloatwidth=\wd\floatbox
+ \global\advance\sidefloatwidth by \floatsideskip
+ \fi
+ \global\sidefloathsize=\hsize
+ \global\advance\sidefloathsize by -\sidefloatwidth
+ \global\sidefloatheight=\ht\floatbox
+\global\advance\sidefloatheight by \dp\floatbox
+ \global\advance\sidefloatheight by \sidefloattopskip
+ \global\sidefloatvsize=\sidefloatheight
+ \global\advance\sidefloatvsize by \dimen3
+ \dimen0=\sidefloatvsize
+% \advance\dimen0 by -\baselineskip
+%\ifgridsnapping
+% \advance\dimen0 by .5\openlineheight % \vsize slightly too large
+%\fi
+ \ifdim\dimen0>.99\pagegoal \relax
+ \roomforfloatfalse
+ \else
+ \dimen0=\pagegoal
+ \advance\dimen0 by -\sidefloatvsize
+ \ifdim\dimen0<\sidefloatbottomskip
+ \global\advance\sidefloatvsize by \dimen0
+ \global\floatshorttrue
+ \pushpenalties
+ \holdinginserts=1
+ \else
+ \global\advance\sidefloatvsize by \sidefloatbottomskip
+ \global\floatshortfalse
+ \fi
+ \roomforfloattrue
+ \fi}
+
+\def\setsidefloat%
+ {\vbox{\strut}\vskip-\lineheight
+ \kern\sidefloattopskip
+ \oldprevdepth=\prevdepth
+ \nointerlineskip
+ \bgroup
+ \everypar={}%
+ \parskip=\!!zeropoint
+ \logsidefloat
+ \ifrightfloat
+ \hfill
+ \ifmarginfloat
+ \rlap{\hskip\rechtermargeafstand\unhbox\floatbox}%
+ \else
+ \unhbox\floatbox
+ \fi
+ \else
+ \noindent
+ \ifmarginfloat
+ \llap{\unhbox\floatbox\hskip\linkermargeafstand}%
+ \else
+ \unhbox\floatbox
+ \fi
+ \hfill
+ \fi
+ \egroup
+ \par
+ \kern-\sidefloatheight
+ \penalty10001
+ \normalbaselines
+ \prevdepth=\oldprevdepth
+ %\noindent
+ \resetsidefloatparagraph
+ \ignorespaces}
+
+\newcount\sidefloatparagraph
+
+\def\iffirstsidefloatparagraph%
+ {\ifnum\sidefloatparagraph=1\relax}
+
+\def\setsidefloatparagraph%
+ {\global\advance\sidefloatparagraph by 1\relax}
+
+\def\resetsidefloatparagraph%
+ {\global\sidefloatparagraph=0\relax}
+
+\def\dochecksidefloat%
+ {\progresssidefloat
+ \ifdim\!!heighta>\!!zeropoint
+ \advance\!!heighta by \sidefloatbottomskip
+ \!!counta=\!!heighta
+ \divide\!!counta by \baselineskip
+ \ifnum\!!counta>0
+ \ifrightfloat
+ \hangindent=-\sidefloatwidth
+ \else
+ \hangindent=\sidefloatwidth
+ \fi
+ \hangafter=-\!!counta
+ \fi
+ \setsidefloatparagraph
+ \else
+ \resetsidefloatparagraph
+ \fi
+ \parskip=\tussenwit}
+
+\def\checksidefloat%
+ {\dochecksidefloat}
+
+\def\doadjustsidefloatdisplaylines%
+ {\par
+ \vskip-\parskip
+ \noindent
+ \ignorespaces}
+
+\def\adjustsidefloatdisplaylines%
+ {\aftergroup\doadjustsidefloatdisplaylines}
+
+\def\previoussidefloat%
+ {\progresssidefloat
+ \ifdim\!!heighta>\!!zeropoint \relax
+ \iffloatshort
+ \global\floatshortfalse
+ \tosssidefloat
+ \else
+ \kern\!!heighta
+ \fi
+ \fi}
+
+\def\stallsidefloat%
+ {\!!counta=\pageshrink
+ \divide\!!counta by \baselineskip
+ \advance\!!counta by 1
+ \parskip=\!!zeropoint
+ \dorecurse{\!!counta}{\line{}}
+ \kern-\!!counta\baselineskip
+ \penalty0\relax}
+
+% De onderstaande macro's zijn verantwoordelijk voor het plaatsen
+% van floats. De macro's moeten nog worden aangepast en
+% uitgebreid:
+%
+% - nofloatpermitted : top, bot en mid counters en geen topins
+% als reeds midfloat of botfloat
+%
+% - links, rechts, midden als niet hangend
+
+\newif\ifsomefloatwaiting \somefloatwaitingfalse
+\newif\ifroomforfloat \roomforfloattrue
+\newif\ifnofloatpermitted \nofloatpermittedfalse
+\newif\iffloatsonpage \floatsonpagefalse
+
+\newcount\totalnoffloats \totalnoffloats=0
+\newcount\savednoffloats \savednoffloats=0
+\newcount\noffloatinserts \noffloatinserts=0
+
+\newbox\floatlist
+
+\newinsert\botins
+
+\skip\botins=\!!zeropoint
+\count\botins=\!!thousand
+\dimen\botins=\maxdimen
+
+\newdimen\topinserted
+\topinserted=\!!zeropoint
+
+\newdimen\botinserted
+\botinserted=\!!zeropoint
+
+\newif\ifflushingfloats
+\flushingfloatsfalse
+
+\newbox\floattext
+
+\newdimen\floattextwidth
+\newdimen\floattextheight
+
+\newbox\floatbox
+
+\newdimen\floatwidth
+\newdimen\floatheight
+
+% Er wordt bij \v!altijd als dat nodig is hernummerd.
+% Daarbij wordt gebruik gemaakt van de opgeslagen nummers en
+% volgorde.
+
+\definetwopasslist{\s!float}
+
+\def\dofloatreference%
+ {\doglobal\increment\numberedfloat
+ \edef\dodofloatreference%
+ {\writeutilitycommand%
+ {\twopassentry%
+ {\s!float}%
+ {\numberedfloat}%
+ {\hetnummer}}}%
+ \dodofloatreference}
+
+\def\redofloatorder#1%
+ {\doglobal\increment\nofplacedfloats\relax
+ \gettwopassdata{\s!float}%
+ \iftwopassdatafound
+ \doifnot{\hetnummer}{\twopassdata}
+ {\edef\oldhetnummer{\hetnummer}%
+ \xdef\hetnummer{\twopassdata}%
+ \showmessage
+ {\m!floatblocks}{1}
+ {\nofplacedfloats,#1 \oldhetnummer,\hetnummer}}%
+ \fi}
+
+% In \dofloatinfomessage wordt {{ }} gebruikt omdat anders
+% binnen \startuitstellen...\stopuitstellen geen goede
+% melding in de marge volgt: \ifinner is dan namelijk true.
+
+\def\dofloatinfomessage#1#2#3%
+ {\bgroup
+ \showmessage{\m!floatblocks}{#2}{#3}%
+ \@EA\floatinfo\@EA#1\@EA{\currentmessagetext}%
+ \egroup}
+
+\def\dosavefloatinfo%
+ {\dofloatinfomessage{>}{2}{\the\totalnoffloats}}
+
+\def\dofloatflushedinfo%
+ {\!!counta=\totalnoffloats\relax
+ \advance\!!counta by -\savednoffloats\relax%
+ \dofloatinfomessage{<}{3}{\the\!!counta}}
+
+\def\doinsertfloatinfo%
+ {\dofloatinfomessage{<}{4}{\the\totalnoffloats}}
+
+% ook voetnoten saven
+
+\def\dosavefloat%
+ {\global\setbox\floatlist=\vbox
+ {\nointerlineskip
+ \box\floatbox\relax
+ \unvbox\floatlist}%
+ \global\advance\savednoffloats by 1\relax
+ \global\somefloatwaitingtrue
+ \dosavefloatinfo}
+
+\def\doresavefloat%
+ {\global\setbox\floatlist=\vbox
+ {\nointerlineskip
+ \unvbox\floatlist
+ \box\floatbox}%
+ \global\advance\savednoffloats by 1\relax
+ \global\somefloatwaitingtrue}
+
+\def\doreversesavefloat%
+ {\global\setbox\floatlist=\vbox
+ {\nointerlineskip
+ \unvbox\floatlist
+ \box\floatbox}%
+ \global\advance\savednoffloats by 1\relax
+ \global\somefloatwaitingtrue
+ \dosavefloatinfo}
+
+\def\checkwaitingfloats#1%
+ {\ifsomefloatwaiting
+ \doifinsetelse{\v!altijd}{#1}
+ {\showmessage{\m!floatblocks}{5}{}}
+ {\doflushfloats}%
+ \fi}
+
+\def\doflushfloats%
+ {\global\floatsonpagefalse
+ \global\flushingfloatstrue
+ \ifsomefloatwaiting
+ \par
+ \ifvmode\prevdepth=\maxdimen\fi % prevents whitespace
+ \dodoflushfloats
+ \fi
+ \global\savednoffloats=0
+ \global\somefloatwaitingfalse
+ \global\flushingfloatsfalse}
+
+\def\dodoflushfloats% moet nog beter: als precies passend, niet onder baseline
+ {\ifsomefloatwaiting
+ \bgroup % \box\floatbox can be in use!
+ \dogetfloat
+ %\forgetall % NJET!
+ \witruimte
+ \blanko[\@@bkvoorwit]
+ \flushfloatbox
+ %\ifnum\savednoffloats>1 % REMOVED
+ %\else
+ \blanko[\@@bknawit]
+ %\fi
+ \egroup
+ \dofloatflushedinfo
+ \expandafter\dodoflushfloats
+ \fi}
+
+\newbox\globalscratchbox
+
+\def\dogetfloat%
+ {\ifsomefloatwaiting
+ \global\setbox\floatlist=\vbox
+ {\unvbox\floatlist
+ \global\setbox\globalscratchbox=\lastbox}%
+ \setbox\floatbox=\box\globalscratchbox % local !
+ \global\advance\savednoffloats by -1\relax
+ \ifnum\savednoffloats=0\relax
+ \global\somefloatwaitingfalse
+ \fi
+ \else
+ \global\savednoffloats=0\relax
+ \global\setbox\floatbox=\box\voidb@x
+ \fi}
+
+\def\dotopfloat%
+ {\ifdim\topinserted=\!!zeropoint\relax
+ \topofinserttrue
+ \else
+ \topofinsertfalse
+ \fi
+ \global\advance\topinserted by \ht\floatbox
+ \global\advance\topinserted by \dp\floatbox
+ \global\advance\topinserted by \floatbottomskip
+ \insert\topins
+ {\forgetall
+ \iftopofinsert
+ \kern-\lineskip\par\prevdepth=\maxdimen
+ \else
+ %\blanko[-\@@bknawit,\@@bkvoorwit]% inserts can't look back
+ \betweenfloatblanko
+ \fi
+ \flushfloatbox
+ \blanko[\@@bknawit]}%
+ \doinsertfloatinfo}
+
+% \loop ...\repeat doesn't work here, but why?
+%
+% \def\dosettopinserts%
+% {\ifsomefloatwaiting
+% \noffloatinserts=0\relax
+% \loop
+% \ifnum\noffloatinserts<\noftopfloats
+% ....
+% \repeat
+% \fi}
+%
+% so:
+
+\def\dodosettopinserts%
+ {\ifnum\noffloatinserts<\noftopfloats
+ \dogetfloat
+ \ifdim\topinserted=\!!zeropoint\relax
+ \topofinserttrue
+ \else
+ \topofinsertfalse
+ \fi
+ \global\advance\topinserted by \ht\floatbox
+ \global\advance\topinserted by \dp\floatbox
+ \global\advance\topinserted by \floatbottomskip\relax
+ \ifdim\topinserted<\teksthoogte\relax
+ \xdef\totaltopinserted{\the\topinserted}%
+ \insert\topins
+ {\forgetall
+ \iftopofinsert
+ \kern-\lineskip\par\prevdepth=\maxdimen
+ \else
+ %\blanko[-\@@bknawit,\@@bkvoorwit]% inserts can't look back
+ \betweenfloatblanko
+ \fi
+ \flushfloatbox
+ \blanko[\@@bknawit]}%
+ \ifsomefloatwaiting
+ \advance\noffloatinserts by 1
+ \else
+ \noffloatinserts=\noftopfloats\relax
+ \fi
+ \dofloatflushedinfo
+ \else
+ \doresavefloat
+ \noffloatinserts=\noftopfloats\relax
+ \fi
+ \else
+ \ifsomefloatwaiting
+ \showmessage{\m!floatblocks}{6}{\the\noftopfloats}%
+ \fi
+ \let\dodosettopinserts=\relax
+ \fi
+ \dodosettopinserts}
+
+\def\dosettopinserts%
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts=0\relax
+ \let\totaltopinserted=\!!zeropoint\relax
+ \dodosettopinserts
+ \ifnum\@@bknonder=0\relax
+ \ifnum\@@bknregels>0\relax
+ \ifdim\totaltopinserted>\!!zeropoint\relax
+ \dimen0=\lineheight
+ \dimen0=\@@bknregels\dimen0\relax
+ \advance\dimen0 by \totaltopinserted\relax
+ \ifdim\dimen0>\teksthoogte
+ \showmessage{\m!floatblocks}{8}{\@@bknregels}%
+ \vfilll\eject
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \egroup}
+
+\def\dodosetbotinserts%
+ {\ifnum\noffloatinserts<\nofbotfloats\relax
+ \dogetfloat
+ \global\advance\botinserted by \ht\floatbox\relax
+ \global\advance\botinserted by \dp\floatbox\relax
+ \global\advance\botinserted by \floattopskip\relax
+ \ifdim\botinserted<\pagegoal\relax
+ \insert\botins
+ {\forgetall
+ \blanko[\@@bkvoorwit]%
+ \flushfloatbox}%
+ \ifsomefloatwaiting
+ \advance\noffloatinserts by 1
+ \else
+ \noffloatinserts=\nofbotfloats
+ \fi
+ \dofloatflushedinfo
+ \else
+ \doresavefloat
+ \noffloatinserts=\nofbotfloats\relax
+ \fi
+ \global\nofloatpermittedtrue % vgl topfloats s!
+ \else
+ \ifsomefloatwaiting
+ \showmessage{\m!floatblocks}{7}{\the\nofbotfloats}%
+ \fi
+ \let\dodosetbotinserts=\relax
+ \fi
+ \dodosetbotinserts}
+
+\def\dosetbotinserts%
+ {\bgroup
+ \ifsomefloatwaiting
+ \noffloatinserts=0\relax
+ \dodosetbotinserts
+ \fi
+ \egroup}
+
+\def\dobotfloat%
+ {\global\advance\botinserted by \ht\floatbox
+ \global\advance\botinserted by \dp\floatbox
+ \global\advance\botinserted by \floattopskip
+ \insert\botins
+ {\forgetall
+ \blanko[\@@bkvoorwit]%
+ \flushfloatbox}%
+ %\global\nofloatpermittedtrue
+ \doinsertfloatinfo}
+
+\def\dosetbothinserts%
+ {\ifflushingfloats
+ \global\topinserted=\!!zeropoint\relax
+ \global\botinserted=\!!zeropoint\relax
+ \else
+ \global\topinserted=\!!zeropoint\relax
+ \dosettopinserts
+ \global\botinserted=\topinserted\relax
+ \dosetbotinserts
+ \fi}
+
+\def\dotopinsertions%
+ {\ifvoid\topins\else
+ \ifgridsnapping
+ %\topsnaptogrid{\box\topins}
+ \box\topins % already snapped
+ \else
+ \unvbox\topins
+ \fi
+ \fi
+ \global\topinserted=\!!zeropoint\relax}
+
+\def\dobotinsertions%
+ {\ifvoid\botins\else
+ \ifgridsnapping
+ \snaptogrid\hbox{\box\botins}
+ \else
+ \unvbox\botins
+ \fi
+ \fi
+ \global\botinserted=\!!zeropoint\relax
+ \global\nofloatpermittedfalse}
+
+\newif\iftopofinsert
+\newif\iftestfloatbox %\testfloatboxtrue
+
+%\def\flushfloatbox% nog verder doorvoeren en meer info in marge
+% {\iftestfloatbox
+% \ruledhbox{\box\floatbox}%
+% \else
+% \box\floatbox
+% \fi}
+
+% \testfloatboxtrue
+%
+% testfloatbox gaat mis, niet in midden, dus elders
+
+\def\flushfloatbox% nog verder doorvoeren en meer info in marge
+ {\snaptogrid\hbox{\iftestfloatbox\ruledhbox\fi{\box\floatbox}}}
+
+% beter de laatste skip buiten de \insert uitvoeren,
+% bovendien bij volle flush onder baseline.
+
+\def\betweenfloatblanko% assumes that \@@bknawit is present
+ {\bgroup
+ \setbox0=\vbox{\strut\blanko[\@@bkvoorwit]\strut}%
+ \setbox2=\vbox{\strut\blanko[\@@bknawit]\strut}%
+ \ifdim\ht0>\ht2
+ \blanko[-\@@bknawit,\@@bkvoorwit]
+ \fi
+ \egroup}
+
+\def\doroomfloat%
+ {\ifnofloatpermitted
+ \global\roomforfloatfalse
+ \else
+ \dimen0=\pagetotal
+ \advance\dimen0 by \ht\floatbox
+ \advance\dimen0 by \dp\floatbox
+ \advance\dimen0 by \floattopskip
+ \advance\dimen0 by -\pageshrink % toegevoegd
+%\ifgridsnapping
+% \advance\dimen0 by .5\openlineheight % \vsize slightly too large
+%\fi
+ \ifdim\dimen0>\pagegoal
+ \global\roomforfloatfalse
+ \else
+ \global\roomforfloattrue
+ \fi
+ \fi}
+
+\def\doexecfloat% spacing between two successive must be better
+ {\baselinecorrection
+ \witruimte
+ \blanko[\@@bkvoorwit]%
+ \flushfloatbox
+ \blanko[\@@bknawit]%
+ \doinsertfloatinfo}
+
+\def\somefixdfloat[#1]%
+ {\doroomfloat
+ \ifroomforfloat\else
+ \goodbreak
+ \fi
+ \showmessage{\m!floatblocks}{9}{}%
+ \doexecfloat}
+
+\def\somesidefloat[#1]% links, rechts NOG TESTEN EN AANPASSEN
+ {\ifbinnenkolommen
+ \someelsefloat[\v!hier]%
+ \else
+ \checkwaitingfloats{#1}%
+ \def\logsidefloat%
+ {\doinsertfloatinfo}%
+ \setbox\floatbox=\vbox{\box\floatbox}%
+ \wd\floatbox=\floatwidth
+ \processfirstactioninset
+ [#1]
+ [ \v!links=>\leftfloat{\box\floatbox},
+ \v!rechts=>\rightfloat{\box\floatbox},
+ \v!inlinker=>\leftmarginfloat{\box\floatbox},
+ \v!inrechter=>\rightmarginfloat{\box\floatbox},
+ \v!inmarge=>{\doinmargenormal\leftmarginfloat\rightmarginfloat[]{\box\floatbox}}]%
+ \doifinset{\v!lang}{#1}
+ {\flushsidefloatsafterpar}%
+ \fi}
+
+\def\sometextfloat[#1]% lang, links, rechts, hoog, midden, laag, offset
+ {\checkwaitingfloats{#1}%
+ \def\dostoptextfloat{\dodostoptextfloat[#1]}%
+ \global\floattextwidth=\hsize
+ \global\floatwidth=\wd\floatbox
+ \global\floatheight=\ht\floatbox % forget about the depth
+ \global\advance\floattextwidth by -\floatwidth
+ \global\advance\floattextwidth by -\@@bkmarge\relax % was \tfskipsize
+ \doifinsetelse{\v!lang}{#1}
+ {\floattextheight=\pagegoal
+ \advance\floattextheight by -\pagetotal
+ \advance\floattextheight by -\bigskipamount % lelijk
+ \ifdim\floattextheight>\teksthoogte
+ \floattextheight=\teksthoogte
+ \fi
+ \boxmaxdepth=\!!zeropoint\relax % toegevoegd
+ \ifdim\floattextheight<\floatheight
+ \floattextheight=\floatheight
+ \fi
+ \setbox\floattext=\vbox to \floattextheight}
+ {\setbox\floattext=\vbox}%
+ \bgroup
+ \blanko[\v!blokkeer]
+ \hsize\floattextwidth
+ \ignorespaces}
+
+\def\dodostoptextfloat[#1]%
+ {\egroup
+ \doifnotinset{\v!lang}{#1}%
+ {\ifdim\ht\floattext<\floatheight
+ \floattextheight=\floatheight
+ \else
+ \floattextheight=\ht\floattext
+ \fi}%
+ \setbox\floatbox=\vbox to \floattextheight
+ {\hsize\floatwidth
+ \box\floatbox
+ \vfill}%
+ \setbox\floattext=\vbox to \floattextheight
+ {\hsize\floattextwidth
+ \doifinsetelse{\v!laag}{#1}
+ {\vfill
+ \box\floattext
+ \doifinset{\c!offset}{#1}{\witruimte\blanko}}
+ {\doifinsetelse{\v!midden}{#1}
+ {\vfill
+ \box\floattext
+ \vfill}
+ {\doifinset{\v!offset}{#1}{\witruimte\blanko}%
+ \box\floattext
+ \vfill}}}%
+ \doifinsetelse{\v!rechts}{#1}%
+ {\setbox\floatbox=\hbox to \hsize
+ {\box\floattext
+ \hfill
+ \box\floatbox}}
+ {\setbox\floatbox=\hbox to \hsize
+ {\box\floatbox
+ \hfill
+ \box\floattext}}%
+ \baselinecorrection
+ \witruimte
+ \blanko[\@@bkvoorwit]%
+ \doifnotinset{\v!lang}{#1}%
+ {\dp\floatbox=\openstrutdepth}% dp\strutbox}% % toegevoegd
+ \box\floatbox
+ \blanko[\@@bknawit]%
+ \doinsertfloatinfo}
+
+\def\somefacefloat[#1]% links, rechts, midden, hoog, midden, laag
+ {\checkwaitingfloats{#1}%
+ \startnaast\box\floatbox\stopnaast
+ \doinsertfloatinfo}
+
+\def\somepagefloat[#1]% links, rechts, midden, hoog, midden, laag
+ {\checkwaitingfloats{#1}%
+ \vbox to \teksthoogte
+ {\doifnotinset{\v!hoog}{#1}{\vfill}%
+ \box\floatbox
+ \doifnotinset{\v!laag}{#1}{\vfill}}%
+ \doinsertfloatinfo
+ \pagina} % toegevoegd
+
+\def\someelsefloat[#1]%
+ {\doifinsetelse{\v!hier}{#1}
+ {\doifinsetelse{\v!altijd}{#1}
+ {\pagina[\v!voorkeur]%
+ \doroomfloat
+ \ifroomforfloat
+ \doexecfloat
+ \else
+ \showmessage{\m!floatblocks}{9}{}%
+ \doreversesavefloat
+ \fi}
+ {\ifsomefloatwaiting
+ \dosavefloat
+ \else
+ \pagina[\v!voorkeur]%
+ \doroomfloat
+ \ifroomforfloat
+ \doexecfloat
+ \else
+ \dosavefloat
+ \fi
+ \fi}}
+ {\doifinsetelse{\v!altijd}{#1}
+ {\doroomfloat
+ \ifroomforfloat
+ \processallactionsinset
+ [#1]
+ [ \v!boven=>\dotopfloat,
+ \v!onder=>\dobotfloat,
+ \s!default=>\doexecfloat]%
+ \else
+ \showmessage{\m!floatblocks}{9}{}%
+ \doreversesavefloat
+ \fi}
+ {%\ifsomefloatwaiting % from before the renumbering time
+ % \doflushfloats
+ %\fi
+ \doroomfloat
+ \ifroomforfloat
+ \processallactionsinset
+ [#1]
+ [ \v!boven=>%%\ifdim\topinserted=\!!zeropoint\relax
+ %\iffloatsonpage
+ % \dosavefloat
+ %\else
+ \dotopfloat
+ %\fi
+ %%\else
+ %% \dosavefloat
+ %%\fi
+ ,
+ \v!onder=>%\ifdim\botinserted=\!!zeropoint\relax
+ \dobotfloat
+ %\else
+ % \dosavefloat
+ %\fi
+ ,
+ \s!default=>\doexecfloat]%
+ \else
+ \dosavefloat
+ \fi}}}
+
+% De onderstaande macro wordt gebruikt bij de macros
+% voor het plaatsen van tabellen en figuren (klopt niet
+% meer).
+%
+% \dofloat {plaats} {label1} {label2} {kader}
+%
+% \docompletefloat {nummer} {referentie} {lijst}
+% {plaats} {label1} {label2} {inhoud}
+%
+% \box\floatbox inhoud+referentie
+%
+% \do???float#1 #1 = boxnummer
+%
+% \ifinsidefloat wordt \true gezet voor \docompletefloat en \false
+% na float plaatsen; kan worden gebruikt om in
+% andere commando's witruimte te onderdrukken
+
+\newdimen\floattopskip \floattopskip=12pt
+\newdimen\floatbottomskip \floatbottomskip=12pt
+\newdimen\floatsideskip \floatsideskip=12pt
+
+\newdimen\sidefloattopskip \sidefloattopskip=\floattopskip
+\newdimen\sidefloatbottomskip \sidefloatbottomskip=\floatbottomskip
+\def\sidefloattopoffset {\openstrutdepth} % {\dp\strutbox}
+
+\newcount\noftopfloats \noftopfloats=2
+\newcount\nofbotfloats \nofbotfloats=0
+
+\def\calculatefloatskips%
+ {{\def\calculatefloatskips##1##2%
+ {\doifelsenothing{##2}
+ {\global##1=\!!zeropoint}
+ {\doifelse{##2}{\v!geen}
+ {\global##1=\!!zeropoint}
+ {\setbox0=\vbox{\witruimte\@EA\blanko\@EA[##2]}%
+ \global##1=\ht0}}}%
+ \calculatefloatskips\floattopskip\@@bkvoorwit
+ \calculatefloatskips\floatbottomskip\@@bknawit
+ \calculatefloatskips\sidefloattopskip\@@bkzijvoorwit
+ \calculatefloatskips\sidefloatbottomskip\@@bkzijnawit
+ \def\sidefloattopoffset{\openstrutdepth}% {\dp\strutbox}%
+ \global\floatsideskip=\@@bkmarge\relax
+ \global\noftopfloats=\@@bknboven\relax
+ \global\nofbotfloats=\@@bknonder\relax}}
+
+\newif\ifinsidefloat
+
+\def\floatcaptionsuffix{} % an optional suffix
+\def\floatcaptionnumber{} % a logical counter
+
+\def\dosetfloatcaption#1#2#3%
+ {\def\dofloattekst%
+ {{\doattributes{\??kj#1}{#3}}}%
+ \doifelsevalue{\??kj#1\c!nummer}{\v!ja}
+ {\def\dofloatnummer%
+ {{\xdef\floatcaptionnumber{#1}%
+ \hbox{\doattributes{\??kj#1\v!kop}{\strut#2\floatcaptionsuffix}}}%
+ \ConvertToConstant\doifnot{#3}{}
+ {\tfskip
+ \emergencystretch=.5em}}}
+ {\let\dofloatnummer=\empty}}
+
+\def\putborderedfloat#1\in#2\\%
+ {\setbox#2=\vbox
+ {\localframed
+ [\??fl#1]
+ [\c!breedte=\@@bkbreedte,
+ \c!hoogte=\@@bkhoogte,
+ \c!offset=\@@bkoffset]%
+ {\box\floatbox}}}
+
+\newbox\captionbox
+
+\def\putcompletecaption%
+ {\mindermeldingen
+ \begstrut\dofloatnummer\dofloattekst\endstrut}
+
+\def\dosetpagfloat#1#2#3#4%
+ {\bgroup
+ \forgetall
+ %\showcomposition
+ \putborderedfloat#4\in4\\%
+ \def\locatefloat%
+ {\doregelplaats\@@bkplaats}%
+ \ConvertToConstant\doifelse{#3}{\v!geen}
+ {\global\setbox\floatbox=\vbox
+ {\locatefloat{\box4}}} % pas op, nog wd groter dan hsize
+ {\dosetfloatcaption{#4}{#2}{#3}%
+% at another level, prevents reprocessing of footnotes
+\setbox\captionbox=\hbox{\putcompletecaption}%
+\def\putcompletecaption{\unhcopy\captionbox}%
+%
+ \setbox2=\hbox
+ {\forgetall
+ \putcompletecaption}%
+ \doifinsetelse{\@@kjkjplaats}{\v!hoog,\v!midden,\v!laag}
+ {\dimen0=\hsize
+ \advance\dimen0 by -\wd4\relax
+ \advance\dimen0 by -\@@bkmarge\relax % \was tfskipsize\relax
+ \ifdim\wd2>\dimen0\relax
+ \dimen2=1.3\dimen0\relax
+ \ifdim\wd2<\dimen2\relax
+ \dimen0=0.8\dimen0\relax
+ \fi
+ \fi
+ \setbox2=\vbox
+ {\forgetall
+ \hsize=\dimen0\relax
+ \raggedright
+ \begstrut\dofloatnummer
+ \ifx\@@kjkjtussen\empty \else
+ \unskip\@@kjkjtussen
+ \fi
+ \dofloattekst
+ \endstrut}}
+ {\doifelse{\@@kjkjbreedte}{\v!max}
+ {\dosetraggedbox{\@@kjkjuitlijnen}%
+ \setbox2=\raggedbox
+ {\hsize\wd4\relax
+ \putcompletecaption}}
+ {\ifdim\wd2>\wd4\relax
+ \doifelse{\@@kjkjbreedte}{\v!passend}
+ {\ifdim\wd4<15\korpsgrootte\relax
+ \dimen0=15\korpsgrootte\relax
+ \else
+ \dimen0=\wd4\relax
+ \fi
+ \ifdim\wd4>\hsize
+ \setbox0=\vbox
+ {\forgetall
+ \hsize=1.0\wd4
+ \putcompletecaption}%
+ \ifdim\ht0>\lineheight\relax
+ \setbox2=\vbox
+ {\forgetall
+ \hsize=0.9\wd4
+ \putcompletecaption}%
+ \fi
+ \else
+ \setbox0=\vbox
+ {\forgetall
+ \dimen2=1.5\dimen0\relax
+ \ifdim\dimen2<\hsize
+ \hsize=\dimen2\relax
+ \fi
+ \putcompletecaption}%
+ \ifdim\ht0>\lineheight\relax
+ \setbox2=\vbox
+ {\forgetall
+ \dimen2=1.2\dimen0\relax
+ \ifdim\dimen2<\hsize
+ \hsize=\dimen2\relax
+ \fi
+ \putcompletecaption}%
+ \fi
+ \fi}
+ {\dosetraggedbox{\@@kjkjuitlijnen}%
+ \setbox2=\raggedbox
+ {\hsize\@@kjkjbreedte
+ \putcompletecaption}}%
+ \fi}}%
+ \global\setbox\floatbox=\vbox
+ {\processaction
+ [\@@kjkjplaats]
+ [ \v!boven=>\locatefloat{\copy2}%
+ \@@kjkjtussen
+ \locatefloat{\copy4},
+ \v!onder=>\locatefloat{\copy4}%
+ \@@kjkjtussen
+ \locatefloat{\copy2},
+ \v!hoog=>\locatefloat
+ {\doifelse{\@@bkplaats}{\v!links}
+ {\copy4
+ \tfskip
+ \vbox to\ht4{\@@kjkjtussen\copy2\vfill}}
+ {\vbox to\ht4{\@@kjkjtussen\copy2\vfill}%
+ \tfskip
+ \copy4}},
+ \v!laag=>\locatefloat
+ {\doifelse{\@@bkplaats}{\v!links}
+ {\copy4
+ \tfskip
+ \vbox to\ht4
+ {\vfill\copy2\@@kjkjtussen}}
+ {\vbox to\ht4
+ {\vfill\copy2\@@kjkjtussen}%
+ \tfskip
+ \copy4}},
+ \v!midden=>\locatefloat
+ {\doifelse{\@@bkplaats}{\v!links}
+ {\copy4
+ \tfskip
+ \vbox to\ht4{\vfill\copy2\vfill}}
+ {\vbox to\ht4{\vfill\copy2\vfill}%
+ \tfskip
+ \copy4}},
+ \v!geen=>\locatefloat{\copy4}]}}%
+% \ifdim\wd2>\wd4
+% \global\wd\floatbox=\wd2
+% \else
+% \global\wd\floatbox=\wd4
+% \fi
+\ifdim\wd4>\hsize
+ \global\setbox\floatbox=\hbox to \wd4{\hss\box\floatbox\hss}%
+\fi
+ \egroup}
+
+\def\dosetparfloat#1#2#3#4%
+ {\bgroup
+ %\showcomposition
+ \forgetall
+ \putborderedfloat#4\in4\\
+ \ConvertToConstant\doifelse{#3}{\v!geen}
+ {\global\setbox\floatbox=\vbox{\box4}}
+ {\dosetfloatcaption{#4}{#2}{#3}%
+ \setbox2=\hbox
+ {\forgetall
+ \putcompletecaption}%
+ \doifelse{\@@kjkjbreedte}{\v!max}
+ {\dosetraggedbox{\@@kjkjuitlijnen}%
+ \setbox2=\raggedbox
+ {\hsize\wd4
+ \putcompletecaption}}
+ {\doifelse{\@@kjkjbreedte}{\v!passend}
+ {\ifdim\wd2>\wd4\relax
+ \setbox2=\vbox
+ {\forgetall
+ \hsize\wd4
+ \putcompletecaption}%
+ \else
+ \setbox2=\hbox to \wd4
+ {\hss\box2\hss}%
+ \fi}
+ {\dosetraggedbox{\@@kjkjuitlijnen}%
+ \setbox2=\raggedbox
+ {\hsize\wd4
+ \putcompletecaption}}}%
+ \global\setbox\floatbox=\vbox
+ {\processaction
+ [\@@kjkjplaats]
+ [ \v!boven=>\box2
+ \@@kjkjtussen
+ \box4,
+ \v!onder=>\box4
+ \@@kjkjtussen
+ \box2,
+ \v!geen=>\box4]}}%
+ \egroup}
+
+\newif\ifparfloat
+
+\long\def\dosetfloatbox#1#2#3#4%
+ {\ifvisible
+ \par
+ \doifcommonelse
+ {#1}{\v!links,\v!rechts,\v!inlinker,\v!inrechter,\v!inmarge}
+ {\global\parfloattrue}
+ {\global\parfloatfalse}%
+ \ifbinnenkolommen
+ \global\parfloatfalse
+ \fi
+ \edef\@@kjkjbreedte {\getvalue{\??kj#4\c!breedte}}%
+ \def \@@kjkjtussen {\getvalue{\??kj#4\c!tussen}}% geen \edef
+ \edef\@@kjkjplaats {\getvalue{\??kj#4\c!plaats}}%
+ \edef\@@kjkjuitlijnen {\getvalue{\??kj#4\c!uitlijnen}}%
+ \ifparfloat
+ \dosetparfloat{#1}{#2}{#3}{#4}%
+ \else
+ \dosetpagfloat{#1}{#2}{#3}{#4}%
+ \fi
+ \global\floatheight=\ht\floatbox
+ \global\advance\floatheight by \dp\floatbox
+ \global\floatwidth=\wd\floatbox
+ \global\advance\totalnoffloats by 1\relax
+ \doifnotinset{\v!marge}{#1} % gaat namelijk nog fout
+ {\setbox\floatbox=\vbox
+ {\parindent\!!zeropoint
+ \ifvoorlopig
+ \inlinker{\framed{\infofont\the\totalnoffloats}}%
+ \fi
+ \box\floatbox}}%
+ \wd\floatbox=\floatwidth
+ \dimen0=\floatheight
+ \advance\dimen0 by \lineheight
+ \ifdim\dimen0<\teksthoogte
+ \else
+ \global\floatheight=\teksthoogte
+ \global\advance\floatheight by -\lineheight
+ \ht\floatbox=\floatheight
+ \dp\floatbox=\!!zeropoint
+ \showmessage{\m!floatblocks}{10}{\the\totalnoffloats}%
+ \fi
+ \fi}
+
+\def\dogetfloatbox#1%
+ {\ifvisible
+ \def\next##1{\global\floatsonpagetrue\def\next{##1}}%
+ \processfirstactioninset
+ [#1]
+ [ \v!hier=>\next{\someelsefloat[#1]},
+ \v!forceer=>\next{\somefixdfloat[#1]},
+ \v!links=>\next{\somesidefloat[#1]},
+ \v!rechts=>\next{\somesidefloat[#1]},
+ \v!tekst=>\next{\sometextfloat[#1]},
+ \v!boven=>\def\next{\someelsefloat[#1]}, % !
+ \v!onder=>\next{\someelsefloat[#1]},
+ \v!marge=>\def\next{\somenextfloat[#1]}, % !
+ \v!pagina=>\next{\somepagefloat[#1]},
+ \v!naast=>\next{\somefacefloat[#1]},
+ \v!inmarge=>\next{\somesidefloat[#1]},
+ \v!inlinker=>\next{\somesidefloat[#1]},
+ \v!inrechter=>\next{\somesidefloat[#1]},
+ \s!default=>\next{\someelsefloat[\v!hier,#1]},
+ \s!unknown=>\next{\someelsefloat[\v!hier,#1]}]%
+ \next
+ \fi}
+
+\long\def\dofloat#1#2#3#4%
+ {\dosetfloatbox{#1}{#2}{#3}{#4}%
+ \dogetfloatbox{#1}}%
+
+\long\def\docompletefloat#1#2#3#4#5#6#7%
+ {\flushsidefloats
+ \calculatefloatskips
+ \bgroup
+ \global\setbox\floatbox=\vbox{#7}%
+ \dimen0=\ht\floatbox
+ \advance\dimen0 by \dp\floatbox
+ \ifdim\dimen0=\!!zeropoint\relax
+ \showmessage{\m!floatblocks}{11}{}%
+ \global\setbox\floatbox=\vbox{\getvalue{\e!lege#3}}%
+ \fi
+ \ConvertToConstant\doifelse{#6}{\v!geen}
+ {\global\setbox\floatbox=\ruledvbox
+ {\unvbox\floatbox
+ \vss % gets rid of the depth
+ \rawpagereference{\s!flt}{#2}}%
+ \egroup\dofloat{#4}{}{#6}{#1}}
+ {\doifelsevalue{\??kj#1\c!nummer}{\v!ja}
+ {\verhoognummer[#1]%
+ \maakhetnummer[#1]%
+ \global\setbox\floatbox=\vbox
+ {\unvbox\floatbox % no \vss, keep the depth
+ \dofloatreference
+ \redofloatorder{#1}%
+ \rawreference{\s!flt}{#2}{\hetnummer}%
+ \doschrijfnaarlijst{#3}{\hetnummer}{#6}{#3}}%
+ \egroup\dofloat{#4}{#5\hetnummer}{#6}{#1}}
+ {\global\setbox\floatbox=\vbox
+ {\unvbox\floatbox % no \vss, keep the depth
+ \rawpagereference{\s!flt}{#2}}%
+ \egroup\dofloat{#4}{}{#6}{#1}}}%
+ \global\insidefloatfalse}
+
+\def\plaatsvolledig#1#2#3#4% kop, ref, tit, do
+ {#1[#2]{#3}%
+ #4%
+ \pagina[\v!ja]}
+
+%I n=Figuren
+%I c=\plaatsfiguur,\reserveerfiguur,\startfiguurtekst
+%I c=\leegfiguur,\volledigelijstmetfiguren
+%I c=\plaatstabel,\reserveertabel,\starttabeltekst
+%I c=\legetabel,\volledigelijstmettabellen
+%I
+%I Figuren en tabellen (gebruik ..tabel.. in plaats van
+%I ..figuur..) kunnen in de tekst worden geplaatst met het
+%I commando:
+%I
+%I \plaatsfiguur[plaats][referentie]{titel}{figuur}
+%I
+%I Als voorkeur kan worden opgegeven 'hier', 'forceer',
+%I 'pagina', 'boven', 'onder', 'links' en 'rechts'. In plaats
+%I van een titel kan 'geen' worden meegegeven, in dat geval
+%I wordt geen titel geplaatst. Eventueel kan in combinatie
+%I met links en rechts 'lang' worden opgegeven.
+%I
+%I De volgorde kan worden afgedwongen met 'altijd',
+%I bijvoorbeeld [hier,altijd]. In dat geval wordt bij een
+%I volgende run zonodig de nummering aangepast.
+%I
+%I In plaats van een titel kan {geen} worden ingevuld. In
+%I dat geval blijft de titel achterwege.
+%P
+%I Het is mogelijk ruimte voor een figuur te reserveren:
+%I
+%I \reserveerfiguur[hoogte=,breedte=,kader=][voorkeur]
+%I [referentie]{titel}
+%P
+%I Een lijst met figuren kan worden opgeroepen met:
+%I
+%I \plaatslijstmetfiguren
+%I \volledigelijstmetfiguren
+%I
+%I Men kan een tekst naast een figuur zetten met:
+%I
+%I \startfiguurtekst[plaats][referentie]{kop}{figuur}
+%I ...
+%I \stopfiguurtekst
+%I
+%I Mogelijke plaatsen zijn (combinaties van) 'links', 'rechts',
+%I 'hoog', 'laag' en 'midden'. Met 'offset' dwingt men een
+%I verschuiving omlaag van van 1 regel af.
+%I
+%I Zie verder onder plaatsblokken.
+
+%I n=Tabellen
+%I
+%I Zie figuren.
+
+%I n=Intermezzo
+%I
+%I Zie figuren.
+
+%I n=Grafieken
+%I
+%I Zie figuren.
+
+%T n=figuur
+%T m=fig
+%T a=f
+%T
+%T \plaatsfiguur
+%T [hier]
+%T [fig:]
+%T {}
+%T {\naam{?}}
+%T
+
+\definieernummer
+ [\??si]
+ [\c!wijze=\v!per\v!tekst,
+ \c!conversie=\@@siconversie]
+
+\def\stelplaatsbloksplitsenin%
+ {\dodoubleargument\getparameters[\??si]}
+
+% ook (continued)
+
+\def\dosplitsplaatsblok[#1]#2% nog dubbele refs
+ {\ifbinnenkolommen % tzt ook nog figuren splitten
+ % not yet supported
+ \else
+ \bgroup
+ \insidefloattrue
+ \getparameters[\??si][#1]%
+ \resetnummer[\??si]%
+ \def\floatcaptionsuffix{\nummer[\??si]}%
+ \TABLEcaptionheight=\@@siregels\lineheight
+ \dowithnextbox
+ {\forgetall
+ \mindermeldingen
+ \doloop
+ {\setbox2\vsplit\nextbox to \lineheight
+ \setbox2=\vbox{\unvbox2}
+ \ifdim\ht2>\lineheight
+ \verhoognummer[\??si]%
+ \ifnum\ruwenummer[\??si]=1 \ifdim\ht\nextbox=\!!zeropoint
+ \let\floatcaptionsuffix=\empty
+ \fi\fi
+ \bgroup
+ #2{\unvbox2}
+ \egroup
+ \pagina
+ \ifdim\ht\nextbox>\!!zeropoint
+ \verlaagnummer[\floatcaptionnumber]%
+ \fi
+ \fi
+ \ifdim\ht\nextbox>\!!zeropoint\else
+ \expandafter\exitloop
+ \fi}%
+ \egroup}
+ \vbox
+ \fi}
+
+\def\splitsplaatsblok%
+ {\dosingleempty\dosplitsplaatsblok}
+
+%I n=Formules
+%I c=\plaatsformule,\plaatssubformule,\stelformulesin
+%I
+%I Formules kunnen in de tekst worden geplaatst met
+%I het commando:
+%I
+%I \plaatsformule[referentie]subnummer$$formule$$
+%I
+%I Dit commando handelt de witruimtes om de formules af en
+%I plaatst nummers. Als geen nummer nodig is, en dus ook
+%I geen referentie, dan moet met het commando als volgt
+%I gebruiken:
+%I
+%I \plaatsformule-$$...$$ of \plaatsformule[-]$$...$$
+%I
+%I Als het nummer niet moet worden opgehoogd, gebruikt men
+%I
+%I \plaatssubformule[referentie]subnummer$$formule$$
+%P
+%I PAS OP:
+%I
+%I Binnen een aantal wiskundige commando's, zoals
+%I \displaylines, moet men het nummer zelf plaatsen. Dit
+%I kan gebeuren met: \formulenummer of \subformulenummer.
+%I Ook hier kan een [referentie] en een {subnummer} worden
+%I meegegeven.
+%I
+%I \plaatsformule
+%I $$\displaylines
+%I {x \hfill\formulenummer[eerste]{}\cr
+%I y \hfill\cr
+%I z \hfill\formulenummer[derde]{}\cr}
+%I $$
+%P
+%I De wijze waarop formules worden genummerd kan worden
+%I be‹nvloed door het commando:
+%I
+%I \stelformulesin[links=,rechts=,plaats=]
+%I
+%I De nummers kunnen links en rechts worden gezet. Standaard
+%I worden de symbolen ( en ) gebruikt.
+%I
+%I Tussen twee formules kan witruimte worden geforceerd met
+%I het commando:
+%I
+%I \blanko[formule]
+
+\abovedisplayskip = \!!zeropoint\relax
+\abovedisplayshortskip = \!!zeropoint\relax % evt. 0pt minus 3pt
+\belowdisplayskip = \!!zeropoint\relax
+\belowdisplayshortskip = \!!zeropoint\relax % evt. 0pt minus 3pt
+
+\predisplaypenalty = 0
+\postdisplaypenalty = 0 % -5000 gaat mis, zie penalty bij \paragraaf
+
+\doorlabelen
+ [\v!formule]
+ [\c!tekst=\v!formule,
+ \c!wijze=\@@fmwijze,
+ \c!blokwijze=\@@fmblokwijze,
+ \c!plaats=\v!intekst]
+
+\def\stelformulesin%
+ {\dodoubleargument\getparameters[\??fm]}
+
+\def\dodoplaatsformule#1[#2]#3$$#4$$%
+ {\begingroup
+ \setdisplayskips
+ \!!doneafalse
+ \doif{#2}{-}{\!!doneatrue}%
+ \doif{#3}{-}{\!!doneatrue}%
+ \if!!donea % no number
+ \def\complexformulenummer[##1]##2%
+ {}%
+ \def\formulenummer%
+ {\complexorsimpleempty{formulenummer}}%
+ \def\subformulenummer%
+ {\formulenummer}%
+ \snaptomathgrid{$$#4$$}
+ \else
+ \doifelse{#1}{\v!ja}
+ {\def\verhoogformulenummer{\verhoognummer[\v!formule]}}
+ {\let\verhoogformulenummer=\relax}%
+ \def\simpleformulenummer%
+ {\gdef\doeqno{}%
+ \gdef\doleqno{}%
+ \gdef\formulenummer{\doformulenummer}%
+ \doformulenummer[#2]{#3}}%
+ \def\complexformulenummer%
+ {\gdef\doeqno{}%
+ \gdef\doleqno{}%
+ \gdef\formuleummer{\doformulenummer}%
+ \doformulenummer}%
+ \def\formulenummer%
+ {\complexorsimple{formulenummer}}%
+ \def\subformulenummer%
+ {\let\verhoogformulenummer=\relax
+ \complexorsimple{formulenummer}}%
+ \gdef\doleqno{\leqno{\formulenummer}}%
+ \gdef\doeqno{\eqno{\formulenummer}}%
+ \doifelse{\@@fmplaats}{\v!links}
+ {\snaptomathgrid{$$#4\doleqno$$}}
+ {\snaptomathgrid{$$#4\doeqno$$}}
+ \fi
+ \par
+ \ignorespaces
+ \endgroup}
+
+\def\complexdoformulenummer[#1]#2%
+ {\verhoogformulenummer
+ \doifelse{#2}{ }
+ {\def\hetsubnummer{}}
+ {\def\hetsubnummer{#2}}%
+ {\rm\strut\@@fmlinks\lossenummer[\v!formule]\hetsubnummer\@@fmrechts}%
+ \rawreference{\s!for}{#1}{\hetnummer\hetsubnummer}}
+
+\letvalue{\e!start\e!formule}=\undefined
+\letvalue{\e!stop \e!formule}=\undefined
+
+%\def\dodoplaatsstartformule#1[#2]#3\startformule#4\stopformule%
+% {\dodoplaatsformule#1[#2]#3$$#4$$}
+
+\expanded
+ {\def\noexpand\dodoplaatsstartformule##1[##2]##3\csname\e!start\e!formule\endcsname##4\csname\e!stop\e!formule\endcsname%
+ {\noexpand\dodoplaatsformule##1[##2]##3$$##4$$}}
+
+\setvalue{\e!start\e!formule}{\snaptomathgrid\bgroup\setdisplayskips$$}
+\setvalue{\e!stop \e!formule}{$$\egroup}
+
+\def\doplaatsformule#1[#2]#3% % #3 gobbles spaces between [] and $$ or \startformule
+ {\def\redoplaatsformule% % we can't lose {} after $$
+ {\expandafter\ifx\csname\e!start\e!formule\endcsname\next
+ \let\next=\dodoplaatsstartformule
+ \else
+ \let\next=\dodoplaatsformule
+ \fi
+ \next#1[#2]}%
+ \futurelet\next\redoplaatsformule#3}
+
+\def\complexplaatsformule%
+ {\doplaatsformule{\v!ja}}
+
+\def\complexplaatssubformule%
+ {\doplaatsformule{\v!nee}}
+
+\definecomplexorsimpleempty\doformulenummer
+\definecomplexorsimpleempty\plaatsformule
+\definecomplexorsimpleempty\plaatssubformule
+
+%I n=Naast
+%I c=\startnaast,\stelnaastplaatsenin
+%I
+%I Experiment:
+%I
+%I \startnaast
+%I ...
+%I \stopnaast
+%I
+%I \stelnaastplaatsenin[status=]
+%I
+
+% \newbox\facingbox
+% \newbox\facingpage
+%
+% \newdimen\facingboxsize
+% \newdimen\facingpagetotal
+%
+% \facingpagetotal=\!!zeropoint
+%
+% \newif\iffacingpages \facingpagesfalse
+%
+% \def\shipoutfacingpage%
+% {\iffacingpages
+% \setbox\facingpage=\vbox to \zethoogte
+% {\kern\hoofdhoogte
+% \kern\ht\topins % ?
+% \kern\dp\topins % ?
+% \kern\dp\strutbox % checken
+% \box\facingpage
+% \vfill}%
+% \myshipout{\buildpagebody\box\facingpage}%
+% \fi
+% \global\setbox\facingpage=\box\voidb@x
+% \global\facingpagetotal=\!!zeropoint\relax}
+%
+% \def\flushfacingpage%
+% {\penalty-\!!tenthousand
+% \global\facingpagetotal=\facingboxsize
+% \setbox\facingpage=\vbox{\box\facingbox}}
+%
+% \def\startnaast#1\stopnaast%
+% {\iffacingpages
+% \setbox\facingbox=\vbox
+% {\hsize=\zetbreedte\relax
+% #1}%
+% \global\facingboxsize=\ht\facingbox
+% \global\advance\facingboxsize by \dp\facingbox
+% \ifdim\pagetotal<\facingpagetotal
+% \dimen2=\facingpagetotal
+% \advance\dimen2 by -\pagetotal
+% \vskip\dimen2\relax
+% \else
+% \dimen2=\!!zeropoint\relax
+% \fi
+% \dimen0=\pagetotal
+% \advance\dimen0 by \facingboxsize
+% \ifdim\dimen0>\pagegoal
+% \flushfacingpage
+% \else
+% \global\advance\facingpagetotal by \facingboxsize
+% \ifdim\facingpagetotal>\pagegoal
+% \flushfacingpage
+% \else
+% \setbox\facingpage=\vbox
+% {\offinterlineskip
+% \mindermeldingen
+% \ht\facingpage=\!!zeropoint
+% \ifdim\pagetotal=\topskip
+% \vskip-\topskip
+% \fi
+% \box\facingpage
+% \advance\dimen2 by \pagetotal
+% \vskip\dimen2\relax
+% \ifdim\facingpagetotal>\facingboxsize
+% \vskip\tussenwit
+% \fi
+% \box\facingbox}%
+% \fi
+% \fi
+% \fi}
+%
+% \def\dostelnaastplaatsenin[#1]%
+% {\getparameters[\??np][#1]%
+% \doifelse{\@@npstatus}{\v!start}
+% {\global\facingpagestrue}
+% {\global\facingpagesfalse}}
+%
+% \def\stelnaastplaatsenin%
+% {\dosingleargument\dostelnaastplaatsenin}
+%
+% \def\naastpagina%
+% {\shipoutfacingpage}
+%
+% \def\facefloat% redefined
+% {\startnaast\box\floatbox\stopnaast}
+
+\newbox\facingbox
+\newbox\facingpage
+
+\newif\iffacingpages \facingpagesfalse
+
+\def\shipoutfacingpage%
+ {\iffacingpages
+ \ifnum\realpageno>1
+ \bgroup
+ \pagebodyornamentsfalse
+ \setbox\facingpage=\vbox to \zethoogte
+ {\unvbox\facingpage\vfil}%
+ \myshipout{\buildpagebody\box\facingpage}%
+ \egroup
+ \else
+ \global\setbox\facingpage=\box\voidb@x
+ \fi
+ \fi}
+
+\def\naastpagina%
+ {\shipoutfacingpage}
+
+\def\facefloat% redefined
+ {\startnaast\box\floatbox\stopnaast}
+
+\def\startnaast% beter: \dowithnextbox
+ {\iffacingpages
+ \global\setbox\facingbox=\ruledvbox
+ \bgroup
+ \hsize=\zetbreedte
+ \else
+ \def\next{\gobbleuntil\stopnaast}%
+ \expandafter\next
+ \fi}
+
+\def\stopnaast%
+ {\egroup
+ \global\setbox\facingpage=\vbox
+ {\ifvoid\facingpage
+ \vskip\openstrutdepth % \dp\strutbox
+ \else
+ \unvbox\facingpage
+ \fi
+ \box\facingbox
+ \blanko}}
+
+\def\dostelnaastplaatsenin[#1]%
+ {\getparameters[\??np][#1]%
+ \doifelse{\@@npstatus}{\v!start}
+ {\global\facingpagestrue}
+ {\global\facingpagesfalse}}
+
+\def\stelnaastplaatsenin%
+ {\dosingleargument\dostelnaastplaatsenin}
+
+%I n=Lijsten
+%I c=\definieerlijst,\stellijstin,\plaatslijst
+%I
+%I Er kunnen lijsten worden aangemaakt en opgeroepen. Een
+%I lijst wordt gedefinieerd met:
+%I
+%I \definieerlijst[naam]
+%I
+%I en zonodig ingesteld met:
+%I
+%I \stellijstin[naam][status=,variant=,marge=,breedte=,
+%I scheider=,afstand=,paginanummer=,deelnummer=,
+%I titeluitlijnen=,label=,letter=,tekstletter=,nummerletter=,
+%I paginaletter=,paginaovergangen=,voor=,na=,niveau=,
+%I criterium=,symbool=,prefix=,links=,rechts=]
+%I
+%I De instellingen mogen ook direkt worden opgegeven:
+%I
+%I \definieerlijst[naam][instellingen]
+%I
+%I Ook kunnen kenmerken van andere lijsten worden overgenomen:
+%I
+%I \definieerlijst[naam][andere naam]
+%P
+%I De vorm van de lijst wordt onder meer bepaald door de variant
+%I (a,b,c). In grote lijnen ziet een lijst er als volgt uit:
+%I
+%I <marge+breedte+scheider+afstand> <variant>
+%I
+%I Mogelijke varianten zijn:
+%I
+%I variant a : nummer - titel - pagina
+%I variant b : nummer - titel - spaties - pagina
+%I variant c : nummer - titel - punten - pagina
+%I variant d : nummer - titel - pagina (doorlopend)
+%P
+%I Een of meer lijsten kunnen wordt opgeroepen met:
+%I
+%I \plaatslijst[naam,naam,...]
+%I
+%I Standaard zijn lijsten gedefinieerd voor deel, hoofdstuk,
+%I paragraaf, subparagraaf en subsubparagraaf. Deze lijsten
+%I zijn dus afzonderlijk in te stellen. Deze lijsten zijn
+%I gegroepeerd tot een samengestelde lijst (zie elders).
+%I
+%I De layout van een lijst kan worden beinvloed door
+%I commando's tussen te voegen met:
+%I
+%I \schrijftussenlijst[naam]{commandos}
+%I
+%I Voor eigen gebruik is \iflijstgeplaatst beschikbaar.
+%P
+%I Gevorderde gebruikers kunnen eigen lijstcommando's maken.
+%I Deze commando's kunnen worden toegekend met:
+%I
+%I [...,nummercommando=,tekstcommando=,paginacommando=,...]
+%I
+%I en hebben de vorm
+%I
+%I \commando{argument}
+%I
+%I bijvoorbeeld
+%I
+%i nummercommando=\omlijnd
+%I
+%I Volledige vrijheid krijgt men met de instelling
+%I
+%I variant=geen
+
+% \getlistlevel[hoofdstuk]\test{0} \test
+
+\def\getlistlevel[#1]#2#3% [list] \variable \default
+ {\doifdefinedelse{\??ko#1\c!sectie}
+ {\edef#2{\getvalue{\??ko#1\c!sectie}}%
+ \doifdefinedelse{\??se#2\c!niveau}
+ {\edef#2{\getvalue{\??se#2\c!niveau}}}
+ {\edef#2{#3}}}
+ {\edef#2{#3}}}
+
+\def\doschrijfnaarlijst#1#2#3#4%
+ {\doifvalue{\??li#1\c!status}{\v!start}
+ {\begingroup
+ \thisisnextinternal{#1}%
+ %
+ % Dit gaat goed als #2 geen commando's bevat. Dit is
+ % bij interactieve teksten echter soms wel het geval.
+ % Vandaar dat we dit optioneel moeten maken, bijvoorbeeld
+ % met \stellijstin[referentie=ja].
+ %
+ \ExpandFirstAfter\processaction
+ [\getvalue{\??li#1\c!expansie}]
+ [ \v!ja=>{\edef\ascii{#3}},
+ \v!commando=>{\convertcommand#3\to\ascii},
+ \s!unknown=>{\convertargument#3\to\ascii}]%
+ \makesectionformat
+ \doifelse{\@@nmstatus}{\v!start}
+ {\def\dopaginanummer{\noexpand\pagenumber}}
+ {\def\dopaginanummer{0}}%
+ \edef\schrijfwegnaarlijst%
+ {\writeutilitycommand%
+ {\listentry%
+ {#1}%
+ {\nextinternalreference}%
+ {#2}%
+ {\ascii}%
+ {\sectionformat::\dopaginanummer}%
+ {\noexpand\realfolio}}}%
+ \schrijfwegnaarlijst
+ \endgroup}}
+
+\def\doschrijftussenlijst#1#2%
+ {\doif{\getvalue{\??li#1\c!status}}{\v!start}
+ {\begingroup
+ \convertargument#2\to\ascii
+ \makesectionformat
+ \doifelse{\@@nmstatus}{\v!start}
+ {\def\dopaginanummer{\noexpand\pagenumber}}
+ {\def\dopaginanummer{0}}%
+ \edef\schrijfwegnaarlijst%
+ {\writeutilitycommand%
+ {\listbetween%
+ {#1}%
+ {\ascii}%
+ {\sectionformat::\dopaginanummer}%
+ {\noexpand\realfolio}}}%
+ \schrijfwegnaarlijst
+ \endgroup}}
+
+\def\listentry#1%
+ {\executeifdefined{#1\c!lijst}\gobblefivearguments}
+
+\def\listbetween#1%
+ {\executeifdefined{#1\c!tussen}\gobblethreearguments}
+
+\def\@@livarianta% nr - tit - pag
+ {\def\lijstfill{\hskip 1.25em}%
+ \def\lijstskip{0em}}
+
+\def\@@livariantb% nr - tit - fill - pag
+ {\def\lijstfill{\hfill}%
+ \def\lijstskip{5em}}
+
+\def\@@livariantc% nr - tit - dots - pag
+ {\def\lijstfill{\leaders\hbox to .5em{\hss.\hss}\hfill\hskip.5em}%
+ \def\lijstskip{5em}}
+
+\def\@@livariant%
+ {\lijstvariantb}
+
+\@@livariantb
+
+\def\dostellijstin[#1][#2]%
+ {\def\docommando##1%
+ {\getparameters[\??li##1][#2]
+ \preparepaginaprefix{\??li##1}}%
+ \processcommalist[#1]\docommando}
+
+\def\stellijstin%
+ {\dodoubleargument\dostellijstin}
+
+\def\dodosetlijst#1%
+ {\setvalue{#1\c!tussen}{\dotussenlijst{#1}}%
+ \setvalue{#1\c!lijst}{\dolijstelement{#1}}}
+
+\def\dodoresetlijst#1%
+ {\setvalue{#1\c!tussen}{\gobblefourarguments{#1}}%
+ \setvalue{#1\c!lijst}{\gobblesixarguments{#1}}}
+
+%\def\dodoresetlijst#1%
+% {\setvalue{#1\c!tussen}{\gobblethreearguments}%
+% \setvalue{#1\c!lijst}{\gobblefivearguments}}
+
+\def\dodefinieerlijst[#1][#2][#3]%
+ {\presetlocalframed[\??li#1]%
+ \getparameters
+ [\??li#1]
+ [\c!hoogte=\v!ruim,
+ \c!diepte=\v!ruim,
+ \c!offset=0.25em,
+ %
+ \c!status=\v!start,
+ \c!koppeling=\v!uit,
+ \c!criterium=\v!lokaal,
+ \c!breedte=3em,
+ \c!variant=\c!b,
+ \c!letter=\v!normaal,
+ \c!tekstletter=\getvalue{\??li#1\c!letter},
+ \c!nummerletter=\getvalue{\??li#1\c!letter},
+ \c!paginaletter=\getvalue{\??li#1\c!letter},
+ \c!kleur=,
+ \c!tekstkleur=\getvalue{\??li#1\c!kleur},
+ \c!nummerkleur=\getvalue{\??li#1\c!kleur},
+ \c!paginakleur=\getvalue{\??li#1\c!kleur},
+ \c!nummercommando=\lijstnummercommando,
+ \c!tekstcommando=\lijsttekstcommando,
+ \c!paginacommando=\lijstpaginacommando,
+ \c!paginanummer=\v!ja,
+ \c!paginaovergangen=,
+ \c!marge=\!!zeropoint,
+ \c!titeluitlijnen=,
+ \c!voor=,
+ \c!na=,
+ \c!symbool=,
+ \c!interactie=\v!sectienummer,
+ \v!deel\c!nummer=\v!ja, % nodig ?
+ \c!label=\v!nee,
+ \c!afstand=\!!zeropoint,
+ \c!scheider=]%
+ \ConvertToConstant\doifinstringelse{=}{#2}
+ {\getparameters[\??li#1][#2]}
+ {\ConvertToConstant\doifnot{#2}{}
+ {\copyparameters
+ [\??li#1][\??li#2]
+ [\c!status,\c!breedte,\c!variant,\c!letter,\c!kleur,
+ \c!tekstletter,\c!tekstkleur,\c!tekstcommando,
+ \c!paginaletter,\c!paginacommando,\c!paginakleur,
+ \c!nummerletter,\c!nummerkleur,\c!nummercommando,
+ \c!paginanummer,\c!paginaovergangen,\c!marge,\c!symbool,
+ \c!titeluitlijnen,\c!voor,\c!na,\v!deel\c!nummer,\c!label]%
+ \getparameters[\??li#1][#3]}}%
+ \addutilityreset{#1}%
+ \setvalue{\s!set#1}%
+ {\dodosetlijst{#1}}%
+ \setvalue{\s!reset#1}%
+ {\dodoresetlijst{#1}}}
+
+\def\definieerlijst%
+ {\dotripleempty\dodefinieerlijst}
+
+\def\iflijstgeplaatst{\ifutilitydone}
+
+\def\dobeginoflist%
+ {\begingroup
+ \startopelkaar[\v!blanko]}
+
+\def\doendoflist%
+ {\stopopelkaar
+ \endgroup}
+
+\def\doplaatslijst[#1][#2]%
+ {\dobeginoflist
+ \getfromcommalist[#1][1]%
+ \let\firstlistelement=\commalistelement
+ \dostellijstin[#1][#2]%
+ \doifvalue{\??li\firstlistelement\c!koppeling}{\v!aan}
+ {\startlistreferences{#1}}%
+ \dosettoclevel{\getvalue{\??li\firstlistelement\c!criterium}}%
+ \doutilities{#1}{\jobname}{#1}{}{\par}%
+ \stoplistreferences{#1}%
+ \doendoflist}
+
+\def\plaatslijst%
+ {\dodoubleempty\doplaatslijst}
+
+\def\dodovolledigelijst[#1][#2][#3]% enkelvoud, meervoud, instellingen
+ {\systemsuppliedtitle[#2]{\headtext{#2}}
+ \doplaatslijst[#1][#3]}
+
+\def\dovolledigelijst[#1][#2]%
+ {\dodovolledigelijst[#1][#1][#2]}
+
+\def\volledigelijst%
+ {\dodoubleempty\dovolledigelijst}
+
+\def\lijstelementen{} % bevat lijst met paginaovergangen
+\def\lijstnummercommando#1{#1} % geen strut i.v.m. intractieve versie
+\def\lijsttekstcommando#1{\begstrut#1\endstrut}
+\def\lijstpaginacommando#1{\strut#1}
+
+\def\doassigndimen#1#2#3%
+ {\doifinsetelse{#2}{\v!passend,\v!ruim}
+ {#1=#3\relax}
+ {#1=#2\relax}}
+
+\def\dosetlistsymbol#1#2%
+ {\processaction
+ [\getvalue{\??li#1\c!symbool}]
+ [ \v!geen=>\def\listsymbol%
+ {\doassigndimen{\dimen0}{\getvalue{\??li#1\c!breedte}}{1.5em}%
+ \hbox to \dimen0{}},
+ 1=>\def\listsymbol%
+ {\strut$\bullet$},
+ 2=>\def\listsymbol%
+ {\vrule\!!width1em\!!height1ex\!!depth\!!zeropoint},
+ 3=>\def\listsymbol% very slow
+ {{\doassigndimen{\dimen0}{\getvalue{\??li#1\c!breedte}}{1.5em}%
+ \doassigndimen{\dimen2}{\getvalue{\??li#1\c!hoogte}}{1ex}%
+ \doassigndimen{\dimen4}{\getvalue{\??li#1\c!diepte}}{0pt}%
+ \vrule\!!width\dimen0\!!height\dimen2\!!depth\dimen4}},
+ \s!unknown=>\def\listsymbol{\getvalue{\??li#1\c!symbool}},
+ \s!default=>\doifelsevalue{\??li#1\c!prefix}{\v!nee}
+ {\aftersplitstring#2\at.\to\splitlistsymbol}
+ {\def\splitlistsymbol{#2}}% geen \edef ivm enz
+ \def\listsymbol%
+ {\doifvalue{\??li#1\c!label}{\v!ja}{\labeltext{#1}}%
+ \strut\splitlistsymbol
+ \getvalue{\??li#1\c!scheider}}]}
+
+\def\dosomelijstelement#1#2#3{#1 #2 \translatednumber[#3]}
+
+\def\dodolijstelementa{\let\dosomelijstelement\dodofixdlijstelementABC}
+\def\dodolijstelementb{\let\dosomelijstelement\dodofixdlijstelementABC}
+\def\dodolijstelementc{\let\dosomelijstelement\dodofixdlijstelementABC}
+\def\dodolijstelementd{\let\dosomelijstelement\dodofixdlijstelementD}
+\def\dodolijstelemente{\let\dosomelijstelement\dodofixdlijstelementE}
+\def\dodolijstelementf{\let\dosomelijstelement\dodofixdlijstelementF}
+\def\dodolijstelementg{\let\dosomelijstelement\dodofixdlijstelementG}
+
+\setvalue{dodolijstelement\v!geen}{\let\dosomelijstelement\dodofreelijstelement}
+
+% Here I learned something new: \leftskip can be changed
+% within a paragraph and the last one counts. Therefore we
+% cannot use \bgroup's! The placement of the \leftskip
+% assignment and the \endgraf's may not be changed. We have to
+% end the preceding paragraph before changing \leftskip. This is
+% because every listelement sets the \leftskip.
+
+% \strippedcsname\dodolijstelement
+
+\def\dolijstelement#1#2#3#4#5#6% pas op: wordt ook elders gedefinieerd
+ {\doiftoclevelelse[#5]
+ {\getvalue{dodolijstelement\getvalue{\??li#1\c!variant}}%
+ %\showcomposition
+ \let\@@iabreedte=\!!zeropoint % moet boolean worden
+ \bgroup
+ \edef\lijstelementen%
+ {\getvalue{\??li#1\c!paginaovergangen}}%
+ \ExpandSecondAfter\doifinset{#3}{\lijstelementen}%
+ {\showmessage{\m!systems}{14}{#3}%
+ \pagina}%
+ \egroup
+ \mindermeldingen
+ \dosetlistsymbol{#1}{#3}%
+ \dosomelijstelement{#1}{#2}{#3}{#4}{#5}{#6}%
+ \global\utilitydonetrue}
+ {}}
+
+\def\dolistattributes#1#2#3%
+ {\doifvaluesomething{\??li#1#2}
+ {\stelinteractiein[\c!kleur=,\c!contrastkleur=]}%
+ \doattributes
+ {\??li#1#3}}
+
+\def\dodofreelijstelement#1#2#3#4#5#6%
+ {\def\makelijstelement##1##2%
+ {\hbox
+ {\doifelsevalue{\??li#1\c!interactie}{##1}
+ {\setbox0=\hbox{\showcontrastlocation{\??ia}{#6}{##2}}%
+ \gotonextinternal{#1}{#2}{#6}{\copy0}}
+ {##2}}}%
+ \getvalue{\??li#1\c!voor}% can be \hskip
+ \doifdefinedelse{\??li#1\c!commando}
+ {\makelijstelement{\getvalue{\??li#1\c!interactie}}% this forces all
+ {\getvalue{\??li#1\c!commando}%
+ {#3}% geen conversies etc
+ {#4}% geen conversies etc
+ {\paginaprefix\??li#1[#5]%
+ \translatednumber[#5]}}}
+ {\ifvmode\nointerlineskip\fi % recently added
+ \vbox
+ {\forgetall
+ \makelijstelement\v!alles
+ {\makelijstelement\v!sectienummer
+ {\dolistattributes{#1}\c!nummerkleur\c!nummer
+ {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}}%
+ \makelijstelement\v!tekst
+ {\dolistattributes{#1}\c!tekstkleur\c!tekst
+ {\def\\{ }%
+ \dontconvertfont
+ \getvalue{\??li#1\c!tekstcommando}{#4}}}%
+ \doifvalue{\??li#1\c!paginanummer}{\v!ja}
+ {\doifsomething{#5}
+ {\makelijstelement\v!paginanummer
+ {\dolistattributes{#1}\c!paginakleur\c!pagina
+ {\getvalue{\??li#1\c!paginacommando}
+ {\paginaprefix\??li#1[#5]%
+ \translatednumber[#5]}}}}}}}%
+\nointerlineskip % anders verkeerde spatiering bij multi-line
+ \endgraf}%
+ \getvalue{\??li#1\c!na}}
+
+\def\dodofixdlijstelementABC#1#2#3#4#5#6% weeden
+ {\endgraf
+ \leftskip=\getvalue{\??li#1\c!marge}% na de \endgraf !
+ \getvalue{\??li#1\c!voor}%
+ \doifelsenothing{#3}
+ {\doifelsevalue{\??li#1\c!titeluitlijnen}{\v!ja}
+ {\!!widtha=\!!zeropoint}
+ {\!!widtha=\getvalue{\??li#1\c!breedte}}}
+ {\!!widtha=\getvalue{\??li#1\c!breedte}}%
+ \getvalue{\??li\c!variant\getvalue{\??li#1\c!variant}}%
+ \endgraf
+ \def\makelijstelement##1##2%
+ {\doifelsevalue{\??li#1\c!interactie}{##1}
+ {\setbox0=\hbox{\showcontrastlocation{\??ia}{#6}{##2}}%
+ \gotonextinternal{#1}{#2}{#6}{\copy0}}
+ {\hbox{##2}}}%
+ \doifvalue{\??li#1\c!interactie}{\v!tekst} % not supported
+ {\doassign[\??li#1][\c!interactie=\v!alles]}%
+ \makelijstelement\v!alles
+ {\hbox to \hsize
+ {\!!widthb=\hsize
+ \setbox2=\hbox \ifdim\!!widtha>\!!zeropoint to \!!widtha \fi
+ {\makelijstelement\v!sectienummer
+ {\dolistattributes{#1}\c!nummerkleur\c!nummer
+ {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}%
+ \hfill}}%
+ \setbox4=\hbox
+ {\doifvalue{\??li#1\c!paginanummer}{\v!ja}
+ {\doifsomething{#5}
+ {\hbox to 2em
+ {\hfill
+ \makelijstelement\v!paginanummer
+ {\dolistattributes{#1}\c!paginakleur\c!pagina
+ {\getvalue{\??li#1\c!paginacommando}
+ {\paginaprefix\??li#1[#5]%
+ \translatednumber[#5]}}}}}}}%
+ \vbox
+ {\hsize\!!widthb
+ \ifdim\!!widtha<\hsize
+ \hangindent=\wd2
+ \dimen2=\getvalue{\??li#1\c!afstand}%
+ \advance\hangindent by \dimen2
+ \hangafter=1
+ \ifvoid4
+ % we kunnen gewoon afbreken aan het eind
+ \else
+ \ifdim\lijstskip>\!!zeropoint\relax
+ \rightskip=\lijstskip\!!plus10em\relax
+ \parfillskip=-\rightskip
+ \fi
+ \fi
+ \else
+ \dimen2=\!!zeropoint
+ \fi
+ \parindent=\!!zeropoint\relax
+ \leavevmode
+ \box2\relax
+ \hskip\dimen2
+ \bgroup
+ \dolistattributes{#1}\c!tekstkleur\c!tekst
+ {\def\\{ }%
+ \dontconvertfont
+ \getvalue{\??li#1\c!tekstcommando}{#4}}%
+ \egroup
+ \ifvoid4
+ \ifdim\!!widtha<\hsize
+ \hfill\strut
+ \fi
+ \else
+ \nobreak\hskip.5em\lijstfill
+ \box4\relax
+ \relax
+ \fi}%
+ \hss}}%
+\nointerlineskip % anders verkeerde spatiering bij multi-line
+ \endgraf
+ \getvalue{\??li#1\c!na}}
+
+% overrulen interactie kan sneller, bv door hulpconstanten
+% te gebruiken en die te letten
+
+\def\dodofixdlijstelementD#1#2#3#4#5#6%
+ {\leftskip=\getvalue{\??li#1\c!marge}%
+ \bgroup
+ \ifvmode
+ \noindent\leavevmode
+ \fi
+ \doifvalue{\??li#1\c!interactie}{\v!tekst} % not supported
+ {\doassign[\??li#1][\c!interactie=\v!sectienummer]}%
+ \doifvalue{\??li#1\c!interactie}{\v!alles} % not supported
+ {\doassign[\??li#1][\c!interactie=\v!sectienummer]}%
+ \def\makelijstelement##1##2%
+ {\doifelsevalue{\??li#1\c!interactie}{##1}
+ {\setbox0=\hbox{\showcontrastlocation{\??ia}{#6}{##2}}%
+ \gotonextinternal{#1}{#2}{#6}{\copy0}}
+ {\hbox{##2}}}%
+ \setbox4=\hbox
+ {\doifvalue{\??li#1\c!paginanummer}{\v!ja}
+ {\doifsomething{#5}
+ {\makelijstelement\v!paginanummer
+ {\dolistattributes{#1}\c!paginakleur\c!pagina
+ {\getvalue{\??li#1\c!paginacommando}
+ {\paginaprefix\??li#1[#5]%
+ \translatednumber[#5]}}}}}}%
+ \hbox
+ {\getvalue{\??li#1\c!links}%
+ \makelijstelement\v!sectienummer
+ {\dolistattributes{#1}\c!nummerkleur\c!nummer
+ {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}}%
+ \getvalue{\??li#1\c!rechts}%
+ \hskip.5em}%
+ \nobreak
+ \tolerance3500
+ \dolistattributes{#1}\c!tekstkleur\c!tekst
+ {\def\\{ }%
+ \dontconvertfont
+ \getvalue{\??li#1\c!tekstcommando}{#4}}%
+ \ifvoid4\else
+ \nobreak
+ \hskip.75em\relax
+ \nobreak
+ \box4
+ \fi
+ \dimen0=\getvalue{\??li#1\c!afstand}\relax
+ \ifdim\dimen0<1em\relax
+ \hskip1em\!!plus1em\!!minus.25em\relax
+ \else
+ \hskip\dimen0\!!plus.5\dimen0\!!minus.25\dimen0\relax
+ \fi
+ \egroup}
+
+\def\dodofixdlijstelementE#1%
+ {\dodofixdlijstelementEFG{\localframed[\??li#1][\c!kleur=]}{#1}}
+
+\def\dodofixdlijstelementF%
+ {\dodofixdlijstelementEFG\relax}
+
+\def\dodofixdlijstelementG#1%
+ {\dodofixdlijstelementEFG\regelmidden{#1}}
+
+\def\dodofixdlijstelementEFG#1#2#3#4#5#6#7%
+ {\hbox
+ {\let\\=\relax
+ \dontconvertfont
+ \setbox0=\hbox
+ {#1{\dolocationattributes{\??li#2}
+ {\ignorespaces\showcontrastlocation{\??ia}{#7}{#5}}}}%
+ \gotonextinternal{#2}{#3}{#7}{\copy0}}}
+
+\def\schrijfnaarlijst[#1]#2#3%
+ {\doifsomething{#1}
+ {\convertargument#2\to\firstlistelement
+ \@EA\doschrijfnaarlijst\@EA{#1}{\firstlistelement}{#3}{\v!kop}}}
+
+\def\dotussenlijst#1#2#3#4% pas op: wordt ook elders gedefinieerd
+ {\doiftoclevelelse[#3]
+ {#2}
+ {}}
+
+\def\schrijftussenlijst[#1]#2%
+ {\@EA\doschrijftussenlijst\@EA{#1}{#2}} % #2 weg en \expanded
+
+% NOG ENGELS MAKEN
+
+\def\lijstlengte {\utilitylistlength}
+\def\lijstbreedte {\utilitylistwidth}
+\def\lijsthoogte {\utilitylistheight}
+
+\def\utilitylistlength {0}
+\def\utilitylistwidth {0pt}
+\def\utilitylistheight {0pt}
+
+\def\dobepaallijstkenmerken[#1][#2]%
+ {\begingroup
+ \doglobal\newcounter\utilitylistlength
+ \def\dolijstelement##1##2##3##4##5##6%
+ {\doiftoclevelelse[##5]
+ {\doglobal\increment\utilitylistlength
+ \hbox
+ {\doattributes
+ {\??li##1\c!tekst}
+ {\def\\{ }%
+ \dontconvertfont
+ \getvalue{\??li##1\c!tekstcommando}{##4}}}%
+ \global\utilitydonetrue}
+ {}}%
+ \dostellijstin[#1][#2]%
+ \getfromcommalist[#1][1]%
+ \dosettoclevel{\getvalue{\??li\commalistelement\c!criterium}}%
+ \setbox0=\vbox
+ {\doutilities{#1}{\jobname}{#1}{}{\par}}%
+ \xdef\utilitylistheight {\the\ht0}%
+ \xdef\utilitylistwidth {\the\wd0}%
+ \endgroup}
+
+\def\bepaallijstkenmerken%
+ {\dodoubleempty\dobepaallijstkenmerken}
+
+% \definieerreferentielijst
+% [externalfigure]
+% [commando=\toongrootfiguur,
+% voor=\pagina,
+% na=\pagina]
+%
+% \definieerreferentielijst
+% [externaltable]
+% [commando=\toongrotetabel,
+% voor=\pagina,
+% na=\pagina]
+%
+% \def\toongrootfiguur#1%
+% {\externfiguur[#1][kader=aan,factor=max]}
+%
+% \def\toongrotetabel#1%
+% {\switchtobodyfont[12pt]\haalbuffer[#1]}
+%
+% \schrijfnaarreferentielijst[externalfigure]{koe}{\externfiguur[koe][breedte=3cm,kader=aan]}
+% \schrijfnaarreferentielijst[externalfigure]{paard}{\externfiguur[paard][breedte=3cm,kader=aan]}
+%
+% \startbuffer[kanweg]
+% \starttabel[|||]
+% \HL
+% \VL test \VL test \VL\SR
+% \HL
+% \VL test \VL test \VL\FR
+% \VL test \VL test \VL\MR
+% \VL test \VL test \VL\LR
+% \HL
+% \stoptabel
+% \stopbuffer
+%
+% \schrijfnaarreferentielijst[externaltable]{kanweg}{\switchtbodyfont[5pt]\haalbuffer[kanweg]}
+%
+% \plaatsreferentielijst
+% [externalfigure,externaltable]
+
+% algemeen
+
+\def\referentiebutton#1[#2]%
+ {\bgroup
+ \let\referenceprefix=\empty
+ \setbox0=\hbox{\ignorespaces#1}%
+ \naarbox{\copy0}[#2]%
+ \egroup}
+
+\newcounter\referencecounter
+
+\def\doreferentielijstelement#1#2#3#4#5%
+ {\doiftoclevelelse[#4]
+ {\getvalue{\??rl#1\c!voor}%
+ \referentiebutton
+ {\getvalue{\??rl#1\c!commando}{#3}\pagereference[\r!to#2]}%
+ [\r!from#2]%
+ \global\utilitydonetrue
+ \getvalue{\??rl#1\c!na}}
+ {}}
+
+\def\doplaatsreferentielijst[#1][#2]%
+ {\begingroup
+% \let\doschrijfnaarreferentielijst=\gobblethreearguments
+ \stelreferentielijstin[#1][#2,\c!status=\v!stop]%
+ \getfromcommalist[#1][1]%
+ \dosettoclevel{\getvalue{\??rl\commalistelement\c!criterium}}%
+ \doutilities{#1}{\jobname}{#1}{}{\par}%
+ \endgroup}
+
+\def\plaatsreferentielijst%
+ {\dodoubleempty\doplaatsreferentielijst}
+
+\def\doschrijfnaarreferentielijst#1#2#3%
+ {\doifvalue{\??rl#1\c!status}{\v!start}
+ {\begingroup
+ \makesectionformat
+ \doifelse{\@@nmstatus}{\v!start}
+ {\def\dopaginanummer{\noexpand\pagenumber}}
+ {\def\dopaginanummer{0}}%
+ \edef\schrijfwegnaarlijst%
+ {\writeutilitycommand%
+ {\referencelistentry%
+ {#1}% tag
+ {#2}% number
+ {#3}% data
+ {\sectionformat::\dopaginanummer}%
+ {\noexpand\realfolio}}}%
+ \schrijfwegnaarlijst
+ \endgroup}}
+
+\def\schrijfnaarreferentielijst[#1]#2#3% #1=class #2=data #3=visualization
+ {\doifelsevalue{\??rl#1\c!status}{\v!start}
+ {\referentiebutton%
+ {#3%
+ \doglobal\increment\referencecounter
+ \pagereference[\r!from\referencecounter]%
+ \doschrijfnaarreferentielijst{#1}{\referencecounter}{#2}}%
+ [\r!to\referencecounter]}
+ {#3}}
+
+\def\referencelistentry#1%
+ {\executeifdefined{#1\c!lijst}\gobblefourarguments}
+
+\def\dodosetreferentielijst#1%
+ {\setvalue{#1\c!lijst}{\doreferentielijstelement{#1}}}
+
+\def\dodoresetreferentielijst#1%
+ {\setvalue{#1\c!lijst}{\gobblefourarguments}}
+
+\def\dodefinieerreferentielijst[#1][#2]%
+ {\stelreferentielijstin[#1]
+ [\c!commando=,
+ \c!status=\v!start,
+ \c!criterium=\v!alles,
+ \c!voor=,
+ \c!na=,
+ #2]
+ \setcounter{#1}{0}%
+ \addutilityreset{#1}%
+ \setvalue{\s!set#1}%
+ {\dodosetreferentielijst{#1}}%
+ \setvalue{\s!reset#1}%
+ {\dodoresetreferentielijst{#1}}}
+
+\def\definieerreferentielijst%
+ {\dodoubleempty\dodefinieerreferentielijst}
+
+\def\dostelreferentielijstin[#1][#2]%
+ {\getparameters[\??rl#1][#2]}
+
+\def\stelreferentielijstin%
+ {\dodoubleempty\dostelreferentielijstin}
+
+%I n=Inhoudsopgave
+%I c=\volledigeinhoud,\plaatsinhoud
+%I c=\stelinhoudin
+%I
+%I Er kan een inhoudsopgave worden opgeroepen met:
+%I
+%I \plaatsinhoud
+%I \volledigeinhoud
+%I
+%I De wijze waarop de inhoudsopgave wordt aangemaakt wordt
+%I ingesteld met:
+%I
+%I \stelinhoudin[instellingen]
+%I
+%I De instellingen komen overeen met de van lijsten.
+%P
+%I Een inhoudsopgave is een zogenaamde samengestelde lijst.
+%I Op termijn komt het mechanisme van samengestelde lijsten
+%I ook voor de gebruiker beschikbaar. Vooralsnog werkt het
+%I achter de schermen.
+%I
+%I De commando's zijn slim genoeg om meestal automatisch de
+%I juiste lijsten te genereren. Men kan echter met 'criterium'
+%I het niveau specificeren. Met 'niveau' geeft men aan tot welk
+%I niveau de inhoudsopgave moet worden weergegeven.
+
+\def\dostelsamengesteldelijstin[#1][#2]%
+ {\getparameters[\??ih#1][#2]%
+ \ExpandFirstAfter\stellijstin[\getvalue{\??ih#1\c!lijst}][#2]}
+
+\def\stelsamengesteldelijstin%
+ {\dodoubleargument\dostelsamengesteldelijstin}
+
+\def\doplaatssamengesteldelijst[#1][#2]%
+ {\begingroup
+ \getparameters[\??ih#1][#2]%
+ \dosettoclevel{\getvalue{\??ih#1\c!criterium}}%
+ \edef\samengesteldelijst{\getvalue{\??ih#1\c!lijst}}% om voorlopig nog
+ \stripspaces\from\samengesteldelijst\to\samengesteldelijst % compatible te
+ \ExpandFirstAfter\doifnumberelse{\getvalue{\??ih#1\c!niveau}}% blijven
+ {\!!counta=\getvalue{\??ih#1\c!niveau}% met de vorige implementatie
+ \advance\!!counta by 1\relax% accepteren we ook nummers (0==deel)
+ \getfromcommacommand[\samengesteldelijst][\!!counta]%
+ \edef\maximumlijst{\commalistelement}}%
+ {\edef\maximumlijst{\getvalue{\??ih#1\c!niveau}}}%
+ \!!counta=\getvalue{\??se\getvalue{\??ko\maximumlijst \c!sectie}\c!niveau}%
+ \let\!!stringa=\samengesteldelijst
+ \let\samengesteldelijst=\empty
+ \def\docommando##1%
+ {\ifnum\getvalue{\??se\getvalue{\??ko##1\c!sectie}\c!niveau}>\!!counta
+ \else
+ \addtocommalist{##1}\samengesteldelijst
+ \fi}%
+ \processcommacommand[\!!stringa]\docommando
+ \doifvalue{\??ih#1\c!koppeling}{\v!aan}
+ {\startlistreferences{#1}}%
+ \ExpandFirstAfter\dodoplaatssamengesteldelijst[\samengesteldelijst][#2]%
+ \stoplistreferences{#1}%
+ \endgroup}
+
+\def\dodoplaatssamengesteldelijst[#1][#2]%
+ {\dobeginoflist
+ \dostellijstin[#1][#2]%
+ \doutilities{#1}{\jobname}{#1}{}{\par}%
+ \doendoflist}
+
+\def\dovolledigesamengesteldelijst[#1][#2]%
+ {\systemsuppliedtitle[#1]{\headtext{#1}}%
+ \doplaatssamengesteldelijst[#1][#2]}
+
+\def\dodefinieersamengesteldelijst[#1][#2][#3]%
+ {\setvalue{\??ih#1\c!lijst}{#2}%
+ \getcommalistsize[#2]%
+ \getfromcommalist[#2][\commalistsize]%
+ \doeassign[\??ih#1][\c!niveau=\commalistelement]%
+ \getparameters
+ [\??ih#1]
+ [\c!criterium=\v!lokaal,
+ #3]%
+ \setvalue{\e!stel#1\e!in}%
+ {\dodoubleempty\dostelsamengesteldelijstin[#1]}%
+ \setvalue{\e!plaats#1}%
+ {\dodoubleempty\doplaatssamengesteldelijst[#1]}%
+ \setvalue{\e!volledige#1}%
+ {\dodoubleempty\dovolledigesamengesteldelijst[#1]}}
+
+\def\definieersamengesteldelijst%
+ {\dotripleempty\dodefinieersamengesteldelijst}
+
+%I n=Synoniemen
+%I c=\definieersynoniemen,\stelsynoniemenin
+%I
+%I Er kunnen meerdere lijsten worden gedefinieerd door middel
+%I van het commando:
+%I
+%I \definieersynoniemen[naam][namen][commando]
+%I
+%I Na dit commando zijn de volgende commando's beschikbaar:
+%I
+%I \naam{tekst}{synoniem}
+%I \commando{tekst}
+%I \volledigelijstmetnamen
+%I \plaatslijstmetnamen
+%P
+%I De commando's rond de lijst met afkortingen zijn gedefinieerd
+%I met de waarden: [afkorting][afkortingen][\voluit]. Beschikbare
+%I commando's zijn dus:
+%I
+%I \afkorting{afkorting}{betekenis}
+%I \voluit{afkorting}
+%I \volledigelijstmetafkortingen
+%I \plaatslijstmetafkortingen
+%I
+%I De betekenis kan worden opgeroepen met \voluit{afkorting}.
+%P
+%I De wijze van zetten kan worden ingesteld met het commando:
+%I
+%I \stelsynoniemenin[naam][synoniemletter=,tekstletter=,
+%I status=,plaats=,breedte=,criterium=,conversie=,
+%I expansie=]
+%I
+%I Als de status 'stop' is, dan worden geen synoniemen naar
+%I de lijst weggeschreven. Als het criterium 'alles' is,
+%I dan worden alle synoniemen in het overzicht opgenomen, zoniet,
+%I dan worden alleen gebruikte synoniemen opgenomen. Omdat
+%I standaard 'conversie' op 'nee' staat, worden afkortingen
+%I getoond.
+%P
+%I In principe is een synoniem pas beschikbaar als het is
+%I gedefinieerd. Het is echter mogelijk synoniemen te laden,
+%I mits de tekst tenminste eenmaal is verwerkt. Het is dus
+%I mogelijk synoniemen op te roepen die pas later worden
+%I gedefinieerd. Alleen de omschrijvingen zijn beschikbaar,
+%I dus niet de commando's (doordenkertje). Het laden vindt
+%I plaats met:
+%I
+%I \laadnamen
+%I
+%I of, zoals bij afkortingen:
+%I
+%I \laadafkortingen
+
+% Formaat tex-utility-input-file <jobname.tui>:
+%
+% synonym entry {tag} {pure} {text} {synonym}
+%
+% Deze file wordt met het programma TeXUtil omgezet in een
+% in te lezen TeXFile met de commando's:
+%
+% \synonymentry {tag} {pure} {text} {synonym}
+
+\newif\ifsynonymmeaning
+
+\def\dostelsynoniemenin[#1][#2]%
+ {\getparameters[\??sm#1][#2]}
+
+\def\stelsynoniemenin%
+ {\dodoubleargument\dostelsynoniemenin}
+
+\def\doresetsynonym#1%
+ {\letvalue{#1\s!entry}=\gobblethreearguments}
+
+\def\dohandlesynonymentry#1#2#3%
+ {\bgroup
+ \syndef
+ {\doattributes{\??sm#1\c!tekst}{#2}}
+ \ConvertToConstant\doifelse{#3}{}{\onbekend}{#3}
+ \par
+ \egroup}
+
+\def\synonymentry#1%
+ {\executeifdefined{#1\s!entry}\gobblethreearguments}
+
+\def\dosetsynonym#1%
+ {\doifdefinedelse{\??sm#1\c!commando}
+ {\global\utilitydonetrue
+ \setvalue{#1\s!entry}{\getvalue{\??sm#1\c!commando}}}
+ {\global\utilitydonetrue
+ \setvalue{#1\s!entry}{\dohandlesynonymentry}}%
+ \doordefinieren
+ [syndef]
+ [\c!plaats=\synplaats,
+ \c!breedte=\synbreedte,
+ \c!kopletter=,
+ \c!voor=,
+ \c!tussen=,
+ \c!na=]}
+
+\def\doplaatslijstmetsynoniemen#1#2%
+ {\witruimte
+ \begingroup
+ \def\currentsynonym{#1}%
+ \def\synplaats{\getvalue{\??sm#1\c!plaats}}%
+ \def\synbreedte{\getvalue{\??sm#1\c!breedte}}%
+ \stelwitruimtein[\v!geen]%
+ \doutilities{#1}{\jobname}{#2}{}{\par}%
+ \endgroup
+ \ifutilitydone\else\geenwitruimte\fi}
+
+\def\dovolledigelijstmetsynoniemen#1#2%
+ {\plaatsvolledig
+ {\systemsuppliedchapter}{#1}{\headtext{#2}}%
+ {\doplaatslijstmetsynoniemen{#1}{#2}}}
+
+\def\processsynonym#1#2#3%
+ {\begingroup % anders in mathmode lege \hbox, zie eenheden
+ \ifsynonymmeaning
+ \doattributes{\??sm#1\c!synoniem}{\synonymmeaningfalse#3}%
+ \else
+ \explicithmode
+ \doattributes{\??sm#1\c!tekst}{#2}%
+ \fi
+ \endgroup}
+
+\def\getsynonymmeaning#1#2%
+ {\doifdefinedelse{#2}
+ {{\synonymmeaningtrue\getvalue{#2}}}
+ {\showmessage{\m!systems}{18}{#1,#2}}}
+
+\def\dowritesynonym#1#2#3#4%
+ {\begingroup % anders in mathmode lege \hbox
+ \doifelsevalue{\??sm#1\c!expansie}{\v!ja}
+ {\immediatewriteutility{s e {#1} {#2} {#3} {#4}}}
+ {\convertargument#3\to\asciia
+ \convertargument#4\to\asciib
+ \immediatewriteutility{s e {#1} {#2} {\asciia} {\asciib}}}%
+ \endgroup}
+
+\def\preexecutesynonym#1#2#3#4%
+ {\ifdoinpututilities \else
+ \dowritesynonym{#1}{#2}{#3}{#4}%
+ \setgvalue{#2}{\donottest\processsynonym{#1}{#3}{#4}}%
+ \fi}
+
+\def\executesynonym#1#2#3#4%
+ {\preexecutesynonym{#1}{#2}{#3}{#4}%
+ \processsynonym{#1}{#3}{#4}}
+
+\def\expandsynonym#1#2#3#4%
+ {{\synonymmeaningtrue
+ \processsynonym{#1}{#3}{#4}}}
+
+\def\dodoloadsynonym#1#2#3#4%
+ {\setgvalue{#2}{\executesynonym{#1}{#2}{#3}{#4}}}
+
+\def\doloadsynonym#1%
+ {\setvalue{#1\s!entry}##1##2##3%
+ {\doifelsenothing{##1}
+ {\dodoloadsynonym{#1}{##2}{##2}{##3}}
+ {\dodoloadsynonym{#1}{##1}{##2}{##3}}%
+ \global\utilitydonetrue}}
+
+\def\dolaadsynoniemen#1#2%
+ {\bgroup
+ \let\dosetsynonym=\doloadsynonym
+ \showmessage{\m!systems}{19}{#2}%
+ \doutilities{#1}{\jobname}{}{}{}%
+ \egroup
+ \setvalue{\s!check#1}##1{}}
+
+\def\dodocomplexsynonym[#1][#2]#3#4%
+ {\getvalue{\s!check#1}{#2}%
+ \doifelsevalue{\??sm#1\c!conversie}{\v!ja}
+ {\setgvalue{#2}{\donottest\expandsynonym{#1}{#2}{#3}{#4}}}
+ {\doifelsevalue{\??sm#1\c!status}{\v!start}
+ {\doifelsevalue{\??sm#1\c!criterium}{\v!alles}
+ {\preexecutesynonym{#1}{#2}{#3}{#4}}
+ {\setgvalue{#2}{\donottest\executesynonym{#1}{#2}{#3}{#4}}}}
+ {\setgvalue{#2}{\donottest\processsynonym{#1}{#3}{#4}}}}}
+
+\def\docomplexsynonym[#1][#2][#3]#4#5%
+ {\ifthirdargument
+ \dodocomplexsynonym[#2][#1#3]{#4}{#5}%
+ \else
+ \dodocomplexsynonym[#2][#1#4]{#4}{#5}%
+ \fi}
+
+\def\dodefinieersynoniemen[#1][#2][#3][#4]%
+ {\stelsynoniemenin
+ [#1]
+ [\c!synoniemletter=,
+ \c!tekstletter=,
+ \c!status=\v!start,
+ \c!plaats=\v!links,
+ \c!criterium=,
+ \c!breedte=5em]%
+ \presetheadtext
+ [#2=\Woord{#2}]%
+ \setvalue{\e!stel#2\e!in}%
+ {\dodoubleargument\getparameters[\??sm#1]}%
+ \iffourthargument
+ \def#4##1%
+ {\donottest\getsynonymmeaning{#1}{\??sm:#1:##1}}%
+ \ifthirdargument
+ \def#3##1%
+ {\donottest\getvalue{\??sm:#1:##1}}%
+ \fi
+ \setvalue{#1}%
+ {\dotripleempty\docomplexsynonym[\??sm:#1:][#1]}%
+ \else
+ \ifthirdargument
+ \def#3##1%
+ {\donottest\getsynonymmeaning{#1}{##1}}%
+ \fi
+ \setvalue{#1}%
+ {\dotripleempty\docomplexsynonym[][#1]}%
+ \fi
+ \setvalue{\s!set#1}%
+ {\dosetsynonym{#1}}%
+ \setvalue{\s!reset#1}%
+ {\doresetsynonym{#1}}%
+ \setvalue{\s!check#1}##1%
+ {\checkdefined{synoniemen}{#1}{##1}}%
+ \addutilityreset{#1}%
+ \setvalue{\e!laad#2}%
+ {\dolaadsynoniemen{#1}{#2}}%
+ \setvalue{\e!plaats\e!lijstmet#2}%
+ {\doplaatslijstmetsynoniemen{#1}{#2}}%
+ \setvalue{\e!volledige\e!lijstmet#2}%
+ {\dovolledigelijstmetsynoniemen{#1}{#2}}}
+
+\def\definieersynoniemen%
+ {\doquadrupleempty\dodefinieersynoniemen}
+
+%I n=Sorteren
+%I c=\definieersorteren,\stelsorterenin
+%I
+%I Sorteren is een vereenvoudigde variant van 'synoniemen':
+%I
+%I \definieersorteren[naam][namen]
+%I
+%I Na dit commando zijn de volgende commando's beschikbaar:
+%I
+%I \naam{tekst}
+%I \volledigelijstmetnamen
+%I \plaatslijstmetnamen
+%P
+%I De wijze van zetten kan worden ingesteld met het commando:
+%I
+%I \stelsorterenin[naam][status=,commando=,voor=,na=,
+%I letter=,criterium=,expansie=]
+%I
+%I Met 'commando' kan met een bewerking uitvoeren op de
+%I onderdelen van een lijst.
+%I
+%I Als de status 'stop' is, dan worden geen sorteringen naar
+%I de lijst weggeschreven. Als het criterium 'alles' is,
+%I dan worden alle sorteringen in het overzicht opgenomen,
+%I zoniet, dan worden alleen gebruikte opgenomen.
+%P
+%I In principe is een item pas beschikbaar als het is
+%I gedefinieerd. Het is echter mogelijk items te laden,
+%I mits de tekst tenminste eenmaal is verwerkt. Het is dus
+%I mogelijk items op te roepen die pas later worden
+%I gedefinieerd.
+%I
+%I \laadnamen
+%I
+%I of, zoals bij logo's:
+%I
+%I \laadlogos
+%I
+%I Bij een eerste run zijn de commando's nog niet
+%I beschikbaar. Een logo kan dus het best worden opgeroepen
+%I met: \naam{...}, bijvoorbeeld \naam{PRAGMA} in plaats van
+%I \PRAGMA.
+
+% Formaat tex-utility-input-file <jobname.tui>:
+%
+% synonym entry {tag} {pure} {text} {}
+%
+% Deze file wordt met het programma TeXUtil omgezet in een
+% in te lezen TeXFile met de commando's:
+%
+% \synonymentry {tag} {pure} {text} {}
+
+\def\dostelsorterenin[#1][#2]%
+ {\getparameters[\??so#1][#2]}
+
+\def\stelsorterenin%
+ {\dodoubleargument\dostelsorterenin}
+
+\def\doresetsorteren#1%
+ {\letvalue{#1\s!entry}=\gobblethreearguments}
+
+\def\dosetsorteren#1%
+ {\setvalue{#1\s!entry}##1##2##3%
+ {\def\dowritesort####1####2####3{}%
+ \global\utilitydonetrue
+ \bgroup
+ \doifdefinedelse{\??so#1\c!commando}
+ {\getvalue{\??so#1\c!commando}{##2}}
+ {\getvalue{\??so#1\c!voor}%
+ \doattributes{\??so#1}{##2}%
+ \getvalue{\??so#1\c!na}}%
+ \egroup}}
+
+\def\doplaatslijstmetsorteren#1% NOG EEN RUWE VERSIE MAKEN
+ {\witruimte % ZONDER WITRUIMTE ETC ETC
+ \begingroup
+ \stelwitruimtein[\v!geen]%
+ \doutilities{#1}{\jobname}{#1}{}{\par}%
+ \endgroup
+ \ifutilitydone\else\geenwitruimte\fi}
+
+\def\dovolledigelijstmetsorteren#1#2%
+ {\plaatsvolledig
+ {\systemsuppliedchapter}{#1}{\headtext{#2}}
+ {\doplaatslijstmetsorteren{#1}}}
+
+\def\processsort#1#2#3%
+ {\explicithmode
+ \bgroup
+ \doattributes{\??so#1}{#2}%
+ \egroup}
+
+\def\dowritesort#1#2#3%
+ {\bgroup
+ \doifelsevalue{\??so#1\c!expansie}{\v!ja}
+ {\immediatewriteutility{s e {#1} {#2} {#3} {}}}
+ {\convertargument#3\to\asciia
+ \immediatewriteutility{s e {#1} {#2} {\asciia} {}}}%
+ \egroup}
+
+\def\synonymentry#1%
+ {\executeifdefined{#1\s!entry}\gobblethreearguments}
+
+\def\preexecutesort#1#2#3%
+ {\ifdoinpututilities \else
+ \dowritesort{#1}{#2}{#3}%
+ \setgvalue{#2}{\donottest\processsort{#1}{#3}{#2}}%
+ \fi}
+
+\def\executesort#1#2#3%
+ {\preexecutesort{#1}{#2}{#3}%
+ \processsort{#1}{#3}{#2}}
+
+\def\doloadsort#1%
+ {\setvalue{#1\s!entry}##1##2##3%
+ {\setgvalue{##1}{##2}%
+ \global\utilitydonetrue}}
+
+\def\dolaadsorteren#1#2%
+ {\bgroup
+ \let\dosetsorteren=\doloadsort
+ \showmessage{\m!systems}{20}{#2}%
+ \doutilities{#1}{\jobname}{}{}{}%
+ \egroup
+ \setvalue{\s!check#1}##1{}}
+
+\def\dodocomplexsort[#1][#2]#3%
+ {\getvalue{\s!check#1}{#2}%
+ \doifelsevalue{\??so#1\c!status}{\v!start}
+ {\doifelsevalue{\??so#1\c!criterium}{\v!alles}
+ {\preexecutesort{#1}{#2}{#3}}
+ {\setgvalue{#2}{\donottest\executesort{#1}{#2}{#3}}}}
+ {\setgvalue{#2}{\donottest\processsort{#1}{#3}{#2}}}}
+
+\def\docomplexsort[#1][#2][#3]#4%
+ {\ifthirdargument
+ \dodocomplexsort[#2][#1#3]{#4}
+ \else
+ \dowritesort{#2}{#4}{#4}%
+ \fi}
+
+\def\dodefinieersorteren[#1][#2][#3]%
+ {\getparameters[\??so#1]
+ [\c!commando=,
+ \c!status=\v!start,
+ \c!criterium=,
+ \c!letter=,
+ \c!voor=,
+ \c!na=\endgraf]%
+ \presetheadtext[#2=\Woord{#2}]%
+ \setvalue{\e!stel#2\e!in}[##1]%
+ {\getparameters[\??so#1][##1]}%
+ \ifthirdargument
+ \def#3##1%
+ {\getvalue{\??so:#1:##1}}
+ \setvalue{#1}%
+ {\dotripleempty\docomplexsort[\??so:#1:][#1]}%
+ \else
+ \setvalue{#1}%
+ {\dotripleempty\docomplexsort[][#1]}%
+ \fi
+ \setvalue{\s!set#1}%
+ {\dosetsorteren{#1}}%
+ \setvalue{\s!reset#1}%
+ {\doresetsorteren{#1}}%
+ \addutilityreset{#1}%
+ \setvalue{\e!laad#2}%
+ {\dolaadsorteren{#1}{#2}}%
+ \setvalue{\s!check#1}##1%
+ {\checkdefined{sorteren}{#1}{##1}}%
+ \setvalue{\e!plaats\e!lijstmet#2}%
+ {\doplaatslijstmetsorteren{#1}}%
+ \setvalue{\e!volledige\e!lijstmet#2}%
+ {\dovolledigelijstmetsorteren{#1}{#2}}}
+
+\def\definieersorteren%
+ {\dotripleempty\dodefinieersorteren}
+
+%I n=Afkortingen
+%I c=\afkorting,\volledigelijstmetafkortingen
+%I
+%I Een afkorting wordt gedefinieerd met:
+%I
+%I \afkorting{afkorting}{betekenis}
+%I
+%I en opgeroepen met:
+%I
+%I \voluit{afkorting}
+%I
+%I Een lijst met afkortingen wordt gegenereerd met:
+%I
+%I \plaatslijstmetafkortingen
+%I \volledigelijstmetafkortingen
+
+%T n=afkorting
+%T m=afk
+%T a=a
+%T
+%T \afkorting {?} {}
+
+%I n=Eenheden
+%I c=\eenheid,\betekenis,\wiskunde
+%I
+%I Een afkorting wordt gedefinieerd met:
+%I
+%I \eenheid [eenheid] {dimensie} {betekenis}
+%I
+%I en opgeroepen met:
+%I
+%I \betekenis {eenheid}
+%I
+%I Een voorbeeld van een definitie is:
+%I
+%I \eenheid [KUUB] {m^3} {inhoud}
+%I
+%I Een lijst met eenheden wordt gegenereerd met:
+%I
+%I \plaatslijstmeteenheden
+%I \volledigelijstmeteenheden
+%P
+%I Aanvullend zijn twee commando's beschikbaar die worden
+%I gebruikt bij het zetten van eenheden:
+%I
+%I \wiskunde{wiskundige commando's}
+%I \dimensie{wiskundige eenheid}
+%I
+%I Het eerste commando maakt $ binnen $ mogelijk, het
+%I laatste commando handelt ook de spatiering af.
+%I
+%I Een teveel aan spatiering kan ongedaan worden voorkomen
+%I met:
+%I
+%I \geendimensie{wiskundige eenheid}
+
+% documenteren \bmath ..\emath
+
+\def\bmath%
+ {\begingroup
+ \ifmmode
+ \let\emath=\endgroup
+ \else
+ $\def\emath{$\endgroup}%
+ \fi}
+
+\def\mathematics#1% % \bmath ...\emath kan ook maar
+ {\ifmmode#1\else$#1$\fi} % dit alternatief scheelt grouping
+
+\def\dimensionsignal{0.000058pt}
+
+\def\dimension#1%
+ {\def\dodimensionsignal{\kern\dimensionsignal}%
+ \ifdim\lastskip=\!!zeropoint\relax
+ \ifdim\lastkern=\!!zeropoint\relax
+ \ifmmode
+ \mathematics{\,\,\tf#1}%
+ \else
+ \mathematics{\tf#1}%
+ \fi
+ \else\ifdim\lastkern=\dimensionsignal
+ \mathematics{\,\tf#1}%
+ \else
+ \unkern\mathematics{\,\,\tf#1}%
+ \fi\fi
+ \else
+ \unskip\mathematics{\,\,\tf#1}%
+ \fi
+ \dodimensionsignal}
+
+\def\nodimension#1%
+ {\unskip#1\gdef\dodimensionsignal{}}
+
+%I n=Registers
+%I c=\definieerregister,\stelregisterin
+%I c=\volledigregister,\plaatsregister
+%I
+%I Er kunnen registers worden gedefinieerd met het commando:
+%I
+%I \definieerregister[naam][namen]
+%I
+%I Vanaf dat moment zijn de volgende commando's beschikbaar:
+%I
+%I \naam[ascii]{ingang+ingang+ingang}
+%I \zienaam[ascii]{ingang+ingang+ingang}{andere ingang}
+%I \plaatsnaam
+%I \volledigenaam
+%I
+%I of
+%I
+%I \plaatsregister[naam]
+%I \volledigregister[naam]
+%I
+%I De commando's rond de standaard index zijn gedefinieerd
+%I met de waarden: [index][indices]
+%P
+%I In de tekst dient een registerverwijzing voor het woord
+%I te staan, dus: we verwijzen naar \index{woord}woord.
+%I
+%I Bij koppen daarentegen plaatsen we \index na de kop:
+%I
+%I \subparagraaf{dat is dat}
+%I \index{ziezo}
+%I
+%I ........... tekst .....
+%I
+%I of
+%I
+%I \margewoord{ziezo}
+%I \index{ziezo}
+%I
+%I ........... tekst .....
+%I
+%I Ongewenste spaties na \index worden verwijderd! Wil men
+%I dus een spatie, dan moet dit worden afgedwongen met \ .
+%P
+%I Mocht het hierboven beschreven mechanisme interfereren
+%I met andere mechanismen, dan kan ook het volgende commando
+%I worden gebruikt:
+%I
+%I \schrijfnaarregister[naam][ascii]{ingang+ingang+ingang}
+%I
+%I waarbij [ascii] optioneel is.
+%P
+%I De registers kunnen worden ingesteld met het commando:
+%I
+%I \stelregisterin[naam][letter=,aanduiding=,n=,
+%I balanceren=,uitlijnen=,criterium=,afstand=,symbool=,
+%I expansie=]
+%I
+%I waarbij 'aanduiding' betrekking heeft op het al dan niet
+%I plaatsen van een letter ('ja' of 'nee') en 'letter' op de
+%I weergave van de letter.
+%I
+%I Met 'criterium' kan een subindex worden opgeroepen,
+%I bijvoorbeeld 'deel' of 'hoofdstuk', of als het niveau
+%I onbekend is: 'lokaal'. Standaard wordt een volledige index
+%I gegenereerd ('alles').
+%I
+%I In plaats van een paginanummer kan een symbool worden
+%I gezet: n (1,2,3,..), a (a,b,c,..), 1 (bolletjes) en
+%I 2 (rechthoekjes). Een symbool heeft alleen zin bij
+%I interactieve teksten.
+%I
+%I Voor eigen gebruik is \ifregistergeplaatst beschikbaar.
+%P
+%I In plaats van een + als scheider kan ook & worden
+%I gebruikt. Bovendien kan als eerste karakter worden opgegeven
+%I wat de scheider is:
+%I
+%I \index[abcformule]{&formule&$ax^2+bx+c$}
+%I
+%I Overigens gaat de & voor de +, zodat hier de specificatie
+%I niet per se nodig is. Let wel: dit is een kenmerk van
+%I texutil, en niet zozeer van ConTeXt.
+
+% Formaat tex-utility-input-file <jobname.tui>:
+%
+% i e {tag} {loc} {pure} {entry+..} {p:c:p:sp:ssp=>page} {realpage}
+% i s {tag} {loc} {pure} {entry+..} {other entry}
+%
+% In plaats van + kan een & worden gebruikt. Ook kan als
+% eerste karakter worden opgegeven wat de scheider is.
+%
+% Deze file wordt met het programma TeXUtil omgezet in
+% een in te lezen TeXFile met de commando's:
+%
+% \registerentrya {tag} {ingang}
+% \registerentryb {tag} {subingang}
+% \registerentryc {tag} {subsubingang}
+%
+% \registerpage {tag} {volgnummer} {paginanummer} {volgnummer}
+%
+% \registersee {tag} {andere ingang}
+%
+% \registerentry {tag} {letter}
+
+\def\dostelregisterin[#1][#2]%
+ {\getparameters[\??id#1][#2]%
+ \preparepaginaprefix{\??id#1}}
+
+\def\stelregisterin%
+ {\dodoubleargumentwithset\dostelregisterin}
+
+\def\getlastregisterentry#1%
+ {\def\docommando##1%
+ {\def\!!stringa{##1}}%
+ \processconcanatedlist[#1][+]\docommando
+ \!!stringa}
+
+\def\doprocessregister[#1]#2%
+ {\begingroup
+ \thisisnextinternal{\s!ind}%
+ \ifduplicate\getlastregisterentry{#2}\fi
+ \doifelsevalue{\??id\currentregister\c!expansie}{\v!ja}
+ {\edef\ascii{#2}}
+ {\convertargument#2\to\ascii}%
+ \makesectionformat
+ \edef\schrijfwegnaarregister%
+ {\writeutility%
+ {r e %
+ {\currentregister} %
+ {\nextinternalreference} %
+ {#1} %
+ {\ascii} %
+ {\sectionformat::\noexpand\pagenumber} %
+ {\noexpand\realfolio}}}%
+ \schrijfwegnaarregister
+ \getfirstcharacter\currentregister
+ \registerinfo{> \firstcharacter}{#2}%
+ \endgroup}
+
+\def\complexdoregister[#1]#2%
+ {\doprocessregister[#1]{#2}%
+ \ifvmode\nobreak\fi
+ \GotoPar}
+
+\def\doregister#1%
+ {\def\currentregister{#1}%
+ \complexorsimpleempty{doregister}}
+
+\def\complexdozieregister[#1]#2#3%
+ {\begingroup
+ \thisisnextinternal{\s!ind}%
+ \ifduplicate\getlastregisterentry{#2}\fi
+ \doifelsevalue{\??id\currentregister\c!expansie}{\v!ja}
+ {\edef\ascii{#2}}
+ {\convertargument#2\to\ascii}%
+ \makesectionformat
+ \edef\schrijfwegnaarregister%
+ {\writeutility%
+ {r s %
+ {\currentregister} %
+ {\nextinternalreference} %
+ {#1} %
+ {\ascii} %
+ {#3} %
+ {\sectionformat}}}%
+ \schrijfwegnaarregister
+ \endgroup
+ \registerinfo{> zie}{#2}%
+ \GotoPar}
+
+\def\dozieregister#1%
+ {\def\currentregister{#1}%
+ \complexorsimpleempty{dozieregister}}
+
+\def\doschrijfnaarregister[#1]% % de twee-traps-aanroep is nodig
+ {\edef\currentregister{#1}% % om gebruik van \ExpandBothAfter
+ \doprocessregister} % mogelijk te maken
+
+\def\schrijfnaarregister%
+ {\dodoubleempty\doschrijfnaarregister}
+
+\def\ifregistergeplaatst{\ifutilitydone}
+
+\newif\iffirstregisterpage
+
+\def\c!entrya{}
+\def\c!entryb{}
+\def\c!entryc{}
+
+\def\nextregisterpage%
+ {\iffirstregisterpage
+ \doglobal\newcounter\registerpagenumber
+ \fi
+ \doglobal\increment\registerpagenumber}
+
+\def\doregisterpagelocation#1%
+ {\nextregisterpage
+ \hbox to 1em{\hss#1\hss}}
+
+\def\setregisterpage#1%
+ {\let\registerpageseparator=\relax
+ \processaction
+ [\getvalue{\??id#1\c!symbool}]
+ [ \c!n=>{\def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{\sl\registerpagenumber}\/}},
+ \c!a=>{\def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{\sl\character{\registerpagenumber}\/}}},
+ 1=>{\def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{$\bullet$}}},
+ 2=>{\def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{\vrule\!!width1em\!!height1ex\!!depth\!!zeropoint}}},
+ \s!unknown=>{\def\registerpagesymbol{\getvalue{\??id#1\c!symbool}}%
+ \def\doregisterpage##1[##2]%
+ {\doregisterpagelocation{\registerpagesymbol}}},
+ \s!default=>{\def\registerpageseparator%
+ {{\sl,}}%
+ \def\doregisterpage##1[##2]%
+ {{\strut\sl\paginaprefix{\??id##1}[##2]\translatednumber[##2]}}}]}
+
+\def\doresetregister#1%
+ {\letvalue{#1\s!entrya}=\gobbleoneargument
+ \letvalue{#1\s!entryb}=\gobbleoneargument
+ \letvalue{#1\s!entryc}=\gobbleoneargument
+ \letvalue{#1\s!see}=\gobbletwoarguments
+ \letvalue{#1\s!page}=\gobblethreearguments
+ \letvalue{#1\s!entry}=\gobbleoneargument}
+
+\def\registerentrya#1{\executeifdefined{#1\s!entrya}\gobbleoneargument}
+\def\registerentryb#1{\executeifdefined{#1\s!entryb}\gobbleoneargument}
+\def\registerentryc#1{\executeifdefined{#1\s!entryc}\gobbleoneargument}
+\def\registersee #1{\executeifdefined{#1\s!see}\gobbletwoarguments}
+\def\registerpage #1{\executeifdefined{#1\s!page}\gobblethreearguments}
+\def\registerentry #1{\executeifdefined{#1\s!entry}\gobbleoneargument}
+
+\newif\iffirstsubentry
+\newif\iffirstsubsubentry
+
+\newcounter\currententrylevel
+
+\let\c!entryletter=\empty
+\let\c!entrya =\relax
+\let\c!entryb =\relax
+\let\c!entryc =\relax
+
+\def\dosetpageregister#1%
+ {\dosetreglevel{\getvalue{\??id#1\c!criterium}}%
+ \setregisterpage{#1}%
+ \setvalue{#1\s!entrya}##1%
+ {\edef\currententrylevel{1}%
+ \global\let\c!entryb=\relax
+ \global\let\c!entryc=\relax
+ \gdef\c!entrya%
+ {\global\firstregisterpagetrue
+ \endgraf
+ \hangindent1em\noindent
+ \dohandleregisterentry{##1}%
+ \global\firstsubentrytrue
+ \global\firstsubsubentrytrue}}%
+ \setvalue{#1\s!entryb}##1%
+ {\edef\currententrylevel{2}%
+ \global\let\c!entryc=\relax
+ \global\def\c!entryb%
+ {\global\firstregisterpagetrue
+\global\let\c!entrya=\relax
+ \endgraf
+ \iffirstsubentry\nobreak\fi
+ \hangindent2em\noindent\hskip1em\relax
+ \dohandleregisterentry{##1}%
+ \global\firstsubentryfalse
+ \global\firstsubsubentrytrue}}%
+ \setvalue{#1\s!entryc}##1%
+ {\edef\currententrylevel{3}%
+ \gdef\c!entryc%
+ {\global\firstregisterpagetrue
+\global\let\c!entrya=\relax
+\global\let\c!entryb=\relax
+ \endgraf
+ \iffirstsubsubentry\nobreak\fi
+ \hangindent3em\noindent\hskip2em\relax
+ \dohandleregisterentry{(##1)}%
+ \global\firstsubsubentryfalse}}%
+ \setvalue{#1\s!page}##1##2##3%
+ {\doifreglevelelse[##2]
+ {\global\utilitydonetrue
+ \c!entryletter
+ \def\dohandleregisterentry####1%
+ {\bgroup
+ \if!!donea
+ \setbox0=\hbox{\showlocation{\getvalue{\??id#1\c!tekstcommando}{####1}}}%
+ \gotonextinternal{\s!ind}{##1}{##3}{\copy0}%
+ \else
+ \getvalue{\??id#1\c!tekstcommando}{####1}%
+ \fi
+ \egroup
+ \!!doneafalse}%
+ \!!doneafalse
+ \doifelsevalue{\??id#1\c!interactie}{\v!tekst}
+ {\ifcase\currententrylevel
+ \or
+ \!!doneatrue\c!entrya\c!entryb\c!entryc
+ \or
+ \c!entrya\!!doneatrue\c!entryb\c!entryc
+ \or
+ \c!entrya\c!entryb\!!doneatrue\c!entryc
+ \fi}
+ {\c!entrya\c!entryb\c!entryc}%
+ \global\let\c!entrya=\relax
+ \global\let\c!entryb=\relax
+ \global\let\c!entryc=\relax
+ \global\let\c!entryletter=\relax
+ \iffirstregisterpage
+ \expandafter\hskip\getvalue{\??id#1\c!afstand}\relax
+ \else
+ \registerpageseparator % || Moet anders
+ |\spatie|\relax % \relax needed because | looks ahead
+ \fi
+ \doifelsevalue{\??id#1\c!interactie}{\v!paginanummer}
+ {\bgroup
+ \setbox0=\hbox{\showlocation{\doregisterpage{#1}[##2]}}%
+ \gotonextinternal{\s!ind}{##1}{##3}{\copy0}%
+ \egroup}
+ {\hbox{\doregisterpage{#1}[##2]}}%
+ \ignorespaces
+ \global\firstregisterpagefalse}
+ {}}%
+ \setvalue{#1\s!see}##1##2%
+ {\doifreglevelelse[##2::0]
+ {{\global\utilitydonetrue
+ \endgraf
+ \noindent\hskip\getvalue{\??id#1\c!afstand}%
+ \sl\e!zie: ##1}}
+ {}}%
+ \setvalue{#1\s!entry}##1%
+ {\gdef\c!entryletter%
+ {\global\let\c!entryletter=\relax
+ \global\utilitydonetrue
+ \getvalue{\??id#1\c!voor}%
+ %\vskip\lineheight\vskip-\lineheight\goodbreak
+ \vskip\lineheight\goodbreak\vskip-\lineheight
+ \doifelsevalue{\??id#1\c!aanduiding}{\v!ja}
+ {\ifhmode\unskip\else\noindent\fi
+ \getvalue{\??id#1\c!commando}% % needed
+ {\doattributes{\??id#1}
+ {\doifvalue{\??id#1\c!refereren}{\v!aan}
+ {\pagereference[#1:##1]}%
+ \strut\ignorespaces##1}}%
+ \getvalue{\??id#1\c!na}%
+ \par\nobreak} % don't use \string##1, other hack
+ {\goodbreak % needed ##1 can be \string...
+ \doifvalue{\??id#1\c!refereren}{\v!aan}
+ {\pagereference[#1:##1]}}}}}
+
+\def\getalllistreferences#1#2%
+ {\convertargument#2\to\currentregisterentry
+ \doifdefinedelse{\??id#1\??id\currentregisterentry}
+ {\edef\alllistreferences%
+ {\getvalue{\??id#1\??id\currentregisterentry}}%
+ \beforesplitstring\alllistreferences\at::\to\internallistreference
+ \aftersplitstring\alllistreferences\at::\to\alllistreferences}
+ {\let\alllistreferences=\empty
+ \def\internallistreference{0}}}
+
+\def\dosetlinkregister#1% is die page reference echt nodig?
+ {\dosetreglevel{\getvalue{\??id#1\c!criterium}}%
+ \setregisterpage{#1}%
+ \setvalue{#1\s!entrya}##1%
+ {\global\utilitydonetrue
+ \c!entryletter
+ \iflocation
+ \getalllistreferences{#1}{##1}%
+ \endgraf\hangindent1em\noindent
+ %
+ %\thisissomeinternal{\s!lin}{\internallistreference}%
+ %
+ \pagereference[\s!lin:\internallistreference]%
+ %
+ \getcommacommandsize[\alllistreferences]%
+ \getfromcommacommand[\alllistreferences][1]%
+ \ifnum\commalistsize=1
+ \let\firstlistreference=\empty
+ \let\midlistreference=\commalistelement
+ \let\lastlistreference=\empty
+ \else
+ \let\firstlistreference=\commalistelement
+ \getfromcommacommand[\alllistreferences][\commalistsize]%
+ \let\lastlistreference=\commalistelement
+ \ifnum\commalistsize=2
+ \let\midlistreference=\empty
+ \else
+ \!!counta=\commalistsize
+ \divide\!!counta by 2
+ \getfromcommacommand[\alllistreferences][\!!counta]%
+ \let\midlistreference=\commalistelement
+ \fi
+ \fi
+ % \hskip-.25em\relax ??????
+ \getvalue{\??id#1\c!tekstcommando}{##1}%
+ \hskip\getvalue{\??id#1\c!afstand}%
+ \def\dodocommando[####1-####2]%
+ {\gotonextinternal{\s!ind}{####1}{####2}{\copy0}}%
+ \def\docommando####1####2%
+ {\setbox0=\hbox{\showlocation{\hbox to 1em{\hss####2\hss}}}%
+ \ifx####1\empty
+ % \hskip\wd0 % (optioneel maken)
+ \else
+ \expandafter\dodocommando\expandafter[####1]%
+ \fi}%
+ {\docommando\firstlistreference\gobackwardcharacter}%
+ {\docommando\midlistreference\gotosomewherecharacter}%
+ {\docommando\lastlistreference\goforwardcharacter}%
+ \else
+ ##1%
+ \fi}%
+ \setvalue{#1\s!entry}##1% hetzelfde dus gemeenschappelijk
+ {\gdef\c!entryletter%
+ {\global\utilitydonetrue
+ \global\let\c!entryletter=\relax
+ \getvalue{\??id#1\c!voor}%
+ %\vskip\lineheight\vskip-\lineheight\goodbreak
+ \vskip\lineheight\goodbreak\vskip-\lineheight
+ \doifelsevalue{\??id#1\c!aanduiding}{\v!ja}
+ {\ifhmode\unskip\else\noindent\fi
+ \getvalue{\??id#1\c!commando}% % needed
+ {\doattributes{\??id#1}
+ {\doifvalue{\??id#1\c!refereren}{\v!aan}
+ {\pagereference[#1:##1]}%
+ \strut##1}}%
+ \getvalue{\??id#1\c!na}%
+ \par\nobreak} % don't use \string##1, other hack
+ {\goodbreak % needed ##1 can be \string...
+ \doifvalue{\??id#1\c!refereren}{\v!aan}
+ {\pagereference[#1:##1]}}}}}
+
+\def\dosetregister#1%
+ {\doifelsevalue{\??id#1\c!koppeling}{\v!ja}
+ {\dosetlinkregister{#1}}
+ {\dosetpageregister{#1}}}
+
+\newcounter\internallistreference
+
+\def\doloadregisterlinks#1%
+ {\dosetreglevel{\getvalue{\??id#1\c!criterium}}%
+ \setregisterpage{#1}%
+ \setvalue{#1\s!entrya}##1%
+ {\global\firstregisterpagetrue
+ \doglobal\convertargument##1\to\currentregisterentry % \doglobal nodig?
+ \doglobal\increment\internallistreference}%
+ \setvalue{#1\s!page}##1##2##3%
+ {\doifreglevelelse[##2]
+ {\global\utilitydonetrue
+ \iffirstregisterpage
+ \global\firstregisterpagefalse
+ \setxvalue{\??id#1\??id\currentregisterentry}%
+ {\internallistreference::##1-##3}%
+ \else
+ \setxvalue{\??id#1\??id\currentregisterentry}%
+ {\getvalue{\??id#1\??id\currentregisterentry},##1-##3}%
+ \fi}
+ {}}}
+
+\def\dokoppelregister[#1][#2]%
+ {\iflocation
+ \begingroup
+ \let\dosetregister=\doloadregisterlinks
+ \stelregisterin[#1][#2]%
+ \doutilities{#1}{\jobname}{#1}{}{}%
+ \endgroup
+ \fi}
+
+\def\koppelregister%
+ {\dodoubleempty\dokoppelregister}
+
+\def\doprocesslinkedregister[#1][#2]#3%
+ {\hbox
+ {\doprocessregister[#2]{#3}%
+ \let\firstlistreference=\empty
+ \let\lastlistreference=\empty
+ \let\selflistreference=\empty
+ \let\prevlistreference=\empty
+ \let\nextlistreference=\empty
+ \getalllistreferences{#1}{#3}%
+ \doifnot{\alllistreferences}{}
+ {\def\dodocommando[##1-##2]%
+ {\ifx\firstlistreference\empty
+ \def\firstlistreference{##1-##2}%
+ \fi
+ \def\lastlistreference{##1-##2}%
+ \ifnum##1<\nextinternalreference\relax
+ \def\prevlistreference{##1-##2}%
+ \else\ifnum##1>\nextinternalreference\relax
+ \def\nextlistreference{##1-##2}%
+ \def\dodocommando[####1-####2]%
+ {\def\lastlistreference{####1-####2}}%
+ \else
+ \def\selflistreference{##1-##2}%
+ \fi\fi}%
+ \def\docommando##1%
+ {\dodocommando[##1]}%
+ \processcommacommand[\alllistreferences]\docommando}%
+ \ifx\prevlistreference\empty
+ \let\prevlistreference=\lastlistreference
+ %\let\gobackwardcharacter=\gotoendcharacter
+ \fi
+ \ifx\nextlistreference\empty
+ \let\nextlistreference=\firstlistreference
+ %\let\goforwardcharacter=\gotobegincharacter
+ \fi
+ \ifx\prevlistreference\selflistreference
+ \let\prevlistreference=\empty
+ \let\nextlistreference=\empty
+ \fi
+ \def\dodocommando[##1-##2]%
+ {\gotonextinternal{\s!ind}{##1}{##2}{\copy0}}%
+ \def\docommando##1##2%
+ {\setbox0=\hbox to 1em{\hss\showlocation{##2}\hss}%
+ \ifx##1\empty
+ \hskip\wd0 % (optioneel maken)
+ \else
+ \expandafter\dodocommando\expandafter[##1]%
+ \fi}%
+ \bgroup
+ \docommando\prevlistreference{\gobackwardcharacter}%
+ \egroup
+ \bgroup
+ \doifreferencefoundelse{\s!lin:\internallistreference}
+ {\gotosomeinternal
+ {\s!lin}{\internallistreference}{\currentrealreference}
+ {\showlocation{#3}}}
+ {\hbox{#3}}%
+ \egroup
+ \bgroup
+ \docommando\nextlistreference{\goforwardcharacter}%
+ \egroup}}
+
+\def\dodolinkedregister[#1][#2]#3%
+ {\bgroup
+ \def\currentregister{#1}%
+ \iflocation
+ \doifelsevalue{\??id#1\c!koppeling}{\v!ja}
+ {\def\next{\doprocesslinkedregister[#1][#2]{#3}}}
+ {\def\next{\doprocessregister[#2]{#3}}}% ook hier [#1]
+ \else
+ \def\next{\doprocessregister[#2]{#3}}%
+ \fi
+ \next
+ \egroup
+ \ifvmode\nobreak\fi
+ \GotoPar}
+
+\def\dolinkedregister#1%
+ {\dodoubleempty\dodolinkedregister[#1]}
+
+\def\complexdoplaatsregister[#1]%
+ {\begingroup
+ \stelregisterin[\currentregister][#1]%
+ \raggedright
+ \startkolommen
+ [\c!n=\getvalue{\??id\currentregister\c!n},
+ \c!balanceren=\getvalue{\??id\currentregister\c!balanceren},
+ \c!uitlijnen=\getvalue{\??id\currentregister\c!uitlijnen}]%
+ \mindermeldingen
+ \startopelkaar[\v!blanko]%
+ \doutilities{\currentregister}{\jobname}{\currentregister}{}{\par}%
+ \stopopelkaar
+ \stopkolommen
+ \endgroup}
+
+\def\doplaatsregister[#1]%
+ {\def\currentregister{#1}%
+ \complexorsimpleempty{doplaatsregister}}
+
+\def\plaatsregister%
+ {\dosingleargument\doplaatsregister}
+
+\def\complexdovolledigregister[#1]% \@EA's kunnen weg
+ {\@EA\plaatsvolledig\@EA{\@EA\systemsuppliedchapter\@EA}%
+ \@EA{\@EA\currentregister\@EA}%
+ \@EA{\@EA\headtext\@EA{\currentregister}}%
+ {\complexdoplaatsregister[#1]}}
+
+\def\dovolledigregister[#1]%
+ {\def\currentregister{#1}%
+ \complexorsimpleempty{dovolledigregister}}
+
+\def\volledigregister%
+ {\dosingleargument\doplaatsregister}
+
+\def\dodefinieerregister[#1][#2]%
+ {\stelregisterin[#1]%
+ [\c!n=2,
+ \c!balanceren=\v!ja, % \v!nee komt niet zo vaak voor
+ \c!uitlijnen=\v!nee,
+ \c!voor=\blanko, % binnen kolommen: \blanko[\v!regel]
+ \c!na=,
+ \c!symbool=,
+ \c!interactie=\v!paginanummer,
+ \c!afstand=1em,
+ \c!letter=\v!vet,
+ \c!aanduiding=\v!ja,
+ \v!deel\c!nummer=\v!ja,
+ \v!hoofdstuk\c!nummer=\v!nee,
+ \c!criterium=\v!alles,
+ \c!commando=,
+ \c!refereren=\v!aan]%
+ \presetheadtext[#1=\Woord{#1}]%
+ \setvalue{#1}%
+ {\doregister{#1}}%
+ \setvalue{\e!gekoppelde#1}%
+ {\dolinkedregister{#1}}%
+ \setvalue{\s!set#1}%
+ {\dosetregister{#1}}%
+ \setvalue{\s!reset#1}%
+ {\doresetregister{#1}}%
+ \addutilityreset{#1}%
+ \setvalue{\e!zie#1}%
+ {\dozieregister{#1}}%
+ \setvalue{\e!plaats#1}%
+ {\doplaatsregister[#1]}%
+ \setvalue{\e!volledige#1}%
+ {\dovolledigregister[#1]}%
+ \setvalue{\e!stel#1\e!in}[##1]%
+ {\getparameters[\??id#1][##1]}}
+
+\def\definieerregister%
+ {\dodoubleargument\dodefinieerregister}
+
+\def\registerlengte {\utilityregisterlength}
+
+\def\utilityregisterlength {0}
+
+\def\dobepaalregisterkenmerken[#1][#2]%
+ {\begingroup
+ \stelregisterin[#1][#2]%
+ \dosetreglevel{\getvalue{\??id#1\c!criterium}}%
+ \setvalue{#1\s!page}##1##2##3%
+ {\doifreglevelelse[##2]
+ {\doglobal\increment\utilitylistlength
+ \global\utilitydonetrue}
+ {}}%
+ \doglobal\newcounter\utilityregisterlength
+ \setbox0=\vbox
+ {\doutilities{#1}{\jobname}{#1}{}{}}%
+ \endgroup}
+
+\def\bepaalregisterkenmerken%
+ {\dodoubleempty\dobepaalregisterkenmerken}
+
+%I n=Index
+%I c=\index,\zieindex,\volledigeindex
+%I
+%I Een ingang naar de index wordt gecreeerd met:
+%I
+%I \index[ascii]{ingang+ingang+ingang}
+%I
+%I Een verwijzing wordt gecreerd met:
+%I
+%I \zieindex[ascii]{ingang+ingang+ingang}{andere ingang}
+%I
+%I Een index kan (vooralsnog) alleen een eenvoudig
+%I zetcommando afhandelen, bijvoorbeeld: \index{\bf{test}} of
+%I \index{\kap{anwb}}. Meer is vaak niet nodig.
+%I
+%I Als een ingang niet goed gesorteerd wordt, dient [ascii]
+%I te worden meegegeven: \index[anwb]{\kap{anwb}}.
+%I
+%I Een index wordt gegenereerd met:
+%I
+%I \plaatsindex
+%I \volledigeindex
+
+%T n=index
+%T m=ind
+%T a=i
+%T
+%T \index{?}
+
+%I n=Buffers
+%I c=\startbuffer,\haalbuffer,\typebuffer
+%I
+%I Een stuk tekst kan in een buffer worden opgeslagen en
+%I later worden opgeroepen. Dit kan de opbouw van de
+%I ruwe ASCII-file ten goede komen.
+%I
+%I \startbuffer[naam]
+%I \stopbuffer
+%I
+%I Een buffer is eigenlijk een tijdelijke file. Deze file
+%I heeft de extensie 'tmp' en overschrijft dus een file met
+%I dezelfde naam!
+%I
+%I Een buffer kan worden opgeroepen met:
+%I
+%I \haalbuffer[naam]
+%I \typebuffer[naam]
+%I
+%I In alle gevallen is de naam optioneel en mag dus worden
+%I weggelaten.
+%P
+%I Voor en na het wegschrijven kunnen commando's worden
+%I uitgevoerd. Deze worden ingesteld met:
+%I
+%I \stelbufferin[voor=,na=]
+%P
+%I Omdat het argument optioneel is, wat moet worden getest,
+%I worden alle spaties tot het eerste woord onderdrukt. Dit
+%I betekent dat als er moet worden getypt (\typebuffer) en
+%I terwijl voor het eerste woord spaties moeten staan, er
+%I bewust wel (!) een naam moet worden opgegeven.
+
+% nog \definieerbuffer[naam]
+%
+% \startnaam == \startbuffer[#1][naam]
+
+% \EveryPar%
+% {\doglobal\newcounter\NOfLines}
+%
+% \EveryLine%
+% {\doglobal\increment\NOfLines%
+% \hskip-3em%
+% \hbox to 3em{\hss\NOfLines\hskip1em}}
+
+%\def\dostartbuffer[#1][#2]%
+% {\showmessage{\m!systems}{15}{#1}%
+% \doifelse{#2}{}
+% {\let\stopbuffer=\relax % \undefined
+% \convertargument\stopbuffer\to\endofblock}
+% {\letvalue{#2}=\relax % \undefined
+% \@EA\convertargument\csname#2\endcsname\to\endofblock}%
+% \def\closeblock%
+% {\immediate\closeout\tmpblocks
+% \egroup
+% \getvalue{#2}}%
+% \doifelsenothing{#1}
+% {\immediate\openout\tmpblocks=\jobname.\f!temporaryextension}
+% {\immediate\openout\tmpblocks=#1.\f!temporaryextension}%
+% \setupcopyblock
+% \def\writeoutblocks##1{}%
+% \copyblockline}
+
+\def\processnextbufferline#1#2#3%
+ {\relax % checken waarom eerdere macro dit nodig heeft / supp-mps run
+ \convertargument#1 \to\next
+ \doifinstringelse{\endofblock}{\next}
+ {\ifnum\nestedbufferlevel=0\relax % \relax ?
+ \def\next{#2}%
+ \else
+ \decrement\nestedbufferlevel\relax
+ \def\next{#3}%
+ \fi}
+ {\doifinstringelse{\beginofblock}{\next}
+ {\increment\nestedbufferlevel\relax
+ \def\next{#3}}
+ {\def\next{#3}}}%
+ \next}
+
+\def\dostartbuffer[#1][#2][#3]%
+ {\showmessage{\m!systems}{15}{#1}%
+ \doifelse{#3}{}
+ {\let\stopbuffer=\relax % \undefined
+ \convertargument startbuffer\to\beginofblock % else a space
+ \let\processnextblockline=\processnextbufferline
+ \convertargument\stopbuffer\to\endofblock}
+ {\letvalue{#3}=\relax % \undefined
+ \@EA\convertargument\csname#2\endcsname\to\beginofblock
+ \@EA\convertargument\csname#3\endcsname\to\endofblock}%
+ \def\closeblock%
+ {\immediate\closeout\tmpblocks
+ \egroup
+ \getvalue{#3}}%
+ \doifelsenothing{#1}
+ {\immediate\openout\tmpblocks=\jobname.\f!temporaryextension}
+ {\immediate\openout\tmpblocks=#1.\f!temporaryextension}%
+ \newcounter\nestedbufferlevel
+ \setupcopyblock
+ \def\writeoutblocks##1{}%
+ \copyblockline}
+
+\def\startbuffer%
+ {\bgroup
+ \obeylines % nodig, anders gaat 't fout als direct \starttabel (bv)
+ \dotripleempty\dostartbuffer}
+
+\def\dobuffer[#1]#2%
+ {\doifelsenothing{#1}
+ {#2{\jobname.\f!temporaryextension}{}{}}
+ {#2{#1.\f!temporaryextension}{}{}}}
+
+\def\dohaalbuffer[#1]%
+ {\@@buvoor
+\beginrestorecatcodes
+ \showmessage{\m!systems}{16}{#1}%
+ \dobuffer[#1]\readjobfile
+\endrestorecatcodes
+ \@@buna}
+
+\def\haalbuffer%
+ {\dosingleempty\dohaalbuffer}
+
+\def\dotypebuffer[#1]%
+ {\bgroup
+ % no, just like \starttyping % \setuptyping[\c!voor=\@@buvoor,\c!na=\@@buna]%
+ \showmessage{\m!systems}{17}{#1}%
+ \dobuffer[#1]\typefile
+ \egroup}
+
+\def\typebuffer%
+ {\dosingleempty\dotypebuffer}
+
+\def\stelbufferin%
+ {\dodoubleargument\getparameters[\??bu]}
+
+%I n=Tekstblokken
+%I c=\definieerblok,\verbergblokken,\handhaafblokken
+%I c=\gebruikblokken,\selecteerblokken,\stelblokin
+%I
+%I Het is mogelijk blokken tekst te verbergen en op andere
+%I plaatsen in de tekst op te roepen. Voorbeelden hiervan
+%I zijn vragen en antwoorden. De antwoorden kunnen onder de
+%I vragen worden ingetypt en bijvoorbeeld in een apart
+%I hoofdstuk worden opgenomen.
+%I
+%I Een tekstblok wordt gedefinieerd met het commando
+%I
+%I \definieerblok[naam]
+%I
+%I en wordt vervolgens steeds omringd door de commando's
+%I
+%I \beginvannaam
+%I tekst
+%I \eindvannaam
+%P
+%I Het zetten van blokken kan worden onderdrukt met het
+%I commando
+%I
+%I \verbergblokken[naam,naam,...]
+%I
+%I wat weer ongedaan gemaakt kan worden met:
+%I
+%I \handhaafblokken[naam,naam,...]
+%I
+%I Blokken kunnen worden opgeroepen met de commando's
+%I
+%I \gebruikblokken[naam,naam,...]
+%I \selecteerblokken[naam,naam,...][criterium=]
+%I
+%I Als criterium kan worden opgegeven: alles of hoofdstuk. In het
+%I laatste geval worden alleen de bij het actulele hoofdstuk horende
+%I blokken tussengevoegd.
+%P
+%I Men moet zonodig eerst het (opnieuw) aanmaken van referenties
+%I onderdrukken met het commando \stelrefererenin[status=stop].
+%I
+%I Genummerde tekstonderdelen (b.v. \doornummeren[vraag]) moeten
+%I desgewenst worden gereset (b.v.\resetvraag)
+%P
+%I De met het volgende commando in te stellen parameters hebben
+%I betrekking op het gebruiken van blokken:
+%I
+%I \stelblokin[naam][voor=,na=,binnen=,letter=]
+%I
+%I Een blok wordt altijd binnen een groep uitgevoerd ({ }).
+%I Zowel 'voor' als 'na' worden buiten deze groep
+%I uitgevoerd, en 'binnen' binnen de groep.
+%P
+%I Soms is het wenselijk tijdens \gebruikblokken sommige blokken
+%I wel 'uit te voeren' maar niet (nogmaals) in de tekst op te
+%I nemen. Als een blok wordt definieerd met:
+%I
+%I \beginvannaam[-]
+%I tekst
+%I \eindvannaam
+%I
+%I dan wordt het ter plaatse al dan niet gezet en bij het later
+%I oproepen wel verwerkt maar niet gezet.
+%I
+%I Als in de tekst een blok wel moet worden verwerkt, maar niet
+%I gezet, dan kan [+] worden opgegeven.
+%P
+%I Het handhaven, verbergen en gebruiken van blokken kan door
+%I de hele tekst plaatsvinden. Binnen ieder hoofdstuk kunnen
+%I bijvoorbeeld blokken worden gedefinieerd die aan het eind van
+%I het hoofdstuk worden opgeroepen. Dit mechanisme noodzaakt
+%I tenminste twee maal verwerken van de file met TeX.
+%I
+%I Een tweede pass is echter niet nodig als na het gebruik geen
+%I nieuwe blokken meer worden gedefinieerd. In dat geval kan
+%I vlak voordat de blokken worden opgeroepen, het commando
+%I
+%I \geenblokkenmeer
+%I
+%I worden gegeven. Dit scheelt tijd.
+
+% In eerste instantie is gebruik gemaakt van een utilityfile. Dit
+% is echter niet perse noodzakelijk. Wellicht dat als er blokken
+% moeten worden gesorteerd, toch weer texutil moet worden
+% gebruikt.
+
+% In de block-move variant hieronder wordt gebruik gemaakt van
+% de in de \answer-macro van Knuth gebruikte copieermethode.
+% Blokken kunnen worden
+%
+% \gehandhaafd : in de tekst worden opgenomen ‚n gecopieerd
+% \verborgen : alleen worden gecopieerd
+% \gebruikt : later in de tekst worden opgenomen
+% \geselecteerd : later selectief in de tekst worden opgenomen
+%
+% Ieder blok wordt gecopieerd naar de file 'jobname.tmp'.
+% Daarnaast wordt een blok tijdelijk opgeslagen in de file
+% 'texutil.tmp'. Handhaven kom tneer op het opnieuw inlezen van
+% deze file.
+%
+% De file 'jobname.tmp' wordt later gecopieerd naar de file
+% 'jobname.tum'. Dit is nodig om in een eerdere run verzamelde
+% blokken te kunnen verwerken.
+
+% Werken met \copie gaat fout. Bovendien zijn de spaties
+% belangrijk!
+%
+% \def\c!copie{copie} % vervalt, verkeerde catcodes
+
+% The use of \string prevents spaces kreeping in when
+% converting the string. Although we can use \meaning in a
+% more direct way, we prfer to use \convertargument, because
+% this way the macro's are more readible.
+
+\def\blockversion {1996.03.10}
+
+\def\@@blockerrormessage%
+ {\showmessage{\m!textblocks}{1}{}%
+ \global\let\@@blockerrormessage=\relax}
+
+\def\thisisblockversion#1%
+ {\doifnot{\blockversion}{#1}%
+ {\@@blockerrormessage
+ \endinput}}
+
+\def\stopcopyingblocks%
+ {\ifcopyingblocks
+ \immediate\closeout\outblocks
+ \copyblockfile
+ \global\copyingblocksfalse
+ \fi}
+
+\def\dodosetblockcounters[#1:#2]#3%
+ {\setvalue{\??se\s!old#3}{#1}%
+ \doifnot{#3}{\lastsection}
+ {\dodosetblockcounters[#2:0]{\getvalue{\??se#3\c!na}}}}
+
+\def\dosetblockcounters[#1#2::#3]%
+ {\ifblockpermitted
+ \dodosetblockcounters[#3:0]\firstsection
+ \setsectiontype[#1]%
+ \def\@@sectionvalue##1{\getvalue{\??se\s!old##1}}%
+ \def\@@sectionconversion##1##2{##2}% to get rid of {##2}
+ \fi}
+
+\def\setblockcounters%
+ {\@EA\dosetblockcounters\@EA[\blockstatus]}
+
+\def\getblockstatus#1%
+ {\dosetblklevel{\getvalue{\??by\@@bscriterium}}%
+ \doifblklevelelse[#1]
+ {\global\blockpermittedtrue}
+ {\global\blockpermittedfalse}%
+ \def\blockstatus{#1}}
+
+\newwrite\outblocks
+\newread\inpblocks
+\newwrite\tmpblocks
+
+\newif\ifcopyingblocks
+
+\newbox\blockbox
+
+\newif\ifvisible
+\visibletrue
+
+\newif\ifblockpermitted
+
+\newcount\blocklevel
+\blocklevel=0
+
+\newif\ifoldinbijlagen
+
+\def\opentmpblock%
+ {\immediate\openout\tmpblocks=\f!utilityfilename.\f!temporaryextension}
+
+\def\closetmpblock%
+ {\immediate\write\tmpblocks{}% een lege regel is handig voor \par commando's
+ \immediate\closeout\tmpblocks}
+
+\newif\iftmpblockstarted
+
+\def\writetmpblock#1%
+ {\iftmpblockstarted
+ \immediate\write\tmpblocks{#1}%
+ \else
+ \doifsomething{#1}
+ {\tmpblockstartedtrue
+ \immediate\write\tmpblocks{\string#1}}%
+ \fi}
+
+\def\startcopyingblocks%
+ {\global\copyingblocksfalse}
+
+\def\checkcopyingblocks%
+ {\ifcopyingblocks
+ \else
+ \immediate\openout\outblocks\f!utilityfilename.\f!blockextension
+ \immediate\write\outblocks{\string\thisisblockversion{\blockversion}}%
+ \global\copyingblockstrue
+ \fi}
+
+\def\stopcopyingblocks%
+ {\ifcopyingblocks
+ \immediate\closeout\outblocks
+ \copyblockfile
+ \global\copyingblocksfalse
+ \fi}
+
+\def\geenblokkenmeer%
+ {\stopcopyingblocks}
+
+\def\copyblockfile
+ {\ifcopyingblocks
+ \begingroup
+ \showmessage{\m!textblocks}{2}{\jobname.\f!blockextension}%
+ \openlocin{\inpblocks}{\f!utilityfilename.\f!blockextension}%
+ \immediate\openout\outblocks\jobname.\f!blockextension
+ \setupcopyblock
+ \catcode`\^^M=\@@ignore\relax
+ \def\copynextline
+ {\read\inpblocks to \!!stringa
+ \immediate\write\outblocks{\!!stringa}%
+ \ifeof\inpblocks
+ \def\copynextline{}%
+ \fi
+ \copynextline}%
+ \copynextline
+ \immediate\closein\inpblocks
+ \immediate\closeout\outblocks
+ \immediate\openout\tmpblocks\f!utilityfilename.\f!blockextension
+ \immediate\closeout\tmpblocks
+ \endgroup
+ \fi}
+
+\def\loadallblocks#1%
+ {\beginrestorecatcodes
+\catcode`\^^M=\@@endofline\relax
+ \readjobfile{#1.\f!blockextension}
+ {\showmessage{\m!textblocks}{3}{#1.\f!blockextension}}
+ {\showmessage{\m!textblocks}{4}{}}%
+ \endrestorecatcodes}
+
+\def\setupcopyblock%
+ {\!!counta=1\relax
+ \loop
+ \catcode\!!counta=\@@other
+ \advance\!!counta by 1\relax
+ \ifnum\!!counta<255\relax
+ \repeat
+ \obeylines}
+
+\def\writeoutblocks%
+ {\immediate\write\outblocks}
+
+\def\processnextblocklineAB#1#2#3%
+ {\convertargument#1 \to\next
+ \doifinstringelse{\endofblockA}{\next}
+ {\def\next{#2}}
+ {\doifinstringelse{\endofblockB}{\next}
+ {\def\next{#2}}
+ {\def\next{#3}}}%
+ \next}
+
+\bgroup
+\obeylines
+\gdef\copyblocklineAB#1
+ {\processnextblocklineAB{#1}%
+ {\closeblock}%
+ {\writeoutblocks{#1}%
+ \writetmpblock{#1}%
+ \copyblocklineAB}}
+\gdef\skipblocklineAB#1
+ {\processnextblocklineAB{#1}%
+ {\closeblock}%
+ {\skipblocklineAB}}
+\egroup
+
+\def\processnextblockline#1#2#3%
+ {\convertargument#1 \to\next
+ \doifinstringelse{\endofblock}{\next}
+ {\def\next{#2}}
+ {\def\next{#3}}%
+ \next}
+
+\bgroup
+\obeylines
+\gdef\copyblockline#1
+ {\processnextblockline{#1}%
+ {\closeblock}%
+ {\writeoutblocks{#1}%
+ \writetmpblock{#1}%
+ \copyblockline}}
+\gdef\skipblockline#1
+ {\processnextblockline{#1}%
+ {\closeblock}%
+ {\skipblockline}}
+\egroup
+
+\def\skipblock#1%
+ {\checkcopyingblocks
+ \@EA\convertargument\string\thiswasblock{#1}\to\endofblock
+%testen : \expanded{\convertargument\string\thiswasblock{#1}\noexpand\to\noexpand\endofblock}%
+ \let\openblock=\begingroup
+ \let\closeblock=\endgroup
+ \openblock
+ \setupcopyblock
+ \skipblockline}
+
+\def\doafterblock#1#2{}
+\def\dobeforeblock#1#2{}
+
+\def\thisisblock#1%
+ {\executeifdefined{\s!thisisblock#1}{\skipblock{#1}}}
+
+\def\thiswasblock#1%
+ {\getvalue{\s!thiswasblock#1}}
+
+\def\saveblock#1#2%
+ {\checkcopyingblocks
+ \obeylines
+ %\@EA\convertargument\string\eindvan#1\to\endofblockA
+ \@EA\@EA\@EA\convertargument\@EA\string\csname\e!eindvan#1\endcsname\to\endofblockA
+%testen: \expanded{\convertargument\string\csname\e!eindvan#1\endcsname\to\endofblockA}%
+ \@EA\convertargument\string\eindvanblok[#1]\to\endofblockB % MULTI LINGUAL MAKEN
+ \def\openblock%
+ {\dobeforeblock{#1}{#2}%
+ \opentmpblock
+ \begingroup
+ \makesectionformat
+ \immediate\write\outblocks{}%
+ \immediate\write\outblocks{\string\thisisblock{#1}{\sectionformat}[#2]}}%
+ \def\closeblock%
+ {\immediate\write\outblocks{}% handig voor \par commando's
+ \immediate\write\outblocks{\string\thiswasblock{#1}}%
+ \endgroup
+ \closetmpblock
+ \doafterblock{#1}{#2}%
+ \egroup}%
+ \openblock
+ \setupcopyblock
+ \copyblocklineAB}
+
+\def\copyblock%
+ {\def\opentmpblock{}%
+ \def\closetmpblock{}%
+ \def\writetmpblock##1{}%
+ \saveblock}
+
+\def\loadoneblock%
+ {\readjobfile{\f!utilityfilename.\f!temporaryextension}{}{}}
+
+\def\dodefinieerblok[#1]%
+ {\passeerblok[#1]%
+ \handhaafblokken[#1]%
+ \stelblokin
+ [#1]
+ [\c!voor=\blanko,
+ \c!na=\blanko,
+ \c!binnen=,
+ \c!letter=,
+ \c!file=\jobname]}
+
+\def\definieerblok%
+ {\dosingleargument\dodefinieerblok}
+
+\def\dostelblokin[#1][#2]%
+ {\getparameters[\??tb#1][#2]}
+
+\def\stelblokin%
+ {\dodoubleargument\dostelblokin}
+
+\def\passeerblok[#1]%
+ {\setvalue{\s!thisisblock#1}##1[##2]%
+ {\skipblock{#1}}}
+
+\def\doverbergblok[#1][#2][#3]%
+ {\doifelsenothing{#2}
+ {\global\blockpermittedfalse
+ \edef\bloktitel{#1}}
+ {\doifelsenothing{#3}
+ {\global\blockpermittedtrue
+ \edef\bloktitel{#1}}
+ {\doifcommonelse{#2}{#3}
+ {\global\blockpermittedfalse
+ \edef\bloktitel{#1:#2}}
+ {\global\blockpermittedtrue
+ \edef\bloktitel{#1:#3}}}}%
+ \ifblockpermitted
+ \showwarning{\m!textblocks}{5}{\bloktitel}%
+ \def\next%
+ {\def\dobeforeblock####1####2%
+ {\begingroup}%
+ \def\doafterblock####1####2%
+ {\endgroup
+ \doexecuteloadedblock{#1}}%
+ \saveblock{#1}{#3}}%
+ \else
+ \doifinsetelse{+}{#3}
+ {\showwarning{\m!textblocks}{6}{\bloktitel}%
+ \def\next%
+ {\def\dobeforeblock####1####2%
+ {\begingroup
+ \global\visiblefalse}%
+ \def\doafterblock####1####2%
+ {{\setbox0=\vbox
+ {\catcode`\^^M=\@@endofline\relax
+ \loadoneblock
+ \par}}%
+ \endgroup}%
+ \saveblock{#1}{#3}}}%
+ {\showwarning{\m!textblocks}{7}{\bloktitel}%
+ \def\next%
+ {\def\dobeforeblock####1####2%
+ {\begingroup
+ \globaldefs=-1\relax}%
+ \def\doafterblock####1####2%
+ {\endgroup}%
+ \copyblock{#1}{#3}}}%
+ \fi
+ \next}
+
+\def\doverbergblokken[#1][#2]%
+ {\def\docommando##1%
+ {\setvalue{\e!beginvan##1}%
+ {\bgroup\obeylines\dotripleempty\doverbergblok[##1][#2]}}%
+ \processcommalist[#1]\docommando}
+
+\def\verbergblokken%
+ {\dodoubleempty\doverbergblokken}
+
+\def\doexecuteloadedblock#1%
+ {\blockpermittedtrue % ?
+ \getvalue{\??tb#1\c!voor}%
+ \bgroup
+ \doattributes{\??tb#1}{}%
+ \visibletrue
+ \catcode`\^^M=\@@endofline\relax
+ \getvalue{\??tb#1\c!binnen}%
+ \loadoneblock
+ \par
+ \egroup
+ \getvalue{\??tb#1\c!na}}
+
+\def\dohandhaafblok[#1][#2][#3]%
+ {\doifelsenothing{#2}
+ {\global\blockpermittedtrue
+ \edef\bloktitel{#1}}
+ {\doifcommonelse{#2}{#3}
+ {\global\blockpermittedtrue
+ \edef\bloktitel{#1:#2}}
+ {\doifinsetelse{\v!alles}{#2}
+ {\doifelse{#3}{}
+ {\global\blockpermittedtrue
+ \edef\bloktitel{#1}}
+ {\global\blockpermittedfalse
+ \edef\bloktitel{#1:#3}}}
+ {\global\blockpermittedfalse
+ \doifelse{#3}{}
+ {\edef\bloktitel{#1}}
+ {\edef\bloktitel{#1:#3}}}}}%
+ \ifblockpermitted
+ \showwarning{\m!textblocks}{8}{\bloktitel}%
+ \def\dobeforeblock##1##2%
+ {\begingroup}%
+ \def\doafterblock##1##2%
+ {\endgroup
+ \doexecuteloadedblock{#1}}%
+ \else
+ \showwarning{\m!textblocks}{9}{\bloktitel}%
+ \fi
+ \saveblock{#1}{#3}}
+
+\def\dohandhaafblokken[#1][#2]%
+ {\def\docommando##1%
+ {\setvalue{\e!beginvan##1}%
+ {\bgroup\obeylines\dotripleempty\dohandhaafblok[##1][#2]}}%
+ \processcommalist[#1]\docommando}
+
+\def\handhaafblokken%
+ {\dodoubleempty\dohandhaafblokken}
+
+\def\dodogebruikblok#1#2#3#4%
+ {\getblockstatus{#2}%
+ \ifblockpermitted%
+ \doifelsenothing{#4}
+ {\edef\bloktitel{#1}}
+ {\doifnotcommon{#3}{#4}
+ {\global\blockpermittedfalse}%
+ \edef\bloktitel{#1:#3}}%
+ \else
+ \edef\bloktitel{#1}%
+ \fi
+ \ifblockpermitted
+ \def\next%
+ {\global\advance\blocklevel by 1\relax
+ \doifinsetelse{-}{#3}
+ {\showwarning{\m!textblocks}{10}{\bloktitel}%
+ \setvalue{\s!thiswasblock#1}%
+ {\par\egroup}%
+ \setbox0=\vbox\bgroup}
+ {\showwarning{\m!textblocks}{11}{\bloktitel}%
+ \setvalue{\s!thiswasblock#1}%
+ {\par
+ \egroup
+ \getvalue{\??tb#1\c!na}%
+ \global\advance\blocklevel by -1\relax}%
+ \getvalue{\??tb#1\c!voor}%
+ \bgroup
+ \doattributes{\??tb#1}{}%
+ \visibletrue
+ \getvalue{\??tb#1\c!binnen}}}%
+ \else
+ \def\next%
+ {\showwarning{\m!textblocks}{12}{\bloktitel}%
+ \skipblock{#1}}%
+ \fi
+ \next}
+
+\def\dogebruikblok[#1][#2]%
+ {\setvalue{\s!thisisblock#1}##1[##2]%
+ {\dodogebruikblok{#1}{##1}{##2}{#2}}}
+
+\def\dogebruikblokken[#1][#2]%
+ {\def\docommando##1%
+ {\dogebruikblok[##1][#2]}%
+ \processcommalist[#1]\docommando
+ \getfromcommalist[#1][1]%
+ \doifdefined{\??tb\commalistelement\c!file}
+ {\loadallblocks{\getvalue{\??tb\commalistelement\c!file}}}%
+ \endgroup}
+
+\def\gebruikblokken%
+ {\begingroup
+ \doassign[\??bs][\c!criterium=\v!alles]%
+ \dodoubleempty\dogebruikblokken}
+
+\def\doselecteerblokken[#1][#2][#3]%
+ {\doifelsenothing{#3}
+ {\getparameters[\??bs][#2]%
+ \dogebruikblokken[#1][]}
+ {\getparameters[\??bs][#3]%
+ \dogebruikblokken[#1][#2]}}%
+
+\def\selecteerblokken%
+ {\begingroup
+ \doassign[\??bs][\c!criterium=\v!alles]%
+ \dotripleempty\doselecteerblokken}
+
+\def\beginvanblok[#1]% % er wordt ook gechecked op \eindvanblok[..]
+ {\getvalue{\e!beginvan#1}}
+
+%I n=Achtergronden
+%I c=\stelachtergrondenin
+%I
+%I Achter de tekst kan een achtergrond worden geplaatst.
+%I Voor de afzonderlijke elementen van een tekst wordt een
+%I achtergrond gedefinieerd met het commando:
+%I
+%I \stelachtergrondenin
+%I [boven,hoofd,tekst,voet,onder]
+%I [linkerrand,rechterrand,linkermarge,reachtermarge,tekst]
+%I [achtergrond=,kleur=,raster=]
+%I
+%I Voor de hele bladzijde gebruiken we:
+%I
+%I \stelachtergrondenin
+%I [pagina]
+%I [achtergrond=,kleur=,raster=]
+%P
+%I Het is mogelijk elk blok iets ruimer om de tekst te
+%I plaatsen met:
+%I
+%I \stelachtergrondenin
+%I [pagina]
+%I [offset=,diepte=]
+%I
+%I Een offset van .25\korpsgrootte en een diepte van
+%I .5\korpsgrootte voldoen aardig.
+%I
+%I Er kunnen ronde hoeken worden gezet met:
+%I
+%I \stelachtergrondenin
+%I [pagina]
+%I [hoek=,straal=]
+%I
+%I Hierbij kan voor hoek de instelling rond of recht worden
+%I meegegeven en voor straal een dimensie.
+
+% Don't use \@@mawhatevercommand directly, use \getvalue instead.
+
+\newif\ifnewbackground
+\newif\ifsomebackground
+
+\newbox\leftbackground
+\newbox\rightbackground
+
+\def\doaddpagebackground#1#2%
+ {\doifvaluesomething{\??ma#1\c!achtergrond}
+ {\setbox2=\vbox
+ {\offinterlineskip
+ \localframed
+ [\??ma#1]
+ [\c!breedte=\papierbreedte,\c!hoogte=\papierhoogte]%, \c!offset=\v!overlay]
+ {\getvalue{\??ma#1\c!commando}}}%
+ \wd2=\!!zeropoint
+ \dp2=\!!zeropoint
+ \setbox#2=\vbox
+ {\hbox{\box2\box#2}}}}
+
+\def\addpagebackground#1%
+ {\doifbothsidesoverruled
+ \doaddpagebackground{\v!rechterpagina}{#1}%
+ \orsideone
+ \doaddpagebackground{\v!rechterpagina}{#1}%
+ \orsidetwo
+ \doaddpagebackground{\v!linkerpagina}{#1}%
+ \od
+ \doaddpagebackground{\v!pagina}{#1}}
+
+\let\pagebackgroundhoffset = \!!zeropoint
+\let\pagebackgroundvoffset = \!!zeropoint
+\let\pagebackgrounddepth = \!!zeropoint
+
+% #1 = breedte
+% #2 = hoogte
+% #3 = pos
+% #4 = pos
+
+% \def\dododopagebodybackground#1#2#3#4%
+% {\doifelsevaluenothing{\??ma#3#4\c!achtergrond}
+% {\doifelsevalue{\??ma#3#4\c!kader}{\v!aan} % niet waterdicht, ook deelkaders
+% {\!!doneatrue}
+% {\!!doneafalse}}
+% {\!!doneatrue}%
+% \if!!donea
+% \localframed
+% [\??ma#3#4]
+% [\c!breedte=#1,\c!hoogte=#2,\c!offset=\v!overlay]
+% {\getvalue{\??ma#3#4\c!commando}}%
+% \else
+% \hskip#1%
+% \fi}
+
+\def\dododopagebodybackground#1#2#3#4%
+ {\edef\!!stringe{\??ma#3#4}%
+ \doifelsevaluenothing{\!!stringe\c!achtergrond }
+ {\doifelsevalue{\!!stringe\c!kader }\v!aan\!!doneatrue
+ {\doifelsevalue{\!!stringe\c!linker\c!kader }\v!aan\!!doneatrue
+ {\doifelsevalue{\!!stringe\c!rechter\c!kader}\v!aan\!!doneatrue
+ {\doifelsevalue{\!!stringe\c!boven\c!kader }\v!aan\!!doneatrue
+ {\doifelsevalue{\!!stringe\c!onder\c!kader }\v!aan\!!doneatrue
+ \!!doneafalse}}}}}
+ \!!doneatrue
+ \if!!donea
+ \localframed
+ [\??ma#3#4]
+ [\c!breedte=#1,\c!hoogte=#2,\c!offset=\v!overlay]
+ {\getvalue{\??ma#3#4\c!commando}}%
+ \else
+ \hskip#1%
+ \fi}
+
+\def\dodopagebodybackground#1#2%
+ {\setbox0=\vbox to #2
+ \bgroup\hbox\bgroup
+ \swapmargins
+ \goleftonpage
+ \dododopagebodybackground\linkerrandbreedte#2#1\v!linkerrand
+ \hskip\linkerrandafstand
+ \hskip\pageseparation
+ \dododopagebodybackground\linkermargebreedte#2#1\v!linkermarge
+ \hskip\linkermargeafstand
+ \dododopagebodybackground\zetbreedte#2#1\v!tekst
+ \hskip\rechtermargeafstand
+ \dododopagebodybackground\rechtermargebreedte#2#1\v!rechtermarge
+ \hskip\pageseparation
+ \hskip\rechterrandafstand
+ \dododopagebodybackground\rechterrandbreedte#2#1\v!rechterrand
+ \egroup\egroup
+ \wd0=\!!zeropoint\relax
+ \box0\relax}
+
+\def\setbackgroundbox#1#2%
+ {\global\setbox#1=\vbox
+ {\offinterlineskip
+ \mindermeldingen
+ \calculatereducedvsizes
+ #2\relax
+ \vskip-\bovenhoogte
+ \vskip-\bovenafstand
+ \dodopagebodybackground\v!boven\bovenhoogte
+ \vskip\bovenafstand
+ \dodopagebodybackground\v!hoofd\hoofdhoogte
+ \vskip\hoofdafstand
+ \dodopagebodybackground\v!tekst\teksthoogte
+ \vskip\voetafstand
+ \dodopagebodybackground\v!voet\voethoogte
+ \vskip\onderafstand
+ \dodopagebodybackground\v!onder\onderhoogte
+ \vfilll}%
+ \smashbox#1}
+
+\def\setbackgroundboxes%
+ {\ifsomebackground\ifnewbackground
+ \showmessage{\m!layouts}{8}{}%
+ \docheckbackgrounddefinitions
+ \setbackgroundbox\leftbackground\relax
+ \ifdubbelzijdig
+ \setbackgroundbox\rightbackground\doswapmargins
+ \fi
+ \global\newbackgroundfalse
+ \doifelsevaluenothing{\??ma\v!tekst\v!tekst\c!achtergrond}
+ {\global\let\pagebackgroundhoffset=\!!zeropoint
+ \global\let\pagebackgroundvoffset=\!!zeropoint
+ \global\let\pagebackgrounddepth=\!!zeropoint}
+ {\bgroup
+ \dimen0=\getvalue{\??ma\v!pagina\c!offset}%
+ \doifnothing
+ {\getvalue{\??ma\v!boven\v!tekst\c!achtergrond}%
+ \getvalue{\??ma\v!onder\v!tekst\c!achtergrond}}
+ {\xdef\pagebackgroundhoffset{\the\dimen0}}%
+ \doifnothing
+ {\getvalue{\??ma\v!tekst\v!rechterrand\c!achtergrond}%
+ \getvalue{\??ma\v!tekst\v!linkerrand\c!achtergrond}}
+ {\xdef\pagebackgroundvoffset{\the\dimen0}%
+ \dimen0=\getvalue{\??ma\v!pagina\c!diepte}%
+ \xdef\pagebackgrounddepth{\the\dimen0}}%
+ \egroup}%
+ \fi\fi}
+
+\def\getbackgroundbox%
+ {\ifsomebackground
+ \setbackgroundboxes
+ \startinteractie
+ \doifmarginswapelse
+ {\copy\leftbackground}
+ {\copy\rightbackground}%
+ \stopinteractie
+ \fi}
+
+% saves us hundreds of unused hash entries if not needed
+
+\def\docheckbackgrounddefinitions% allocates about 1000 hash-entries
+ {\doifdefined{\??ma\v!pagina\c!achtergrond}% skip first pass
+ {\def\dodocommando##1##2%
+ {\copylocalframed[\??ma##1##2][\??ma\v!pagina]%
+ \getparameters[\??ma##1##2]
+ [\c!achtergrond=,\c!kader=,\c!kleur=,\c!raster=]%
+ \copyparameters
+ [\??ma##1##2\c!kader][\??ma##1##2]
+ [\c!kleur,\c!raster]%
+ \copyparameters
+ [\??ma##1##2\c!achtergrond][\??ma##1##2]
+ [\c!kleur,\c!raster]}%
+ \def\docommando##1%
+ {\dodocommando##1\v!linkerrand \dodocommando##1\v!linkermarge
+ \dodocommando##1\v!tekst
+ \dodocommando##1\v!rechtermarge \dodocommando##1\v!rechterrand}%
+ \docommando\v!boven \docommando\v!hoofd
+ \docommando\v!tekst
+ \docommando\v!voet \docommando\v!onder
+ \def\docheckbackgrounddefinitions%
+ {\global\somebackgroundtrue}}}
+
+\def\dostelachtergrondenin[#1][#2][#3]%
+ {\docheckbackgrounddefinitions
+ \global\newbackgroundtrue
+ \iffirstargument % \dostelachtergrondenin zonder arg mag
+ \ifthirdargument
+ \def\docommando##1%
+ {\doifinsetelse{##1}{\v!pagina,\v!linkerpagina,\v!rechterpagina}
+ {\getparameters[\??ma##1][#3]%
+ \dosetpageseparation}
+ {\def\dodocommando####1%
+ {\getparameters[\??ma##1####1][#3]}
+ \processcommalist[#2]\dodocommando}}%
+ \processcommalist[#1]\docommando
+ \else
+ \doifcommonelse{#1}{\v!pagina,\v!linkerpagina,\v!rechterpagina}
+ {\def\docommando##1%
+ {\getparameters[\??ma##1][#2]}%
+ \processcommalist[#1]\docommando
+ \dosetpageseparation}
+ {\dostelachtergrondenin
+ [#1]
+ [\v!linkerrand,\v!linkermarge,\v!tekst,\v!rechtermarge,\v!rechterrand]
+ [#2]}%
+ \fi
+ \fi}
+
+\def\stelachtergrondenin%
+ {\dotripleempty\dostelachtergrondenin}
+
+% a lot of setups, including short ones
+
+\presetlocalframed [\??ma\v!pagina]
+\presetlocalframed [\??ma\v!linkerpagina]
+\presetlocalframed [\??ma\v!rechterpagina]
+
+\copyparameters
+ [\??ma\v!pagina\c!kader][\??ma\v!pagina]
+ [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster]
+
+\copyparameters
+ [\??ma\v!pagina\c!achtergrond][\??ma\v!pagina]
+ [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster]
+
+\copyparameters
+ [\??ma\v!linkerpagina\c!kader][\??ma\v!linkerpagina]
+ [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster]
+
+\copyparameters
+ [\??ma\v!linkerpagina\c!achtergrond][\??ma\v!linkerpagina]
+ [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster]
+
+\copyparameters
+ [\??ma\v!rechterpagina\c!kader][\??ma\v!rechterpagina]
+ [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster]
+
+\copyparameters
+ [\??ma\v!rechterpagina\c!achtergrond][\??ma\v!rechterpagina]
+ [\c!offset,\c!diepte,\c!straal,\c!hoek,\c!kleur,\c!raster]
+
+\def\@@pageseparation {6pt}
+\def\pageseparation {0pt}
+
+\def\paginascheiding {\pageseparation}
+
+\def\dosetpageseparation%
+ {\let\pageseparation=\!!zeropoint
+ \let\showpageseparation=\relax
+ \processaction
+ [\getvalue{\??ma\v!pagina\c!scheider}]
+ [ \v!ruim=>\let\pageseparation=\@@pageseparation
+ \let\showpageseparation=\showloosepageseparation,
+ \v!passend=>\let\pageseparation=\@@pageseparation
+ \let\showpageseparation=\showtightpageseparation]}
+
+\def\showloosepageseparation%
+ {\ifdim\pageseparation>\!!zeropoint\relax
+ \bgroup
+ \setbox0=\hbox
+ {\vrule
+ \!!width\pageseparation
+ \!!depth\papierhoogte
+ \!!height\papierhoogte}%
+ \ht0=\!!zeropoint
+ \dp0=\!!zeropoint
+ \box0
+ \egroup
+ \fi}
+
+\def\showtightpageseparation%
+ {\ifdim\pageseparation>\!!zeropoint\relax
+ \bgroup
+ \dimen0=\teksthoogte
+ \advance\dimen0 by \kopwit
+ \doifsometextlineelse{\v!hoofd}
+ {\advance\dimen0 by \hoofdhoogte
+ \advance\dimen0 by \hoofdafstand}
+ {}%
+ \dimen2=\papierhoogte
+ \advance\dimen2 by -\dimen0
+%\advance\dimen0 by -1cm % nog eens optie
+%\advance\dimen2 by -1cm % nog eens optie
+ \setbox0=\hbox
+ {\vrule
+ \!!width\pageseparation
+ \!!depth\dimen2
+ \!!height\dimen0}%
+ \ht0=\!!zeropoint
+ \dp0=\!!zeropoint
+ \box0
+ \egroup
+ \fi}
+
+%I n=File-management
+%I c=\starttekst,\startprojekt,\startonderdeel,\startprodukt
+%I c=\startomgeving,\startdeelomgeving
+%I
+%I Een eenvoudige tekst wordt gestart en gestopt met de
+%I commando's:
+%I
+%I \starttekst
+%I \stoptekst
+%P
+%I Het is mogelijk een projektstructuur op te zetten. Per
+%I projekt wordt een file aangemaakt waarin de volgende
+%I commando's voorkomen:
+%I
+%I \startprojekt naam
+%I \stopprojekt
+%I
+%I Als deze file in TeX wordt geladen, dan worden alle
+%I produkten achter elkaar gezet.
+%I
+%I Een produkt wordt gedefinieerd met:
+%I
+%I \startprodukt naam
+%I \stopprodukt
+%I
+%I Deze file kan zelfstandig door TeX worden gehaald.
+%P
+%I Een omgeving wordt gedefinieerd door:
+%I
+%I \startomgeving naam
+%I \stopomgeving
+%I
+%I Een onderdeel wordt gedefinieerd door:
+%I
+%I \startonderdeel naam
+%I \stoponderdeel
+%I
+%I Files worden eerst gezocht op het actuele gebied. Als een
+%I file niet aanwezig is wordt op de 'roots' gezocht.
+%I
+%I Een onderdeel kan zelfstandig door TeX worden gehaald.
+%P
+%I Binnen een projekt, produkt, omgeving of onderdeel komen
+%I de volgende instellingen voor (tussen haakjes=facultatief):
+%I
+%I projekt omgeving produkt onderdeel
+%I
+%I \projekt naam * *
+%I \omgeving naam (*) (*) (*) (*)
+%I \produkt naam *
+%I \onderdeel naam (*) (*)
+%I
+%I Binnen een omgeving kunnen deelomgevingen worden gedefinieerd
+%I die alleen voor bepaalde produkten, onderdelen enz. gelden.
+%I
+%I \startdeelomgeving[naam,...,naam]
+%I commando's
+%I \stopdeelomgeving
+%P
+%I Het programma TeXEdit doorzoekt bij het aanmaken van een
+%I file-menu de hele tekst op de genoemde commando's. Bij een
+%I lange tekst kan dit misschien 'te' lang duren. Met het
+%I commando:
+%I
+%I \geenfilesmeer
+%I
+%I kan worden aangegeven dat er geen structuurcommando's meer
+%I volgen.
+%I
+%I Ten behoeve van TeXUtil moet in plaats van het commando
+%I \input het commando \verwerkfile{naam} worden gebruikt.
+%P
+%I Als men standaard een en ander wil instellen, dan kan men
+%I dit doen in de file 'cont-sys.tex'. Deze file wordt direkt
+%I na het opstarten geladen cq. uitgevoerd. Daarnaast wordt,
+%I indien aanwezig, de file 'cont-new.tex' geladen.
+
+%T n=starttekst
+%T m=sta
+%T a=x
+%T
+%T \starttekst
+%T
+%T ?
+%T
+%T \stoptekst
+
+\def\currentproject {}
+\def\currentproduct {}
+\def\currentenvironment {}
+\def\currentcomponent {}
+
+\def\loadedfiles {}
+\def\processedfiles {}
+
+\let\geenfilesmeer=\relax
+
+\newcounter\textlevel
+\newcounter\fileprocesslevel
+
+\setvalue{\c!file::0}{\jobname}
+
+\def\processedfile%
+ {\getvalue{\c!file::\fileprocesslevel}}
+
+\def\processfile#1%
+ {\doglobal\increment\fileprocesslevel
+ \setxvalue{\c!file::\fileprocesslevel}{#1}%
+ \@EA\doglobal\@EA\addtocommalist\@EA{#1}\processedfiles
+ \readlocfile{#1}{}{}
+ \doglobal\decrement\fileprocesslevel}
+
+\def\registreerfileinfo#1#2%
+ {\immediatewriteutility{f #1 {#2}}}
+
+\doifundefined{preloadfonts} {\let\preloadfonts=\relax}
+\doifundefined{preloadspecials} {\let\preloadspecials=\relax}
+
+\def\loadsystemfiles%
+ {\readsysfile{\f!newfilename}
+ {\showmessage{\m!systems}{2}{\f!newfilename}}{}%
+ \readsysfile{\f!oldfilename}
+ {\showmessage{\m!systems}{2}{\f!oldfilename}}{}%
+ \readsysfile{\f!filfilename}
+ {\showmessage{\m!systems}{2}{\f!filfilename}}{}%
+ \readsysfile{\f!sysfilename}
+ {\showmessage{\m!systems}{2}{\f!sysfilename}}{}}
+
+\def\loadoptionfile%
+ {\readsysfile{\f!optfilename}
+ {\showmessage{\m!systems}{2}{\f!optfilename}}{}}
+
+% \newevery \everyjob \EveryJob
+% \appendtoks ... \to \everyjob
+
+\appendtoks \meldaanmaakdatum \to \everyjob
+\appendtoks \loadsystemfiles \to \everyjob
+\appendtoks \preloadfonts \to \everyjob
+\appendtoks \settopskip \to \everyjob
+\appendtoks \preloadspecials \to \everyjob
+\appendtoks \openspecialfile \to \everyjob
+\appendtoks \checkutilityfile \to \everyjob
+\appendtoks \openutilities \to \everyjob
+\appendtoks \loadoptionfile \to \everyjob
+\appendtoks \loadtwopassdata \to \everyjob
+\appendtoks \setupfootnotes \to \everyjob % eigenlijk ergens anders
+ % hangt af van korps
+\let\normalend=\end
+\newevery \everybye \EveryBye
+
+\def\end%
+ {\the\everybye
+ \normalend}
+
+\appendtoks \pagina[\v!laatste] \pagina
+ \ifarrangingpages\poparrangedpages\fi \to \everybye
+
+\appendtoks \registreerfileinfo{e}{\jobname} \to \everybye
+\appendtoks \stopcopyingblocks \to \everybye
+\appendtoks \closeutilities \to \everybye
+\appendtoks \closespecialfile \to \everybye
+
+\def\starttekst%
+ {\ifnum\textlevel=0\relax
+ \registreerfileinfo{b}{\jobname}%
+ \startcopyingblocks
+ \fi
+ \doglobal\increment\textlevel\relax}
+
+\def\stoptekst%
+ {\doglobal\decrement\textlevel\relax
+ \ifnum\textlevel>0\relax
+ \let\next=\relax
+ \else
+ \let\next=\end
+ \fi
+ \next}
+
+\def\doexecutefileonce#1%
+ {\beforesplitstring#1\at.\to\currentfile
+ \ExpandBothAfter\doifnotinset{\currentfile}{\loadedfiles}%
+ {\ExpandFirstAfter\addtocommalist{\currentfile}\loadedfiles
+ \doexecutefile{#1}}}
+
+\def\doexecutefile#1%
+ {\registreerfileinfo{b}{#1}
+ \processfile{#1}%
+ \registreerfileinfo{e}{#1}}
+
+\def\donotexecutefile#1%
+ {}
+
+\def\verwerkfile#1 %
+ {\doexecutefile{#1}}
+
+\def\omgeving #1 % at outermost level only
+ {\def\startomgeving ##1 {}%
+ \let\stopomgeving=\relax
+ \startreadingfile
+ \readlocfile{#1}{}{}%
+ \stopreadingfile}
+
+\newcounter\filelevel
+
+\def\!!donextlevel#1#2#3#4#5#6\\%
+ {\beforesplitstring#6\at.\to#1
+ \ifnum\filelevel=0\relax
+ \starttekst
+ \def\projekt ##1 {#2{##1}}%
+ \def\omgeving ##1 {#3{##1}}%
+ \def\produkt ##1 {#4{##1}}%
+ \def\onderdeel ##1 {#5{##1}}%
+ \fi
+ \increment\filelevel\relax
+ \ExpandFirstAfter\addtocommalist{#1}\loadedfiles}
+
+\def\doprevlevel%
+ {\ifnum\filelevel=1\relax
+ \let\next=\stoptekst
+ \else
+ \decrement\filelevel\relax
+ \let\next=\endinput
+ \fi
+ \next}
+
+\def\startprojekt #1 %
+ {\!!donextlevel\currentproject
+ \donotexecutefile\doexecutefileonce
+ \doexecutefileonce\doexecutefile#1\\}
+
+\def\stopprojekt%
+ {\doprevlevel}
+
+\def\startprodukt #1 %
+ {\!!donextlevel\currentproduct
+ \doexecutefileonce\doexecutefileonce
+ \donotexecutefile\doexecutefile#1\\}
+
+\def\stopprodukt%
+ {\doprevlevel}
+
+\def\startonderdeel #1 %
+ {\!!donextlevel\currentcomponent
+ \doexecutefileonce\doexecutefileonce
+ \donotexecutefile\doexecutefile#1\\}
+
+\def\stoponderdeel%
+ {\doprevlevel}
+
+\def\startomgeving #1 %
+ {\!!donextlevel\currentenvironment
+ \donotexecutefile\doexecutefileonce
+ \donotexecutefile\donotexecutefile#1\\}
+
+\def\stopomgeving%
+ {\doprevlevel}
+
+\long\def\skipdeelomgeving#1\stopdeelomgeving%
+ {}
+
+\def\startdeelomgeving[#1]%
+ {\def\partialenvironments{}%
+ \def\docommando##1%
+ {\beforesplitstring##1\at.\to\someevironment
+ \ExpandFirstAfter\addtocommalist{\someevironment}\partialenvironments}%
+ \processcommalist[#1]\docommando
+ \ExpandBothAfter\doifcommonelse
+ {\currentproject,\currentproduct,
+ \currentcomponent,\currentenvironment}
+ {\partialenvironments}
+ {\let\stopdeelomgeving=\relax
+ \let\next=\relax}
+ {\let\next=\skipdeelomgeving}%
+ \next}
+
+\def\startproduct{\startproduct}
+\def\stopproduct {\stopproduct}
+\def\startproject{\startprojekt}
+\def\stopproject {\stopprojekt}
+
+\def\project{\projekt}
+\def\product{\produkt}
+
+\def\deelomgeving #1 %
+ {\doexecutefileonce{#1}}
+
+\expanded
+ {\long\noexpand\def\csname\e!start\e!instellingen\endcsname##1 ##2\csname\e!stop\e!instellingen\endcsname%
+ {\noexpand\long\noexpand\setvalue{\??su##1}{##2}}}
+
+\long\def\startsetups#1 #2\stopsetups% for international purposes
+ {\long\setvalue{\??su#1}{#2}}
+
+\def\dodosetups#1%
+ {\getvalue{\??su#1}}
+
+\def\dosetups[#1]%
+ {\iffirstargument
+ \dodosetups{#1}%
+ \else
+ \expandafter\dodosetups
+ \fi}
+
+\def\setups%
+ {\dosingleargument\dosetups}
+
+\newif\ifvoorlopig
+\voorlopigfalse
+
+\newif\ifconcept
+\conceptfalse
+
+\def\infofont%
+ {\getvalue{7pttttf}}
+
+%\def\mathinfofont%
+% {\eightpoint\tt}
+
+\edef\utilityversion {1996.03.15}
+\edef\contextversion {\the\normalyear.\the\normalmonth.\the\normalday\normalspace}
+\edef\copyrightversion {Copyright 1990-\the\normalyear\normalspace / PRAGMA / J. Hagen - A.F. Otten}
+
+% Nog toevoegen:
+%
+% For calculating random numbers we use Donald Arseneau's macros.
+
+\def\meldaanmaakdatum%
+ {\writeline
+ \writestring{This is CONTEXT version <\contextversion>
+ interface <\currentinterface>
+ responses <\currentresponses>}%
+ \writeline
+ \writestring{This package is based on Plain TeX. It uses an adapted version of the}%
+ \writestring{extended mark mechanism of J. Fox (1987) and a few parts of the sidefloat}%
+ \writestring{mechanism of D. Comenetz (1993). Most of D.E. Knuth's Plain TeX}%
+ \writestring{(\fmtversion) is available and can be used without problems. This package}%
+ \writestring{uses TaBlE, a package designed and copyrighted by M.J. Wichura (1988).}%
+ \writestring{Only a few auxiliary files are generated, of which some must be processed}%
+ \writestring{by TeXUtil (\utilityversion). The current blockversion is \blockversion.}%
+ \writeline
+ \writestring{\copyrightversion}%
+ \writeline}
+
+\startinterface dutch
+
+\def\meldaanmaakdatum%
+ {\writeline
+ \writestring{Dit is CONTEXT versie <\contextversion>
+ interface <\currentinterface>
+ meldingen <\currentresponses>}%
+ \writeline
+ \writestring{Dit pakket is gebaseerd op Plain TeX. Er wordt gebruik gemaakt van een}%
+ \writestring{aangepaste versie van het mark mechanisme van J. Fox (1987) en onderdelen}%
+ \writestring{van het sidefloat mechanisme van D. Comenetz (1993). De functionaliteit}%
+ \writestring{van D.E. Knuth's Plain TeX (\fmtversion) is grotendeels beschikbaar en kan}%
+ \writestring{zonder problemen worden gebruikt. Dit pakket gebruikt TaBlE, ontworpen door}%
+ \writestring{M.J. Wichura (1988), die ook het auteursrecht bezit. Er worden slechts een}%
+ \writestring{paar hulpfiles gegenereerd, waarvan er enkele moeten worden bewerkt door}%
+ \writestring{TeXUtil (\utilityversion). Het blokmechanisme heeft versienummer \blockversion.}%
+ \writeline
+ \writestring{\copyrightversion}%
+ \writeline}
+
+\stopinterface
+
+\startinterface german
+
+\def\meldaanmaakdatum%
+ {\writeline
+ \writestring{Dies ist CONTEXT Version <\contextversion>
+ Interface <\currentinterface>
+ Meldungen <\currentresponses>}%
+ \writeline
+ \writestring{Dieses Paket basiert auf Plain-TeX und benutzt eine angepasste Version}%
+ \writestring{des erweiterten mark-Mechanismus von J. Fox (1987) und einige Teile des}%
+ \writestring{sidefloat-Mechanismus von D. Comenetz (1993). Ein Grossteil D.E. Knuths}%
+ \writestring{Plain-TeX (\fmtversion) ist verfuegbar und kann ohne Probleme benutzt werden.}%
+ \writestring{Dieses Paket benutzt TaBlE, ein von M.J. Wichura (1988) erstelltes und}%
+ \writestring{geschuetztes Paket. Nur einige Hilfsdateien werden erstellt; einige davon}%
+ \writestring{muessen von TeXUtil (\utilityversion) bearbeitet werden. Die aktuelle Block-}%
+ \writestring{version ist \blockversion.}%
+ \writeline
+ \writestring{\copyrightversion}%
+ \writeline}
+
+\stopinterface
+
+\def\meldveranderingen%
+ {\writeline
+ \writestring{Currently, the reference mechanism of ConTeXt is optimized as well as}%
+ \writestring{extended. There is also beta grid snapping in combination with some}%
+ \writestring{more footnote features. Please report any anomalities to pragma@pi.net.}%
+ \writeline
+ \writestring{At this moment some pdfTeX primitives and functionality are under}%
+ \writestring{reconstruction. Please use the most recent tpd special driver!}}
+
+\appendtoks \meldveranderingen \to \everybye
+
+\def\doplaatsversieaanduiding#1#2%
+ {\doifsomething{#2}
+ {\@EA\convertargument#2\to\ascii
+ \ #1: \ascii\
+ \!!doneatrue}}
+
+\def\plaatsversieaanduiding%
+ {\ifvoorlopig
+ \vskip\!!sixpoint
+ \hbox to \zetbreedte
+ {\infofont
+ Versie: \currentdate\
+ \doplaatsversieaanduiding{Project}\currentproject
+ \doplaatsversieaanduiding{Produkt}\currentproduct
+ \doplaatsversieaanduiding{Onderdeel}\currentcomponent
+ \if!!donea\else\ File: \jobname\fi
+ \hss\reportpagedimensions}%
+ \fi
+ \ifconcept
+ \vskip\!!sixpoint
+ \hbox to \zetbreedte
+ {\infofont
+ Concept: \currentdate
+ \hss\reportpagedimensions}%
+ \fi}
+
+% tot hier
+
+\def\doversie[#1]%
+ {\voorlopigfalse
+ \conceptfalse
+ \overfullrule=\!!zeropoint
+ \processaction
+ [#1]
+ [\v!voorlopig=>\voorlopigtrue
+ \overfullrule=5pt,
+ \v!concept=>\concepttrue]}
+
+\def\versie%
+ {\dosingleargument\doversie}
+
+\newbox\referentieinfobox
+\newbox\registerinfobox
+\newbox\floatinfobox
+
+\def\dotestinfo#1#2#3%
+ {\ifvoorlopig
+ \begingroup
+ \convertargument#3\to\ascii
+ \xdef\extratestinfo%
+ {#2 \ascii}%
+ \gdef\totaltestinfo%
+ {\global\setbox#1=\vbox
+ {\unvbox#1\relax
+ \hbox
+ {\infofont
+ \strut
+ \expandafter\doboundtext\expandafter
+ {\extratestinfo}
+ {\rechtermargebreedte}
+ {..}%
+ \quad}}}%
+ \endgroup
+ \ifinner
+ \aftergroup\totaltestinfo
+ \else
+ \totaltestinfo
+ \fi
+ \fi}
+
+\def\referentieinfo%
+ {\dotestinfo\referentieinfobox}
+
+\def\registerinfo%
+ {\dotestinfo\registerinfobox}
+
+\def\floatinfo%
+ {\dotestinfo\floatinfobox}
+
+\def\plaatstestinfo%
+ {\setbox0=\vbox to \teksthoogte
+ {\forgetall
+ \hsize\rechtermargebreedte
+ \ifvoid\floatinfobox\else
+ \infofont\strut Plaatsblokken
+ \vskip\!!sixpoint
+ \unvbox\floatinfobox
+ \vskip\!!twelvepoint
+ \fi
+ \ifvoid\referentieinfobox\else
+ \infofont\strut Verwijzingen
+ \vskip\!!sixpoint
+ \unvbox\referentieinfobox
+ \vskip\!!twelvepoint
+ \fi
+ \ifvoid\registerinfobox\else
+ \infofont\strut Registers
+ \vskip\!!sixpoint
+ \unvbox\registerinfobox
+ \fi
+ \vss}%
+ \wd0=\!!zeropoint
+ \box0\relax}
+
+%I n=Commando's
+%I c=\definieer,\naam
+%I c=\gebruikcommandos
+%I
+%I Het is mogelijk eigen commando's te definieren met behulp
+%I van het commando:
+%I
+%I \definieer[aantal argumenten]\commando{betekenis}
+%I
+%I Een argument kan worden opgeroepen door een # gevolgd
+%I een nummer, bijvoorbeeld #2.
+%I
+%I \definieer\test{ziezo} \ziezo
+%I \definieer[1]\test{ziezo #1} \ziezo{}
+%I \definieer[2]\test{ziezo #1 en #2} \ziezo{}{}
+%P
+%I In commandonamen mogen alleen karakters voorkomen. Mocht
+%I onverhoopt een cijfer nodig zijn, dan kunnen dergelijke
+%I commando's worden opgeroepen met:
+%I
+%I \naam{}
+%I
+%I In een aantal gevallen, bijvoorbeeld bij het wegschrijven
+%I naar lijsten, worden commando's \noexpand-ed. Dit is
+%I bijvoorbeeld het geval bij synoniemen en sorteren, als
+%I het criterium ongelijk is aan 'alles'. Dergelijke (zelf)
+%I gedefinieerde commando's dienen eerst te worden
+%I geactiveerd met :
+%I
+%I \gebruikcommandos{\commando}
+%I
+%I Er mogen meerdere commando's tegelijk worden opgegeven:
+%I
+%I \gebruikcommandos{\alfa,\beta,gamma}
+%I
+%I waarbij de \ facultatief is. Er wordt niets gezet!
+
+% \docommando kan niet worden gebruikt omdat deze macro
+% soms lokaal wordt gebruikt
+
+% te zijner tijd:
+%
+% \definevariable {pc} % ProtectedCommand
+%
+% \def\executeprotected#1%
+% {\csname\??pc\string#1\endcsname}
+%
+% \def\defineprotected#1#2%
+% {\expandafter\def\csname\??pc\string#2\endcsname}
+%
+% \def\defineunprotected#1%
+% {\def#1}
+%
+% \def\doprotected%
+% {\ifx\next\define
+% \let\next=\defineprotected
+% \else
+% \let\next=\executeprotected
+% \fi
+% \next}
+%
+% \def\unexpanded%
+% {\futurelet\next\doprotected}
+%
+% \unexpanded\define\ziezo{ziezo}
+%
+% \unexpanded\ziezo
+
+\def\complexdodefinieer[#1]#2#3%
+ {\ifx#2\undefined
+ \else
+ \showmessage{\m!systems}{4}{\string#2}%
+ \fi
+ \ifcase0#1\def#2{#3}%
+ \or\def#2##1{#3}%
+ \or\def#2##1##2{#3}%
+ \or\def#2##1##2##3{#3}%
+ \or\def#2##1##2##3##4{#3}%
+ \or\def#2##1##2##3##4##5{#3}%
+ \or\def#2##1##2##3##4##5##6{#3}%
+ \or\def#2##1##2##3##4##5##6##7{#3}%
+ \or\def#2##1##2##3##4##5##6##7##8{#3}%
+ \or\def#2##1##2##3##4##5##6##7##8##9{#3}%
+ \else\def#2{#3}%
+ \fi}
+
+\def\definieer%
+ {\complexorsimpleempty{dodefinieer}}
+
+\def\naam#1%
+ {\donottest\getvalue{#1}}
+
+\def\gebruikcommandos#1%
+ {\bgroup
+ \def\docommando##1%
+ {\setbox0=\hbox{\getvalue{\string##1}##1}}%
+ \processcommalist[#1]\docommando
+ \egroup}
+
+%I n=Groeperen
+%I c=\start,\definieerstartstop
+%I
+%I Met behulp van de volgende commando's kan de werking van
+%I andere commando's worden beperkt:
+%I
+%I \start[label]
+%I \stop[label]
+%I
+%I Men is vrij in de keuze van het commentaar. Het gebruik
+%I van deze commando's komt overeen met het gebruiken van {}.
+%P
+%I Er kunnen \start-\stop-paren worden gedefinieerd en
+%I ingesteld met:
+%I
+%I \definieerstartstop[label][voor=,na=,commandos=,
+%I letter=]
+%I
+%I De aan 'voor' en 'na' toegekende commando's worden voor
+%I \start en na \stop uitgevoerd; de aan 'commando'
+%I toegekende commando's direct na \start.
+%I
+%I Naast het \start-\stop-paar is ook het verkorte commando
+%I beschikbaar:
+%I
+%I \label{tekst}
+
+\def\complexstart[#1]% % bgroup toegevoegd
+ {\bgroup\getvalue{\e!start#1}}
+
+\def\simplestart%
+ {\bgroup}
+
+\def\complexstop[#1]%
+ {\getvalue{\e!stop#1}\egroup} % egroup toegevoegd
+
+\def\simplestop%
+ {\egroup}
+
+\def\start%
+ {\complexorsimple{\e!start}}
+
+\def\stop%
+ {\complexorsimple{\e!stop}}
+
+\def\dodefinieerstartstop[#1][#2]%
+ {\getparameters
+ [\??be#1]
+ [\c!voor=,
+ \c!na=,
+ \c!commandos=,
+ \c!letter=,
+ #2]%
+ \setvalue{#1}##1%
+ {\bgroup
+ \getvalue{\??be#1\c!commandos}%
+ \doattributes{\??be#1}{##1}%
+ \egroup}%
+ \setvalue{\e!start#1}%
+ {\getvalue{\??be#1\c!voor}%
+ \bgroup
+ \getvalue{\??be#1\c!commandos}%
+ \dostartattributes{\??be#1}{}}%
+ \setvalue{\e!stop#1}%
+ {\dostopattributes
+ \egroup
+ \getvalue{\??be#1\c!na}}}
+
+\def\definieerstartstop%
+ {\dodoubleargument\dodefinieerstartstop}
+
+%I n=Verbergen
+%I c=\startverbergen
+%I
+%I Een deel van de tekst kan (tijdelijk) worden
+%I overgeslagen door deze te omhullen met de commando's:
+%I
+%I \startverbergen
+%I \stopverbergen
+
+% the buffer mechanism handles nesting, add some switch
+
+\setvalue{\e!start\e!verbergen}%
+ {\startbuffer[buf-\nofpostponedblocks]
+ [\e!start\e!verbergen][\e!stop\e!verbergen]}
+
+% gejat van Knuth (zie \copyright, p356)
+
+\def\omcirkeld#1%
+ {{\ooalign{\hfil\raise0.07ex\hbox{{\tfx#1}}\hfil\crcr\mathhexbox20D}}}
+
+\def\copyright
+ {\omcirkeld{c}}
+
+%I n=Systeem
+%I c=\stelsysteemin
+%I
+%I Systeemvariabelen kunnen worden ingesteld met het
+%I commando:
+%I
+%I \stelsysteemin[resolutie=,korps=]
+%I
+%I Aan 'resolutie' dient het aantal dpi (300).
+
+\def\dostelsysteemin[#1]%
+ {\getparameters[\??sv][#1]%
+ \beforesplitstring\@@svresolutie\at dpi\to\@@svresolutie
+ \let\outputresolution=\@@svresolutie}
+
+\def\stelsysteemin%
+ {\dosingleargument\dostelsysteemin}
+
+% Default-instellingen (verborgen)
+
+\resetutilities
+
+% Uitgestelde instellingen
+
+\def\dooutput{\sidefloatoutput} % redefinition of \dooutput
+
+% Default-instellingen (zichtbaar)
+
+\stelsysteemin
+ [\c!resolutie=300dpi,
+ \c!korps=\normalizedlocalbodyfontsize] % of iets anders
+
+% Pas op:
+%
+% Omdat er geen fonts geladen zijn kunnen we bij de maten geen
+% em's gebruiken. Bij afstanden is dit geen probleem, omdat
+% deze pas een rol spelen als er al een font geladen is.
+
+\stellayoutin
+ [ \c!kopwit=.08417508418\papierhoogte, % .08333 2.5cm
+ %\c!boven=.03367003367\papierhoogte, % .03331 1.0cm
+ \c!boven=\!!zeropoint,
+ \c!bovenafstand=\!!zeropoint,
+ \c!hoofd=.06734006734\papierhoogte, % .06667 2.0cm
+ \c!hoofdafstand=\!!zeropoint,
+ \c!hoogte=.84175084175\papierhoogte, % .83333 25.0cm
+ \c!voetafstand=\@@lyhoofdafstand,
+ \c!voet=.06734006734\papierhoogte, % .06667 2.0cm
+ \c!onderafstand=\@@lybovenafstand,
+ \c!onder=\!!zeropoint,
+ \c!rugwit=.11904761905\papierbreedte, % 2.5cm
+ %\c!rand=.14285714286\papierbreedte, % 3.0cm
+ \c!rand=\!!zeropoint,
+ \c!randafstand=\@@lymargeafstand,
+ %\c!marge=\@@lyrugwit,
+ %\c!marge=.07888078409\papierbreedte, % rugwit-2*afstand
+ \c!marge=.12649983170\papierbreedte, % snijwit-2*afstand
+ \c!margeafstand=.02008341748\papierbreedte, % 12.0pt
+ \c!linkerrand=\@@lyrand,
+ \c!linkerrandafstand=\@@lyrandafstand,
+ \c!linkermarge=\@@lymarge,
+ \c!linkermargeafstand=\@@lymargeafstand,
+ \c!breedte=.71428571429\papierbreedte, % 15.0cm
+ \c!rechtermargeafstand=\@@lymargeafstand,
+ \c!rechtermarge=\@@lymarge,
+ \c!rechterrandafstand=\@@lyrandafstand,
+ \c!rechterrand=\@@lyrand,
+ \c!kopoffset=\!!zeropoint,
+ \c!rugoffset=\!!zeropoint,
+ \c!letter=,
+ \c!markering=\v!uit,
+ \c!plaats=\v!enkelzijdig,
+ \c!schaal=1,
+ \c!nx=1,
+ \c!ny=1,
+ \c!grid=\v!nee,
+ \c!regels=]
+
+% instellingen hierop terugvallen, bijvoorbeeld de volgende:
+
+\definieerpapierformaat [A0] [\c!breedte=841mm, \c!hoogte=1189mm]
+\definieerpapierformaat [A1] [\c!breedte=594mm, \c!hoogte=841mm]
+\definieerpapierformaat [A2] [\c!breedte=420mm, \c!hoogte=594mm]
+\definieerpapierformaat [A3] [\c!breedte=297mm, \c!hoogte=420mm]
+\definieerpapierformaat [A4] [\c!breedte=210mm, \c!hoogte=297mm]
+\definieerpapierformaat [A5] [\c!breedte=148mm, \c!hoogte=210mm]
+\definieerpapierformaat [A6] [\c!breedte=105mm, \c!hoogte=148mm]
+\definieerpapierformaat [A7] [\c!breedte=74mm, \c!hoogte=105mm]
+\definieerpapierformaat [A8] [\c!breedte=52mm, \c!hoogte=74mm]
+\definieerpapierformaat [A9] [\c!breedte=37mm, \c!hoogte=52mm]
+
+\definieerpapierformaat [B0] [\c!breedte=1000mm,\c!hoogte=1414mm]
+\definieerpapierformaat [B1] [\c!breedte=707mm, \c!hoogte=1000mm]
+\definieerpapierformaat [B2] [\c!breedte=500mm, \c!hoogte=707mm]
+\definieerpapierformaat [B3] [\c!breedte=354mm, \c!hoogte=500mm]
+\definieerpapierformaat [B4] [\c!breedte=250mm, \c!hoogte=354mm]
+\definieerpapierformaat [B5] [\c!breedte=177mm, \c!hoogte=250mm]
+\definieerpapierformaat [B6] [\c!breedte=125mm, \c!hoogte=177mm]
+\definieerpapierformaat [B7] [\c!breedte=88mm, \c!hoogte=125mm]
+\definieerpapierformaat [B8] [\c!breedte=63mm, \c!hoogte=88mm]
+\definieerpapierformaat [B9] [\c!breedte=44mm, \c!hoogte=63mm]
+
+\definieerpapierformaat [C0] [\c!breedte=917mm, \c!hoogte=1297mm]
+\definieerpapierformaat [C1] [\c!breedte=649mm, \c!hoogte=917mm]
+\definieerpapierformaat [C2] [\c!breedte=459mm, \c!hoogte=649mm]
+\definieerpapierformaat [C3] [\c!breedte=324mm, \c!hoogte=459mm]
+\definieerpapierformaat [C4] [\c!breedte=229mm, \c!hoogte=324mm]
+\definieerpapierformaat [C5] [\c!breedte=162mm, \c!hoogte=229mm]
+\definieerpapierformaat [C6] [\c!breedte=115mm, \c!hoogte=162mm]
+\definieerpapierformaat [C7] [\c!breedte=81mm, \c!hoogte=115mm]
+\definieerpapierformaat [C8] [\c!breedte=57mm, \c!hoogte=81mm]
+\definieerpapierformaat [C9] [\c!breedte=40mm, \c!hoogte=57mm]
+
+\definieerpapierformaat [S3] [\c!breedte=300pt, \c!hoogte=225pt]
+\definieerpapierformaat [S4] [\c!breedte=400pt, \c!hoogte=300pt]
+\definieerpapierformaat [S5] [\c!breedte=500pt, \c!hoogte=375pt]
+\definieerpapierformaat [S6] [\c!breedte=600pt, \c!hoogte=450pt]
+
+\definieerpapierformaat [CD] [\c!breedte=120mm, \c!hoogte=120mm]
+
+\definieerpapierformaat [letter] [\c!breedte=8.5in, \c!hoogte=11in]
+\definieerpapierformaat [legal] [\c!breedte=8.5in, \c!hoogte=14in]
+\definieerpapierformaat [folio] [\c!breedte=8.5in, \c!hoogte=13in]
+\definieerpapierformaat [executive] [\c!breedte=7.25in, \c!hoogte=10.5in]
+
+\definieerpapierformaat [envelope 9] [\c!breedte=8.88in, \c!hoogte=3.88in]
+\definieerpapierformaat [envelope 10] [\c!breedte=9.5in, \c!hoogte=4.13in]
+\definieerpapierformaat [envelope 11] [\c!breedte=10.38in,\c!hoogte=4.5in]
+\definieerpapierformaat [envelope 12] [\c!breedte=11.0in, \c!hoogte=4.75in]
+\definieerpapierformaat [envelope 14] [\c!breedte=11.5in, \c!hoogte=5.0in]
+\definieerpapierformaat [monarch] [\c!breedte=7.5in, \c!hoogte=3.88in]
+\definieerpapierformaat [check] [\c!breedte=8.58in, \c!hoogte=3.88in]
+\definieerpapierformaat [DL] [\c!breedte=220mm, \c!hoogte=110mm]
+
+% Let op: na \stellayoutin (omdat dit wordt aangeroepen).
+
+\stelpapierformaatin
+ [A4][A4]
+
+\stelinterliniein
+ [\c!hoogte=.72,
+ \c!diepte=.28,
+ \c!boven=1.0,
+ \c!onder=0.4,
+ \c!regel=2.8ex]
+
+\stelkolommenin
+ [\c!n=2,
+ \c!lijn=\v!uit,
+ \c!tolerantie=\v!soepel,
+ \c!afstand=1.5\korpsgrootte, % influenced by switching
+ \c!hoogte=,
+ \c!balanceren=\v!ja,
+ \c!uitlijnen=\v!tekst,
+ \c!blanko={\v!regel,\v!vast},
+ \c!optie=,
+ \c!lijndikte=\linewidth,
+ \c!offset=.5\korpsgrootte]
+
+\stelhoofdtekstenin [\v!tekst] [] []
+\stelhoofdtekstenin [\v!marge] [] []
+\stelhoofdtekstenin [\v!rand] [] []
+
+\stelvoettekstenin [\v!tekst] [] []
+\stelvoettekstenin [\v!marge] [] []
+\stelvoettekstenin [\v!rand] [] []
+
+\stelteksttekstenin [\v!tekst] [] []
+\stelteksttekstenin [\v!marge] [] []
+\stelteksttekstenin [\v!rand] [] []
+
+\stelondertekstenin [\v!tekst] [] []
+\stelondertekstenin [\v!marge] [] []
+\stelondertekstenin [\v!rand] [] []
+
+\stelboventekstenin [\v!tekst] [] []
+\stelboventekstenin [\v!marge] [] []
+\stelboventekstenin [\v!rand] [] []
+
+\stelhoofdin [\c!status=\v!normaal,\c!voor=,\c!na=]
+\stelvoetin [\c!status=\v!normaal,\c!voor=,\c!na=]
+\steltekstin [\c!status=\v!normaal,\c!voor=,\c!na=]
+\stelbovenin [\c!status=\v!normaal,\c!voor=,\c!na=]
+\stelonderin [\c!status=\v!normaal,\c!voor=,\c!na=]
+
+\stelhoofdin [\c!na=\vss]
+\steltekstin [\c!voor=\vss,\c!na=\vss]
+\stelvoetin [\c!voor=\vss]
+
+\stelbovenin [\c!voor=\vss,\c!na=\vss]
+\stelonderin [\c!voor=\vss,\c!na=\vss]
+
+\stelhoofdin
+ [\v!tekst]
+ [\c!strut=\v!ja,
+ \c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!hoofd\v!tekst\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!hoofd\v!tekst\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!hoofd\v!tekst\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!hoofd\v!tekst\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelhoofdin
+ [\v!marge]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!hoofd\v!marge\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!hoofd\v!marge\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!hoofd\v!marge\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!hoofd\v!marge\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelhoofdin
+ [\v!rand]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!hoofd\v!rand\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!hoofd\v!rand\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!hoofd\v!rand\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!hoofd\v!rand\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelvoetin
+ [\v!tekst]
+ [\c!strut=\v!ja,
+ \c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!voet\v!tekst\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!voet\v!tekst\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!voet\v!tekst\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!voet\v!tekst\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelvoetin
+ [\v!marge]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!voet\v!marge\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!voet\v!marge\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!voet\v!marge\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!voet\v!marge\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelvoetin
+ [\v!rand]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!voet\v!rand\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!voet\v!rand\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!voet\v!rand\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!voet\v!rand\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelbovenin
+ [\v!tekst]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!boven\v!tekst\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!boven\v!tekst\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!boven\v!tekst\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!boven\v!tekst\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelbovenin
+ [\v!marge]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!boven\v!marge\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!boven\v!marge\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!boven\v!marge\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!boven\v!marge\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelbovenin
+ [\v!rand]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!boven\v!rand\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!boven\v!rand\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!boven\v!rand\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!boven\v!rand\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelonderin
+ [\v!tekst]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!boven\v!rand\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!boven\v!rand\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!boven\v!rand\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!boven\v!rand\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelonderin
+ [\v!marge]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!onder\v!marge\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!onder\v!marge\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!onder\v!marge\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!onder\v!marge\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelonderin
+ [\v!rand]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!onder\v!rand\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!onder\v!rand\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!onder\v!rand\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!onder\v!rand\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\steltekstin
+ [\v!tekst]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!tekst\v!tekst\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!tekst\v!tekst\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!tekst\v!tekst\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!tekst\v!tekst\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\steltekstin
+ [\v!marge]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!tekst\v!marge\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!tekst\v!marge\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!tekst\v!marge\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!tekst\v!marge\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\steltekstin
+ [\v!rand]
+ [\c!letter=,
+ \c!kleur=,
+ \c!linkertekst=,
+ \c!middentekst=,
+ \c!rechtertekst=,
+ \c!kantlijntekst=,
+ \c!margetekst=,
+ \c!linkerletter=\getvalue{\??tk\v!tekst\v!rand\c!letter},
+ \c!rechterletter=\getvalue{\??tk\v!tekst\v!rand\c!letter},
+ \c!linkerkleur=\getvalue{\??tk\v!tekst\v!rand\c!kleur},
+ \c!rechterkleur=\getvalue{\??tk\v!tekst\v!rand\c!kleur},
+ \c!linkerbreedte=,
+ \c!rechterbreedte=]
+
+\stelnummeringin
+ [\c!variant=\v!enkelzijdig,
+ \c!plaats={\v!hoofd,\v!midden},
+ \c!conversie=\v!cijfers,
+ \c!links=,
+ \c!rechts=,
+ \c!wijze=\v!per\v!deel,
+ \c!tekst=,
+ \v!hoofdstuk\c!nummer=\v!nee,
+ \v!deel\c!nummer=\v!ja,
+ \c!nummerscheider=--,
+ \c!tekstscheider=\tfskip,
+ \c!status=\v!start,
+ \c!commando=,
+ \c!letter=\v!normaal,
+ \c!kleur=]
+
+\stelblankoin
+ [\v!standaard,
+ \v!groot]
+
+\stelkoppenin
+ [\c!variant=\v!normaal,
+ \c!sectienummer=\v!ja,
+ \c!scheider=.,
+ \c!commando=]
+
+\definieersectieblok [\v!hoofdtekst] [\v!hoofdteksten] [\c!nummer=\v!ja]
+\definieersectieblok [\v!bijlage] [\v!bijlagen] [\c!nummer=\v!ja]
+\definieersectieblok [\v!inleiding] [\v!inleidingen] [\c!nummer=\v!nee]
+\definieersectieblok [\v!uitleiding] [\v!uitleidingen] [\c!nummer=\v!nee]
+
+\definieersectie[\v!sectie-1] % deel
+\definieersectie[\v!sectie-2] % hoofdstuk
+\definieersectie[\v!sectie-3] % paragraaf
+\definieersectie[\v!sectie-4] % subparagraaf
+\definieersectie[\v!sectie-5] % subsubparagraaf
+\definieersectie[\v!sectie-6] % subsubsubparagraaf
+\definieersectie[\v!sectie-7] % subsubsubsubparagraaf
+
+% \c!eigennummer ook hier?
+
+\definieerkop
+ [\v!deel]
+ [\c!sectie=\v!sectie-1]
+
+\definieerkop
+ [\v!hoofdstuk]
+ [\c!sectie=\v!sectie-2]
+
+\definieerkop
+ [\v!paragraaf]
+ [\c!sectie=\v!sectie-3]
+
+\definieerkop
+ [\v!sub\v!paragraaf]
+ [\c!sectie=\v!sectie-4,
+ \c!default=\v!paragraaf]
+
+\definieerkop
+ [\v!sub\v!sub\v!paragraaf]
+ [\c!sectie=\v!sectie-5,
+ \c!default=\v!paragraaf]
+
+\definieerkop
+ [\v!sub\v!sub\v!sub\v!paragraaf]
+ [\c!sectie=\v!sectie-6,
+ \c!default=\v!paragraaf]
+
+\definieerkop
+ [\v!sub\v!sub\v!sub\v!sub\v!paragraaf]
+ [\c!sectie=\v!sectie-7,
+ \c!default=\v!paragraaf]
+
+\definieerkop
+ [\v!titel]
+ [\c!koppeling=\v!hoofdstuk,
+ \c!default=\v!hoofdstuk,
+ \c!verhoognummer=\v!nee]
+
+\definieerkop
+ [\v!onderwerp]
+ [\c!koppeling=\v!paragraaf,
+ \c!default=\v!paragraaf,
+ \c!verhoognummer=\v!nee]
+
+\definieerkop
+ [\v!sub\v!onderwerp]
+ [\c!koppeling=\v!sub\v!paragraaf,
+ \c!default=\v!sub\v!paragraaf,
+ \c!verhoognummer=\v!nee]
+
+\definieerkop
+ [\v!sub\v!sub\v!onderwerp]
+ [\c!koppeling=\v!sub\v!sub\v!paragraaf,
+ \c!default=\v!sub\v!sub\v!paragraaf,
+ \c!verhoognummer=\v!nee]
+
+\definieerkop
+ [\v!sub\v!sub\v!sub\v!onderwerp]
+ [\c!koppeling=\v!sub\v!sub\v!sub\v!paragraaf,
+ \c!default=\v!sub\v!sub\v!sub\v!paragraaf,
+ \c!verhoognummer=\v!nee]
+
+\definieerkop
+ [\v!sub\v!sub\v!sub\v!sub\v!onderwerp]
+ [\c!koppeling=\v!sub\v!sub\v!sub\v!sub\v!paragraaf,
+ \c!default=\v!sub\v!sub\v!sub\v!sub\v!paragraaf,
+ \c!verhoognummer=\v!nee]
+
+\stelsectiein
+ [\v!sectie-2]
+ [\v!bijlage\c!conversie=\v!Letter,
+ \c!vorigenummer=\v!nee]
+
+\stelkopin
+ [\v!deel]
+ [\c!plaatskop=\v!nee]
+
+\stelkopin
+ [\v!hoofdstuk]
+ [\v!bijlage\c!label=\v!bijlage,
+ \v!hoofdtekst\c!label=\v!hoofdstuk] % bijlageconversie=\Character
+
+\stelkopin
+ [\v!paragraaf]
+ [\v!bijlage\c!label=\v!paragraaf,
+ \v!hoofdtekst\c!label=\v!paragraaf] % bijlageconversie=\Character
+
+\stelkopin
+ [\v!sub\v!paragraaf]
+ [\v!bijlage\c!label=\v!sub\v!paragraaf,
+ \v!hoofdtekst\c!label=\v!sub\v!paragraaf] % bijlageconversie=\Character
+
+\stelkopin
+ [\v!sub\v!sub\v!paragraaf]
+ [\v!bijlage\c!label=\v!sub\v!sub\v!paragraaf,
+ \v!hoofdtekst\c!label=\v!sub\v!sub\v!paragraaf] % bijlageconversie=\Character
+
+\stelkopin
+ [\v!deel,\v!hoofdstuk]
+ [\c!uitlijnen=\v!normaal,
+ \c!doorgaan=\v!nee,
+ \c!springvolgendein=\v!nee,
+ \c!pagina=\v!rechts,
+ \c!hoofd=,
+ \c!letter=\tfc,
+ \c!afstand=.75em,
+ \c!voor={\blanko[2*\v!groot]},
+ \c!na={\blanko[2*\v!groot]}]
+
+\stelkopin
+ [\v!paragraaf]
+ [\c!uitlijnen=\v!normaal,
+ \c!letter=\tfa,
+ \c!afstand=.75em,
+ \c!springvolgendein=\v!nee,
+ \c!voor={\blanko[2*\v!groot]},
+ \c!na=\blanko]
+
+\definieersamengesteldelijst
+ [\v!inhoud]
+ [\v!deel,
+ \v!hoofdstuk,
+ \v!paragraaf,
+ \v!sub\v!paragraaf,
+ \v!sub\v!sub\v!paragraaf,
+ \v!sub\v!sub\v!sub\v!paragraaf,
+ \v!sub\v!sub\v!sub\v!sub\v!paragraaf]
+ [\c!niveau=\v!sub\v!sub\v!sub\v!sub\v!paragraaf,
+ \c!criterium=\v!lokaal]
+
+\stelblokkopjesin
+ [\c!plaats=\v!onder,
+ \c!voor=\blanko,
+ \c!tussen={\blanko[\v!middel]},
+ \c!na=\blanko,
+ \c!breedte=\v!passend,
+ \c!kopletter=\v!vet,
+ \c!letter=\v!normaal,
+ \c!kleur=,
+ \c!uitlijnen=,
+ \c!nummer=\v!ja,
+ \c!wijze=\@@nrwijze,
+ \c!blokwijze=\@@nrblokwijze,
+ \c!sectienummer=\@@nrsectienummer,
+ \c!conversie=\v!cijfers]
+
+\stelplaatsblokkenin
+ [\c!plaats=\v!midden,
+ \c!breedte=\v!passend,
+ \c!hoogte=\v!passend,
+ \c!offset=\v!overlay,
+ \c!kader=\v!uit,
+ \c!straal=.5\korpsgrootte,
+ \c!hoek=\v!recht,
+ \c!achtergrond=,
+ \c!achtergrondraster=\@@rsraster,
+ \c!achtergrondkleur=,
+ \c!bovenkader=,
+ \c!onderkader=,
+ \c!linkerkader=,
+ \c!rechterkader=,
+ \c!voor=,
+ \c!na=,
+ \c!voor\c!wit=\v!groot,
+ \c!na\c!wit=\v!groot,
+ \c!zij\c!voor\c!wit=\@@bkvoorwit,
+ \c!zij\c!na\c!wit=\@@bknawit,
+ \c!marge=1em,
+ \c!nboven=2,
+ \c!nonder=0,
+ \c!nregels=4]
+
+\stelplaatsbloksplitsenin
+ [\c!conversie=\v!letter, % \v!romeins
+ \c!regels=3]
+
+\stelwitruimtein
+ [\v!geen]
+
+\inspringen
+ [\v!nooit]
+
+\stelinspringenin
+ [\v!geen]
+
+\stelopsommingenin % undocumented
+ [\c!niveaus=6,
+ \c!marge=\!!zeropoint,
+ \c!springvolgendein=\v!ja,
+ \c!breedte=1.5em,
+ \c!factor=0,
+ \c!afstand=.5em,
+ \c!uitlijnen=\v!normaal,
+ \c!marletter=\c!type, % \c! ???
+ \c!symletter=,
+ \c!kopletter=,
+ \c!markleur=,
+ \c!symkleur=,
+ \c!kopkleur=,
+ \c!kopvoor=,
+ \c!kopna=\blanko,
+ \c!voor=\blanko,
+ \c!tussen=\blanko,
+ \c!na=\blanko,
+ \c!afsluiter=.,
+ \c!plaatsafsluiter=\v!ja,
+ \c!binnen=,
+ \c!n=2,
+ \c!items=4,
+ \c!symbool=\itemlevel]
+
+\steldoorspringenin
+ [\c!letter=\v!normaal,
+ \c!kopletter=\v!normaal,
+ \c!kleur=,
+ \c!kopkleur=,
+ \c!breedte=\v!passend,
+ \c!tekst=...,
+ \c!monster=,
+ \c!voor=\blanko,
+ \c!na=\blanko,
+ \c!scheider={ :}]
+
+\stelnummerenin
+ [\c!wijze=\v!per\v!hoofdstuk,
+ \c!blokwijze=,
+ \c!sectienummer=\v!ja,
+ \c!status=\v!start]
+
+\stelformulesin
+ [\c!wijze=\@@nrwijze,
+ \c!blokwijze=,
+ \c!sectienummer=\@@nrsectienummer,
+ \c!plaats=\v!rechts,
+ \c!links=(,
+ \c!rechts=)]
+
+\stelreferentielijstin
+ [\c!letter=\v!normaal]
+
+\stelinmargein
+ [\c!letter=\v!vet,
+ \c!kleur=,
+ \c!plaats=\v!beide,
+ \c!uitlijnen=\v!binnen,
+ \c!voor=,
+ \c!na=]
+
+\stelinmargein
+ [\v!links]
+ [\c!plaats=\v!links,
+ \c!uitlijnen=\v!links]
+
+\stelinmargein
+ [\v!rechts]
+ [\c!plaats=\v!rechts,
+ \c!uitlijnen=\v!rechts]
+
+\versie
+ [\v!definitief]
+
+\stelpaginanummerin
+ [\c!nummer=1]
+
+\stelsubpaginanummerin
+ [\c!wijze=\v!per\v!deel,
+ \c!status=\v!stop]
+
+\stelsmallerin
+ [\c!links=1.5em,
+ \c!rechts=1.5em,
+ \c!midden=1.5em]
+
+\stelregelnummerenin
+ [\c!conversie=\v!cijfers,
+ \c!start=1,
+ \c!stap=1,
+ \c!plaats=\v!inmarge,
+ \c!letter=,
+ \c!kleur=,
+ \c!breedte=2em,
+ \c!prefix=,
+ \c!refereren=\v!aan]
+
+\definieeropmaak
+ [\v!standaard]
+ [\c!breedte=\zetbreedte,
+ \c!hoogte=\teksthoogte,
+ \c!voffset=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,
+ \c!pagina=\v!rechts,
+ \c!dubbelzijdig=\v!leeg]
+
+\stelpositionerenin
+ [\c!eenheid=\s!cm,
+ \c!factor=1,
+ \c!schaal=1,
+ \c!xstap=\v!absoluut,
+ \c!ystap=\v!absoluut,
+ \c!offset=\v!ja,
+ \c!xoffset=\!!zeropoint,
+ \c!yoffset=\!!zeropoint]
+
+\stelregelsin
+ [\c!voor=\blanko,
+ \c!na=\blanko,
+ \c!inspringen=\v!nee]
+
+\steldoordefinierenin
+ [\c!plaats=\v!links,
+ \c!kopletter=\v!vet,
+ \c!letter=\v!normaal,
+ \c!kleur=,
+ \c!kopkleur=,
+ \c!breedte=8em,
+ \c!afstand=0pt,
+ \c!hang=,
+ \c!monster=,
+ \c!uitlijnen=,
+ \c!marge=\v!nee,
+ \c!voor=\blanko,
+ \c!tussen=\blanko,
+ \c!na=\blanko,
+ \c!springvolgendein=\v!ja,
+ \c!commando=]
+
+\steldoornummerenin
+ [\c!plaats=\v!boven,
+ \c!kopletter=\v!vet,
+ \c!kopkleur=,
+ \c!letter=\v!normaal,
+ \c!kleur=,
+ \c!breedte=8em,
+ \c!afstand=0pt,
+ \c!hang=,
+ \c!monster=,
+ \c!uitlijnen=,
+ \c!marge=\v!nee,
+ \c!voor=\blanko,
+ \c!tussen=\blanko,
+ \c!na=\blanko,
+ \c!springvolgendein=\v!ja,
+ \c!tekst=,
+ \c!niveaus=3, % to be upward compatible
+ \c!conversie=, % to be upward compatible
+ \c!wijze=\v!per\v!tekst,
+ \c!sectienummer=\v!ja,
+ \c!scheider=.,
+ \c!afsluiter=,
+ \c!nummer=,
+ \c!commando=]
+
+\stelkoppeltekenin
+ [\c!teken=\compoundhyphen]
+
+\stelnaastplaatsenin
+ [\c!status=\v!stop]
+
+\steltolerantiein
+ [\v!horizontaal,\v!zeerstreng]
+
+\steltolerantiein
+ [\v!vertikaal,\v!streng]
+
+\steluitlijnenin
+ [\v!onder,
+ \v!breedte]
+
+\stelspatieringin
+ [\v!opelkaar]
+
+\definieerregister
+ [\v!index]
+ [\v!indices]
+
+\definieerplaatsblok
+ [\v!figuur]
+ [\v!figuren]
+
+\definieerplaatsblok
+ [\v!tabel]
+ [\v!tabellen]
+
+\stelplaatsblokin
+ [\v!tabel]
+ [\c!kader=\v!uit]
+
+\definieerplaatsblok
+ [\v!intermezzo]
+ [\v!intermezzos]
+
+\definieerplaatsblok
+ [\v!grafiek]
+ [\v!grafieken]
+
+\definieersynoniemen
+ [\v!afkorting]
+ [\v!afkortingen]
+ [\voluit]
+
+\stelsynoniemenin
+ [\v!afkorting]
+ [\c!tekstletter=\v!kapitaal,
+ \c!synoniemletter=,
+ \c!tekstkleur=,
+ \c!synoniemkleur=,
+ \c!plaats=\v!links,
+ \c!breedte=5em,
+ \c!status=\v!start]
+
+\definieersorteren
+ [\v!logo]
+ [\v!logos]
+
+\definieersynoniemen
+ [\v!eenheid]
+ [\v!eenheden]
+ [\betekenis]
+
+\stelsynoniemenin
+ [\v!eenheid]
+ [\c!tekstletter=\donottest\dimension]
+
+\stelmargeblokkenin
+ [\c!status=\v!start,
+ \c!plaats=\v!inmarge,
+ \c!breedte=\rechtermargebreedte,
+ \c!letter=,
+ \c!kleur=,
+ \c!uitlijnen=,
+ \c!links=,
+ \c!rechts=,
+ \c!boven=,
+ \c!tussen=\blanko,
+ \c!onder=\vfill,
+ \c!voor=,
+ \c!na=]
+
+\stelachtergrondenin
+ [\v!pagina,\v!linkerpagina,\v!rechterpagina]
+ [\c!kader=\v!uit,
+ \c!straal=.5\korpsgrootte,
+ \c!hoek=\v!recht,
+ \c!achtergrond=,
+ \c!raster=\@@rsraster,
+ \c!kleur=,
+ \c!kaderoffset=\getvalue{\??ma\v!pagina\c!offset},
+ \c!achtergrondoffset=\getvalue{\??ma\v!pagina\c!offset},
+ \c!offset=\!!zeropoint,
+ \c!diepte=\!!zeropoint,
+ \c!scheider=\v!nee]
+
+\stelbufferin
+ [\c!voor=,
+ \c!na=]
+
+\stellijstin
+ [\v!deel]
+ [\c!breedte=0em,
+ \c!voor={\blanko\pagina[\v!voorkeur]},
+ \c!na=\blanko,
+ \c!label=\v!ja,
+ \c!scheider=:,
+ \c!afstand=1em]
+
+\stellijstin
+ [\v!hoofdstuk]
+ [\c!breedte=2em,
+ \c!voor={\blanko\pagina[\v!voorkeur]},
+ \c!na=]
+
+\stellijstin
+ [\v!paragraaf]
+ [\c!breedte=3em]
+
+\stellijstin
+ [\v!sub\v!paragraaf]
+ [\c!breedte=4em]
+
+\stellijstin
+ [\v!sub\v!sub\v!paragraaf]
+ [\c!breedte=5em]
+
+\stellijstin
+ [\v!sub\v!sub\v!sub\v!paragraaf]
+ [\c!breedte=6em]
+
+\stellijstin
+ [\v!sub\v!sub\v!sub\v!sub\v!paragraaf]
+ [\c!breedte=7em]
+
+\def\documentstyle%
+ {\showmessage{\m!systems}{3}{}
+ \stoptekst}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-01b.tex b/tex/context/base/core-01b.tex index 3ad5b2ba4..4d5352575 100644 --- a/tex/context/base/core-01b.tex +++ b/tex/context/base/core-01b.tex @@ -1,1380 +1,1385 @@ -%D \module -%D [ file=core-01b, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=1B (to be split), -%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 Core Macros (b)} - -\unprotect - -%I n=Items -%I c=\items,\stelitemsin -%I -%I Met het commando \items kunnen invullijsten worden -%I gegenereerd: -%I -%I \items{alternatief1,alternatief2,...,alternatiefN} -%I -%I Als in plaats van een alternatief een - wordt gegeven, -%I dan wordt ruimte opengelaten. -%I -%I De wijze waarop items worden weergegeven wordt ingesteld -%I met het commando: -%I -%I \stelitemsin[plaats=,symbool=,breedte=,n=,voor=, -%I tussen=,na=,uitlijnen=] -%I -%I Mogelijke plaatsen zijn links, rechts, onder, boven en -%I inmarge. Als breedte wordt de breedte van de totale tekst -%I opgegeven. Het aantal is facultatief, eventueel kan er -%I 'onbekend' worden meegegeven. Uitlijnen is 'ja' of 'nee'. -%P -%I Indien gewenst, kan de instelling direkt achter \item worden -%I geplaatst: -%I -%I \items[plaats=,symbool=,...]{alternatief1,...} -%I -%I In plaats van een symbool kan ook een van de volgende -%I aanduidingen worden meegegeven: -%I -%I a a, b, c, d, ... -%I A A, B, C, D, ... -%I n 1, 2, 3, 4, ... -%I r i, ii, iii, ... -%I R I, II, III, ... -%I -%I Eventueel kan een nummer worden meegegeven. In dat -%I geval wordt het overeenkomstige symbool van de -%I opsomming gebruikt (1--n). - -%\def\checkinterlineskip% -% {\ifvmode -% \ifdim\lastskip>\!!zeropoint\relax -% \nointerlineskip -% \else\ifdim\lastkern>\!!zeropoint\relax -% \nointerlineskip -% \fi\fi -% \fi} - -\def\horitems#1#2% #1=breedte #2=commandos - {\dimen0=#1\relax - \divide\dimen0 by \nofitems - \!!counta=0\relax - \def\docommando##1% - {\advance\!!counta by 1\relax - \processaction - [\@@isuitlijnen] - [ \v!links=>\hbox to \dimen0{\strut##1\hss}, - \v!rechts=>\hbox to \dimen0{\hss\strut##1}, - \v!midden=>\hbox to \dimen0{\hss\strut##1\hss}, - \v!marge=>\ifnum\!!counta=1\hss\else\hfill\fi - \strut##1% - \ifnum\!!counta=\nofitems\hss\else\hfill\fi, - \s!default=>\hbox to \dimen0{\hss\strut##1\hss}, % midden - \s!unknown=>\hbox to \dimen0{\strut##1\hss}]}% % links - \hbox to #1{\hss#2\hss}} - -\def\veritems#1#2% #1=breedte #2=commandos - {\dimen0=#1\relax - \def\docommando##1% - {\ifdim\dimen0<\!!zeropoint\relax % the - was a signal - \hbox to -\dimen0{\hss\strut##1}% - \else\ifdim\dimen0>\!!zeropoint\relax - \hbox to \dimen0{\strut##1\hss}% - \else - \hbox{\strut##1}% - \fi\fi}% - \vbox{#2}} - -\def\dostelitemsin[#1]% maakt direkt gebruik van \??ss en \??cv - {\getparameters[\??is][#1]% - \doif{\@@isbreedte}{\v!onbekend} - {\def\@@isbreedte{\hsize}}% - \doifdefinedelse{\??cv\@@issymbool} - {\def\doitembullet##1{\convertnumber{\@@issymbool}{##1}}} - {\doifdefined{\??ss\@@issymbool} - {\def\doitembullet##1{\symbol[\@@issymbool]}}}} - -\def\makeitemsandbullets#1% - {\doifelse{\@@isn}{\v!onbekend} - {\getcommalistsize[#1]% - \edef\nofitems{\commalistsize}} - {\edef\nofitems{\@@isn}}% - \setbox0=\hbox - {\doitems - {\@@isbreedte} - {\processcommalist[#1]\docommando}}% - \setbox2=\hbox - {\doitems - {\@@isbulletbreedte} - {\herhaal[\nofitems*\docommando{\strut\doitembullet{\herhaler}}]}}} - -\def\dostartitems#1#2#3% - {\let\doitems=#2 - \def\@@isbulletbreedte{#3}% - \makeitemsandbullets{#1}% - \@@isvoor} - -\def\dostopitems% - {\@@isna - \egroup} - -\def\doitemsboven#1% - {\dostartitems{#1}\horitems\@@isbreedte - \noindent\vbox - {\forgetall - \doifsomething{\@@issymbool} - {\doifnot{\@@issymbool}{\v!geen} - {\box2 - \@@istussen - \nointerlineskip}}% - \box0}% - \dostopitems} - -\def\doitemsonder#1% - {\dostartitems{#1}\horitems\@@isbreedte - \noindent\vbox - {\forgetall - \box0 - \doifsomething{\@@issymbool} - {\@@istussen - \nointerlineskip - \box2}}% - \dostopitems} - -\def\doitemsinmarge#1% - {\dostartitems{#1}{\veritems}{-1.5em}% - is a signal - \noindent\hbox{\llap{\box2\hskip\linkermargeafstand}\box0}% - \dostopitems} - -\def\doitemslinks#1% - {\advance\hsize by -1.5em\relax - \dostartitems{#1}{\veritems}{1.5em}% - \noindent\hbox{\box2\box0}% - \dostopitems} - -\def\doitemsrechts#1% - {\dostartitems{#1}{\veritems}{0em}% - \noindent\hbox{\box0\hskip-\wd2\box2}% - \dostopitems} - -\def\stelitemsin% - {\dosingleargument\dostelitemsin} - -\def\complexitems[#1]% - {\bgroup - \stelitemsin[#1]% - \parindent=\!!zeropoint - \setlocalhsize - \hsize=\localhsize - \mindermeldingen - \getvalue{doitems\@@isplaats}} - -\definecomplexorsimpleempty\items - -%I n=Tabulatie (1) -%I c=\definieeralineas,\stelalineasin -%I -%I Er kunnen paragrafen in meerdere kolommen worden gezet na -%I het commando: -%I -%I \definieeralineas[naam][n=,voor=,na=,afstand=, -%I hoogte=,lijn=,binnen=] -%I -%I Kolommen worden vervolgens gezet met: -%I -%I \startnaam .... \naam .... \naam .... \stopnaam -%I -%I of (soms verwarrend): -%I -%I \naam .... \naam .... \naam .... \naam -%I -%I of (lekker kort): -%I -%I \naam .... \\ .... \\ .... \\ -%I -%I waarbij het aantal malen .... \naam of \\ gelijk is -%I aan n. Naast \naam en \\ is ook \volgendenaam toegestaan. -%P -%I Het is mogelijk per kolom een en ander in te stellen met -%I het commando: -%I -%I \stelalineasin[naam][kolomnummer][afstand=,breedte=, -%I hoogte=,boven=,onder=,letter=,binnen=,lijn=, -%I uitlijnen=,tolerantie=] -%I -%I Standaard is \tabulatie gedefinieerd. - -% Te zijner tijd [plaats=boven,onder,midden] implementeren, -% in dat geval moet eerst de maximale hoogte worden bepaald. -% -% Overigens kan een en ander mooier met \halign. - -\def\dodefinieeralineas[#1][#2]% - {\setvalue{\s!do\s!next#1}% - {\def\\{\getvalue{#1}}}% - \setvalue{#1}% - {\getvalue{\s!do\s!next#1}% - \dostartalineas{#1}}% - \setvalue{\e!volgende#1}% - {\getvalue{#1}}% - \setvalue{\e!start#1}% - {\bgroup - \setvalue{\s!do\s!next#1}{}% - \setvalue{\e!stop#1}% - {\getvalue{#1}% - \egroup}% - \getvalue{#1}}% - \getparameters[\??al#1]% - [\c!n=3, - \c!voor=\blanko, - \c!na=\blanko, - \c!afstand=1em, - \c!hoogte=\v!passend, - \c!lijn=\v!uit, - \c!commando=, - \c!uitlijnen=, - \c!tolerantie=\v!soepel, - \c!letter=, - \c!kleur=, - \c!boven=, - \c!boven=\vss, - \c!onder=\vfill, - #2]% - \setvalue{\e!stel#1\e!in}% - {\stelalineasin[#1]}% - \dorecurse - {\getvalue{\??al#1\c!n}} - {\stelalineasin[#1][\recurselevel] - [\c!breedte=, - \c!onder=\getvalue{\??al#1\c!onder}, - \c!boven=\getvalue{\??al#1\c!boven}, - \c!hoogte=\getvalue{\??al#1\c!hoogte}, - \c!letter=\getvalue{\??al#1\c!letter}, - \c!kleur=\getvalue{\??al#1\c!kleur}, - \c!lijn=\getvalue{\??al#1\c!lijn}, - \c!uitlijnen=\getvalue{\??al#1\c!uitlijnen}, - \c!tolerantie=\getvalue{\??al#1\c!tolerantie}, - \c!afstand=\getvalue{\??al#1\c!afstand}]}% - \stelalineasin[#1][1][\c!afstand=0em]} - -\def\definieeralineas% - {\dodoubleargument\dodefinieeralineas} - -\def\dostelalineasin[#1][#2][#3]% - {\doifelse{#2}{\v!elk} - {\dorecurse - {\getvalue{\??al#1\c!n}} - {\getparameters[\??al#1\herhaler][#3]}} - {\ConvertToConstant\doifelse{#3}{} - {\getparameters[\??al#1][#2]} - {\def\docommando##1% - {\getparameters[\??al#1##1][#3]}% - \processcommalist[#2]\docommando}}} - -\def\stelalineasin% - {\dotripleempty\dostelalineasin} - -\newcount\alteller -\newcount\alnsize -\newdimen\alhsize - -\def\doalinealijn#1#2% - {\doifelsevalue{\??al#2\the\alteller\c!lijn}{\v!aan} - {\expandafter\dimen2=#1\relax - \hskip.5\dimen2 - \hskip-\linewidth - \vrule\!!width\linewidth - \hskip.5\dimen2} - {\hskip#1}} - -\def\dostartalinea#1% - {\doifelsevaluenothing{\??al#1\the\alteller\c!breedte} - {\!!widtha=\alhsize\relax - \divide\!!widtha by \alnsize} - {\!!widtha=\getvalue{\??al#1\the\alteller\c!breedte}\relax}% - \dostartattributes{\??al#1\the\alteller}{}% - \doifelsevalue{\??al#1\the\alteller\c!hoogte}{\v!passend} - {\setbox0=\vtop} - {\setbox0=\vtop to \getvalue{\??al#1\the\alteller\c!hoogte}}% - \bgroup - \blanko[\v!blokkeer]% - \forgetall - \getvalue{\??al#1\the\alteller\c!boven}% - \getvalue{\??al#1\c!binnen}% - \hsize=\!!widtha % setting \wd afterwards removed - \getvalue{\??al#1\the\alteller\c!binnen}% - \edef\!!stringa{\getvalue{\??al#1\the\alteller\c!uitlijnen}}% nodig? - \expandafter\steluitlijnenin\expandafter[\!!stringa]% - \edef\!!stringa{\getvalue{\??al#1\the\alteller\c!tolerantie}}% nodig? - \expandafter\steltolerantiein\expandafter[\!!stringa]% - \ignorespaces - \endgraf - \ignorespaces - % - % Nadeel van de onderstaande constructie is dat \everypar - % binnen een groep kan staan en zo steeds \begstruts - % worden geplaatst. Mooi is anders dus moet het anders! - % - % Hier is \Everypar niet nodig. - % - \everypar{\begstrut\everypar{}}% - % - \ignorespaces\geenspatie % dubbel: \ignorespaces - \getvalue{\??al#1\the\alteller\c!commando}} - -\def\dostopalinea#1% - {\ifvmode - \removelastskip - \else - \unskip\endstrut\endgraf - \fi - \getvalue{\??al#1\the\alteller\c!onder}% - \egroup - \ifdim\wd0=\!!zeropoint % no data - \wd0=\!!widtha - \fi - \box0 - \dostopattributes - \ifnum\alteller<\getvalue{\??al#1\c!n}\relax - \def\next{\doalinea{#1}}% - \else - \def\next{\dostopalineas{#1}}% - \fi - \next} - -\def\doalinea#1% - {\global\advance\alteller by 1\relax - \doifelsevaluenothing{\??al#1\the\alteller\c!afstand} - {\doifnot{\the\alteller}{1} - {\hskip\getvalue{\??al#1\c!afstand}}} - {\doifelse{\the\alteller}{1}% - {\hskip\getvalue{\??al#1\the\alteller\c!afstand}} - {\doalinealijn{\getvalue{\??al#1\the\alteller\c!afstand}}{#1}}}% - \setvalue{#1}{\dostopalinea{#1}}% - \dostartalinea{#1}} - -\def\dostartalineas#1% - {\global\alteller=0\relax - \parindent=\!!zeropoint - \setlocalhsize - \alhsize=\localhsize - \alnsize=\getvalue{\??al#1\c!n}\relax - \dorecurse - {\getvalue{\??al#1\c!n}} - {\doifelsevaluenothing{\??al#1\recurselevel\c!afstand} - {\doifnot{\recurselevel}{1} - {\global\advance\alhsize by -\getvalue{\??al#1\c!afstand}\relax}} - {\global\advance\alhsize by -\getvalue{\??al#1\recurselevel\c!afstand}\relax}% - \doifvaluesomething{\??al#1\recurselevel\c!breedte} - {\global\advance\alnsize by -1\relax - \global\advance\alhsize by -\getvalue{\??al#1\recurselevel\c!breedte}\relax}}% - %\witruimte % gaat fout bij \framed - \getvalue{\??al#1\c!voor}% - \leavevmode % gaat wel goed bij \framed - \vbox\bgroup\hbox\bgroup - \doalinea{#1}} - -\def\dostopalineas#1% - {\egroup - \egroup - \par - \getvalue{\??al#1\c!na}}% - -%I n=Tabulatie (2) -%I c=\steltabin,\tab -%I -%I Eenvoudige tabulatie is mogelijk met het commando: -%I -%I \tab{tekst} tekst tekst tekst ..... -%I -%I Instelling vindt plaats met het commando: -%I -%I \steltabin[monster=,breedte=,kopletter=,voor, -%I na=] -%I -%I Dit commando is een vereenvoudigde variant van het -%I commando \doordefinieren. In de regel kan volstaan -%I worden met het opgeven van een monster. Dit is het -%I woord dat de breedte bepaalt. - -\def\dosteltabin[#1]% - {\getparameters[\??ta] - [\c!kopletter=\v!normaal, - \c!kopkleur=, - \c!letter=\v!normaal, - \c!kleur=, - \c!breedte=\v!ruim, - \c!monster={\hskip4em}, - \c!voor=, - \c!na=, - #1]% - \doordefinieren - [tab] - [\c!kopletter=\@@takopletter, - \c!kopkleur=\@@takleur, - \c!monster=\@@tamonster, - \c!breedte=\@@tabreedte, - \c!voor=\@@tavoor, - \c!na=\@@tana]} - -\def\steltabin% - {\dosingleargument\dosteltabin} - -%I n=Diversen -%I c=\celsius,\bedrag,\breuk -%I c=\procent,\promille -%I -%I De volgende commando's vatten (vooral mathematische) -%I zetcommando's samen: -%I -%I \chem{symbool}{onder}{boven} chemische symbolen -%I \celsius{graden} graden Celsius (..~øC) -%I \breuk{boven}{onder} breuken («) -%I \bedrag{getal} geldbedragen (Ÿ~..) -%I \punten[n] puntjes (. . .) -%I \ongeveer plus-minus (ñ) -%I \inch inch ('') -%I \doorsnede \circ doorsneden met / -%I \graden ø (^\circ) -%I \procent percentage (vgl promille) -%I \promille promilage -%I \dollar dollar teken -%I \sterling pound sterling teken -%I \florijn gulden teken - -% The following macro's are derived from PPCHTEX and -% therefore take some LaTeX font-switching into account. - -\newif\ifloweredsubscripts - -% Due to some upward incompatibality of LaTeX to LaTeX2.09 -% and/or LaTeX2e we had to force \@@chemieletter. Otherwise -% some weird \nullfont error comes up. - -\doifundefined{@@chemieletter}{\def\@@chemieletter{\rm}} - -\def\beginlatexmathmodehack% - {\ifmmode - \let\endlatexmathmodehack=\relax - \else - \def\endlatexmathmodehack{$}$\@@chemieletter - \fi} - -\def\setsubscripts% - {\beginlatexmathmodehack - \def\dosetsubscript##1##2##3% - {\dimen0=##3\fontdimen5##2% - \setxvalue{@@\string##1\string##2}{\the##1##2\relax}% - ##1##2=\dimen0\relax}% - \def\dodosetsubscript##1##2% - {\dosetsubscript{##1}{\textfont2}{##2}% - \dosetsubscript{##1}{\scriptfont2}{##2}% - \dosetsubscript{##1}{\scriptscriptfont2}{##2}}% - %\dodosetsubscript{\fontdimen14}{?}% - \dodosetsubscript{\fontdimen16}{.7}% - \dodosetsubscript{\fontdimen17}{.7}% - \global\loweredsubscriptstrue - \endlatexmathmodehack} - -\def\resetsubscripts% - {\ifloweredsubscripts - \beginlatexmathmodehack - \def\doresetsubscript##1##2% - {\dimen0=\getvalue{@@\string##1\string##2}\relax - ##1##2=\dimen0}% - \def\dodoresetsubscript##1% - {\doresetsubscript{##1}{\textfont2}% - \doresetsubscript{##1}{\scriptfont2}% - \doresetsubscript{##1}{\scriptscriptfont2}}% - %\dodoresetsubscript{\fontdimen14}% - \dodoresetsubscript{\fontdimen16}% - \dodoresetsubscript{\fontdimen17}% - \global\loweredsubscriptsfalse - \endlatexmathmodehack - \fi} - -\let\beginlatexmathmodehack = \relax -\let\endlatexmathmodehack = \relax - -\def\chem#1#2#3% - {\bgroup - \setsubscripts - \mathematics{\hbox{#1}_{#2}^{#3}}% - \resetsubscripts - \egroup} - -\def\celsius#1% - {#1\mathematics{^\circ}C} - -\def\graden% - {\mathematics{^\circ}} - -\def\inch% - {\hbox{\rm\char125\relax}} - -\def\breuk#1#2% - {\mathematics{#1\over#2}} - -\def\bedrag#1% - {\mathematics{f~}\hbox{#1}} - -\def\doorsnede% - {\hbox{\rlap/$\circ$} } - -\def\complexpunten[#1]% - {\dimen0=.5em\relax - \multiply\dimen0 by #1\relax - \hbox to \dimen0 - {\leaders\hbox to .5em{\hss.\hss}\hss}} - -\def\simplepunten% - {\complexpunten[5]} - -\def\punten% - {\complexorsimple{punten}} - -\def\ongeveer% - {\mathematics{\pm}} - -\def\permille% - {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle00}}} - -\def\percent% - {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle0}}} - -\let\promille=\permille -\let\procent =\percent - -% for compatibility - -\def\onbekend% - {\mathematics{\ldots}} - -% currency - -\def\dollar% - {\bgroup - \ifnum\fam=\itfam - \sl - \else\ifnum\fam=\bifam - \bs - \fi\fi - \$% - \egroup} - -\def\sterling% - {\bgroup - \ifnum\fam=\bffam - \bi - \else\ifnum\fam=\bifam - \bi - \else\ifnum\fam=\bsfam - \bi - \else - \it - \fi\fi\fi - \$% - \egroup} - -\def\florijn% - {\bgroup - \ifnum\fam=\bffam - \bi - \else\ifnum\fam=\bifam - \bi - \else\ifnum\fam=\bsfam - \bi - \else - \it - \fi\fi\fi - f% - \egroup} - -%I n=Citaten -%I c=\startcitaat,\citaat,\stelcitatenin -%I c=\citeer,\stelciterenin -%I -%I Als variant op \startsmaller is het volgende commando -%I beschikbaar: -%I -%I \startcitaat -%I tekst -%I \stopcitaat -%I -%I Rond de tekst worden in de marge dubbele quotes -%I geplaatst. Ook bij dit commando kunnen tussen [] maten -%I worden opgegeven: -%I -%I \startcitaat[2*links,rechts] -%I -%I In de lopende tekst kan gebruik worden gemaakt van: -%I -%I \citaat{tekst} -%I \citeer{tekst} -%I -%I Het eerste commando levert dubbele quotes en het tweede -%I enkele quotes. -%P -%I Er zijn twee varianten (1 en 2) beschikbaar die kunnen -%I worden ingesteld met: -%I -%I \stelciterenin -%I [variant=,letter=] -%I -%I Variant 1 levert 'ziezo' of ''ziezo'' en variant 2 -%I levert `ziezo' of ``ziezo''. - -\newsignal\quotationsignal -\def\quotationskip{.125em} - -\def\stelciterenin% - {\dodoubleargument\getparameters[\??ci]} - -\def\stelcitatenin% - {\stelciterenin} - -\def\dostartcitaat% - {\setbox0=\hbox{\getvalue{\??la\currentlanguage\c!leftquotation}}% - \hskip-\wd0 - \box0\relax - \ignorespaces} - -\def\complexstartcitaat[#1]% - {\startsmaller[#1]% - \dostartcitaat} - -\def\simplestartcitaat% - {\startsmaller - \dostartcitaat} - -\def\stopcitaat% - {\unskip\hsmash{\getvalue{\??la\currentlanguage\c!rightquotation}}% - \stopsmaller} - -\def\startcitaat% - {\complexorsimple{startcitaat}}% - -\def\handlequotation#1% - {\ifdim\lastkern=\quotationsignal - \unskip - \hskip\quotationskip - \fi - \getvalue{\??la\currentlanguage#1}% - \kern\quotationsignal} - -\def\citaat% - {\groupedcommand - {\handlequotation\c!leftquotation} - {\handlequotation\c!rightquotation}} - -\def\citeer% - {\doifelse{\@@ciletter}{\v!normaal} - {\let\next=\doquotedcite} - {\let\next=\doattributedcite}% - \next} - -\def\doquotedcite% - {\groupedcommand - {\handlequotation\c!leftquote} - {\handlequotation\c!rightquote}} - -\def\doattributedcite% - {\groupedcommand - {\dostartattributes\??ci} - {\dostopattributes}} - -% Tijden horen hier niet thuis en zullen in een aparte -% module worden ondergebracht. voorlopig handhaven we ze nog -% even. Een implementatie met \doordefinieren zou beter voldoen -% omdat een en ander dan instelbaar wordt. Het is trouwens -% zowieso beter het commando \tijd te reserveren voor de -% systeemtijd. - -% %I n=Tijden -% %I c=\tijd,\tijdspan,\activiteit -% %I -% %I De volgende commando's kunnen worden gebruikt om -% %I tijden en activiteiten in overzichten weer te geven: -% %I -% %I uu.mm -% %I -% %I \tijd{uur.min} -% %I -% %I uu.mm --- uu.mm -% %I -% %I \tijdspan{uur.min}{uur.min} -% %I -% %I uu.mm --- uu.mm activiteit -% %I -% %I \activiteit{uur.min}{uur.min} ... (\par) - -\def\tijd#1% - {\setbox0=\hbox{00.00}% - \hbox to \wd0{\hfill#1}} - -\def\tijdspan#1#2% - {\hbox{\tijd{#1}~---~\tijd{#2}}} - -\def\activiteit#1#2% - {\activity{\tijdspan{#1}{#2}}} - -\def\activiteit#1#2% - {\sym{\tijdspan{#1}{#2}}} - -%I n=Toevoegen -%I c=\toevoegen -%I -%I Er kan witruimte worden gemarkeerd met het commando: -%I -%I \toevoegen[instelling]{korte tekst} -%I -%I waarbij als instellingen mogelijk zijn: klein, middel of -%I groot. - -\def\dotoevoegen#1% - {\def\next{#1}% - \herhaal[#1*{\inlinker{\next~+}\def\next{}\crlf}]} - -\def\complextoevoegen[#1]% - {\blanko - \processaction - [#1] - [ \v!klein=>\dotoevoegen{3}, - \v!middel=>\dotoevoegen{6}, - \v!groot=>\dotoevoegen{9}, - \s!default=>\dotoevoegen{6}, - \s!unknown=>\dotoevoegen{#1}] - \blanko} - -\def\toevoegen% - {\complexorsimpleempty{toevoegen}} - -%I n=Tekstlijn -%I c=\tekstlijn,\starttekstlijn,\steltekstlijnenin -%I -%I Een stuk tekst kan worden omgeven door horizontale lijnen, -%I waarin al dan niet een tekst is opgenomen. -%I -%I \tekstlijn[plaats]{tekst} -%I -%I Mogelijke plaatsen zijn boven en onder. De onderstaande twee -%I commando's zijn equivalent: -%I -%I \tekstlijn -%I \tekstlijn[onder]{} -%I -%I Daarnaast zijn beschikbaar: -%I -%I \starttekstlijn{tekst} -%I \stoptekstlijn -%I -%I waarbij de plaats dus boven is. -%P -%I Een en ander kan worden ingesteld met het commando: -%I -%I \steltekstlijnenin[voor=,na=,tussen=,letter=,breedte=, -%I plaats=] -%I -%I De breedte heeft betrekking op de lengte van de lijn voor -%I de tekst. Mogelijke plaatsen zijn links en inmarge. - -% nog eens \definieertekstlijn - -\def\steltekstlijnenin% - {\dodoubleargument\getparameters[\??tl]} - -\def\docomplextekstlijn#1% - {\bgroup - \setbox0=\hbox to \hsize - {\dimen4=0.5ex\relax - \dimen6=-0.5ex\relax - \advance\dimen4 by .5\linewidth - \advance\dimen6 by .5\linewidth - \doifsomething{#1} - {\doifelse{\@@tlplaats}{\v!inmarge}% - {\llap{\doattributes{\??tl}{#1}\hskip\linkermargeafstand}} - {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlbreedte - \hbox spread 1em{\hss\doattributes{\??tl}{\strut#1}\hss}}}% - \leaders\hrule\!!height\dimen4\!!depth\dimen6\hfill} - \ht0=\ht\strutbox - \dp0=\dp\strutbox - \box0 - \egroup} - -\def\dotoptekstlijn#1% - {\pagina[\v!voorkeur] - \witruimte - \@@tlvoor - \docomplextekstlijn{#1}% - \geenwitruimte - \@@tltussen - \endgraf} - -\def\dobottomtekstlijn#1% - {\ifhmode - \endgraf - \fi - \dimen0=\dp\strutbox - \ifdim\prevdepth<\dp\strutbox - \ifdim\prevdepth>\!!zeropoint - \advance\dimen0 by -\prevdepth - \fi - \fi - \advance\dimen0 by .5ex - \vskip\dimen0 - \@@tltussen - \doifelse{#1}{} - {\hrule\!!depth\linewidth\!!height\!!zeropoint} - {\docomplextekstlijn{#1}}% - \@@tlna - \pagina[\v!voorkeur]} - -\def\complextekstlijn[#1]#2% - {\processaction - [#1] - [ \v!boven=>\dotoptekstlijn{#2}, - \v!onder=>\dobottomtekstlijn{#2}, - \s!default=>\dobottomtekstlijn{#2}]} - -\def\simpletekstlijn% - {\dobottomtekstlijn{}} - -\def\tekstlijn% - {\complexorsimple{tekstlijn}} - -\def\starttekstlijn#1% - {\bgroup - \dotoptekstlijn{#1}} - -\def\stoptekstlijn% - {\dobottomtekstlijn{}% - \egroup} - -%I n=Invullijnen -%I c=\invullijnen,\stelinvullijnenin,\invultekst -%I -%I Ten behoeve van invullijsten is het volgende commando -%I beschikbaar: -%I -%I \invullijnen[n=,breedte=]{tekst} -%I -%I Dit levert: -%I -%I tekst _____________________________________________ -%I _____________________________________________ -%I -%I De instellingen kunnen desgewenst achterwege blijven: -%I -%I \invullijnen{tekst} -%I \invullijnen{tekst}{optionele eindtekst} -%I -%I In dat geval worden de standaard-instellingen gebruikt. -%P -%I De standaardinstellingen vinden plaats met: -%I -%I \stelinvullijnenin[n=,breedte=,afstand=,letter=,voor=, -%I na=,scheider=] -%I -%I De afstand heeft betrekking op de afstand tussen de -%I scheider en de lijnen. -%I -%I Het volgende commando plaatst een tekst op een zelfde -%I wijze als de invullijnen. -%I -%I \invultekst{tekst} tekst \par - -\def\stelinvullijnenin% - {\dosingleargument\getparameters[\??il]} - -\def\dodocomplexinvullijnen[#1]#2#3#4% - {\endgraf - \@@ilvoor - \begingroup - \stelinvullijnenin[#1]% - \noindent - \doifelse{\@@ilbreedte}{\v!passend} - {\setbox0=\hbox} - {\setbox0=\hbox to \@@ilbreedte} - {\doattributes - {\??il} - {\strut#3\hfill - \doifsomething{\@@ilscheider} - {\hbox spread \@@ilafstand{\@@ilscheider\hss}}}}% - \hangindent=\wd0\relax - \parindent=\hangindent - \box0\relax - \stelwitruimtein[\v!groot]% - \ignorespaces - #2#4% - \endgroup - \endgraf - \@@ilna} - -\def\complexinvullijnen[#1]% - {\def\docomplexinvullijnen% - {\dodocomplexinvullijnen[#1]{\thinrules[\c!n=\@@iln]}}% - \dodoublegroupempty\docomplexinvullijnen} - -\def\invullijnen% - {\complexorsimpleempty{invullijnen}} - -\def\complexinvultekst[#1]#2#3\par% - {\dodocomplexinvullijnen[#1]{\ignorespaces#3\endgraf}{#2}{}} - -\def\invultekst% - {\complexorsimpleempty{invultekst}} - -%I n=Invulregels -%I c=\invulregel,\stelinvulregelin,\invultekst -%I -%I Ten behoeve van invullijsten is het volgende commando -%I beschikbaar: -%I -%I \invulregel[breedte=,afstand=]{tekst} -%I -%I tekst tekst tekst tekst tekst tekst tekst -%I tekst tekst tekst tekst tekst tekst tekst __________ -%I -%I De instellingen kunnen desgewenst achterwege blijven: -%I -%I \invulregel tekst -%I -%I In dat geval worden de standaard-instellingen gebruikt. -%I -%I De standaardinstellingen vinden plaats met: -%I -%I \stelinvulregelsin[n=,breedte=,afstand=,voor=,na=] -%I -%I De lengte van de lijn is gelijk aan breedte-afstand. - -\def\stelinvulregelsin% - {\dosingleargument\getparameters[\??iv]} - -\def\complexinvulregel[#1]#2\par% - {%\endgraf % interferes with \doordefinieren alikes - \@@ivvoor - \begingroup - \stelinvulregelsin[#1]% - \advance\rightskip by \@@ivbreedte - \parfillskip\!!zeropoint - #2\hfill - \dimen0=\@@ivbreedte - \advance\dimen0 by -\@@ivafstand - \rlap - {\hskip\@@ivafstand - \vrule\!!width\dimen0\!!height\linewidth}% - \par % ! - \endgroup - \par % ! - \@@ilna} - -\def\invulregel% - {\complexorsimpleempty{invulregel}} - -%I n=Roosters -%I c=\rooster -%I -%I Er kunnen roosters (te vergelijken met ruitjespapier) -%I worden gemaakt met: -%I -%I \rooster[nx=,ny=,dx=,dy=,eenheid=,xstap=,ystap=, -%I offset=,schaal=,factor=] -%I -%I De instelling [nx=20,ny=20,dx=.5,dy=.5,eenheid=cm] levert -%I een patroon van 10cm bij 10cm van hokjes van 0.5cm op. -%I -%I Met '.stap' kunnen getallen langs de assen worden gezet. -%I als 0 wordt ingevuld (default), dan worden geen getallen -%I gezet. Met offset (ja of nee) kan men aangeven of de -%I getallen langs de assen binnen of buiten de box rond -%I het rooster vallen (vergelijk \stelpositionerenin). -%I -%I !! Dit commando wordt nog aangepast/uitgebreid. !! - -\def\dorooster[#1]% - {\begingroup - \getparameters[\??rt] - [\c!nx=10,\c!ny=10, - \c!dx=.5,\c!dy=.5, - \c!xstap=0,\c!ystap=0, - \c!eenheid=\s!cm, - \c!schaal=1, - \c!factor=1, - \c!offset=\v!ja, - #1]% - \startpositioneren - \dimen0=\@@rtdx\@@rteenheid\relax - \dimen0=\@@rtschaal\dimen0\relax - \dimen0=\@@rtfactor\dimen0\relax - \multiply\dimen0 by \@@rtnx\relax - \dimen2=\@@rtdy\@@rteenheid\relax - \dimen2=\@@rtschaal\dimen2\relax - \dimen2=\@@rtfactor\dimen2\relax - \multiply\dimen2 by \@@rtny\relax - \def\horline - {\vbox - {\hrule - \!!width \dimen0 - \!!height \linewidth - \!!depth \!!zeropoint}}% - \def\verline% - {\vrule - \!!width \linewidth - \!!height \dimen2 - \!!depth \!!zeropoint}% - \def\setlegend##1##2% - {\global\!!countc=0\relax - \dimen0=2em\relax - \dimen2=##2\@@rteenheid\relax - \dimen2=\@@rtschaal\dimen2\relax - \dimen2=\@@rtfactor\dimen2\relax - \divide\dimen0 by \dimen2\relax - \global\!!counte=\dimen0\relax - \ifnum\!!counte>50\relax - \global\!!counte=100\relax - \else\ifnum\!!counte>10\relax - \global\!!counte=50\relax - \else\ifnum\!!counte>5\relax - \global\!!counte=10\relax - \else\ifnum\!!counte>1\relax - \global\!!counte=5\relax - \else - \global\!!counte=1\relax - \fi\fi\fi\fi - \global\!!countd=0\relax - \def\legend% - {\ifnum\!!countd=0\relax - \vbox - {\hbox to 2em{\hss\the\!!countc\hss}}% - \global\!!countd=\!!counte - \fi - \global\advance\!!countd by -1\relax - \global\advance\!!countc by ##1\relax}}% - \def\draw##1##2##3##4##5##6##7% - {\stelpositionerenin - [\c!xstap=\v!absoluut, - \c!ystap=\v!absoluut, - \c!eenheid=\@@rteenheid, - \c!schaal=\@@rtschaal, - \c!factor=\@@rtfactor, - \c!offset=\@@rtoffset, - \c!xoffset=##6, - \c!yoffset=##7]% - \positioneer(0,0){##1}% - \stelpositionerenin - [\c!xstap=\v!relatief, - \c!ystap=\v!relatief, - \c!schaal=\@@rtschaal, - \c!factor=\@@rtfactor, - \c!offset=\@@rtoffset, - \c!eenheid=\@@rteenheid]% - \herhaal[##2*{\positioneer(##3,##4){##5}}]}% - \draw{\verline}{\@@rtnx}{\@@rtdx}{0}{\verline}{\!!zeropoint}{\!!zeropoint}% - \draw{\horline}{\@@rtny}{0}{\@@rtdy}{\horline}{\!!zeropoint}{\!!zeropoint}% - \tfx - \doifnot{\@@rtxstap}{0} - {\setlegend{\@@rtxstap}{\@@rtdx}% - \draw{\legend}{\@@rtnx}{\@@rtdx}{0}{\legend}{-1em}{-1.5em}}% - \doifnot{\@@rtystap}{0} - {\setlegend{\@@rtystap}{\@@rtdy}% - \draw{\legend}{\@@rtny}{0}{\@@rtdy}{\legend}{-2em}{-.75ex}}% - \stoppositioneren - \endgroup} - -\def\rooster% - {\dosingleargument\dorooster} - -%I n=Literatuurlijsten -%I c=\stelpublicatiesin,\startpublicatie,\publicatie -%I -%I Literatuurlijsten kunnen worden opgemaakt met het commando: -%I -%I \startpublicatie[referentie] -%I \naam .... -%I \titel .... -%I \jaar .... -%I \plaats .... -%I \uitgever .... -%I \stoppublicatie -%I -%I Een publicatie wordt opgeroepen met: -%I -%I \publicatie[referentie] -%P -%I Het formaat kan worden ingesteld met het commando: -%I -%I \stelpublicatiesin[variant=,voor=,na=,nummeren=, -%I breedte=,kopletter=,links=,rechts=] -%I -%I waarbij mogelijke varianten zijn: normaal apa en normaal. -%I Nummeren kan 'ja' of 'nee' zijn; links en rechts -%I hebben betrekking op de weergave in de tekst en zijn -%I standaard [ en ]. - -% Dit wordt: -% -% \doorverwijzen[naam][instellingen] enz. -% -% waarbij <naam> bijvoorbeeld publicatie is. Dit levert: -% -% \start<naam> -% \stop<naam> -% -% \beginvan<naam> -% \eindvan<naam> -% -% \publicatie -% -% \volledigelijstmetpublicaties -% -% eigenlijk kan ook door... zo worden uitgebreid! - -\doornummeren - [@publicatie] - [\c!plaats=\v!links, - \c!breedte=\@@pbbreedte,\c!hang=,\c!monster=, - \c!voor=\@@pbvoor,\c!na=\@@pbna,\c!tussen=, - \c!kopletter=\@@pbkopletter,\c!letter=, - \c!kopkleur=\@@pbkopkleur,\c!kleur=, - \c!wijze=\@@pbwijze,\c!blokwijze=\@@pbblokwijze, - \c!tekst=,\c!links=\@@pblinks,\c!rechts=\@@pbrechts] - -\def\dostelpublicatiesin[#1]% - {\getparameters[\??pb][#1]} - -\def\stelpublicatiesin% - {\dosingleargument\dostelpublicatiesin} - -\def\apa@publicatie% - {\doifsomething{\@@pb@naam}{\@@pb@naam,\spatie}% - \doifsomething{\@@pb@titel}{{\sl\@@pb@titel}.\spatie}% - \doifsomething{\@@pb@jaar}{(\@@pb@jaar).\spatie}% - \doifsomething{\@@pb@plaats}{\@@pb@plaats\doifelsenothing{\@@pb@uitgever}{.}{:\spatie}}% - \doifsomething{\@@pb@uitgever}{\@@pb@uitgever.}} - -\def\normaal@publicatie% - {\@@pb@naam, \@@pb@titel, \@@pb@jaar, \@@pb@pagina, \@@pb@plaats, \@@pb@uitgever.} - -\def\complexstartpublicatie[#1]#2\stoppublicatie% - {\bgroup% - \def\dosetpublicatie% - {\processcommalist - [naam,titel,jaar,plaats,pagina,uitgever] - \setpublicatie - \ignorespaces}% - \def\setpublicatie##1% - {\setvalue{\??pb @##1}{}% - \setvalue{##1}####1{\setvalue{\??pb @##1}{####1}\ignorespaces}}% - \def\getpublicatie% - {\doifsomething{\@@pbvariant}{\getvalue{\@@pbvariant @publicatie}}}% - \doifelse{\@@pbnummeren}{\v!ja}% - {\@publicatie[#1]\dosetpublicatie#2\getpublicatie\par}% - {\@@pbvoor - \dosetpublicatie\ignorespaces#2\getpublicatie - \@@pbna}% - \egroup} - -\def\startpublicatie% - {\complexorsimpleempty{startpublicatie}} - -\def\publicatie#1[#2]% - {\@@pblinks\in{#1}[#2]\@@pbrechts} - -%I n=Kenmerken -%I c=\kenmerk,\kenmerkdatum -%I -%I Er kan een kenmerk worden gezet met het commando: -%I -%I \kenmerk[bet=,ken=,dat=,van=,aan=,ref=] -%I -%I waarbij de verplichte parameters staan voor 'betreft', -%I 'kenmerk' en 'datum' en de optionele voor 'van', 'aan' en -%I 'referentie'. -%I -%I Een kenmerk-datum kan worden gezet met het commando: -%I -%I \kenmerkdatum -%I -%I zodat een kenmerk er bijvoorbeeld uitziet als: -%I -%I \kenmerk -%I [bet=rekening eerste termijn, -%I ken=\kenmerkdatum.sork.gvk / afo, -%I dat=\currentdate] - -\def\kenmerkdatum% - {\currentdate[\v!kenmerk]} - -\def\dokenmerk[#1]% - {\geenhoofdenvoetregels - \getparameters - [\??km] - [\c!bet=\onbekend, - \c!dat=\onbekend, - \c!ken=\onbekend, - \c!van=, - \c!aan=, - \c!ref=, - #1]% - \bgroup % moet anders, hoort niet in 01b - \assigntranslation[nl=referentie,en=reference,du=Referenz,sp=referencia]\to\@@@kmref - \assigntranslation[nl=van,en=from,du=Von,sp=de]\to\@@@kmvan - \assigntranslation[nl=aan,en=to,du=An,sp=a]\to\@@@kmaan - \assigntranslation[nl=betreft,en=concerns,du=Betreff,sp=]\to\@@@kmbet - \assigntranslation[nl=datum,en=date,du=Datum,sp=fecha]\to\@@@kmdat - \assigntranslation[nl=kenmerk,en=mark,du=Kennzeichen,sp=]\to\@@@kmken - \doifelsenothing{\@@kmvan\@@kmaan} - {\def\@@dokmvanaan{}} - {\def\@@dokmvanaan{&\omit\cr}}% - \doifelsenothing{\@@kmvan} - {\def\@@dokmvan{}} - {\def\@@dokmvan{\@@@kmvan&\@@kmvan\cr}}% - \doifelsenothing{\@@kmaan} - {\def\@@dokmaan{}} - {\def\@@dokmaan{\@@@kmaan&\@@kmaan\cr}}% - \doifelsenothing{\@@kmref} - {\def\@@dokmref{}} - {\def\@@dokmref{&\omit\cr\@@@kmref&\@@kmref\cr}}% - \witruimte - \tabskip=\!!zeropoint - \noindent\halign - \bgroup - ##~&:~##\hfil\cr - \@@@kmbet&\@@kmbet\cr - \@@@kmdat&\@@kmdat\cr - \@@@kmken&\kap{\@@kmken}\cr - \@@dokmvanaan - \@@dokmvan - \@@dokmaan - \@@dokmref - \egroup - \egroup} - -\def\kenmerk% - {\dosingleargument\dokenmerk} - -% NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW -% NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW - -\def\??ri{@@ri} - -\def\stelrijenin% - {\dodoubleargument\getparameters[\??ri]} - -\def\complexstartrijen[#1]% - {\bgroup - \stelrijenin[#1]% - \let\do@@rionder=\relax - \def\rij% - {\do@@rionder - \egroup - \dimen0=\vsize - \divide\dimen0 by \@@rin - \advance\dimen0 by -\lineskip - \vbox to \dimen0 - \bgroup - \@@riboven - \let\do@@rionder=\@@rionder - \ignorespaces}% - \bgroup - \rij} - -\def\startrijen% - {\complexorsimpleempty{startrijen}} - -\def\stoprijen% - {\do@@rionder - \egroup - \egroup} - -\stelrijenin - [n=2, - boven=, - onder=\vfill] - -% NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW -% NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW - -% Standaardinstellingen - -\stelitemsin - [\c!plaats=\v!links, - \c!symbool=5, - \c!breedte=\hsize, - \c!uitlijnen=\v!midden, - \c!n=\v!onbekend, - \c!voor=\blanko, - \c!tussen={\blanko[\v!middel]}, - \c!na=\blanko] - -\steltekstlijnenin - [\c!plaats=\v!links, - \c!voor=\blanko, - \c!na=\blanko, - \c!tussen=, - \c!breedte=2em, - \c!letter=\v!vet, - \c!kleur=] - -\stelinvullijnenin - [\c!breedte=\v!passend, - \c!afstand=1em, - \c!voor=\blanko, - \c!na=\blanko, - \c!n=1, - \c!scheider=, - \c!letter=\v!normaal, - \c!kleur=] - -\stelinvulregelsin - [\c!breedte=3cm, - \c!afstand=1em, - \c!voor=\blanko, - \c!na=\blanko] - -\steltabin - [\c!plaats=\v!links] - -\definieeralineas - [tabulatie] - [\c!n=3, - \c!voor=\blanko, - \c!na=\blanko, - \c!afstand=1em] - -\stelpublicatiesin - [\c!nummeren=\v!ja, - \c!variant=\c!apa, - \c!breedte=2em, - \c!hang=, - \c!monster=, - \c!voor=, - \c!na=, - \c!tussen=, - \c!kopletter=, - \c!kopkleur=, - \c!letter=, - \c!kleur=, - \c!blokwijze=\v!per\v!tekst, - \c!wijze=\v!per\v!tekst, - \c!tekst=, - \c!links={[}, - \c!rechts={]}] - -\stelciterenin - [\c!variant=1, - \c!letter=\v!normaal, - \c!kleur=] - -\protect - -\endinput +%D \module
+%D [ file=core-01b,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=1B (to be split),
+%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 Core Macros (b)}
+
+\unprotect
+
+%I n=Items
+%I c=\items,\stelitemsin
+%I
+%I Met het commando \items kunnen invullijsten worden
+%I gegenereerd:
+%I
+%I \items{alternatief1,alternatief2,...,alternatiefN}
+%I
+%I Als in plaats van een alternatief een - wordt gegeven,
+%I dan wordt ruimte opengelaten.
+%I
+%I De wijze waarop items worden weergegeven wordt ingesteld
+%I met het commando:
+%I
+%I \stelitemsin[plaats=,symbool=,breedte=,n=,voor=,
+%I tussen=,na=,uitlijnen=]
+%I
+%I Mogelijke plaatsen zijn links, rechts, onder, boven en
+%I inmarge. Als breedte wordt de breedte van de totale tekst
+%I opgegeven. Het aantal is facultatief, eventueel kan er
+%I 'onbekend' worden meegegeven. Uitlijnen is 'ja' of 'nee'.
+%P
+%I Indien gewenst, kan de instelling direkt achter \item worden
+%I geplaatst:
+%I
+%I \items[plaats=,symbool=,...]{alternatief1,...}
+%I
+%I In plaats van een symbool kan ook een van de volgende
+%I aanduidingen worden meegegeven:
+%I
+%I a a, b, c, d, ...
+%I A A, B, C, D, ...
+%I n 1, 2, 3, 4, ...
+%I r i, ii, iii, ...
+%I R I, II, III, ...
+%I
+%I Eventueel kan een nummer worden meegegeven. In dat
+%I geval wordt het overeenkomstige symbool van de
+%I opsomming gebruikt (1--n).
+
+%\def\checkinterlineskip%
+% {\ifvmode
+% \ifdim\lastskip>\!!zeropoint\relax
+% \nointerlineskip
+% \else\ifdim\lastkern>\!!zeropoint\relax
+% \nointerlineskip
+% \fi\fi
+% \fi}
+
+\def\horitems#1#2% #1=breedte #2=commandos
+ {\dimen0=#1\relax
+ \divide\dimen0 by \nofitems
+ \!!counta=0\relax
+ \def\docommando##1%
+ {\advance\!!counta by 1\relax
+ \processaction
+ [\@@isuitlijnen]
+ [ \v!links=>\hbox to \dimen0{\strut##1\hss},
+ \v!rechts=>\hbox to \dimen0{\hss\strut##1},
+ \v!midden=>\hbox to \dimen0{\hss\strut##1\hss},
+ \v!marge=>\ifnum\!!counta=1\hss\else\hfill\fi
+ \strut##1%
+ \ifnum\!!counta=\nofitems\hss\else\hfill\fi,
+ \s!default=>\hbox to \dimen0{\hss\strut##1\hss}, % midden
+ \s!unknown=>\hbox to \dimen0{\strut##1\hss}]}% % links
+ \hbox to #1{\hss#2\hss}}
+
+\def\veritems#1#2% #1=breedte #2=commandos
+ {\dimen0=#1\relax
+ \def\docommando##1%
+ {\ifdim\dimen0<\!!zeropoint\relax % the - was a signal
+ \hbox to -\dimen0{\hss\strut##1}%
+ \else\ifdim\dimen0>\!!zeropoint\relax
+ \hbox to \dimen0{\strut##1\hss}%
+ \else
+ \hbox{\strut##1}%
+ \fi\fi}%
+ \vbox{#2}}
+
+\def\dostelitemsin[#1]% maakt direkt gebruik van \??ss en \??cv
+ {\getparameters[\??is][#1]%
+ \doif{\@@isbreedte}{\v!onbekend}
+ {\def\@@isbreedte{\hsize}}%
+ \doifdefinedelse{\??cv\@@issymbool}
+ {\def\doitembullet##1{\convertnumber{\@@issymbool}{##1}}}
+ {\doifdefined{\??ss\@@issymbool}
+ {\def\doitembullet##1{\symbol[\@@issymbool]}}}}
+
+\def\makeitemsandbullets#1%
+ {\doifelse{\@@isn}{\v!onbekend}
+ {\getcommalistsize[#1]%
+ \edef\nofitems{\commalistsize}}
+ {\edef\nofitems{\@@isn}}%
+ \setbox0=\hbox
+ {\doitems
+ {\@@isbreedte}
+ {\processcommalist[#1]\docommando}}%
+ \setbox2=\hbox
+ {\doitems
+ {\@@isbulletbreedte}
+ {\herhaal[\nofitems*\docommando{\strut\doitembullet{\herhaler}}]}}}
+
+\def\dostartitems#1#2#3%
+ {\let\doitems=#2
+ \def\@@isbulletbreedte{#3}%
+ \makeitemsandbullets{#1}%
+ \@@isvoor}
+
+\def\dostopitems%
+ {\@@isna
+ \egroup}
+
+\def\doitemsboven#1%
+ {\dostartitems{#1}\horitems\@@isbreedte
+ \noindent\vbox
+ {\forgetall
+ \doifsomething{\@@issymbool}
+ {\doifnot{\@@issymbool}{\v!geen}
+ {\box2
+ \@@istussen
+ \nointerlineskip}}%
+ \box0}%
+ \dostopitems}
+
+\def\doitemsonder#1%
+ {\dostartitems{#1}\horitems\@@isbreedte
+ \noindent\vbox
+ {\forgetall
+ \box0
+ \doifsomething{\@@issymbool}
+ {\@@istussen
+ \nointerlineskip
+ \box2}}%
+ \dostopitems}
+
+\def\doitemsinmarge#1%
+ {\dostartitems{#1}{\veritems}{-1.5em}% - is a signal
+ \noindent\hbox{\llap{\box2\hskip\linkermargeafstand}\box0}%
+ \dostopitems}
+
+\def\doitemslinks#1%
+ {\advance\hsize by -1.5em\relax
+ \dostartitems{#1}{\veritems}{1.5em}%
+ \noindent\hbox{\box2\box0}%
+ \dostopitems}
+
+\def\doitemsrechts#1%
+ {\dostartitems{#1}{\veritems}{0em}%
+ \noindent\hbox{\box0\hskip-\wd2\box2}%
+ \dostopitems}
+
+\def\stelitemsin%
+ {\dosingleargument\dostelitemsin}
+
+\def\complexitems[#1]%
+ {\bgroup
+ \stelitemsin[#1]%
+ \parindent=\!!zeropoint
+ \setlocalhsize
+ \hsize=\localhsize
+ \mindermeldingen
+ \getvalue{doitems\@@isplaats}}
+
+\definecomplexorsimpleempty\items
+
+%I n=Tabulatie (1)
+%I c=\definieeralineas,\stelalineasin
+%I
+%I Er kunnen paragrafen in meerdere kolommen worden gezet na
+%I het commando:
+%I
+%I \definieeralineas[naam][n=,voor=,na=,afstand=,
+%I hoogte=,lijn=,binnen=]
+%I
+%I Kolommen worden vervolgens gezet met:
+%I
+%I \startnaam .... \naam .... \naam .... \stopnaam
+%I
+%I of (soms verwarrend):
+%I
+%I \naam .... \naam .... \naam .... \naam
+%I
+%I of (lekker kort):
+%I
+%I \naam .... \\ .... \\ .... \\
+%I
+%I waarbij het aantal malen .... \naam of \\ gelijk is
+%I aan n. Naast \naam en \\ is ook \volgendenaam toegestaan.
+%P
+%I Het is mogelijk per kolom een en ander in te stellen met
+%I het commando:
+%I
+%I \stelalineasin[naam][kolomnummer][afstand=,breedte=,
+%I hoogte=,boven=,onder=,letter=,binnen=,lijn=,
+%I uitlijnen=,tolerantie=]
+%I
+%I Standaard is \tabulatie gedefinieerd.
+
+% Te zijner tijd [plaats=boven,onder,midden] implementeren,
+% in dat geval moet eerst de maximale hoogte worden bepaald.
+%
+% Overigens kan een en ander mooier met \halign.
+
+\def\dodefinieeralineas[#1][#2]%
+ {\setvalue{\s!do\s!next#1}%
+ {\def\\{\getvalue{#1}}}%
+ \setvalue{#1}%
+ {\getvalue{\s!do\s!next#1}%
+ \dostartalineas{#1}}%
+ \setvalue{\e!volgende#1}%
+ {\getvalue{#1}}%
+ \setvalue{\e!start#1}%
+ {\bgroup
+ \setvalue{\s!do\s!next#1}{}%
+ \setvalue{\e!stop#1}%
+ {\getvalue{#1}%
+ \egroup}%
+ \getvalue{#1}}%
+ \getparameters[\??al#1]%
+ [\c!n=3,
+ \c!voor=\blanko,
+ \c!na=\blanko,
+ \c!afstand=1em,
+ \c!hoogte=\v!passend,
+ \c!lijn=\v!uit,
+ \c!commando=,
+ \c!uitlijnen=,
+ \c!tolerantie=\v!soepel,
+ \c!letter=,
+ \c!kleur=,
+ \c!boven=,
+ \c!boven=\vss,
+ \c!onder=\vfill,
+ #2]%
+ \setvalue{\e!stel#1\e!in}%
+ {\stelalineasin[#1]}%
+ \dorecurse
+ {\getvalue{\??al#1\c!n}}
+ {\stelalineasin[#1][\recurselevel]
+ [\c!breedte=,
+ \c!onder=\getvalue{\??al#1\c!onder},
+ \c!boven=\getvalue{\??al#1\c!boven},
+ \c!hoogte=\getvalue{\??al#1\c!hoogte},
+ \c!letter=\getvalue{\??al#1\c!letter},
+ \c!kleur=\getvalue{\??al#1\c!kleur},
+ \c!lijn=\getvalue{\??al#1\c!lijn},
+ \c!uitlijnen=\getvalue{\??al#1\c!uitlijnen},
+ \c!tolerantie=\getvalue{\??al#1\c!tolerantie},
+ \c!afstand=\getvalue{\??al#1\c!afstand}]}%
+ \stelalineasin[#1][1][\c!afstand=0em]}
+
+\def\definieeralineas%
+ {\dodoubleargument\dodefinieeralineas}
+
+\def\dostelalineasin[#1][#2][#3]%
+ {\doifelse{#2}{\v!elk}
+ {\dorecurse
+ {\getvalue{\??al#1\c!n}}
+ {\getparameters[\??al#1\herhaler][#3]}}
+ {\ConvertToConstant\doifelse{#3}{}
+ {\getparameters[\??al#1][#2]}
+ {\def\docommando##1%
+ {\getparameters[\??al#1##1][#3]}%
+ \processcommalist[#2]\docommando}}}
+
+\def\stelalineasin%
+ {\dotripleempty\dostelalineasin}
+
+\newcount\alteller
+\newcount\alnsize
+\newdimen\alhsize
+
+\def\doalinealijn#1#2%
+ {\doifelsevalue{\??al#2\the\alteller\c!lijn}{\v!aan}
+ {\expandafter\dimen2=#1\relax
+ \hskip.5\dimen2
+ \hskip-\linewidth
+ \vrule\!!width\linewidth
+ \hskip.5\dimen2}
+ {\hskip#1}}
+
+\def\dostartalinea#1%
+ {\doifelsevaluenothing{\??al#1\the\alteller\c!breedte}
+ {\!!widtha=\alhsize\relax
+ \divide\!!widtha by \alnsize}
+ {\!!widtha=\getvalue{\??al#1\the\alteller\c!breedte}\relax}%
+ \dostartattributes{\??al#1\the\alteller}{}%
+ \doifelsevalue{\??al#1\the\alteller\c!hoogte}{\v!passend}
+ {\setbox0=\vtop}
+ {\setbox0=\vtop to \getvalue{\??al#1\the\alteller\c!hoogte}}%
+ \bgroup
+ \blanko[\v!blokkeer]%
+ \forgetall
+ \getvalue{\??al#1\the\alteller\c!boven}%
+ \getvalue{\??al#1\c!binnen}%
+ \hsize=\!!widtha % setting \wd afterwards removed
+ \getvalue{\??al#1\the\alteller\c!binnen}%
+ \edef\!!stringa{\getvalue{\??al#1\the\alteller\c!uitlijnen}}% nodig?
+ \expandafter\steluitlijnenin\expandafter[\!!stringa]%
+ \edef\!!stringa{\getvalue{\??al#1\the\alteller\c!tolerantie}}% nodig?
+ \expandafter\steltolerantiein\expandafter[\!!stringa]%
+ \ignorespaces
+ \endgraf
+ \ignorespaces
+ %
+ % Nadeel van de onderstaande constructie is dat \everypar
+ % binnen een groep kan staan en zo steeds \begstruts
+ % worden geplaatst. Mooi is anders dus moet het anders!
+ %
+ % Hier is \Everypar niet nodig.
+ %
+ \everypar{\begstrut\everypar{}}%
+ %
+ \ignorespaces\geenspatie % dubbel: \ignorespaces
+ \getvalue{\??al#1\the\alteller\c!commando}}
+
+\def\dostopalinea#1%
+ {\ifvmode
+ \removelastskip
+ \else
+ \unskip\endstrut\endgraf
+ \fi
+ \getvalue{\??al#1\the\alteller\c!onder}%
+ \egroup
+ \ifdim\wd0=\!!zeropoint % no data
+ \wd0=\!!widtha
+ \fi
+ \box0
+ \dostopattributes
+ \ifnum\alteller<\getvalue{\??al#1\c!n}\relax
+ \def\next{\doalinea{#1}}%
+ \else
+ \def\next{\dostopalineas{#1}}%
+ \fi
+ \next}
+
+\def\doalinea#1%
+ {\global\advance\alteller by 1\relax
+ \doifelsevaluenothing{\??al#1\the\alteller\c!afstand}
+ {\doifnot{\the\alteller}{1}
+ {\hskip\getvalue{\??al#1\c!afstand}}}
+ {\doifelse{\the\alteller}{1}%
+ {\hskip\getvalue{\??al#1\the\alteller\c!afstand}}
+ {\doalinealijn{\getvalue{\??al#1\the\alteller\c!afstand}}{#1}}}%
+ \setvalue{#1}{\dostopalinea{#1}}%
+ \dostartalinea{#1}}
+
+\def\dostartalineas#1%
+ {\global\alteller=0\relax
+ \parindent=\!!zeropoint
+ \setlocalhsize
+ \alhsize=\localhsize
+ \alnsize=\getvalue{\??al#1\c!n}\relax
+ \dorecurse
+ {\getvalue{\??al#1\c!n}}
+ {\doifelsevaluenothing{\??al#1\recurselevel\c!afstand}
+ {\doifnot{\recurselevel}{1}
+ {\global\advance\alhsize by -\getvalue{\??al#1\c!afstand}\relax}}
+ {\global\advance\alhsize by -\getvalue{\??al#1\recurselevel\c!afstand}\relax}%
+ \doifvaluesomething{\??al#1\recurselevel\c!breedte}
+ {\global\advance\alnsize by -1\relax
+ \global\advance\alhsize by -\getvalue{\??al#1\recurselevel\c!breedte}\relax}}%
+ %\witruimte % gaat fout bij \framed
+ \getvalue{\??al#1\c!voor}%
+ \leavevmode % gaat wel goed bij \framed
+ \vbox\bgroup\hbox\bgroup
+ \doalinea{#1}}
+
+\def\dostopalineas#1%
+ {\egroup
+ \egroup
+ \par
+ \getvalue{\??al#1\c!na}}%
+
+%I n=Tabulatie (2)
+%I c=\steltabin,\tab
+%I
+%I Eenvoudige tabulatie is mogelijk met het commando:
+%I
+%I \tab{tekst} tekst tekst tekst .....
+%I
+%I Instelling vindt plaats met het commando:
+%I
+%I \steltabin[monster=,breedte=,kopletter=,voor,
+%I na=]
+%I
+%I Dit commando is een vereenvoudigde variant van het
+%I commando \doordefinieren. In de regel kan volstaan
+%I worden met het opgeven van een monster. Dit is het
+%I woord dat de breedte bepaalt.
+
+\def\dosteltabin[#1]%
+ {\getparameters[\??ta]
+ [\c!kopletter=\v!normaal,
+ \c!kopkleur=,
+ \c!letter=\v!normaal,
+ \c!kleur=,
+ \c!breedte=\v!ruim,
+ \c!monster={\hskip4em},
+ \c!voor=,
+ \c!na=,
+ #1]%
+ \doordefinieren
+ [tab]
+ [\c!kopletter=\@@takopletter,
+ \c!kopkleur=\@@takleur,
+ \c!monster=\@@tamonster,
+ \c!breedte=\@@tabreedte,
+ \c!voor=\@@tavoor,
+ \c!na=\@@tana]}
+
+\def\steltabin%
+ {\dosingleargument\dosteltabin}
+
+%I n=Diversen
+%I c=\celsius,\bedrag,\breuk
+%I c=\procent,\promille
+%I
+%I De volgende commando's vatten (vooral mathematische)
+%I zetcommando's samen:
+%I
+%I \chem{symbool}{onder}{boven} chemische symbolen
+%I \celsius{graden} graden Celsius (..~øC)
+%I \breuk{boven}{onder} breuken («)
+%I \bedrag{getal} geldbedragen (Ÿ~..)
+%I \punten[n] puntjes (. . .)
+%I \ongeveer plus-minus (ñ)
+%I \inch inch ('')
+%I \doorsnede \circ doorsneden met /
+%I \graden ø (^\circ)
+%I \procent percentage (vgl promille)
+%I \promille promilage
+%I \dollar dollar teken
+%I \sterling pound sterling teken
+%I \florijn gulden teken
+
+% The following macro's are derived from PPCHTEX and
+% therefore take some LaTeX font-switching into account.
+
+\newif\ifloweredsubscripts
+
+% Due to some upward incompatibality of LaTeX to LaTeX2.09
+% and/or LaTeX2e we had to force \@@chemieletter. Otherwise
+% some weird \nullfont error comes up.
+
+\doifundefined{@@chemieletter}{\def\@@chemieletter{\rm}}
+
+\def\beginlatexmathmodehack%
+ {\ifmmode
+ \let\endlatexmathmodehack=\relax
+ \else
+ \def\endlatexmathmodehack{$}$\@@chemieletter
+ \fi}
+
+\def\setsubscripts%
+ {\beginlatexmathmodehack
+ \def\dosetsubscript##1##2##3%
+ {\dimen0=##3\fontdimen5##2%
+ \setxvalue{@@\string##1\string##2}{\the##1##2\relax}%
+ ##1##2=\dimen0\relax}%
+ \def\dodosetsubscript##1##2%
+ {\dosetsubscript{##1}{\textfont2}{##2}%
+ \dosetsubscript{##1}{\scriptfont2}{##2}%
+ \dosetsubscript{##1}{\scriptscriptfont2}{##2}}%
+ %\dodosetsubscript{\fontdimen14}{?}%
+ \dodosetsubscript{\fontdimen16}{.7}%
+ \dodosetsubscript{\fontdimen17}{.7}%
+ \global\loweredsubscriptstrue
+ \endlatexmathmodehack}
+
+\def\resetsubscripts%
+ {\ifloweredsubscripts
+ \beginlatexmathmodehack
+ \def\doresetsubscript##1##2%
+ {\dimen0=\getvalue{@@\string##1\string##2}\relax
+ ##1##2=\dimen0}%
+ \def\dodoresetsubscript##1%
+ {\doresetsubscript{##1}{\textfont2}%
+ \doresetsubscript{##1}{\scriptfont2}%
+ \doresetsubscript{##1}{\scriptscriptfont2}}%
+ %\dodoresetsubscript{\fontdimen14}%
+ \dodoresetsubscript{\fontdimen16}%
+ \dodoresetsubscript{\fontdimen17}%
+ \global\loweredsubscriptsfalse
+ \endlatexmathmodehack
+ \fi}
+
+\let\beginlatexmathmodehack = \relax
+\let\endlatexmathmodehack = \relax
+
+\def\chem#1#2#3%
+ {\bgroup
+ \setsubscripts
+ \mathematics{\hbox{#1}_{#2}^{#3}}%
+ \resetsubscripts
+ \egroup}
+
+\def\celsius#1%
+ {#1\mathematics{^\circ}C}
+
+\def\graden%
+ {\mathematics{^\circ}}
+
+\def\inch%
+ {\hbox{\rm\char125\relax}}
+
+\def\breuk#1#2%
+ {\mathematics{#1\over#2}}
+
+\def\bedrag#1%
+ {\mathematics{f~}\hbox{#1}}
+
+\def\doorsnede%
+ {\hbox{\rlap/$\circ$} }
+
+\def\complexpunten[#1]%
+ {\dimen0=.5em\relax
+ \multiply\dimen0 by #1\relax
+ \hbox to \dimen0
+ {\leaders\hbox to .5em{\hss.\hss}\hss}}
+
+\def\simplepunten%
+ {\complexpunten[5]}
+
+\def\punten%
+ {\complexorsimple{punten}}
+
+\def\ongeveer%
+ {\mathematics{\pm}}
+
+\def\permille%
+ {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle00}}}
+
+\def\percent%
+ {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle0}}}
+
+\let\promille=\permille
+\let\procent =\percent
+
+% for compatibility
+
+\def\onbekend%
+ {\mathematics{\ldots}}
+
+% currency
+
+\def\dollar%
+ {\bgroup
+ \ifnum\fam=\itfam
+ \sl
+ \else\ifnum\fam=\bifam
+ \bs
+ \fi\fi
+ \$%
+ \egroup}
+
+\def\sterling%
+ {\bgroup
+ \ifnum\fam=\bffam
+ \bi
+ \else\ifnum\fam=\bifam
+ \bi
+ \else\ifnum\fam=\bsfam
+ \bi
+ \else
+ \it
+ \fi\fi\fi
+ \$%
+ \egroup}
+
+\def\florijn%
+ {\bgroup
+ \ifnum\fam=\bffam
+ \bi
+ \else\ifnum\fam=\bifam
+ \bi
+ \else\ifnum\fam=\bsfam
+ \bi
+ \else
+ \it
+ \fi\fi\fi
+ f%
+ \egroup}
+
+%I n=Citaten
+%I c=\startcitaat,\citaat,\stelcitatenin
+%I c=\citeer,\stelciterenin
+%I
+%I Als variant op \startsmaller is het volgende commando
+%I beschikbaar:
+%I
+%I \startcitaat
+%I tekst
+%I \stopcitaat
+%I
+%I Rond de tekst worden in de marge dubbele quotes
+%I geplaatst. Ook bij dit commando kunnen tussen [] maten
+%I worden opgegeven:
+%I
+%I \startcitaat[2*links,rechts]
+%I
+%I In de lopende tekst kan gebruik worden gemaakt van:
+%I
+%I \citaat{tekst}
+%I \citeer{tekst}
+%I
+%I Het eerste commando levert dubbele quotes en het tweede
+%I enkele quotes.
+%P
+%I Er zijn twee varianten (1 en 2) beschikbaar die kunnen
+%I worden ingesteld met:
+%I
+%I \stelciterenin
+%I [variant=,letter=]
+%I
+%I Variant 1 levert 'ziezo' of ''ziezo'' en variant 2
+%I levert `ziezo' of ``ziezo''.
+
+\newsignal\quotationsignal
+\def\quotationskip{.125em}
+
+\def\stelciterenin%
+ {\dodoubleargument\getparameters[\??ci]}
+
+\def\stelcitatenin%
+ {\stelciterenin}
+
+\def\dostartcitaat[#1]%
+ {\bgroup
+ \@@civoor
+ \doifelsenothing{#1}
+ {\let\dostopcitaat=\relax}
+ {\startsmaller[#1]
+ \let\dostopcitaat=\stopsmaller}%
+ \dostartattributes\??ci{}%
+ \setbox0=\hbox{\getvalue{\??la\currentlanguage\c!leftquotation}}%
+ \hskip-\wd0
+ \box0\relax
+ \ignorespaces}
+
+\def\stopcitaat%
+ {\unskip\hsmash{\getvalue{\??la\currentlanguage\c!rightquotation}}%
+ \dostopattributes
+ \dostopcitaat
+ \@@cina
+ \egroup}
+
+\def\startcitaat%
+ {\dosingleempty\dostartcitaat}
+
+\def\handlequotation#1%
+ {\ifdim\lastkern=\quotationsignal
+ \unskip
+ \hskip\quotationskip
+ \fi
+ \getvalue{\??la\currentlanguage#1}%
+ \kern\quotationsignal}
+
+\def\citaat%
+ {\groupedcommand
+ {\handlequotation\c!leftquotation}
+ {\handlequotation\c!rightquotation}}
+
+\def\citeer%
+ {\doifelse{\@@ciletter}{\v!normaal}
+ {\let\next=\doquotedcite}
+ {\let\next=\doattributedcite}%
+ \next}
+
+\def\doquotedcite%
+ {\groupedcommand
+ {\handlequotation\c!leftquote}
+ {\handlequotation\c!rightquote}}
+
+\def\doattributedcite%
+ {\groupedcommand
+ {\dostartattributes\??ci}
+ {\dostopattributes}}
+
+% Tijden horen hier niet thuis en zullen in een aparte
+% module worden ondergebracht. voorlopig handhaven we ze nog
+% even. Een implementatie met \doordefinieren zou beter voldoen
+% omdat een en ander dan instelbaar wordt. Het is trouwens
+% zowieso beter het commando \tijd te reserveren voor de
+% systeemtijd.
+
+% %I n=Tijden
+% %I c=\tijd,\tijdspan,\activiteit
+% %I
+% %I De volgende commando's kunnen worden gebruikt om
+% %I tijden en activiteiten in overzichten weer te geven:
+% %I
+% %I uu.mm
+% %I
+% %I \tijd{uur.min}
+% %I
+% %I uu.mm --- uu.mm
+% %I
+% %I \tijdspan{uur.min}{uur.min}
+% %I
+% %I uu.mm --- uu.mm activiteit
+% %I
+% %I \activiteit{uur.min}{uur.min} ... (\par)
+
+\def\tijd#1%
+ {\setbox0=\hbox{00.00}%
+ \hbox to \wd0{\hfill#1}}
+
+\def\tijdspan#1#2%
+ {\hbox{\tijd{#1}~---~\tijd{#2}}}
+
+\def\activiteit#1#2%
+ {\activity{\tijdspan{#1}{#2}}}
+
+\def\activiteit#1#2%
+ {\sym{\tijdspan{#1}{#2}}}
+
+%I n=Toevoegen
+%I c=\toevoegen
+%I
+%I Er kan witruimte worden gemarkeerd met het commando:
+%I
+%I \toevoegen[instelling]{korte tekst}
+%I
+%I waarbij als instellingen mogelijk zijn: klein, middel of
+%I groot.
+
+\def\dotoevoegen#1%
+ {\def\next{#1}%
+ \herhaal[#1*{\inlinker{\next~+}\def\next{}\crlf}]}
+
+\def\complextoevoegen[#1]%
+ {\blanko
+ \processaction
+ [#1]
+ [ \v!klein=>\dotoevoegen{3},
+ \v!middel=>\dotoevoegen{6},
+ \v!groot=>\dotoevoegen{9},
+ \s!default=>\dotoevoegen{6},
+ \s!unknown=>\dotoevoegen{#1}]
+ \blanko}
+
+\def\toevoegen%
+ {\complexorsimpleempty{toevoegen}}
+
+%I n=Tekstlijn
+%I c=\tekstlijn,\starttekstlijn,\steltekstlijnenin
+%I
+%I Een stuk tekst kan worden omgeven door horizontale lijnen,
+%I waarin al dan niet een tekst is opgenomen.
+%I
+%I \tekstlijn[plaats]{tekst}
+%I
+%I Mogelijke plaatsen zijn boven en onder. De onderstaande twee
+%I commando's zijn equivalent:
+%I
+%I \tekstlijn
+%I \tekstlijn[onder]{}
+%I
+%I Daarnaast zijn beschikbaar:
+%I
+%I \starttekstlijn{tekst}
+%I \stoptekstlijn
+%I
+%I waarbij de plaats dus boven is.
+%P
+%I Een en ander kan worden ingesteld met het commando:
+%I
+%I \steltekstlijnenin[voor=,na=,tussen=,letter=,breedte=,
+%I plaats=]
+%I
+%I De breedte heeft betrekking op de lengte van de lijn voor
+%I de tekst. Mogelijke plaatsen zijn links en inmarge.
+
+% nog eens \definieertekstlijn
+
+\def\steltekstlijnenin%
+ {\dodoubleargument\getparameters[\??tl]}
+
+\def\docomplextekstlijn#1%
+ {\bgroup
+ \setbox0=\hbox to \hsize
+ {\dimen4=0.5ex\relax
+ \dimen6=-0.5ex\relax
+ \advance\dimen4 by .5\linewidth
+ \advance\dimen6 by .5\linewidth
+ \doifsomething{#1}
+ {\doifelse{\@@tlplaats}{\v!inmarge}%
+ {\llap{\doattributes{\??tl}{#1}\hskip\linkermargeafstand}}
+ {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlbreedte
+ \hbox spread 1em{\hss\doattributes{\??tl}{\strut#1}\hss}}}%
+ \leaders\hrule\!!height\dimen4\!!depth\dimen6\hfill}
+ \ht0=\ht\strutbox
+ \dp0=\dp\strutbox
+ \box0
+ \egroup}
+
+\def\dotoptekstlijn#1%
+ {\pagina[\v!voorkeur]
+ \witruimte
+ \@@tlvoor
+ \docomplextekstlijn{#1}%
+ \geenwitruimte
+ \@@tltussen
+ \endgraf}
+
+\def\dobottomtekstlijn#1%
+ {\ifhmode
+ \endgraf
+ \fi
+ \dimen0=\dp\strutbox
+ \ifdim\prevdepth<\dp\strutbox
+ \ifdim\prevdepth>\!!zeropoint
+ \advance\dimen0 by -\prevdepth
+ \fi
+ \fi
+ \advance\dimen0 by .5ex
+ \vskip\dimen0
+ \@@tltussen
+ \doifelse{#1}{}
+ {\hrule\!!depth\linewidth\!!height\!!zeropoint}
+ {\docomplextekstlijn{#1}}%
+ \@@tlna
+ \pagina[\v!voorkeur]}
+
+\def\complextekstlijn[#1]#2%
+ {\processaction
+ [#1]
+ [ \v!boven=>\dotoptekstlijn{#2},
+ \v!onder=>\dobottomtekstlijn{#2},
+ \s!default=>\dobottomtekstlijn{#2}]}
+
+\def\simpletekstlijn%
+ {\dobottomtekstlijn{}}
+
+\def\tekstlijn%
+ {\complexorsimple{tekstlijn}}
+
+\def\starttekstlijn#1%
+ {\bgroup
+ \dotoptekstlijn{#1}}
+
+\def\stoptekstlijn%
+ {\dobottomtekstlijn{}%
+ \egroup}
+
+%I n=Invullijnen
+%I c=\invullijnen,\stelinvullijnenin,\invultekst
+%I
+%I Ten behoeve van invullijsten is het volgende commando
+%I beschikbaar:
+%I
+%I \invullijnen[n=,breedte=]{tekst}
+%I
+%I Dit levert:
+%I
+%I tekst _____________________________________________
+%I _____________________________________________
+%I
+%I De instellingen kunnen desgewenst achterwege blijven:
+%I
+%I \invullijnen{tekst}
+%I \invullijnen{tekst}{optionele eindtekst}
+%I
+%I In dat geval worden de standaard-instellingen gebruikt.
+%P
+%I De standaardinstellingen vinden plaats met:
+%I
+%I \stelinvullijnenin[n=,breedte=,afstand=,letter=,voor=,
+%I na=,scheider=]
+%I
+%I De afstand heeft betrekking op de afstand tussen de
+%I scheider en de lijnen.
+%I
+%I Het volgende commando plaatst een tekst op een zelfde
+%I wijze als de invullijnen.
+%I
+%I \invultekst{tekst} tekst \par
+
+\def\stelinvullijnenin%
+ {\dosingleargument\getparameters[\??il]}
+
+\def\dodocomplexinvullijnen[#1]#2#3#4%
+ {\endgraf
+ \@@ilvoor
+ \begingroup
+ \stelinvullijnenin[#1]%
+ \noindent
+ \doifelse{\@@ilbreedte}{\v!passend}
+ {\setbox0=\hbox}
+ {\setbox0=\hbox to \@@ilbreedte}
+ {\doattributes
+ {\??il}
+ {\strut#3\hfill
+ \doifsomething{\@@ilscheider}
+ {\hbox spread \@@ilafstand{\@@ilscheider\hss}}}}%
+ \hangindent=\wd0\relax
+ \parindent=\hangindent
+ \box0\relax
+ \stelwitruimtein[\v!groot]%
+ \ignorespaces
+ #2#4%
+ \endgroup
+ \endgraf
+ \@@ilna}
+
+\def\complexinvullijnen[#1]%
+ {\def\docomplexinvullijnen%
+ {\dodocomplexinvullijnen[#1]{\thinrules[\c!n=\@@iln]}}%
+ \dodoublegroupempty\docomplexinvullijnen}
+
+\def\invullijnen%
+ {\complexorsimpleempty{invullijnen}}
+
+\def\complexinvultekst[#1]#2#3\par%
+ {\dodocomplexinvullijnen[#1]{\ignorespaces#3\endgraf}{#2}{}}
+
+\def\invultekst%
+ {\complexorsimpleempty{invultekst}}
+
+%I n=Invulregels
+%I c=\invulregel,\stelinvulregelin,\invultekst
+%I
+%I Ten behoeve van invullijsten is het volgende commando
+%I beschikbaar:
+%I
+%I \invulregel[breedte=,afstand=]{tekst}
+%I
+%I tekst tekst tekst tekst tekst tekst tekst
+%I tekst tekst tekst tekst tekst tekst tekst __________
+%I
+%I De instellingen kunnen desgewenst achterwege blijven:
+%I
+%I \invulregel tekst
+%I
+%I In dat geval worden de standaard-instellingen gebruikt.
+%I
+%I De standaardinstellingen vinden plaats met:
+%I
+%I \stelinvulregelsin[n=,breedte=,afstand=,voor=,na=]
+%I
+%I De lengte van de lijn is gelijk aan breedte-afstand.
+
+\def\stelinvulregelsin%
+ {\dosingleargument\getparameters[\??iv]}
+
+\def\complexinvulregel[#1]#2\par%
+ {%\endgraf % interferes with \doordefinieren alikes
+ \@@ivvoor
+ \begingroup
+ \stelinvulregelsin[#1]%
+ \advance\rightskip by \@@ivbreedte
+ \parfillskip\!!zeropoint
+ #2\hfill
+ \dimen0=\@@ivbreedte
+ \advance\dimen0 by -\@@ivafstand
+ \rlap
+ {\hskip\@@ivafstand
+ \vrule\!!width\dimen0\!!height\linewidth}%
+ \par % !
+ \endgroup
+ \par % !
+ \@@ilna}
+
+\def\invulregel%
+ {\complexorsimpleempty{invulregel}}
+
+%I n=Roosters
+%I c=\rooster
+%I
+%I Er kunnen roosters (te vergelijken met ruitjespapier)
+%I worden gemaakt met:
+%I
+%I \rooster[nx=,ny=,dx=,dy=,eenheid=,xstap=,ystap=,
+%I offset=,schaal=,factor=]
+%I
+%I De instelling [nx=20,ny=20,dx=.5,dy=.5,eenheid=cm] levert
+%I een patroon van 10cm bij 10cm van hokjes van 0.5cm op.
+%I
+%I Met '.stap' kunnen getallen langs de assen worden gezet.
+%I als 0 wordt ingevuld (default), dan worden geen getallen
+%I gezet. Met offset (ja of nee) kan men aangeven of de
+%I getallen langs de assen binnen of buiten de box rond
+%I het rooster vallen (vergelijk \stelpositionerenin).
+%I
+%I !! Dit commando wordt nog aangepast/uitgebreid. !!
+
+\def\dorooster[#1]%
+ {\begingroup
+ \getparameters[\??rt]
+ [\c!nx=10,\c!ny=10,
+ \c!dx=.5,\c!dy=.5,
+ \c!xstap=0,\c!ystap=0,
+ \c!eenheid=\s!cm,
+ \c!schaal=1,
+ \c!factor=1,
+ \c!offset=\v!ja,
+ #1]%
+ \startpositioneren
+ \dimen0=\@@rtdx\@@rteenheid\relax
+ \dimen0=\@@rtschaal\dimen0\relax
+ \dimen0=\@@rtfactor\dimen0\relax
+ \multiply\dimen0 by \@@rtnx\relax
+ \dimen2=\@@rtdy\@@rteenheid\relax
+ \dimen2=\@@rtschaal\dimen2\relax
+ \dimen2=\@@rtfactor\dimen2\relax
+ \multiply\dimen2 by \@@rtny\relax
+ \def\horline
+ {\vbox
+ {\hrule
+ \!!width \dimen0
+ \!!height \linewidth
+ \!!depth \!!zeropoint}}%
+ \def\verline%
+ {\vrule
+ \!!width \linewidth
+ \!!height \dimen2
+ \!!depth \!!zeropoint}%
+ \def\setlegend##1##2%
+ {\global\!!countc=0\relax
+ \dimen0=2em\relax
+ \dimen2=##2\@@rteenheid\relax
+ \dimen2=\@@rtschaal\dimen2\relax
+ \dimen2=\@@rtfactor\dimen2\relax
+ \divide\dimen0 by \dimen2\relax
+ \global\!!counte=\dimen0\relax
+ \ifnum\!!counte>50\relax
+ \global\!!counte=100\relax
+ \else\ifnum\!!counte>10\relax
+ \global\!!counte=50\relax
+ \else\ifnum\!!counte>5\relax
+ \global\!!counte=10\relax
+ \else\ifnum\!!counte>1\relax
+ \global\!!counte=5\relax
+ \else
+ \global\!!counte=1\relax
+ \fi\fi\fi\fi
+ \global\!!countd=0\relax
+ \def\legend%
+ {\ifnum\!!countd=0\relax
+ \vbox
+ {\hbox to 2em{\hss\the\!!countc\hss}}%
+ \global\!!countd=\!!counte
+ \fi
+ \global\advance\!!countd by -1\relax
+ \global\advance\!!countc by ##1\relax}}%
+ \def\draw##1##2##3##4##5##6##7%
+ {\stelpositionerenin
+ [\c!xstap=\v!absoluut,
+ \c!ystap=\v!absoluut,
+ \c!eenheid=\@@rteenheid,
+ \c!schaal=\@@rtschaal,
+ \c!factor=\@@rtfactor,
+ \c!offset=\@@rtoffset,
+ \c!xoffset=##6,
+ \c!yoffset=##7]%
+ \positioneer(0,0){##1}%
+ \stelpositionerenin
+ [\c!xstap=\v!relatief,
+ \c!ystap=\v!relatief,
+ \c!schaal=\@@rtschaal,
+ \c!factor=\@@rtfactor,
+ \c!offset=\@@rtoffset,
+ \c!eenheid=\@@rteenheid]%
+ \herhaal[##2*{\positioneer(##3,##4){##5}}]}%
+ \draw{\verline}{\@@rtnx}{\@@rtdx}{0}{\verline}{\!!zeropoint}{\!!zeropoint}%
+ \draw{\horline}{\@@rtny}{0}{\@@rtdy}{\horline}{\!!zeropoint}{\!!zeropoint}%
+ \tfx
+ \doifnot{\@@rtxstap}{0}
+ {\setlegend{\@@rtxstap}{\@@rtdx}%
+ \draw{\legend}{\@@rtnx}{\@@rtdx}{0}{\legend}{-1em}{-1.5em}}%
+ \doifnot{\@@rtystap}{0}
+ {\setlegend{\@@rtystap}{\@@rtdy}%
+ \draw{\legend}{\@@rtny}{0}{\@@rtdy}{\legend}{-2em}{-.75ex}}%
+ \stoppositioneren
+ \endgroup}
+
+\def\rooster%
+ {\dosingleargument\dorooster}
+
+%I n=Literatuurlijsten
+%I c=\stelpublicatiesin,\startpublicatie,\publicatie
+%I
+%I Literatuurlijsten kunnen worden opgemaakt met het commando:
+%I
+%I \startpublicatie[referentie]
+%I \naam ....
+%I \titel ....
+%I \jaar ....
+%I \plaats ....
+%I \uitgever ....
+%I \stoppublicatie
+%I
+%I Een publicatie wordt opgeroepen met:
+%I
+%I \publicatie[referentie]
+%P
+%I Het formaat kan worden ingesteld met het commando:
+%I
+%I \stelpublicatiesin[variant=,voor=,na=,nummeren=,
+%I breedte=,kopletter=,links=,rechts=]
+%I
+%I waarbij mogelijke varianten zijn: normaal apa en normaal.
+%I Nummeren kan 'ja' of 'nee' zijn; links en rechts
+%I hebben betrekking op de weergave in de tekst en zijn
+%I standaard [ en ].
+
+% Dit wordt:
+%
+% \doorverwijzen[naam][instellingen] enz.
+%
+% waarbij <naam> bijvoorbeeld publicatie is. Dit levert:
+%
+% \start<naam>
+% \stop<naam>
+%
+% \beginvan<naam>
+% \eindvan<naam>
+%
+% \publicatie
+%
+% \volledigelijstmetpublicaties
+%
+% eigenlijk kan ook door... zo worden uitgebreid!
+
+\doornummeren
+ [@publicatie]
+ [\c!plaats=\v!links,
+ \c!breedte=\@@pbbreedte,\c!hang=,\c!monster=,
+ \c!voor=\@@pbvoor,\c!na=\@@pbna,\c!tussen=,
+ \c!kopletter=\@@pbkopletter,\c!letter=,
+ \c!kopkleur=\@@pbkopkleur,\c!kleur=,
+ \c!wijze=\@@pbwijze,\c!blokwijze=\@@pbblokwijze,
+ \c!tekst=,\c!links=\@@pblinks,\c!rechts=\@@pbrechts]
+
+\def\dostelpublicatiesin[#1]%
+ {\getparameters[\??pb][#1]}
+
+\def\stelpublicatiesin%
+ {\dosingleargument\dostelpublicatiesin}
+
+\def\apa@publicatie%
+ {\doifsomething{\@@pb@naam}{\@@pb@naam,\spatie}%
+ \doifsomething{\@@pb@titel}{{\sl\@@pb@titel}.\spatie}%
+ \doifsomething{\@@pb@jaar}{(\@@pb@jaar).\spatie}%
+ \doifsomething{\@@pb@plaats}{\@@pb@plaats\doifelsenothing{\@@pb@uitgever}{.}{:\spatie}}%
+ \doifsomething{\@@pb@uitgever}{\@@pb@uitgever.}}
+
+\def\normaal@publicatie%
+ {\@@pb@naam, \@@pb@titel, \@@pb@jaar, \@@pb@pagina, \@@pb@plaats, \@@pb@uitgever.}
+
+\def\complexstartpublicatie[#1]#2\stoppublicatie%
+ {\bgroup%
+ \def\dosetpublicatie%
+ {\processcommalist
+ [naam,titel,jaar,plaats,pagina,uitgever]
+ \setpublicatie
+ \ignorespaces}%
+ \def\setpublicatie##1%
+ {\setvalue{\??pb @##1}{}%
+ \setvalue{##1}####1{\setvalue{\??pb @##1}{####1}\ignorespaces}}%
+ \def\getpublicatie%
+ {\doifsomething{\@@pbvariant}{\getvalue{\@@pbvariant @publicatie}}}%
+ \doifelse{\@@pbnummeren}{\v!ja}%
+ {\@publicatie[#1]\dosetpublicatie#2\getpublicatie\par}%
+ {\@@pbvoor
+ \dosetpublicatie\ignorespaces#2\getpublicatie
+ \@@pbna}%
+ \egroup}
+
+\def\startpublicatie%
+ {\complexorsimpleempty{startpublicatie}}
+
+\def\publicatie#1[#2]%
+ {\@@pblinks\in{#1}[#2]\@@pbrechts}
+
+%I n=Kenmerken
+%I c=\kenmerk,\kenmerkdatum
+%I
+%I Er kan een kenmerk worden gezet met het commando:
+%I
+%I \kenmerk[bet=,ken=,dat=,van=,aan=,ref=]
+%I
+%I waarbij de verplichte parameters staan voor 'betreft',
+%I 'kenmerk' en 'datum' en de optionele voor 'van', 'aan' en
+%I 'referentie'.
+%I
+%I Een kenmerk-datum kan worden gezet met het commando:
+%I
+%I \kenmerkdatum
+%I
+%I zodat een kenmerk er bijvoorbeeld uitziet als:
+%I
+%I \kenmerk
+%I [bet=rekening eerste termijn,
+%I ken=\kenmerkdatum.sork.gvk / afo,
+%I dat=\currentdate]
+
+\def\kenmerkdatum%
+ {\currentdate[\v!kenmerk]}
+
+\def\dokenmerk[#1]%
+ {\geenhoofdenvoetregels
+ \getparameters
+ [\??km]
+ [\c!bet=\onbekend,
+ \c!dat=\onbekend,
+ \c!ken=\onbekend,
+ \c!van=,
+ \c!aan=,
+ \c!ref=,
+ #1]%
+ \bgroup % moet anders, hoort niet in 01b
+ \assigntranslation[nl=referentie,en=reference,du=Referenz,sp=referencia]\to\@@@kmref
+ \assigntranslation[nl=van,en=from,du=Von,sp=de]\to\@@@kmvan
+ \assigntranslation[nl=aan,en=to,du=An,sp=a]\to\@@@kmaan
+ \assigntranslation[nl=betreft,en=concerns,du=Betreff,sp=]\to\@@@kmbet
+ \assigntranslation[nl=datum,en=date,du=Datum,sp=fecha]\to\@@@kmdat
+ \assigntranslation[nl=kenmerk,en=mark,du=Kennzeichen,sp=]\to\@@@kmken
+ \doifelsenothing{\@@kmvan\@@kmaan}
+ {\def\@@dokmvanaan{}}
+ {\def\@@dokmvanaan{&\omit\cr}}%
+ \doifelsenothing{\@@kmvan}
+ {\def\@@dokmvan{}}
+ {\def\@@dokmvan{\@@@kmvan&\@@kmvan\cr}}%
+ \doifelsenothing{\@@kmaan}
+ {\def\@@dokmaan{}}
+ {\def\@@dokmaan{\@@@kmaan&\@@kmaan\cr}}%
+ \doifelsenothing{\@@kmref}
+ {\def\@@dokmref{}}
+ {\def\@@dokmref{&\omit\cr\@@@kmref&\@@kmref\cr}}%
+ \witruimte
+ \tabskip=\!!zeropoint
+ \noindent\halign
+ \bgroup
+ ##~&:~##\hfil\cr
+ \@@@kmbet&\@@kmbet\cr
+ \@@@kmdat&\@@kmdat\cr
+ \@@@kmken&\kap{\@@kmken}\cr
+ \@@dokmvanaan
+ \@@dokmvan
+ \@@dokmaan
+ \@@dokmref
+ \egroup
+ \egroup}
+
+\def\kenmerk%
+ {\dosingleargument\dokenmerk}
+
+% NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW
+% NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW
+
+\def\??ri{@@ri}
+
+\def\stelrijenin%
+ {\dodoubleargument\getparameters[\??ri]}
+
+\def\complexstartrijen[#1]%
+ {\bgroup
+ \stelrijenin[#1]%
+ \let\do@@rionder=\relax
+ \def\rij%
+ {\do@@rionder
+ \egroup
+ \dimen0=\vsize
+ \divide\dimen0 by \@@rin
+ \advance\dimen0 by -\lineskip
+ \vbox to \dimen0
+ \bgroup
+ \@@riboven
+ \let\do@@rionder=\@@rionder
+ \ignorespaces}%
+ \bgroup
+ \rij}
+
+\def\startrijen%
+ {\complexorsimpleempty{startrijen}}
+
+\def\stoprijen%
+ {\do@@rionder
+ \egroup
+ \egroup}
+
+\stelrijenin
+ [n=2,
+ boven=,
+ onder=\vfill]
+
+% NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW
+% NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW NIEUW
+
+% Standaardinstellingen
+
+\stelitemsin
+ [\c!plaats=\v!links,
+ \c!symbool=5,
+ \c!breedte=\hsize,
+ \c!uitlijnen=\v!midden,
+ \c!n=\v!onbekend,
+ \c!voor=\blanko,
+ \c!tussen={\blanko[\v!middel]},
+ \c!na=\blanko]
+
+\steltekstlijnenin
+ [\c!plaats=\v!links,
+ \c!voor=\blanko,
+ \c!na=\blanko,
+ \c!tussen=,
+ \c!breedte=2em,
+ \c!letter=\v!vet,
+ \c!kleur=]
+
+\stelinvullijnenin
+ [\c!breedte=\v!passend,
+ \c!afstand=1em,
+ \c!voor=\blanko,
+ \c!na=\blanko,
+ \c!n=1,
+ \c!scheider=,
+ \c!letter=\v!normaal,
+ \c!kleur=]
+
+\stelinvulregelsin
+ [\c!breedte=3cm,
+ \c!afstand=1em,
+ \c!voor=\blanko,
+ \c!na=\blanko]
+
+\steltabin
+ [\c!plaats=\v!links]
+
+\definieeralineas
+ [tabulatie]
+ [\c!n=3,
+ \c!voor=\blanko,
+ \c!na=\blanko,
+ \c!afstand=1em]
+
+\stelpublicatiesin
+ [\c!nummeren=\v!ja,
+ \c!variant=\c!apa,
+ \c!breedte=2em,
+ \c!hang=,
+ \c!monster=,
+ \c!voor=,
+ \c!na=,
+ \c!tussen=,
+ \c!kopletter=,
+ \c!kopkleur=,
+ \c!letter=,
+ \c!kleur=,
+ \c!blokwijze=\v!per\v!tekst,
+ \c!wijze=\v!per\v!tekst,
+ \c!tekst=,
+ \c!links={[},
+ \c!rechts={]}]
+
+\stelciterenin
+ [\c!variant=1,
+ \c!letter=\v!normaal,
+ \c!kleur=,
+ \c!voor=\startsmaller,
+ \c!na=\stopsmaller]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-01c.tex b/tex/context/base/core-01c.tex index a4b04a778..9d91c6f4b 100644 --- a/tex/context/base/core-01c.tex +++ b/tex/context/base/core-01c.tex @@ -1,1232 +1,1233 @@ -%D \module -%D [ file=core-01c, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=1C (to be split), -%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 Core Macros (c)} - -\unprotect - -\startmessages dutch library: figures - title: figuren - 1: maten van -- geladen uit locale figuurfile - 2: maten van -- geladen uit globale figuurfile - 3: maten van -- geladen uit figuurfile zelf - 4: figuur -- is niet te vinden - 5: er moet een nieuwe figuurfile worden aangemaakt -\stopmessages - -\startmessages english library: figures - title: figures - 1: dimensions of -- loaded from local figurefile - 2: dimensions of -- loaded from global figurefile - 3: dimensions of -- loaded from figurefile itself - 4: figure -- can not be found - 5: you have to regenerate a new figure file -\stopmessages - -\startmessages german library: figures - title: figures - 1: Dimensionen von -- geladen von lokaler Abbildungsdatei - 2: Dimensionen von -- geladen von globaler Abbildungsdatei - 3: Dimensionen von -- geladen von Abbildungsdatei selbst - 4: Abbildung -- kann nicht gefunden werden - 5: Sie haben eine neu Abbildungsdatei erstellt -\stopmessages - -\startmessages dutch library: systems - 41: externe file -- in groep -- bestaat niet -\stopmessages - -\startmessages english library: systems - 41: external file -- in group -- does not exist -\stopmessages - -\startmessages german library: systems - 41: Externe Datei -- in Gruppe -- existiert nicht -\stopmessages - -% Een verdere 'besparing' kan worden gerealiseerd als de -% variabelen (ef#1...) lokaal blijven als een figuur wordt -% geladen. Ook kunnen in texutil.tuf \c!variabelen worden -% gebruikt. - -%I n=Figuren+ -%I c=\gebruikexternfiguur,\gebruikexternefiguren,\externfiguur -%I c=\figuurintekst -%I -%I Extern aangemaakte (postscript)-figuren kunnen in -%I de tekst worden opgenomen. De afmetingen van deze -%I figuren kunnen op verschillende manieren worden -%I ingesteld: -%I -%I \gebruikexternfiguur[naam][file][schaal=,kader=] -%I -%I \gebruikexternfiguur[naam][file][hfactor=,kader=] -%I \gebruikexternfiguur[naam][file][bfactor=,kader=] -%I -%I \gebruikexternfiguur[naam][file][hoogte=,kader=] -%I \gebruikexternfiguur[naam][file][breedte=,kader=] -%I -%I \gebruikexternfiguur[eerste naam][file][....] -%I \gebruikexternfiguur[tweede naam][file][eerste naam] -%I -%I Externe figuren kunnen vervolgens worden opgeroepen op -%I naam: -%I -%I \naam -%P -%I De schaal wordt opgegeven in tienden procenten. Dat -%I betekent dat 12.5 procent wordt opgegeven als 125. -%I -%I In plaats van een schaal kan ook een schaalfactor worden -%I opgegeven. Een factor 15 resulteert in een figuur met een -%I hoogte van 1.5 maal de korpsgrootte. In plaats van een -%I getal kan ook 'max', 'passend' of 'ruim' worden opgegeven. -%I -%I De breedte en hoogte worden opgegeven in de gebruikelijke -%I TeX-maten. -%I -%I Als men automatisch wil laten bepalen wat de maximale -%I hoogte of breedte is, dan kan men 'factor=max' meegeven. -%P -%I Externe figuren moeten worden voorgedefinieerd. Dit doet -%I men met het commando: -%I -%I \presetfigure[file][type=,breedte=,hoogte=, -%I omvang=,bron=,titel=] -%I -%I Met behulp van texutil kan een file 'texutil.tuf' -%I worden aangemaakt waarin de op het werkgebied beschikbare -%I figuren worden voorgedefinieerd. In dat geval kan het -%I commando \presetfigure achterwege blijven. -%I -%I De voorinstellingen worden geladen met het commando: -%I -%I \gebruikexternefiguren[optie=,korps=,lokatie=] -%I -%I waarbij als opties kader en leeg mogelijk zijn. In -%I het eerste geval wordt een kader om de figuren -%I geplaatst, in het tweede geval worden alleen kenmerken -%I van de figuur weergegeven. Lokatie kan lokaal, globaal -%I of {lokaal,globaal} (default) zijn. -%P -%I Figuren kunnen op het actuele gebied staan, op een root -%I van het actuele gebied of op een nader in te stellen gebied. -%I Dit instellen gebeurt door aan 'gebied' een naam toe te -%I kennen. -%I -%I De in de file 'system.tex' opgenomen standaardinstelling -%I is (let op het gebruik van /): -%I -%I \stelexternefigurenin[gebied=c:/figuren/eps,file=] -%P -%I Het eerder genoemde commando \gebruikexternfiguur ziet -%I er als volgt uit: -%I -%I \gebruikexternfiguur[naam][file][instellingen] -%I -%I De naam is facultatief en is standaard gelijk aan de -%I filenaam. Als een (file)naam cijfers bevat, moet het -%I commando \naam{naam} worden gebruikt. -%I -%I Het is mogelijk in \plaatsfiguur direkt een externe -%I figuur op te roepen: -%I -%I \plaatsfiguur{commentaar}{\naam} -%I -%I Ook is het mogelijk een figuur in de tekst op te nemen -%I met het commando: -%I -%I \figuurintekst{\naam} - -%T n=extern -%T m=ext -%T a=e -%T -%T \gebruikexternfiguur [] [?] [bfactor=] - -%D The following macro's are derived from Thomas Rockicky's -%D macro's. They are rewritten to a more compact form, made a -%D bit more robust and also handle the \type{HiResBoundingBox} -%D or \type{ExactBoundingBox} that sometimes is present. -%D -%D A bounding box has the form: -%D -%D \starttypen -%D %%BoundingBox: llx lly urx ury -%D \stoptypen -%D -%D Before we scan the file, we have to reset special -%D characters and set some others. The percentage symbol also -%D needs special treatment. When a bounding box is -%D encountered, we keep on scanning until no more directives are -%D found, i.e. a line is found that does not start with a -%D percentage symbol. We also abort scanning after finding a -%D high resolution bounding box. -%D -%D This method also works inside verbatim mode (like when we -%D are typesetting sources and putting eps coded logos into -%D a heading. Temporary restoring the \CATCODES\ is done in -%D the calling routine. - -\def\iffigurefileopened#1% - {\openjobin{\scratchread}{#1}% - \ifeof\scratchread - \doifsomething{\@@exgebied} - {\closein\scratchread - \openfixin{\scratchread}{\@@exgebied}{#1}}% - \fi - \ifeof\scratchread - \closein\scratchread - \else} - -\def\dogetfiguresizeeps#1#2#3#4#5% - {\bgroup - \global\chardef\epsffound=0 - \iffigurefileopened{#1}% - \uncatcodespecials - \def\next% - {\read\scratchread to \epsffileline - \ifeof\scratchread - \let\next=\relax - \else - \expandafter\epsfaux\epsffileline:. \\% - \fi - \next}% - \next - \closein\scratchread - \fi - \egroup - \ifnum\epsffound>0 - \dimen0=1bp\relax - #2=\epsfllx\dimen0 - #4=\epsfurx\dimen0 - \advance#4 by -\epsfllx\dimen0 - #3=\epsflly\dimen0 - #5=\epsfury\dimen0 - \advance#5 by -\epsflly\dimen0 - \else - #2=\!!zeropoint - #3=\!!zeropoint - #4=\!!zeropoint - #5=\!!zeropoint - \fi} - -\bgroup -\catcode`\%=\@@other -\global\let\epsfpercent=% -\gdef\epsfboundingbox {%BoundingBox} -\gdef\epsfhiresboundingbox{%HiResBoundingBox} -\gdef\epsfexactboundingbox{%ExactBoundingBox} -\egroup - -\long\def\epsfaux#1#2:#3\\% - {\ifx#1\epsfpercent - \def\!!stringa{#2}% - \ifx\!!stringa\epsfboundingbox - \epsfgrab #3 . . . \\% - \global\chardef\epsffound=1 - \else\ifx\!!stringa\epsfhiresboundingbox - \epsfgrab #3 . . . \\% - \global\chardef\epsffound=2 - \let\next=\relax - \else\ifx\!!stringa\epsfexactboundingbox - \epsfgrab #3 . . . \\% - \global\chardef\epsffound=2 - \let\next=\relax - \fi\fi\fi - \else\ifnum\epsffound>0 - \let\next=\relax - \fi\fi} - -\def\epsfgrab #1 #2 #3 #4 #5\\% - {\gdef\epsfllx{#1}% - \ifx\epsfllx\empty - \epsfgrab #2 #3 #4 #5 .\\% - \else - \gdef\epsflly{#2}% - \gdef\epsfurx{#3}% - \gdef\epsfury{#4}% - \fi} - -\edef\figureversion {1996.06.01} - -\def\@@figureerrormessage% - {\showmessage{\m!figures}{5}{}% - \global\let\@@figureerrormessage=\relax} - -\def\thisisfigureversion#1% - {\doifnot{\figureversion}{#1}% - {\@@figureerrormessage - \endinput}} - -\newcount \figxsca -\newcount \figysca - -\newdimen \fighei -\newdimen \figwid - -\newif \iffigurefound -\newif \iflocalfigures -\newif \ifglobalfigures - -\def\doreadlocalfigurefile% - {\iflocalfigures - \pushendofline - \readlocfile{\@@exfile}{}{}% - \popendofline - \fi} - -\def\doreadglobalfigurefile% - {\ifglobalfigures - \doifsomething{\@@exgebied} - {\pushendofline - \readfixfile{\@@exgebied}{\@@exfile}{}{}% - \popendofline}% - \fi} - -\def\complexgebruikexternefiguren[#1]% - {\getparameters[\??ex][#1]% - \ExpandFirstAfter\processallactionsinset - [\@@exlokatie] - [ \v!geen=>, - \v!globaal=>\globalfigurestrue, - \v!lokaal=>\localfigurestrue, - \s!default=>\globalfigurestrue - \localfigurestrue]% - \doifnothing{\@@exfile} - {\globalfiguresfalse - \localfiguresfalse}} - -\def\gebruikexternefiguren% - {\complexorsimpleempty{gebruikexternefiguren}} - -\def\stelexternefigurenin% - {\dodoubleargument\getparameters[\??ex]} - -\presetlocalframed[\??ef] - -\def\docalculatenorm#1#2#3#4#5% - {\processaction - [#2] - [ \v!max=>#1=#4\relax, - \v!passend=>#1=#5\relax, - \v!ruim=>#1=#5\relax - \advance #1 by -4\@@exkorps\relax, - \s!default=>\doifsomething{#3}{#1=#3\relax}, - \s!unknown=>#1=\@@exkorps\relax - \divide#1 by \!!ten\relax - \multiply#1 by #2\relax]} - -\def\docalculatescales#1#2#3#4% - {\dimen0=#1\relax % #1 = new 1-value - \dimen2=#2\relax % #2 = old 1-value - \divide\dimen2 by \!!thousand\relax - \divide\dimen0 by \dimen2\relax - \figxsca=\dimen0\relax % x scale - \figysca=\dimen0\relax % y scale - \dimen2=#4\relax % #4 = old 2-value - \divide\dimen2 by \!!thousand\relax - \multiply\dimen2 by \dimen0\relax - #3=\dimen2\relax} % #3 = new 2-value - -\def\docalculatescale#1#2#3% - {\dimen0=#1\relax % #1 = new value - \dimen2=#2\relax % #2 = old value - \divide\dimen2 by \!!thousand\relax - \divide\dimen0 by \dimen2\relax - #3=\dimen0\relax} % #3 = schaal - -\def\doapplyscale#1#2#3% - {#1=#2\relax - #3=\@@efschaal\relax - \divide#1 by \!!thousand\relax - \multiply#1 by #3\relax} - -\def\dosetefsize% - {\ifinner - \teksthoogte=\vsize - \dimen0=\teksthoogte - \else - \ifdim\pagegoal<\maxdimen - \ifdim\pagetotal<\pagegoal - \dimen0=\pagegoal - \advance\dimen0 by -\pagetotal - \else - \dimen0=\teksthoogte - \fi - \else - \dimen0=\teksthoogte - \fi - \fi - \doifelsenothing{\@@efhoogte} - {\edef\@@efvsize{\the\dimen0}} - {\let\@@efvsize=\@@efhoogte}% - \doifelsenothing{\@@efbreedte} - {\edef\@@efhsize{\the\hsize}} - {\let\@@efhsize=\@@efbreedte}} - -\def\set@@effullname% - {\ifx\@@efextension\empty - \edef\@@effullname{\@@effilename.\@@eftype}% - \else - \edef\@@effullname{\@@effilename.\@@efextension}% - \fi} - -\def\berekenexternfiguur[#1][#2]% - {\mindermeldingen - \restorecatcodes % recently added; we presume local use - \beforesplitstring#2\at.\to\@@effilename - \aftersplitstring #2\at.\to\@@efextension - \getparameters - [\??ep] - [\c!e=\s!unknown, - \c!w=15\korpsgrootte, - \c!h=10\korpsgrootte, - \c!x=\!!zeropoint, - \c!y=\!!zeropoint, - \c!t=, - \c!s=, - \c!a=, - \c!f=\@@effilename]% - \getparameters - [\??ef] - [\c!type=\s!unknown, - \c!methode=\@@eftype, - \c!preset=\v!ja, - \c!preview=\v!nee, - \c!schaal=\!!thousand, - \c!factor=, - \c!hfactor=, - \c!bfactor=, - \c!breedte=, - \c!hoogte=, - \c!achtergrond=, - \c!achtergrondkleur=, - \c!achtergrondraster=\@@rsraster, - \c!hoek=, - \c!straal=.5\korpsgrootte, - \c!kader=\v!uit]% - \getvalue{\??ef#1}% - \set@@effullname - \doifelse{\@@efpreset}{\v!nee} % iets anders - {\figurefoundtrue - \set@@effullname} - {\doifelse{#1}{\s!figurepreset} - {\figurefoundtrue - \let\@@eftype=\@@epe - \set@@effullname} - {\figurefoundfalse - \def\presetfigure[##1][##2]% - {\iffigurefound - \endinput - \else - \DOIF{#2}{##1} - {\getparameters[\??ep][##2]% - \doifelse{\@@eftype}{\s!unknown} - {\let\@@eftype=\@@epe - \figurefoundtrue} - {\doif{\@@epe}{\@@eftype} - {\figurefoundtrue}}}% - \fi}% - \doreadlocalfigurefile - \iffigurefound - \set@@effullname - \showmessage{\m!figures}{1}{\@@effullname}% - \else - \doreadglobalfigurefile - \iffigurefound - \set@@effullname - \showmessage{\m!figures}{2}{\@@effullname}% - \else - \doif{\@@eftype}{\s!unknown} - {\let\@@eftype=\c!eps}% - \set@@effullname - \executeifdefined{dogetfiguresize\@@eftype}\gobblefivearguments - {\@@effullname}{\!!widtha}{\!!heighta}{\!!widthb}{\!!heightb}% - \ifdim\!!widthb>\!!zeropoint\relax - \figurefoundtrue - \geteparameters % e ! - [\??ep] - [\c!x=\the\!!widtha,\c!y=\the\!!heighta, - \c!w=\the\!!widthb,\c!h=\the\!!heightb]% - \fi - \iffigurefound - \showmessage{\m!figures}{3}{\@@effullname}% - \else - \showmessage{\m!figures}{4}{\@@effullname}% - \def\@@efkader{\v!aan}% - \fi - \fi - \fi}}% - \let\@@epe=\@@eftype - \doif{\@@exoptie}{\v!kader} - {\doassign[\??ef][\c!kader=\v!aan]}% - \figwid=\!!zeropoint - \fighei=\!!zeropoint - \doifinsetelse{\@@effactor}{\v!max,\v!passend,\v!ruim} - {\dosetefsize - \ifdim\@@epw>\@@eph\relax - \docalculatenorm\figwid\@@effactor\@@efbreedte\hsize\@@efhsize - \docalculatescales\figwid\@@epw\fighei\@@eph - \else - \docalculatenorm\fighei\@@effactor\@@efhoogte\teksthoogte\@@efvsize - \docalculatescales\fighei\@@eph\figwid\@@epw - \fi - \!!doneatrue} - {\doifinsetelse{\@@efhfactor}{\v!max,\v!passend,\v!ruim} - {\dosetefsize - \docalculatenorm\fighei\@@efhfactor\@@efhoogte\teksthoogte\@@efvsize - \docalculatescales\fighei\@@eph\figwid\@@epw - \!!doneatrue} - {\doifinsetelse{\@@efbfactor}{\v!max,\v!passend,\v!ruim} - {\dosetefsize - \docalculatenorm\figwid\@@efbfactor\@@efbreedte\hsize\@@efhsize - \docalculatescales\figwid\@@epw\fighei\@@eph - \!!doneatrue} - {\docalculatenorm\fighei\@@effactor\@@efhoogte\teksthoogte\@@efvsize - \docalculatenorm\fighei\@@efhfactor\@@efhoogte\teksthoogte\@@efvsize - \docalculatenorm\figwid\@@efbfactor\@@efbreedte\hsize\hsize - \!!doneafalse}}}% - \if!!donea - \ifdim\figwid>\@@efhsize\relax - \fighei=\!!zeropoint\relax - \figwid=\@@efhsize\relax - \else\ifdim\fighei>\@@efvsize\relax - \fighei=\@@efvsize\relax - \figwid=\!!zeropoint\relax - \fi\fi - \fi - \ifdim\figwid>\!!zeropoint\relax - \ifdim\fighei>\!!zeropoint\relax - \docalculatescale\fighei\@@eph\figysca - \docalculatescale\figwid\@@epw\figxsca - \else - \docalculatescales\figwid\@@epw\fighei\@@eph - \fi - \else - \ifdim\fighei>\!!zeropoint\relax - \docalculatescales\fighei\@@eph\figwid\@@epw - \else - \doapplyscale\figwid\@@epw\figxsca - \doapplyscale\fighei\@@eph\figysca - \fi - \fi - \doif{\@@exoptie}{\v!leeg} - {\getparameters - [\??ef] - [\c!kader=\v!aan, - \c!file=\v!leeg]}} - -\def\convertinsertscale#1#2#3#4% - {\dimen0=#1\relax - %\advance\dimen0 by .0005pt\relax - \divide\dimen0 by \!!thousand - \multiply\dimen0 by #3\relax - \dimen0=-\dimen0 % beter hier - dan in driver - \edef#2{\number\dimen0}% - \dimen0=#3pt\divide\dimen0 by \!!ten\relax - \edef#4{\@EA\withoutpt\@EA{\the\dimen0}}} - -\def\doplaatsexternfiguur[#1][#2]% - {\gebruikexternefiguren - \berekenexternfiguur[#1][#2]% - \iffigurefound - \localframed - [\??ef] - [\c!breedte=\figwid, - \c!hoogte=\fighei, - \c!offset=\v!overlay] - {\vfilll - \convertinsertscale\@@epx\figx\figxsca\scax - \convertinsertscale\@@epy\figy\figysca\scay - \doifelse{\@@efpreview}{\v!ja} - {\def\@@efpreview{1}} - {\def\@@efpreview{0}}% - \doif{\@@efmethode}{mps} - {\convertMPcolors{\@@effullname}}% - \doinsertfile - {\@@eftype,\@@efmethode}{\@@effullname} - {\scax}{\scay} - {\figx}{\figy} - {\number\figwid}{\number\fighei} - {\@@efpreview}}% - \else - \localframed - [\??ef] - [\c!breedte=\figwid, - \c!hoogte=\fighei, - \c!kader=\v!aan] - {\tttf #1 / #2}% - \fi} - -\def\dopresetfigure[#1][#2]% - {\getparameters[\??ef][#1]% - \getparameters[\??ep][#2]} - -\def\doprecopfigure[#1][#2]% - {\getvalue{\??ef#1}% - \getparameters[\??ep][#2]} - -\def\dosetgebruikexternfiguur[#1][#2][#3][#4]% - {\doifsomething{#3} - {\doifinstringelse{=}{#3} - {\setvalue{\??ef#1}{\dopresetfigure[#3][#4]}} - {\setvalue{\??ef#1}{\doprecopfigure[#3][#4]}}}% - \setvalue{#1}{\doplaatsexternfiguur[#1][#2]}} - -\def\dogebruikexternfiguur[#1][#2][#3][#4]% - {\doifelsenothing{#1} - {\doifsomething{#2} - {\dosetgebruikexternfiguur[#2][#2][#3][#4]}} - {\doifelsenothing{#2} - {\dosetgebruikexternfiguur[#1][#1][#3][#4]} - {\dosetgebruikexternfiguur[#1][#2][#3][#4]}}} - -\def\gebruikexternfiguur% - {\doquadrupleempty\dogebruikexternfiguur} - -\def\doexternalfigure[#1][#2]% - {\bgroup - \gebruikexternfiguur[#1][#1][#2]% - \getvalue{#1}% - \egroup} - -\unexpanded\def\externalfigure% - {\dodoubleempty\doexternalfigure} - -\def\toonexternefiguren% - {\bgroup - \mindermeldingen - \def\presetfigure[##1][##2]% - {\gebruikexternfiguur - [\s!figurepreset][##1] - [\c!kader=\v!aan,\c!breedte=6cm][##2]% - \startfiguurtekst[\v!links][] - {\v!geen} - {\hbox - {\getvalue{\s!figurepreset}% - \tfskip - \framed[\c!breedte=\figwid,\c!hoogte=\fighei]{}}}% - {\tfa ##1}% - \blanko - \tfx - \def\docommando####1% - {\beforesplitstring####1\at=\to\asciia - \aftersplitstring####1\at=\to\asciib - \doifsomething{\asciib} - {\hsmash{\hbox to .75em{\asciia\hss}: \asciib}% - \endgraf}}% - \processcommalist[##2]\docommando - \strut - \endgraf - \stopfiguurtekst}% - \localfigurestrue - \doreadlocalfigurefile - \egroup} - -%I n=Formules+ -%I c=\startlegenda,\startgegeven -%I -%I Ten behoeve van een consistente toelichting op een -%I formule zijn er de volgende commando's: -%I -%I \startlegenda -%I \leg symbool \\ betekenis \\ dimensie \\ -%I \leg symbool \\ betekenis \\ dimensie \\ -%I \stoplegenda -%I -%I \startgegeven -%I \geg betekenis \\ symbool \\ waarde \\ -%I \geg betekenis \\ symbool \\ waarde \\ -%I \stopgegeven -%I -%I Ten behoeve van het zetten van ub- en superscripts zijn -%I er, naast \hbox, de commando's \xbox en \xxbox. -%P -%I Het onderstaande mag ook: -%I -%I \startlegenda[twee] -%I \leg symbool \\ symbool \\ betekenis \\ dimensie \\ -%I \leg symbool \\ symbool \\ betekenis \\ dimensie \\ -%I \stoplegenda - -\newif\ifdoublelegends - -\def\legendaspacing% - {\hskip.5em} - -\def\dostartlegenda[#1]% - {\witruimte - \blanko - \bgroup - \doifelse{#1}{\v!twee} - {\doublelegendstrue - \let\leg=\doubleleg} - {\doublelegendsfalse - \let\leg=\singleleg}% - \tabskip=\!!zeropoint - \halign - \bgroup - \hskip\leftskip - $##$\hfil - &\hfil\legendaspacing##\legendaspacing\hfil - &\ifdoublelegends$##$\hfil\fi - &\ifdoublelegends\hfil\legendaspacing##\legendaspacing\hfil\fi - &##\unskip\hfil\legendaspacing\legendaspacing - &$\rm##$\hfill\cr} - -\def\singleleg#1\\#2\\#3\\% - {#1&\doifsomething{#1}{=}& - && - #2\unskip& - #3\cr} - -\def\doubleleg#1\\#2\\#3\\#4\\% - {#1&\doifsomething{#1}{\doifnot{#1}{ }{=}}& - #2&\doifsomething{#2}{\doifnot{#2}{ }{=}}& - #3\unskip& - #4\cr} - -\def\startlegenda% - {\dosingleempty\dostartlegenda} - -\def\stoplegenda% - {\egroup - \egroup - \blanko} - -% tzt: \crlf == \\ \\ \leg \\ afh kolom - -\def\startgegeven% - {\witruimte - \blanko - \bgroup - \tabskip=\!!zeropoint - \halign - \bgroup - \hskip\leftskip##\unskip\hfil - &\legendaspacing\legendaspacing\hfil$##$&\hfil\legendaspacing##\legendaspacing\hfil& - $\rm##$\hfil\cr} - -\def\stopgegeven% - {\egroup - \egroup - \blanko} - -\def\geg#1\\#2\\#3\\% - {#1& - #2&=& - #3\cr} - -\unexpanded\def\xbox% - {\bgroup\aftergroup\egroup\hbox\bgroup\tx\let\next=} - -\unexpanded\def\xxbox% - {\bgroup\aftergroup\egroup\hbox\bgroup\txx\let\next=} - -% \def\mrm#1% -% {$\rm#1$} - -%I n=Combinaties -%I c=\startcombinatie,\stelcombinatiesin -%I -%I Er kunnen meerdere tabellen, figuren enz. worden -%I gecombineerd. Dit gebeurt met het commando: -%I -%I \startcombinatie[n*m] -%I {inhoud 1}{ondertitel 1} -%I {inhoud 2}{ondertitel 2} -%I ..... -%I \stopcombinatie -%I -%I Eventueel kan volstaan worden met [n]. Vier inhouden -%I kunnen bijvoorbeeld worden gecombineerd als: -%I -%I [4*1] of [4] vier inhouden naast elkaar -%I [1*4] vier inhouden onder elkaar -%I [2*2] inhouden twee aan twee onder elkaar -%P -%I Dit commando is goed te combineren met \plaats-commando's: -%I -%I \plaatsfiguur[][]{} -%I \startcombinatie[2] -%I {\legefiguur}{a} -%I {\legefiguur}{b} -%I \stopcombinatie -%I -%I Rond \start-\stopcombineer hoeven geen {} te worden -%I geplaatst. -%I -%I De afstanden tussen de inhouden en de titels kunnen worden -%I ingesteld met: -%I -%I \stelcombinatiesin[voor=,na=,tussen=,afstand=, -%I uitlijnen=,hoogte=,breedte=] -%I -%I Waarbij de afstand betrekking heeft op de horizontale -%I afstand (een maat dus) en voor, na en tussen commando's -%I zijn (bijvoorbeeld \blanko). - -%T n=combinaties -%T m=com -%T a=c -%T -%T \startcombinatie -%T {?} {} -%T {} {} -%T \stopcombinatie - -\newcount\horcombinatie % counter -\newcount\totcombinatie - -\def\stelcombinatiesin% - {\dodoubleargument\getparameters[\??co]} - -% \long\def\dodostartcombinatie[#1*#2*#3]% -% {\stelfractiesin -% [\c!n=\v!passend, -% \c!afstand=\@@coafstand]% -% \global\horcombinatie=#1\relax -% \global\totcombinatie=#2\relax -% \multiply\totcombinatie by \horcombinatie -% \long\def\docombinatie##1##2##3% % ##3 gobbles spaces. -% {\vbox -% {\setbox0=\vbox -% {\hbox{##1}}% -% \doifemptyelse{##2} % Dit moet per se -% {\setbox2=\box\voidb@x} % \doifempty zijn! -% {\setbox2=\vtop -% {\hsize\wd0 -% \forgetall -% \steluitlijnenin[\@@couitlijnen]% % \raggedcenter -% \begstrut##2\endstrut}}% -% \vbox -% {\forgetall % \stelwitruimtein[\v!geen]% -% \box0\relax -% \ifvoid2\relax -% \else -% \@@cotussen -% \nointerlineskip % recently added -% \box2\relax -% \fi}}% -% \ifnum\totcombinatie>1\relax -% \global\advance\totcombinatie by -1\relax -% \global\advance\horcombinatie by -1\relax -% \ifnum\horcombinatie=0\relax -% \def\next% -% {\cr -% \noalign -% {\forgetall %\stelwitruimtein[\v!geen]% -% \nointerlineskip -% \@@cona -% \@@covoor -% \vss -% \nointerlineskip}% -% \global\horcombinatie=#1\relax -% \docombinatie{##3}}% -% \else -% \def\next% -% {&&&\hskip\@@coafstand -% &\docombinatie{##3}}% -% \fi -% \else -% \def\next% -% {\cr -% \egroup -% ##3}% -% \fi -% \next}% -% \tabskip=\!!zeropoint -% \doifelse{\@@cobreedte}{\v!passend} -% {\halign} -% {\halign to \@@cobreedte}% -% \bgroup&\hfil##\hfil&\tabskip\!!zeropoint \!!plus 1fill##\cr -% \docombinatie} - -\long\def\dodostartcombinatie[#1*#2*#3]% - {\stelfractiesin - [\c!n=\v!passend, - \c!afstand=\@@coafstand]% - \global\horcombinatie=#1\relax - \global\totcombinatie=#2\relax - \xdef\maxhorcombinatie{\the\horcombinatie}% - \multiply\totcombinatie by \horcombinatie - \tabskip=\!!zeropoint - \doifelse{\@@cobreedte}{\v!passend} - {\halign} - {\halign to \@@cobreedte}% - \bgroup&\hfil##\hfil&\tabskip\!!zeropoint \!!plus 1fill##\cr - \docombinatie} - -\def\docombinatie% - {\dowithnextbox - {\setbox0=\box\nextbox - \dowithnextbox - {\setbox2=\box\nextbox - \dodocombinatie} - \hbox} - \hbox} - -\def\dodocombinatie% - {\vbox - {\forgetall % \stelwitruimtein[\v!geen]% - \vbox - {\copy0}% - \ifdim\ht2>\!!zeropoint\relax % beter dan \wd2, nu \strut mogelijk - \@@cotussen - \vtop - {\nointerlineskip % recently added - \hsize\wd0 - \steluitlijnenin[\@@couitlijnen]% % \raggedcenter - \begstrut\unhbox2\endstrut}% - \fi}% - \ifnum\totcombinatie>1 - \global\advance\totcombinatie by -1 - \global\advance\horcombinatie by -1 - \ifnum\horcombinatie=0 - \def\next% - {\cr\noalign - {\forgetall %\stelwitruimtein[\v!geen]% - \nointerlineskip - \@@cona - \@@covoor - \vss - \nointerlineskip}% - \global\horcombinatie=\maxhorcombinatie\relax - \docombinatie}% - \else - \def\next% - {&&&\hskip\@@coafstand&\docombinatie}% - \fi - \else - \def\next% - {\cr\egroup}% - \fi - \next} - -\def\complexdostartcombinatie[#1]% - {\dodostartcombinatie[#1*1*]} - -\def\simpledostartcombinatie% - {\complexdostartcombinatie[2]} - -\def\startcombinatie% - {\bgroup - \forgetall - \doifelse{\@@cohoogte}{\v!passend} - {\vbox} - {\vbox to \@@cohoogte}% - \bgroup - \complexorsimple{dostartcombinatie}} - -\def\stopcombinatie% - {\egroup - \egroup} - -\def\plaatsonderelkaar% - {\bgroup - \dowithnextbox - {\setbox0=\box\nextbox - \dowithnextbox - {\mindermeldingen - \halign{\hss########\hss\cr\box0\cr\box\nextbox\cr}% - \egroup} - \hbox} - \hbox} - -\def\plaatsnaastelkaar% - {\bgroup - \dowithnextbox - {\dowithnextbox - {\valign{\vss########\vss\cr\box0\cr\box\nextbox\cr}% - \egroup} - \vbox} - \vbox} - -%I n=Overlay -%I c=\startoverlay -%I -%I De onderstaande commando's zijn beschikbaar, maar nog in -%I ontwikkeling. -%I -%I \startoverlay -%I {} {} {} -%I \stopoverlay - -\def\startoverlay% - {\hbox\bgroup\futurelet\next\dogetoverlay} - -\def\stopoverlay% - {\unskip\egroup} - -\def\dogetoverlay% - {\ifx\next\bgroup - \expandafter\dodogetoverlay - \fi} - -\def\dodogetoverlay% - {\dowithnextbox{\unskip\copy\nextbox\hskip-\wd\nextbox}\hbox} - -%I n=Files -%I c=\definieerfile -%I -%I De onderstaande commando's zijn beschikbaar, maar nog in -%I ontwikkeling. -%I -%I \gebruikexternefile [groep] [naam] [file] [instellingen] -%I -%I \gebruikexternefiles [groep] [korps=,file=] -%I \stelexternefilesin [groep] [korps=,file=] -%I -%I \naam{naam} of \naam -%I -%I Standaard zijn gedefinieerd: -%I -%I \gebruikexternefiles[pictex][korps=klein,file=pictex] -%I \gebruikexternefiles[table][file=table] - -\def\dogebruikexternefiles[#1][#2]% - {\getparameters - [\??fi#1] - [\c!file=, - \c!korps=, - \c!optie=, - #2]} - -\def\gebruikexternefiles% - {\dodoubleargument\dogebruikexternefiles} - -\def\dostelexternefilesin[#1][#2]% - {\doifundefinedelse{\??fi#1\c!file} - {\gebruikexternefiles[#1][#2]} - {\getparameters[\??fi#1][#2]}} - -\def\stelexternefilesin% - {\dodoubleargument\dostelexternefilesin} - -\def\verwerkexternefile#1#2#3% - {\bgroup - \getparameters[\??fi#1][\c!file=,#3]% - \doinputonce{\getvalue{\??fi#1\c!file}}% - \ExpandFirstAfter\switchtobodyfont[\getvalue{\??fi#1\c!korps}]% - \readsysfile{#2} % beter: loc of fix gebied - {} - {\showmessage{\m!systems}{41}{#2,#1}}% - \egroup} - -\def\dogebruikexternefile[#1][#2][#3][#4]% - {\stelexternefilesin[#1][]% - \doinputonce{\getvalue{\??fi#1\c!file}}% - \doifelsenothing{#2} - {\setvalue{#3}{\verwerkexternefile{#1}{#3}{#4}}} - {\setvalue{#2}{\verwerkexternefile{#1}{#3}{#4}}}} - -\def\gebruikexternefile% - {\doquadrupleargument\dogebruikexternefile} - -%I n=Roteren -%I c=\roteer -%I -%I Er is een rotatiecommando beschikbaar: -%I -%I \roteer[rotatie=]{} -%I -%I Waarbij als rotatie 0, 90, 180 of 270 kan worden opgegeven. -%I Als extra instellingen kunnen de instellingen van -%I \omlijnd worden meegegeven. Er wordt gebruik gemaakt van -%I het \special commando en het rotatiemechanisme van -%I PostScript. Dit betekent dat in de previewer de tekst -%I niet (!) geroteerd wordt. Overigens draagt TeX zorg voor -%I de exacte plaatsing, uitlijnen enz. De afhankelijkheid -%I van PostScript is dus tot een minimum beperkt. -%I -%I Verder zijn dezelfde instellingen mogelijk als bij -%I \omlijnd. - -\presetlocalframed[\??ro] - -\def\stelroterenin% - {\dodoubleargument\getparameters[\??ro]} - -% \ht, \vfillvoor, \vfillna, \wd, \hfillvoor, \hfillna - -\def\dodostoproteer#1#2#3#4#5#6% - {\vbox to #1\nextbox - {#2\relax - \hbox to #4\nextbox - {#5\relax - \doifelsenothing{\@@rorotatie} - {\dostartrotation{90}} - {\dostartrotation{\@@rorotatie}}% - \wd\nextbox=\!!zeropoint - \ht\nextbox=\!!zeropoint - \box\nextbox - \dostoprotation - #6} - #3}% - \egroup} - -\def\dostoproteer% - {\!!counta=\@@rorotatie - \divide\!!counta by 90 - \ifcase\!!counta - \dodostoproteer\ht\relax\vfill\wd\relax\hfill - \or - \dodostoproteer\wd\vfill\relax\ht\relax\hfill - \or - \dodostoproteer\ht\vfill\relax\wd\hfill\relax - \or - \dodostoproteer\wd\relax\vfill\ht\hfill\relax - \else - \dodostoproteer\ht\relax\vfill\wd\relax\hfill - \fi} - -\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop - {\bgroup - \hbox\bgroup % compatibility hack - \dowithnextbox - {\edef\@@rorotatie{#1}% - \setbox\nextbox=\vbox{\box\nextbox}% - \dostoproteer - \egroup}} - -\def\complexroteer[#1]% - {\dowithnextbox - {\getparameters[\??ro][#1]% - \dostoproteer}% - \vbox\localframed[\??ro][#1]} - -\def\roteer% - {\bgroup % \roteer kan argument zijn - \complexorsimpleempty{roteer}} - -% schaal - -\def\doschaal[#1]% - {\bgroup - \getparameters[\??xy][\c!sx=1,\c!sy=1,#1]% - \dowithnextbox - {\setbox\nextbox=\vbox - {\dostartscaling\@@xysx\@@xysy\box\nextbox\dostopscaling}% - \wd\nextbox=\@@xysx\wd\nextbox - \ht\nextbox=\@@xysy\ht\nextbox - \dp\nextbox=\@@xysy\dp\nextbox - \box\nextbox - \egroup} - \vbox} - -\def\schaal% - {\dosingleempty\doschaal} - -% mirror - -\def\domirrorbox% \hbox/\vbox/\vtop - {\bgroup - \dowithnextbox - {\dimen0=\wd\nextbox - \setbox\nextbox=\vbox - {\dostartmirroring\hskip-\wd\nextbox\box\nextbox\dostopmirroring}% - \wd\nextbox=\dimen0 - \box\nextbox - \egroup}} - -\def\spiegel% - {\domirrorbox\vbox} - -%\setbox0=\hbox{gans} -% -%\ruledhbox{\copy0 \schaal[sx=2,sy=2]{\copy0}} -% -%\spiegel{\ruledhbox{\copy0 \schaal{\box0}}} - -% verdelen \hsize in fracties -% -% \fractie[n/m,elementen,afstand] -% -% \fractie[2/5,3,1em] -% \fractie[2/5,3,1em] -% \fractie[1/5,3,1em] -% -% \stelfractiesin[afstand=,aantal=] (passend,passend) - -\def\??fr{@@fr} - -\def\stelfractiesin% - {\dodoubleargument\getparameters[\??fr]} - -\def\dodofractie[#1/#2,#3,#4,#5]% - {\doifelsenothing{#3} - {\doifelse{\@@frn}{\v!passend} - {\!!counta=#2\relax} - {\!!counta=\@@frn\relax}} - {\!!counta=#3\relax}% - \doifelsenothing{#4} - {\doifelse{\@@frafstand}{\v!passend} - {\!!widtha=\!!zeropoint} - {\!!widtha=\@@frafstand}} - {\!!widtha=#4}% - \advance\!!counta by -1\relax - \multiply\!!widtha by \!!counta - \advance\hsize by -\!!widtha - \divide\hsize by #2\relax - \hsize=#1\hsize} - -\def\dofractie[#1]% - {\dodofractie[#1,,,,,,]} - -\def\fractie% - {\dosingleargument\dofractie} - -\stelfractiesin - [\c!afstand=\tfskipsize, - \c!n=\v!passend] - -% Standaardinstellingen - -\stelexternefigurenin - [\c!optie=, - \c!korps=\korpsgrootte, - \c!gebied=, - \c!file=\f!utilityfilename.\f!figureextension, - \c!straal=.5\korpsgrootte, - \c!hoek=\v!recht, - \c!lokatie=] - -\stelroterenin - [\c!rotatie=90, - \c!breedte=\v!passend, - \c!hoogte=\v!passend, - \c!offset=\v!overlay, - \c!kader=\v!uit] - -\stelcombinatiesin - [\c!breedte=\v!passend, - \c!hoogte=\v!passend, - \c!afstand=1em, - \c!voor=\blanko, - \c!tussen={\blanko[\v!middel]}, - \c!na=, - \c!uitlijnen=\v!midden] - -\gebruikexternefiles - [pictex] - [\c!korps=\v!klein, - \c!file=pictex] - -\gebruikexternefiles - [table] - [\c!file=table] - -\protect - -\endinput +%D \module
+%D [ file=core-01c,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=1C (to be split),
+%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 Core Macros (c)}
+
+\unprotect
+
+\startmessages dutch library: figures
+ title: figuren
+ 1: maten van -- geladen uit locale figuurfile
+ 2: maten van -- geladen uit globale figuurfile
+ 3: maten van -- geladen uit figuurfile zelf
+ 4: figuur -- is niet te vinden
+ 5: er moet een nieuwe figuurfile worden aangemaakt
+\stopmessages
+
+\startmessages english library: figures
+ title: figures
+ 1: dimensions of -- loaded from local figurefile
+ 2: dimensions of -- loaded from global figurefile
+ 3: dimensions of -- loaded from figurefile itself
+ 4: figure -- can not be found
+ 5: you have to regenerate a new figure file
+\stopmessages
+
+\startmessages german library: figures
+ title: figures
+ 1: Dimensionen von -- geladen von lokaler Abbildungsdatei
+ 2: Dimensionen von -- geladen von globaler Abbildungsdatei
+ 3: Dimensionen von -- geladen von Abbildungsdatei selbst
+ 4: Abbildung -- kann nicht gefunden werden
+ 5: Sie haben eine neu Abbildungsdatei erstellt
+\stopmessages
+
+\startmessages dutch library: systems
+ 41: externe file -- in groep -- bestaat niet
+\stopmessages
+
+\startmessages english library: systems
+ 41: external file -- in group -- does not exist
+\stopmessages
+
+\startmessages german library: systems
+ 41: Externe Datei -- in Gruppe -- existiert nicht
+\stopmessages
+
+% Een verdere 'besparing' kan worden gerealiseerd als de
+% variabelen (ef#1...) lokaal blijven als een figuur wordt
+% geladen. Ook kunnen in texutil.tuf \c!variabelen worden
+% gebruikt.
+
+%I n=Figuren+
+%I c=\gebruikexternfiguur,\gebruikexternefiguren,\externfiguur
+%I c=\figuurintekst
+%I
+%I Extern aangemaakte (postscript)-figuren kunnen in
+%I de tekst worden opgenomen. De afmetingen van deze
+%I figuren kunnen op verschillende manieren worden
+%I ingesteld:
+%I
+%I \gebruikexternfiguur[naam][file][schaal=,kader=]
+%I
+%I \gebruikexternfiguur[naam][file][hfactor=,kader=]
+%I \gebruikexternfiguur[naam][file][bfactor=,kader=]
+%I
+%I \gebruikexternfiguur[naam][file][hoogte=,kader=]
+%I \gebruikexternfiguur[naam][file][breedte=,kader=]
+%I
+%I \gebruikexternfiguur[eerste naam][file][....]
+%I \gebruikexternfiguur[tweede naam][file][eerste naam]
+%I
+%I Externe figuren kunnen vervolgens worden opgeroepen op
+%I naam:
+%I
+%I \naam
+%P
+%I De schaal wordt opgegeven in tienden procenten. Dat
+%I betekent dat 12.5 procent wordt opgegeven als 125.
+%I
+%I In plaats van een schaal kan ook een schaalfactor worden
+%I opgegeven. Een factor 15 resulteert in een figuur met een
+%I hoogte van 1.5 maal de korpsgrootte. In plaats van een
+%I getal kan ook 'max', 'passend' of 'ruim' worden opgegeven.
+%I
+%I De breedte en hoogte worden opgegeven in de gebruikelijke
+%I TeX-maten.
+%I
+%I Als men automatisch wil laten bepalen wat de maximale
+%I hoogte of breedte is, dan kan men 'factor=max' meegeven.
+%P
+%I Externe figuren moeten worden voorgedefinieerd. Dit doet
+%I men met het commando:
+%I
+%I \presetfigure[file][type=,breedte=,hoogte=,
+%I omvang=,bron=,titel=]
+%I
+%I Met behulp van texutil kan een file 'texutil.tuf'
+%I worden aangemaakt waarin de op het werkgebied beschikbare
+%I figuren worden voorgedefinieerd. In dat geval kan het
+%I commando \presetfigure achterwege blijven.
+%I
+%I De voorinstellingen worden geladen met het commando:
+%I
+%I \gebruikexternefiguren[optie=,korps=,lokatie=]
+%I
+%I waarbij als opties kader en leeg mogelijk zijn. In
+%I het eerste geval wordt een kader om de figuren
+%I geplaatst, in het tweede geval worden alleen kenmerken
+%I van de figuur weergegeven. Lokatie kan lokaal, globaal
+%I of {lokaal,globaal} (default) zijn.
+%P
+%I Figuren kunnen op het actuele gebied staan, op een root
+%I van het actuele gebied of op een nader in te stellen gebied.
+%I Dit instellen gebeurt door aan 'gebied' een naam toe te
+%I kennen.
+%I
+%I De in de file 'system.tex' opgenomen standaardinstelling
+%I is (let op het gebruik van /):
+%I
+%I \stelexternefigurenin[gebied=c:/figuren/eps,file=]
+%P
+%I Het eerder genoemde commando \gebruikexternfiguur ziet
+%I er als volgt uit:
+%I
+%I \gebruikexternfiguur[naam][file][instellingen]
+%I
+%I De naam is facultatief en is standaard gelijk aan de
+%I filenaam. Als een (file)naam cijfers bevat, moet het
+%I commando \naam{naam} worden gebruikt.
+%I
+%I Het is mogelijk in \plaatsfiguur direkt een externe
+%I figuur op te roepen:
+%I
+%I \plaatsfiguur{commentaar}{\naam}
+%I
+%I Ook is het mogelijk een figuur in de tekst op te nemen
+%I met het commando:
+%I
+%I \figuurintekst{\naam}
+
+%T n=extern
+%T m=ext
+%T a=e
+%T
+%T \gebruikexternfiguur [] [?] [bfactor=]
+
+%D The following macro's are derived from Thomas Rockicky's
+%D macro's. They are rewritten to a more compact form, made a
+%D bit more robust and also handle the \type{HiResBoundingBox}
+%D or \type{ExactBoundingBox} that sometimes is present.
+%D
+%D A bounding box has the form:
+%D
+%D \starttypen
+%D %%BoundingBox: llx lly urx ury
+%D \stoptypen
+%D
+%D Before we scan the file, we have to reset special
+%D characters and set some others. The percentage symbol also
+%D needs special treatment. When a bounding box is
+%D encountered, we keep on scanning until no more directives are
+%D found, i.e. a line is found that does not start with a
+%D percentage symbol. We also abort scanning after finding a
+%D high resolution bounding box.
+%D
+%D This method also works inside verbatim mode (like when we
+%D are typesetting sources and putting eps coded logos into
+%D a heading. Temporary restoring the \CATCODES\ is done in
+%D the calling routine.
+
+\def\iffigurefileopened#1%
+ {\openjobin{\scratchread}{#1}%
+ \ifeof\scratchread
+ \doifsomething{\@@exgebied}
+ {\closein\scratchread
+ \openfixin{\scratchread}{\@@exgebied}{#1}}%
+ \fi
+ \ifeof\scratchread
+ \closein\scratchread
+ \else}
+
+\def\dogetfiguresizeeps#1#2#3#4#5%
+ {\bgroup
+ \global\chardef\epsffound=0
+ \iffigurefileopened{#1}%
+ \uncatcodespecials
+ \def\next%
+ {\read\scratchread to \epsffileline
+ \ifeof\scratchread
+ \let\next=\relax
+ \else
+ \expandafter\epsfaux\epsffileline:. \\%
+ \fi
+ \next}%
+ \next
+ \closein\scratchread
+ \fi
+ \egroup
+ \ifnum\epsffound>0
+ \dimen0=1bp\relax
+ #2=\epsfllx\dimen0
+ #4=\epsfurx\dimen0
+ \advance#4 by -\epsfllx\dimen0
+ #3=\epsflly\dimen0
+ #5=\epsfury\dimen0
+ \advance#5 by -\epsflly\dimen0
+ \else
+ #2=\!!zeropoint
+ #3=\!!zeropoint
+ #4=\!!zeropoint
+ #5=\!!zeropoint
+ \fi}
+
+\bgroup
+\catcode`\%=\@@other
+\global\let\epsfpercent=%
+\gdef\epsfboundingbox {%BoundingBox}
+\gdef\epsfhiresboundingbox{%HiResBoundingBox}
+\gdef\epsfexactboundingbox{%ExactBoundingBox}
+\egroup
+
+\long\def\epsfaux#1#2:#3\\%
+ {\ifx#1\epsfpercent
+ \def\!!stringa{#2}%
+ \ifx\!!stringa\epsfboundingbox
+ \epsfgrab #3 . . . \\%
+ \global\chardef\epsffound=1
+ \else\ifx\!!stringa\epsfhiresboundingbox
+ \epsfgrab #3 . . . \\%
+ \global\chardef\epsffound=2
+ \let\next=\relax
+ \else\ifx\!!stringa\epsfexactboundingbox
+ \epsfgrab #3 . . . \\%
+ \global\chardef\epsffound=2
+ \let\next=\relax
+ \fi\fi\fi
+ \else\ifnum\epsffound>0
+ \let\next=\relax
+ \fi\fi}
+
+\def\epsfgrab #1 #2 #3 #4 #5\\%
+ {\gdef\epsfllx{#1}%
+ \ifx\epsfllx\empty
+ \epsfgrab #2 #3 #4 #5 .\\%
+ \else
+ \gdef\epsflly{#2}%
+ \gdef\epsfurx{#3}%
+ \gdef\epsfury{#4}%
+ \fi}
+
+\edef\figureversion {1996.06.01}
+
+\def\@@figureerrormessage%
+ {\showmessage{\m!figures}{5}{}%
+ \global\let\@@figureerrormessage=\relax}
+
+\def\thisisfigureversion#1%
+ {\doifnot{\figureversion}{#1}%
+ {\@@figureerrormessage
+ \endinput}}
+
+\newcount \figxsca
+\newcount \figysca
+
+\newdimen \fighei
+\newdimen \figwid
+
+\newif \iffigurefound
+\newif \iflocalfigures
+\newif \ifglobalfigures
+
+\def\doreadlocalfigurefile%
+ {\iflocalfigures
+ \pushendofline
+ \readlocfile{\@@exfile}{}{}%
+ \popendofline
+ \fi}
+
+\def\doreadglobalfigurefile%
+ {\ifglobalfigures
+ \doifsomething{\@@exgebied}
+ {\pushendofline
+ \readfixfile{\@@exgebied}{\@@exfile}{}{}%
+ \popendofline}%
+ \fi}
+
+\def\complexgebruikexternefiguren[#1]%
+ {\getparameters[\??ex][#1]%
+ \ExpandFirstAfter\processallactionsinset
+ [\@@exlokatie]
+ [ \v!geen=>,
+ \v!globaal=>\globalfigurestrue,
+ \v!lokaal=>\localfigurestrue,
+ \s!default=>\globalfigurestrue
+ \localfigurestrue]%
+ \doifnothing{\@@exfile}
+ {\globalfiguresfalse
+ \localfiguresfalse}}
+
+\def\gebruikexternefiguren%
+ {\complexorsimpleempty{gebruikexternefiguren}}
+
+\def\stelexternefigurenin%
+ {\dodoubleargument\getparameters[\??ex]}
+
+\presetlocalframed[\??ef]
+
+\def\docalculatenorm#1#2#3#4#5%
+ {\processaction
+ [#2]
+ [ \v!max=>#1=#4\relax,
+ \v!passend=>#1=#5\relax,
+ \v!ruim=>#1=#5\relax
+ \advance #1 by -4\@@exkorps\relax,
+ \s!default=>\doifsomething{#3}{#1=#3\relax},
+ \s!unknown=>#1=\@@exkorps\relax
+ \divide#1 by \!!ten\relax
+ \multiply#1 by #2\relax]}
+
+\def\docalculatescales#1#2#3#4%
+ {\dimen0=#1\relax % #1 = new 1-value
+ \dimen2=#2\relax % #2 = old 1-value
+ \divide\dimen2 by \!!thousand\relax
+ \divide\dimen0 by \dimen2\relax
+ \figxsca=\dimen0\relax % x scale
+ \figysca=\dimen0\relax % y scale
+ \dimen2=#4\relax % #4 = old 2-value
+ \divide\dimen2 by \!!thousand\relax
+ \multiply\dimen2 by \dimen0\relax
+ #3=\dimen2\relax} % #3 = new 2-value
+
+\def\docalculatescale#1#2#3%
+ {\dimen0=#1\relax % #1 = new value
+ \dimen2=#2\relax % #2 = old value
+ \divide\dimen2 by \!!thousand\relax
+ \divide\dimen0 by \dimen2\relax
+ #3=\dimen0\relax} % #3 = schaal
+
+\def\doapplyscale#1#2#3%
+ {#1=#2\relax
+ #3=\@@efschaal\relax
+ \divide#1 by \!!thousand\relax
+ \multiply#1 by #3\relax}
+
+\def\dosetefsize%
+ {\ifinner
+ \teksthoogte=\vsize
+ \dimen0=\teksthoogte
+ \else
+ \ifdim\pagegoal<\maxdimen
+ \ifdim\pagetotal<\pagegoal
+ \dimen0=\pagegoal
+ \advance\dimen0 by -\pagetotal
+ \else
+ \dimen0=\teksthoogte
+ \fi
+ \else
+ \dimen0=\teksthoogte
+ \fi
+ \fi
+ \doifelsenothing{\@@efhoogte}
+ {\edef\@@efvsize{\the\dimen0}}
+ {\let\@@efvsize=\@@efhoogte}%
+ \doifelsenothing{\@@efbreedte}
+ {\edef\@@efhsize{\the\hsize}}
+ {\let\@@efhsize=\@@efbreedte}}
+
+\def\set@@effullname%
+ {\ifx\@@efextension\empty
+ \edef\@@effullname{\@@effilename.\@@eftype}%
+ \else
+ \edef\@@effullname{\@@effilename.\@@efextension}%
+ \fi}
+
+\def\berekenexternfiguur[#1][#2]%
+ {\mindermeldingen
+ \restorecatcodes % recently added; we presume local use
+ \beforesplitstring#2\at.\to\@@effilename
+ \aftersplitstring #2\at.\to\@@efextension
+ \getparameters
+ [\??ep]
+ [\c!e=\s!unknown,
+ \c!w=15\korpsgrootte,
+ \c!h=10\korpsgrootte,
+ \c!x=\!!zeropoint,
+ \c!y=\!!zeropoint,
+ \c!t=,
+ \c!s=,
+ \c!a=,
+ \c!f=\@@effilename]%
+ \getparameters
+ [\??ef]
+ [\c!type=\s!unknown,
+ \c!methode=\@@eftype,
+ \c!preset=\v!ja,
+ \c!preview=\v!nee,
+ \c!schaal=\!!thousand,
+ \c!factor=,
+ \c!hfactor=,
+ \c!bfactor=,
+ \c!breedte=,
+ \c!hoogte=,
+ \c!achtergrond=,
+ \c!achtergrondkleur=,
+ \c!achtergrondraster=\@@rsraster,
+ \c!hoek=,
+ \c!straal=.5\korpsgrootte,
+ \c!kader=\v!uit]%
+ \getvalue{\??ef#1}%
+ \set@@effullname
+ \doifelse{\@@efpreset}{\v!nee} % iets anders
+ {\figurefoundtrue
+ \set@@effullname}
+ {\doifelse{#1}{\s!figurepreset}
+ {\figurefoundtrue
+ \let\@@eftype=\@@epe
+ \set@@effullname}
+ {\figurefoundfalse
+ \def\presetfigure[##1][##2]%
+ {\iffigurefound
+ \endinput
+ \else
+ \DOIF{#2}{##1}
+ {\getparameters[\??ep][##2]%
+ \doifelse{\@@eftype}{\s!unknown}
+ {\let\@@eftype=\@@epe
+ \figurefoundtrue}
+ {\doif{\@@epe}{\@@eftype}
+ {\figurefoundtrue}}}%
+ \fi}%
+ \doreadlocalfigurefile
+ \iffigurefound
+ \set@@effullname
+ \showmessage{\m!figures}{1}{\@@effullname}%
+ \else
+ \doreadglobalfigurefile
+ \iffigurefound
+ \set@@effullname
+ \showmessage{\m!figures}{2}{\@@effullname}%
+ \else
+ \doif{\@@eftype}{\s!unknown}
+ {\let\@@eftype=\c!eps}%
+ \set@@effullname
+ \executeifdefined{dogetfiguresize\@@eftype}\gobblefivearguments
+ {\@@effullname}{\!!widtha}{\!!heighta}{\!!widthb}{\!!heightb}%
+ \ifdim\!!widthb>\!!zeropoint\relax
+ \figurefoundtrue
+ \geteparameters % e !
+ [\??ep]
+ [\c!x=\the\!!widtha,\c!y=\the\!!heighta,
+ \c!w=\the\!!widthb,\c!h=\the\!!heightb]%
+ \fi
+ \iffigurefound
+ \showmessage{\m!figures}{3}{\@@effullname}%
+ \else
+ \showmessage{\m!figures}{4}{\@@effullname}%
+ \def\@@efkader{\v!aan}%
+ \fi
+ \fi
+ \fi}}%
+ \let\@@epe=\@@eftype
+ \doif{\@@exoptie}{\v!kader}
+ {\doassign[\??ef][\c!kader=\v!aan]}%
+ \figwid=\!!zeropoint
+ \fighei=\!!zeropoint
+ \doifinsetelse{\@@effactor}{\v!max,\v!passend,\v!ruim}
+ {\dosetefsize
+ \ifdim\@@epw>\@@eph\relax
+ \docalculatenorm\figwid\@@effactor\@@efbreedte\hsize\@@efhsize
+ \docalculatescales\figwid\@@epw\fighei\@@eph
+ \else
+ \docalculatenorm\fighei\@@effactor\@@efhoogte\teksthoogte\@@efvsize
+ \docalculatescales\fighei\@@eph\figwid\@@epw
+ \fi
+ \!!doneatrue}
+ {\doifinsetelse{\@@efhfactor}{\v!max,\v!passend,\v!ruim}
+ {\dosetefsize
+ \docalculatenorm\fighei\@@efhfactor\@@efhoogte\teksthoogte\@@efvsize
+ \docalculatescales\fighei\@@eph\figwid\@@epw
+ \!!doneatrue}
+ {\doifinsetelse{\@@efbfactor}{\v!max,\v!passend,\v!ruim}
+ {\dosetefsize
+ \docalculatenorm\figwid\@@efbfactor\@@efbreedte\hsize\@@efhsize
+ \docalculatescales\figwid\@@epw\fighei\@@eph
+ \!!doneatrue}
+ {\docalculatenorm\fighei\@@effactor\@@efhoogte\teksthoogte\@@efvsize
+ \docalculatenorm\fighei\@@efhfactor\@@efhoogte\teksthoogte\@@efvsize
+ \docalculatenorm\figwid\@@efbfactor\@@efbreedte\hsize\hsize
+ \!!doneafalse}}}%
+ \if!!donea
+ \ifdim\figwid>\@@efhsize\relax
+ \fighei=\!!zeropoint\relax
+ \figwid=\@@efhsize\relax
+ \else\ifdim\fighei>\@@efvsize\relax
+ \fighei=\@@efvsize\relax
+ \figwid=\!!zeropoint\relax
+ \fi\fi
+ \fi
+ \ifdim\figwid>\!!zeropoint\relax
+ \ifdim\fighei>\!!zeropoint\relax
+ \docalculatescale\fighei\@@eph\figysca
+ \docalculatescale\figwid\@@epw\figxsca
+ \else
+ \docalculatescales\figwid\@@epw\fighei\@@eph
+ \fi
+ \else
+ \ifdim\fighei>\!!zeropoint\relax
+ \docalculatescales\fighei\@@eph\figwid\@@epw
+ \else
+ \doapplyscale\figwid\@@epw\figxsca
+ \doapplyscale\fighei\@@eph\figysca
+ \fi
+ \fi
+ \doif{\@@exoptie}{\v!leeg}
+ {\getparameters
+ [\??ef]
+ [\c!kader=\v!aan,
+ \c!file=\v!leeg]}}
+
+\def\convertinsertscale#1#2#3#4%
+ {\dimen0=#1\relax
+ %\advance\dimen0 by .0005pt\relax
+ \divide\dimen0 by \!!thousand
+ \multiply\dimen0 by #3\relax
+ \dimen0=-\dimen0 % beter hier - dan in driver
+ \edef#2{\number\dimen0}%
+ \dimen0=#3pt\divide\dimen0 by \!!ten\relax
+ \edef#4{\@EA\withoutpt\@EA{\the\dimen0}}}
+
+\def\doplaatsexternfiguur[#1][#2]%
+ {\gebruikexternefiguren
+ \berekenexternfiguur[#1][#2]%
+ \iffigurefound
+ \localframed
+ [\??ef]
+ [\c!breedte=\figwid,
+ \c!hoogte=\fighei,
+ \c!offset=\v!overlay]
+ {\vfilll
+ \convertinsertscale\@@epx\figx\figxsca\scax
+ \convertinsertscale\@@epy\figy\figysca\scay
+ \doifelse{\@@efpreview}{\v!ja}
+ {\def\@@efpreview{1}}
+ {\def\@@efpreview{0}}%
+ \doif{\@@efmethode}{mps}
+ {\convertMPcolors{\@@effullname}}%
+ \doinsertfile
+ {\@@eftype,\@@efmethode}{\@@effullname}
+ {\scax}{\scay}
+ {\figx}{\figy}
+ {\number\figwid}{\number\fighei}
+ {\@@efpreview}}%
+ \else
+ \localframed
+ [\??ef]
+ [\c!breedte=\figwid,
+ \c!hoogte=\fighei,
+ \c!kader=\v!aan]
+ {\tttf #1 / #2}%
+ \fi}
+
+\def\dopresetfigure[#1][#2]%
+ {\getparameters[\??ef][#1]%
+ \getparameters[\??ep][#2]}
+
+\def\doprecopfigure[#1][#2]%
+ {\getvalue{\??ef#1}%
+ \getparameters[\??ep][#2]}
+
+\def\dosetgebruikexternfiguur[#1][#2][#3][#4]%
+ {\doifsomething{#3}
+ {\doifinstringelse{=}{#3}
+ {\setvalue{\??ef#1}{\dopresetfigure[#3][#4]}}
+ {\setvalue{\??ef#1}{\doprecopfigure[#3][#4]}}}%
+ \setvalue{#1}{\doplaatsexternfiguur[#1][#2]}}
+
+\def\dogebruikexternfiguur[#1][#2][#3][#4]%
+ {\doifelsenothing{#1}
+ {\doifsomething{#2}
+ {\dosetgebruikexternfiguur[#2][#2][#3][#4]}}
+ {\doifelsenothing{#2}
+ {\dosetgebruikexternfiguur[#1][#1][#3][#4]}
+ {\dosetgebruikexternfiguur[#1][#2][#3][#4]}}}
+
+\def\gebruikexternfiguur%
+ {\doquadrupleempty\dogebruikexternfiguur}
+
+\def\doexternalfigure[#1][#2]%
+ {\bgroup
+ \gebruikexternfiguur[#1][#1][#2]%
+ \getvalue{#1}%
+ \egroup}
+
+\unexpanded\def\externalfigure%
+ {\dodoubleempty\doexternalfigure}
+
+\def\toonexternefiguren%
+ {\bgroup
+ \mindermeldingen
+ \def\presetfigure[##1][##2]%
+ {\gebruikexternfiguur
+ [\s!figurepreset][##1]
+ [\c!kader=\v!aan,\c!breedte=6cm][##2]%
+ \startfiguurtekst[\v!links][]
+ {\v!geen}
+ {\hbox
+ {\getvalue{\s!figurepreset}%
+ \tfskip
+ \framed[\c!breedte=\figwid,\c!hoogte=\fighei]{}}}%
+ {\tfa ##1}%
+ \blanko
+ \tfx
+ \def\docommando####1%
+ {\beforesplitstring####1\at=\to\asciia
+ \aftersplitstring####1\at=\to\asciib
+ \doifsomething{\asciib}
+ {\hsmash{\hbox to .75em{\asciia\hss}: \asciib}%
+ \endgraf}}%
+ \processcommalist[##2]\docommando
+ \strut
+ \endgraf
+ \stopfiguurtekst}%
+ \localfigurestrue
+ \doreadlocalfigurefile
+ \egroup}
+
+%I n=Formules+
+%I c=\startlegenda,\startgegeven
+%I
+%I Ten behoeve van een consistente toelichting op een
+%I formule zijn er de volgende commando's:
+%I
+%I \startlegenda
+%I \leg symbool \\ betekenis \\ dimensie \\
+%I \leg symbool \\ betekenis \\ dimensie \\
+%I \stoplegenda
+%I
+%I \startgegeven
+%I \geg betekenis \\ symbool \\ waarde \\
+%I \geg betekenis \\ symbool \\ waarde \\
+%I \stopgegeven
+%I
+%I Ten behoeve van het zetten van ub- en superscripts zijn
+%I er, naast \hbox, de commando's \xbox en \xxbox.
+%P
+%I Het onderstaande mag ook:
+%I
+%I \startlegenda[twee]
+%I \leg symbool \\ symbool \\ betekenis \\ dimensie \\
+%I \leg symbool \\ symbool \\ betekenis \\ dimensie \\
+%I \stoplegenda
+
+\newif\ifdoublelegends
+
+\def\legendaspacing%
+ {\hskip.5em}
+
+\def\dostartlegenda[#1]%
+ {\witruimte
+ \blanko
+ \bgroup
+ \doifelse{#1}{\v!twee}
+ {\doublelegendstrue
+ \let\leg=\doubleleg}
+ {\doublelegendsfalse
+ \let\leg=\singleleg}%
+ \tabskip=\!!zeropoint
+ \halign
+ \bgroup
+ \hskip\leftskip
+ $##$\hfil
+ &\hfil\legendaspacing##\legendaspacing\hfil
+ &\ifdoublelegends$##$\hfil\fi
+ &\ifdoublelegends\hfil\legendaspacing##\legendaspacing\hfil\fi
+ &##\unskip\hfil\legendaspacing\legendaspacing
+ &$\rm##$\hfill\cr}
+
+\def\singleleg#1\\#2\\#3\\%
+ {#1&\doifsomething{#1}{=}&
+ &&
+ #2\unskip&
+ #3\cr}
+
+\def\doubleleg#1\\#2\\#3\\#4\\%
+ {#1&\doifsomething{#1}{\doifnot{#1}{ }{=}}&
+ #2&\doifsomething{#2}{\doifnot{#2}{ }{=}}&
+ #3\unskip&
+ #4\cr}
+
+\def\startlegenda%
+ {\dosingleempty\dostartlegenda}
+
+\def\stoplegenda%
+ {\egroup
+ \egroup
+ \blanko}
+
+% tzt: \crlf == \\ \\ \leg \\ afh kolom
+
+\def\startgegeven%
+ {\witruimte
+ \blanko
+ \bgroup
+ \tabskip=\!!zeropoint
+ \halign
+ \bgroup
+ \hskip\leftskip##\unskip\hfil
+ &\legendaspacing\legendaspacing\hfil$##$&\hfil\legendaspacing##\legendaspacing\hfil&
+ $\rm##$\hfil\cr}
+
+\def\stopgegeven%
+ {\egroup
+ \egroup
+ \blanko}
+
+\def\geg#1\\#2\\#3\\%
+ {#1&
+ #2&=&
+ #3\cr}
+
+\unexpanded\def\xbox%
+ {\bgroup\aftergroup\egroup\hbox\bgroup\tx\let\next=}
+
+\unexpanded\def\xxbox%
+ {\bgroup\aftergroup\egroup\hbox\bgroup\txx\let\next=}
+
+% \def\mrm#1%
+% {$\rm#1$}
+
+%I n=Combinaties
+%I c=\startcombinatie,\stelcombinatiesin
+%I
+%I Er kunnen meerdere tabellen, figuren enz. worden
+%I gecombineerd. Dit gebeurt met het commando:
+%I
+%I \startcombinatie[n*m]
+%I {inhoud 1}{ondertitel 1}
+%I {inhoud 2}{ondertitel 2}
+%I .....
+%I \stopcombinatie
+%I
+%I Eventueel kan volstaan worden met [n]. Vier inhouden
+%I kunnen bijvoorbeeld worden gecombineerd als:
+%I
+%I [4*1] of [4] vier inhouden naast elkaar
+%I [1*4] vier inhouden onder elkaar
+%I [2*2] inhouden twee aan twee onder elkaar
+%P
+%I Dit commando is goed te combineren met \plaats-commando's:
+%I
+%I \plaatsfiguur[][]{}
+%I \startcombinatie[2]
+%I {\legefiguur}{a}
+%I {\legefiguur}{b}
+%I \stopcombinatie
+%I
+%I Rond \start-\stopcombineer hoeven geen {} te worden
+%I geplaatst.
+%I
+%I De afstanden tussen de inhouden en de titels kunnen worden
+%I ingesteld met:
+%I
+%I \stelcombinatiesin[voor=,na=,tussen=,afstand=,
+%I uitlijnen=,hoogte=,breedte=]
+%I
+%I Waarbij de afstand betrekking heeft op de horizontale
+%I afstand (een maat dus) en voor, na en tussen commando's
+%I zijn (bijvoorbeeld \blanko).
+
+%T n=combinaties
+%T m=com
+%T a=c
+%T
+%T \startcombinatie
+%T {?} {}
+%T {} {}
+%T \stopcombinatie
+
+\newcount\horcombinatie % counter
+\newcount\totcombinatie
+
+\def\stelcombinatiesin%
+ {\dodoubleargument\getparameters[\??co]}
+
+% \long\def\dodostartcombinatie[#1*#2*#3]%
+% {\stelfractiesin
+% [\c!n=\v!passend,
+% \c!afstand=\@@coafstand]%
+% \global\horcombinatie=#1\relax
+% \global\totcombinatie=#2\relax
+% \multiply\totcombinatie by \horcombinatie
+% \long\def\docombinatie##1##2##3% % ##3 gobbles spaces.
+% {\vbox
+% {\setbox0=\vbox
+% {\hbox{##1}}%
+% \doifemptyelse{##2} % Dit moet per se
+% {\setbox2=\box\voidb@x} % \doifempty zijn!
+% {\setbox2=\vtop
+% {\hsize\wd0
+% \forgetall
+% \steluitlijnenin[\@@couitlijnen]% % \raggedcenter
+% \begstrut##2\endstrut}}%
+% \vbox
+% {\forgetall % \stelwitruimtein[\v!geen]%
+% \box0\relax
+% \ifvoid2\relax
+% \else
+% \@@cotussen
+% \nointerlineskip % recently added
+% \box2\relax
+% \fi}}%
+% \ifnum\totcombinatie>1\relax
+% \global\advance\totcombinatie by -1\relax
+% \global\advance\horcombinatie by -1\relax
+% \ifnum\horcombinatie=0\relax
+% \def\next%
+% {\cr
+% \noalign
+% {\forgetall %\stelwitruimtein[\v!geen]%
+% \nointerlineskip
+% \@@cona
+% \@@covoor
+% \vss
+% \nointerlineskip}%
+% \global\horcombinatie=#1\relax
+% \docombinatie{##3}}%
+% \else
+% \def\next%
+% {&&&\hskip\@@coafstand
+% &\docombinatie{##3}}%
+% \fi
+% \else
+% \def\next%
+% {\cr
+% \egroup
+% ##3}%
+% \fi
+% \next}%
+% \tabskip=\!!zeropoint
+% \doifelse{\@@cobreedte}{\v!passend}
+% {\halign}
+% {\halign to \@@cobreedte}%
+% \bgroup&\hfil##\hfil&\tabskip\!!zeropoint \!!plus 1fill##\cr
+% \docombinatie}
+
+\long\def\dodostartcombinatie[#1*#2*#3]%
+ {\stelfractiesin
+ [\c!n=\v!passend,
+ \c!afstand=\@@coafstand]%
+ \global\horcombinatie=#1\relax
+ \global\totcombinatie=#2\relax
+ \xdef\maxhorcombinatie{\the\horcombinatie}%
+ \multiply\totcombinatie by \horcombinatie
+ \tabskip=\!!zeropoint
+ \doifelse{\@@cobreedte}{\v!passend}
+ {\halign}
+ {\halign to \@@cobreedte}%
+ \bgroup&\hfil##\hfil&\tabskip\!!zeropoint \!!plus 1fill##\cr
+ \docombinatie}
+
+\def\docombinatie%
+ {\dowithnextbox
+ {\setbox0=\box\nextbox
+ \dowithnextbox
+ {\setbox2=\box\nextbox
+ \dodocombinatie}
+ \hbox}
+ \hbox}
+
+\def\dodocombinatie%
+ {\vbox
+ {\forgetall % \stelwitruimtein[\v!geen]%
+ \vbox
+ {\copy0}%
+ \ifdim\ht2>\!!zeropoint\relax % beter dan \wd2, nu \strut mogelijk
+ \@@cotussen
+ \vtop
+ {\nointerlineskip % recently added
+ \hsize\wd0
+ \steluitlijnenin[\@@couitlijnen]% % \raggedcenter
+ \begstrut\unhbox2\endstrut}%
+ \fi}%
+ \ifnum\totcombinatie>1
+ \global\advance\totcombinatie by -1
+ \global\advance\horcombinatie by -1
+ \ifnum\horcombinatie=0
+ \def\next%
+ {\cr\noalign
+ {\forgetall %\stelwitruimtein[\v!geen]%
+ \nointerlineskip
+ \@@cona
+ \@@covoor
+ \vss
+ \nointerlineskip}%
+ \global\horcombinatie=\maxhorcombinatie\relax
+ \docombinatie}%
+ \else
+ \def\next%
+ {&&&\hskip\@@coafstand&\docombinatie}%
+ \fi
+ \else
+ \def\next%
+ {\cr\egroup}%
+ \fi
+ \next}
+
+\def\complexdostartcombinatie[#1]%
+ {\dodostartcombinatie[#1*1*]}
+
+\def\simpledostartcombinatie%
+ {\complexdostartcombinatie[2]}
+
+\def\startcombinatie%
+ {\bgroup
+ \forgetall
+ \doifelse{\@@cohoogte}{\v!passend}
+ {\vbox}
+ {\vbox to \@@cohoogte}%
+ \bgroup
+ \complexorsimple{dostartcombinatie}}
+
+\def\stopcombinatie%
+ {\egroup
+ \egroup}
+
+\def\plaatsonderelkaar%
+ {\bgroup
+ \dowithnextbox
+ {\setbox0=\box\nextbox
+ \dowithnextbox
+ {\mindermeldingen
+ \halign{\hss########\hss\cr\box0\cr\box\nextbox\cr}%
+ \egroup}
+ \hbox}
+ \hbox}
+
+\def\plaatsnaastelkaar%
+ {\bgroup
+ \dowithnextbox
+ {\dowithnextbox
+ {\valign{\vss########\vss\cr\box0\cr\box\nextbox\cr}%
+ \egroup}
+ \vbox}
+ \vbox}
+
+%I n=Overlay
+%I c=\startoverlay
+%I
+%I De onderstaande commando's zijn beschikbaar, maar nog in
+%I ontwikkeling.
+%I
+%I \startoverlay
+%I {} {} {}
+%I \stopoverlay
+
+\def\startoverlay%
+ {\hbox\bgroup\futurelet\next\dogetoverlay}
+
+\def\stopoverlay%
+ {\unskip\egroup}
+
+\def\dogetoverlay%
+ {\ifx\next\bgroup
+ \expandafter\dodogetoverlay
+ \fi}
+
+\def\dodogetoverlay%
+ {\dowithnextbox{\unskip\copy\nextbox\hskip-\wd\nextbox}\hbox}
+
+%I n=Files
+%I c=\definieerfile
+%I
+%I De onderstaande commando's zijn beschikbaar, maar nog in
+%I ontwikkeling.
+%I
+%I \gebruikexternefile [groep] [naam] [file] [instellingen]
+%I
+%I \gebruikexternefiles [groep] [korps=,file=]
+%I \stelexternefilesin [groep] [korps=,file=]
+%I
+%I \naam{naam} of \naam
+%I
+%I Standaard zijn gedefinieerd:
+%I
+%I \gebruikexternefiles[pictex][korps=klein,file=pictex]
+%I \gebruikexternefiles[table][file=table]
+
+\def\dogebruikexternefiles[#1][#2]%
+ {\getparameters
+ [\??fi#1]
+ [\c!file=,
+ \c!korps=,
+ \c!optie=,
+ #2]}
+
+\def\gebruikexternefiles%
+ {\dodoubleargument\dogebruikexternefiles}
+
+\def\dostelexternefilesin[#1][#2]%
+ {\doifundefinedelse{\??fi#1\c!file}
+ {\gebruikexternefiles[#1][#2]}
+ {\getparameters[\??fi#1][#2]}}
+
+\def\stelexternefilesin%
+ {\dodoubleargument\dostelexternefilesin}
+
+\def\verwerkexternefile#1#2#3%
+ {\bgroup
+ \getparameters[\??fi#1][\c!file=,#3]%
+ \doinputonce{\getvalue{\??fi#1\c!file}}%
+ \ExpandFirstAfter\switchtobodyfont[\getvalue{\??fi#1\c!korps}]%
+ \readsysfile{#2} % beter: loc of fix gebied
+ {}
+ {\showmessage{\m!systems}{41}{#2,#1}}%
+ \egroup}
+
+\def\dogebruikexternefile[#1][#2][#3][#4]%
+ {\stelexternefilesin[#1][]%
+ \doinputonce{\getvalue{\??fi#1\c!file}}%
+ \doifelsenothing{#2}
+ {\setvalue{#3}{\verwerkexternefile{#1}{#3}{#4}}}
+ {\setvalue{#2}{\verwerkexternefile{#1}{#3}{#4}}}}
+
+\def\gebruikexternefile%
+ {\doquadrupleargument\dogebruikexternefile}
+
+%I n=Roteren
+%I c=\roteer
+%I
+%I Er is een rotatiecommando beschikbaar:
+%I
+%I \roteer[rotatie=]{}
+%I
+%I Waarbij als rotatie 0, 90, 180 of 270 kan worden opgegeven.
+%I Als extra instellingen kunnen de instellingen van
+%I \omlijnd worden meegegeven. Er wordt gebruik gemaakt van
+%I het \special commando en het rotatiemechanisme van
+%I PostScript. Dit betekent dat in de previewer de tekst
+%I niet (!) geroteerd wordt. Overigens draagt TeX zorg voor
+%I de exacte plaatsing, uitlijnen enz. De afhankelijkheid
+%I van PostScript is dus tot een minimum beperkt.
+%I
+%I Verder zijn dezelfde instellingen mogelijk als bij
+%I \omlijnd.
+
+\presetlocalframed[\??ro]
+
+\def\stelroterenin%
+ {\dodoubleargument\getparameters[\??ro]}
+
+% \ht, \vfillvoor, \vfillna, \wd, \hfillvoor, \hfillna
+
+\def\dodostoproteer#1#2#3#4#5#6%
+ {\vbox to #1\nextbox
+ {#2\relax
+ \hbox to #4\nextbox
+ {#5\relax
+ \doifelsenothing{\@@rorotatie}
+ {\dostartrotation{90}}
+ {\dostartrotation{\@@rorotatie}}%
+ \wd\nextbox=\!!zeropoint
+ \ht\nextbox=\!!zeropoint
+ \box\nextbox
+ \dostoprotation
+ #6}
+ #3}%
+ \egroup}
+
+\def\dostoproteer%
+ {\!!counta=\@@rorotatie
+ \divide\!!counta by 90
+ \ifcase\!!counta
+ \dodostoproteer\ht\relax\vfill\wd\relax\hfill
+ \or
+ \dodostoproteer\wd\vfill\relax\ht\relax\hfill
+ \or
+ \dodostoproteer\ht\vfill\relax\wd\hfill\relax
+ \or
+ \dodostoproteer\wd\relax\vfill\ht\hfill\relax
+ \else
+ \dodostoproteer\ht\relax\vfill\wd\relax\hfill
+ \fi}
+
+\def\dorotatebox#1% {angle} \hbox/\vbox/\vtop
+ {\bgroup
+ \hbox\bgroup % compatibility hack
+ \dowithnextbox
+ {\edef\@@rorotatie{#1}%
+ \setbox\nextbox=\vbox{\box\nextbox}%
+ \dostoproteer
+ \egroup}}
+
+\def\complexroteer[#1]%
+ {\dowithnextbox
+ {\getparameters[\??ro][#1]%
+ \dostoproteer}%
+ \vbox\localframed[\??ro][#1]}
+
+\def\roteer%
+ {\bgroup % \roteer kan argument zijn
+ \complexorsimpleempty{roteer}}
+
+% schaal
+
+\def\doschaal[#1]%
+ {\bgroup
+ \getparameters[\??xy][\c!sx=1,\c!sy=1,#1]%
+ \dowithnextbox
+ {\setbox\nextbox=\vbox
+ {\dostartscaling\@@xysx\@@xysy\box\nextbox\dostopscaling}%
+ \wd\nextbox=\@@xysx\wd\nextbox
+ \ht\nextbox=\@@xysy\ht\nextbox
+ \dp\nextbox=\@@xysy\dp\nextbox
+ \box\nextbox
+ \egroup}
+ \vbox}
+
+\def\schaal%
+ {\dosingleempty\doschaal}
+
+% mirror
+
+\def\domirrorbox% \hbox/\vbox/\vtop
+ {\bgroup
+ \dowithnextbox
+ {\dimen0=\wd\nextbox
+ \setbox\nextbox=\vbox
+ {\dostartmirroring\hskip-\wd\nextbox\box\nextbox\dostopmirroring}%
+ \wd\nextbox=\dimen0
+ \box\nextbox
+ \egroup}}
+
+\def\spiegel%
+ {\domirrorbox\vbox}
+
+%\setbox0=\hbox{gans}
+%
+%\ruledhbox{\copy0 \schaal[sx=2,sy=2]{\copy0}}
+%
+%\spiegel{\ruledhbox{\copy0 \schaal{\box0}}}
+
+% verdelen \hsize in fracties
+%
+% \fractie[n/m,elementen,afstand]
+%
+% \fractie[2/5,3,1em]
+% \fractie[2/5,3,1em]
+% \fractie[1/5,3,1em]
+%
+% \stelfractiesin[afstand=,aantal=] (passend,passend)
+
+\def\??fr{@@fr}
+
+\def\stelfractiesin%
+ {\dodoubleargument\getparameters[\??fr]}
+
+\def\dodofractie[#1/#2,#3,#4,#5]%
+ {\doifelsenothing{#3}
+ {\doifelse{\@@frn}{\v!passend}
+ {\!!counta=#2\relax}
+ {\!!counta=\@@frn\relax}}
+ {\!!counta=#3\relax}%
+ \doifelsenothing{#4}
+ {\doifelse{\@@frafstand}{\v!passend}
+ {\!!widtha=\!!zeropoint}
+ {\!!widtha=\@@frafstand}}
+ {\!!widtha=#4}%
+ \advance\!!counta by -1\relax
+ \multiply\!!widtha by \!!counta
+ \advance\hsize by -\!!widtha
+ \divide\hsize by #2\relax
+ \hsize=#1\hsize}
+
+\def\dofractie[#1]%
+ {\dodofractie[#1,,,,,,]}
+
+\def\fractie%
+ {\dosingleargument\dofractie}
+
+\stelfractiesin
+ [\c!afstand=\tfskipsize,
+ \c!n=\v!passend]
+
+% Standaardinstellingen
+
+\stelexternefigurenin
+ [\c!optie=,
+ \c!korps=\korpsgrootte,
+ \c!gebied=,
+ \c!file=\f!utilityfilename.\f!figureextension,
+ \c!straal=.5\korpsgrootte,
+ \c!hoek=\v!recht,
+ \c!lokatie=]
+
+\stelroterenin
+ [\c!rotatie=90,
+ \c!breedte=\v!passend,
+ \c!hoogte=\v!passend,
+ \c!offset=\v!overlay,
+ \c!kader=\v!uit]
+
+\stelcombinatiesin
+ [\c!breedte=\v!passend,
+ \c!hoogte=\v!passend,
+ \c!afstand=1em,
+ \c!voor=\blanko,
+ \c!tussen={\blanko[\v!middel]},
+ \c!na=,
+ \c!uitlijnen=\v!midden]
+
+\gebruikexternefiles
+ [pictex]
+ [\c!korps=\v!klein,
+ \c!file=pictex]
+
+\gebruikexternefiles
+ [table]
+ [\c!file=table]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-01d.tex b/tex/context/base/core-01d.tex index 19cd09a4f..b2e05c76d 100644 --- a/tex/context/base/core-01d.tex +++ b/tex/context/base/core-01d.tex @@ -1,2329 +1,2313 @@ -%D \module -%D [ file=core-01d, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=1D (to be split), -%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 Core Macros (d)} - -\unprotect - -\startmessages dutch library: interactions - title: interactie - 1: aspect ratio -- x -- (b x h) - 2: actief - 3: niet actief - 4: geen paginasynchronisatie (--) in hmode -\stopmessages - -\startmessages english library: interactions - title: interaction - 1: aspect ratio -- x -- (b x h) - 2: active - 3: inactive - 4: no pagesynchronisation (--) in hmode -\stopmessages - -\startmessages german library: interactions - title: Interaktion - 1: Aspekt des Verhaeltnis -- x -- (B x H) - 2: aktiv - 3: inaktiv - 4: keine Seitensynchronisation (--) im hmode -\stopmessages - -\startmessages dutch library: versions - title: versie - 1: er mankeert een @+ - 2: markeren pagina's - 3: geselecteerde pagina's: -- -\stopmessages - -\startmessages english library: versions - title: version - 1: missing @+ - 2: marking pages - 3: selected pages: -- -\stopmessages - -\startmessages german library: versions - title: Version - 1: fehlendes @+ - 2: Erstelle Seiten - 3: Ausgewaehlte Seiten: -- -\stopmessages - -%I n=Interacteren -%I c=\stelinteractiein,\stelinteractiemenuin -%I c=\definieerinteractiemenu,\startinteractiemenu -%I c=\blokkeerinteractiemenu,\geefinteractiemenuvrij -%I c=\stelinteractieschermin,\scherm -%I -%I Overzichten en verwijzingen kunnen worden voorzien van -%I voor DVIWINDO en Acrobat betekenisvolle codes. De volgende -%I commando's zijn (voorlopig) beschikbaar: -%I -%I \stelinteractiein[status=,menu=,letter=,kleur=,strut=, -%I breedte=,hoogte=,diepte=,pagina=] -%I -%I Hierbij hebben 'letter' en 'kleur' betrekking op in de tekst -%I gemarkeerde woorden waar een verwijzing achter zit. Status -%I kan 'start' of 'stop' zijn en het 'menu' kan 'aan' of 'uit' -%I staan. Met 'pagina=ja' dwingen we pagina verwijzingen af. -%I -%I Zonodig kunnen een 'titel', 'subtitel', 'auteur' en 'datum' -%I worden ingesteld. -%P -%I Een menu wordt gedefinieerd met het commando: -%I -%I \definieerinteractiemenu[naam][plaats][instellingen] -%I -%I waarbij in plaats van de instellingen de naam van een -%I reeds gedefinieerd menu kan worden opgegeven. -%I -%I Mogelijke plaatsen zijn 'boven', 'onder', 'links' en -%I 'rechts'. -%P -%I De inhoud van een menu wordt gedefinieerd met: -%I -%I \definieerinteractiemenu[naam][inhoud] -%I -%I Een voorbeeld van zo'n definitie is: -%I -%I \definieerinteractiemenu -%I [links] -%I [{inhoud[inhoud]}, -%I {formules[formules]}, -%I {index[index]}] -%I -%I De accolades zijn essentieel! De verwijzingen dienen met de -%I daarvoor gebruikelijke commando's te worden aangemaakt. -%I Verwijzingen zoals [inhoud] en [index] zijn automatisch -%I beschikbaar. -%P -%I Naast [inhoud], [index] en andere voor de hand liggende -%I verwijzingen zijn beschikbaar: -%I -%I [eerstepagina] -%I [vorigepagina] -%I [volgendepagina] -%I [laatstepagina] -%P -%I Een alternatieve manier om menu's te definieren levert -%I het commando -%I -%I \startinteractiemenu -%I \stopinteractiemenu -%I -%I Hierbinnen zijn de volgende commando's mogelijk: -%I -%I \raw tekst \\ : ongeformatteerde tekst -%I \but[ref] tekst \\ : interactief menu item -%I \nop \\ : dummy menu item -%I \txt tekst \\ : niet interactief menu item (omlijnd) -%I \rul tekst \\ : niet interactief menu item -%I \com commandos \\ : commando's -%P -%I Instellingen kunnen ook apart plaatsvinden met: -%I -%I \stelinteractiemenuin[naam][voor=,na=,tussen=,breedte=, -%I kader=,letter=,status=,achtergrond=,achtergrondkleur=, -%I achtergrondraster=] -%I -%I Aan 'voor', 'na' en 'tussen' kunnen commando's worden -%I toegekend, zoals: \hfill, \blanko en \hskip1em. Bij -%I 'breedte' kan een maat, 'passend' of 'ruim' worden -%I meegegeven. Het kader kan 'aan' of 'uit' staan. -%I -%I De status kan 'start', 'stop', 'leeg' of 'geen' zijn. De -%I instelling 'leeg' geldt slechts een pagina. De instelling -%I 'geen' heeft alleen zin bij meerdere menus naast cq. boven -%I elkaar. -%P -%I Het is mogelijk een menu te (de)blokkeren. Dit gebeurt met -%I behulp van het referentie-mechanisme. Het commando luidt: -%I -%I \blokkeerinteractiemenu[plaats][verwijzingen] -%I \geefinteractiemenuvrij[plaats][verwijzingen] -%I -%I De verwijzingen moeten worden gescheiden door comma's. -%I Wanneer geen verwijzingen worden meegegeven, wordt de -%I blokkade opgeheven. -%P -%I Eventueel kunnen tussen menuitems commando's worden -%I opgenomen, -%I -%I \definieerinteractiemenu -%I [links] -%I [{alfa[eerste]}, -%I {beta[tweede]}, -%I {{\blanko[forceer,3*groot]}}, -%I {gamma[derde]}, -%I {{\vfil}}, -%I {omega[laatste]}] -%I -%I De extra {} zijn nodig, omdat anders onduidelijkheid is -%I of het commando's zijn of verwijzingen. -%P -%I De afmetingen van het interactiescherm kunnen worden -%I ingesteld met het commando: -%I -%I \stelinteractieschermin[breedte=,hoogte=,rugwit=, -%I kopwit=,optie=] -%I -%I Dit is alleen nodig als men het interactieprogramma wil -%I dwingen de tekst op een afwijkend papierformaat weer te -%I geven. Als hoogte en breedte kan 'passend' worden -%I opgegeven, in dat geval wordt uitgegaan van de -%I instellingen bij \stellayoutin. -%I -%I Er kan (in acrobat) met een vol scherm worden opgestart -%I met optie=max. -%P -%I Er zijn meerdere menu's naast elkaar mogelijk. Eerst -%I wordt een menu gedefinieerd met: -%I -%I \definieerinteractiemenu[naam][plaats][instellingen] -%I -%I De afstand tussen menus wordt ingesteld met 'afstand'. -%I Als afstand=overlay dan vallen menus over elkaar. - -\def\setupinteractionscreens% - {} - -\def\complexstelinteractieschermin[#1]% - {\getparameters[\??sc][#1]% - \def\setupinteractionscreens% met a, b en \number - {\bgroup - \doifelse{\@@scbreedte}{\v!passend} - {\!!widtha=\linkerrandbreedte - \advance\!!widtha by \linkerrandafstand - \advance\!!widtha by \paginascheiding - \advance\!!widtha by \linkermargebreedte - \advance\!!widtha by \linkermargeafstand - \ifdim\rugwit>\!!widtha\ifdim\rugwit>\!!zeropoint\relax - \advance\rugwit by -\!!widtha - \fi\fi - \advance\!!widtha by \zetbreedte - \advance\!!widtha by \rechtermargeafstand - \advance\!!widtha by \rechtermargebreedte - \advance\!!widtha by \paginascheiding - \advance\!!widtha by \rechterrandafstand - \advance\!!widtha by \rechterrandbreedte - \scratchdimen=\@@scrugwit - \advance\scratchdimen by \@@scrugoffset - \advance\!!widtha by 2\scratchdimen} - {\!!widtha=\@@scbreedte}% - \doifelse{\@@schoogte}{\v!passend} - {\!!heighta=\bovenhoogte - \advance\!!heighta by \bovenafstand - \ifdim\kopwit>\!!heighta\ifdim\kopwit>\!!zeropoint\relax - \advance\kopwit by -\!!heighta - \fi\fi - \advance\!!heighta by \zethoogte - \advance\!!heighta by \onderafstand - \advance\!!heighta by \onderhoogte - \scratchdimen=\@@sckopwit - \advance\scratchdimen by \@@sckopoffset - \advance\!!heighta by 2\scratchdimen} - {\!!heighta=\@@schoogte}% - \doifelse{\@@scoptie}{\v!max} - {\doif{\@@lyplaats}{\v!midden} - {\scratchdimen=\printpapierhoogte - \advance\scratchdimen by -\papierhoogte - \divide\scratchdimen by 2 - \advance\kopoffset by \scratchdimen - \scratchdimen=\printpapierbreedte - \advance\scratchdimen by -\papierbreedte - \divide\scratchdimen by 2 - \advance\rugoffset by \scratchdimen}% - \!!counte=1} - {\!!counte=0}% - \showmessage{\m!interactions}{1} % niet waterdicht - {\@EA\withoutpt\the\!!widtha,\@EA\withoutpt\the\!!heighta}% - \dosetupscreen - {\number\rugoffset}{\number\kopoffset} - {\number\!!widtha}{\number\!!heighta} - {\the\!!counte}% - \dosetupidentity - {\@@iatitel} - {\@@iasubtitel} - {\@@iaauteur} - {CONTEXT / PRAGMA ADE / HASSELT NL / pragma@pi.net / \jobname.tex} - {\@@iadatum} - \egroup}} - -\def\simplestelinteractieschermin% - {\setupinteractionscreens} - -\def\stelinteractieschermin% - {\complexorsimple{stelinteractieschermin}} - -% Bookmarks zijn eigenlijk niet nodig omdat \TeX uitstekend -% zelf inhoudsopgaven kan genereren. -% -% \acrobatacrobatbookmark[verwijzing]{tekst} -% -% \def\acrobatbookmark[#1]#2% -% {\doifreferencefoundelse{#1} -% {\bgroup -% \special -% {postscript -% [/Page \currentrealreference\normalspace -% /View [ /Fit ] -% /Title (#2) -% /OUT -% pdfmark}% -% \egroup}% -% {\unknownreference{#1}}} - -%D Due to requests I finally decided to support bookmarks, a -%D driver dependant way of showing tables of content. The most -%D simple way of support is hooking bookmark generation into -%D the existing list mechanisms. That way users can generate -%D bookmarks automatically, although its entirely valid to add -%D bookmarks by defining alternative ones. These will be added -%D at the appropriate place in the list. - -% \hoofdstuk{het eerste hoofdstuk} -% -% \bookmark {de eerste bookmark} % optional overuled hoofdstuk -% -% .... text .... -% -% \placebookmarks [hoofdstuk,paragraaf,subparagraaf,subsubparagraaf,mylist] -% [open list] -% -% \bookmark[mylist]{whatever} - -\def\@@bookmark {bm::} -\def\@@booklevel{bl::} -\def\@@bookcount{bc::} - -\definieerlijst[\@@bookmark] - -\appendtoks\flushpostponedbookmark\to\everypar -\appendtoks\flushpostponedbookmark\to\neverypar - -\let\flushpostponedbookmark\relax - -\def\simplebookmark#1% - {\ifx\flushpostponedbookmark\relax \else - \bgroup - \convertargument#1\to\ascii - \writestatus{system}{clashing bookmarks: \ascii}% ECHTE MESSAGE MAKEN - \egroup - \fi - \gdef\flushpostponedbookmark% - {\global\let\flushpostponedbookmark\relax - \schrijfnaarlijst[\@@bookmark]{}{#1}}} - -\def\complexbookmark[#1]#2% - {\schrijfnaarlijst[#1]{}{#2}} - -\definecomplexorsimple\bookmark - -%\def\insertbookmark[#1]#2% -% {\bgroup -% \doifreferencefoundelse{#1} -% {\doinsertbookmark{0}{0}{#2}{\currentrealreference}}{1} -% {\unknownreference{#1}}% -% \egroup} - -\newif\iftracebookmarks \tracebookmarksfalse - -\def\placebookmarks% - {\dodoubleempty\doplacebookmarks} - -\def\doplacebookmarks[#1][#2]% - {\iflocation - \iffirstargument - \bgroup - \ifsecondargument - \edef\openbookmarklist{#2}% - \else - \let\openbookmarklist=\empty - \fi - \global\let\bookmarklevellist=\empty - \def\bookmarklevelcount{0}% - \doprocessbookmarks[#1]\dogetbookmarkelement - \dolijstelement{}{}{}{}{}{}% needed to finish the first pass - \doprocessbookmarks[#1]\doputbookmarkelement - \flushbookmark - \egroup - \else - \expanded{\placebookmarks\@EA[\getvalue{\??ih\v!inhoud\c!lijst}]}% - \fi - \fi} - -\def\doprocessbookmarks[#1]#2% - {\let\dolijstelement=#2\relax - \scratchcounter=0 - \def\docommando##1% - {\advance\scratchcounter by 1 - \getlistlevel[##1]\listlevel{\the\scratchcounter}% - \setxvalue{\@@bookcount\the\scratchcounter}{1}% - \setxvalue{\@@booklevel##1}{\listlevel}}% - \processcommalist[#1]\docommando - \setxvalue{\@@bookcount0}{1}% - \global\chardef\currentbookmarklevel=0 - \global\chardef\previousbookmarklevel=0 - \doutilities{#1,\@@bookmark}{\jobname}{#1}{}{}} - -\def\dodogetbookmarkelement#1#2#3#4#5#6% - {%\doifsomething{#1} - % {\global\chardef\currentbookmarklevel=\getvalue{\@@booklevel#1}\relax}% - \doifelsenothing{#1} - {\global\chardef\currentbookmarklevel=0\relax} - {\global\chardef\currentbookmarklevel=\getvalue{\@@booklevel#1}\relax}% - \ifnum\currentbookmarklevel>\previousbookmarklevel - \setxvalue{\@@bookcount\the\currentbookmarklevel}{1}\relax - \else\ifnum\currentbookmarklevel<\previousbookmarklevel - \bgroup - \!!counta=\previousbookmarklevel - \doloop - {\let\bookmarktag=\empty - \!!countb=\!!counta - \advance\!!countb by -1 - \dorecurse{\!!countb} - {\edef\bookmarktag% - {\bookmarktag\getvalue{\@@bookcount\recurselevel}:}}% - \edef\bookmarklevelcount% - {\getvalue{\@@bookcount\the\!!counta}}% - \xdef\bookmarklevellist% - {\bookmarklevellist/\bookmarktag:\bookmarklevelcount/}% - \advance\!!counta by -1 - \ifnum\!!counta=\currentbookmarklevel - \exitloop - \fi}% - \egroup - \@EA\doglobal\@EA\increment\csname \@@bookcount\the\currentbookmarklevel\endcsname\relax - \else - \@EA\doglobal\@EA\increment\csname \@@bookcount\the\previousbookmarklevel\endcsname\relax - \fi\fi - \global\chardef\previousbookmarklevel=\currentbookmarklevel} - -\def\getbookmarklevelcount% - {\@EA\def\@EA\docommando\@EA[\@EA##\@EA1\@EA/\bookmarktag:##2/##3]% - {\def\bookmarklevelcount{##2}}% - \@EA\@EA\@EA\docommando\@EA\@EA\@EA[\@EA\bookmarklevellist\@EA/\bookmarktag:0/]} - -\def\dodoputbookmarkelement#1#2#3#4#5#6% - {%\doifsomething{#1} - % {\global\chardef\currentbookmarklevel=\getvalue{\@@booklevel#1}\relax}% - \doifelsenothing{#1} - {\global\chardef\currentbookmarklevel=0\relax} - {\global\chardef\currentbookmarklevel=\getvalue{\@@booklevel#1}\relax}% - \ifnum\currentbookmarklevel>\previousbookmarklevel - \setxvalue{\@@bookcount\the\currentbookmarklevel}{1}\relax - \else\ifnum\currentbookmarklevel<\previousbookmarklevel - \@EA\doglobal\@EA\increment\csname \@@bookcount\the\currentbookmarklevel\endcsname\relax - \else - \@EA\doglobal\@EA\increment\csname \@@bookcount\the\previousbookmarklevel\endcsname\relax - \fi\fi - \let\bookmarktag=\empty - \!!countb\currentbookmarklevel - \dorecurse{\!!countb} - {\edef\bookmarktag% - {\bookmarktag\getvalue{\@@bookcount\recurselevel}:}}% - \getbookmarklevelcount - \iftracebookmarks - \bgroup - \par - \bookmarktag\quad - \dorecurse{\currentbookmarklevel}{\quad}\unskip#1\quad - (\bookmarklevelcount)\quad - \egroup - \fi - \global\chardef\previousbookmarklevel=\currentbookmarklevel - \insertsomebookmark{#1}{\the\currentbookmarklevel}{\bookmarklevelcount}{#4}{#6}} - -\def\dogetbookmarkelement#1#2#3#4#5#6% - {\doifnot{#1}{\@@bookmark} - {\dodogetbookmarkelement{#1}{#2}{#3}{#4}{#5}{#6}}} - -\def\doputbookmarkelement#1#2#3#4#5#6% - {\doifelse{#1}{\@@bookmark} - {\localbookmark{#4}} - {\flushbookmark - \dodoputbookmarkelement{#1}{#2}{#3}{#4}{#5}{#6}}} - -\let\flushbookmark=\relax -\let\localbookmark=\gobbleoneargument - -\def\insertsomebookmark#1#2#3#4#5% - {\gdef\flushbookmark% - {\doinsertsomebookmark{#1}{#2}{#3}{#4}{#5}{g}}% - \gdef\localbookmark##1% - {\doinsertsomebookmark{#1}{#2}{#3}{##1}{#5}{l}}} - -\def\doinsertsomebookmark#1#2#3#4#5#6% - {\global\utilitydonetrue - \global\let\localbookmark=\gobbleoneargument - \global\let\flushbookmark=\relax - \doifinstringelse{#1}{\openbookmarklist} - {\chardef\openbookmark=1} - {\chardef\openbookmark=0}% - \iftracebookmarks(#6: #4)\quad(\the\openbookmark)\par\fi - \doinsertbookmark{#2}{#3}{#4}{#5}{\openbookmark}} - -% \startinteractiemenu[rechts] -% \but [eerste] eerste \\ -% \txt hello world \\ -% \but [tweede] tweede \\ -% \nop \\ -% \but [tweede] tweede \\ -% \rul whow \\ -% \but [tweede] tweede \\ -% \raw hello world \\ -% \but [tweede] tweede \\ -% \com \vfill \\ -% \but [derde] derde \\ -% \stopinteractiemenu - -\newif\iflocationmenupermitted - -\def\testinteractiemenu#1% - {\iflocation - \doifelse{\@@iamenu}{\v!aan} - {\doifelsevalue{\??am#1\c!status}{\v!start} - {\global\locationmenupermittedtrue} - {\global\locationmenupermittedfalse}} - {\global\locationmenupermittedfalse}% - \else - \global\locationmenupermittedfalse - \fi} - -\def\doblokkeerinteractiemenu[#1][#2][#3]% - {\def\dodoblokkeerinteractiemenu##1% - {\doifelse{#3}{} - {\setevalue{\??am##1\c!blokkade}{}} - {\edef\interactieblokkade{\getvalue{\??am##1\c!blokkade}} - \def\docommando####1% - {#1{####1}{\interactieblokkade}}% #1 = \remove or \add - \processcommalist[#3]\docommando - \setevalue{\??am##1\c!blokkade}{\interactieblokkade}}}% - \processcommalist[#2]\dodoblokkeerinteractiemenu} - -\def\blokkeerinteractiemenu% - {\dotripleempty\doblokkeerinteractiemenu[\addtocommalist]} - -\def\geefinteractiemenuvrij% - {\dotripleempty\doblokkeerinteractiemenu[\removefromcommalist]} - -% ja : kader/achtergrond met tekst -% leeg : kader/achtergrond maar geen tekst -% nee : alleen ruimte reserveren -% geen : helemaal weglaten - -\newif\iflocationdummy -\newif\ifskippedmenuitem - -\def\dosetlocationbox#1[#2]#3#4% - {\global\skippedmenuitemfalse - \setbox\locationbox=\hbox - {% anders cyclische aanroep ! - \iflocationdummy - \edef\locationboxborder{\getvalue{#1\c!kader}}% - \edef\locationboxbackground{\getvalue{#1\c!achtergrond}}% - \else - \edef\locationboxborder{\v!uit}% - \edef\locationboxbackground{}% - \fi - \localframed[#1] - [\c!kader=\locationboxborder,\c!achtergrond=\locationboxbackground,#2] - {\dolocationattributes{#1}{#3}}}% - \hbox{#4{\copy\locationbox}}} - -\def\setlocationboxyes#1[#2]#3[#4]% - {\ifx\currentouterreference\empty \else - \let\currentrealreference=\empty - \fi - \doifelse{\currentrealreference}{\realfolio}% - {\ifcase\getvalue{#1\c!zelfdepagina} - \bgroup - \locationdummytrue - \setvalue{#1\c!kleur}{}% - \dosetlocationbox{#1}[#2,\c!dummy=\v!nee]{#3}{\gotolocation{#4}}% - \egroup - \or - \locationdummytrue - \dosetlocationbox{#1}[#2,\c!dummy=\v!ja]{#3}{\gotolocation{#4}}% - \or - \locationdummyfalse - \dosetlocationbox{#1}[#2,\c!dummy=\v!ja]{#3}{\gotolocation{#4}}% - \or - \locationdummyfalse - \global\skippedmenuitemtrue - \fi} - {\locationdummytrue - \dosetlocationbox{#1}[#2,\c!dummy=\v!nee]{#3}{\gotolocation{#4}}}} - -\def\setlocationboxnop#1[#2]#3[#4]% - {\ifcase\getvalue{#1\c!onbekendeverwijzing} - \locationdummytrue - \dosetlocationbox{#1}[#2,\c!dummy=\v!nee]{#3}{}% - \or - \locationdummytrue - \dosetlocationbox{#1}[#2,\c!dummy=\v!ja]{#3}{}% - \or - \locationdummyfalse - \dosetlocationbox{#1}[#2,\c!dummy=\v!ja]{#3}{}% - \or - \locationdummyfalse - \global\skippedmenuitemtrue - \fi} - -\def\setlocationbox#1[#2]#3[#4]% - {\doifinstringelse{#4}{\getvalue{#1\c!blokkade}} - {\setlocationboxnop{#1}[#2]{#3}[#4]} - {\doifreferencefoundelse{#4} - {\setlocationboxyes{#1}[#2]{#3}[#4]} - {\setlocationboxnop{#1}[#2]{#3}[#4]% - \unknownreference{#4}}}} - -\def\dodosetlocationcommanditem#1#2#3[#4]#5\\% - {\bgroup - \leavevmode - \doifelse{#5}{[]} - {\doifinstringelse{=}{#4} - {#3} - {\setlocationbox{\??am#1}[]{#3}[#4]}} - {#3}% - \ifskippedmenuitem \else - \getvalue{\??am#1#2}% - \fi - \egroup} - -\def\dosetlocationcommanditem#1#2#3% - {\dodosetlocationcommanditem{#1}{#2}#3[]\\} - -\def\setlocationnop#1[#2]#3% - {\localframed[#1][#2]{#3}} - -\def\executeamboxcommands#1#2#3#4#5% - {\processaction - [\getvalue{\??am#1\c!dummy}] - [ \v!ja=>\chardef\handleunknownmenuitem=0\relax, - \v!leeg=>\chardef\handleunknownmenuitem=1\relax, - \v!nee=>\chardef\handleunknownmenuitem=2\relax]% - \getvalue{\??am#1#3}% - \ifextendedmenu - \setamboxcommands{#1}{#4}% - #2% - \else - \def\dolocationcommand##1% - {\dosetlocationcommanditem{#1}{#4}{##1}}% - \processcommalist[#2]\dolocationcommand - \fi - \unskip - \getvalue{\??am#1#5}} - -\def\setamboxcommands#1#2% - {\def\raw##1\\% - {\bgroup - \leavevmode - ##1% - \ifskippedmenuitem \else - \getvalue{\??am#1#2}% - \fi - \egroup}% - \def\but[##1]##2\\% - {\raw\setlocationbox{\??am#1}[]{##2}[##1]\\}% - \def\nop##1\\% - {\raw\phantom{\localframed[\??am#1][]{}}\\}% - \def\txt##1\\% - {\raw\localframed[\??am#1][\c!kader=\v!uit]{##1\unskip}\\}% - \def\rul##1\\% - {\raw\localframed[\??am#1][]{##1\unskip}\\}% - \def\com##1\\% - {##1}} - -\def\@@amhbox#1#2#3#4% - {\testinteractiemenu{#3}% - \iflocationmenupermitted - \bgroup - \def\dolocationcommand##1% - {\dosetlocationcommanditem{#3}{##1}}% - \dimen0=\zetbreedte - \advance\dimen0 by \pagebackgroundhoffset - \advance\dimen0 by \pagebackgroundhoffset -\advance\dimen0 by -\getvalue{\??am#3\c!linkeroffset}% -\advance\dimen0 by -\getvalue{\??am#3\c!rechteroffset}% - \setbox0=\hbox to \dimen0 - {\forgetall - \executeamboxcommands{#3}{#4}\c!links\c!midden\c!rechts}% - \wd0=\zetbreedte -% geen \ht=#2 setting (yet) - \hskip-\pagebackgroundhoffset -\hskip \getvalue{\??am#3\c!linkeroffset}% - \box0\relax - \egroup - \else - #1\relax - \fi} - -\def\@@amvbox#1#2#3#4% don't change skipping, this one works! - {\testinteractiemenu{#3}% - \iflocationmenupermitted - \bgroup - \dimen0=\teksthoogte - \advance\dimen0 by \pagebackgroundvoffset - \advance\dimen0 by \pagebackgroundvoffset - \advance\dimen0 by \pagebackgrounddepth -\advance\dimen0 by -\getvalue{\??am#3\c!bovenoffset}% -\advance\dimen0 by -\getvalue{\??am#3\c!onderoffset}% - \setbox0=\vbox to \dimen0 - {\forgetall % Voor't geval de afstand - \stelblankoin[\v!standaard]% % (tijdelijk) is aangepast. - \hsize#2\relax - \executeamboxcommands{#3}{#4}\c!voor\c!tussen\c!na}% - \setbox0=\vbox - {\vskip-\pagebackgroundvoffset -\vskip\getvalue{\??am#3\c!bovenoffset}% - \ht0=\!!zeropoint - \box0 - \vskip\pagebackgroundvoffset}% overbodig - \ht0=\teksthoogte - \wd0=#2\relax - \box0 - \egroup - \else - #1\relax - \fi} - -\setvalue{\??am\s!do\v!rechts}% - {\@@amvbox{\dodummypageskip\v!rechts}\rechterrandbreedte} - -\setvalue{\??am\s!do\v!links}% - {\@@amvbox{\dodummypageskip\v!links}\linkerrandbreedte} - -\setvalue{\??am\s!do\v!boven}% - {\@@amhbox{\dodummypageskip\v!boven}\bovenhoogte} - -\setvalue{\??am\s!do\v!onder}% - {\@@amhbox{\dodummypageskip\v!onder}\onderhoogte} - -\def\dointeractiemenu#1#2% - {\getvalue{\??am\s!do\getvalue{\??am#1\c!plaats}}{#1}{#2}} - -\def\interactiemenu[#1]% - {\donottest\getvalue{\??am\c!menu#1}} - -\def\horizontaalinteractiemenu#1#2#3#4% - {\dimen2=\!!zeropoint - \setbox0=\hbox - {\def\docommando##1% - {\doifnotvalue{\??am##1\c!status}{\v!geen} - {\hskip\dimen2 - \setbox2=\hbox to #2 - {\getvalue{\??am##1#3}\interactiemenu[##1]\getvalue{\??am##1#4}}% - \doifelsevalue{\??am##1\c!afstand}{\v!overlay} - {\dimen2=\!!zeropoint - \wd2=\!!zeropoint}% - {\dimen2=\getvalue{\??am##1\c!afstand}}% - \box2}}% - \startinteractie - \processcommacommand[\getvalue{\??am#1}]\docommando - \stopinteractie}% - \wd0=#2\relax - \box0\relax} - -\def\vertikaalinteractiemenu#1#2#3#4% - {\dimen2=\!!zeropoint - \setbox0=\vbox - {\def\docommando##1% - {\doifnotvalue{\??am##1\c!status}{\v!geen} - {\vskip\dimen2 - \setbox2=\vbox to #2 - {\getvalue{\??am##1#3}\interactiemenu[##1]\getvalue{\??am##1#4}}% - \doifelsevalue{\??am##1\c!afstand}{\v!overlay} - {\dimen2=\!!zeropoint - \offinterlineskip - \dp2=\!!zeropoint - \ht2=\!!zeropoint}% - {\dimen2=\getvalue{\??am##1\c!afstand}}% - \box2}}% - \startinteractie - \processcommacommand[\getvalue{\??am#1}]\docommando - \stopinteractie}% - \ht0=#2\relax - \dp0=\!!zeropoint - \box0\relax} - -\def\interactiemenus[#1]% - {\iflocation - \processaction - [#1] - [ \v!links=>\horizontaalinteractiemenu\v!links\linkerrandbreedte\c!links\c!rechts, - \v!rechts=>\horizontaalinteractiemenu\v!rechts\rechterrandbreedte\c!links\c!rechts, - \v!boven=>\vertikaalinteractiemenu\v!boven\bovenhoogte\c!voor\c!na, - \v!onder=>\vertikaalinteractiemenu\v!onder\onderhoogte\c!voor\c!na]% - \else - \dodummypageskip{#1}% - \fi} - -\setvalue{\??am\v!links}{} -\setvalue{\??am\v!rechts}{} -\setvalue{\??am\v!boven}{} -\setvalue{\??am\v!onder}{} - -\newif\ifextendedmenu - -\def\dodefinieerinteractiemenu[#1][#2][#3]% - {\ConvertToConstant\doifelse{#3}{} - {\setvalue{\??am\c!menu#1}% - {\extendedmenufalse\dointeractiemenu{#1}{#2}}} - {\setvalue{\??am\c!menu#1}% - {\extendedmenufalse\dointeractiemenu{#1}{}}% - \presetlocalframed[\??am#1]% - \setvalue{\??am#1\c!blokkade}{}% - \edef\!!stringe{\getvalue{\??am#2}}% - \addtocommalist{#1}\!!stringe - \letvalue{\??am#2}=\!!stringe - \doifnot{#1}{#2} - {\copyparameters[\??am#1][\??am#2] - [\c!links,\c!midden,\c!rechts,\c!voor,\c!na,\c!tussen, - \c!breedte,\c!hoogte,\c!afstand,\c!offset,\c!kader, - \c!achtergrond,\c!achtergrondkleur,\c!achtergrondraster, - \c!letter,\c!kleur,\c!zelfdepagina,\c!onbekendeverwijzing, - \c!linkeroffset,\c!rechteroffset,\c!bovenoffset,\c!onderoffset]}% - \ConvertToConstant\doifinstringelse{=}{#3} - {\getparameters[\??am#1][\c!plaats=#2,#3]}% - {\doifnot{#2}{#3} - {\copyparameters[\??am#1][\??am#3] - [\c!links,\c!midden,\c!rechts,\c!voor,\c!na,\c!tussen, - \c!breedte,\c!hoogte,\c!afstand,\c!offset,\c!kader, - \c!achtergrond,\c!achtergrondkleur,\c!achtergrondraster, - \c!letter,\c!kleur,\c!zelfdepagina,\c!onbekendeverwijzing, - \c!linkeroffset,\c!rechteroffset,\c!bovenoffset,\c!onderoffset]}% - \getparameters[\??am#1][\c!plaats=#2]}}} - -\def\definieerinteractiemenu% - {\dotripleempty\dodefinieerinteractiemenu} - -\def\startinteractiemenu[#1]#2\stopinteractiemenu% - {\setvalue{\??am\c!menu#1}% - {\extendedmenutrue\dointeractiemenu{#1}{#2}}} - -\def\dododostelinteractiemenuin#1% - {\processaction - [\getvalue{#1}] - [ \v!ja=>\setvalue{#1}{0}, - \v!leeg=>\setvalue{#1}{1}, - \v!nee=>\setvalue{#1}{2}, - \v!geen=>\setvalue{#1}{3}, - \s!default=>\setvalue{#1}{1}]} - -\def\dodostelinteractiemenuin[#1][#2]% - {\def\docommando##1% - {\getparameters[\??am##1][#2] - \dododostelinteractiemenuin{\??am##1\c!onbekendeverwijzing}% - \dododostelinteractiemenuin{\??am##1\c!zelfdepagina}}% - \processcommalist[#1]\docommando} - -\def\dostelinteractiemenuin[#1][#2]% - {\ConvertToConstant\doifinstringelse{=}{#2} - {\dodostelinteractiemenuin[#1][#2]} - {\dodefinieerinteractiemenu[#1][#2][]}} - -\def\stelinteractiemenuin% - {\dodoubleargument\dostelinteractiemenuin} - -% \scherm moet worden als \pagina - -\def\simplescherm% zou niet nodig moeten zijn - {\iflocation - \pagina[\v!ja]% - \fi} - -\def\complexscherm[#1]% - {\iflocation - \pagina[#1]% - \fi} - -\def\scherm% - {\complexorsimple{scherm}} - -%I n=Figuren++ -%I c=\startfiguur,\refereer,\markeer,\toelichting -%I -%I Het is mogelijk naar een plaats in een figuur te verwijzen. -%I Het commando \gebruikfiguur[][][] wordt in dat geval vervangen -%I door het commando: -%I -%I \startfiguur[naam][file][factor=]% -%I ... -%I \refereer(x1,y1)(h1,b1)[referentie1]% -%I ... -%I \markeer(xn,yn)(hn,bn)[referentien]% -%I ... -%I \stopfiguur -%P -%I Wanneer als optie bij \gebruikexternefiguren 'test' wordt -%I meegegegeven, wordt een testpagina met een rasterverdeling -%I gegenereerd. Met x en y wordt de linkerbovenhoek ingesteld, -%I met h en b de hoogte en de breedte van het te markeren deel -%I van de figuur. -%I -%I Standaard is de hoogte verdeeld in 24 stukken. Wil men een -%I andere indeling, dan kan men met \gebruikexternefiguren -%I de 'xmax' of 'ymax' instellen (aanbevolen: 10 - 50). -%I -%I De hokjes waarop geklikt kan worden kunnen zichtbaar worden -%I gemaakt met 'hokjes=aan'. -%P -%I Om duidelijk te kunnen maken achter welke delen van een -%I figuur iets zit, kan een kleurenbalk worden opgenomen. -%I -%I ... -%I \kleurenbalk[...,...,...] -%I ... -%I -%I (deze tekst moet nog worden aangevuld) -%P -%I Het is mogelijk in een tekst toelichtingen op te nemen. -%I -%I ... -%I \toelichting(x1,y1)(h1,b1)[instellingen]{tekst} -%I ... -%I -%I De instellingen zijn optioneel en komen overeen met die van -%I het commando \omlijnd. - -\newcount\efreference -\newdimen\efxsteps -\newdimen\efysteps - -\def\calculateefsteps% - {\ifnum0\@@exxmax=0 - \ifnum0\@@exymax=0 - \def\@@exymax{24}% - \fi - \efysteps=\fighei \divide\efysteps by \@@exymax - \efxsteps=\efysteps - \dimen0=\figwid - \advance\dimen0 by \efysteps - \divide\dimen0 by \efysteps - \edef\@@exxmax{\number\dimen0}% - \else - \efxsteps=\figwid \divide\efxsteps by \@@exxmax - \efysteps=\fighei \divide\efysteps by \@@exymax - \fi} - -\def\efcomment#1(#2,#3)#4(#5,#6)% {kader}(x,y)(h,b)[...]{tekst} - {\def\complexefdocomment[##1]##2% - {\positioneer(#2,#3)% - {\setnostrut - \framed - [\c!breedte=#5\efxsteps, - \c!hoogte=#6\exysteps, - \c!offset=\v!geen, - \c!kader=#1, - ##1]% - {##2}}}% - \complexorsimpleempty{efdocomment}} - -\def\efnocomment(#1,#2)#3(#4,#5)% (x,y)(h,b)[...]{tekst} - {\def\complexefdonocomment[##1]##2{}% - \complexorsimpleempty{efdonocomment}} - -\def\efdomarker(#1,#2)#3#4% (h,b){kader}{tekst} - {\framed - [\c!breedte=#1\efxsteps, - \c!hoogte=#2\efysteps, - \c!offset=\v!geen, - \c!kader=#3]% - {#4}} - -\def\efmark(#1,#2)#3(#4,#5)#6[#7]% - {\advance\efreference by 1 - \positioneer(#1,#2) - {\hbox{\the\efreference}}% - \positioneer(#1,#2) - {\doifreferencefoundelse{\s!vwb:#7} - {\gotosomeinternal - {\s!vwb}{#7}{\currentrealreference} - {\efdomarker(#4,#5){\v!aan}{\thisissomeinternal{\s!vwa}{#7}}}} - {[?]}}} - -\def\effiguur#1% - {\positioneer(0,0){\naam{#1}}} - -\def\eftext#1(#2,#3)#4(#5,#6)#7[#8]% - {\advance\efreference by 1 - \hbox - {\thisissomeinternal{\s!vwb}{#8}% - \doifreferencefoundelse{\s!vwa:#8} - {\gotosomeinternal - {\s!vwa}{#8}{\currentrealreference} - {\hbox to 1.5em{\the\efreference\presetgoto\hfill}}} - {\hbox to 1.5em{[?]\hfill}}% - ~#1 (#2,#3) (#5,#6) [#8]\hfill}% - \endgraf} - -\def\efdoarea(#1,#2)#3#4% (h,b){kader}{tekst} - {\start - \setnostrut - \framed - [\c!breedte=#1\efxsteps, - \c!hoogte=#2\efysteps, - \c!offset=\!!zeropoint, - \c!kader=#3] - {#4}% - \stop} - -\def\efgoto(#1,#2)#3[#4]% (h,b)kader[ref] - {\setbox0=\vbox{\efdoarea(#1,#2)#3{}}% - \naarbox{\copy0}[#4]} - -\def\efthisis(#1,#2)#3[#4]% - {\pagereference[#4]} - %\doifreferencefoundelse{#4} - % {\efdoarea(#1,#2){#3}{\thisisinternal{#4}}} - % {\unknownreference{#4}}} - -\newbox\colorbarbox - -\def\makecolorbar[#1]% - {\def\docommando##1% - {\color[##1] - {\blackrule - [\c!breedte=2em, - \c!hoogte=1ex, - \c!diepte=\!!zeropoint]}% - \endgraf}% - \global\setbox\colorbarbox=\vbox - {\forgetall - \processcommalist[#1]\docommando}% - \global\setbox\colorbarbox=\vbox - {\hskip2em\box\colorbarbox}% - \global\wd\colorbarbox=\!!zeropoint} - -\def\plaatsstartfiguur[#1][#2][#3]#4\plaatsstopfiguur% - {\hbox - {\gebruikexternfiguur[#1][#2][#3]% - \berekenexternfiguur[#1][#2]% - \calculateefsteps - \startpositioneren - \def\refereer(##1,##2)##3(##4,##5)##6[##7]% - {\positioneer(##1,##2) - {\efgoto(##4,##5){\@@exhokjes}[##7]}}% - \def\markeer(##1,##2)##3(##4,##5)##6[##7]% - {\positioneer(##1,##2) - {\efthisis(##4,##5){\@@exhokjes}[##7]}}% - \def\toelichting% - {\efnocomment}% - \def\kleurenbalk##1[##2]% - {}% - \positioneer(0,0){\effiguur{#1}}% - \linewidth=1pt - \stelpositionerenin - [\c!eenheid=pt, - \c!xschaal=\withoutpt{\the\efxsteps}, - \c!yschaal=\withoutpt{\the\efysteps}, - \c!factor=1]% - \ignorespaces#4% - \def\refereer(##1,##2)##3(##4,##5)##6[##7]% - {}% - \let\markeer=\refereer - \def\toelichting% - {\efcomment\v!nee}% - \def\kleurenbalk##1[##2]% - {\makecolorbar[##2]}% - \ignorespaces#4% - \stoppositioneren - \box\colorbarbox}} - -% De onderstaande macro mag niet zondermeer worden aangepast -% en is afgestemd op gebruik in de handleiding. - -\def\teststartfiguur[#1][#2][#3]#4\teststopfiguur% - {\begingroup - \gebruikexternfiguur[#1][#2][\c!bfactor=\v!max]% - \def\refereer% - {\efmark}% - \def\markeer% - {\efmark}% - \def\toelichting% - {\efcomment\v!ja}% - \def\kleurenbalk##1[##2]% - {}% - \efreference=0 - \setbox0=\vbox - {\hsize240pt - \startpositioneren - \berekenexternfiguur[#1][#2]% - \calculateefsteps - \positioneer(0,0) - {\effiguur{#1}}% - \positioneer(0,0) - {\rooster - [\c!nx=\@@exxmax, - \c!dx=\withoutpt{\the\efxsteps}, - \c!ny=\@@exymax, - \c!dy=\withoutpt{\the\efysteps}, - \c!xstap=1, - \c!ystap=1, - \c!schaal=1, - \c!offset=\v!nee, - \c!eenheid=pt]}% - \stelpositionerenin% - [\c!eenheid=pt, - \c!xschaal=\withoutpt{\the\efxsteps}, - \c!yschaal=\withoutpt{\the\efysteps}, - \c!factor=1]% - \linewidth=1pt - \ignorespaces#4\relax - \stoppositioneren - \vfill}% - \efreference=0 - \def\refereer% - {\eftext{$\rightarrow$}}% - \def\markeer% - {\eftext{$\leftarrow$}}% - \def\toelichting% - {\efnocomment}% - \def\kleurenbalk##1[##2]% - {}% - \setbox2=\vbox - {{\tfa\doifelsenothing{#1}{#2}{#1}} - \blanko - \tfxx#4 - \vfilll}% - \ifdim\ht0>\ht2 - \ht2=\ht0 - \else - \ht0=\ht2 - \fi - \hbox - {\hskip3em - \vtop{\vskip12pt\box0\vskip6pt}% - \vtop{\vskip12pt\box2\vskip6pt}}% - \endgroup} - -\def\dostartfiguur[#1][#2][#3]#4\stopfiguur% - {\doifelse{\@@exoptie}{\v!test} - {\teststartfiguur[#1][#2][#3]#4\teststopfiguur% - \def\@@exhokjes{\v!aan}} - {\def\@@exhokjes{\v!uit}}% - \setvalue{#1}% - {\plaatsstartfiguur[#1][#2][#3]#4\plaatsstopfiguur}} - -\def\startfiguur% - {\dotripleargument\dostartfiguur} - -%I n=Springen -%I c=\naar,\button,\menubutton,\stelbuttonsin -%I -%I Een woord kan woren gemarkeerd met: -%I -%I \naar{woord}[referentie] -%I -%I Voorlopig zijn daarnaast beschikbaar: -%I -%I \button[instellingen]{woord}[referentie] -%I \menubutton[plaats][instellingen]{woord}[referentie] -%I -%I waarbij de [instellingen] facultatief zijn en {geen} in -%I plaats van {woord} kan worden opgegeven. De instellingen komen, -%I voor zover relevant, overeen met die van \omlijnd. Vaste -%I instellingen vinden plaats met: -%I -%I \stelbuttonsin[breedte=,hoogte=,offset=,kader=, -%I achtergrond=,achtergrondkleur=,achtergrondraster=, -%I kleur=] -%P -%I De elders reeds beschreven commando's \op en \in zijn in -%I geval van interactie ook als volgt te gebruiken: -%I -%I \in{woord}[referentie] -%I \op{woord}[referentie] -%I -%I In dat geval wordt 'tekst~referentie' net zo weergegeven -%I als -%I -%I \naar{woord}[referentie] % woorden -%I \naarbox{woord}[referentie] % robuust -%I -%I opgeroepen verwijzing. - -\def\domenubutton[#1][#2]#3[#4]% - {\bgroup - \locationdummytrue - \iffirstargument - \ifsecondargument - \setlocationbox{\??am#1}[#2]{#3}[#4]% - \else - \ConvertToConstant\doifinstringelse{=}{#1} - {\setlocationbox{\??bt}[#1]{#3}[#4]} - {\setlocationbox{\??am#1}[]{#3}[#4]}% - \fi - \else - \setlocationbox{\??bt}[]{#3}[#4]% - \fi - \egroup} - -\unexpanded\def\menubutton% - {\dodoubleempty\domenubutton} - -\def\domenubox[#1][#2]#3% - {\bgroup - \def\setlocationbox##1[##2]##3[##4]% - {\localframed[##1][##2]{\dolocationattributes{##1}{##3}}}% - \domenubutton[#1][#2]#3[]% - \egroup} - -\def\menubox% - {\dodoubleempty\domenubox} - -%I n=Externe files -%I c=\gebruikexterndocument,\uit -%I c=\startsynchroniseer,\stopsynchronisatie,\synchroniseer, -%I c=\stelsynchronisatiein,\stelsynchronisatiebalkin,\synchronisatiebalk -%I -%I Mits ondersteund door het interactieprogramma, kan naar -%I een andere file worden gesprongen. Zo'n file moet eerst -%I worden gedefinieerd met: -%I -%I \gebruikexterndocument [naam] [file] [omschrijving] -%I -%I Een verwijzing naar een andere file ziet er als volgt -%I uit: -%I -%I \in{tekst}[naam::verwijzing] -%I \op{tekst}[naam::verwijzing] -%I \naar{tekst}[naam::verwijzing] -%I -%I De naam van het andere document kan worden opgeroepen met -%I -%I \uit[naam] -%I -%I terwijl \uit zonder [naam] de bij \in, \op of \naar -%I behorende omschrijving oproept. -%P -%I Documenten kunnen worden gesynchroniseerd. Dat wil zeggen -%I dat gesprongen kan worden naar hetzelfde punt in een anders -%I vormgegeven tekst. Een synchronisatiepunt wordt aangegeven -%I met: -%I -%I \sychroniseer -%I -%I Een synchronisatie kan uit de pas lopen, bijvoorbeeld als -%I we in een kop een synchronisatiebalk oproepen. Wanneer vindt -%I immers precies de synchronisatie plaats? Vandaar de wat -%I meer betrouwbare menier van aangeven: -%I -%I \startsynchronisatie % voor de kop (nu mag balk) -%I \stopsynchronisatie % eind van de kop (fixeert plaats) -%P -%I Synchronisatie kan worden ingesteld met: -%I -%I \stelsynchronisatiein[status=] -%I -%I Het synchronisatiemechanisme is in geval van interactieve -%I teksten standaard niet actief. -%P -%I Er kan een synchronisatiebalk worden opgeroepen waarmee -%I naar een ander document kan worden gesprongen. -%I -%I \synchronisatiebalk[naam][instellingen] -%I -%I De instellingen kunnen ook apart worden opgegeven: -%I -%I \stelsynchronisatiebalkin[variant=,breedte=, -%I letter=,kleur=,achtergrond=,achtergrondraster=, -%I achtergrondkleur=] -%I -%I Mogelijke varianten zijn 'lokaal' en 'pagina'. In het -%I eerste geval wordt slechts een mogelijkheid geboden, in het -%I tweede geval zijn tot drie mogelijkheden mogelijk. Deze -%I zijn te vergelijken met markeringen. - -% Hier volgen de synchronisatiemacro's: - -\def\syncprefix{sync} -\def\syncmarker{syncmark} - -\definieermarkering[\syncmarker] -\stelmarkeringin[\syncmarker][\c!expansie=\v!ja] - -\newcounter\synccounter - -\newif\ifsynchronisation - -\def\startsynchronisatie% - {\iflocation\ifsynchronisation - \doglobal\increment\synccounter - \fi\fi} - -\def\stopsynchronisatie% - {\iflocation\ifsynchronisation - %\thisisdestination{\syncprefix:\synccounter}% - \paginareferentie[\syncprefix:\synccounter]% - \ifvmode - \markeer[\syncmarker]{\synccounter}% - \else - \showmessage{\m!interactions}{4}{\synccounter}% - \fi - \fi\fi} - -\def\synchroniseer% - {\startsynchronisatie - \stopsynchronisatie} - -\def\dostelsynchronisatiein[#1]% - {\getparameters[\??sy][#1]% - \doifelse{\@@systatus}{\v!start} - {\synchronisationtrue} - {\synchronisationfalse}} - -\def\stelsynchronisatiein% - {\dosingleargument\dostelsynchronisatiein} - -\def\definieersynchronisatie% - {\dosingleargument\dodefinieersynchronisatie} - -\def\stelsynchronisatiebalkin% - {\dodoubleargument\getparameters[\??ba]} - -\presetlocalframed[\??ba] - -\setvalue{synchronisatie\v!pagina}[#1]% - {\bgroup - \stelinteractiein[\c!breedte=\!!zeropoint]% - \setbox0=\hbox - {\localframed[\??ba][]% - {\dolocationattributes{\??ba}{\strut\@@batekst}}}% - \mindermeldingen - \def\onder% - {\leaders\hrule\!!depth1ex\!!height-.5ex\hfil}% - \def\boven##1##2##3% - {\dimen0=\wd0\relax - \divide\dimen0 by 3\relax - \multiply\dimen0 by ##2\relax - \dimen2=.25em\relax - \advance\dimen0 by -##3\dimen2\relax - %\gotodestination - % {}{#1}{\syncprefix:##1}{} - % {\hbox to \dimen0{\color[\locationcolor\@@bakleur]{\onder}}}}% - \naarbox - {\hbox to \dimen0{\color[\locationcolor\@@bakleur]{\onder}}}% - [#1::\syncprefix:##1]}% - \hbox - {\prefetchmark[\syncmarker]% - \def\check##1##2% - {\edef##2{\fetchmark[\syncmarker][##1]}% - \ifnum0##2=0 \def##2{1}\fi}% - \check\v!vorige\top - \check\v!eerste\first - \check\v!laatste\bot - \setbox2=\hbox to \wd0 - {\ifnum\top=\first\relax - \ifnum\first=\bot\relax - \boven\first30\relax - \else - \boven\first21\hss\boven\bot11\relax - \fi - \else - \ifnum\first=\bot\relax - \boven\top11\hss\boven\first21\relax - \else - \boven\top11\hss\boven\first11\hss\boven\bot11\relax - \fi - \fi}% - \wd2=\!!zeropoint\box2 - \box0\relax}% - \egroup} - -\setvalue{synchronisatie\v!lokaal}[#1]% - {\bgroup - \stelinteractiein[\c!breedte=\!!zeropoint]% - \def\blackrule{\hbox{\vrule\!!height.5em\!!width.5em}}% - %\gotodestination - % {}{##1}{\syncprefix:#1}{0} - % {\color[\locationcolor\@@bakleur]{\blackrule}}% - \naarbox % - {\color[\locationcolor\@@bakleur]{\blackrule}}% - [#1::\syncprefix:\synccounter]% - \egroup} - -\def\synchronisatiebalk[#1][#2]% - {\iflocation\ifsynchronisation - \bgroup - \stelsynchronisatiebalkin - [\c!tekst=\getvalue{doc:des:#1},#2]% - \getvalue{synchronisatie\@@bavariant}[#1]% - \egroup - \fi\fi} - -%I n=Interactiebalk -%I c=\interactiebalk,\stelinteractiebalkin -%I -%I Het volgende commando genereert een interactiebalk. Pas op: -%I de waarde van \realpageno staat niet echt vast. -%I -%I \interactiebalk[variant=,breedte=,hoogte=,diepte=, -%I achtergrond=,achtergrondkleur=,achtergrondraster=, -%I kader=,stap=] -%I -%I \interactiebalk[reset] -%I -%I \stelinteractiebalkin[...] -%I -%I Mogelijke stappen zijn 'klein', 'middel', 'groot' en 'n'; -%I beschikbare varianten zijn: -%I -%I a meter (scrollbar) -%I b jumper (symbool: begin terug vooruit eind) -%I c jumper (balk: begin terug vooruit eind) -%I d pagina (subpaginas vast formaat) -%I e pagina (subpaginas vrij formaat) -%I f pagina (subpaginas grote aantallen) -%I g pagina (subpaginas jumper) - -% Dit is leuke toepassing van glue! - -\newbox\meterbox - -\newif\ifbalksymbool - -\def\doganaareenpagina#1#2#3% nog checken ! - {\checkreferences % nodig ?? - \iflocation - \ifnum#3=\realpageno - {#2} - \else - \doifelsenothing{#1} - {\hbox{\gotorealpage{}{}{#3}{#2}}} - {\hbox{\gotorealpage{}{}{#3}{\dolocationattributes{#1}{#2}}}}% - \fi - \else - {#2}% - \fi} - -\def\interactiebalka% - {\iflocation - \bgroup - \stelinteractiein[\c!breedte=\!!zeropoint]% - \setupblackrules[\c!hoogte=\v!max,\c!diepte=\v!max]% - \!!widthb=\@@ibbreedte\relax - \advance\!!widthb by -2.75em\relax - \!!widtha=\!!widthb\relax - \divide\!!widtha by \lastpage\relax - \bgroup - \advance\realpageno by -1\relax - \ifvoid\meterbox - \bgroup - \processaction - [\@@ibstap] - [ \v!klein=>\dimen0=.25em\relax, - \v!middel=>\dimen0=.5em\relax, - \v!groot=>\dimen0=1em\relax, - \s!unknown=>\dimen0=\!!widtha]% - \ifdim\!!widtha<\dimen0\relax - \!!counta=\dimen0\relax - \!!countb=\!!widtha - \divide\!!counta by \!!countb - \else - \!!counta=\@@ibstap\relax - \fi - \!!widtha=\!!counta\!!widtha - \setbox0=\hbox{\blackrule[\c!breedte=\!!widtha]}% - \global\setbox\meterbox=\hbox to \!!widthb - {\hss - \for \teller=1 \to \lastpage \step \!!counta \do - {\gotorealpage{}{}{\teller}{\copy0}}% - \hss}% - \global\wd\meterbox=\!!zeropoint\relax - \egroup - \fi - \egroup - \noindent - \strut - \hbox to \@@ibbreedte - {\mindermeldingen - \setupblackrules[\c!breedte=1em]% - \doganaareenpagina\??ib\blackrule\firstpage - \hss - \color[middlegray]{\copy\meterbox}% - \hbox to \!!widthb - {\ifdim\!!widtha<1em\relax - \!!widtha=1em\relax - \fi - \setupblackrules[\c!breedte=\!!widtha]% - \ifnum\realpageno>1\relax - \!!counta=\realpageno - \advance\!!counta by -2\relax - \hskip\!!zeropoint\!!plus\!!counta sp\relax % cm gives overflow - \doganaareenpagina\??ib\blackrule\prevpage - \fi - \color[\@@ibcontrastkleur]{\blackrule[\c!breedte=.5em]}% - \ifnum\realpageno<\lastpage\relax - \doganaareenpagina\??ib\blackrule\nextpage - \!!counta=\lastpage\relax - \advance\!!counta by -\realpageno - \advance\!!counta by -1\relax - \hskip\!!zeropoint\!!plus\!!counta sp\relax % cm gives overflow - \fi}% - \hss - \doganaareenpagina\??ib\blackrule\lastpage}% - \egroup - \fi} - -\presetlocalframed[\??ib] - -\def\interactiebalkc% - {\iflocation - \ifnum\lastpage>1\relax - \hbox to \@@ibbreedte - {\setupblackrules[\c!hoogte=\v!max,\c!diepte=\v!max]% - \def\goto##1% - {\doganaareenpagina{}{\blackrule[\c!breedte=##1]}}% - \dimen0=\@@ibbreedte\relax - \advance\dimen0 by -4em\relax - \!!counta=\lastpage - \advance\!!counta by -1 - \divide\dimen0 by \!!counta - \!!counta=\realpageno - \advance\!!counta by -1\relax - \!!widtha=\!!counta\dimen0\relax - \!!countb=\lastpage - \advance\!!countb by -\realpageno - \!!widthb=\!!countb\dimen0\relax - \startcolor[\locationcolor\@@ibkleur]% - \goto{1em}\firstpage - \hss - \goto{\!!widtha}\prevpage - \color[\@@ibcontrastkleur]{\blackrule[\c!breedte=1em]}% - \goto{\!!widthb}\nextpage - \hss - \goto{1em}\lastpage - \stopcolor}% - \fi - \fi} - -\def\interactiebalkd% - {\iflocation\ifshowingsubpage - \ifnum\nofsubpages>1\relax - \hbox - \bgroup - \stelinteractiein[\c!breedte=\!!zeropoint]% - \ifbalksymbool % beter: 3 chars assign en 3*box - \setbox0=\hbox{\gobackwardcharacter}% - \setbox2=\hbox{\gotosomewherecharacter}% - \setbox4=\hbox{\goforwardcharacter}% - \else - \setbox0=\hbox - {\vrule - \!!height\@@ibhoogte - \!!depth\@@ibdiepte - \!!width\@@ibbreedte}% - \setbox2=\copy0 - \setbox4=\copy0 - \fi - \startcolor[\locationcolor\@@ibkleur]% - \for\teller=1\to\nofsubpages\step1\do - {\bgroup - \increment(\teller,\firstsubpage)\relax - \decrement\teller\relax - \ifnum\teller<\realpageno\relax - \gotorealpage{}{}{\teller}{\copy0}\relax - \else\ifnum\teller=\realpageno\relax - \color - [\@@ibcontrastkleur] - {\gotorealpage{}{}{\teller}{\copy2}}% - \else - \gotorealpage{}{}{\teller}{\copy4}\relax - \fi\fi - \egroup - \hskip\@@ibafstand}% - \unskip - \stopcolor - \egroup - \fi - \fi\fi} - -\def\interactiebalke% KAN WORDEN GECOMBINEERD MET D - {\iflocation\ifshowingsubpage - \ifnum\nofsubpages>1\relax - \bgroup - \!!widthb=\@@ibafstand - \multiply\!!widthb by \nofsubpages - \advance\!!widthb by -\@@ibafstand % (n-1) - \!!widtha=\@@ibbreedte - \advance\!!widtha by -\!!widthb - \divide\!!widtha by \nofsubpages\relax - \ifdim\!!widtha<\@@ibafstand\relax - \interactiebalkf - \else - \stelinteractiein[\c!breedte=\!!zeropoint]% - \noindent - \hbox to \@@ibbreedte - \bgroup - \ifbalksymbool - \setbox0=\hbox{\gobackwardcharacter}% - \setbox2=\hbox{\gotosomewherecharacter}% - \setbox4=\hbox{\goforwardcharacter}% - \else - \setbox0=\hbox - {\vrule - \!!height\@@ibhoogte - \!!depth\@@ibdiepte - \!!width\!!widtha}% - \setbox2=\copy0 - \setbox4=\copy0 - \fi - \startcolor[\locationcolor\@@ibkleur]% - \for\teller=1\to\nofsubpages\step1\do - {\bgroup - \increment(\teller,\firstsubpage)\relax - \decrement\teller\relax - \ifnum\teller<\realpageno\relax - \gotorealpage{}{}{\teller}{\copy0}\relax - \else\ifnum\teller=\realpageno\relax - \color - [\@@ibcontrastkleur] - {\gotorealpage{}{}{\teller}{\copy2}}% - \else - \gotorealpage{}{}{\teller}{\copy4}\relax - \fi\fi - \egroup - \hss}% - \unskip - \stopcolor - \egroup - \fi - \egroup - \fi - \fi\fi} - -\def\interactiebalkf% !! KAN WORDEN GECOMBINEERD MET D !! - {\iflocation\ifshowingsubpage - \ifnum\nofsubpages>1\relax - \stelinteractiein[\c!breedte=\!!zeropoint]% - \noindent - \hbox to \@@ibbreedte - \bgroup - \!!countb=0 - \loop - \advance\!!countb by 1\relax - \!!countc=\nofsubpages - \divide\!!countc by \!!countb - \advance\!!countc by 1 - \!!widthb=\@@ibafstand - \multiply\!!widthb by \!!countc - \advance\!!widthb by -\@@ibafstand - \!!widtha=\@@ibbreedte - \advance\!!widtha by -\!!widthb - \divide\!!widtha by \!!countc - \ifdim\!!widtha<\@@ibafstand\relax - \repeat - \ifbalksymbool - \setbox0=\hbox{\gobackwardcharacter}% - \setbox2=\hbox{\gotosomewherecharacter}% - \setbox4=\hbox{\goforwardcharacter}% - \else - \setbox0=\hbox - {\vrule - \!!height\@@ibhoogte - \!!depth\@@ibdiepte - \!!width\!!widtha}% - \setbox2=\hbox - {\dimen0=\@@ibhoogte - \dimen2=\@@ibdiepte - \vrule - \!!height.5\dimen0 - \!!depth.5\dimen2 - \!!width\!!widtha}% - \ht2=\ht0 - \dp2=\dp0 - \setbox4=\copy0 - \fi - \def\goto##1##2% - {\ifnum##1=\realpageno\relax - \color - [\@@ibcontrastkleur] - {\gotorealpage{}{}{##1}{##2}}% - \else - \gotorealpage{}{}{##1}{##2}\relax - \fi}% - \startcolor[\locationcolor\@@ibkleur]% - \!!countc=\realpageno \advance\!!countc by -2\relax - \!!countd=\realpageno \advance\!!countd by 2\relax - \for\teller=\firstsubpage\to\lastsubpage\step1\do - {\!!doneafalse - \!!donebfalse - \ifnum\teller=\firstsubpage\relax \!!doneatrue \fi - \ifnum\teller=\lastsubpage\relax \!!doneatrue \fi - \ifnum\teller>\!!countc \ifnum\teller<\!!countd \!!doneatrue \fi\fi - \advance\!!countf by 1\relax - \ifnum\!!countf=\!!countb\relax \!!donebtrue \fi - \if!!donea % nog eens checken - \!!countf=0 - \goto\teller{\copy2}% - \hss - \else\if!!doneb - \!!countf=0 - \ifnum\teller<\realpageno\relax - \goto\teller{\copy0}% - \else\ifnum\teller>\realpageno\relax - \goto\teller{\copy2}% - \else - \goto\teller{\copy4}% - \fi\fi - \hss - \fi\fi}% - \unskip - \stopcolor - \egroup - \fi - \fi\fi} - -\def\interactiebalkb% - {\ifnum\lastpage>\firstpage\relax - \interactiebuttons - [\v!eerste \v!pagina, - \v!vorige \v!pagina, - \v!volgende\v!pagina, - \v!laatste \v!pagina]% - \fi} - -\def\interactiebalkg% - {\ifnum\lastsubpage>\firstsubpage\relax - \interactiebuttons - [\v!eerste \v!sub\v!pagina, - \v!vorige \v!sub\v!pagina, - \v!volgende\v!sub\v!pagina, - \v!laatste \v!sub\v!pagina]% - \fi} - -\def\complexinteractiebalk[#1]% - {\doifelse{#1}{\v!reset}% - {\global\setbox\meterbox=\box\voidb@x}% - {\bgroup - \iflocation - \checksubpages % goes wrong / loads \numberofpages too - \getparameters[\??ib][#1]% - \doif{\@@ibstatus}{\v!start} - {\startinteractie - \processaction - [\@@ibvariant] - [d=>{\getparameters[\??ib][\c!breedte=.5em,\c!hoogte=.5em,#1]}, - e=>{\getparameters[\??ib][\c!hoogte=.5em,\c!afstand=.2em,#1]}, - f=>{\getparameters[\??ib][\c!hoogte=.5em,\c!afstand=.2em,#1]}]% - \doifelse{\@@ibsymbool}{\v!ja} - {\balksymbooltrue} - {\balksymboolfalse}% - \getvalue{interactiebalk\@@ibvariant}% - \stopinteractie}% - \fi - \egroup}} - -\unexpanded\def\interactiebalk% - {\complexorsimpleempty{interactiebalk}} - -\def\stelinteractiebalkin% - {\dodoubleargument\getparameters[\??ib]} - -%I n=Profielen -%I c=\definieerprofiel,\startprofiel,\volgprofiel -%I -%I Er kunnen een gericht leesprofiel worden gedefinieerd. -%I Daartoe worden delen van de tekst gemerkt met commando: -%I -%I \startprofiel[label,label,...] -%I \stopprofiel -%I -%I Een profiel wordt vervolgens samengesteld uit gemerkte -%I teksten: -%I -%I \definieerprofiel[naam,naam][label,label,...] -%I -%I en kan worden gevolgd met: -%I -%I \volgprofiel{tekst}[naam] -%I -%I Dit laatste commando is te vergelijken met \naar, met dat -%I verschil dat naar een serie teksten wordt gesprongen. -%P -%I Profielen kunnen worden getest. In dat geval worden de -%I begin- en eindpunten in de tekst aangegeven. De labels -%I zijn actief, zodat snel heen en weer gesprongen kan worden. -%I -%I \stelprofielenin[optie=] -%I -%I Hierbij kan optie de waarde 'test' hebben. - -% Er wordt vooralsnog uitgegaan van een symmetrische -% start-stop situatie. - -\def\c!profiel!! {profiel:} % brrr -\def\c!versie!! {versie:} - -\def\dodefinieerprofiel[#1][#2]% - {\iflocation - \def\dododefinieerprofiel##1% - {\def\dodododefinieerprofiel####1% - {\doifdefinedelse{\c!profiel!!####1}% - {\edef\!!stringa{\getvalue{\c!profiel!!####1}}% - \setevalue{\c!profiel!!####1}{\!!stringa,##1}}% - {\setevalue{\c!profiel!!####1}{##1}}}% - \processcommalist[#2]\dodododefinieerprofiel}% - \processcommalist[#1]\dododefinieerprofiel - \fi} - -\def\definieerprofiel% - {\dodoubleargument\dodefinieerprofiel} - -% Als met \getpar wordt gewerkt, dan moet \next worden toegepast. - -\def\profilepage{} - -\let\dosetprofilepage=\relax -\let\dogetprofilepage=\relax - -\def\processprofile[#1]#2#3% - {\iflocation - \par % needed for pdftex - \bgroup - \dosetprofilepage - \dogetprofilepage - \def\processoneprofile##1##2% - {\ExpandBothAfter\doifinsetelse{##2}{\processedprofiles}% - {\doifsomething{##1}{(##1)}}% - {\addtocommalist{##2}\processedprofiles - ##1\relax - #3{##2}{\hsize}{\profilepage}}}% - \def\processedprofiles{}% - \def\doprocessprofile##1% - {\doifelse{\@@pfoptie}{\v!test}% - {\goodbreak\blanko\nobreak\tt[\spatie - #2 profiel\spatie ##1:\spatie - \doifdefinedelse{\c!profiel!!##1}% - {\def\dodoprocessprofile####1% - {\processoneprofile - {\naar{####1}[\c!profiel!!####1]}% - {####1}% - \spatie}% - \processcommacommand - [\getvalue{\c!profiel!!##1}]\dodoprocessprofile}% - {- }% - ]\nobreak\blanko}% - {\doifdefined{\c!profiel!!##1}% - {\def\dodoprocessprofile####1% - {\processoneprofile{}{####1}}% - \processcommacommand - [\getvalue{\c!profiel!!##1}]\dodoprocessprofile}}}% - \processcommalist[#1]\doprocessprofile - \egroup - \par % needed for pdftex - \fi} - -\def\startprofiel[#1]% - {\iflocation - \bgroup - \addtocommalist{#1}\actualprofile - \def\stopprofiel% - {\processprofile[#1]\v!stop\doendofprofile - \egroup}% - \DoAfterFi\processprofile[#1]\v!start\dobeginofprofile - \fi} - -\let\stopprofiel=\relax - -\def\dovolgprofiel#1[#2]% - {\iflocation - \hbox - {\dostartgoto - \data - {\dolocationattributes{\??ia}{#1\presetgoto}}% - \start - \dostartgotoprofile - {\number\buttonwidth}{\number\buttonheight} - {#2}% - \stop - \dostopgotoprofile - \dostopgoto}% - \else - {#1}% - \fi} - -\def\volgprofiel#1[#2]% - {\iflocation - \doif{\@@pfoptie}{\v!test}{\pagereference[\c!profiel!!#2]}% - \dovolgprofiel{#1}[#2]% - \fi} - -\def\stelprofielenin% - {\dodoubleargument\getparameters[\??pf]} - -% Als er nog geen tekst op de pagina staat, dan heeft het -% profiel betrekking op het bovenstaande, dus soms een vorige -% pagina! Vreemd, omdat PDF paginagewijs werkt. Gelukkig -% biedt /page een oplossing. Echter: expansie van een -% \special kan niet worden uitgesteld, zodat alleen een -% two-pass een oplossing vormt. Het onderstaande kan komen -% te vervallen als Acrobat dit ondervangt. Het scheelt een -% pass en een lijst. -% -% Er kunnen eventueel twee lijsten worden gebruikt. Een voor -% het begin (start) en een voor het eind (stop). Nu staat -% alles in een lijst. - -\definetwopasslist{\s!profile} - -\newcounter\currentprofile - -\def\dosetprofilepage% - {\doglobal\increment\currentprofile - \edef\docommando% - {\writeutilitycommand% - {\twopassentry% - {\s!profile}% - {\currentprofile}% - {\noexpand\realfolio}}}% - \docommando} - -\def\dogetprofilepage% - {\gettwopassdata{\s!profile}% - \let\profilepage=\twopassdata} - -%I n=Versies -%I c=\definieerversie,\stelversiesin,\startversie -%I c=\selecteerversie,\markeerversie,\volgversie -%I -%I Het mechanisme om wijzigingen in een tekst te markeren en -%I selecteren sluit aan op dat van profielen. -%I -%I Een deel van de tekst kan worden gemarkeerd met ofwel -%I -%I \startversie[nr,nr,...] -%I \stopversie -%I -%I of tussen @+ ...... @-. Eventueel mogen achter @+ nummers -%I worden opgenomen: @+nr,nr,... ...... @-. -%I -%I Aldus gemerkte tekst kan in een afwijkende letter worden -%I weergegeven, bijvoorbeeld \ss. Daarbij wordt de laagste -%I nog te mrkeren versie opgegeven: -%I -%I \stelversiesin[nummer=,letter=] -%I -%I Een versienummer mag punten (.) bevatten. Deze worden -%I voor het vergelijken niet meegenomen. Oppassen dus: 1.10 -%I wordt 110 en 2.2 wordt 22 en moet -%P -%I Het is mogelijk alleen de 'recente' wijzigingen te -%I verwerken. Dit gaat in twee slagen: -%I -%I \markeerversie (eerste slag) -%I \selecteerversie (tweede slag) -%I -%I Er is gekozen voor het bewust markeren, omdat het -%I markeren gaat ten koste van de omvang van de hulpfile. -%P -%I Evenals profielen, kunnen ook versie worden gevolgd. Ook -%I hier dient eerst een definitie plaats te vinden: -%I -%I \definieerversie[naam][nummer,nummer,nummer] -%I -%I waarna gebruik kan worden gemaakt van: -%I -%I \volgversie{tekst}[naam] -%I -%I Er is ook een combinatie (doorsnede) mogelijk van -%I profielen en versies: -%I -%I \volgprofielversie{tekst}[naam profiel][naam versie] - -\newcounter\versionlevel -\newcounter\versionorder - -\newif\ifrecentversion - -\let\oldatcharacter=@ - -\def\minimumversion{0} -\def\actualversion{0} - -\def\dostelversiesin[#1]% - {\getparameters[\??ve][#1] - \stripcharacter.\from\@@venummer\to\minimumversion - \setversion} - -\def\stelversiesin% - {\dosingleargument\dostelversiesin} - -\definetwopasslist{\s!versionbegin} -\definetwopasslist{\s!versionend} - -\def\actualprofile{} - -\def\doresetpageversion% - {\edef\docommando% - {\writeutilitycommand% - {\twopassentry% - {\s!versionend}% - {\versionorder}% - {\noexpand\realfolio}}}% - \docommando} - -\def\dosetpageversion#1% - {\recentversiontrue - \doglobal\increment\versionorder\relax - \edef\docommando% - {\writeutilitycommand% - {\twopassentry% - {\s!versionbegin}% - {\versionorder}% - {\noexpand\realfolio}}}% - \docommando - \let\resetpageversion=\doresetpageversion} - -\def\recentcontributions{} - -\def\checkrecentcontributions% - {\gettwopassdata{\s!versionbegin}% - \iftwopassdatafound - \!!counta=\twopassdata\relax - \gettwopassdata{\s!versionend}% - \iftwopassdatafound - \!!countb=\twopassdata\relax - \doglobal\increment\versionorder\relax - \writeutilitycommand% - {\twopassentry% - {\s!versionbegin}% - {\versionorder}% - {\the\!!counta}}% - \writeutilitycommand% - {\twopassentry% - {\s!versionend}% - {\versionorder}% - {\the\!!countb}}% - \for\teller=\!!counta\to\!!countb\step1\do% - {\@EA\doglobal\@EA\addtocommalist\@EA{\teller}{\recentcontributions}}% - \let\next=\checkrecentcontributions - \else - \let\next=\relax - \fi - \else - \let\next=\relax - \fi - \next} - -\def\docheckpageversion% - {\ExpandBothAfter\doifinsetelse{\realfolio}{\recentcontributions} - {\geselecteerdtrue}% - {\geselecteerdfalse}} - -\let\setpageversion = \gobbleoneargument -\let\resetpageversion = \relax -\let\checkpageversion = \relax - -\def\complexstartversie[#1]% - {\bgroup - \doifelse{\actualprofile}{}% - {\startprofiel[#1]}% - {\startprofiel[#1,\actualprofile]}% - \def\docomplexstartversie##1% - {\stripcharacter.\from##1\to\actualversion - \ifnum\versionlevel>0\relax - \ifnum\actualversion=0\relax - \setpageversion\actualversion % unknown version - \else - \ifnum\actualversion<\minimumversion\relax - \relax % old version - \else - \setpageversion\actualversion % new version - \fi - \fi - \fi}% - \doglobal\increment\versionlevel\relax - \doifelsenothing{#1} - {\docomplexstartversie{0}}% - {\processcommalist[#1]\docomplexstartversie}} - -\def\startversie% - {\complexorsimpleempty{startversie}} - -\def\stopversie% - {\stopprofiel - \doglobal\decrement\versionlevel - \ifnum\versionlevel<0\relax - \showmessage{\m!versions}{1}{}% - \else - \resetpageversion - \egroup - \fi} - -\bgroup -\catcode`@=\active -\gdef\setversion% - {\catcode`@=\active % we can't use \@@active here - \long\def@##1##2 % - {\ifx##1+% - \startversie[##2]% - \else\ifx##1-% - \stopversie - \else - \oldatcharacter##1##2 % - \fi\fi}} -\egroup - -\def\markeerversie% - {\showmessage{\m!versions}{2}{}% - \let\setpageversion=\dosetpageversion - \let\resetpageversion=\relax - \let\checkpageversion=\relax} - -\def\selecteerversie% - {\checkrecentcontributions - \showmessage{\m!versions}{3}{\recentcontributions}% - \let\setpageversion=\gobbleoneargument - \let\resetpageversion=\relax - \let\checkpageversion=\docheckpageversion - \setversion} - -\def\dodefinieerversie[#1][#2]% - {\setvalue{\c!versie!!#1}{#2}% - \definieerprofiel[#1][#2]} - -\def\definieerversie% - {\dodoubleargument\dodefinieerversie} - -\def\volgversie% - {\volgprofiel} - -\def\volgprofielversie#1[#2][#3]% - {\def\docommando##1% - {\definieerprofiel[#2#3][##1]}% - \processcommacommand[\getvalue{\c!versie!!#3}]\docommando - \volgprofiel#1[#2#3]} - -\newcounter\currentpagetransition - -\definecomplexorsimple\stelpaginaovergangenin - -\def\simplestelpaginaovergangenin% - {\complexstelpaginaovergangenin[\pagetransitions]} - -\def\complexstelpaginaovergangenin[#1]% - {\doifsomething{#1} - {\doifelse{#1}{\v!reset} - {\let\setpagetransition=\relax} - {\def\setpagetransition% - {\doifelse{#1}{\v!willekeurig} - {\expanded{\getcommalistsize[\pagetransitions]}% - \getrandomnumber{\currentpagetransition}{1}{\commalistsize}% - \expanded{\getfromcommalist[\pagetransitions][\currentpagetransition]}} - {\doglobal\increment\currentpagetransition - \expanded{\getfromcommalist[#1][\currentpagetransition]}}% - \ifx\commalistelement\empty - \doglobal\newcounter\currentpagetransition - \setpagetransition - \else\iflocation - %\message{[\commalistelement]}\wait - \expanded{\dosetpagetransition{\commalistelement}}% - \fi\fi}}}} - -\prependtoks \setpagetransition \to \everyshipout - -% temporary here - -%D \startbuffer -%D \dorecurse{10} -%D {\horizontalpositionbar -%D \pos\recurselevel \min1 \max10 -%D \token\framed{\recurselevel}% -%D \\} -%D -%D \hbox to 15em -%D {\hss -%D \dorecurse{10} -%D {\verticalpositionbar\pos\recurselevel\min1\max10\token\blokje\\ -%D \hss}} -%D \stopbuffer - -\def\horizontalpositionbar\pos#1\min#2\max#3\token#4\\% - {\hbox to \hsize - {\hskip\!!zeropoint\!!plus #1\!!fill - \hskip\!!zeropoint\!!plus-#2\!!fill - #4\relax - \hskip\!!zeropoint\!!plus #3\!!fill - \hskip\!!zeropoint\!!plus-#1\!!fill}} - -\def\verticalpositionbar\pos#1\min#2\max#3\token#4\\% - {\vbox to \vsize - {\vskip\!!zeropoint\!!plus #1\!!fill - \vskip\!!zeropoint\!!plus-#2\!!fill - \hbox{#4}\relax - \vskip\!!zeropoint\!!plus #3\!!fill - \vskip\!!zeropoint\!!plus-#1\!!fill}} - -\def\horizontalgrowingbar\pos#1\min#2\max#3\height#4\depth#5\\% - {\hbox to \hsize - {\scratchcounter=#1\relax - \advance\scratchcounter by -#2\relax - \advance\scratchcounter by 1\relax - \leaders\vrule\hskip\!!zeropoint\!!plus \scratchcounter\!!fill - \vrule\!!width\!!zeropoint\!!height#4\!!depth#5\relax - \hskip\!!zeropoint\!!plus #3\!!fill - \hskip\!!zeropoint\!!plus-#1\!!fill}} - -\def\verticalgrowingbar\pos#1\min#2\max#3\width#4\\% - {\vbox to \vsize - {\scratchcounter=#1\relax - \advance\scratchcounter by -#2\relax - \advance\scratchcounter by 1\relax - \leaders\hrule\vskip\!!zeropoint\!!plus\scratchcounter\!!fill - \hrule\!!width#4\!!height\!!zeropoint\!!depth\!!zeropoint - \vskip\!!zeropoint\!!plus #3\!!fill - \vskip\!!zeropoint\!!plus-#1\!!fill}} - -\definieerinteractiemenu - [\v!rechts] - [\v!rechts] - [\c!voor=, - \c!na=\vfil, - \c!tussen=\blanko, - \c!afstand=12pt, - \c!links=\hss, - \c!rechts=\hss, - \c!breedte=\rechterrandbreedte, - \c!hoogte=\v!ruim] - -\definieerinteractiemenu - [\v!links] - [\v!links] - [\c!voor=, - \c!na=\vfil, - \c!tussen=\blanko, - \c!afstand=12pt, - \c!links=\hss, - \c!rechts=\hss, - \c!breedte=\linkerrandbreedte, - \c!hoogte=\v!ruim] - -\definieerinteractiemenu - [\v!onder] - [\v!onder] - [\c!voor=\vss, - \c!na=\vss, - \c!midden=\hfil, - \c!afstand=12pt, - \c!breedte=\v!passend, - \c!hoogte=\v!ruim] - -\definieerinteractiemenu - [\v!boven] - [\v!boven] - [\c!voor=\vss, - \c!na=\vss, - \c!midden=\hfil, - \c!afstand=12pt, - \c!breedte=\v!passend, - \c!hoogte=\v!ruim] - -\stelinteractiemenuin - [\v!links,\v!rechts,\v!boven,\v!onder] - [\c!offset=.25em, - \c!kader=\v!aan, - \c!achtergrond=, - \c!achtergrondkleur=, - \c!achtergrondraster=\@@rsraster, - \c!letter=\@@ialetter, - \c!kleur=\@@iakleur, - \c!status=\v!start, - \c!zelfdepagina=\v!ja, - \c!onbekendeverwijzing=\v!leeg, - \c!bovenoffset=\!!zeropoint, - \c!onderoffset=\!!zeropoint, - \c!linkeroffset=\!!zeropoint, - \c!rechteroffset=\!!zeropoint] - -\stelbovenin [\v!tekst] [\c!middentekst={\interactiemenus[\v!boven]}] -\stelonderin [\v!tekst] [\c!middentekst={\interactiemenus[\v!onder]}] - -\def\plaatsrechterrandblok {\interactiemenus[\v!rechts]} -\def\plaatslinkerrandblok {\interactiemenus[\v!links]} - -\stelinteractieschermin - [\c!breedte=\printpapierbreedte, - \c!hoogte=\printpapierhoogte, - \c!rugoffset=\!!zeropoint, - \c!kopoffset=\!!zeropoint, - \c!rugwit=\rugwit, - \c!kopwit=\kopwit, - \c!optie=\c!min] - -\stelexternefigurenin - [\c!hokjes=\v!uit, - \c!ymax=24, - \c!xmax=] - -\stelbuttonsin - [\c!breedte=\v!passend, - \c!hoogte=\v!ruim, - \c!offset=0.25em, - \c!kader=\v!aan, - \c!achtergrond=, - \c!achtergrondraster=\@@rsraster, - \c!achtergrondkleur=, - \c!letter=\@@ialetter, - \c!kleur=\@@iakleur, - \c!zelfdepagina=\v!ja, - \c!onbekendeverwijzing=\v!leeg] - -\stelinteractiebalkin - [\c!status=\v!start, - \c!variant=a, - \c!symbool=\v!nee, - \c!breedte=\rechterrandbreedte, - \c!hoogte=\v!ruim, - \c!diepte=\!!zeropoint, - \c!afstand=1em, - \c!stap=1, - \c!kleur=\@@iakleur, - \c!contrastkleur=\@@iacontrastkleur, - \c!kader=\v!aan, - \c!achtergrond=, - \c!achtergrondraster=\@@rsraster, - \c!achtergrondkleur=] - -\stelsynchronisatiebalkin - [\c!variant=\v!pagina, - \c!breedte=\rechterrandbreedte, - \c!letter=\@@ialetter, - \c!kleur=\@@iakleur, - \c!achtergrond=, - \c!achtergrondraster=\@@rsraster, - \c!achtergrondkleur=] - -\stelsynchronisatiein - [\c!status=\v!stop] - -\stelversiesin - [\c!nummer=1, - \c!letter=\ss, - \c!kleur=] - -\stelprofielenin - [\c!optie=] - -\stelprogrammasin - [\c!gebied=] - -\stelpaginaovergangenin - [\v!reset] - -\protect - -\endinput +%D \module
+%D [ file=core-01d,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=1D (to be split),
+%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 Core Macros (d)}
+
+\unprotect
+
+\startmessages dutch library: interactions
+ title: interactie
+ 1: aspect ratio -- x -- (b x h)
+ 2: actief
+ 3: niet actief
+ 4: geen paginasynchronisatie (--) in hmode
+\stopmessages
+
+\startmessages english library: interactions
+ title: interaction
+ 1: aspect ratio -- x -- (b x h)
+ 2: active
+ 3: inactive
+ 4: no pagesynchronisation (--) in hmode
+\stopmessages
+
+\startmessages german library: interactions
+ title: Interaktion
+ 1: Aspekt des Verhaeltnis -- x -- (B x H)
+ 2: aktiv
+ 3: inaktiv
+ 4: keine Seitensynchronisation (--) im hmode
+\stopmessages
+
+\startmessages dutch library: versions
+ title: versie
+ 1: er mankeert een @+
+ 2: markeren pagina's
+ 3: geselecteerde pagina's: --
+\stopmessages
+
+\startmessages english library: versions
+ title: version
+ 1: missing @+
+ 2: marking pages
+ 3: selected pages: --
+\stopmessages
+
+\startmessages german library: versions
+ title: Version
+ 1: fehlendes @+
+ 2: Erstelle Seiten
+ 3: Ausgewaehlte Seiten: --
+\stopmessages
+
+%I n=Interacteren
+%I c=\stelinteractiein,\stelinteractiemenuin
+%I c=\definieerinteractiemenu,\startinteractiemenu
+%I c=\blokkeerinteractiemenu,\geefinteractiemenuvrij
+%I c=\stelinteractieschermin,\scherm
+%I
+%I Overzichten en verwijzingen kunnen worden voorzien van
+%I voor DVIWINDO en Acrobat betekenisvolle codes. De volgende
+%I commando's zijn (voorlopig) beschikbaar:
+%I
+%I \stelinteractiein[status=,menu=,letter=,kleur=,strut=,
+%I breedte=,hoogte=,diepte=,pagina=]
+%I
+%I Hierbij hebben 'letter' en 'kleur' betrekking op in de tekst
+%I gemarkeerde woorden waar een verwijzing achter zit. Status
+%I kan 'start' of 'stop' zijn en het 'menu' kan 'aan' of 'uit'
+%I staan. Met 'pagina=ja' dwingen we pagina verwijzingen af.
+%I
+%I Zonodig kunnen een 'titel', 'subtitel', 'auteur' en 'datum'
+%I worden ingesteld.
+%P
+%I Een menu wordt gedefinieerd met het commando:
+%I
+%I \definieerinteractiemenu[naam][plaats][instellingen]
+%I
+%I waarbij in plaats van de instellingen de naam van een
+%I reeds gedefinieerd menu kan worden opgegeven.
+%I
+%I Mogelijke plaatsen zijn 'boven', 'onder', 'links' en
+%I 'rechts'.
+%P
+%I De inhoud van een menu wordt gedefinieerd met:
+%I
+%I \definieerinteractiemenu[naam][inhoud]
+%I
+%I Een voorbeeld van zo'n definitie is:
+%I
+%I \definieerinteractiemenu
+%I [links]
+%I [{inhoud[inhoud]},
+%I {formules[formules]},
+%I {index[index]}]
+%I
+%I De accolades zijn essentieel! De verwijzingen dienen met de
+%I daarvoor gebruikelijke commando's te worden aangemaakt.
+%I Verwijzingen zoals [inhoud] en [index] zijn automatisch
+%I beschikbaar.
+%P
+%I Naast [inhoud], [index] en andere voor de hand liggende
+%I verwijzingen zijn beschikbaar:
+%I
+%I [eerstepagina]
+%I [vorigepagina]
+%I [volgendepagina]
+%I [laatstepagina]
+%P
+%I Een alternatieve manier om menu's te definieren levert
+%I het commando
+%I
+%I \startinteractiemenu
+%I \stopinteractiemenu
+%I
+%I Hierbinnen zijn de volgende commando's mogelijk:
+%I
+%I \raw tekst \\ : ongeformatteerde tekst
+%I \but[ref] tekst \\ : interactief menu item
+%I \nop \\ : dummy menu item
+%I \txt tekst \\ : niet interactief menu item (omlijnd)
+%I \rul tekst \\ : niet interactief menu item
+%I \com commandos \\ : commando's
+%P
+%I Instellingen kunnen ook apart plaatsvinden met:
+%I
+%I \stelinteractiemenuin[naam][voor=,na=,tussen=,breedte=,
+%I kader=,letter=,status=,achtergrond=,achtergrondkleur=,
+%I achtergrondraster=]
+%I
+%I Aan 'voor', 'na' en 'tussen' kunnen commando's worden
+%I toegekend, zoals: \hfill, \blanko en \hskip1em. Bij
+%I 'breedte' kan een maat, 'passend' of 'ruim' worden
+%I meegegeven. Het kader kan 'aan' of 'uit' staan.
+%I
+%I De status kan 'start', 'stop', 'leeg' of 'geen' zijn. De
+%I instelling 'leeg' geldt slechts een pagina. De instelling
+%I 'geen' heeft alleen zin bij meerdere menus naast cq. boven
+%I elkaar.
+%P
+%I Het is mogelijk een menu te (de)blokkeren. Dit gebeurt met
+%I behulp van het referentie-mechanisme. Het commando luidt:
+%I
+%I \blokkeerinteractiemenu[plaats][verwijzingen]
+%I \geefinteractiemenuvrij[plaats][verwijzingen]
+%I
+%I De verwijzingen moeten worden gescheiden door comma's.
+%I Wanneer geen verwijzingen worden meegegeven, wordt de
+%I blokkade opgeheven.
+%P
+%I Eventueel kunnen tussen menuitems commando's worden
+%I opgenomen,
+%I
+%I \definieerinteractiemenu
+%I [links]
+%I [{alfa[eerste]},
+%I {beta[tweede]},
+%I {{\blanko[forceer,3*groot]}},
+%I {gamma[derde]},
+%I {{\vfil}},
+%I {omega[laatste]}]
+%I
+%I De extra {} zijn nodig, omdat anders onduidelijkheid is
+%I of het commando's zijn of verwijzingen.
+%P
+%I De afmetingen van het interactiescherm kunnen worden
+%I ingesteld met het commando:
+%I
+%I \stelinteractieschermin[breedte=,hoogte=,rugwit=,
+%I kopwit=,optie=]
+%I
+%I Dit is alleen nodig als men het interactieprogramma wil
+%I dwingen de tekst op een afwijkend papierformaat weer te
+%I geven. Als hoogte en breedte kan 'passend' worden
+%I opgegeven, in dat geval wordt uitgegaan van de
+%I instellingen bij \stellayoutin.
+%I
+%I Er kan (in acrobat) met een vol scherm worden opgestart
+%I met optie=max.
+%P
+%I Er zijn meerdere menu's naast elkaar mogelijk. Eerst
+%I wordt een menu gedefinieerd met:
+%I
+%I \definieerinteractiemenu[naam][plaats][instellingen]
+%I
+%I De afstand tussen menus wordt ingesteld met 'afstand'.
+%I Als afstand=overlay dan vallen menus over elkaar.
+
+\def\setupinteractionscreens%
+ {}
+
+\def\complexstelinteractieschermin[#1]%
+ {\getparameters[\??sc][#1]%
+ \def\setupinteractionscreens% met a, b en \number
+ {\bgroup
+ \doifelse{\@@scbreedte}{\v!passend}
+ {\!!widtha=\linkerrandbreedte
+ \advance\!!widtha by \linkerrandafstand
+ \advance\!!widtha by \paginascheiding
+ \advance\!!widtha by \linkermargebreedte
+ \advance\!!widtha by \linkermargeafstand
+ \ifdim\rugwit>\!!widtha\ifdim\rugwit>\!!zeropoint\relax
+ \advance\rugwit by -\!!widtha
+ \fi\fi
+ \advance\!!widtha by \zetbreedte
+ \advance\!!widtha by \rechtermargeafstand
+ \advance\!!widtha by \rechtermargebreedte
+ \advance\!!widtha by \paginascheiding
+ \advance\!!widtha by \rechterrandafstand
+ \advance\!!widtha by \rechterrandbreedte
+ \scratchdimen=\@@scrugwit
+ \advance\scratchdimen by \@@scrugoffset
+ \advance\!!widtha by 2\scratchdimen}
+ {\!!widtha=\@@scbreedte}%
+ \doifelse{\@@schoogte}{\v!passend}
+ {\!!heighta=\bovenhoogte
+ \advance\!!heighta by \bovenafstand
+ \ifdim\kopwit>\!!heighta\ifdim\kopwit>\!!zeropoint\relax
+ \advance\kopwit by -\!!heighta
+ \fi\fi
+ \advance\!!heighta by \zethoogte
+ \advance\!!heighta by \onderafstand
+ \advance\!!heighta by \onderhoogte
+ \scratchdimen=\@@sckopwit
+ \advance\scratchdimen by \@@sckopoffset
+ \advance\!!heighta by 2\scratchdimen}
+ {\!!heighta=\@@schoogte}%
+ \doifelse{\@@scoptie}{\v!max}
+ {\doif{\@@lyplaats}{\v!midden}
+ {\scratchdimen=\printpapierhoogte
+ \advance\scratchdimen by -\papierhoogte
+ \divide\scratchdimen by 2
+ \advance\kopoffset by \scratchdimen
+ \scratchdimen=\printpapierbreedte
+ \advance\scratchdimen by -\papierbreedte
+ \divide\scratchdimen by 2
+ \advance\rugoffset by \scratchdimen}%
+ \!!counte=1}
+ {\!!counte=0}%
+ \showmessage{\m!interactions}{1} % niet waterdicht
+ {\@EA\withoutpt\the\!!widtha,\@EA\withoutpt\the\!!heighta}%
+ \dosetupscreen
+ {\number\rugoffset}{\number\kopoffset}
+ {\number\!!widtha}{\number\!!heighta}
+ {\the\!!counte}%
+ \dosetupidentity
+ {\@@iatitel}
+ {\@@iasubtitel}
+ {\@@iaauteur}
+ {CONTEXT / PRAGMA ADE / HASSELT NL / pragma@pi.net / \jobname.tex}
+ {\@@iadatum}
+ \egroup}}
+
+\def\simplestelinteractieschermin%
+ {\setupinteractionscreens}
+
+\def\stelinteractieschermin%
+ {\complexorsimple{stelinteractieschermin}}
+
+%D Due to requests I finally decided to support bookmarks, a
+%D driver dependant way of showing tables of content. The most
+%D simple way of support is hooking bookmark generation into
+%D the existing list mechanisms. That way users can generate
+%D bookmarks automatically, although its entirely valid to add
+%D bookmarks by defining alternative ones. These will be added
+%D at the appropriate place in the list.
+
+% \hoofdstuk{het eerste hoofdstuk}
+%
+% \bookmark {de eerste bookmark} % optional overuled hoofdstuk
+%
+% .... text ....
+%
+% \placebookmarks [hoofdstuk,paragraaf,subparagraaf,subsubparagraaf,mylist]
+% [open list]
+%
+% \bookmark[mylist]{whatever}
+
+\def\@@bookmark {bm::}
+\def\@@booklevel{bl::}
+\def\@@bookcount{bc::}
+
+\definieerlijst[\@@bookmark]
+
+\appendtoks\flushpostponedbookmark\to\everypar
+\appendtoks\flushpostponedbookmark\to\neverypar
+
+\let\flushpostponedbookmark\relax
+
+\def\simplebookmark#1%
+ {\ifx\flushpostponedbookmark\relax \else
+ \bgroup
+ \convertargument#1\to\ascii
+ \writestatus{system}{clashing bookmarks: \ascii}% ECHTE MESSAGE MAKEN
+ \egroup
+ \fi
+ \gdef\flushpostponedbookmark%
+ {\global\let\flushpostponedbookmark\relax
+ \schrijfnaarlijst[\@@bookmark]{}{#1}}}
+
+\def\complexbookmark[#1]#2%
+ {\schrijfnaarlijst[#1]{}{#2}}
+
+\definecomplexorsimple\bookmark
+
+%\def\insertbookmark[#1]#2%
+% {\bgroup
+% \doifreferencefoundelse{#1}
+% {\doinsertbookmark{0}{0}{#2}{\currentrealreference}}{1}
+% {\unknownreference{#1}}%
+% \egroup}
+
+\newif\iftracebookmarks \tracebookmarksfalse
+
+\def\placebookmarks%
+ {\dodoubleempty\doplacebookmarks}
+
+\def\doplacebookmarks[#1][#2]%
+ {\iflocation
+ \iffirstargument
+ \bgroup
+ \ifsecondargument
+ \edef\openbookmarklist{#2}%
+ \else
+ \let\openbookmarklist=\empty
+ \fi
+ \global\let\bookmarklevellist=\empty
+ \def\bookmarklevelcount{0}%
+ \doprocessbookmarks[#1]\dogetbookmarkelement
+ \dolijstelement{}{}{}{}{}{}% needed to finish the first pass
+ \doprocessbookmarks[#1]\doputbookmarkelement
+ \flushbookmark
+ \egroup
+ \else
+ \expanded{\placebookmarks\@EA[\getvalue{\??ih\v!inhoud\c!lijst}]}%
+ \fi
+ \fi}
+
+\def\doprocessbookmarks[#1]#2%
+ {\let\dolijstelement=#2\relax
+ \scratchcounter=0
+ \def\docommando##1%
+ {\advance\scratchcounter by 1
+ \getlistlevel[##1]\listlevel{\the\scratchcounter}%
+ \setxvalue{\@@bookcount\the\scratchcounter}{1}%
+ \setxvalue{\@@booklevel##1}{\listlevel}}%
+ \processcommalist[#1]\docommando
+ \setxvalue{\@@bookcount0}{1}%
+ \global\chardef\currentbookmarklevel=0
+ \global\chardef\previousbookmarklevel=0
+ \doutilities{#1,\@@bookmark}{\jobname}{#1}{}{}}
+
+\def\dodogetbookmarkelement#1#2#3#4#5#6%
+ {%\doifsomething{#1}
+ % {\global\chardef\currentbookmarklevel=\getvalue{\@@booklevel#1}\relax}%
+ \doifelsenothing{#1}
+ {\global\chardef\currentbookmarklevel=0\relax}
+ {\global\chardef\currentbookmarklevel=\getvalue{\@@booklevel#1}\relax}%
+ \ifnum\currentbookmarklevel>\previousbookmarklevel
+ \setxvalue{\@@bookcount\the\currentbookmarklevel}{1}\relax
+ \else\ifnum\currentbookmarklevel<\previousbookmarklevel
+ \bgroup
+ \!!counta=\previousbookmarklevel
+ \doloop
+ {\let\bookmarktag=\empty
+ \!!countb=\!!counta
+ \advance\!!countb by -1
+ \dorecurse{\!!countb}
+ {\edef\bookmarktag%
+ {\bookmarktag\getvalue{\@@bookcount\recurselevel}:}}%
+ \edef\bookmarklevelcount%
+ {\getvalue{\@@bookcount\the\!!counta}}%
+ \xdef\bookmarklevellist%
+ {\bookmarklevellist/\bookmarktag:\bookmarklevelcount/}%
+ \advance\!!counta by -1
+ \ifnum\!!counta=\currentbookmarklevel
+ \exitloop
+ \fi}%
+ \egroup
+ \@EA\doglobal\@EA\increment\csname \@@bookcount\the\currentbookmarklevel\endcsname\relax
+ \else
+ \@EA\doglobal\@EA\increment\csname \@@bookcount\the\previousbookmarklevel\endcsname\relax
+ \fi\fi
+ \global\chardef\previousbookmarklevel=\currentbookmarklevel}
+
+\def\getbookmarklevelcount%
+ {\@EA\def\@EA\docommando\@EA[\@EA##\@EA1\@EA/\bookmarktag:##2/##3]%
+ {\def\bookmarklevelcount{##2}}%
+ \@EA\@EA\@EA\docommando\@EA\@EA\@EA[\@EA\bookmarklevellist\@EA/\bookmarktag:0/]}
+
+\def\dodoputbookmarkelement#1#2#3#4#5#6%
+ {%\doifsomething{#1}
+ % {\global\chardef\currentbookmarklevel=\getvalue{\@@booklevel#1}\relax}%
+ \doifelsenothing{#1}
+ {\global\chardef\currentbookmarklevel=0\relax}
+ {\global\chardef\currentbookmarklevel=\getvalue{\@@booklevel#1}\relax}%
+ \ifnum\currentbookmarklevel>\previousbookmarklevel
+ \setxvalue{\@@bookcount\the\currentbookmarklevel}{1}\relax
+ \else\ifnum\currentbookmarklevel<\previousbookmarklevel
+ \@EA\doglobal\@EA\increment\csname \@@bookcount\the\currentbookmarklevel\endcsname\relax
+ \else
+ \@EA\doglobal\@EA\increment\csname \@@bookcount\the\previousbookmarklevel\endcsname\relax
+ \fi\fi
+ \let\bookmarktag=\empty
+ \!!countb\currentbookmarklevel
+ \dorecurse{\!!countb}
+ {\edef\bookmarktag%
+ {\bookmarktag\getvalue{\@@bookcount\recurselevel}:}}%
+ \getbookmarklevelcount
+ \iftracebookmarks
+ \bgroup
+ \par
+ \bookmarktag\quad
+ \dorecurse{\currentbookmarklevel}{\quad}\unskip#1\quad
+ (\bookmarklevelcount)\quad
+ \egroup
+ \fi
+ \global\chardef\previousbookmarklevel=\currentbookmarklevel
+ \insertsomebookmark{#1}{\the\currentbookmarklevel}{\bookmarklevelcount}{#4}{#6}}
+
+\def\dogetbookmarkelement#1#2#3#4#5#6%
+ {\doifnot{#1}{\@@bookmark}
+ {\dodogetbookmarkelement{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\doputbookmarkelement#1#2#3#4#5#6%
+ {\doifelse{#1}{\@@bookmark}
+ {\localbookmark{#4}}
+ {\flushbookmark
+ \dodoputbookmarkelement{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\let\flushbookmark=\relax
+\let\localbookmark=\gobbleoneargument
+
+\def\insertsomebookmark#1#2#3#4#5%
+ {\gdef\flushbookmark%
+ {\doinsertsomebookmark{#1}{#2}{#3}{#4}{#5}{g}}%
+ \gdef\localbookmark##1%
+ {\doinsertsomebookmark{#1}{#2}{#3}{##1}{#5}{l}}}
+
+\def\doinsertsomebookmark#1#2#3#4#5#6%
+ {\global\utilitydonetrue
+ \global\let\localbookmark=\gobbleoneargument
+ \global\let\flushbookmark=\relax
+ \doifinstringelse{#1}{\openbookmarklist}
+ {\chardef\openbookmark=1}
+ {\chardef\openbookmark=0}%
+ \iftracebookmarks(#6: #4)\quad(\the\openbookmark)\par\fi
+ \doinsertbookmark{#2}{#3}{#4}{#5}{\openbookmark}}
+
+% \startinteractiemenu[rechts]
+% \but [eerste] eerste \\
+% \txt hello world \\
+% \but [tweede] tweede \\
+% \nop \\
+% \but [tweede] tweede \\
+% \rul whow \\
+% \but [tweede] tweede \\
+% \raw hello world \\
+% \but [tweede] tweede \\
+% \com \vfill \\
+% \but [derde] derde \\
+% \stopinteractiemenu
+
+\newif\iflocationmenupermitted
+
+\def\testinteractiemenu#1%
+ {\iflocation
+ \doifelse{\@@iamenu}{\v!aan}
+ {\doifelsevalue{\??am#1\c!status}{\v!start}
+ {\global\locationmenupermittedtrue}
+ {\global\locationmenupermittedfalse}}
+ {\global\locationmenupermittedfalse}%
+ \else
+ \global\locationmenupermittedfalse
+ \fi}
+
+\def\doblokkeerinteractiemenu[#1][#2][#3]%
+ {\def\dodoblokkeerinteractiemenu##1%
+ {\doifelse{#3}{}
+ {\setevalue{\??am##1\c!blokkade}{}}
+ {\edef\interactieblokkade{\getvalue{\??am##1\c!blokkade}}
+ \def\docommando####1%
+ {#1{####1}{\interactieblokkade}}% #1 = \remove or \add
+ \processcommalist[#3]\docommando
+ \setevalue{\??am##1\c!blokkade}{\interactieblokkade}}}%
+ \processcommalist[#2]\dodoblokkeerinteractiemenu}
+
+\def\blokkeerinteractiemenu%
+ {\dotripleempty\doblokkeerinteractiemenu[\addtocommalist]}
+
+\def\geefinteractiemenuvrij%
+ {\dotripleempty\doblokkeerinteractiemenu[\removefromcommalist]}
+
+% ja : kader/achtergrond met tekst
+% leeg : kader/achtergrond maar geen tekst
+% nee : alleen ruimte reserveren
+% geen : helemaal weglaten
+
+\newif\iflocationdummy
+\newif\ifskippedmenuitem
+
+\def\dosetlocationbox#1[#2]#3#4%
+ {\global\skippedmenuitemfalse
+ \setbox\locationbox=\hbox
+ {% anders cyclische aanroep !
+ \resetgoto
+ \iflocationdummy
+ \edef\locationboxborder{\getvalue{#1\c!kader}}%
+ \edef\locationboxbackground{\getvalue{#1\c!achtergrond}}%
+ \else
+ \edef\locationboxborder{\v!uit}%
+ \edef\locationboxbackground{}%
+ \fi
+ \localframed[#1]
+ [\c!kader=\locationboxborder,\c!achtergrond=\locationboxbackground,#2]
+ {\dolocationattributes{#1}{#3}}}%
+ \hbox{#4{\copy\locationbox}}}
+
+\def\setlocationboxyes#1[#2]#3[#4]%
+ {\ifx\currentouterreference\empty
+ \doifelse{\currentrealreference}{\realfolio}
+ {\!!doneafalse}
+ {\!!doneatrue}%
+ \else
+ \!!doneatrue
+ \fi
+ \if!!donea
+ \ifcase\getvalue{#1\c!zelfdepagina}
+ \bgroup
+ \locationdummytrue
+ \setvalue{#1\c!kleur}{}%
+ \dosetlocationbox{#1}[#2,\c!dummy=\v!nee]{#3}{\gotolocation{#4}}%
+ \egroup
+ \or
+ \locationdummytrue
+ \dosetlocationbox{#1}[#2,\c!dummy=\v!ja]{#3}{\gotolocation{#4}}%
+ \or
+ \locationdummyfalse
+ \dosetlocationbox{#1}[#2,\c!dummy=\v!ja]{#3}{\gotolocation{#4}}%
+ \or
+ \locationdummyfalse
+ \global\skippedmenuitemtrue
+ \fi
+ \else
+ \locationdummytrue
+ \dosetlocationbox{#1}[#2,\c!dummy=\v!nee]{#3}{\gotolocation{#4}}%
+ \fi}
+
+\def\setlocationboxnop#1[#2]#3[#4]%
+ {\ifcase\getvalue{#1\c!onbekendeverwijzing}
+ \locationdummytrue
+ \dosetlocationbox{#1}[#2,\c!dummy=\v!nee]{#3}{}%
+ \or
+ \locationdummytrue
+ \dosetlocationbox{#1}[#2,\c!dummy=\v!ja]{#3}{}%
+ \or
+ \locationdummyfalse
+ \dosetlocationbox{#1}[#2,\c!dummy=\v!ja]{#3}{}%
+ \or
+ \locationdummyfalse
+ \global\skippedmenuitemtrue
+ \fi}
+
+\def\setlocationbox#1[#2]#3[#4]%
+ {\doifinstringelse{#4}{\getvalue{#1\c!blokkade}}
+ {\setlocationboxnop{#1}[#2]{#3}[#4]}
+ {\doifreferencefoundelse{#4}
+ {\setlocationboxyes{#1}[#2]{#3}[#4]}
+ {\setlocationboxnop{#1}[#2]{#3}[#4]%
+ \unknownreference{#4}}}}
+
+\def\dodosetlocationcommanditem#1#2#3[#4]#5\\%
+ {\bgroup
+ \leavevmode
+ \doifelse{#5}{[]}
+ {\doifinstringelse{=}{#4}
+ {#3}
+ {\setlocationbox{\??am#1}[]{#3}[#4]}}
+ {#3}%
+ \ifskippedmenuitem \else
+ \getvalue{\??am#1#2}%
+ \fi
+ \egroup}
+
+\def\dosetlocationcommanditem#1#2#3%
+ {\dodosetlocationcommanditem{#1}{#2}#3[]\\}
+
+\def\setlocationnop#1[#2]#3%
+ {\localframed[#1][#2]{#3}}
+
+\def\executeamboxcommands#1#2#3#4#5%
+ {\processaction
+ [\getvalue{\??am#1\c!dummy}]
+ [ \v!ja=>\chardef\handleunknownmenuitem=0\relax,
+ \v!leeg=>\chardef\handleunknownmenuitem=1\relax,
+ \v!nee=>\chardef\handleunknownmenuitem=2\relax]%
+ \getvalue{\??am#1#3}%
+ \ifextendedmenu
+ \setamboxcommands{#1}{#4}%
+ #2%
+ \else
+ \def\dolocationcommand##1%
+ {\dosetlocationcommanditem{#1}{#4}{##1}}%
+ \processcommalist[#2]\dolocationcommand
+ \fi
+ \unskip
+ \getvalue{\??am#1#5}}
+
+\def\setamboxcommands#1#2%
+ {\def\raw##1\\%
+ {\bgroup
+ \leavevmode
+ ##1%
+ \ifskippedmenuitem \else
+ \getvalue{\??am#1#2}%
+ \fi
+ \egroup}%
+ \def\but[##1]##2\\%
+ {\raw\setlocationbox{\??am#1}[]{##2}[##1]\\}%
+ \def\nop##1\\%
+ {\raw\phantom{\localframed[\??am#1][]{}}\\}%
+ \def\txt##1\\%
+ {\raw\localframed[\??am#1][\c!kader=\v!uit]{##1\unskip}\\}%
+ \def\rul##1\\%
+ {\raw\localframed[\??am#1][]{##1\unskip}\\}%
+ \def\com##1\\%
+ {##1}}
+
+\def\@@amhbox#1#2#3#4%
+ {\testinteractiemenu{#3}%
+ \iflocationmenupermitted
+ \bgroup
+ \def\dolocationcommand##1%
+ {\dosetlocationcommanditem{#3}{##1}}%
+ \dimen0=\zetbreedte
+ \advance\dimen0 by \pagebackgroundhoffset
+ \advance\dimen0 by \pagebackgroundhoffset
+ \advance\dimen0 by -\getvalue{\??am#3\c!linkeroffset}%
+ \advance\dimen0 by -\getvalue{\??am#3\c!rechteroffset}%
+ \setbox0=\hbox to \dimen0
+ {\forgetall
+ \executeamboxcommands{#3}{#4}\c!links\c!midden\c!rechts}%
+ \wd0=\zetbreedte
+ % geen \ht=#2 setting (yet)
+ \hskip-\pagebackgroundhoffset
+ \hskip \getvalue{\??am#3\c!linkeroffset}%
+ \box0\relax
+ \egroup
+ \else
+ #1\relax
+ \fi}
+
+\def\@@amvbox#1#2#3#4% don't change skipping, this one works!
+ {\testinteractiemenu{#3}%
+ \iflocationmenupermitted
+ \bgroup
+ \dimen0=\teksthoogte
+ \advance\dimen0 by \pagebackgroundvoffset
+ \advance\dimen0 by \pagebackgroundvoffset
+ \advance\dimen0 by \pagebackgrounddepth
+ \advance\dimen0 by -\getvalue{\??am#3\c!bovenoffset}%
+ \advance\dimen0 by -\getvalue{\??am#3\c!onderoffset}%
+ \setbox0=\vbox to \dimen0
+ {\forgetall % Voor't geval de afstand
+ \stelblankoin[\v!standaard]% % (tijdelijk) is aangepast.
+ \hsize#2\relax
+ \executeamboxcommands{#3}{#4}\c!voor\c!tussen\c!na}%
+ \setbox0=\vbox
+ {\vskip-\pagebackgroundvoffset
+ \vskip\getvalue{\??am#3\c!bovenoffset}%
+ \ht0=\!!zeropoint
+ \box0
+ \vskip\pagebackgroundvoffset}% overbodig
+ \ht0=\teksthoogte
+ \wd0=#2\relax
+ \box0
+ \egroup
+ \else
+ #1\relax
+ \fi}
+
+\setvalue{\??am\s!do\v!rechts}%
+ {\@@amvbox{\dodummypageskip\v!rechts}\rechterrandbreedte}
+
+\setvalue{\??am\s!do\v!links}%
+ {\@@amvbox{\dodummypageskip\v!links}\linkerrandbreedte}
+
+\setvalue{\??am\s!do\v!boven}%
+ {\@@amhbox{\dodummypageskip\v!boven}\bovenhoogte}
+
+\setvalue{\??am\s!do\v!onder}%
+ {\@@amhbox{\dodummypageskip\v!onder}\onderhoogte}
+
+\def\dointeractiemenu#1#2%
+ {\getvalue{\??am\s!do\getvalue{\??am#1\c!plaats}}{#1}{#2}}
+
+\def\interactiemenu[#1]%
+ {\donottest\getvalue{\??am\c!menu#1}}
+
+\def\horizontaalinteractiemenu#1#2#3#4%
+ {\dimen2=\!!zeropoint
+ \setbox0=\hbox
+ {\def\docommando##1%
+ {\doifnotvalue{\??am##1\c!status}{\v!geen}
+ {\hskip\dimen2
+ \setbox2=\hbox to #2
+ {\getvalue{\??am##1#3}\interactiemenu[##1]\getvalue{\??am##1#4}}%
+ \doifelsevalue{\??am##1\c!afstand}{\v!overlay}
+ {\dimen2=\!!zeropoint
+ \wd2=\!!zeropoint}%
+ {\dimen2=\getvalue{\??am##1\c!afstand}}%
+ \box2}}%
+ \startinteractie
+ \processcommacommand[\getvalue{\??am#1}]\docommando
+ \stopinteractie}%
+ \wd0=#2\relax
+ \box0\relax}
+
+\def\vertikaalinteractiemenu#1#2#3#4%
+ {\dimen2=\!!zeropoint
+ \setbox0=\vbox
+ {\def\docommando##1%
+ {\doifnotvalue{\??am##1\c!status}{\v!geen}
+ {\vskip\dimen2
+ \setbox2=\vbox to #2
+ {\getvalue{\??am##1#3}\interactiemenu[##1]\getvalue{\??am##1#4}}%
+ \doifelsevalue{\??am##1\c!afstand}{\v!overlay}
+ {\dimen2=\!!zeropoint
+ \offinterlineskip
+ \dp2=\!!zeropoint
+ \ht2=\!!zeropoint}%
+ {\dimen2=\getvalue{\??am##1\c!afstand}}%
+ \box2}}%
+ \startinteractie
+ \processcommacommand[\getvalue{\??am#1}]\docommando
+ \stopinteractie}%
+ \ht0=#2\relax
+ \dp0=\!!zeropoint
+ \box0\relax}
+
+\def\interactiemenus[#1]%
+ {\iflocation
+ \processaction
+ [#1]
+ [ \v!links=>\horizontaalinteractiemenu\v!links\linkerrandbreedte\c!links\c!rechts,
+ \v!rechts=>\horizontaalinteractiemenu\v!rechts\rechterrandbreedte\c!links\c!rechts,
+ \v!boven=>\vertikaalinteractiemenu\v!boven\bovenhoogte\c!voor\c!na,
+ \v!onder=>\vertikaalinteractiemenu\v!onder\onderhoogte\c!voor\c!na]%
+ \else
+ \dodummypageskip{#1}%
+ \fi}
+
+\setvalue{\??am\v!links}{}
+\setvalue{\??am\v!rechts}{}
+\setvalue{\??am\v!boven}{}
+\setvalue{\??am\v!onder}{}
+
+\newif\ifextendedmenu
+
+\def\dodefinieerinteractiemenu[#1][#2][#3]%
+ {\ConvertToConstant\doifelse{#3}{}
+ {\setvalue{\??am\c!menu#1}%
+ {\extendedmenufalse\dointeractiemenu{#1}{#2}}}
+ {\setvalue{\??am\c!menu#1}%
+ {\extendedmenufalse\dointeractiemenu{#1}{}}%
+ \presetlocalframed[\??am#1]%
+ \setvalue{\??am#1\c!blokkade}{}%
+ \edef\!!stringe{\getvalue{\??am#2}}%
+ \addtocommalist{#1}\!!stringe
+ \letvalue{\??am#2}=\!!stringe
+ \doifnot{#1}{#2}
+ {\copyparameters[\??am#1][\??am#2]
+ [\c!links,\c!midden,\c!rechts,\c!voor,\c!na,\c!tussen,
+ \c!breedte,\c!hoogte,\c!afstand,\c!offset,\c!kader,
+ \c!achtergrond,\c!achtergrondkleur,\c!achtergrondraster,
+ \c!letter,\c!kleur,\c!zelfdepagina,\c!onbekendeverwijzing,
+ \c!linkeroffset,\c!rechteroffset,\c!bovenoffset,\c!onderoffset]}%
+ \ConvertToConstant\doifinstringelse{=}{#3}
+ {\getparameters[\??am#1][\c!plaats=#2,#3]}%
+ {\doifnot{#2}{#3}
+ {\copyparameters[\??am#1][\??am#3]
+ [\c!links,\c!midden,\c!rechts,\c!voor,\c!na,\c!tussen,
+ \c!breedte,\c!hoogte,\c!afstand,\c!offset,\c!kader,
+ \c!achtergrond,\c!achtergrondkleur,\c!achtergrondraster,
+ \c!letter,\c!kleur,\c!zelfdepagina,\c!onbekendeverwijzing,
+ \c!linkeroffset,\c!rechteroffset,\c!bovenoffset,\c!onderoffset]}%
+ \getparameters[\??am#1][\c!plaats=#2]}}}
+
+\def\definieerinteractiemenu%
+ {\dotripleempty\dodefinieerinteractiemenu}
+
+\def\startinteractiemenu[#1]#2\stopinteractiemenu%
+ {\setvalue{\??am\c!menu#1}%
+ {\extendedmenutrue\dointeractiemenu{#1}{#2}}}
+
+\def\dododostelinteractiemenuin#1%
+ {\processaction
+ [\getvalue{#1}]
+ [ \v!ja=>\setvalue{#1}{0},
+ \v!leeg=>\setvalue{#1}{1},
+ \v!nee=>\setvalue{#1}{2},
+ \v!geen=>\setvalue{#1}{3},
+ \s!default=>\setvalue{#1}{1}]}
+
+\def\dodostelinteractiemenuin[#1][#2]%
+ {\def\docommando##1%
+ {\getparameters[\??am##1][#2]
+ \dododostelinteractiemenuin{\??am##1\c!onbekendeverwijzing}%
+ \dododostelinteractiemenuin{\??am##1\c!zelfdepagina}}%
+ \processcommalist[#1]\docommando}
+
+\def\dostelinteractiemenuin[#1][#2]%
+ {\ConvertToConstant\doifinstringelse{=}{#2}
+ {\dodostelinteractiemenuin[#1][#2]}
+ {\dodefinieerinteractiemenu[#1][#2][]}}
+
+\def\stelinteractiemenuin%
+ {\dodoubleargument\dostelinteractiemenuin}
+
+% \scherm moet worden als \pagina
+
+\def\simplescherm% zou niet nodig moeten zijn
+ {\iflocation
+ \pagina[\v!ja]%
+ \fi}
+
+\def\complexscherm[#1]%
+ {\iflocation
+ \pagina[#1]%
+ \fi}
+
+\def\scherm%
+ {\complexorsimple{scherm}}
+
+%I n=Figuren++
+%I c=\startfiguur,\refereer,\markeer,\toelichting
+%I
+%I Het is mogelijk naar een plaats in een figuur te verwijzen.
+%I Het commando \gebruikfiguur[][][] wordt in dat geval vervangen
+%I door het commando:
+%I
+%I \startfiguur[naam][file][factor=]%
+%I ...
+%I \refereer(x1,y1)(h1,b1)[referentie1]%
+%I ...
+%I \markeer(xn,yn)(hn,bn)[referentien]%
+%I ...
+%I \stopfiguur
+%P
+%I Wanneer als optie bij \gebruikexternefiguren 'test' wordt
+%I meegegegeven, wordt een testpagina met een rasterverdeling
+%I gegenereerd. Met x en y wordt de linkerbovenhoek ingesteld,
+%I met h en b de hoogte en de breedte van het te markeren deel
+%I van de figuur.
+%I
+%I Standaard is de hoogte verdeeld in 24 stukken. Wil men een
+%I andere indeling, dan kan men met \gebruikexternefiguren
+%I de 'xmax' of 'ymax' instellen (aanbevolen: 10 - 50).
+%I
+%I De hokjes waarop geklikt kan worden kunnen zichtbaar worden
+%I gemaakt met 'hokjes=aan'.
+%P
+%I Om duidelijk te kunnen maken achter welke delen van een
+%I figuur iets zit, kan een kleurenbalk worden opgenomen.
+%I
+%I ...
+%I \kleurenbalk[...,...,...]
+%I ...
+%I
+%I (deze tekst moet nog worden aangevuld)
+%P
+%I Het is mogelijk in een tekst toelichtingen op te nemen.
+%I
+%I ...
+%I \toelichting(x1,y1)(h1,b1)[instellingen]{tekst}
+%I ...
+%I
+%I De instellingen zijn optioneel en komen overeen met die van
+%I het commando \omlijnd.
+
+\newcount\efreference
+\newdimen\efxsteps
+\newdimen\efysteps
+
+\def\calculateefsteps%
+ {\ifnum0\@@exxmax=0
+ \ifnum0\@@exymax=0
+ \def\@@exymax{24}%
+ \fi
+ \efysteps=\fighei \divide\efysteps by \@@exymax
+ \efxsteps=\efysteps
+ \dimen0=\figwid
+ \advance\dimen0 by \efysteps
+ \divide\dimen0 by \efysteps
+ \edef\@@exxmax{\number\dimen0}%
+ \else
+ \efxsteps=\figwid \divide\efxsteps by \@@exxmax
+ \efysteps=\fighei \divide\efysteps by \@@exymax
+ \fi}
+
+\def\efcomment#1(#2,#3)#4(#5,#6)% {kader}(x,y)(h,b)[...]{tekst}
+ {\def\complexefdocomment[##1]##2%
+ {\positioneer(#2,#3)%
+ {\setnostrut
+ \framed
+ [\c!breedte=#5\efxsteps,
+ \c!hoogte=#6\exysteps,
+ \c!offset=\v!geen,
+ \c!kader=#1,
+ ##1]%
+ {##2}}}%
+ \complexorsimpleempty{efdocomment}}
+
+\def\efnocomment(#1,#2)#3(#4,#5)% (x,y)(h,b)[...]{tekst}
+ {\def\complexefdonocomment[##1]##2{}%
+ \complexorsimpleempty{efdonocomment}}
+
+\def\efdomarker(#1,#2)#3#4% (h,b){kader}{tekst}
+ {\framed
+ [\c!breedte=#1\efxsteps,
+ \c!hoogte=#2\efysteps,
+ \c!offset=\v!geen,
+ \c!kader=#3]%
+ {#4}}
+
+\def\effiguur#1%
+ {\positioneer(0,0){\naam{#1}}}
+
+\def\efdoarea(#1,#2)#3#4% (h,b){kader}{tekst}
+ {\start
+ \setnostrut
+ \framed
+ [\c!breedte=#1\efxsteps,
+ \c!hoogte=#2\efysteps,
+ \c!offset=\!!zeropoint,
+ \c!kader=#3]
+ {#4}%
+ \stop}
+
+\def\efgoto(#1,#2)#3[#4]% (h,b)kader[ref]
+ {\setbox0=\vbox{\efdoarea(#1,#2)#3{}}%
+ \naarbox{\copy0}[#4]}
+
+\def\efmark(#1,#2)#3(#4,#5)#6[#7]%
+ {\advance\efreference by 1
+ \positioneer(#1,#2)
+ {\hbox{\the\efreference}}%
+ \positioneer(#1,#2)
+ {\gotosomeinternal
+ {\s!vwb}{#7}{\realfolio}
+ {\efdomarker(#4,#5){\v!aan}{\thisissomeinternal{\s!vwa}{#7}}}}}
+
+\def\eftext#1(#2,#3)#4(#5,#6)#7[#8]%
+ {\advance\efreference by 1
+ \hbox
+ {\quad
+ \thisissomeinternal{\s!vwb}{#8}%
+ \gotosomeinternal
+ {\s!vwa}{#8}{\realfolio}
+ {\hbox to 1.5em{\the\efreference\presetgoto\hfill}}%
+ \quad#1 (#2,#3) (#5,#6) [#8]\hfill}%
+ \endgraf}
+
+\def\efthisis(#1,#2)#3[#4]%
+ {\efdoarea(#1,#2){#3}{\pagereference[#4]}}
+
+\newbox\colorbarbox
+
+\def\makecolorbar[#1]%
+ {\def\docommando##1%
+ {\color[##1]
+ {\blackrule
+ [\c!breedte=2em,
+ \c!hoogte=1ex,
+ \c!diepte=\!!zeropoint]}%
+ \endgraf}%
+ \global\setbox\colorbarbox=\vbox
+ {\forgetall
+ \processcommalist[#1]\docommando}%
+ \global\setbox\colorbarbox=\vbox
+ {\hskip2em\box\colorbarbox}%
+ \global\wd\colorbarbox=\!!zeropoint}
+
+\def\plaatsstartfiguur[#1][#2][#3]#4\plaatsstopfiguur%
+ {\hbox
+ {\gebruikexternfiguur[#1][#2][#3]%
+ \berekenexternfiguur[#1][#2]%
+ \calculateefsteps
+ \startpositioneren
+ \def\refereer(##1,##2)##3(##4,##5)##6[##7]%
+ {\positioneer(##1,##2)
+ {\efgoto(##4,##5){\@@exhokjes}[##7]}}%
+ \def\markeer(##1,##2)##3(##4,##5)##6[##7]%
+ {\positioneer(##1,##2)
+ {\efthisis(##4,##5){\@@exhokjes}[##7]}}%
+ \def\toelichting%
+ {\efnocomment}%
+ \def\kleurenbalk##1[##2]%
+ {}%
+ \positioneer(0,0){\effiguur{#1}}%
+ \linewidth=1pt
+ \stelpositionerenin
+ [\c!eenheid=pt,
+ \c!xschaal=\withoutpt{\the\efxsteps},
+ \c!yschaal=\withoutpt{\the\efysteps},
+ \c!factor=1]%
+ \ignorespaces#4%
+ \def\refereer(##1,##2)##3(##4,##5)##6[##7]%
+ {}%
+ \let\markeer=\refereer
+ \def\toelichting%
+ {\efcomment\v!nee}%
+ \def\kleurenbalk##1[##2]%
+ {\makecolorbar[##2]}%
+ \ignorespaces#4%
+ \stoppositioneren
+ \box\colorbarbox}}
+
+% De onderstaande macro mag niet zondermeer worden aangepast
+% en is afgestemd op gebruik in de handleiding.
+
+\def\teststartfiguur[#1][#2][#3]#4\teststopfiguur%
+ {\begingroup
+ \gebruikexternfiguur[#1][#2][\c!bfactor=\v!max]%
+ \def\refereer%
+ {\efmark}%
+ \def\markeer%
+ {\efmark}%
+ \def\toelichting%
+ {\efcomment\v!ja}%
+ \def\kleurenbalk##1[##2]%
+ {}%
+ \efreference=0
+ \setbox0=\vbox
+ {\hsize240pt
+ \startpositioneren
+ \berekenexternfiguur[#1][#2]%
+ \calculateefsteps
+ \positioneer(0,0)
+ {\effiguur{#1}}%
+ \positioneer(0,0)
+ {\rooster
+ [\c!nx=\@@exxmax,
+ \c!dx=\withoutpt{\the\efxsteps},
+ \c!ny=\@@exymax,
+ \c!dy=\withoutpt{\the\efysteps},
+ \c!xstap=1,
+ \c!ystap=1,
+ \c!schaal=1,
+ \c!offset=\v!nee,
+ \c!eenheid=pt]}%
+ \stelpositionerenin%
+ [\c!eenheid=pt,
+ \c!xschaal=\withoutpt{\the\efxsteps},
+ \c!yschaal=\withoutpt{\the\efysteps},
+ \c!factor=1]%
+ \linewidth=1pt
+ \ignorespaces#4\relax
+ \stoppositioneren
+ \vfill}%
+ \efreference=0
+ \def\refereer%
+ {\eftext{$\rightarrow$}}%
+ \def\markeer%
+ {\eftext{$\leftarrow$}}%
+ \def\toelichting%
+ {\efnocomment}%
+ \def\kleurenbalk##1[##2]%
+ {}%
+ \setbox2=\vbox
+ {{\tfa\doifelsenothing{#1}{#2}{#1}}
+ \blanko
+ \tfxx#4
+ \vfilll}%
+ \ifdim\ht0>\ht2
+ \ht2=\ht0
+ \else
+ \ht0=\ht2
+ \fi
+ \hbox
+ {\hskip3em
+ \vtop{\vskip12pt\box0\vskip6pt}%
+ \vtop{\vskip12pt\box2\vskip6pt}}%
+ \endgroup}
+
+\def\dostartfiguur[#1][#2][#3]#4\stopfiguur%
+ {\doifelse{\@@exoptie}{\v!test}
+ {\teststartfiguur[#1][#2][#3]#4\teststopfiguur%
+ \def\@@exhokjes{\v!aan}}
+ {\def\@@exhokjes{\v!uit}}%
+ \setvalue{#1}%
+ {\plaatsstartfiguur[#1][#2][#3]#4\plaatsstopfiguur}}
+
+\def\startfiguur%
+ {\dotripleargument\dostartfiguur}
+
+%I n=Springen
+%I c=\naar,\button,\menubutton,\stelbuttonsin
+%I
+%I Een woord kan woren gemarkeerd met:
+%I
+%I \naar{woord}[referentie]
+%I
+%I Voorlopig zijn daarnaast beschikbaar:
+%I
+%I \button[instellingen]{woord}[referentie]
+%I \menubutton[plaats][instellingen]{woord}[referentie]
+%I
+%I waarbij de [instellingen] facultatief zijn en {geen} in
+%I plaats van {woord} kan worden opgegeven. De instellingen komen,
+%I voor zover relevant, overeen met die van \omlijnd. Vaste
+%I instellingen vinden plaats met:
+%I
+%I \stelbuttonsin[breedte=,hoogte=,offset=,kader=,
+%I achtergrond=,achtergrondkleur=,achtergrondraster=,
+%I kleur=]
+%P
+%I De elders reeds beschreven commando's \op en \in zijn in
+%I geval van interactie ook als volgt te gebruiken:
+%I
+%I \in{woord}[referentie]
+%I \op{woord}[referentie]
+%I
+%I In dat geval wordt 'tekst~referentie' net zo weergegeven
+%I als
+%I
+%I \naar{woord}[referentie] % woorden
+%I \naarbox{woord}[referentie] % robuust
+%I
+%I opgeroepen verwijzing.
+
+\def\domenubutton[#1][#2]#3[#4]%
+ {\bgroup
+ \locationdummytrue
+ \iffirstargument
+ \ifsecondargument
+ \setlocationbox{\??am#1}[#2]{#3}[#4]%
+ \else
+ \ConvertToConstant\doifinstringelse{=}{#1}
+ {\setlocationbox{\??bt}[#1]{#3}[#4]}
+ {\setlocationbox{\??am#1}[]{#3}[#4]}%
+ \fi
+ \else
+ \setlocationbox{\??bt}[]{#3}[#4]%
+ \fi
+ \egroup}
+
+\unexpanded\def\menubutton%
+ {\dodoubleempty\domenubutton}
+
+\def\domenubox[#1][#2]#3%
+ {\bgroup
+ \def\setlocationbox##1[##2]##3[##4]%
+ {\localframed[##1][##2]{\dolocationattributes{##1}{##3}}}%
+ \domenubutton[#1][#2]#3[]%
+ \egroup}
+
+\def\menubox%
+ {\dodoubleempty\domenubox}
+
+%I n=Externe files
+%I c=\gebruikexterndocument,\uit
+%I c=\startsynchroniseer,\stopsynchronisatie,\synchroniseer,
+%I c=\stelsynchronisatiein,\stelsynchronisatiebalkin,\synchronisatiebalk
+%I
+%I Mits ondersteund door het interactieprogramma, kan naar
+%I een andere file worden gesprongen. Zo'n file moet eerst
+%I worden gedefinieerd met:
+%I
+%I \gebruikexterndocument [naam] [file] [omschrijving]
+%I
+%I Een verwijzing naar een andere file ziet er als volgt
+%I uit:
+%I
+%I \in{tekst}[naam::verwijzing]
+%I \op{tekst}[naam::verwijzing]
+%I \naar{tekst}[naam::verwijzing]
+%I
+%I De naam van het andere document kan worden opgeroepen met
+%I
+%I \uit[naam]
+%I
+%I terwijl \uit zonder [naam] de bij \in, \op of \naar
+%I behorende omschrijving oproept.
+%P
+%I Documenten kunnen worden gesynchroniseerd. Dat wil zeggen
+%I dat gesprongen kan worden naar hetzelfde punt in een anders
+%I vormgegeven tekst. Een synchronisatiepunt wordt aangegeven
+%I met:
+%I
+%I \sychroniseer
+%I
+%I Een synchronisatie kan uit de pas lopen, bijvoorbeeld als
+%I we in een kop een synchronisatiebalk oproepen. Wanneer vindt
+%I immers precies de synchronisatie plaats? Vandaar de wat
+%I meer betrouwbare menier van aangeven:
+%I
+%I \startsynchronisatie % voor de kop (nu mag balk)
+%I \stopsynchronisatie % eind van de kop (fixeert plaats)
+%P
+%I Synchronisatie kan worden ingesteld met:
+%I
+%I \stelsynchronisatiein[status=]
+%I
+%I Het synchronisatiemechanisme is in geval van interactieve
+%I teksten standaard niet actief.
+%P
+%I Er kan een synchronisatiebalk worden opgeroepen waarmee
+%I naar een ander document kan worden gesprongen.
+%I
+%I \synchronisatiebalk[naam][instellingen]
+%I
+%I De instellingen kunnen ook apart worden opgegeven:
+%I
+%I \stelsynchronisatiebalkin[variant=,breedte=,
+%I letter=,kleur=,achtergrond=,achtergrondraster=,
+%I achtergrondkleur=]
+%I
+%I Mogelijke varianten zijn 'lokaal' en 'pagina'. In het
+%I eerste geval wordt slechts een mogelijkheid geboden, in het
+%I tweede geval zijn tot drie mogelijkheden mogelijk. Deze
+%I zijn te vergelijken met markeringen.
+
+% Hier volgen de synchronisatiemacro's:
+
+\def\syncprefix{sync}
+\def\syncmarker{syncmark}
+
+\definieermarkering[\syncmarker]
+\stelmarkeringin[\syncmarker][\c!expansie=\v!ja]
+
+\newcounter\synccounter
+
+\newif\ifsynchronisation
+
+\def\startsynchronisatie%
+ {\iflocation\ifsynchronisation
+ \doglobal\increment\synccounter
+ \fi\fi}
+
+\def\stopsynchronisatie%
+ {\iflocation\ifsynchronisation
+ %\thisisdestination{\syncprefix:\synccounter}%
+ \paginareferentie[\syncprefix:\synccounter]%
+ \ifvmode
+ \markeer[\syncmarker]{\synccounter}%
+ \else
+ \showmessage{\m!interactions}{4}{\synccounter}%
+ \fi
+ \fi\fi}
+
+\def\synchroniseer%
+ {\startsynchronisatie
+ \stopsynchronisatie}
+
+\def\dostelsynchronisatiein[#1]%
+ {\getparameters[\??sy][#1]%
+ \doifelse{\@@systatus}{\v!start}
+ {\synchronisationtrue}
+ {\synchronisationfalse}}
+
+\def\stelsynchronisatiein%
+ {\dosingleargument\dostelsynchronisatiein}
+
+\def\definieersynchronisatie%
+ {\dosingleargument\dodefinieersynchronisatie}
+
+\def\stelsynchronisatiebalkin%
+ {\dodoubleargument\getparameters[\??ba]}
+
+\presetlocalframed[\??ba]
+
+\setvalue{synchronisatie\v!pagina}[#1]%
+ {\bgroup
+ \stelinteractiein[\c!breedte=\!!zeropoint]%
+ \setbox0=\hbox
+ {\localframed[\??ba][]%
+ {\dolocationattributes{\??ba}{\strut\@@batekst}}}%
+ \mindermeldingen
+ \def\onder%
+ {\leaders\hrule\!!depth1ex\!!height-.5ex\hfil}%
+ \def\boven##1##2##3%
+ {\dimen0=\wd0\relax
+ \divide\dimen0 by 3\relax
+ \multiply\dimen0 by ##2\relax
+ \dimen2=.25em\relax
+ \advance\dimen0 by -##3\dimen2\relax
+ %\gotodestination
+ % {}{#1}{\syncprefix:##1}{}
+ % {\hbox to \dimen0{\color[\locationcolor\@@bakleur]{\onder}}}}%
+ \naarbox
+ {\hbox to \dimen0{\color[\locationcolor\@@bakleur]{\onder}}}%
+ [#1::\syncprefix:##1]}%
+ \hbox
+ {\prefetchmark[\syncmarker]%
+ \def\check##1##2%
+ {\edef##2{\fetchmark[\syncmarker][##1]}%
+ \ifnum0##2=0 \def##2{1}\fi}%
+ \check\v!vorige\top
+ \check\v!eerste\first
+ \check\v!laatste\bot
+ \setbox2=\hbox to \wd0
+ {\ifnum\top=\first\relax
+ \ifnum\first=\bot\relax
+ \boven\first30\relax
+ \else
+ \boven\first21\hss\boven\bot11\relax
+ \fi
+ \else
+ \ifnum\first=\bot\relax
+ \boven\top11\hss\boven\first21\relax
+ \else
+ \boven\top11\hss\boven\first11\hss\boven\bot11\relax
+ \fi
+ \fi}%
+ \wd2=\!!zeropoint\box2
+ \box0\relax}%
+ \egroup}
+
+\setvalue{synchronisatie\v!lokaal}[#1]%
+ {\bgroup
+ \stelinteractiein[\c!breedte=\!!zeropoint]%
+ \def\blackrule{\hbox{\vrule\!!height.5em\!!width.5em}}%
+ %\gotodestination
+ % {}{##1}{\syncprefix:#1}{0}
+ % {\color[\locationcolor\@@bakleur]{\blackrule}}%
+ \naarbox %
+ {\color[\locationcolor\@@bakleur]{\blackrule}}%
+ [#1::\syncprefix:\synccounter]%
+ \egroup}
+
+\def\synchronisatiebalk[#1][#2]%
+ {\iflocation\ifsynchronisation
+ \bgroup
+ \stelsynchronisatiebalkin
+ [\c!tekst=\getvalue{doc:des:#1},#2]%
+ \getvalue{synchronisatie\@@bavariant}[#1]%
+ \egroup
+ \fi\fi}
+
+%I n=Interactiebalk
+%I c=\interactiebalk,\stelinteractiebalkin
+%I
+%I Het volgende commando genereert een interactiebalk. Pas op:
+%I de waarde van \realpageno staat niet echt vast.
+%I
+%I \interactiebalk[variant=,breedte=,hoogte=,diepte=,
+%I achtergrond=,achtergrondkleur=,achtergrondraster=,
+%I kader=,stap=]
+%I
+%I \interactiebalk[reset]
+%I
+%I \stelinteractiebalkin[...]
+%I
+%I Mogelijke stappen zijn 'klein', 'middel', 'groot' en 'n';
+%I beschikbare varianten zijn:
+%I
+%I a meter (scrollbar)
+%I b jumper (symbool: begin terug vooruit eind)
+%I c jumper (balk: begin terug vooruit eind)
+%I d pagina (subpaginas vast formaat)
+%I e pagina (subpaginas vrij formaat)
+%I f pagina (subpaginas grote aantallen)
+%I g pagina (subpaginas jumper)
+
+% Dit is leuke toepassing van glue!
+
+\newbox\meterbox
+
+\newif\ifbalksymbool
+
+\def\doganaareenpagina#1#2#3% nog checken !
+ {\checkreferences % nodig ??
+ \iflocation
+ \ifnum#3=\realpageno
+ {#2}
+ \else
+ \doifelsenothing{#1}
+ {\hbox{\gotorealpage{}{}{#3}{#2}}}
+ {\hbox{\gotorealpage{}{}{#3}{\dolocationattributes{#1}{#2}}}}%
+ \fi
+ \else
+ {#2}%
+ \fi}
+
+\def\interactiebalka%
+ {\iflocation
+ \bgroup
+ \stelinteractiein[\c!breedte=\!!zeropoint]%
+ \setupblackrules[\c!hoogte=\v!max,\c!diepte=\v!max]%
+ \!!widthb=\@@ibbreedte\relax
+ \advance\!!widthb by -2.75em\relax
+ \!!widtha=\!!widthb\relax
+ \divide\!!widtha by \lastpage\relax
+ \bgroup
+ \advance\realpageno by -1\relax
+ \ifvoid\meterbox
+ \bgroup
+ \processaction
+ [\@@ibstap]
+ [ \v!klein=>\dimen0=.25em\relax,
+ \v!middel=>\dimen0=.5em\relax,
+ \v!groot=>\dimen0=1em\relax,
+ \s!unknown=>\dimen0=\!!widtha]%
+ \ifdim\!!widtha<\dimen0\relax
+ \!!counta=\dimen0\relax
+ \!!countb=\!!widtha
+ \divide\!!counta by \!!countb
+ \else
+ \!!counta=\@@ibstap\relax
+ \fi
+ \!!widtha=\!!counta\!!widtha
+ \setbox0=\hbox{\blackrule[\c!breedte=\!!widtha]}%
+ \global\setbox\meterbox=\hbox to \!!widthb
+ {\hss
+ \for \teller=1 \to \lastpage \step \!!counta \do
+ {\gotorealpage{}{}{\teller}{\copy0}}%
+ \hss}%
+ \global\wd\meterbox=\!!zeropoint\relax
+ \egroup
+ \fi
+ \egroup
+ \noindent
+ \strut
+ \hbox to \@@ibbreedte
+ {\mindermeldingen
+ \setupblackrules[\c!breedte=1em]%
+ \doganaareenpagina\??ib\blackrule\firstpage
+ \hss
+ \color[middlegray]{\copy\meterbox}%
+ \hbox to \!!widthb
+ {\ifdim\!!widtha<1em\relax
+ \!!widtha=1em\relax
+ \fi
+ \setupblackrules[\c!breedte=\!!widtha]%
+ \ifnum\realpageno>1\relax
+ \!!counta=\realpageno
+ \advance\!!counta by -2\relax
+ \hskip\!!zeropoint\!!plus\!!counta sp\relax % cm gives overflow
+ \doganaareenpagina\??ib\blackrule\prevpage
+ \fi
+ \color[\@@ibcontrastkleur]{\blackrule[\c!breedte=.5em]}%
+ \ifnum\realpageno<\lastpage\relax
+ \doganaareenpagina\??ib\blackrule\nextpage
+ \!!counta=\lastpage\relax
+ \advance\!!counta by -\realpageno
+ \advance\!!counta by -1\relax
+ \hskip\!!zeropoint\!!plus\!!counta sp\relax % cm gives overflow
+ \fi}%
+ \hss
+ \doganaareenpagina\??ib\blackrule\lastpage}%
+ \egroup
+ \fi}
+
+\presetlocalframed[\??ib]
+
+\def\interactiebalkc%
+ {\iflocation
+ \ifnum\lastpage>1\relax
+ \hbox to \@@ibbreedte
+ {\setupblackrules[\c!hoogte=\v!max,\c!diepte=\v!max]%
+ \def\goto##1%
+ {\doganaareenpagina{}{\blackrule[\c!breedte=##1]}}%
+ \dimen0=\@@ibbreedte\relax
+ \advance\dimen0 by -4em\relax
+ \!!counta=\lastpage
+ \advance\!!counta by -1
+ \divide\dimen0 by \!!counta
+ \!!counta=\realpageno
+ \advance\!!counta by -1\relax
+ \!!widtha=\!!counta\dimen0\relax
+ \!!countb=\lastpage
+ \advance\!!countb by -\realpageno
+ \!!widthb=\!!countb\dimen0\relax
+ \startcolor[\locationcolor\@@ibkleur]%
+ \goto{1em}\firstpage
+ \hss
+ \goto{\!!widtha}\prevpage
+ \color[\@@ibcontrastkleur]{\blackrule[\c!breedte=1em]}%
+ \goto{\!!widthb}\nextpage
+ \hss
+ \goto{1em}\lastpage
+ \stopcolor}%
+ \fi
+ \fi}
+
+\def\interactiebalkd%
+ {\iflocation\ifshowingsubpage
+ \ifnum\nofsubpages>1\relax
+ \hbox
+ \bgroup
+ \stelinteractiein[\c!breedte=\!!zeropoint]%
+ \ifbalksymbool % beter: 3 chars assign en 3*box
+ \setbox0=\hbox{\gobackwardcharacter}%
+ \setbox2=\hbox{\gotosomewherecharacter}%
+ \setbox4=\hbox{\goforwardcharacter}%
+ \else
+ \setbox0=\hbox
+ {\vrule
+ \!!height\@@ibhoogte
+ \!!depth\@@ibdiepte
+ \!!width\@@ibbreedte}%
+ \setbox2=\copy0
+ \setbox4=\copy0
+ \fi
+ \startcolor[\locationcolor\@@ibkleur]%
+ \for\teller=1\to\nofsubpages\step1\do
+ {\bgroup
+ \increment(\teller,\firstsubpage)\relax
+ \decrement\teller\relax
+ \ifnum\teller<\realpageno\relax
+ \gotorealpage{}{}{\teller}{\copy0}\relax
+ \else\ifnum\teller=\realpageno\relax
+ \color
+ [\@@ibcontrastkleur]
+ {\gotorealpage{}{}{\teller}{\copy2}}%
+ \else
+ \gotorealpage{}{}{\teller}{\copy4}\relax
+ \fi\fi
+ \egroup
+ \hskip\@@ibafstand}%
+ \unskip
+ \stopcolor
+ \egroup
+ \fi
+ \fi\fi}
+
+\def\interactiebalke% KAN WORDEN GECOMBINEERD MET D
+ {\iflocation\ifshowingsubpage
+ \ifnum\nofsubpages>1\relax
+ \bgroup
+ \!!widthb=\@@ibafstand
+ \multiply\!!widthb by \nofsubpages
+ \advance\!!widthb by -\@@ibafstand % (n-1)
+ \!!widtha=\@@ibbreedte
+ \advance\!!widtha by -\!!widthb
+ \divide\!!widtha by \nofsubpages\relax
+ \ifdim\!!widtha<\@@ibafstand\relax
+ \interactiebalkf
+ \else
+ \stelinteractiein[\c!breedte=\!!zeropoint]%
+ \noindent
+ \hbox to \@@ibbreedte
+ \bgroup
+ \ifbalksymbool
+ \setbox0=\hbox{\gobackwardcharacter}%
+ \setbox2=\hbox{\gotosomewherecharacter}%
+ \setbox4=\hbox{\goforwardcharacter}%
+ \else
+ \setbox0=\hbox
+ {\vrule
+ \!!height\@@ibhoogte
+ \!!depth\@@ibdiepte
+ \!!width\!!widtha}%
+ \setbox2=\copy0
+ \setbox4=\copy0
+ \fi
+ \startcolor[\locationcolor\@@ibkleur]%
+ \for\teller=1\to\nofsubpages\step1\do
+ {\bgroup
+ \increment(\teller,\firstsubpage)\relax
+ \decrement\teller\relax
+ \ifnum\teller<\realpageno\relax
+ \gotorealpage{}{}{\teller}{\copy0}\relax
+ \else\ifnum\teller=\realpageno\relax
+ \color
+ [\@@ibcontrastkleur]
+ {\gotorealpage{}{}{\teller}{\copy2}}%
+ \else
+ \gotorealpage{}{}{\teller}{\copy4}\relax
+ \fi\fi
+ \egroup
+ \hss}%
+ \unskip
+ \stopcolor
+ \egroup
+ \fi
+ \egroup
+ \fi
+ \fi\fi}
+
+\def\interactiebalkf% !! KAN WORDEN GECOMBINEERD MET D !!
+ {\iflocation\ifshowingsubpage
+ \ifnum\nofsubpages>1\relax
+ \stelinteractiein[\c!breedte=\!!zeropoint]%
+ \noindent
+ \hbox to \@@ibbreedte
+ \bgroup
+ \!!countb=0
+ \loop
+ \advance\!!countb by 1\relax
+ \!!countc=\nofsubpages
+ \divide\!!countc by \!!countb
+ \advance\!!countc by 1
+ \!!widthb=\@@ibafstand
+ \multiply\!!widthb by \!!countc
+ \advance\!!widthb by -\@@ibafstand
+ \!!widtha=\@@ibbreedte
+ \advance\!!widtha by -\!!widthb
+ \divide\!!widtha by \!!countc
+ \ifdim\!!widtha<\@@ibafstand\relax
+ \repeat
+ \ifbalksymbool
+ \setbox0=\hbox{\gobackwardcharacter}%
+ \setbox2=\hbox{\gotosomewherecharacter}%
+ \setbox4=\hbox{\goforwardcharacter}%
+ \else
+ \setbox0=\hbox
+ {\vrule
+ \!!height\@@ibhoogte
+ \!!depth\@@ibdiepte
+ \!!width\!!widtha}%
+ \setbox2=\hbox
+ {\dimen0=\@@ibhoogte
+ \dimen2=\@@ibdiepte
+ \vrule
+ \!!height.5\dimen0
+ \!!depth.5\dimen2
+ \!!width\!!widtha}%
+ \ht2=\ht0
+ \dp2=\dp0
+ \setbox4=\copy0
+ \fi
+ \def\goto##1##2%
+ {\ifnum##1=\realpageno\relax
+ \color
+ [\@@ibcontrastkleur]
+ {\gotorealpage{}{}{##1}{##2}}%
+ \else
+ \gotorealpage{}{}{##1}{##2}\relax
+ \fi}%
+ \startcolor[\locationcolor\@@ibkleur]%
+ \!!countc=\realpageno \advance\!!countc by -2\relax
+ \!!countd=\realpageno \advance\!!countd by 2\relax
+ \for\teller=\firstsubpage\to\lastsubpage\step1\do
+ {\!!doneafalse
+ \!!donebfalse
+ \ifnum\teller=\firstsubpage\relax \!!doneatrue \fi
+ \ifnum\teller=\lastsubpage\relax \!!doneatrue \fi
+ \ifnum\teller>\!!countc \ifnum\teller<\!!countd \!!doneatrue \fi\fi
+ \advance\!!countf by 1\relax
+ \ifnum\!!countf=\!!countb\relax \!!donebtrue \fi
+ \if!!donea % nog eens checken
+ \!!countf=0
+ \goto\teller{\copy2}%
+ \hss
+ \else\if!!doneb
+ \!!countf=0
+ \ifnum\teller<\realpageno\relax
+ \goto\teller{\copy0}%
+ \else\ifnum\teller>\realpageno\relax
+ \goto\teller{\copy2}%
+ \else
+ \goto\teller{\copy4}%
+ \fi\fi
+ \hss
+ \fi\fi}%
+ \unskip
+ \stopcolor
+ \egroup
+ \fi
+ \fi\fi}
+
+\def\interactiebalkb%
+ {\ifnum\lastpage>\firstpage\relax
+ \interactiebuttons
+ [\v!eerste \v!pagina,
+ \v!vorige \v!pagina,
+ \v!volgende\v!pagina,
+ \v!laatste \v!pagina]%
+ \fi}
+
+\def\interactiebalkg%
+ {\ifnum\lastsubpage>\firstsubpage\relax
+ \interactiebuttons
+ [\v!eerste \v!sub\v!pagina,
+ \v!vorige \v!sub\v!pagina,
+ \v!volgende\v!sub\v!pagina,
+ \v!laatste \v!sub\v!pagina]%
+ \fi}
+
+\def\complexinteractiebalk[#1]%
+ {\doifelse{#1}{\v!reset}%
+ {\global\setbox\meterbox=\box\voidb@x}%
+ {\bgroup
+ \iflocation
+ \checksubpages % goes wrong / loads \numberofpages too
+ \getparameters[\??ib][#1]%
+ \doif{\@@ibstatus}{\v!start}
+ {\startinteractie
+ \processaction
+ [\@@ibvariant]
+ [d=>{\getparameters[\??ib][\c!breedte=.5em,\c!hoogte=.5em,#1]},
+ e=>{\getparameters[\??ib][\c!hoogte=.5em,\c!afstand=.2em,#1]},
+ f=>{\getparameters[\??ib][\c!hoogte=.5em,\c!afstand=.2em,#1]}]%
+ \doifelse{\@@ibsymbool}{\v!ja}
+ {\balksymbooltrue}
+ {\balksymboolfalse}%
+ \getvalue{interactiebalk\@@ibvariant}%
+ \stopinteractie}%
+ \fi
+ \egroup}}
+
+\unexpanded\def\interactiebalk%
+ {\complexorsimpleempty{interactiebalk}}
+
+\def\stelinteractiebalkin%
+ {\dodoubleargument\getparameters[\??ib]}
+
+%I n=Profielen
+%I c=\definieerprofiel,\startprofiel,\volgprofiel
+%I
+%I Er kunnen een gericht leesprofiel worden gedefinieerd.
+%I Daartoe worden delen van de tekst gemerkt met commando:
+%I
+%I \startprofiel[label,label,...]
+%I \stopprofiel
+%I
+%I Een profiel wordt vervolgens samengesteld uit gemerkte
+%I teksten:
+%I
+%I \definieerprofiel[naam,naam][label,label,...]
+%I
+%I en kan worden gevolgd met:
+%I
+%I \volgprofiel{tekst}[naam]
+%I
+%I Dit laatste commando is te vergelijken met \naar, met dat
+%I verschil dat naar een serie teksten wordt gesprongen.
+%P
+%I Profielen kunnen worden getest. In dat geval worden de
+%I begin- en eindpunten in de tekst aangegeven. De labels
+%I zijn actief, zodat snel heen en weer gesprongen kan worden.
+%I
+%I \stelprofielenin[optie=]
+%I
+%I Hierbij kan optie de waarde 'test' hebben.
+
+% Er wordt vooralsnog uitgegaan van een symmetrische
+% start-stop situatie.
+
+\def\c!profiel!! {profiel:} % brrr
+\def\c!versie!! {versie:}
+
+\def\dodefinieerprofiel[#1][#2]%
+ {\iflocation
+ \def\dododefinieerprofiel##1%
+ {\def\dodododefinieerprofiel####1%
+ {\doifdefinedelse{\c!profiel!!####1}%
+ {\edef\!!stringa{\getvalue{\c!profiel!!####1}}%
+ \setevalue{\c!profiel!!####1}{\!!stringa,##1}}%
+ {\setevalue{\c!profiel!!####1}{##1}}}%
+ \processcommalist[#2]\dodododefinieerprofiel}%
+ \processcommalist[#1]\dododefinieerprofiel
+ \fi}
+
+\def\definieerprofiel%
+ {\dodoubleargument\dodefinieerprofiel}
+
+% Als met \getpar wordt gewerkt, dan moet \next worden toegepast.
+
+\def\profilepage{}
+
+\let\dosetprofilepage=\relax
+\let\dogetprofilepage=\relax
+
+\def\processprofile[#1]#2#3%
+ {\iflocation
+ \par % needed for pdftex
+ \bgroup
+ \dosetprofilepage
+ \dogetprofilepage
+ \def\processoneprofile##1##2%
+ {\ExpandBothAfter\doifinsetelse{##2}{\processedprofiles}%
+ {\doifsomething{##1}{(##1)}}%
+ {\addtocommalist{##2}\processedprofiles
+ ##1\relax
+ #3{##2}{\hsize}{\profilepage}}}%
+ \def\processedprofiles{}%
+ \def\doprocessprofile##1%
+ {\doifelse{\@@pfoptie}{\v!test}%
+ {\goodbreak\blanko\nobreak\tt[\spatie
+ #2 profiel\spatie ##1:\spatie
+ \doifdefinedelse{\c!profiel!!##1}%
+ {\def\dodoprocessprofile####1%
+ {\processoneprofile
+ {\naar{####1}[\c!profiel!!####1]}%
+ {####1}%
+ \spatie}%
+ \processcommacommand
+ [\getvalue{\c!profiel!!##1}]\dodoprocessprofile}%
+ {- }%
+ ]\nobreak\blanko}%
+ {\doifdefined{\c!profiel!!##1}%
+ {\def\dodoprocessprofile####1%
+ {\processoneprofile{}{####1}}%
+ \processcommacommand
+ [\getvalue{\c!profiel!!##1}]\dodoprocessprofile}}}%
+ \processcommalist[#1]\doprocessprofile
+ \egroup
+ \par % needed for pdftex
+ \fi}
+
+\def\startprofiel[#1]%
+ {\iflocation
+ \bgroup
+ \addtocommalist{#1}\actualprofile
+ \def\stopprofiel%
+ {\processprofile[#1]\v!stop\doendofprofile
+ \egroup}%
+ \DoAfterFi\processprofile[#1]\v!start\dobeginofprofile
+ \fi}
+
+\let\stopprofiel=\relax
+
+\def\dovolgprofiel#1[#2]%
+ {\iflocation
+ \hbox
+ {\dostartgoto
+ \data
+ {\dolocationattributes{\??ia}{#1\presetgoto}}%
+ \start
+ \dostartgotoprofile
+ {\number\buttonwidth}{\number\buttonheight}
+ {#2}%
+ \stop
+ \dostopgotoprofile
+ \dostopgoto}%
+ \else
+ {#1}%
+ \fi}
+
+\def\volgprofiel#1[#2]%
+ {\iflocation
+ \doif{\@@pfoptie}{\v!test}{\pagereference[\c!profiel!!#2]}%
+ \dovolgprofiel{#1}[#2]%
+ \fi}
+
+\def\stelprofielenin%
+ {\dodoubleargument\getparameters[\??pf]}
+
+% Als er nog geen tekst op de pagina staat, dan heeft het
+% profiel betrekking op het bovenstaande, dus soms een vorige
+% pagina! Vreemd, omdat PDF paginagewijs werkt. Gelukkig
+% biedt /page een oplossing. Echter: expansie van een
+% \special kan niet worden uitgesteld, zodat alleen een
+% two-pass een oplossing vormt. Het onderstaande kan komen
+% te vervallen als Acrobat dit ondervangt. Het scheelt een
+% pass en een lijst.
+%
+% Er kunnen eventueel twee lijsten worden gebruikt. Een voor
+% het begin (start) en een voor het eind (stop). Nu staat
+% alles in een lijst.
+
+\definetwopasslist{\s!profile}
+
+\newcounter\currentprofile
+
+\def\dosetprofilepage%
+ {\doglobal\increment\currentprofile
+ \edef\docommando%
+ {\writeutilitycommand%
+ {\twopassentry%
+ {\s!profile}%
+ {\currentprofile}%
+ {\noexpand\realfolio}}}%
+ \docommando}
+
+\def\dogetprofilepage%
+ {\gettwopassdata{\s!profile}%
+ \let\profilepage=\twopassdata}
+
+%I n=Versies
+%I c=\definieerversie,\stelversiesin,\startversie
+%I c=\selecteerversie,\markeerversie,\volgversie
+%I
+%I Het mechanisme om wijzigingen in een tekst te markeren en
+%I selecteren sluit aan op dat van profielen.
+%I
+%I Een deel van de tekst kan worden gemarkeerd met ofwel
+%I
+%I \startversie[nr,nr,...]
+%I \stopversie
+%I
+%I of tussen @+ ...... @-. Eventueel mogen achter @+ nummers
+%I worden opgenomen: @+nr,nr,... ...... @-.
+%I
+%I Aldus gemerkte tekst kan in een afwijkende letter worden
+%I weergegeven, bijvoorbeeld \ss. Daarbij wordt de laagste
+%I nog te mrkeren versie opgegeven:
+%I
+%I \stelversiesin[nummer=,letter=]
+%I
+%I Een versienummer mag punten (.) bevatten. Deze worden
+%I voor het vergelijken niet meegenomen. Oppassen dus: 1.10
+%I wordt 110 en 2.2 wordt 22 en moet +%P
+%I Het is mogelijk alleen de 'recente' wijzigingen te
+%I verwerken. Dit gaat in twee slagen:
+%I
+%I \markeerversie (eerste slag)
+%I \selecteerversie (tweede slag)
+%I
+%I Er is gekozen voor het bewust markeren, omdat het
+%I markeren gaat ten koste van de omvang van de hulpfile.
+%P
+%I Evenals profielen, kunnen ook versie worden gevolgd. Ook
+%I hier dient eerst een definitie plaats te vinden:
+%I
+%I \definieerversie[naam][nummer,nummer,nummer]
+%I
+%I waarna gebruik kan worden gemaakt van:
+%I
+%I \volgversie{tekst}[naam]
+%I
+%I Er is ook een combinatie (doorsnede) mogelijk van
+%I profielen en versies:
+%I
+%I \volgprofielversie{tekst}[naam profiel][naam versie]
+
+\newcounter\versionlevel
+\newcounter\versionorder
+
+\newif\ifrecentversion
+
+\let\oldatcharacter=@
+
+\def\minimumversion{0}
+\def\actualversion{0}
+
+\def\dostelversiesin[#1]%
+ {\getparameters[\??ve][#1]
+ \stripcharacter.\from\@@venummer\to\minimumversion
+ \setversion}
+
+\def\stelversiesin%
+ {\dosingleargument\dostelversiesin}
+
+\definetwopasslist{\s!versionbegin}
+\definetwopasslist{\s!versionend}
+
+\def\actualprofile{}
+
+\def\doresetpageversion%
+ {\edef\docommando%
+ {\writeutilitycommand%
+ {\twopassentry%
+ {\s!versionend}%
+ {\versionorder}%
+ {\noexpand\realfolio}}}%
+ \docommando}
+
+\def\dosetpageversion#1%
+ {\recentversiontrue
+ \doglobal\increment\versionorder\relax
+ \edef\docommando%
+ {\writeutilitycommand%
+ {\twopassentry%
+ {\s!versionbegin}%
+ {\versionorder}%
+ {\noexpand\realfolio}}}%
+ \docommando
+ \let\resetpageversion=\doresetpageversion}
+
+\def\recentcontributions{}
+
+\def\checkrecentcontributions%
+ {\gettwopassdata{\s!versionbegin}%
+ \iftwopassdatafound
+ \!!counta=\twopassdata\relax
+ \gettwopassdata{\s!versionend}%
+ \iftwopassdatafound
+ \!!countb=\twopassdata\relax
+ \doglobal\increment\versionorder\relax
+ \writeutilitycommand%
+ {\twopassentry%
+ {\s!versionbegin}%
+ {\versionorder}%
+ {\the\!!counta}}%
+ \writeutilitycommand%
+ {\twopassentry%
+ {\s!versionend}%
+ {\versionorder}%
+ {\the\!!countb}}%
+ \for\teller=\!!counta\to\!!countb\step1\do%
+ {\@EA\doglobal\@EA\addtocommalist\@EA{\teller}{\recentcontributions}}%
+ \let\next=\checkrecentcontributions
+ \else
+ \let\next=\relax
+ \fi
+ \else
+ \let\next=\relax
+ \fi
+ \next}
+
+\def\docheckpageversion%
+ {\ExpandBothAfter\doifinsetelse{\realfolio}{\recentcontributions}
+ {\geselecteerdtrue}%
+ {\geselecteerdfalse}}
+
+\let\setpageversion = \gobbleoneargument
+\let\resetpageversion = \relax
+\let\checkpageversion = \relax
+
+\def\complexstartversie[#1]%
+ {\bgroup
+ \doifelse{\actualprofile}{}%
+ {\startprofiel[#1]}%
+ {\startprofiel[#1,\actualprofile]}%
+ \def\docomplexstartversie##1%
+ {\stripcharacter.\from##1\to\actualversion
+ \ifnum\versionlevel>0\relax
+ \ifnum\actualversion=0\relax
+ \setpageversion\actualversion % unknown version
+ \else
+ \ifnum\actualversion<\minimumversion\relax
+ \relax % old version
+ \else
+ \setpageversion\actualversion % new version
+ \fi
+ \fi
+ \fi}%
+ \doglobal\increment\versionlevel\relax
+ \doifelsenothing{#1}
+ {\docomplexstartversie{0}}%
+ {\processcommalist[#1]\docomplexstartversie}}
+
+\def\startversie%
+ {\complexorsimpleempty{startversie}}
+
+\def\stopversie%
+ {\stopprofiel
+ \doglobal\decrement\versionlevel
+ \ifnum\versionlevel<0\relax
+ \showmessage{\m!versions}{1}{}%
+ \else
+ \resetpageversion
+ \egroup
+ \fi}
+
+\bgroup
+\catcode`@=\active
+\gdef\setversion%
+ {\catcode`@=\active % we can't use \@@active here
+ \long\def@##1##2 %
+ {\ifx##1+%
+ \startversie[##2]%
+ \else\ifx##1-%
+ \stopversie
+ \else
+ \oldatcharacter##1##2 %
+ \fi\fi}}
+\egroup
+
+\def\markeerversie%
+ {\showmessage{\m!versions}{2}{}%
+ \let\setpageversion=\dosetpageversion
+ \let\resetpageversion=\relax
+ \let\checkpageversion=\relax}
+
+\def\selecteerversie%
+ {\checkrecentcontributions
+ \showmessage{\m!versions}{3}{\recentcontributions}%
+ \let\setpageversion=\gobbleoneargument
+ \let\resetpageversion=\relax
+ \let\checkpageversion=\docheckpageversion
+ \setversion}
+
+\def\dodefinieerversie[#1][#2]%
+ {\setvalue{\c!versie!!#1}{#2}%
+ \definieerprofiel[#1][#2]}
+
+\def\definieerversie%
+ {\dodoubleargument\dodefinieerversie}
+
+\def\volgversie%
+ {\volgprofiel}
+
+\def\volgprofielversie#1[#2][#3]%
+ {\def\docommando##1%
+ {\definieerprofiel[#2#3][##1]}%
+ \processcommacommand[\getvalue{\c!versie!!#3}]\docommando
+ \volgprofiel#1[#2#3]}
+
+\newcounter\currentpagetransition
+
+\definecomplexorsimple\stelpaginaovergangenin
+
+\def\simplestelpaginaovergangenin%
+ {\complexstelpaginaovergangenin[\pagetransitions]}
+
+\def\complexstelpaginaovergangenin[#1]%
+ {\doifsomething{#1}
+ {\doifelse{#1}{\v!reset}
+ {\let\setpagetransition=\relax}
+ {\def\setpagetransition%
+ {\doifelse{#1}{\v!willekeurig}
+ {\expanded{\getcommalistsize[\pagetransitions]}%
+ \getrandomnumber{\currentpagetransition}{1}{\commalistsize}%
+ \expanded{\getfromcommalist[\pagetransitions][\currentpagetransition]}}
+ {\doglobal\increment\currentpagetransition
+ \expanded{\getfromcommalist[#1][\currentpagetransition]}}%
+ \ifx\commalistelement\empty
+ \doglobal\newcounter\currentpagetransition
+ \setpagetransition
+ \else\iflocation
+ %\message{[\commalistelement]}\wait
+ \expanded{\dosetpagetransition{\commalistelement}}%
+ \fi\fi}}}}
+
+\prependtoks \setpagetransition \to \everyshipout
+
+% temporary here
+
+%D \startbuffer
+%D \dorecurse{10}
+%D {\horizontalpositionbar
+%D \pos\recurselevel \min1 \max10
+%D \token\framed{\recurselevel}%
+%D \\}
+%D
+%D \hbox to 15em
+%D {\hss
+%D \dorecurse{10}
+%D {\verticalpositionbar\pos\recurselevel\min1\max10\token\blokje\\
+%D \hss}}
+%D \stopbuffer
+
+\def\horizontalpositionbar\pos#1\min#2\max#3\token#4\\%
+ {\hbox to \hsize
+ {\hskip\!!zeropoint\!!plus #1\!!fill
+ \hskip\!!zeropoint\!!plus-#2\!!fill
+ #4\relax
+ \hskip\!!zeropoint\!!plus #3\!!fill
+ \hskip\!!zeropoint\!!plus-#1\!!fill}}
+
+\def\verticalpositionbar\pos#1\min#2\max#3\token#4\\%
+ {\vbox to \vsize
+ {\vskip\!!zeropoint\!!plus #1\!!fill
+ \vskip\!!zeropoint\!!plus-#2\!!fill
+ \hbox{#4}\relax
+ \vskip\!!zeropoint\!!plus #3\!!fill
+ \vskip\!!zeropoint\!!plus-#1\!!fill}}
+
+\def\horizontalgrowingbar\pos#1\min#2\max#3\height#4\depth#5\\%
+ {\hbox to \hsize
+ {\scratchcounter=#1\relax
+ \advance\scratchcounter by -#2\relax
+ \advance\scratchcounter by 1\relax
+ \leaders\vrule\hskip\!!zeropoint\!!plus \scratchcounter\!!fill
+ \vrule\!!width\!!zeropoint\!!height#4\!!depth#5\relax
+ \hskip\!!zeropoint\!!plus #3\!!fill
+ \hskip\!!zeropoint\!!plus-#1\!!fill}}
+
+\def\verticalgrowingbar\pos#1\min#2\max#3\width#4\\%
+ {\vbox to \vsize
+ {\scratchcounter=#1\relax
+ \advance\scratchcounter by -#2\relax
+ \advance\scratchcounter by 1\relax
+ \leaders\hrule\vskip\!!zeropoint\!!plus\scratchcounter\!!fill
+ \hrule\!!width#4\!!height\!!zeropoint\!!depth\!!zeropoint
+ \vskip\!!zeropoint\!!plus #3\!!fill
+ \vskip\!!zeropoint\!!plus-#1\!!fill}}
+
+\definieerinteractiemenu
+ [\v!rechts]
+ [\v!rechts]
+ [\c!voor=,
+ \c!na=\vfil,
+ \c!tussen=\blanko,
+ \c!afstand=12pt,
+ \c!links=\hss,
+ \c!rechts=\hss,
+ \c!breedte=\rechterrandbreedte,
+ \c!hoogte=\v!ruim]
+
+\definieerinteractiemenu
+ [\v!links]
+ [\v!links]
+ [\c!voor=,
+ \c!na=\vfil,
+ \c!tussen=\blanko,
+ \c!afstand=12pt,
+ \c!links=\hss,
+ \c!rechts=\hss,
+ \c!breedte=\linkerrandbreedte,
+ \c!hoogte=\v!ruim]
+
+\definieerinteractiemenu
+ [\v!onder]
+ [\v!onder]
+ [\c!voor=\vss,
+ \c!na=\vss,
+ \c!midden=\hfil,
+ \c!afstand=12pt,
+ \c!breedte=\v!passend,
+ \c!hoogte=\v!ruim]
+
+\definieerinteractiemenu
+ [\v!boven]
+ [\v!boven]
+ [\c!voor=\vss,
+ \c!na=\vss,
+ \c!midden=\hfil,
+ \c!afstand=12pt,
+ \c!breedte=\v!passend,
+ \c!hoogte=\v!ruim]
+
+\stelinteractiemenuin
+ [\v!links,\v!rechts,\v!boven,\v!onder]
+ [\c!offset=.25em,
+ \c!kader=\v!aan,
+ \c!achtergrond=,
+ \c!achtergrondkleur=,
+ \c!achtergrondraster=\@@rsraster,
+ \c!letter=\@@ialetter,
+ \c!kleur=\@@iakleur,
+ \c!status=\v!start,
+ \c!zelfdepagina=\v!ja,
+ \c!onbekendeverwijzing=\v!leeg,
+ \c!bovenoffset=\!!zeropoint,
+ \c!onderoffset=\!!zeropoint,
+ \c!linkeroffset=\!!zeropoint,
+ \c!rechteroffset=\!!zeropoint]
+
+\stelbovenin [\v!tekst] [\c!middentekst={\interactiemenus[\v!boven]}]
+\stelonderin [\v!tekst] [\c!middentekst={\interactiemenus[\v!onder]}]
+
+\def\plaatsrechterrandblok {\interactiemenus[\v!rechts]}
+\def\plaatslinkerrandblok {\interactiemenus[\v!links]}
+
+\stelinteractieschermin
+ [\c!breedte=\printpapierbreedte,
+ \c!hoogte=\printpapierhoogte,
+ \c!rugoffset=\!!zeropoint,
+ \c!kopoffset=\!!zeropoint,
+ \c!rugwit=\rugwit,
+ \c!kopwit=\kopwit,
+ \c!optie=\c!min]
+
+\stelexternefigurenin
+ [\c!hokjes=\v!uit,
+ \c!ymax=24,
+ \c!xmax=]
+
+\stelbuttonsin
+ [\c!breedte=\v!passend,
+ \c!hoogte=\v!ruim,
+ \c!offset=0.25em,
+ \c!kader=\v!aan,
+ \c!achtergrond=,
+ \c!achtergrondraster=\@@rsraster,
+ \c!achtergrondkleur=,
+ \c!letter=\@@ialetter,
+ \c!kleur=\@@iakleur,
+ \c!zelfdepagina=\v!ja,
+ \c!onbekendeverwijzing=\v!leeg]
+
+\stelinteractiebalkin
+ [\c!status=\v!start,
+ \c!variant=a,
+ \c!symbool=\v!nee,
+ \c!breedte=\rechterrandbreedte,
+ \c!hoogte=\v!ruim,
+ \c!diepte=\!!zeropoint,
+ \c!afstand=1em,
+ \c!stap=1,
+ \c!kleur=\@@iakleur,
+ \c!contrastkleur=\@@iacontrastkleur,
+ \c!kader=\v!aan,
+ \c!achtergrond=,
+ \c!achtergrondraster=\@@rsraster,
+ \c!achtergrondkleur=]
+
+\stelsynchronisatiebalkin
+ [\c!variant=\v!pagina,
+ \c!breedte=\rechterrandbreedte,
+ \c!letter=\@@ialetter,
+ \c!kleur=\@@iakleur,
+ \c!achtergrond=,
+ \c!achtergrondraster=\@@rsraster,
+ \c!achtergrondkleur=]
+
+\stelsynchronisatiein
+ [\c!status=\v!stop]
+
+\stelversiesin
+ [\c!nummer=1,
+ \c!letter=\ss,
+ \c!kleur=]
+
+\stelprofielenin
+ [\c!optie=]
+
+\stelprogrammasin
+ [\c!gebied=]
+
+\stelpaginaovergangenin
+ [\v!reset]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-01e.tex b/tex/context/base/core-01e.tex index 567c079b3..70487ec8b 100644 --- a/tex/context/base/core-01e.tex +++ b/tex/context/base/core-01e.tex @@ -1,422 +1,423 @@ -%D \module -%D [ file=core-01e, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=1E (to be split), -%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 Core Macros (e)} - -\unprotect - -% \ifprocesspreviousparagraphs -% -% \nofskippedparagraphs -% \paragraphnumber -% \nofparagraphs -% -% \dosetparagraph -% \doresetparagraph -% \dobeforeparagraph -% \doafterparagraph -% \dobeforeskipparagraph -% \doafterskipparagraph -% -% \pushparagraphs\endcommand alle alineas tot \endcommand laden -% \pushmoreparagraphs\endcommand alle alineas tot \endcommand toevoegen -% \popparagraphs alle alineas oproepen -% \popparagraphs[a,b,c] enkele alineas oproepen [geen] -% -% tzt een optionele prefix: -% -% \pushparagraphs[xxx]\endcommand alle alineas tot \endcommand laden -% \popparagraphs[xxx] alle alineas oproepen -% \popparagraphs[xxx][a,b,c] enkele alineas oproepen -% -% \numberparagraphs -% \numberparagraphlines -% \resetparagraphlines - -\newif\ifprocesspreviousparagraphs % public -\newif\ifprocessallparagraphs % private - -\newcounter\totalnofparagraphs % private -\newcounter\globalparagraphnumber % private -\newcounter\discardedparagraphs % private -\newcounter\mostrecentparagraphtotal % public - -\let\dosetparagraph = \relax % public -\let\doresetparagraph = \relax % public -\let\dobeforeparagraph = \relax % public -\let\doafterparagraph = \relax % public -\let\dobeforeskipparagraph = \relax % public -\let\doafterskipparagraph = \relax % public - -\def\paragraphnumber {} % public -\def\nofparagraphs {} % public -\def\nofskippedparagraphs {} % public - -\def\paragraphprefix {paragraph} % private - -% voorlopig, wordt nog class - -\def\resetparagraphlines% - {\global\linenumber=1\relax} - -\def\numberparagraphs% - {\processpreviousparagraphstrue - \def\dosetparagraph% - {\bgroup - \resetparagraphlines - \EveryPar - {\strut\inlinkermarge{\tx\paragraphnumber\kern2em}% - \ignorespaces}} - \def\doresetparagraph% - {\resetparagraphlines - \egroup}} - -\def\numberparagraphlines% - {\processpreviousparagraphstrue - \def\dosetparagraph% - {\resetparagraphlines} - \def\doresetparagraph% - {\resetparagraphlines} - \def\dobeforeparagraph% - {\startregelnummeren[\v!verder]} - \def\doafterparagraph% - {\stopregelnummeren} - \def\dobeforeskipparagraph% - {\stopregelnummeren - \let\paragraphnumber=\relax} - \def\doafterskipparagraph% - {\startregelnummeren[\v!verder]}} - -\def\dopushparagraphs#1% - {\global\let\mostrecentparagraphtotal=\totalnofparagraphs - \ifx#1\undefined - \let#1=\relax - \fi - \convertargument#1\to\asciiA - \convertargument{ }\to\asciiB % lege regel - \def\dopushparagraph##1\par% - {\convertargument##1\to\asciiC - \doifelse{\asciiC}{\asciiA} - {\let\next=#1} - {\doifnot{\asciiC}{} % lege paragraaf - {\doifnot{\asciiC}{\asciiB} - {\doglobal\increment\totalnofparagraphs - \ifnum\totalnofparagraphs>0\nofskippedparagraphs\relax - \setgvalue{\paragraphprefix\totalnofparagraphs}% - {##1}% - \else - \setgvalue{\paragraphprefix\totalnofparagraphs}% - {\skipparagraph##1\par}% - \fi}}% - \let\next=\dopushparagraph} - \next}% - \dopushparagraph} - -\def\pushparagraphs% - {\doglobal\newcounter\totalnofparagraphs - \dopushparagraphs} - -\def\pushmoreparagraphs% - {\dopushparagraphs} - -\def\dododopopparagraph#1% no grouping, i.v.m. sidefloats - {\ifnum#1>\totalnofparagraphs\relax - \else - \let\paragraphnumber=\globalparagraphnumber - \decrement(\paragraphnumber,\discardedparagraphs)% - \dobeforeparagraph - \ifhmode\indentation\fi\getvalue{\paragraphprefix#1}\par - \doafterparagraph - \fi} - -\long\def\skipparagraph#1\par% - {\doglobal\increment\discardedparagraphs - \ifprocessallparagraphs - \dobeforeskipparagraph - \ifhmode\indentation\fi#1\par - \doafterskipparagraph - \fi} - -\def\dodopopparagraph% - {\dododopopparagraph} - -\def\dodoprocessparagraph#1% - {\ifprocesspreviousparagraphs - \bgroup - \setbox0=\vbox{\dododopopparagraph{#1}}% - \egroup - \fi} - -\def\processpreviousparagraphs[#1]% process previous ones - {\ifprocesspreviousparagraphs - \bgroup - \getfromcommacommand[#1][1]% - \let\totalnofparagraphs=\commalistelement - \decrement\totalnofparagraphs - \let\dodopopparagraph=\dodoprocessparagraph - \popparagraphs - \egroup - \fi} - -\def\dopopparagraphs[#1]% - {\doifnotinset{#1}{\v!geen,0} - {\dosetparagraph - \doglobal\newcounter\globalparagraphnumber - \doglobal\newcounter\discardedparagraphs - \doifelse{#1}{} - {\processallparagraphstrue} - {\processallparagraphsfalse}% - \def\dopopparagraph% - {\doglobal\increment\globalparagraphnumber - \ifnum\globalparagraphnumber>\totalnofparagraphs\relax - \let\dopopparagraph=\relax - \else\ifprocessallparagraphs - \ifnum\globalparagraphnumber>\mostrecentparagraphtotal\relax - \dodopopparagraph\globalparagraphnumber - \else - \dodoprocessparagraph\globalparagraphnumber - \fi - \else - \let\paragraphnumber=\globalparagraphnumber - \decrement(\paragraphnumber,\discardedparagraphs)% - \ExpandBothAfter\doifinsetelse{\paragraphnumber}{#1} - {\dodopopparagraph\globalparagraphnumber} - {\dodoprocessparagraph\globalparagraphnumber}% - \fi\fi - \dopopparagraph}% - \dopopparagraph - \doresetparagraph}} - -\def\popparagraphs% - {\dosingleempty\dopopparagraphs} - -\def\countparagraphs% - {\popparagraphs[\!!maxcard]% - \global\let\nofparagraphs=\totalnofparagraphs - \doglobal\decrement(\nofparagraphs,\discardedparagraphs)} - -% \steluitlijnenin[onder] -% \stelwitruimtein[groot] -% -% \toonkader -% -% \numberparagraphlines -% \numberparagraphs -% -% \def\nofskippedparagraphs{1} -% -% \pushparagraphs\ThatsIt -% -% \ruledbaseline eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste -% -% \ruledbaseline eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste eerste eerste eerste -% eerste eerste eerste eerste eerste -% -% \ruledbaseline tweede tweede tweede tweede tweede tweede -% tweede tweede tweede tweede tweede tweede tweede tweede -% tweede tweede tweede tweede tweede tweede tweede tweede -% tweede tweede tweede tweede tweede tweede tweede tweede -% tweede tweede tweede tweede tweede tweede tweede tweede -% tweede tweede tweede tweede tweede tweede tweede tweede -% tweede tweede tweede tweede tweede -% -% \skipparagraph \ruledbaseline skipped skipped skipped -% skipped skipped skipped skipped skipped skipped skipped -% skipped skipped skipped skipped skipped skipped skipped -% skipped skipped -% -% \ruledbaseline derde derde derde derde derde derde derde -% derde derde derde derde derde derde derde derde derde derde -% derde derde derde derde derde derde derde derde derde derde -% derde derde derde derde derde derde derde derde derde derde -% derde derde derde derde derde derde derde derde derde derde -% derde derde derde derde derde derde derde derde derde derde -% -% \skipparagraph \ruledbaseline skipped skipped skipped -% skipped skipped skipped skipped skipped skipped skipped -% skipped skipped skipped skipped skipped skipped skipped -% skipped skipped skipped -% -% \ruledbaseline vierde vierde vierde vierde vierde vierde -% vierde vierde vierde vierde vierde vierde vierde vierde -% vierde vierde vierde vierde vierde vierde vierde vierde -% vierde vierde vierde vierde -% -% \ruledbaseline vijfde vijfde vijfde vijfde vijfde vijfde -% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde -% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde -% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde -% vijfde vijfde vijfde -% -% \skipparagraph \ruledbaseline skipped skipped skipped -% skipped skipped skipped skipped skipped skipped skipped -% skipped skipped skipped skipped skipped skipped skipped -% skipped skipped skipped -% -% \ThatsIt -% -% \popparagraphs -% -% \countparagraphs -% -% \blanko[2*groot] -% -% nofparagraphs:~\nofparagraphs -% -% \pagina -% -% \popparagraphs[1] -% \popparagraphs[2] -% \popparagraphs[3] -% \popparagraphs[4] -% \popparagraphs[5] -% -% \pagina -% -% \ruledvbox{\popparagraphs[1,2,3,4,5]} -% -% \pagina - -% PAS OP: VERVALLEN -% -% \newif\ifprocesspreviousparagraphs -% \newif\ifprocessallparagraphs -% -% \newcounter\nofskippedparagraphs -% \newcounter\nofmidskippedparagraphs -% -% \def\alineanummer {} -% -% \newcounter\nofalineas -% -% \def\laadalineas#1% alinea = class -% {\doglobal\newcounter\nofalineas -% \doglobal\decrement(\nofalineas,\nofskippedparagraphs)% -% \ifx#1\undefined -% \let#1=\relax -% \fi -% \convertargument#1\to\asciiA -% \convertargument{ }\to\asciiB % lege regel -% \def\dolaadalinea##1\par% -% {\convertargument##1\to\asciiC -% \doifelse{\asciiC}{\asciiA} -% {\let\next=#1} -% {\doifnot{\asciiC}{} % lege paragraaf -% {\doifnot{\asciiC}{\asciiB} -% {\doglobal\increment\nofalineas -% \setgvalue{alinea\nofalineas}{##1}}}% -% \let\next=\dolaadalinea} -% \next}% -% \dolaadalinea} -% -% % De constructie \edef\alineanummer{#1} is nodig voor -% % bijvoorbeeld: -% % -% % \EveryPar{\strut\inlinker{\alineanummer}} -% % -% % Laten we dit weg, dan wordt het vorige nummer gebruikt. -% -% \def\dododohaalalinea#1% geen grouping, i.v.m. sidefloats -% {\edef\localalineanummer{#1}% -% \ifnum\localalineanummer>\nofalineas\relax -% \else -% \ifnum\localalineanummer>0\relax -% \let\alineanummer=\localalineanummer -% \decrement(\alineanummer,\nofmidskippedparagraphs)% -% \else -% \let\alineanummer=\empty -% \fi -% \dopreparagraph -% \doeveryparagraph\getvalue{alinea\localalineanummer}\par -% \dopostparagraph -% \fi} -% -% \long\def\geenalinea#1\par% -% {\ifprocessallparagraphs -% \let\alineanummer=\relax -% \dopostparagraph % fool around a bit -% #1\par -% \dopreparagraph % ugly but effective -% \fi -% \doglobal\increment\nofmidskippedparagraphs} -% -% \def\dodohaalalinea% -% {\dododohaalalinea} -% -% \def\dodoverwerkalinea#1% -% {\ifprocesspreviousparagraphs -% \bgroup -% \setbox0=\vbox{\dododohaalalinea{#1}}% -% \egroup -% \fi} -% -% \def\verwerkvorigealineas[#1]% process previous ones -% {\ifprocesspreviousparagraphs -% \bgroup -% \getfromcommacommand[#1][1]% -% \let\nofalineas=\commalistelement -% \decrement\nofalineas -% \let\dodohaalalinea=\dodoverwerkalinea -% \haalalineas -% \egroup -% \fi} -% -% \let \dosetparagraph = \relax -% \let \doresetparagraph = \relax -% \let \dopreparagraph = \relax -% \let \dopostparagraph = \relax -% \let \doeveryparagraph = \relax -% -% \def\dohaalalineas[#1]% -% {\doifnotinset{#1}{\v!geen,0} -% {\dosetparagraph -% \doglobal\newcounter\globalalineanummer -% \doglobal\newcounter\nofmidskippedparagraphs -% \doifelse{#1}{} -% {\processallparagraphstrue -% \doglobal\decrement(\globalalineanummer,\nofskippedparagraphs)} -% {\processallparagraphsfalse}% -% \def\dohaalalinea% -% {\doglobal\increment\globalalineanummer -% \ifnum\globalalineanummer>\nofalineas\relax -% \let\dohaalalinea=\relax -% \else -% \ifprocessallparagraphs -% \dodohaalalinea\globalalineanummer -% \else -% \let\localalineanummer=\globalalineanummer -% \decrement(\localalineanummer,\nofmidskippedparagraphs)% -% \ExpandBothAfter\doifinsetelse{\localalineanummer}{#1} -% {\dodohaalalinea\globalalineanummer} -% {\dodoverwerkalinea\globalalineanummer}% -% \fi -% \fi -% \dohaalalinea}% -% \dohaalalinea -% \doresetparagraph}} -% -% \def\haalalineas% -% {\dosingleempty\dohaalalineas} - -\protect - -\endinput +%D \module
+%D [ file=core-01e,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=1E (to be split),
+%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 Core Macros (e)}
+
+\unprotect
+
+% \ifprocesspreviousparagraphs
+%
+% \nofskippedparagraphs
+% \paragraphnumber
+% \nofparagraphs
+%
+% \dosetparagraph
+% \doresetparagraph
+% \dobeforeparagraph
+% \doafterparagraph
+% \dobeforeskipparagraph
+% \doafterskipparagraph
+%
+% \pushparagraphs\endcommand alle alineas tot \endcommand laden
+% \pushmoreparagraphs\endcommand alle alineas tot \endcommand toevoegen
+% \popparagraphs alle alineas oproepen
+% \popparagraphs[a,b,c] enkele alineas oproepen [geen]
+%
+% tzt een optionele prefix:
+%
+% \pushparagraphs[xxx]\endcommand alle alineas tot \endcommand laden
+% \popparagraphs[xxx] alle alineas oproepen
+% \popparagraphs[xxx][a,b,c] enkele alineas oproepen
+%
+% \numberparagraphs
+% \numberparagraphlines
+% \resetparagraphlines
+
+\newif\ifprocesspreviousparagraphs % public
+\newif\ifprocessallparagraphs % private
+
+\newcounter\totalnofparagraphs % private
+\newcounter\globalparagraphnumber % private
+\newcounter\discardedparagraphs % private
+\newcounter\mostrecentparagraphtotal % public
+
+\let\dosetparagraph = \relax % public
+\let\doresetparagraph = \relax % public
+\let\dobeforeparagraph = \relax % public
+\let\doafterparagraph = \relax % public
+\let\dobeforeskipparagraph = \relax % public
+\let\doafterskipparagraph = \relax % public
+
+\def\paragraphnumber {} % public
+\def\nofparagraphs {} % public
+\def\nofskippedparagraphs {} % public
+
+\def\paragraphprefix {paragraph} % private
+
+% voorlopig, wordt nog class
+
+\def\resetparagraphlines%
+ {\global\linenumber=1\relax}
+
+\def\numberparagraphs%
+ {\processpreviousparagraphstrue
+ \def\dosetparagraph%
+ {\bgroup
+ \resetparagraphlines
+ \EveryPar
+ {\strut\inlinkermarge{\tx\paragraphnumber\kern2em}%
+ \ignorespaces}}
+ \def\doresetparagraph%
+ {\resetparagraphlines
+ \egroup}}
+
+\def\numberparagraphlines%
+ {\processpreviousparagraphstrue
+ \def\dosetparagraph%
+ {\resetparagraphlines}
+ \def\doresetparagraph%
+ {\resetparagraphlines}
+ \def\dobeforeparagraph%
+ {\startregelnummeren[\v!verder]}
+ \def\doafterparagraph%
+ {\stopregelnummeren}
+ \def\dobeforeskipparagraph%
+ {\stopregelnummeren
+ \let\paragraphnumber=\relax}
+ \def\doafterskipparagraph%
+ {\startregelnummeren[\v!verder]}}
+
+\def\dopushparagraphs#1%
+ {\global\let\mostrecentparagraphtotal=\totalnofparagraphs
+ \ifx#1\undefined
+ \let#1=\relax
+ \fi
+ \convertargument#1\to\asciiA
+ \convertargument{ }\to\asciiB % lege regel
+ \def\dopushparagraph##1\par%
+ {\convertargument##1\to\asciiC
+ \doifelse{\asciiC}{\asciiA}
+ {\let\next=#1}
+ {\doifnot{\asciiC}{} % lege paragraaf
+ {\doifnot{\asciiC}{\asciiB}
+ {\doglobal\increment\totalnofparagraphs
+ \ifnum\totalnofparagraphs>0\nofskippedparagraphs\relax
+ \setgvalue{\paragraphprefix\totalnofparagraphs}%
+ {##1}%
+ \else
+ \setgvalue{\paragraphprefix\totalnofparagraphs}%
+ {\skipparagraph##1\par}%
+ \fi}}%
+ \let\next=\dopushparagraph}
+ \next}%
+ \dopushparagraph}
+
+\def\pushparagraphs%
+ {\doglobal\newcounter\totalnofparagraphs
+ \dopushparagraphs}
+
+\def\pushmoreparagraphs%
+ {\dopushparagraphs}
+
+\def\dododopopparagraph#1% no grouping, i.v.m. sidefloats
+ {\ifnum#1>\totalnofparagraphs\relax
+ \else
+ \let\paragraphnumber=\globalparagraphnumber
+ \decrement(\paragraphnumber,\discardedparagraphs)%
+ \dobeforeparagraph
+ \ifhmode\indentation\fi\getvalue{\paragraphprefix#1}\par
+ \doafterparagraph
+ \fi}
+
+\long\def\skipparagraph#1\par%
+ {\doglobal\increment\discardedparagraphs
+ \ifprocessallparagraphs
+ \dobeforeskipparagraph
+ \ifhmode\indentation\fi#1\par
+ \doafterskipparagraph
+ \fi}
+
+\def\dodopopparagraph%
+ {\dododopopparagraph}
+
+\def\dodoprocessparagraph#1%
+ {\ifprocesspreviousparagraphs
+ \bgroup
+ \setbox0=\vbox{\dododopopparagraph{#1}}%
+ \egroup
+ \fi}
+
+\def\processpreviousparagraphs[#1]% process previous ones
+ {\ifprocesspreviousparagraphs
+ \bgroup
+ \getfromcommacommand[#1][1]%
+ \let\totalnofparagraphs=\commalistelement
+ \decrement\totalnofparagraphs
+ \let\dodopopparagraph=\dodoprocessparagraph
+ \popparagraphs
+ \egroup
+ \fi}
+
+\def\dopopparagraphs[#1]%
+ {\doifnotinset{#1}{\v!geen,0}
+ {\dosetparagraph
+ \doglobal\newcounter\globalparagraphnumber
+ \doglobal\newcounter\discardedparagraphs
+ \doifelse{#1}{}
+ {\processallparagraphstrue}
+ {\processallparagraphsfalse}%
+ \def\dopopparagraph%
+ {\doglobal\increment\globalparagraphnumber
+ \ifnum\globalparagraphnumber>\totalnofparagraphs\relax
+ \let\dopopparagraph=\relax
+ \else\ifprocessallparagraphs
+ \ifnum\globalparagraphnumber>\mostrecentparagraphtotal\relax
+ \dodopopparagraph\globalparagraphnumber
+ \else
+ \dodoprocessparagraph\globalparagraphnumber
+ \fi
+ \else
+ \let\paragraphnumber=\globalparagraphnumber
+ \decrement(\paragraphnumber,\discardedparagraphs)%
+ \ExpandBothAfter\doifinsetelse{\paragraphnumber}{#1}
+ {\dodopopparagraph\globalparagraphnumber}
+ {\dodoprocessparagraph\globalparagraphnumber}%
+ \fi\fi
+ \dopopparagraph}%
+ \dopopparagraph
+ \doresetparagraph}}
+
+\def\popparagraphs%
+ {\dosingleempty\dopopparagraphs}
+
+\def\countparagraphs%
+ {\popparagraphs[\!!maxcard]%
+ \global\let\nofparagraphs=\totalnofparagraphs
+ \doglobal\decrement(\nofparagraphs,\discardedparagraphs)}
+
+% \steluitlijnenin[onder]
+% \stelwitruimtein[groot]
+%
+% \toonkader
+%
+% \numberparagraphlines
+% \numberparagraphs
+%
+% \def\nofskippedparagraphs{1}
+%
+% \pushparagraphs\ThatsIt
+%
+% \ruledbaseline eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste
+%
+% \ruledbaseline eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste eerste eerste eerste
+% eerste eerste eerste eerste eerste
+%
+% \ruledbaseline tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede tweede tweede tweede
+% tweede tweede tweede tweede tweede
+%
+% \skipparagraph \ruledbaseline skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped
+%
+% \ruledbaseline derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+% derde derde derde derde derde derde derde derde derde derde
+%
+% \skipparagraph \ruledbaseline skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped
+%
+% \ruledbaseline vierde vierde vierde vierde vierde vierde
+% vierde vierde vierde vierde vierde vierde vierde vierde
+% vierde vierde vierde vierde vierde vierde vierde vierde
+% vierde vierde vierde vierde
+%
+% \ruledbaseline vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde vijfde vijfde vijfde vijfde vijfde
+% vijfde vijfde vijfde
+%
+% \skipparagraph \ruledbaseline skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped skipped skipped skipped skipped
+% skipped skipped skipped
+%
+% \ThatsIt
+%
+% \popparagraphs
+%
+% \countparagraphs
+%
+% \blanko[2*groot]
+%
+% nofparagraphs:~\nofparagraphs
+%
+% \pagina
+%
+% \popparagraphs[1]
+% \popparagraphs[2]
+% \popparagraphs[3]
+% \popparagraphs[4]
+% \popparagraphs[5]
+%
+% \pagina
+%
+% \ruledvbox{\popparagraphs[1,2,3,4,5]}
+%
+% \pagina
+
+% PAS OP: VERVALLEN
+%
+% \newif\ifprocesspreviousparagraphs
+% \newif\ifprocessallparagraphs
+%
+% \newcounter\nofskippedparagraphs
+% \newcounter\nofmidskippedparagraphs
+%
+% \def\alineanummer {}
+%
+% \newcounter\nofalineas
+%
+% \def\laadalineas#1% alinea = class
+% {\doglobal\newcounter\nofalineas
+% \doglobal\decrement(\nofalineas,\nofskippedparagraphs)%
+% \ifx#1\undefined
+% \let#1=\relax
+% \fi
+% \convertargument#1\to\asciiA
+% \convertargument{ }\to\asciiB % lege regel
+% \def\dolaadalinea##1\par%
+% {\convertargument##1\to\asciiC
+% \doifelse{\asciiC}{\asciiA}
+% {\let\next=#1}
+% {\doifnot{\asciiC}{} % lege paragraaf
+% {\doifnot{\asciiC}{\asciiB}
+% {\doglobal\increment\nofalineas
+% \setgvalue{alinea\nofalineas}{##1}}}%
+% \let\next=\dolaadalinea}
+% \next}%
+% \dolaadalinea}
+%
+% % De constructie \edef\alineanummer{#1} is nodig voor
+% % bijvoorbeeld:
+% %
+% % \EveryPar{\strut\inlinker{\alineanummer}}
+% %
+% % Laten we dit weg, dan wordt het vorige nummer gebruikt.
+%
+% \def\dododohaalalinea#1% geen grouping, i.v.m. sidefloats
+% {\edef\localalineanummer{#1}%
+% \ifnum\localalineanummer>\nofalineas\relax
+% \else
+% \ifnum\localalineanummer>0\relax
+% \let\alineanummer=\localalineanummer
+% \decrement(\alineanummer,\nofmidskippedparagraphs)%
+% \else
+% \let\alineanummer=\empty
+% \fi
+% \dopreparagraph
+% \doeveryparagraph\getvalue{alinea\localalineanummer}\par
+% \dopostparagraph
+% \fi}
+%
+% \long\def\geenalinea#1\par%
+% {\ifprocessallparagraphs
+% \let\alineanummer=\relax
+% \dopostparagraph % fool around a bit
+% #1\par
+% \dopreparagraph % ugly but effective
+% \fi
+% \doglobal\increment\nofmidskippedparagraphs}
+%
+% \def\dodohaalalinea%
+% {\dododohaalalinea}
+%
+% \def\dodoverwerkalinea#1%
+% {\ifprocesspreviousparagraphs
+% \bgroup
+% \setbox0=\vbox{\dododohaalalinea{#1}}%
+% \egroup
+% \fi}
+%
+% \def\verwerkvorigealineas[#1]% process previous ones
+% {\ifprocesspreviousparagraphs
+% \bgroup
+% \getfromcommacommand[#1][1]%
+% \let\nofalineas=\commalistelement
+% \decrement\nofalineas
+% \let\dodohaalalinea=\dodoverwerkalinea
+% \haalalineas
+% \egroup
+% \fi}
+%
+% \let \dosetparagraph = \relax
+% \let \doresetparagraph = \relax
+% \let \dopreparagraph = \relax
+% \let \dopostparagraph = \relax
+% \let \doeveryparagraph = \relax
+%
+% \def\dohaalalineas[#1]%
+% {\doifnotinset{#1}{\v!geen,0}
+% {\dosetparagraph
+% \doglobal\newcounter\globalalineanummer
+% \doglobal\newcounter\nofmidskippedparagraphs
+% \doifelse{#1}{}
+% {\processallparagraphstrue
+% \doglobal\decrement(\globalalineanummer,\nofskippedparagraphs)}
+% {\processallparagraphsfalse}%
+% \def\dohaalalinea%
+% {\doglobal\increment\globalalineanummer
+% \ifnum\globalalineanummer>\nofalineas\relax
+% \let\dohaalalinea=\relax
+% \else
+% \ifprocessallparagraphs
+% \dodohaalalinea\globalalineanummer
+% \else
+% \let\localalineanummer=\globalalineanummer
+% \decrement(\localalineanummer,\nofmidskippedparagraphs)%
+% \ExpandBothAfter\doifinsetelse{\localalineanummer}{#1}
+% {\dodohaalalinea\globalalineanummer}
+% {\dodoverwerkalinea\globalalineanummer}%
+% \fi
+% \fi
+% \dohaalalinea}%
+% \dohaalalinea
+% \doresetparagraph}}
+%
+% \def\haalalineas%
+% {\dosingleempty\dohaalalineas}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-02a.tex b/tex/context/base/core-02a.tex index 5340e96a1..a79681138 100644 --- a/tex/context/base/core-02a.tex +++ b/tex/context/base/core-02a.tex @@ -1,191 +1,191 @@ -%D \module -%D [ file=core-02a, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=2A (to be split), -%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 Extra Macros (a)} - -\unprotect - -\startmessages dutch library: addresses - title: adressen - 1: -- - 2: hoofdbestand -- - 3: nevenbestand -- -\stopmessages - -\startmessages english library: addresses - title: addresses - 1: -- - 2: primary base -- - 3: secondary base -- -\stopmessages - -\startmessages german library: addresses - title: Adressen - 1: -- - 2: Haupbestand -- - 3: Nebenbestand -- -\stopmessages - -%I n=Kontakten -%I c=\laadkontakten -%I -%I De onderstaande commando's werken samen met het programma -%I TeXAdres. -%I -%I \laadkontakten[naam,groep,...] -%I -%I Dit commando doorzoekt eerst de file 'texadres.tao' en -%I vervolgens de file 'texadres.tae' op naam en groep. Bij -%I elk gevonden adres (naam of groepslid) wordt het commando -%I \doemetkontakt{logisch} aangeroepen. -%I -%I De waarden van de verschillende velden zijn op te roepen met -%I het commando \kontaktwaarde{veldnaam}. Let op: het in -%I bijvoorbeeld een adres opgenomen commando \\ moet men zelf -%I definieren, bijvoorbeeld: \def\\{\endgraf}. -%P -%I TeXAdres zet alle files op een gebied met de extensie 'tai' -%I om in een file met de extensie 'tao' of 'tae'. Een invoerfile -%I is als volgt opgebouwd: -%I -%I Een adres in de uitvoerfile ziet er als volgt uit: -%I -%I \beginvankontakt{...} -%I \lidvangroep{...,...,...} -%I \naam{...} -%I \letters{...} -%I \...{...} -%I \postadres{...} -%I \eindvankontakt{...} -%P -%I De invoerfile bevat zowel definities van kontakten als van -%I groepen. -%I -%I Een kontakt wordt als volgt gedefinieerd: -%I -%I < kontakt > -%I -%I [ logisch ] hagenj -%I [ naam ] Hagen -%I [ letters ] J. -%I [ voornaam ] Hans -%I [ titel ] heer -%I [ telefoon ] 053 - 336934 -%I [ telefax ] -%I [ postadres ] J. Hagen \\ Ridderstraat 27--29 \\ 8061 GH Hasselt -%I [ info ] ach ja -%P -%I Een groep wordt als volgt gedefinieerd: -%I -%I < groep > -%I -%I [ logisch ] werkgroep -%I [ naam ] -%I [ lid ] ottenaf -%I [ lid ] hagenj -%I [ lid ] jonkerj -%I [ lid ] marlecvan - -% In eerste instantie leek het werken met % voor te skippen -% regels mij een aardige oplossing. Echter, het opslurpen van -% een heel blok tot \eindvankontakt gaat net zo snel. -% -% Hoewel het mechanisme inmiddels uitstekend is te combineren -% met het tekstblok-mechanisme, wordt vooralsnog deze snelle -% variant gebruikt. -% -% Om conflicten te voorkomen met reeds gedefinieerde commando's, -% zoals \naam, wordt enkele malen \bgroup..\egroup gebruikt. - -\newevery \everykontakt \EveryKontakt - -\def\stelkontaktenin[#1]% - {\getparameters[\??kt][#1]}% - -\def\presetkontaktwaarde#1% - {\setgvalue{\??kw#1}{}% - \setvalue{#1}##1% - {\setgvalue{\??kw#1}{##1}}} - -\def\resetkontaktwaarde#1% - {\setgvalue{\??kw#1}{}% - \setvalue{#1}##1% - {\skipkontakt}} - -\def\kontaktwaarde#1% - {\getvalue{\??kw#1}} - -\def\presetkontakt% - {\rawprocesscommalist% - [naam,letters,voornaam,titel,telefoon,telefax,postadres,info]% - \presetkontaktwaarde} - -\def\resetkontakt% - {\rawprocesscommalist% - [naam,letters,voornaam,titel,telefoon,telefax,postadres,info]% - \resetkontaktwaarde} - -\def\skipkontakt% - {\long\def\next##1\eindvankontakt% - {\def\next####1{\egroup}\next}% - \next} - -\newif\ifkontaktok - -\let\doemetkontakt=\gobbleoneargument - -\def\laadkontakten[#1]% - {\makerawcommalist[#1]\gevraagdekontakten - \resetkontakt - \doifelsenothing{\gevraagdekontakten} - {\def\gevraagdekontakten{\v!alles}% - \kontaktoktrue} - {\kontaktokfalse}% - \def\checkkontakt##1% - {\rawdoifinsetelse{##1}{\gevraagdekontakten}{\kontaktoktrue}{}}% - \def\lidvangroep##1% - {\doifsomething{##1} - {\rawprocesscommalist[##1]\checkkontakt}% - \ifkontaktok - \let\next=\presetkontakt - \else - \let\next=\skipkontakt - \fi - \next}% - \def\beginvankontakt##1% - {\bgroup - \ifkontaktok - \def\lidvangroep####1{}% - \let\next=\presetkontakt - \else - \checkkontakt{##1}% - \ifkontaktok - \def\lidvangroep####1{}% - \let\next=\presetkontakt - \else - \let\next=\relax - \fi - \fi - \next}% - \def\eindvankontakt##1% - {\relax - \egroup - \the\everykontakt - \doemetkontakt{##1}}% - \showmessage{\m!addresses}{1}{\gevraagdekontakten}% - \readsysfile{texadres.tao}{\showmessage{\m!addresses}{2}{(tao)}}{\relax}% - \readjobfile{texadres.tae}{\showmessage{\m!addresses}{3}{(tae)}}{\relax}} - -\protect - -\endinput +%D \module
+%D [ file=core-02a,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=2A (to be split),
+%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 Extra Macros (a)}
+
+\unprotect
+
+\startmessages dutch library: addresses
+ title: adressen
+ 1: --
+ 2: hoofdbestand --
+ 3: nevenbestand --
+\stopmessages
+
+\startmessages english library: addresses
+ title: addresses
+ 1: --
+ 2: primary base --
+ 3: secondary base --
+\stopmessages
+
+\startmessages german library: addresses
+ title: Adressen
+ 1: --
+ 2: Haupbestand --
+ 3: Nebenbestand --
+\stopmessages
+
+%I n=Kontakten
+%I c=\laadkontakten
+%I
+%I De onderstaande commando's werken samen met het programma
+%I TeXAdres.
+%I
+%I \laadkontakten[naam,groep,...]
+%I
+%I Dit commando doorzoekt eerst de file 'texadres.tao' en
+%I vervolgens de file 'texadres.tae' op naam en groep. Bij
+%I elk gevonden adres (naam of groepslid) wordt het commando
+%I \doemetkontakt{logisch} aangeroepen.
+%I
+%I De waarden van de verschillende velden zijn op te roepen met
+%I het commando \kontaktwaarde{veldnaam}. Let op: het in
+%I bijvoorbeeld een adres opgenomen commando \\ moet men zelf
+%I definieren, bijvoorbeeld: \def\\{\endgraf}.
+%P
+%I TeXAdres zet alle files op een gebied met de extensie 'tai'
+%I om in een file met de extensie 'tao' of 'tae'. Een invoerfile
+%I is als volgt opgebouwd:
+%I
+%I Een adres in de uitvoerfile ziet er als volgt uit:
+%I
+%I \beginvankontakt{...}
+%I \lidvangroep{...,...,...}
+%I \naam{...}
+%I \letters{...}
+%I \...{...}
+%I \postadres{...}
+%I \eindvankontakt{...}
+%P
+%I De invoerfile bevat zowel definities van kontakten als van
+%I groepen.
+%I
+%I Een kontakt wordt als volgt gedefinieerd:
+%I
+%I < kontakt >
+%I
+%I [ logisch ] hagenj
+%I [ naam ] Hagen
+%I [ letters ] J.
+%I [ voornaam ] Hans
+%I [ titel ] heer
+%I [ telefoon ] 053 - 336934
+%I [ telefax ]
+%I [ postadres ] J. Hagen \\ Ridderstraat 27--29 \\ 8061 GH Hasselt
+%I [ info ] ach ja
+%P
+%I Een groep wordt als volgt gedefinieerd:
+%I
+%I < groep >
+%I
+%I [ logisch ] werkgroep
+%I [ naam ]
+%I [ lid ] ottenaf
+%I [ lid ] hagenj
+%I [ lid ] jonkerj
+%I [ lid ] marlecvan
+
+% In eerste instantie leek het werken met % voor te skippen
+% regels mij een aardige oplossing. Echter, het opslurpen van
+% een heel blok tot \eindvankontakt gaat net zo snel.
+%
+% Hoewel het mechanisme inmiddels uitstekend is te combineren
+% met het tekstblok-mechanisme, wordt vooralsnog deze snelle
+% variant gebruikt.
+%
+% Om conflicten te voorkomen met reeds gedefinieerde commando's,
+% zoals \naam, wordt enkele malen \bgroup..\egroup gebruikt.
+
+\newevery \everykontakt \EveryKontakt
+
+\def\stelkontaktenin[#1]%
+ {\getparameters[\??kt][#1]}%
+
+\def\presetkontaktwaarde#1%
+ {\setgvalue{\??kw#1}{}%
+ \setvalue{#1}##1%
+ {\setgvalue{\??kw#1}{##1}}}
+
+\def\resetkontaktwaarde#1%
+ {\setgvalue{\??kw#1}{}%
+ \setvalue{#1}##1%
+ {\skipkontakt}}
+
+\def\kontaktwaarde#1%
+ {\getvalue{\??kw#1}}
+
+\def\presetkontakt%
+ {\rawprocesscommalist%
+ [naam,letters,voornaam,titel,telefoon,telefax,postadres,info]%
+ \presetkontaktwaarde}
+
+\def\resetkontakt%
+ {\rawprocesscommalist%
+ [naam,letters,voornaam,titel,telefoon,telefax,postadres,info]%
+ \resetkontaktwaarde}
+
+\def\skipkontakt%
+ {\long\def\next##1\eindvankontakt%
+ {\def\next####1{\egroup}\next}%
+ \next}
+
+\newif\ifkontaktok
+
+\let\doemetkontakt=\gobbleoneargument
+
+\def\laadkontakten[#1]%
+ {\makerawcommalist[#1]\gevraagdekontakten
+ \resetkontakt
+ \doifelsenothing{\gevraagdekontakten}
+ {\def\gevraagdekontakten{\v!alles}%
+ \kontaktoktrue}
+ {\kontaktokfalse}%
+ \def\checkkontakt##1%
+ {\rawdoifinsetelse{##1}{\gevraagdekontakten}{\kontaktoktrue}{}}%
+ \def\lidvangroep##1%
+ {\doifsomething{##1}
+ {\rawprocesscommalist[##1]\checkkontakt}%
+ \ifkontaktok
+ \let\next=\presetkontakt
+ \else
+ \let\next=\skipkontakt
+ \fi
+ \next}%
+ \def\beginvankontakt##1%
+ {\bgroup
+ \ifkontaktok
+ \def\lidvangroep####1{}%
+ \let\next=\presetkontakt
+ \else
+ \checkkontakt{##1}%
+ \ifkontaktok
+ \def\lidvangroep####1{}%
+ \let\next=\presetkontakt
+ \else
+ \let\next=\relax
+ \fi
+ \fi
+ \next}%
+ \def\eindvankontakt##1%
+ {\relax
+ \egroup
+ \the\everykontakt
+ \doemetkontakt{##1}}%
+ \showmessage{\m!addresses}{1}{\gevraagdekontakten}%
+ \readsysfile{texadres.tao}{\showmessage{\m!addresses}{2}{(tao)}}{\relax}%
+ \readjobfile{texadres.tae}{\showmessage{\m!addresses}{3}{(tae)}}{\relax}}
+
+\protect
+
+\endinput
diff --git a/tex/context/base/core-02b.tex b/tex/context/base/core-02b.tex index ea4aa7021..7931ae3c2 100644 --- a/tex/context/base/core-02b.tex +++ b/tex/context/base/core-02b.tex @@ -1,171 +1,172 @@ -%D \module -%D [ file=core-02b, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=2B (to be split), -%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 Extra Macros (b)} - -\unprotect - -%I n=Karakters -%I -%I Het is mogelijk bij het definieren van tabellen gebruik -%I te maken van speciale karakters: -%I -%I \starttabel[|l|c|r|] -%I ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄ¿ -%I ³ eerste ³ tweede ³ derde ³ -%I ÃÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´ -%I ³ alfa ³ a ³ 1 ³ -%I ³ beta ³ b ³ 22 ³ -%I ÃÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´ -%I ³ gamma ³ c ³ 333 ³ -%I ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÙ -%I \stoptabel -%I -%I Eventueel kunnen \starttabel en \stoptabel worden weggelaten. -%P -%I Naast \hoog en \laag kunnen (ook in de wiskunde-mode) de -%I karakters en worden gebruikt: m2, x{23} enz. -%P -%I De volgende hoge ascii-karakters worden vertaald: -%I -%I Ÿ bedrag geen haakjes nodig, wel spaties - -\newcount\row -\newcount\columns -\newcount\column - -\newif\iffullrow - -\def\firstrow% - {\ifintabel - \HL - \fi - \global\row=0\relax - \global\fullrowfalse} - -\def\nextrow% - {\global\advance\column by 1\relax - \ifnum\column=\columns - \global\fullrowtrue - \VL - \else - \iffullrow - \global\column=1\relax - \global\fullrowfalse - \global\advance\row by 1\relax - \ifnum\row=1 - \FR\VL - \else - \MR\VL - \fi - \else - \VL - \fi - \fi} - -\def\lastrow% - {\global\fullrowfalse - \ifnum\row=0 - \global\row=0\relax - \global\column=0\relax - \SR\HL - \else - \global\row=0\relax - \global\column=0\relax - \LR\HL - \fi} - -\def\firstcolumn% - {\global\column=0\relax - \global\columns=1} - -\def\nextcolumn% - {\global\advance\columns by 1\relax} - -\newif\iflocalintabel -\localintabelfalse - -\def\beginoftable% - {\ifintabel - \else\ifcase\columns\or - \or\starttabel[|l|]\HL - \or\starttabel[|l|l|]\HL - \or\starttabel[|l|l|l|]\HL - \or\starttabel[|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|l|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|l|l|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|l|l|l|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|l|l|l|l|l|l|l|l|l|]\HL - \or\starttabel[|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|]\HL - \fi - \global\localintabeltrue - \fi} - -\def\endoftable% - {\iflocalintabel - \stoptabel - \global\localintabelfalse - \fi} - -% \catcode`\Ú=\@@active \defÚ{\firstrow\firstcolumn} -% \catcode`\Ã=\@@active \defÃ{\lastrow} -% \catcode`\À=\@@active \defÀ{\lastrow} -% -% \catcode`\¿=\@@active \def¿{\nextcolumn} -% \catcode`\´=\@@active \def´{} -% \catcode`\Ù=\@@active \defÙ{\endoftable} -% -% \catcode`\Â=\@@active \defÂ{\nextcolumn} -% \catcode`\Å=\@@active \defÅ{} -% \catcode`\Á=\@@active \defÁ{} -% -% \catcode`\³=\@@active \def³{\beginoftable\nextrow} -% \catcode`\Ä=\@@active \defÄ{} - -\catcode`\Ú=\@@active \defÚ{\ifprocessingverbatim{ }\else\firstrow\firstcolumn\fi} -\catcode`\Ã=\@@active \defÃ{\ifprocessingverbatim\char`|\else\lastrow\fi} -\catcode`\À=\@@active \defÀ{\ifprocessingverbatim{ }\else\lastrow\fi} - -\catcode`\¿=\@@active \def¿{\ifprocessingverbatim{ }\else\nextcolumn\fi} -\catcode`\´=\@@active \def´{\ifprocessingverbatim\char`|\else\fi} -\catcode`\Ù=\@@active \defÙ{\ifprocessingverbatim{ }\else\endoftable\fi}% - -\catcode`\Â=\@@active \defÂ{\ifprocessingverbatim\char`-\else\nextcolumn\fi} -\catcode`\Å=\@@active \defÅ{\ifprocessingverbatim\char`|\else\fi} -\catcode`\Á=\@@active \defÁ{\ifprocessingverbatim\char`-\else\fi} - -\catcode`\³=\@@active \def³{\ifprocessingverbatim\char`|\else\beginoftable\nextrow\fi} -\catcode`\Ä=\@@active \defÄ{\ifprocessingverbatim\char`-\else\fi} - -\catcode`\=\@@active -\catcode`\=\@@active - -\def#1% - {\ifprocessingverbatim\char`^\relax#1\else\ifmmode^{#1}\else\hoog{#1}\fi\fi} - -\def#1% - {\ifprocessingverbatim\char`_\relax#1\ifmmode_{#1}\else\laag{#1}\fi\fi} - -\catcode`\Ÿ=\@@active - -\defŸ% - {\ifprocessingverbatim f\else\bedrag{}~\ignorespaces\fi} - -\protect - -\endinput +%D \module
+%D [ file=core-02b,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=2B (to be split),
+%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 Extra Macros (b)}
+
+\unprotect
+
+%I n=Karakters
+%I
+%I Het is mogelijk bij het definieren van tabellen gebruik
+%I te maken van speciale karakters:
+%I
+%I \starttabel[|l|c|r|]
+%I ÚÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄ¿
+%I ³ eerste ³ tweede ³ derde ³
+%I ÃÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´
+%I ³ alfa ³ a ³ 1 ³
+%I ³ beta ³ b ³ 22 ³
+%I ÃÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´
+%I ³ gamma ³ c ³ 333 ³
+%I ÀÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÙ
+%I \stoptabel
+%I
+%I Eventueel kunnen \starttabel en \stoptabel worden weggelaten.
+%P
+%I Naast \hoog en \laag kunnen (ook in de wiskunde-mode) de
+%I karakters en worden gebruikt: m2, x{23} enz.
+%P
+%I De volgende hoge ascii-karakters worden vertaald:
+%I
+%I Ÿ bedrag geen haakjes nodig, wel spaties
+
+\newcount\row
+\newcount\columns
+\newcount\column
+
+\newif\iffullrow
+
+\def\firstrow%
+ {\ifintabel
+ \HL
+ \fi
+ \global\row=0\relax
+ \global\fullrowfalse}
+
+\def\nextrow%
+ {\global\advance\column by 1\relax
+ \ifnum\column=\columns
+ \global\fullrowtrue
+ \VL
+ \else
+ \iffullrow
+ \global\column=1\relax
+ \global\fullrowfalse
+ \global\advance\row by 1\relax
+ \ifnum\row=1
+ \FR\VL
+ \else
+ \MR\VL
+ \fi
+ \else
+ \VL
+ \fi
+ \fi}
+
+\def\lastrow%
+ {\global\fullrowfalse
+ \ifnum\row=0
+ \global\row=0\relax
+ \global\column=0\relax
+ \SR\HL
+ \else
+ \global\row=0\relax
+ \global\column=0\relax
+ \LR\HL
+ \fi}
+
+\def\firstcolumn%
+ {\global\column=0\relax
+ \global\columns=1}
+
+\def\nextcolumn%
+ {\global\advance\columns by 1\relax}
+
+\newif\iflocalintabel
+\localintabelfalse
+
+\def\beginoftable%
+ {\ifintabel
+ \else\ifcase\columns\or
+ \or\starttabel[|l|]\HL
+ \or\starttabel[|l|l|]\HL
+ \or\starttabel[|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|l|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|l|l|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|l|l|l|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|l|l|l|l|l|l|l|l|l|]\HL
+ \or\starttabel[|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|]\HL
+ \fi
+ \global\localintabeltrue
+ \fi}
+
+\def\endoftable%
+ {\iflocalintabel
+ \stoptabel
+ \global\localintabelfalse
+ \fi}
+
+% \catcode`\Ú=\@@active \defÚ{\firstrow\firstcolumn}
+% \catcode`\Ã=\@@active \defÃ{\lastrow}
+% \catcode`\À=\@@active \defÀ{\lastrow}
+%
+% \catcode`\¿=\@@active \def¿{\nextcolumn}
+% \catcode`\´=\@@active \def´{}
+% \catcode`\Ù=\@@active \defÙ{\endoftable}
+%
+% \catcode`\Â=\@@active \defÂ{\nextcolumn}
+% \catcode`\Å=\@@active \defÅ{}
+% \catcode`\Á=\@@active \defÁ{}
+%
+% \catcode`\³=\@@active \def³{\beginoftable\nextrow}
+% \catcode`\Ä=\@@active \defÄ{}
+
+\catcode`\Ú=\@@active \defÚ{\ifprocessingverbatim{ }\else\firstrow\firstcolumn\fi}
+\catcode`\Ã=\@@active \defÃ{\ifprocessingverbatim\char`|\else\lastrow\fi}
+\catcode`\À=\@@active \defÀ{\ifprocessingverbatim{ }\else\lastrow\fi}
+
+\catcode`\¿=\@@active \def¿{\ifprocessingverbatim{ }\else\nextcolumn\fi}
+\catcode`\´=\@@active \def´{\ifprocessingverbatim\char`|\else\fi}
+\catcode`\Ù=\@@active \defÙ{\ifprocessingverbatim{ }\else\endoftable\fi}%
+
+\catcode`\Â=\@@active \defÂ{\ifprocessingverbatim\char`-\else\nextcolumn\fi}
+\catcode`\Å=\@@active \defÅ{\ifprocessingverbatim\char`|\else\fi}
+\catcode`\Á=\@@active \defÁ{\ifprocessingverbatim\char`-\else\fi}
+
+\catcode`\³=\@@active \def³{\ifprocessingverbatim\char`|\else\beginoftable\nextrow\fi}
+\catcode`\Ä=\@@active \defÄ{\ifprocessingverbatim\char`-\else\fi}
+
+\catcode`\=\@@active
+\catcode`\=\@@active
+
+\def#1%
+ {\ifprocessingverbatim\char`^\relax#1\else\ifmmode^{#1}\else\hoog{#1}\fi\fi}
+
+\def#1%
+ {\ifprocessingverbatim\char`_\relax#1\ifmmode_{#1}\else\laag{#1}\fi\fi}
+
+\catcode`\Ÿ=\@@active
+
+\defŸ%
+ {\ifprocessingverbatim f\else\bedrag{}~\ignorespaces\fi}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-02d.tex b/tex/context/base/core-02d.tex index caa1f7e83..31ab3d236 100644 --- a/tex/context/base/core-02d.tex +++ b/tex/context/base/core-02d.tex @@ -1,49 +1,50 @@ -%D \module -%D [ file=core-02d, -%D version=1997.03.31, -%D title=\CONTEXT\ Core Macros, -%D subtitle=2D (to be split), -%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 Extra Macros (d)} - -\unprotect - -\def\definieerfilegroep% - {\dodoubleargument\dodefinieerfilegroep} - -\def\dodefinieerfilegroep[#1][#2]% - {\getparameters - [\??fp#1] - [\c!file=#1, - \c!voor=, - \c!na=, - #2]% - \setvalue{\e!start#1}{\dostartfilegroep[#1]}} - -\def\dostartfilegroep% - {\dodoubleargument\dodostartfilegroep} - -\def\dodostartfilegroep[#1][#2]% - {\getvalue{\??fp#1\c!voor}% - \setvalue{\e!stop#1}{\dostopfilegroep[#1][#2]}% - \edef\!!stringa{\getvalue{\??fp#1\c!file}-#2}% - \@EA\dolaadfilegroep\@EA[\!!stringa]% - \getvalue{\e!start#1#2}} - -\def\dolaadfilegroep[#1-#2#3#4#5]% - {\readsysfile{#1-#2#3#4}{}{}} - -\def\dostopfilegroep[#1][#2]% - {\getvalue{\e!stop#1#2}% - \getvalue{\??fp#1\c!na}} - -\protect - -\endinput +%D \module
+%D [ file=core-02d,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=2D (to be split),
+%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 Extra Macros (d)}
+
+\unprotect
+
+\def\definieerfilegroep%
+ {\dodoubleargument\dodefinieerfilegroep}
+
+\def\dodefinieerfilegroep[#1][#2]%
+ {\getparameters
+ [\??fp#1]
+ [\c!file=#1,
+ \c!voor=,
+ \c!na=,
+ #2]%
+ \setvalue{\e!start#1}{\dostartfilegroep[#1]}}
+
+\def\dostartfilegroep%
+ {\dodoubleargument\dodostartfilegroep}
+
+\def\dodostartfilegroep[#1][#2]%
+ {\getvalue{\??fp#1\c!voor}%
+ \setvalue{\e!stop#1}{\dostopfilegroep[#1][#2]}%
+ \edef\!!stringa{\getvalue{\??fp#1\c!file}-#2}%
+ \@EA\dolaadfilegroep\@EA[\!!stringa]%
+ \getvalue{\e!start#1#2}}
+
+\def\dolaadfilegroep[#1-#2#3#4#5]%
+ {\readsysfile{#1-#2#3#4}{}{}}
+
+\def\dostopfilegroep[#1][#2]%
+ {\getvalue{\e!stop#1#2}%
+ \getvalue{\??fp#1\c!na}}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-con.tex b/tex/context/base/core-con.tex index 0eaf9449a..68caa4e04 100644 --- a/tex/context/base/core-con.tex +++ b/tex/context/base/core-con.tex @@ -1,505 +1,508 @@ -%D \module -%D [ file=core-con, -%D version=1997.26.08, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Conversion Macros, -%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 Core Macros / Conversion Macros} - -\unprotect - -%D This module deals with all kind of conversions from numbers -%D and dates. I considered splitting this module in a support -%D one and a core one, but to keep things simple as well as -%D preserve the overview, I decided against splitting. - -%D \macros -%D {numbers} -%D -%D First we deal with the dummy conversion of numbers using the -%D \TEX\ primitive \type{\number}. The uppercase alternative is -%D only there for compatibility with the other conversion -%D macros. We could do without \type{#1} but this way we get -%D rid of unwanted braces. For the savety we also define a -%D non||sence uppercase alternative. -%D -%D \showsetup{\y!numbers} - -\def\numbers#1% - {\number#1} - -\def\Numbers#1% - {\number#1} - -%D \macros -%D {romannumerals,Romannumerals} -%D -%D \TEX\ the program uses a rather tricky conversion from -%D numbers to their roman counterparts. This conversion could -%D of course be programmed in \TEX\ itself, but I guess Knuth -%D found the programming trick worth presenting. -%D -%D \showsetup{\y!romannumerals} -%D \showsetup{\y!Romannumerals} -%D -%D When upcasing the result, we just follow the text book rules -%D of expansion. Later on we'll see some more uppercase tricks. - -\def\romannumerals#1% - {\romannumeral#1} - -\def\Romannumerals#1% - {\uppercase\expandafter{\romannumeral#1}} - -%D \macros -%D {character,Character} -%D -%D Converting a number into a character can of course only -%D be done with numbers less or equal to~26. At the cost of -%D much more macros a faster conversion is possible, using: -%D -%D \starttypen -%D \setvalue{char1}{a} \def\character#1{\getvalue{char#1}} -%D \stoptypen -%D -%D But we prefer a simpel \type{\case}. -%D -%D \showsetup{\y!character} -%D \showsetup{\y!Character} - -\def\character#1% - {\ifcase#1% - \or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m% - \or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z% - \else - #1% - \fi} - -\def\Character#1% - {\ifcase#1% - \or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M% - \or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z% - \else - #1% - \fi} - -%D \macros -%D {characters,Characters} -%D -%D Converting large numbers is supported by the next two -%D macros. This time we just count on: $\cdots$~x, y, z, aa, -%D ab, ac~$\cdots$. -%D -%D \showsetup{\y!characters} -%D \showsetup{\y!Characters} - -\def\doconvertcharacters#1#2% - {\bgroup - \ifnum#2>26 - \!!counta=#2 - \ifnum\!!counta>0 - \advance\!!counta by -1 - \!!countb=\!!counta - \divide\!!counta by 26 - \!!countc=\!!counta - \multiply\!!countc by 26 - \advance\!!countb by -\!!countc - \doconvertcharacters#1{\!!counta}% - \advance\!!countb by 1 - #1{\the\!!countb}% - \fi - \else - #1{#2}% - \fi - \egroup} - -\def\characters% - {\doconvertcharacters\character} - -\def\Characters% - {\doconvertcharacters\Character} - -%D \macros -%D {protectconversion} -%D -%D The previous two commands are not robust enough to be -%D passed to \type{\write} en \type{\message}. That's why we -%D introduce: - -\def\protectconversion% - {\def\doconvertcharacters{}} - -%D \macros -%D {normaltime,normalyear,normalmonth,normalday} -%D -%D The last part of this module is dedicated to converting -%D dates. Because we want to use as meaningful commands as -%D possible, and because \TEX\ already uses up some of those, -%D we save the original meanings. - -\let\normaltime = \time -\let\normalyear = \year -\let\normalmonth = \month -\let\normalday = \day - -%D \macros -%D {month,MONTH} -%D -%D Converting the month number into a month name is done -%D using a case statement, abstact values and the label -%D mechanism. This way users can easily redefine a label from -%D for instance german into austrian. -%D -%D \starttypen -%D \setuplabeltext [de] [january=J\"anner] -%D \stoptypen -%D -%D Anyhow, the conversion looks like: - -\def\doconvertmonth#1% - {\labeltext - {\ifcase#1% - \or \v!january \or \v!february \or \v!march \or \v!april - \or \v!may \or \v!june \or \v!july \or \v!august - \or \v!september \or \v!october \or \v!november \or \v!december - \fi}} - -%D We redefine the \TEX\ primitive \type{\month} as: -%D -%D \showsetup{\y!month} -%D \showsetup{\y!MONTH} - -\def\month% - {\doconvertmonth} - -\def\MONTH#1% - {{\let\labeltext=\LABELTEXT\month{#1}}} - -%D We never explicitly needed this, but Tobias Burnus pointed -%D out that it would be handy to convert to the day of the -%D week. In doing so, we have to calculate the total number of -%D days, taking leapyears into account. For those who are -%D curious: -%D -%D \startopsomming[opelkaar] -%D \som years that can be divided by 4 are leapyears -%D \som exept years that can be divided by 100 -%D \som unless years can be divided by 400 -%D \stopopsomming -%D -%D This makes the year 1900 into a normal year and 1996 and -%D 2000 into leap years, right? Well, converting to string -%D looks familiar: - -\def\doconvertday#1% - {\labeltext - {\ifcase#1 - \or \v!sunday \or \v!monday \or \v!tuesday \or \v!wednesday - \or \v!thursday \or \v!friday \or \v!saturday \fi}} - -%D \macros -%D {dayoftheweek} -%D -%D The conversion algoritm is an old one and a translation from -%D a procedure written in MODULA~2 back in the 80's. I finaly -%D found the 4--100-400 rules in some enclopedia. Look at this -%D messy low level routine that takes the day, month and year -%D as arguments: - -\def\dayoftheweek#1#2#3% - {\bgroup - \!!counta=\ifcase#2\relax - 0\or 0\or 31\or 59\or 90\or120\or151\or - 181\or212\or243\or273\or304\or334\or365\fi - \advance\!!counta by #1\relax - \ifnum\!!counta<31 - \DoMod#3by4to\!!countb - \ifnum\!!countb=0 - \!!doneafalse - \DoMod#3by100to\!!countb - \ifnum\!!countb=0 \else \!!doneatrue \fi - \DoMod#3by400to\!!countb - \ifnum\!!countb=0 \!!doneatrue \fi - \else - \!!doneafalse - \fi - \else - \!!doneafalse - \fi - \!!countb=#3\relax - \multiply\!!countb by 365 - \advance\!!counta by \!!countb - \DoDiv#3by4to\!!countb - \advance\!!counta by \!!countb - \DoDiv#3by400to\!!countb - \advance\!!counta by \!!countb - \DoDiv#3by100to\!!countb - \advance\!!counta by -\!!countb - \if!!donea - \advance\!!counta by -1 - \fi - \advance\!!counta by -1 - \DoMod\!!counta by7to\!!counta - \advance\!!counta by 1 - \doconvertday\!!counta - \egroup} - -%D Using this macro in -%D -%D \startbuffer -%D monday: \dayoftheweek {4} {5} {1992} -%D friday: \dayoftheweek {16} {6} {1995} -%D monday: \dayoftheweek {25} {8} {1997} -%D saturday: \dayoftheweek {30} {8} {1997} -%D tuesday: \dayoftheweek {2} {1} {1996} -%D tuesday: \dayoftheweek {7} {1} {1997} -%D tuesday: \dayoftheweek {13} {1} {1998} -%D \stopbuffer -%D -%D \typebuffer -%D -%D gives -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld - -%D \macros -%D {weekday,WEEKDAY} -%D -%D The first one is sort of redundant. It takes the day -%D number argument. -%D -%D \showsetup{\y!weekday} -%D \showsetup{\y!WEEKDAY} - -\def\weekday% - {\doconvertday} - -\def\WEEKDAY#1% - {{\let\labeltext=\LABELTEXT\doconvertday{#1}}} - -%D \macros -%D {weekoftheday} -%D -%D {\em not yet implemented:} -%D -%D \starttypen -%D \def\weekoftheday#1#2#3% -%D {} -%D \stoptypen - -%D \macros -%D {currentdate} -%D -%D We use these conversion macros in the date formatting -%D macro: -%D -%D \showsetup{\y!currentdate} -%D -%D This macro takes care of proper spacing and delivers for -%D instance: -%D -%D \startbuffer -%D \currentdate[weekdag,dag,maand,jaar] % still dutch example -%D \currentdate[WEEKDAG,dag,MAAND,jaar] % still dutch example -%D \stopbuffer -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld -%D -%D depending of course on the keywords. Here we gave: -%D -%D \typebuffer -%D -%D If needed one can also add non||keywords, like in -%D -%D \startbuffer -%D \currentdate[dd,--,mm,--,yy] -%D \stopbuffer -%D -%D \typebuffer -%D -%D or typeset: \haalbuffer. -%D -%D When no argument is passed, the current date is given as -%D specified per language (using \type{\installlanguage}). - -\def\complexcurrentdate[#1]% - {\bgroup - \let\labellanguage=\currentlanguage - \def\betweendates{\let\betweendates\space}% - \processallactionsinset - [#1] - [ dd=>\ifnum\normalday>9\relax\else0\fi\the\normalday, - mm=>\ifnum\normalmonth>9\relax\else0\fi\the\normalmonth, - jj=>\expandafter\gobbletwoarguments\the\normalyear, - yy=>\expandafter\gobbletwoarguments\the\normalyear, - d=>\the\normalday, - m=>\the\normalmonth, - j=>\the\normalyear, - y=>\the\normalyear, - \v!kenmerk=>{\complexcurrentdate[jj,mm,dd]}, - \v!dag=>\betweendates\the\normalday, - \v!maand=>\betweendates\month\normalmonth, - \v!MAAND=>\betweendates\MONTH\normalmonth, - \v!jaar=>\betweendates\the\normalyear, - \v!weekdag=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear, - \v!WEEKDAG=>\betweendates - \bgroup - \let\labeltext=\LABELTEXT - \dayoftheweek\normalday\normalmonth\normalyear - \egroup, - \s!unknown=>\commalistelement - \def\betweendates{\let\betweendates\space}]% - \egroup} - -\def\simplecurrentdate% - {\expanded{\complexcurrentdate[\currentdatespecification]}} - -\definecomplexorsimple\currentdate - -%D \macros -%D {definesymbol, symbol} -%D -%D Converting numbers or levels into a character, romannumeral, -%D symbol or something else, is supported by many \CONTEXT\ -%D commands. Therefore we need a mechanism for linking such -%D numbers to their counterparts. -%D -%D First we take care of symbols. These are for instance used -%D in enumerations and itemizations. We have: -%D -%D \showsetup{\y!definesymbol} -%D \showsetup{\y!symbol} -%D -%D Symbols are symply linked to a tag. Such tags can be numbers -%D or strings. -%D -%D \starttypen -%D \definesymbol [1] [$\bullet$] -%D \definesymbol [level 5] [$\star$] -%D \stoptypen - -\def\dodefinesymbol[#1][#2]% - {\setvalue{\??ss#1}{#2}}% - -\def\definesymbol% - {\dodoubleargument\dodefinesymbol} - -\def\symbol[#1]% - {\doifdefinedelse{\??ss#1}{\getvalue{\??ss#1}}{#1}} - -%D \macros -%D {defineconversion, convertnumber} -%D -%D Conversion involves the macros that we implemented earlier -%D in this module. -%D -%D \showsetup{\y!defineconversion} -%D \showsetup{\y!convertnumber} -%D -%D We can feed this command with conversion macros as well as -%D a set of conversion symbols. Both need a bit different -%D treatment. -%D -%D \starttypen -%D \defineconversion [roman] [\romannumerals] -%D \defineconversion [set 1] [$\star$,$\bullet$,$\ast$] -%D \stoptypen - -\def\dodefineconversion[#1][#2]% - {\ConvertConstantAfter\doifinstringelse{,}{#2} - {\scratchcounter=0 - \def\docommando##1% - {\advance\scratchcounter by 1 - \setvalue{\??cv#1\the\scratchcounter}{##1}}% - \processcommalist[#2]\docommando - \setvalue{\??cv#1}##1{\getvalue{\??cv#1##1}}} - {\setvalue{\??cv#1}{#2}}} - -\def\defineconversion% - {\dodoubleargument\dodefineconversion} - -\def\convertnumber#1% - {\getvalue{\??cv#1}} - -%D As longs as symbols are linked to levels or numbers, we can -%D also use the conversion mechanism, but in for instance the -%D itemization macros, we prefer symbols because they can more -%D easier be (partially) redefined. - -%D We predefine some common symbols and conversions that will -%D be understood by many commands. - -\definesymbol [1] [$\bullet$] -\definesymbol [2] [--] -\definesymbol [3] [$\star$] -\definesymbol [4] [$\triangleright$] -\definesymbol [5] [$\circ$] -\definesymbol [6] [\hbox{\setsmallbodyfont\raise\!!onepoint\hbox{$\bigcirc$}}] -\definesymbol [7] [$\bigcirc$] -\definesymbol [8] [\hbox{\hsmash{$\sqcup$}$\sqcap$}] - -\defineconversion [] [\numbers] % the default conversion - -\defineconversion [a] [\characters] -\defineconversion [A] [\Characters] -\defineconversion [AK] [\kap\characters] -\defineconversion [KA] [\kap\characters] - -\defineconversion [n] [\numbers] -\defineconversion [N] [\Numbers] -\defineconversion [m] [\mediaeval] - -\defineconversion [r] [\romannumerals] -\defineconversion [R] [\Romannumerals] -\defineconversion [KR] [\kap\romannumerals] -\defineconversion [RK] [\kap\romannumerals] - -\defineconversion [\v!letter] [\character] -\defineconversion [\v!Letter] [\Character] - -\defineconversion [\v!letters] [\characters] -\defineconversion [\v!Letters] [\Characters] - -\defineconversion [\v!cijfers] [\numbers] -\defineconversion [\v!Cijfers] [\Numbers] -\defineconversion [\v!mediaeval] [\mediaeval] - -\defineconversion [\v!romeins] [\romannumerals] -\defineconversion [\v!Romeins] [\Romannumerals] - -\defineconversion - [set 1] - [$\star$,$\star\star$,$\star\star\star$, - $\ddagger$,$\ddagger\ddagger$,$\ddagger\ddagger\ddagger$, - $\ast$,$\ast\ast$,$\ast\ast\ast$] - -\defineconversion - [set 2] - [$*$,$\dag$,$\ddag$, - $**$,$\dag\dag$,$\ddag\ddag$, - $***$,$\dag\dag\dag,$\ddag\ddag\ddag$] - -\defineconversion - [set 3] - [$\star$,$\star\star$,$\star\star\star$, - $\ddagger$,$\ddagger\ddagger$, - $\P$,$\P\P$, - $\S$,$\S\S$, - $\ast$,$\ast\ast$] - -\protect +%D \module
+%D [ file=core-con,
+%D version=1997.26.08,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Conversion Macros,
+%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 Core Macros / Conversion Macros}
+
+\unprotect
+
+%D This module deals with all kind of conversions from numbers
+%D and dates. I considered splitting this module in a support
+%D one and a core one, but to keep things simple as well as
+%D preserve the overview, I decided against splitting.
+
+%D \macros
+%D {numbers}
+%D
+%D First we deal with the dummy conversion of numbers using the
+%D \TEX\ primitive \type{\number}. The uppercase alternative is
+%D only there for compatibility with the other conversion
+%D macros. We could do without \type{#1} but this way we get
+%D rid of unwanted braces. For the savety we also define a
+%D non||sence uppercase alternative.
+%D
+%D \showsetup{\y!numbers}
+
+\def\numbers#1%
+ {\number#1}
+
+\def\Numbers#1%
+ {\number#1}
+
+%D \macros
+%D {romannumerals,Romannumerals}
+%D
+%D \TEX\ the program uses a rather tricky conversion from
+%D numbers to their roman counterparts. This conversion could
+%D of course be programmed in \TEX\ itself, but I guess Knuth
+%D found the programming trick worth presenting.
+%D
+%D \showsetup{\y!romannumerals}
+%D \showsetup{\y!Romannumerals}
+%D
+%D When upcasing the result, we just follow the text book rules
+%D of expansion. Later on we'll see some more uppercase tricks.
+
+\def\romannumerals#1%
+ {\romannumeral#1}
+
+\def\Romannumerals#1%
+ {\uppercase\expandafter{\romannumeral#1}}
+
+%D \macros
+%D {character,Character}
+%D
+%D Converting a number into a character can of course only
+%D be done with numbers less or equal to~26. At the cost of
+%D much more macros a faster conversion is possible, using:
+%D
+%D \starttypen
+%D \setvalue{char1}{a} \def\character#1{\getvalue{char#1}}
+%D \stoptypen
+%D
+%D But we prefer a simpel \type{\case}.
+%D
+%D \showsetup{\y!character}
+%D \showsetup{\y!Character}
+
+\def\character#1%
+ {\ifcase#1%
+ \or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m%
+ \or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z%
+ \else
+ #1%
+ \fi}
+
+\def\Character#1%
+ {\ifcase#1%
+ \or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M%
+ \or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z%
+ \else
+ #1%
+ \fi}
+
+%D \macros
+%D {characters,Characters}
+%D
+%D Converting large numbers is supported by the next two
+%D macros. This time we just count on: $\cdots$~x, y, z, aa,
+%D ab, ac~$\cdots$.
+%D
+%D \showsetup{\y!characters}
+%D \showsetup{\y!Characters}
+
+\def\doconvertcharacters#1#2%
+ {\bgroup
+ \ifnum#2>26
+ \!!counta=#2
+ \ifnum\!!counta>0
+ \advance\!!counta by -1
+ \!!countb=\!!counta
+ \divide\!!counta by 26
+ \!!countc=\!!counta
+ \multiply\!!countc by 26
+ \advance\!!countb by -\!!countc
+ \doconvertcharacters#1{\!!counta}%
+ \advance\!!countb by 1
+ #1{\the\!!countb}%
+ \fi
+ \else
+ #1{#2}%
+ \fi
+ \egroup}
+
+\def\characters%
+ {\doconvertcharacters\character}
+
+\def\Characters%
+ {\doconvertcharacters\Character}
+
+%D \macros
+%D {protectconversion}
+%D
+%D The previous two commands are not robust enough to be
+%D passed to \type{\write} en \type{\message}. That's why we
+%D introduce:
+
+\def\protectconversion%
+ {\def\doconvertcharacters{}}
+
+%D \macros
+%D {normaltime,normalyear,normalmonth,normalday}
+%D
+%D The last part of this module is dedicated to converting
+%D dates. Because we want to use as meaningful commands as
+%D possible, and because \TEX\ already uses up some of those,
+%D we save the original meanings.
+
+\let\normaltime = \time
+\let\normalyear = \year
+\let\normalmonth = \month
+\let\normalday = \day
+
+%D \macros
+%D {month,MONTH}
+%D
+%D Converting the month number into a month name is done
+%D using a case statement, abstact values and the label
+%D mechanism. This way users can easily redefine a label from
+%D for instance german into austrian.
+%D
+%D \starttypen
+%D \setuplabeltext [de] [january=J\"anner]
+%D \stoptypen
+%D
+%D Anyhow, the conversion looks like:
+
+\def\doconvertmonth#1%
+ {\labeltext
+ {\ifcase#1%
+ \or \v!january \or \v!february \or \v!march \or \v!april
+ \or \v!may \or \v!june \or \v!july \or \v!august
+ \or \v!september \or \v!october \or \v!november \or \v!december
+ \fi}}
+
+%D We redefine the \TEX\ primitive \type{\month} as:
+%D
+%D \showsetup{\y!month}
+%D \showsetup{\y!MONTH}
+
+\def\month%
+ {\doconvertmonth}
+
+\def\MONTH#1%
+ {{\let\labeltext=\LABELTEXT\month{#1}}}
+
+%D We never explicitly needed this, but Tobias Burnus pointed
+%D out that it would be handy to convert to the day of the
+%D week. In doing so, we have to calculate the total number of
+%D days, taking leapyears into account. For those who are
+%D curious:
+%D
+%D \startopsomming[opelkaar]
+%D \som years that can be divided by 4 are leapyears
+%D \som exept years that can be divided by 100
+%D \som unless years can be divided by 400
+%D \stopopsomming
+%D
+%D This makes the year 1900 into a normal year and 1996 and
+%D 2000 into leap years, right? Well, converting to string
+%D looks familiar:
+
+\def\doconvertday#1%
+ {\labeltext
+ {\ifcase#1
+ \or \v!sunday \or \v!monday \or \v!tuesday \or \v!wednesday
+ \or \v!thursday \or \v!friday \or \v!saturday \fi}}
+
+%D \macros
+%D {dayoftheweek}
+%D
+%D The conversion algoritm is an old one and a translation from
+%D a procedure written in MODULA~2 back in the 80's. I finaly
+%D found the 4--100-400 rules in some enclopedia. Look at this
+%D messy low level routine that takes the day, month and year
+%D as arguments:
+
+\def\dayoftheweek#1#2#3%
+ {\bgroup
+ \!!counta=\ifcase#2\relax
+ 0\or 0\or 31\or 59\or 90\or120\or151\or
+ 181\or212\or243\or273\or304\or334\or365\fi
+ \advance\!!counta by #1\relax
+ \ifnum\!!counta<31
+ \DoMod#3by4to\!!countb
+ \ifnum\!!countb=0
+ \!!doneafalse
+ \DoMod#3by100to\!!countb
+ \ifnum\!!countb=0 \else \!!doneatrue \fi
+ \DoMod#3by400to\!!countb
+ \ifnum\!!countb=0 \!!doneatrue \fi
+ \else
+ \!!doneafalse
+ \fi
+ \else
+ \!!doneafalse
+ \fi
+ \!!countb=#3\relax
+ \multiply\!!countb by 365
+ \advance\!!counta by \!!countb
+ \DoDiv#3by4to\!!countb
+ \advance\!!counta by \!!countb
+ \DoDiv#3by400to\!!countb
+ \advance\!!counta by \!!countb
+ \DoDiv#3by100to\!!countb
+ \advance\!!counta by -\!!countb
+ \if!!donea
+ \advance\!!counta by -1
+ \fi
+ \advance\!!counta by -1
+ \DoMod\!!counta by7to\!!counta
+ \advance\!!counta by 1
+ \doconvertday\!!counta
+ \egroup}
+
+%D Using this macro in
+%D
+%D \startbuffer
+%D monday: \dayoftheweek {4} {5} {1992}
+%D friday: \dayoftheweek {16} {6} {1995}
+%D monday: \dayoftheweek {25} {8} {1997}
+%D saturday: \dayoftheweek {30} {8} {1997}
+%D tuesday: \dayoftheweek {2} {1} {1996}
+%D tuesday: \dayoftheweek {7} {1} {1997}
+%D tuesday: \dayoftheweek {13} {1} {1998}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+
+%D \macros
+%D {weekday,WEEKDAY}
+%D
+%D The first one is sort of redundant. It takes the day
+%D number argument.
+%D
+%D \showsetup{\y!weekday}
+%D \showsetup{\y!WEEKDAY}
+
+\def\weekday%
+ {\doconvertday}
+
+\def\WEEKDAY#1%
+ {{\let\labeltext=\LABELTEXT\doconvertday{#1}}}
+
+%D \macros
+%D {weekoftheday}
+%D
+%D {\em not yet implemented:}
+%D
+%D \starttypen
+%D \def\weekoftheday#1#2#3%
+%D {}
+%D \stoptypen
+
+%D \macros
+%D {currentdate}
+%D
+%D We use these conversion macros in the date formatting
+%D macro:
+%D
+%D \showsetup{\y!currentdate}
+%D
+%D This macro takes care of proper spacing and delivers for
+%D instance:
+%D
+%D \startbuffer
+%D \currentdate[weekdag,dag,maand,jaar] % still dutch example
+%D \currentdate[WEEKDAG,dag,MAAND,jaar] % still dutch example
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D depending of course on the keywords. Here we gave:
+%D
+%D \typebuffer
+%D
+%D If needed one can also add non||keywords, like in
+%D
+%D \startbuffer
+%D \currentdate[dd,--,mm,--,yy]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or typeset: \haalbuffer.
+%D
+%D When no argument is passed, the current date is given as
+%D specified per language (using \type{\installlanguage}).
+
+\def\complexcurrentdate[#1]%
+ {\bgroup
+ \let\labellanguage=\currentlanguage
+ \def\betweendates{\let\betweendates\space}%
+ \processallactionsinset
+ [#1]
+ [ dd=>\ifnum\normalday>9\relax\else0\fi\the\normalday,
+ mm=>\ifnum\normalmonth>9\relax\else0\fi\the\normalmonth,
+ jj=>\expandafter\gobbletwoarguments\the\normalyear,
+ yy=>\expandafter\gobbletwoarguments\the\normalyear,
+ d=>\the\normalday,
+ m=>\the\normalmonth,
+ j=>\the\normalyear,
+ y=>\the\normalyear,
+ \v!kenmerk=>{\complexcurrentdate[jj,mm,dd]},
+ \v!dag=>\betweendates\the\normalday,
+ \v!maand=>\betweendates\month\normalmonth,
+ \v!MAAND=>\betweendates\MONTH\normalmonth,
+ \v!jaar=>\betweendates\the\normalyear,
+ \v!weekdag=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
+ \v!WEEKDAG=>\betweendates
+ \bgroup
+ \let\labeltext=\LABELTEXT
+ \dayoftheweek\normalday\normalmonth\normalyear
+ \egroup,
+ \s!unknown=>\commalistelement
+ \def\betweendates{\let\betweendates\space}]%
+ \egroup}
+
+\def\simplecurrentdate%
+ {\expanded{\complexcurrentdate[\currentdatespecification]}}
+
+\definecomplexorsimple\currentdate
+
+%D \macros
+%D {definesymbol, symbol}
+%D
+%D Converting numbers or levels into a character, romannumeral,
+%D symbol or something else, is supported by many \CONTEXT\
+%D commands. Therefore we need a mechanism for linking such
+%D numbers to their counterparts.
+%D
+%D First we take care of symbols. These are for instance used
+%D in enumerations and itemizations. We have:
+%D
+%D \showsetup{\y!definesymbol}
+%D \showsetup{\y!symbol}
+%D
+%D Symbols are symply linked to a tag. Such tags can be numbers
+%D or strings.
+%D
+%D \starttypen
+%D \definesymbol [1] [$\bullet$]
+%D \definesymbol [level 5] [$\star$]
+%D \stoptypen
+
+\def\dodefinesymbol[#1][#2]%
+ {\setvalue{\??ss#1}{#2}}%
+
+\def\definesymbol%
+ {\dodoubleargument\dodefinesymbol}
+
+\def\symbol[#1]%
+ {\doifdefinedelse{\??ss#1}{\getvalue{\??ss#1}}{#1}}
+
+%D \macros
+%D {defineconversion, convertnumber}
+%D
+%D Conversion involves the macros that we implemented earlier
+%D in this module.
+%D
+%D \showsetup{\y!defineconversion}
+%D \showsetup{\y!convertnumber}
+%D
+%D We can feed this command with conversion macros as well as
+%D a set of conversion symbols. Both need a bit different
+%D treatment.
+%D
+%D \starttypen
+%D \defineconversion [roman] [\romannumerals]
+%D \defineconversion [set 1] [$\star$,$\bullet$,$\ast$]
+%D \stoptypen
+
+\def\dodefineconversion[#1][#2]%
+ {\ConvertConstantAfter\doifinstringelse{,}{#2}
+ {\scratchcounter=0
+ \def\docommando##1%
+ {\advance\scratchcounter by 1
+ \setvalue{\??cv#1\the\scratchcounter}{##1}}%
+ \processcommalist[#2]\docommando
+ \setvalue{\??cv#1}##1{\getvalue{\??cv#1##1}}}
+ {\setvalue{\??cv#1}{#2}}}
+
+\def\defineconversion%
+ {\dodoubleargument\dodefineconversion}
+
+\def\convertnumber#1%
+ {\getvalue{\??cv#1}}
+
+%D As longs as symbols are linked to levels or numbers, we can
+%D also use the conversion mechanism, but in for instance the
+%D itemization macros, we prefer symbols because they can more
+%D easier be (partially) redefined.
+
+%D We predefine some common symbols and conversions that will
+%D be understood by many commands.
+
+\definesymbol [1] [$\bullet$]
+\definesymbol [2] [--]
+\definesymbol [3] [$\star$]
+\definesymbol [4] [$\triangleright$]
+\definesymbol [5] [$\circ$]
+\definesymbol [6] [\hbox{\setsmallbodyfont\raise\!!onepoint\hbox{$\bigcirc$}}]
+\definesymbol [7] [$\bigcirc$]
+\definesymbol [8] [\hbox{\hsmash{$\sqcup$}$\sqcap$}]
+
+\defineconversion [] [\numbers] % the default conversion
+
+\defineconversion [a] [\characters]
+\defineconversion [A] [\Characters]
+\defineconversion [AK] [\kap\characters]
+\defineconversion [KA] [\kap\characters]
+
+\defineconversion [n] [\numbers]
+\defineconversion [N] [\Numbers]
+\defineconversion [m] [\mediaeval]
+
+\defineconversion [r] [\romannumerals]
+\defineconversion [R] [\Romannumerals]
+\defineconversion [KR] [\kap\romannumerals]
+\defineconversion [RK] [\kap\romannumerals]
+
+\defineconversion [\v!letter] [\character]
+\defineconversion [\v!Letter] [\Character]
+
+\defineconversion [\v!letters] [\characters]
+\defineconversion [\v!Letters] [\Characters]
+
+\defineconversion [\v!cijfers] [\numbers]
+\defineconversion [\v!Cijfers] [\Numbers]
+\defineconversion [\v!mediaeval] [\mediaeval]
+
+\defineconversion [\v!romeins] [\romannumerals]
+\defineconversion [\v!Romeins] [\Romannumerals]
+
+\defineconversion
+ [set 1]
+ [$\star$,$\star\star$,$\star\star\star$,
+ $\ddagger$,$\ddagger\ddagger$,$\ddagger\ddagger\ddagger$,
+ $\ast$,$\ast\ast$,$\ast\ast\ast$]
+
+\defineconversion
+ [set 2]
+ [$*$,$\dag$,$\ddag$,
+ $**$,$\dag\dag$,$\ddag\ddag$,
+ $***$,$\dag\dag\dag,$\ddag\ddag\ddag$]
+
+\defineconversion
+ [set 3]
+ [$\star$,$\star\star$,$\star\star\star$,
+ $\ddagger$,$\ddagger\ddagger$,
+ $\P$,$\P\P$,
+ $\S$,$\S\S$,
+ $\ast$,$\ast\ast$]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-fil.tex b/tex/context/base/core-fil.tex index 27204558d..0f506f3c9 100644 --- a/tex/context/base/core-fil.tex +++ b/tex/context/base/core-fil.tex @@ -1,121 +1,127 @@ -% NOT YET DOCUMENTED !! -% -% overal \normalinput - - -%D \module -%D [ file=core-fil, -%D version=1997.11.15, -%D title=\CONTEXT\ Core Macros, -%D subtitle=File Support, -%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 Core Macros / File Support} - -\unprotect - -%D \macros -%D {definefilename} -%D -%D One of the problems with loading files is that their names -%D can depend on the interface language. We therefore need a -%D method to define filesynonyms. The actual synonyms are -%D defined elsewhere, but look like: -%D -%D \starttypen -%D \definefilesynonym [chemic] [chemie] -%D \definefilesynonym [einheit] [eenheid] -%D \definefilesynonym [unit] [eenheid] -%D \stoptypen -%D -%D So we can say in english: -%D -%D \starttypen -%D \usemodules[pictex,chemic,unit] -%D \stoptypen -%D -%D and in dutch: -%D -%D \starttypen -%D \usemodules[pictex,chemie,eenheid] -%D \stoptypen - -\def\definefilesynonym% - {\dodoubleempty\dodefinefilesynonym} - -\def\dodefinefilesynonym[#1][#2]% - {\lowercase{\setevalue{\??fs#1}{#2}}} - -%D \macros -%D {truefilename} -%D -%D At the system level such a filename can be called upon by -%D saying: -%D -%D \starttypen -%D \truefilename{filename/filesynonym} -%D \stoptypen - -\def\truefilename#1% - {\ifundefined{\??fs#1}#1\else\getvalue{\??fs#1}\fi} - -%D \macros -%D {makeshortfilename} -%D -%D To prevent cross platform problems with filenames, we -%D lowercase them as well as only use the first 8~characters. - -\def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]% - {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}% - \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename} - -\def\makeshortfilename[#1]% - {\edef\fullfilename{#1.........}% - \expanded{\domakeshortfilename[\fullfilename]}} - -%D \macros -%D {usemodule} -%D -%D Most of \CONTEXT is preloaded in the format file. Some very -%D domain specific typesetting topics are however dealt with in -%D separate modules, e.g. typesettingof chemical structure -%D formulas. These modules are loaded by: -%D -%D \showsetup{\y!usemodule} -%D -%D More information on the specific modules can be found in -%D their dedicated manuals. - -\def\dodousemodules#1% - {\makeshortfilename[\f!moduleprefix\truefilename{#1}]% - \doifundefinedelse{\shortfilename\v!aan} - {\setgvalue{\shortfilename\v!aan}{}% - \startreadingfile - \readsysfile{\shortfilename}% - {\showmessage{\m!systems}{5}{#1}}% - {\showmessage{\m!systems}{6}{#1}}% - \stopreadingfile} - {\showmessage{\m!systems}{7}{#1}}} - -\def\dousemodules[#1]% - {\doifsomething{#1} - {\processcommalist[#1]\dodousemodules}} - -\def\usemodules% - {\dosingleargument\dousemodules} - -%D We also support a singular call, which saves us for -%D frustrations when we do a typo. - -\def\usemodule% - {\usemodules} - -\protect - -\endinput +% NOT YET DOCUMENTED !!
+%
+% overal \normalinput
+
+
+%D \module
+%D [ file=core-fil,
+%D version=1997.11.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=File Support,
+%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 Core Macros / File Support}
+
+\unprotect
+
+%D \macros
+%D {definefilename}
+%D
+%D One of the problems with loading files is that their names
+%D can depend on the interface language. We therefore need a
+%D method to define filesynonyms. The actual synonyms are
+%D defined elsewhere, but look like:
+%D
+%D \starttypen
+%D \definefilesynonym [chemic] [chemie]
+%D \definefilesynonym [einheit] [eenheid]
+%D \definefilesynonym [unit] [eenheid]
+%D \stoptypen
+%D
+%D So we can say in english:
+%D
+%D \starttypen
+%D \usemodules[pictex,chemic,unit]
+%D \stoptypen
+%D
+%D and in dutch:
+%D
+%D \starttypen
+%D \usemodules[pictex,chemie,eenheid]
+%D \stoptypen
+
+\def\definefilesynonym%
+ {\dodoubleempty\dodefinefilesynonym}
+
+%\def\dodefinefilesynonym[#1][#2]%
+% {\lowercase{\setevalue{\??fs#1}{#2}}}
+
+\def\dodefinefilesynonym[#1][#2]%
+ {\lowercase{\edef\!!stringa{#2}}%
+ \setevalue{\??fs#1}{\!!stringa}}
+
+%D \macros
+%D {truefilename}
+%D
+%D At the system level such a filename can be called upon by
+%D saying:
+%D
+%D \starttypen
+%D \truefilename{filename/filesynonym}
+%D \stoptypen
+
+\def\truefilename#1%
+ {\ifundefined{\??fs#1}#1\else\getvalue{\??fs#1}\fi}
+
+%D \macros
+%D {makeshortfilename}
+%D
+%D To prevent cross platform problems with filenames, we
+%D lowercase them as well as only use the first 8~characters.
+
+\def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]%
+ {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}%
+ \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
+
+\def\makeshortfilename[#1]%
+ {\edef\fullfilename{#1.........}%
+ \expanded{\domakeshortfilename[\fullfilename]}}
+
+%D \macros
+%D {usemodule}
+%D
+%D Most of \CONTEXT is preloaded in the format file. Some very
+%D domain specific typesetting topics are however dealt with in
+%D separate modules, e.g. typesettingof chemical structure
+%D formulas. These modules are loaded by:
+%D
+%D \showsetup{\y!usemodule}
+%D
+%D More information on the specific modules can be found in
+%D their dedicated manuals.
+
+\def\dododousemodules#1#2%
+ {\makeshortfilename[#1\truefilename{#2}]%
+ \doifundefinedelse{\shortfilename\v!aan}
+ {\setgvalue{\shortfilename\v!aan}{}%
+ \startreadingfile
+ \readsysfile{\shortfilename}%
+ {\showmessage{\m!systems}{5}{#2}}%
+ {\showmessage{\m!systems}{6}{#2}}%
+ \stopreadingfile}
+ {\showmessage{\m!systems}{7}{#2}}}
+
+\def\dodousemodules#1%
+ {\dododousemodules\f!moduleprefix{#1}%
+ \dododousemodules\f!styleprefix {#1}}
+
+\def\dousemodules[#1]%
+ {\doifsomething{#1}{\processcommalist[#1]\dodousemodules}}
+
+\def\usemodules%
+ {\dosingleargument\dousemodules}
+
+%D We also support a singular call, which saves us for
+%D frustrations when we do a typo.
+
+\let\usemodule=\usemodules
+
+\protect
+
+\endinput
diff --git a/tex/context/base/core-fnt.tex b/tex/context/base/core-fnt.tex index 0984781da..4df92a5a4 100644 --- a/tex/context/base/core-fnt.tex +++ b/tex/context/base/core-fnt.tex @@ -1,330 +1,331 @@ -%D \module -%D [ file=core-fnt, -%D version=1995.10.10, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Font Support, -%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 Core Macros / Font Support} - -\unprotect - -%D \macros -%D {kap,KAP,Kap,Kaps,nokap} -%D -%D We already introduced \type{\kap} as way to capitalize -%D words. This command comes in several versions: -%D -%D \startbuffer -%D \kap {let's put on a \kap{cap}} -%D \kap {let's put on a \nokap{cap}} -%D \KAP {let's put on a \\{cap}} -%D \Kap {let's put on a \\{cap}} -%D \Kaps{let's put on a cap} -%D \stopbuffer -%D -%D \typebuffer -%D -%D Note the use of \type{\nokap}, \type{\\} and the nested -%D \type{\kap}. -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld -%D -%D These macros show te main reason why we introduced the -%D smaller \type{\tx} and \type{\txx}. -%D -%D \starttypen -%D \kap\romeins{1995} -%D \stoptypen -%D -%D This at first sight unusual capitilization is completely -%D legal. -%D -%D \showsetup{\y!kap} -%D \showsetup{\y!Kap} -%D \showsetup{\y!KAP} -%D \showsetup{\y!Kaps} -%D \showsetup{\y!nokap} - -\unexpanded\def\kap% - {\futurelet\next\dokap} - -% \def\dokap% -% {\ifx\next\bgroup -% \def\next{\dodokap\relax}% -% \else -% \def\next{\dodokap}% -% \fi -% \next} - -\def\dokap% - {\ifx\next\bgroup - \expandafter\dodokap\expandafter\relax - \else - \expandafter\dodokap - \fi} - -\def\dodokap#1#2% - {\ifmmode\hbox\fi - \bgroup - \tx - \the\everyuppercase - \uppercase{#1{#2}}% - \egroup} - -\unexpanded\def\KAP#1% - {{\def\\##1{\kap{##1}}#1}} - -\unexpanded\def\Kap#1% - {\KAP{\\#1}} - -\def\nokap#1% - {\lowercase{#1}} - -\def\Kaps% - {\let\processword=\Kap - \processwords} - -%D \macros -%D {Word, Words, WORD, WORDS, doprocesswords} -%D -%D This is probably not the right place to present the next set -%D of macros. -%D -%D \starttypen -%D \Word {far too many words} -%D \Words{far too many words} -%D \WORD {far too many words} -%D \WORDS{far too many words} -%D \stoptypen -%D -%D \typebuffer -%D -%D This calls result in: -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld -%D -%D \showsetup{\y!Word} -%D \showsetup{\y!Words} -%D \showsetup{\y!WORD} -%D \showsetup{\y!WORDS} - -\def\doWord#1% - {\bgroup - \the\everyuppercase - \uppercase{#1}% - \egroup} - -\def\Word#1% - {\doWord#1} - -\def\doprocesswords#1 #2\od% - {\ConvertToConstant\doifnot{#1}{} - {\processword{#1} % - \doprocesswords#2 \od}} - -\def\processwords#1% - {\doprocesswords#1 \od\unskip} - -\def\Words% - {\let\processwords=\Word - \processwords} - -\def\WORD#1% - {\bgroup - \def\kap#1{#1}% - \edef\next{#1}% - \the\everyuppercase - \uppercase\expandafter{\next}% - \egroup} - -\def\WORDS#1% - {\WORD{#1}} - -%D \macros -%D {stretched} -%D -%D Stretching characters in a word is a sort of typographical -%D murder. Nevertheless we support this manipulation for use in -%D for instance titles. -%D -%D \starttypen -%D \hbox to 5cm{\stretched{murder}} -%D \stoptypen -%D -%D \typebuffer -%D -%D or -%D -%D \startvoorbeeld -%D \haalbuffer -%D \stopvoorbeeld -%D -%D \showsetup{\y!stretched} - -\def\stretched% - {\ifvmode\hbox to \hsize\else\ifinner\else\hbox\fi\fi - \processtokens\relax\hss\relax\normalspace} - -%D \startbuffer -%D \stretched{Unknown Box} -%D \hbox to .5\hsize{\stretched{A Horizontal Box}} -%D \vbox to 2cm{\stretched{A Vertical Box}} -%D \hbox to 3cm{\stretched{sp{\'e}c{\`\i}{\"a}l}} -%D \stopbuffer -%D -%D \haalbuffer -%D -%D The first line of this macros takes care of boxing. Normally -%D one will use an \type{\hbox} specification. The last line -%D shows how special characters should be passed. -%D -%D \typebuffer - -%D \macros -%D {underbar,underbars,overstrike,overstrikes,setupunderbar} -%D -%D In the rare case that we need undelined words, for instance -%D because all font alternatives are already in use, one can -%D use \type{\underbar} and \type{\overstrike} and their plural -%D forms. -%D -%D \startbuffer -%D \underbars{drawing \underbar{bars} under words is a typewriter leftover} -%D \overstrikes{striking words makes them \overstrike{unreadable}} -%D \stopbuffer -%D -%D \typebuffer -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld -%D -%D The next macros are derived from the \PLAIN\ \TEX\ one, but -%D also supports nesting. The \type{$} keeps us in horizontal -%D mode and at the same time applies grouping. -%D -%D \showsetup{\y!underbar} -%D \showsetup{\y!underbars} -%D \showsetup{\y!overstrike} -%D \showsetup{\y!overstrikes} -%D -%D Although underlining is ill advised, we permit some -%D alternatives, that can be set up by: -%D -%D \showsetup{\y!setupunderbar} -%D -%D The alternatives show up as -%D {\setupunderbar [variant=a]{alternative a}, -%D {\setupunderbar [variant=b]{alternative b}, -%D {\setupunderbar [variant=c]{alternative c} -%D and -%D {\setupunderbar [lijndikte=1pt]{1pt width}, -%D {\setupunderbar [lijndikte=2pt]{2pt width}, -%D or whatever. Because \type{\overstrike} uses the same -%D method, the settings also apply to that macro. - -\newcounter\underbarlevel -\newbox\underbarbox - -\def\underbarmethoda#1#2#3% RULE - {\hbox to #1{\vrule\!!width#1\!!height#2\!!depth#3}} - -\def\underbarmethodb#1#2#3% DASH - {\hbox to #1 - {\hskip-.25em - \xleaders - \hbox{\hskip.25em\vrule\!!width.25em\!!height#2\!!depth#3} - \hfil}} - -\def\underbarmethodc#1#2#3% PERIOD - {\hbox to #1 - {\dimen0=#3 - \advance\dimen0 by .2ex - \hskip-.25em - \xleaders - \hbox{\hskip.25em\lower\dimen0\hbox{.}} - \hfil}} - -\def\dodounderbar#1#2#3% - {\bmath - \setbox0=\hbox{#3}% - \setbox2=\getvalue{underbarmethod\@@onvariant}{\wd0}{#1}{#2}% - \wd0=\!!zeropoint - \box0\box2 - \emath} - -\unexpanded\def\dounderbar#1% - {\bgroup - \increment\underbarlevel - \dimen0=1.5\normallineskip % was \dimen0=1.5\lineskip - \dimen0=\underbarlevel\dimen0 - \dimen2=\dimen0 - \advance\dimen2 by \@@onlijndikte - \dodounderbar{-\dimen0}{\dimen2}{#1}% - \egroup} - -\unexpanded\def\underbar#1% - {\bgroup - \setbox\underbarbox=\hbox - {\dounderbar{\hskip\fontdimen2\font}}% - \def\betweenisolatedwords% - {\nobreak - \hskip\!!zeropoint\!!minus\fontdimen4\font - \discretionary{}{}{\copy\underbarbox}}% - \processisolatedwords{#1}\dounderbar - \egroup} - -\unexpanded\def\underbars#1% - {\processisolatedwords{#1}\dounderbar} - -\unexpanded\def\dooverstrike#1% - {\bgroup - \dimen0=2.5\lineskip - \dimen2=\dimen0 - \advance\dimen2 by \@@onlijndikte - \dodounderbar{\dimen2}{-\dimen0}{#1}% - \egroup} - -\unexpanded\def\overstrike#1% - {\bgroup - \setbox\underbarbox=\hbox - {\dooverstrike{\hskip\fontdimen2\font}}% - \def\betweenisolatedwords% - {\nobreak - \hskip\!!zeropoint\!!minus\fontdimen4\font - \discretionary{}{}{\copy\underbarbox}}% - \processisolatedwords{#1}\dooverstrike - \egroup} - -\unexpanded\def\overstrikes#1% - {\processisolatedwords{#1}\dooverstrike} - -\def\setupunderbar% - {\dodoubleargument\getparameters[\??on]} - -%D This module has only a few setups: - -\setupunderbar - [\c!variant=a, - \c!lijndikte=\linewidth] - -\protect - -\endinput +%D \module
+%D [ file=core-fnt,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Font Support,
+%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 Core Macros / Font Support}
+
+\unprotect
+
+%D \macros
+%D {kap,KAP,Kap,Kaps,nokap}
+%D
+%D We already introduced \type{\kap} as way to capitalize
+%D words. This command comes in several versions:
+%D
+%D \startbuffer
+%D \kap {let's put on a \kap{cap}}
+%D \kap {let's put on a \nokap{cap}}
+%D \KAP {let's put on a \\{cap}}
+%D \Kap {let's put on a \\{cap}}
+%D \Kaps{let's put on a cap}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Note the use of \type{\nokap}, \type{\\} and the nested
+%D \type{\kap}.
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D These macros show te main reason why we introduced the
+%D smaller \type{\tx} and \type{\txx}.
+%D
+%D \starttypen
+%D \kap\romeins{1995}
+%D \stoptypen
+%D
+%D This at first sight unusual capitilization is completely
+%D legal.
+%D
+%D \showsetup{\y!kap}
+%D \showsetup{\y!Kap}
+%D \showsetup{\y!KAP}
+%D \showsetup{\y!Kaps}
+%D \showsetup{\y!nokap}
+
+\unexpanded\def\kap%
+ {\futurelet\next\dokap}
+
+% \def\dokap%
+% {\ifx\next\bgroup
+% \def\next{\dodokap\relax}%
+% \else
+% \def\next{\dodokap}%
+% \fi
+% \next}
+
+\def\dokap%
+ {\ifx\next\bgroup
+ \expandafter\dodokap\expandafter\relax
+ \else
+ \expandafter\dodokap
+ \fi}
+
+\def\dodokap#1#2%
+ {\ifmmode\hbox\fi
+ \bgroup
+ \tx
+ \the\everyuppercase
+ \uppercase{#1{#2}}%
+ \egroup}
+
+\unexpanded\def\KAP#1%
+ {{\def\\##1{\kap{##1}}#1}}
+
+\unexpanded\def\Kap#1%
+ {\KAP{\\#1}}
+
+\def\nokap#1%
+ {\lowercase{#1}}
+
+\def\Kaps%
+ {\let\processword=\Kap
+ \processwords}
+
+%D \macros
+%D {Word, Words, WORD, WORDS, doprocesswords}
+%D
+%D This is probably not the right place to present the next set
+%D of macros.
+%D
+%D \starttypen
+%D \Word {far too many words}
+%D \Words{far too many words}
+%D \WORD {far too many words}
+%D \WORDS{far too many words}
+%D \stoptypen
+%D
+%D \typebuffer
+%D
+%D This calls result in:
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D \showsetup{\y!Word}
+%D \showsetup{\y!Words}
+%D \showsetup{\y!WORD}
+%D \showsetup{\y!WORDS}
+
+\def\doWord#1%
+ {\bgroup
+ \the\everyuppercase
+ \uppercase{#1}%
+ \egroup}
+
+\def\Word#1%
+ {\doWord#1}
+
+\def\doprocesswords#1 #2\od%
+ {\ConvertToConstant\doifnot{#1}{}
+ {\processword{#1} %
+ \doprocesswords#2 \od}}
+
+\def\processwords#1%
+ {\doprocesswords#1 \od\unskip}
+
+\def\Words%
+ {\let\processwords=\Word
+ \processwords}
+
+\def\WORD#1%
+ {\bgroup
+ \def\kap#1{#1}%
+ \edef\next{#1}%
+ \the\everyuppercase
+ \uppercase\expandafter{\next}%
+ \egroup}
+
+\def\WORDS#1%
+ {\WORD{#1}}
+
+%D \macros
+%D {stretched}
+%D
+%D Stretching characters in a word is a sort of typographical
+%D murder. Nevertheless we support this manipulation for use in
+%D for instance titles.
+%D
+%D \starttypen
+%D \hbox to 5cm{\stretched{murder}}
+%D \stoptypen
+%D
+%D \typebuffer
+%D
+%D or
+%D
+%D \startvoorbeeld
+%D \haalbuffer
+%D \stopvoorbeeld
+%D
+%D \showsetup{\y!stretched}
+
+\def\stretched%
+ {\ifvmode\hbox to \hsize\else\ifinner\else\hbox\fi\fi
+ \processtokens\relax\hss\relax\normalspace}
+
+%D \startbuffer
+%D \stretched{Unknown Box}
+%D \hbox to .5\hsize{\stretched{A Horizontal Box}}
+%D \vbox to 2cm{\stretched{A Vertical Box}}
+%D \hbox to 3cm{\stretched{sp{\'e}c{\`\i}{\"a}l}}
+%D \stopbuffer
+%D
+%D \haalbuffer
+%D
+%D The first line of this macros takes care of boxing. Normally
+%D one will use an \type{\hbox} specification. The last line
+%D shows how special characters should be passed.
+%D
+%D \typebuffer
+
+%D \macros
+%D {underbar,underbars,overstrike,overstrikes,setupunderbar}
+%D
+%D In the rare case that we need undelined words, for instance
+%D because all font alternatives are already in use, one can
+%D use \type{\underbar} and \type{\overstrike} and their plural
+%D forms.
+%D
+%D \startbuffer
+%D \underbars{drawing \underbar{bars} under words is a typewriter leftover}
+%D \overstrikes{striking words makes them \overstrike{unreadable}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D The next macros are derived from the \PLAIN\ \TEX\ one, but
+%D also supports nesting. The \type{$} keeps us in horizontal
+%D mode and at the same time applies grouping.
+%D
+%D \showsetup{\y!underbar}
+%D \showsetup{\y!underbars}
+%D \showsetup{\y!overstrike}
+%D \showsetup{\y!overstrikes}
+%D
+%D Although underlining is ill advised, we permit some
+%D alternatives, that can be set up by:
+%D
+%D \showsetup{\y!setupunderbar}
+%D
+%D The alternatives show up as
+%D {\setupunderbar [variant=a]{alternative a},
+%D {\setupunderbar [variant=b]{alternative b},
+%D {\setupunderbar [variant=c]{alternative c}
+%D and
+%D {\setupunderbar [lijndikte=1pt]{1pt width},
+%D {\setupunderbar [lijndikte=2pt]{2pt width},
+%D or whatever. Because \type{\overstrike} uses the same
+%D method, the settings also apply to that macro.
+
+\newcounter\underbarlevel
+\newbox\underbarbox
+
+\def\underbarmethoda#1#2#3% RULE
+ {\hbox to #1{\vrule\!!width#1\!!height#2\!!depth#3}}
+
+\def\underbarmethodb#1#2#3% DASH
+ {\hbox to #1
+ {\hskip-.25em
+ \xleaders
+ \hbox{\hskip.25em\vrule\!!width.25em\!!height#2\!!depth#3}
+ \hfil}}
+
+\def\underbarmethodc#1#2#3% PERIOD
+ {\hbox to #1
+ {\dimen0=#3
+ \advance\dimen0 by .2ex
+ \hskip-.25em
+ \xleaders
+ \hbox{\hskip.25em\lower\dimen0\hbox{.}}
+ \hfil}}
+
+\def\dodounderbar#1#2#3%
+ {\bmath
+ \setbox0=\hbox{#3}%
+ \setbox2=\getvalue{underbarmethod\@@onvariant}{\wd0}{#1}{#2}%
+ \wd0=\!!zeropoint
+ \box0\box2
+ \emath}
+
+\unexpanded\def\dounderbar#1%
+ {\bgroup
+ \increment\underbarlevel
+ \dimen0=1.5\normallineskip % was \dimen0=1.5\lineskip
+ \dimen0=\underbarlevel\dimen0
+ \dimen2=\dimen0
+ \advance\dimen2 by \@@onlijndikte
+ \dodounderbar{-\dimen0}{\dimen2}{#1}%
+ \egroup}
+
+\unexpanded\def\underbar#1%
+ {\bgroup
+ \setbox\underbarbox=\hbox
+ {\dounderbar{\hskip\fontdimen2\font}}%
+ \def\betweenisolatedwords%
+ {\nobreak
+ \hskip\!!zeropoint\!!minus\fontdimen4\font
+ \discretionary{}{}{\copy\underbarbox}}%
+ \processisolatedwords{#1}\dounderbar
+ \egroup}
+
+\unexpanded\def\underbars#1%
+ {\processisolatedwords{#1}\dounderbar}
+
+\unexpanded\def\dooverstrike#1%
+ {\bgroup
+ \dimen0=2.5\lineskip
+ \dimen2=\dimen0
+ \advance\dimen2 by \@@onlijndikte
+ \dodounderbar{\dimen2}{-\dimen0}{#1}%
+ \egroup}
+
+\unexpanded\def\overstrike#1%
+ {\bgroup
+ \setbox\underbarbox=\hbox
+ {\dooverstrike{\hskip\fontdimen2\font}}%
+ \def\betweenisolatedwords%
+ {\nobreak
+ \hskip\!!zeropoint\!!minus\fontdimen4\font
+ \discretionary{}{}{\copy\underbarbox}}%
+ \processisolatedwords{#1}\dooverstrike
+ \egroup}
+
+\unexpanded\def\overstrikes#1%
+ {\processisolatedwords{#1}\dooverstrike}
+
+\def\setupunderbar%
+ {\dodoubleargument\getparameters[\??on]}
+
+%D This module has only a few setups:
+
+\setupunderbar
+ [\c!variant=a,
+ \c!lijndikte=\linewidth]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-gen.tex b/tex/context/base/core-gen.tex index ee5c7caf9..990d857bc 100644 --- a/tex/context/base/core-gen.tex +++ b/tex/context/base/core-gen.tex @@ -1,178 +1,179 @@ -%D \module -%D [ file=core-gen, -%D version=1995.10.10, -%D title=\CONTEXT\ Core Macros, -%D subtitle=General, -%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 Core Macros / General} - -\unprotect - -%D \macros -%D {assigndimension,assignalfadimension} -%D {} -%D -%D Hieronder worden enkele commando's gedefinieerd rond -%D toekenningen. Allereerst een commando om waarden aan -%D een \DIMENSION\ toe te kennen: -%D -%D \starttypen -%D \assigndimension -%D {<waarde>|klein|middel|groot|-klein|-middel|-groot|geen} -%D {\dimensie} -%D {waarde klein} -%D {waarde middel} -%D {waarde groot} -%D \stoptypen -%D -%D Hierbij krijgt de \DIMENSION\ \type{\dimensie} een waarde -%D afhankelijk van het meegegeven trefwoord. -%D -%D \startsmaller -%D \startregels -%D \type{(-)klein }\qquad (--) waarde klein -%D \type{(-)middel}\qquad (--) waarde middel -%D \type{(-)groot }\qquad (--) waarde groot -%D \type{geen }\qquad 0pt -%D \type{waarde }\qquad waarde -%D \stopregels -%D \stopsmaller -%D -%D Een trefwoord mag worden voorafgegaan door een \type{-}. -%D Deze macro toont een voorbeeld van het gebruik van -%D \type{\processaction} en constanten. -%D -%D Analoog aan het bovenstaande commando kennen we een -%D commando om waarden toe te kennen aan een macro: -%D -%D \starttypen -%D \assignalfadimension -%D {<waarde>|klein|middel|groot|geen} -%D {\macro} -%D {waarde klein} -%D {waarde middel} -%D {waarde groot} -%D \stoptypen - -\def\assigndimension#1#2#3#4#5% - {\processaction - [#1] - [ \v!klein=>#2=#3, - \v!middel=>#2=#4, - \v!groot=>#2=#5, - \v!geen=>#2=\!!zeropoint, - -\v!klein=>#2=-#3, - -\v!middel=>#2=-#4, - -\v!groot=>#2=-#5, - \s!unknown=>#2=#1]} - -\def\assignalfadimension#1#2#3#4#5% - {\processaction - [#1] - [ \v!klein=>\edef#2{#3}, - \v!middel=>\edef#2{#4}, - \v!groot=>\edef#2{#5}, - \v!geen=>\edef#2{0}, - \s!unknown=>\edef#2{#1}]} - -%D De onderstaande implementatie is veel sneller, maar -%D tegelijkertijd ook veel lelijker. Omdat we deze macro -%D relatief weinig aanroepen laten we deze optimalisatie maar -%D achterwege. Bovendien kunnen oplossingen als deze de -%D hash||table aardig uitputten (\type{\doifdefined}). -%D -%D \starttypen -%D \edef\@@dimension{@@dim} -%D \edef\@@negdimension{\@@dimension-} -%D -%D \def\assigndimension#1#2#3#4#5% -%D {\setvalue{\@@dimension\v!klein}{#3}% -%D \setvalue{\@@dimension\v!middel}{#4}% -%D \setvalue{\@@dimension\v!groot}{#5}% -%D \setvalue{\@@negdimension\v!klein}{-#3}% -%D \setvalue{\@@negdimension\v!middel}{-#4}% -%D \setvalue{\@@negdimension\v!groot}{-#5}% -%D \setvalue{\@@negdimension\v!geen}{\!!zeropoint}% -%D \doifdefinedelse{\@@dimension#1} -%D {#2=\getvalue{\@@dimension#1}} -%D {#2=#1}} -%D \stoptypen - -%D \macros -%D {assignvalue} -%D {} -%D -%D Een variant hierop is het commando: -%D -%D \starttypen -%D \assignvalue -%D {<waarde>|klein|middel|groot} -%D {\macro} -%D {waarde klein } -%D {waarde middel} -%D {waarde groot} -%D \stoptypen -%D -%D Hierbij krijgt \type{\macro} een waarde afhankelijk van -%D het meegegeven trefwoord: -%D -%D \startsmaller -%D \startregels -%D \type{klein }\qquad waarde klein -%D \type{middel}\qquad waarde middel -%D \type{groot }\qquad waarde groot -%D \type{waarde}\qquad waarde -%D \stopregels -%D \stopsmaller -%D -%D Hier doet \type{geen} dus niet mee. - -\def\assignvalue#1#2#3#4#5% - {\processaction - [#1] - [ \v!klein=>\def#2{#3}, - \v!middel=>\def#2{#4}, - \v!groot=>\def#2{#5}, - \s!unknown=>\def#2{#1}]} - -%D \macros -%D {assignwidth} -%D {} -%D -%D Een breedte van een opgegeven tekst kan worden berekend en -%D toegekend aan een \DIMENSION\ met: -%D -%D \starttypen -%D \assignwidth -%D {\dimensie} -%D {<waarde>|passend|ruim} -%D {tekst} -%D \stoptypen -%D -%D Dit commando sluit, evenals de bovenstaande -%D \type{\assign}||commando's, aan op de wijze waarop -%D in de andere \CONTEXT||modules toekenningen -%D plaatsvinden. Bij \type{ruim} wordt de gemeten breedte -%D met 1~em vermeerderd. - -\def\assignwidth#1#2#3#4% - {\doifelse{#2}{} - {\setbox0=\hbox{#3}% - #1=\wd0} - {\doifinsetelse{#2}{\v!passend,\v!ruim} - {\setbox0=\hbox{#3}% - #1=\wd0 - \doif{#2}{\v!ruim} - {\advance#1 by #4}}% - {#1=#2}}}% - -\protect - -\endinput +%D \module
+%D [ file=core-gen,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=General,
+%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 Core Macros / General}
+
+\unprotect
+
+%D \macros
+%D {assigndimension,assignalfadimension}
+%D {}
+%D
+%D Hieronder worden enkele commando's gedefinieerd rond
+%D toekenningen. Allereerst een commando om waarden aan
+%D een \DIMENSION\ toe te kennen:
+%D
+%D \starttypen
+%D \assigndimension
+%D {<waarde>|klein|middel|groot|-klein|-middel|-groot|geen}
+%D {\dimensie}
+%D {waarde klein}
+%D {waarde middel}
+%D {waarde groot}
+%D \stoptypen
+%D
+%D Hierbij krijgt de \DIMENSION\ \type{\dimensie} een waarde
+%D afhankelijk van het meegegeven trefwoord.
+%D
+%D \startsmaller
+%D \startregels
+%D \type{(-)klein }\qquad (--) waarde klein
+%D \type{(-)middel}\qquad (--) waarde middel
+%D \type{(-)groot }\qquad (--) waarde groot
+%D \type{geen }\qquad 0pt
+%D \type{waarde }\qquad waarde
+%D \stopregels
+%D \stopsmaller
+%D
+%D Een trefwoord mag worden voorafgegaan door een \type{-}.
+%D Deze macro toont een voorbeeld van het gebruik van
+%D \type{\processaction} en constanten.
+%D
+%D Analoog aan het bovenstaande commando kennen we een
+%D commando om waarden toe te kennen aan een macro:
+%D
+%D \starttypen
+%D \assignalfadimension
+%D {<waarde>|klein|middel|groot|geen}
+%D {\macro}
+%D {waarde klein}
+%D {waarde middel}
+%D {waarde groot}
+%D \stoptypen
+
+\def\assigndimension#1#2#3#4#5%
+ {\processaction
+ [#1]
+ [ \v!klein=>#2=#3,
+ \v!middel=>#2=#4,
+ \v!groot=>#2=#5,
+ \v!geen=>#2=\!!zeropoint,
+ -\v!klein=>#2=-#3,
+ -\v!middel=>#2=-#4,
+ -\v!groot=>#2=-#5,
+ \s!unknown=>#2=#1]}
+
+\def\assignalfadimension#1#2#3#4#5%
+ {\processaction
+ [#1]
+ [ \v!klein=>\edef#2{#3},
+ \v!middel=>\edef#2{#4},
+ \v!groot=>\edef#2{#5},
+ \v!geen=>\edef#2{0},
+ \s!unknown=>\edef#2{#1}]}
+
+%D De onderstaande implementatie is veel sneller, maar
+%D tegelijkertijd ook veel lelijker. Omdat we deze macro
+%D relatief weinig aanroepen laten we deze optimalisatie maar
+%D achterwege. Bovendien kunnen oplossingen als deze de
+%D hash||table aardig uitputten (\type{\doifdefined}).
+%D
+%D \starttypen
+%D \edef\@@dimension{@@dim}
+%D \edef\@@negdimension{\@@dimension-}
+%D
+%D \def\assigndimension#1#2#3#4#5%
+%D {\setvalue{\@@dimension\v!klein}{#3}%
+%D \setvalue{\@@dimension\v!middel}{#4}%
+%D \setvalue{\@@dimension\v!groot}{#5}%
+%D \setvalue{\@@negdimension\v!klein}{-#3}%
+%D \setvalue{\@@negdimension\v!middel}{-#4}%
+%D \setvalue{\@@negdimension\v!groot}{-#5}%
+%D \setvalue{\@@negdimension\v!geen}{\!!zeropoint}%
+%D \doifdefinedelse{\@@dimension#1}
+%D {#2=\getvalue{\@@dimension#1}}
+%D {#2=#1}}
+%D \stoptypen
+
+%D \macros
+%D {assignvalue}
+%D {}
+%D
+%D Een variant hierop is het commando:
+%D
+%D \starttypen
+%D \assignvalue
+%D {<waarde>|klein|middel|groot}
+%D {\macro}
+%D {waarde klein }
+%D {waarde middel}
+%D {waarde groot}
+%D \stoptypen
+%D
+%D Hierbij krijgt \type{\macro} een waarde afhankelijk van
+%D het meegegeven trefwoord:
+%D
+%D \startsmaller
+%D \startregels
+%D \type{klein }\qquad waarde klein
+%D \type{middel}\qquad waarde middel
+%D \type{groot }\qquad waarde groot
+%D \type{waarde}\qquad waarde
+%D \stopregels
+%D \stopsmaller
+%D
+%D Hier doet \type{geen} dus niet mee.
+
+\def\assignvalue#1#2#3#4#5%
+ {\processaction
+ [#1]
+ [ \v!klein=>\def#2{#3},
+ \v!middel=>\def#2{#4},
+ \v!groot=>\def#2{#5},
+ \s!unknown=>\def#2{#1}]}
+
+%D \macros
+%D {assignwidth}
+%D {}
+%D
+%D Een breedte van een opgegeven tekst kan worden berekend en
+%D toegekend aan een \DIMENSION\ met:
+%D
+%D \starttypen
+%D \assignwidth
+%D {\dimensie}
+%D {<waarde>|passend|ruim}
+%D {tekst}
+%D \stoptypen
+%D
+%D Dit commando sluit, evenals de bovenstaande
+%D \type{\assign}||commando's, aan op de wijze waarop
+%D in de andere \CONTEXT||modules toekenningen
+%D plaatsvinden. Bij \type{ruim} wordt de gemeten breedte
+%D met 1~em vermeerderd.
+
+\def\assignwidth#1#2#3#4%
+ {\doifelse{#2}{}
+ {\setbox0=\hbox{#3}%
+ #1=\wd0}
+ {\doifinsetelse{#2}{\v!passend,\v!ruim}
+ {\setbox0=\hbox{#3}%
+ #1=\wd0
+ \doif{#2}{\v!ruim}
+ {\advance#1 by #4}}%
+ {#1=#2}}}%
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-grd.tex b/tex/context/base/core-grd.tex index 4a91fd35a..548a1408e 100644 --- a/tex/context/base/core-grd.tex +++ b/tex/context/base/core-grd.tex @@ -1,445 +1,565 @@ -%D \module -%D [ file=core-grd, -%D version=1998.03.10, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Grid Snapping (Experimental), -%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 Core Macros / Grid Snapping} - -\unprotect - -%D Moved from supp-box: - -%D \macros -%D {startbaselinecorrection,baselinecorrection, -%D showbaselinecorrection,offbaselinecorrection} -%D -%D Spacing around ruled boxes can get pretty messed up. The -%D next macro tries as good as possible to fix this. -%D -%D \startbuffer[1] -%D \startbaselinecorrection -%D \ruledhbox{Rule Brittanica} -%D \stopbaselinecorrection -%D \stopbuffer -%D -%D \typebuffer[1] -%D -%D The macros put some white space around the box: -%D -%D \haalbuffer[1] -%D -%D A simple alternative is \type {\baselinecorrection}, which -%D only looks at the previous line. -%D -%D \startbuffer[2] -%D \baselinecorrection -%D \ruledhbox{Rule Brittanica} -%D \baselinecorrection -%D \stopbuffer -%D -%D \typebuffer[2] -%D -%D This time the last preceding line gets a correction,% -%D dependant on the depth. -%D -%D \haalbuffer[2] -%D -%D One can make the correction visible by saying \type -%D {\showbaselinecorrection}. Part of the correction is -%D calculated from the dimensions of a~(. One can disble the -%D correction by calling \type {\offbaselinecorrection}. -%D -%D When visulaize the first example looks like: -%D -%D {\showbaselinecorrection\haalbuffer[1]} -%D -%D and the second one comes out as: -%D -%D {\showbaselinecorrection\haalbuffer[2]} - -\def\setbaselinecorrections% - {\setbox0=\hbox{\setstrut\strut}% - \setbox2=\hbox{(}% - \dimen0=\ht0\advance\dimen0 by -\ht2 - \ifdim\dimen0<\!!zeropoint\dimen0=\!!zeropoint\fi - \dimen2=\dp0\advance\dimen2 by -\dp2 - \ifdim\dimen2<\!!zeropoint\dimen2=\!!zeropoint\fi - \edef\thetopbaselinecorrection{\the\dimen0}% - \edef\thebotbaselinecorrection{\the\dimen2}} - -\def\dotopbaselinecorrection% - {\kern\thetopbaselinecorrection} - -\def\dobotbaselinecorrection% - {\kern\thebotbaselinecorrection} - -\def\showbaselinecorrection% - {\def\dobaselinecorrection% visualization is not watertight! - {\bgroup - \kern-\prevdepth - \setbox0=\null - \wd0=\hsize\dp0=\dp\strutbox - \nointerlineskip - \ruledvbox{\box0}% - \egroup - \prevdepth=\dp\strutbox}% - \def\dotopbaselinecorrection% - {\hrule\!!height\thetopbaselinecorrection}% - \def\dobotbaselinecorrection% - {\hrule\!!height\thebotbaselinecorrection}} - -\def\dobaselinecorrection% - {\kern-\prevdepth - \kern\dp\strutbox - \prevdepth=\dp\strutbox} - -\def\baselinecorrection% - {\endgraf - \ifvmode - \ifdim\prevdepth<\maxdimen - \ifdim\prevdepth<\!!zeropoint \else - \ifdim\prevdepth<\dp\strutbox - \dobaselinecorrection - \fi - \fi - \fi - \fi} - -\def\startbaselinecorrection% - {\baselinecorrection - \ifvmode - \bgroup - \setbox\scratchbox=\vbox\bgroup - \ignorespaces - \let\stopbaselinecorrection=\dostopbaselinecorrection - \else - \let\stopbaselinecorrection=\relax - \fi} - -%D We do a bit more checking than needed. The pageborder check -%D is not needed, but I want to look the visualization as good -%D as possible too. - -\def\dostopbaselinecorrection% I have to check columns yet. - {\endgraf - \egroup - \topbaselinecorrection - \box\scratchbox - \botbaselinecorrection - \egroup} - -\let\stopbaselinecorrection=\relax - -\def\offbaselinecorrection% Can be used inside correction. - {\def\startbaselinecorrection% - {\bgroup - \let\stopbaselinecorrection=\egroup}} - -%D \macros -%D {topbaselinecorrection,botbaselinecorrection} -%D -%D The actual top and bottom corrections are implemented as: - -\def\topbaselinecorrection% - {\ifvmode - \bgroup - \setbaselinecorrections - \ifdim\pagegoal<\maxdimen - \ifdim\pagetotal<\pagegoal - \dimen2=\ht\scratchbox - \advance\dimen2 by \dp\scratchbox - \advance\dimen2 by \parskip - \advance\dimen2 by \thetopbaselinecorrection - \advance\dimen2 by \thebotbaselinecorrection - \dimen0=\pagetotal - \advance\dimen0 by \dimen2 - \ifdim\dimen0<\pagegoal - \witruimte - \nointerlineskip - \dotopbaselinecorrection - \else - \ifbinnenkolommen % should be supp-status - \vskip\dimen2 % this could definitely - \penalty\outputpenalty % be improved - \else - % % should be supp-control - % \vfill\eject % old - % - \nobreak % needed for headings - \vskip\parskip % cross your fingers - \vskip\dimen2 % anyhow - \penalty\outputpenalty - \vskip-\dimen2 - \fi - \fi - \else % probably a preceding - \witruimte % one-liner - \nointerlineskip - \dotopbaselinecorrection - \fi - \fi - \egroup - \fi} - -\def\botbaselinecorrection% - {\ifvmode - \bgroup - \setbaselinecorrections - \dobotbaselinecorrection - \prevdepth\dp\strutbox - \egroup - \fi} - -%D An old one, still to be translated: -%D -%D \macros -%D {getnoflines} -%D {} -%D -%D Het commando \type{\getnoflines} converteert een hoogte -%D (dimensie) in een aantal regels en kent dit toe aan -%D \type{\noflines}. -%D -%D \starttypen -%D \getnoflines{dimensie} -%D \stoptypen -%D -%D Er wordt gedeeld door \type{\openlineheight} en een hoogte -%D van~0pt komt overeen met 0~regels. - -\newcount\noflines -\newdimen\noflinesheight - -\def\getnoflines#1% - {\noflinesheight=#1\relax - \ifdim\noflinesheight=\!!zeropoint\relax - \noflines=0 - \else - \divide\noflinesheight by \openlineheight - \noflines=\noflinesheight - \ifdim\noflines\openlineheight=#1\relax \else - \advance\noflines by 1 - \fi - \fi} - -%D Still very experimental and therefore undocumented. - -\newif\ifgridsnapping % UNDER DEVELOPMENT, USE WITH CARE - -\def\positiveextrasnap {\gdef\extrasnapsign{+}} -\def\negativeextrasnap {\gdef\extrasnapsign{-}} - -\def\extrasnapreset {\global\chardef\@@extrasnap=0 - \positiveextrasnap} -\def\extrasnapbefore {\global\chardef\@@extrasnap=1 } -\def\extrasnaparound {\global\chardef\@@extrasnap=2 } -\def\extrasnapafter {\global\chardef\@@extrasnap=3 } - -\def\enablepresnapcorrection {\global\chardef\@@presnap=0 } -\def\disablepresnapcorrection {\global\chardef\@@presnap=1 } - -\extrasnapreset \enablepresnapcorrection - -\newif\iftracegridsnapping - -\def\snaptogrid#1% #1 == \hbox or \vbox - {\ifgridsnapping\expandafter\dosnaptogrid\expandafter#1\fi} - -\def\tracesnapping% - {\iftracegridsnapping - \llap - {\infofont - \doglobal\increment\currentsnap - \color[red]{\vl\presnapskip - \vl\presnap - \vl\postsnap - \vl\ifcase\@@extrasnap - 00\or - \extrasnapsign0\or - \extrasnapsign\extrasnapsign\or - 0\extrasnapsign\fi - \vl\currentsnap\vl}}% - \fi} - -\def\dosnaptogrid% - {\dowithnextbox - {\bgroup - \forgetall - \par - \ifvbox\nextbox - \setbox\nextbox=\hbox{\box\nextbox}% don't ask - \fi - \scratchskip=\lastskip - \edef\presnapskip{\the\lastskip}% - \vbox{\strut}\nobreak\vskip-\openlineheight - \ifdim\ht\nextbox>\ht\strutbox - \scratchdimen=\ht\nextbox - \ifcase\@@presnap - \ifdim\scratchskip>\!!zeropoint\relax - \scratchcounter=\scratchskip - \advance\scratchcounter by -\openlineheight - \ifnum\scratchcounter<0 - \scratchcounter=-\scratchcounter - \fi - \ifnum\scratchcounter<10 % \lastkip is about \openlineheight - \advance\scratchdimen by -\openstrutdepth - \edef\presnapskip{*\presnapskip}% - \else\ifdim\scratchskip>\openlineheight - %<\openlineheight \else - \advance\scratchdimen by -\openstrutdepth - \edef\presnapskip{*\presnapskip}% - \fi\fi - \fi - \fi - \getnoflines\scratchdimen - \advance\noflines by -1 - \ifnum\noflines>0 - \scratchdimen=\noflines\lineheight - \else - \scratchdimen=\!!zeropoint - \fi - \else - \scratchdimen=\!!zeropoint - \fi - \ifnum\@@extrasnap=1 \advance\scratchdimen by \extrasnapsign\lineheight \fi - \ifnum\@@extrasnap=2 \advance\scratchdimen by \extrasnapsign.5\lineheight \fi - \edef\presnap{\the\scratchdimen}% - \ifdim\scratchdimen=\!!zeropoint\else\vskip\scratchdimen\fi - \ifdim\dp\nextbox>\dp\strutbox - \getnoflines{\dp\nextbox}% - \advance\noflines by -1 - \ifnum\noflines>0 - \scratchdimen=\noflines\lineheight - \else - \scratchdimen=\!!zeropoint - \fi - \else - \scratchdimen=\!!zeropoint - \fi - \ifnum\@@extrasnap=2 \advance\scratchdimen by \extrasnapsign.5\lineheight \fi - \ifnum\@@extrasnap=3 \advance\scratchdimen by \extrasnapsign\lineheight \fi - \edef\postsnap{\the\scratchdimen}% - \ht\nextbox=\ht\strutbox - \dp\nextbox=\dp\strutbox - \hbox{\tracesnapping\box\nextbox}% - \ifdim\scratchdimen=\!!zeropoint\else\vskip\scratchdimen\fi - \extrasnapreset - \enablepresnapcorrection - \egroup}} - -\def\snaptomathgrid% - {\ifgridsnapping - \dowithnextbox - {\blanko[\v!regel] - \snaptogrid\vbox{\box\nextbox} - \blanko[\v!regel]} - \vbox\bgroup - \let\setdisplayskips=\relax - \abovedisplayskip=\!!zeropoint - \abovedisplayshortskip=\!!zeropoint - \belowdisplayskip=\!!zeropoint - \belowdisplayshortskip=\!!zeropoint - \@EA\let\@EA\next - \fi} - -\def\topsnaptogrid% - {\ifgridsnapping - \dowithnextbox - {\scratchdimen=\ht\nextbox - \advance\scratchdimen by -\ht\strutbox - \advance\scratchdimen by \topskip - \ht\nextbox=\scratchdimen - \dp\nextbox=\!!zeropoint - \box\nextbox - \kern\lineheight - \kern-\topskip - \nointerlineskip} - \hbox - \fi} - -\def\centertogrid% - {\ifgridsnapping - \dowithnextbox - {\bgroup - \par - \scratchdimen=\ht\nextbox - \advance\scratchdimen by \dp\nextbox - \getnoflines\scratchdimen - \setbox\nextbox=\vbox to \noflines\lineheight - {\forgetall - \vskip\!!zeropoint plus \ht\nextbox - \copy\nextbox - \kern.5\dp\strutbox % VOORLOPIGE WAARDE - \vskip\!!zeropoint plus \dp\nextbox} - \noindent\snaptogrid\vbox{\box\nextbox}% - \egroup} - \hbox - \fi} - -\ifx\startbaselinecorrection\undefined \wait \fi % change order - -\let\normalstartbaselinecorrection=\startbaselinecorrection - -\def\startbaselinecorrection% - {\ifgridsnapping - \centertogrid\bgroup - \let\stopbaselinecorrection=\egroup - \else - \normalstartbaselinecorrection - \fi} - -\def\setgridbox#1#2#3% - {\setbox#1=\ruledvbox to #3 - {\forgetall - \offinterlineskip - \hsize=#2 - \getnoflines{#3}% - \vskip\topskip - \vskip-\ht\strutbox - \scratchdimen=#2\advance\scratchdimen by \lineheight - \dorecurse - {\noflines} - {\strut - \hskip-.5\lineheight - \rlap - {\hskip\scratchdimen\hskip2pt\infofont - \hbox to 1em{\hss\recurselevel}}% - \vrule - \!!height .5\testrulewidth - \!!depth .5\testrulewidth - \!!width \scratchdimen - \par} - \vfill}} - -\def\doverplaatsopgrid[#1]% - {\processaction - [#1] - [ \v!boven=>\positiveextrasnap\extrasnapbefore, - \v!onder=>\positiveextrasnap\extrasnapafter, - \v!beide=>\positiveextrasnap\extrasnaparound, - -\v!boven=>\negativeextrasnap\extrasnapbefore, - -\v!onder=>\negativeextrasnap\extrasnapafter, - -\v!beide=>\negativeextrasnap\extrasnaparound, - \s!default=>\positiveextrasnap\extrasnaparound, - \s!unknown=>\positiveextrasnap\extrasnapreset]} - -\def\verplaatsopgrid% - {\dosingleempty\doverplaatsopgrid} - -\def\doplaatsopgrid[#1]% - {\doverplaatsopgrid[#1]\snaptogrid\vbox} - -\def\plaatsopgrid% - {\dosingleempty\doplaatsopgrid} - -\protect - -\endinput +%D \module
+%D [ file=core-grd,
+%D version=1998.03.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Grid Snapping (Experimental),
+%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 Core Macros / Grid Snapping}
+
+\unprotect
+
+%D Moved from supp-box:
+
+%D \macros
+%D {startbaselinecorrection,baselinecorrection,
+%D showbaselinecorrection,offbaselinecorrection}
+%D
+%D Spacing around ruled boxes can get pretty messed up. The
+%D next macro tries as good as possible to fix this.
+%D
+%D \startbuffer[1]
+%D \startbaselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \stopbaselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[1]
+%D
+%D The macros put some white space around the box:
+%D
+%D \haalbuffer[1]
+%D
+%D A simple alternative is \type {\baselinecorrection}, which
+%D only looks at the previous line.
+%D
+%D \startbuffer[2]
+%D \baselinecorrection
+%D \ruledhbox{Rule Brittanica}
+%D \baselinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer[2]
+%D
+%D This time the last preceding line gets a correction,%
+%D dependant on the depth.
+%D
+%D \haalbuffer[2]
+%D
+%D One can make the correction visible by saying \type
+%D {\showbaselinecorrection}. Part of the correction is
+%D calculated from the dimensions of a~(. One can disble the
+%D correction by calling \type {\offbaselinecorrection}.
+%D
+%D When visulaize the first example looks like:
+%D
+%D {\showbaselinecorrection\haalbuffer[1]}
+%D
+%D and the second one comes out as:
+%D
+%D {\showbaselinecorrection\haalbuffer[2]}
+
+\def\setbaselinecorrections%
+ {\setbox0=\hbox{\setstrut\strut}%
+ \setbox2=\hbox{(}%
+ \dimen0=\ht0\advance\dimen0 by -\ht2
+ \ifdim\dimen0<\!!zeropoint\dimen0=\!!zeropoint\fi
+ \dimen2=\dp0\advance\dimen2 by -\dp2
+ \ifdim\dimen2<\!!zeropoint\dimen2=\!!zeropoint\fi
+ \edef\thetopbaselinecorrection{\the\dimen0}%
+ \edef\thebotbaselinecorrection{\the\dimen2}}
+
+\def\dotopbaselinecorrection%
+ {\kern\thetopbaselinecorrection}
+
+\def\dobotbaselinecorrection%
+ {\kern\thebotbaselinecorrection}
+
+\def\showbaselinecorrection%
+ {\def\dobaselinecorrection% visualization is not watertight!
+ {\bgroup
+ \kern-\prevdepth
+ \setbox0=\null
+ \wd0=\hsize\dp0=\dp\strutbox
+ \nointerlineskip
+ \ruledvbox{\box0}%
+ \egroup
+ \prevdepth=\dp\strutbox}%
+ \def\dotopbaselinecorrection%
+ {\hrule\!!height\thetopbaselinecorrection}%
+ \def\dobotbaselinecorrection%
+ {\hrule\!!height\thebotbaselinecorrection}}
+
+\def\dobaselinecorrection%
+ {\kern-\prevdepth
+ \kern\dp\strutbox
+ \prevdepth=\dp\strutbox}
+
+\def\baselinecorrection%
+ {\endgraf
+ \ifvmode
+ \ifdim\prevdepth<\maxdimen
+ \ifdim\prevdepth<\!!zeropoint \else
+ \ifdim\prevdepth<\dp\strutbox
+ \dobaselinecorrection
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\def\startbaselinecorrection%
+ {\baselinecorrection
+ \ifvmode
+ \bgroup
+ \setbox\scratchbox=\vbox\bgroup
+ \ignorespaces
+ \let\stopbaselinecorrection=\dostopbaselinecorrection
+ \else
+ \let\stopbaselinecorrection=\relax
+ \fi}
+
+%D We do a bit more checking than needed. The pageborder check
+%D is not needed, but I want to look the visualization as good
+%D as possible too.
+
+\def\dostopbaselinecorrection% I have to check columns yet.
+ {\endgraf
+ \egroup
+ \topbaselinecorrection
+ \box\scratchbox
+ \botbaselinecorrection
+ \egroup}
+
+\let\stopbaselinecorrection=\relax
+
+\def\offbaselinecorrection% Can be used inside correction.
+ {\def\startbaselinecorrection%
+ {\bgroup
+ \let\stopbaselinecorrection=\egroup}}
+
+%D \macros
+%D {topbaselinecorrection,botbaselinecorrection}
+%D
+%D The actual top and bottom corrections are implemented as:
+
+\def\topbaselinecorrection%
+ {\ifvmode
+ \bgroup
+ \setbaselinecorrections
+ \ifdim\pagegoal<\maxdimen
+ \ifdim\pagetotal<\pagegoal
+ \dimen2=\ht\scratchbox
+ \advance\dimen2 by \dp\scratchbox
+ \advance\dimen2 by \parskip
+ \advance\dimen2 by \thetopbaselinecorrection
+ \advance\dimen2 by \thebotbaselinecorrection
+ \dimen0=\pagetotal
+ \advance\dimen0 by \dimen2
+ \ifdim\dimen0<\pagegoal
+ \witruimte
+ \nointerlineskip
+ \dotopbaselinecorrection
+ \else
+ \ifbinnenkolommen % should be supp-status
+ \vskip\dimen2 % this could definitely
+ \penalty\outputpenalty % be improved
+ \else
+ % % should be supp-control
+ % \vfill\eject % old
+ %
+ \nobreak % needed for headings
+ \vskip\parskip % cross your fingers
+ \vskip\dimen2 % anyhow
+ \penalty\outputpenalty
+ \vskip-\dimen2
+ \fi
+ \fi
+ \else % probably a preceding
+ \witruimte % one-liner
+ \nointerlineskip
+ \dotopbaselinecorrection
+ \fi
+ \fi
+ \egroup
+ \fi}
+
+\def\botbaselinecorrection%
+ {\ifvmode
+ \bgroup
+ \setbaselinecorrections
+ \dobotbaselinecorrection
+ \prevdepth\dp\strutbox
+ \egroup
+ \fi}
+
+%D An old one, still to be translated:
+%D
+%D \macros
+%D {getnoflines}
+%D {}
+%D
+%D Het commando \type{\getnoflines} converteert een hoogte
+%D (dimensie) in een aantal regels en kent dit toe aan
+%D \type{\noflines}.
+%D
+%D \starttypen
+%D \getnoflines{dimensie}
+%D \stoptypen
+%D
+%D Er wordt gedeeld door \type{\openlineheight} en een hoogte
+%D van~0pt komt overeen met 0~regels.
+
+\newcount\noflines
+\newdimen\noflinesheight
+
+\def\getnoflines#1%
+ {\noflinesheight=#1\relax
+ \ifdim\noflinesheight=\!!zeropoint\relax
+ \noflines=0
+ \else
+ \divide\noflinesheight by \openlineheight
+ \noflines=\noflinesheight
+ \ifdim\noflines\openlineheight=#1\relax \else
+ \advance\noflines by 1
+ \fi
+ \fi}
+
+%D Still very experimental and therefore undocumented.
+
+\newif\ifgridsnapping % UNDER DEVELOPMENT, USE WITH CARE
+
+\def\positiveextrasnap {\gdef\extrasnapsign{+}}
+\def\negativeextrasnap {\gdef\extrasnapsign{-}}
+
+\def\extrasnapreset {\global\chardef\@@extrasnap=0
+ \positiveextrasnap}
+\def\extrasnapbefore {\global\chardef\@@extrasnap=1 }
+\def\extrasnaparound {\global\chardef\@@extrasnap=2 }
+\def\extrasnapafter {\global\chardef\@@extrasnap=3 }
+
+\def\enablepresnapcorrection {\global\chardef\@@presnap=0 }
+\def\disablepresnapcorrection {\global\chardef\@@presnap=1 }
+
+\extrasnapreset \enablepresnapcorrection
+
+\newif\iftracegridsnapping
+
+\def\snaptogrid#1% #1 == \hbox or \vbox
+ {\ifgridsnapping\expandafter\dosnaptogrid\expandafter#1\fi}
+
+\def\tracesnapping%
+ {\iftracegridsnapping
+ \llap
+ {\infofont
+ \doglobal\increment\currentsnap
+ \color[red]{\vl\presnapskip
+ \vl\presnap
+ \vl\postsnap
+ \vl\ifcase\@@extrasnap
+ 00\or
+ \extrasnapsign0\or
+ \extrasnapsign\extrasnapsign\or
+ 0\extrasnapsign\fi
+ \vl\currentsnap\vl}}%
+ \fi}
+
+\def\dosnaptogrid%
+ {\dowithnextbox
+ {\bgroup
+ \forgetall
+ \par
+ \ifvbox\nextbox
+ \setbox\nextbox=\hbox{\box\nextbox}% don't ask
+ \fi
+ \scratchskip=\lastskip
+ \edef\presnapskip{\the\lastskip}%
+ \vbox{\strut}\nobreak\vskip-\openlineheight
+ \ifdim\ht\nextbox>\ht\strutbox
+ \scratchdimen=\ht\nextbox
+ \ifcase\@@presnap
+ \ifdim\scratchskip>\!!zeropoint\relax
+ \scratchcounter=\scratchskip
+ \advance\scratchcounter by -\openlineheight
+ \ifnum\scratchcounter<0
+ \scratchcounter=-\scratchcounter
+ \fi
+ \ifnum\scratchcounter<10 % \lastkip is about \openlineheight
+ \advance\scratchdimen by -\openstrutdepth
+ \edef\presnapskip{*\presnapskip}%
+ \else\ifdim\scratchskip>\openlineheight
+ %<\openlineheight \else
+ \advance\scratchdimen by -\openstrutdepth
+ \edef\presnapskip{*\presnapskip}%
+ \fi\fi
+ \fi
+ \fi
+ \getnoflines\scratchdimen
+ \advance\noflines by -1
+ \ifnum\noflines>0
+ \scratchdimen=\noflines\lineheight
+ \else
+ \scratchdimen=\!!zeropoint
+ \fi
+ \else
+ \scratchdimen=\!!zeropoint
+ \fi
+ \ifnum\@@extrasnap=1 \advance\scratchdimen by \extrasnapsign\lineheight \fi
+ \ifnum\@@extrasnap=2 \advance\scratchdimen by \extrasnapsign.5\lineheight \fi
+ \edef\presnap{\the\scratchdimen}%
+ \ifdim\scratchdimen=\!!zeropoint\else\vskip\scratchdimen\fi
+ \ifdim\dp\nextbox>\dp\strutbox
+ \getnoflines{\dp\nextbox}%
+ \advance\noflines by -1
+ \ifnum\noflines>0
+ \scratchdimen=\noflines\lineheight
+ \else
+ \scratchdimen=\!!zeropoint
+ \fi
+ \else
+ \scratchdimen=\!!zeropoint
+ \fi
+ \ifnum\@@extrasnap=2 \advance\scratchdimen by \extrasnapsign.5\lineheight \fi
+ \ifnum\@@extrasnap=3 \advance\scratchdimen by \extrasnapsign\lineheight \fi
+ \edef\postsnap{\the\scratchdimen}%
+ \ht\nextbox=\ht\strutbox
+ \dp\nextbox=\dp\strutbox
+ \hbox{\tracesnapping\box\nextbox}%
+ \ifdim\scratchdimen=\!!zeropoint\else\vskip\scratchdimen\fi
+ \extrasnapreset
+ \enablepresnapcorrection
+ \egroup}}
+
+\def\snaptomathgrid%
+ {\ifgridsnapping
+ \dowithnextbox
+ {\blanko[\v!regel]
+ \snaptogrid\vbox{\box\nextbox}
+ \blanko[\v!regel]}
+ \vbox\bgroup
+ \let\setdisplayskips=\relax
+ \abovedisplayskip=\!!zeropoint
+ \abovedisplayshortskip=\!!zeropoint
+ \belowdisplayskip=\!!zeropoint
+ \belowdisplayshortskip=\!!zeropoint
+ \@EA\let\@EA\next
+ \fi}
+
+\def\topsnaptogrid%
+ {\ifgridsnapping
+ \dowithnextbox
+ {\scratchdimen=\ht\nextbox
+ \advance\scratchdimen by -\ht\strutbox
+ \advance\scratchdimen by \topskip
+ \ht\nextbox=\scratchdimen
+ \dp\nextbox=\!!zeropoint
+ \box\nextbox
+ \kern\lineheight
+ \kern-\topskip
+ \nointerlineskip}
+ \hbox
+ \fi}
+
+\def\centertogrid%
+ {\ifgridsnapping
+ \dowithnextbox
+ {\bgroup
+ \par
+ \scratchdimen=\ht\nextbox
+ \advance\scratchdimen by \dp\nextbox
+ \getnoflines\scratchdimen
+ \setbox\nextbox=\vbox to \noflines\lineheight
+ {\forgetall
+ \vskip\!!zeropoint plus \ht\nextbox
+ \copy\nextbox
+ \kern.5\dp\strutbox % VOORLOPIGE WAARDE
+ \vskip\!!zeropoint plus \dp\nextbox}
+ \noindent\snaptogrid\vbox{\box\nextbox}%
+ \egroup}
+ \hbox
+ \fi}
+
+\ifx\startbaselinecorrection\undefined \wait \fi % change order
+
+\let\normalstartbaselinecorrection=\startbaselinecorrection
+
+\def\startbaselinecorrection%
+ {\ifgridsnapping
+ \centertogrid\bgroup
+ \let\stopbaselinecorrection=\egroup
+ \else
+ \normalstartbaselinecorrection
+ \fi}
+
+\def\setgridbox#1#2#3%
+ {\setbox#1=\ruledvbox to #3
+ {\forgetall
+ \offinterlineskip
+ \hsize=#2
+ \getnoflines{#3}%
+ \vskip\topskip
+ \vskip-\ht\strutbox
+ \scratchdimen=#2\advance\scratchdimen by \lineheight
+ \dorecurse
+ {\noflines}
+ {\strut
+ \hskip-.5\lineheight
+ \rlap
+ {\hskip\scratchdimen\hskip2pt\infofont
+ \hbox to 1em{\hss\recurselevel}}%
+ \vrule
+ \!!height .5\testrulewidth
+ \!!depth .5\testrulewidth
+ \!!width \scratchdimen
+ \par}
+ \vfill}}
+
+%D Some intervention macros:
+
+\def\doverplaatsopgrid[#1]%
+ {\processaction
+ [#1]
+ [ \v!boven=>\positiveextrasnap\extrasnapbefore,
+ \v!onder=>\positiveextrasnap\extrasnapafter,
+ \v!beide=>\positiveextrasnap\extrasnaparound,
+ -\v!boven=>\negativeextrasnap\extrasnapbefore,
+ -\v!onder=>\negativeextrasnap\extrasnapafter,
+ -\v!beide=>\negativeextrasnap\extrasnaparound,
+ \s!default=>\positiveextrasnap\extrasnaparound,
+ \s!unknown=>\positiveextrasnap\extrasnapreset]}
+
+\def\verplaatsopgrid%
+ {\dosingleempty\doverplaatsopgrid}
+
+\def\doplaatsopgrid[#1]%
+ {\doverplaatsopgrid[#1]\snaptogrid\vbox}
+
+\def\plaatsopgrid%
+ {\dosingleempty\doplaatsopgrid}
+
+%D Snapping is rather robust as long as we use whole lines.
+%D Half lines of white space can however be handled when they
+%D come in pairs. The corrections needed when crossing page
+%D boundaries in the middle of such a pair, are handled by
+%D macros that are (named) sort of fuzzy. This fuzzy mechanism
+%D was written as an extension to the grid typesetting needed
+%D for typesetting (part of) the \MAPS.
+%D
+%D \starttypen
+%D \setuptyping
+%D [before={\blank[halfline]},
+%D after={\blank[halfline]}]
+%D \stoptypen
+
+\newif\iffuzzysnapdone
+\newif\iffuzzysnapping
+\newif\iffuzzysnapped
+
+\newsignal\fuzzysnapbegin
+\newsignal\fuzzysnapend
+
+\chardef\fuzzysnappedleft=0 % =1 when fuzzybegin still open
+
+\def\beginfuzzysnapping%
+ {\ifgridsnapping
+ \global\fuzzysnappingtrue
+ \iffuzzysnapping
+ \kern\fuzzysnapbegin
+ \kern-\fuzzysnapbegin
+ \fi
+ \fi}
+
+\def\endfuzzysnapping%
+ {\ifgridsnapping
+ \global\fuzzysnappingtrue
+ \iffuzzysnapping
+ \kern\fuzzysnapend
+ \kern-\fuzzysnapend
+ \fi
+ \fi}
+
+\def\fuzzyvskip#1%
+ {\iffuzzysnapdone
+ \vskip#1\relax
+ \endfuzzysnapping
+ \global\fuzzysnapdonefalse
+ \else
+ \beginfuzzysnapping
+ \vskip#1\relax
+ \global\fuzzysnapdonetrue
+ \fi}
+
+\def\removelastfuzzyvskip%
+ {\ifgridsnapping
+ \iffuzzysnapping
+ \ifdim\lastskip<\openlineheight
+ \else
+ \removelastskip
+ \fi
+ \else
+ \removelastskip
+ \fi
+ \else
+ \removelastskip
+ \fi}
+
+\def\dodocheckfuzzysnap%
+ {\ifdim\shapekern=\fuzzysnapbegin
+ \ifcase\fuzzysnappedleft
+ \global\chardef\fuzzysnappedleft=1
+ \fi
+ \global\fuzzysnappedfalse
+ \else\ifdim\shapekern=\fuzzysnapend
+ \ifcase\fuzzysnappedleft
+ \global\chardef\fuzzysnappedleft=2
+ \fi
+ \global\fuzzysnappedtrue
+ \fi\fi}
+
+\def\docheckfuzzysnap#1%
+ {\beginofshapebox
+ \unvcopy#1\relax
+ \endofshapebox
+ \global\fuzzysnappedfalse
+ \global\chardef\fuzzysnappedleft=0
+ \doreshapebox{}{}{\dodocheckfuzzysnap}{}}
+
+\def\getfuzzysnapcorrection#1%
+ {\global\let\presnapcorrection =\relax
+ \global\let\postsnapcorrection=\relax
+ \ifgridsnapping\iffuzzysnapping
+ \docheckfuzzysnap{#1}%
+ \iffuzzysnapped
+ \iftracegridsnapping
+ \gdef\presnapcorrection{\color[red]{\hrule\!!height.5\openlineheight}}%
+ \else
+ \gdef\presnapcorrection{\kern.5\openlineheight}%
+ \fi
+ \gdef\postsnapcorrection{\kern.5\openlineheight}%
+ \fi
+ \fi\fi}
+
+\def\fuzzysnappedbox#1#2% \box<n> \unvbox<n>
+ {\getfuzzysnapcorrection{#2}%
+ \presnapcorrection
+ #1#2%
+ \postsnapcorrection}
+
+\def\adaptfuzzypagegoal%
+ {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents
+ \scratchdimen=\pagegoal
+ \advance\scratchdimen by -.5\openlineheight
+ \global\pagegoal=\scratchdimen
+ \global\advance\vsize by -.5\openlineheight
+ \global\chardef\fuzzysnappedleft=0
+ \fi\fi\fi}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-int.tex b/tex/context/base/core-int.tex index 30ca15064..347e22ae3 100644 --- a/tex/context/base/core-int.tex +++ b/tex/context/base/core-int.tex @@ -1,213 +1,214 @@ -%D \module -%D [ file=core-int, -%D version=1995.1.1, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Interaction, -%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. - -%D Still to be done properly. - -\writestatus{loading}{Context Core Macros / Interaction} - -\unprotect - -\definesystemconstant {link} - -\definesystemvariable {lk} - -% \expand vs \expanded - -% linked registers implementeren als een koppeling == mooier - -\presetlocalframed[\??lk] - -\newcounter\numberoflinks - -\def\stelkoppelingenin% - {\dodoubleargument\getparameters[\??lk]} - -\def\definieerkoppeling[#1]% % local loading ! - {\doifundefined{\s!link:#1:\s!list} - {\expanded{\definetwopasslist{\s!link:#1}}% - \expanded{\doloadtwopassdata{\s!link:#1}}% - \getfirsttwopassdata{\s!link:#1}% - \setxvalue{\s!link:#1:f}{\twopassdata}% - \getlasttwopassdata{\s!link:#1}% - \setxvalue{\s!link:#1:l}{\twopassdata}% - \setxvalue{\s!link:#1:s}{\noftwopassitems}% - \gettwopassdata{\s!link:#1}% - \setxvalue{\s!link:#1:c}{\twopassdata}% - \setxvalue{\s!link:#1:n}{\twopassdata}}} - -\def\koppeling[#1]#2% - {\bgroup - \definieerkoppeling[#1]% - \doglobal\increment\numberoflinks - \gettwopassdata{\s!link:#1}% - \edef\numberoflinks {0\getvalue{\s!link:#1:s}}% - \edef\firstlink {0\getvalue{\s!link:#1:f}}% - \edef\lastlink {0\getvalue{\s!link:#1:l}}% - \edef\currentlink {0\getvalue{\s!link:#1:n}}% - \edef\prevlink {0\getvalue{\s!link:#1:c}}% - \iftwopassdatafound - \edef\nextlink {0\twopassdata}% - \setxvalue{\s!link:#1:n}{\nextlink}% - \setxvalue{\s!link:#1:c}{\currentlink}% - \else - \edef\nextlink {0\getvalue{\s!link:#1:l}}% - \fi - \edef\writelink% - {\writeutilitycommand% - {\twopassentry% - {\s!link:#1}% - {\numberoflinks}% - {\noexpand\realfolio}}}% - \writelink - \ifnum\noflinks<2 - \locationfalse - \fi - \iflocation - \hbox - {\stelinteractiein[\c!breedte=\!!zeropoint]% - \def\goto##1##2% - {\doganaarpagina - {}% - {\localframed - [\??lk] - {$\ifgoingtopage - \ifnum##2=\realpageno\relax - ##1% - \else - \color[\locationcolor\@@lkkleur]{##1}% - \fi - \else - ##1% - \fi$}}% - [##2]}% - \goto {\gotobegincharacter} \firstlink\hss - \ifnum\noflinks>2 - \hskip\@@lkafstand - \goto {\gobackwardcharacter}\prevlink\hss - \fi - \hskip\@@lkafstand - #2\relax - \hskip\@@lkafstand - \ifnum\noflinks>2 - \goto {\goforwardcharacter} \nextlink\hss - \hskip\@@lkafstand - \fi - \goto {\gotoendcharacter} \lastlink}% - \else - \hbox{#2}% - \fi - \egroup} - -\def\definieerkoppeling[#1]% % local loading ! - {\doifundefined{\s!link:#1:\s!list} - {\expanded{\definetwopasslist{\s!link:#1}}% - \expanded{\doloadtwopassdata{\s!link:#1}}% - \getfirsttwopassdata{\s!link:#1}% - \let\firstlink=\twopassdata - \getlasttwopassdata{\s!link:#1}% - \let\lastlink=\twopassdata - \let\noflinks=\noftwopassitems - \gettwopassdata{\s!link:#1}% - \let\currentlink=\twopassdata - \let\nextlink=\twopassdata - \setxvalue{\s!link:#1:}% - {\firstlink:\lastlink:\noflinks:\currentlink:\nextlink}}} - -\def\koppeling[#1]#2% - {\bgroup - \definieerkoppeling[#1]% - \doglobal\increment\numberoflinks - \gettwopassdata{\s!link:#1}% - \def\next[##1:##2:##3:##4:##5]% - {\edef\firstlink {0##1}% - \edef\lastlink {0##2}% - \edef\noflinks {0##3}% - \edef\prevlink {0##4}% - \edef\currentlink{0##5}}% - \expanded{\next[\getvalue{\s!link:#1:}]}% - \edef\nextlink% - {0\iftwopassdatafound\twopassdata\else\lastlink\fi}% - \setxvalue{\s!link:#1:}% - {\firstlink:\lastlink:\noflinks:\currentlink:\nextlink}% - \edef\writelink% - {\writeutilitycommand% - {\twopassentry% - {\s!link:#1}% - {\numberoflinks}% - {\noexpand\realfolio}}}% - \writelink - \ifnum\noflinks<2 - \locationfalse - \fi - \iflocation - \hbox - {\stelinteractiein[\c!breedte=\!!zeropoint]% - \def\goto##1##2% - {\doganaarpagina - {}% - {\localframed - [\??lk] - {$\ifgoingtopage - \ifnum##2=\realpageno\relax - ##1% - \else - \color[\locationcolor\@@lkkleur]{##1}% - \fi - \else - ##1% - \fi$}}% - [##2]}% -% \goto {\gotobegincharacter} \firstlink\hss -% \ifnum\noflinks>2 -% \hskip\@@lkafstand -% \goto {\gobackwardcharacter}\prevlink\hss -% \fi -% \hskip\@@lkafstand -% #2\relax -% \hskip\@@lkafstand -% \ifnum\noflinks>2 -% \goto {\goforwardcharacter} \nextlink\hss -% \hskip\@@lkafstand -% \fi -% \goto {\gotoendcharacter} \lastlink}% -% - #2\relax - \hskip\@@lkafstand - \goto {\gotobegincharacter} \firstlink\hss - \ifnum\noflinks>2 - \goto {\gobackwardcharacter}\prevlink\hss - \fi - \ifnum\noflinks>2 - \goto {\goforwardcharacter} \nextlink\hss - \hskip\@@lkafstand - \fi - \goto {\gotoendcharacter} \lastlink}% -% - \else - \hbox{#2}% - \fi - \egroup} - -\stelkoppelingenin - [\c!afstand=.25em, - \c!breedte=\v!passend, - \c!plaats=\v!laag, - \c!kleur=\@@iakleur, - \c!kader=\v!uit, - \c!achtergrond=, - \c!achtergrondraster=\@@rsraster, - \c!achtergrondkleur=] - -\protect - -\endinput +%D \module
+%D [ file=core-int,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Interaction,
+%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.
+
+%D Still to be done properly.
+
+\writestatus{loading}{Context Core Macros / Interaction}
+
+\unprotect
+
+\definesystemconstant {link}
+
+\definesystemvariable {lk}
+
+% \expand vs \expanded
+
+% linked registers implementeren als een koppeling == mooier
+
+\presetlocalframed[\??lk]
+
+\newcounter\numberoflinks
+
+\def\stelkoppelingenin%
+ {\dodoubleargument\getparameters[\??lk]}
+
+\def\definieerkoppeling[#1]% % local loading !
+ {\doifundefined{\s!link:#1:\s!list}
+ {\expanded{\definetwopasslist{\s!link:#1}}%
+ \expanded{\doloadtwopassdata{\s!link:#1}}%
+ \getfirsttwopassdata{\s!link:#1}%
+ \setxvalue{\s!link:#1:f}{\twopassdata}%
+ \getlasttwopassdata{\s!link:#1}%
+ \setxvalue{\s!link:#1:l}{\twopassdata}%
+ \setxvalue{\s!link:#1:s}{\noftwopassitems}%
+ \gettwopassdata{\s!link:#1}%
+ \setxvalue{\s!link:#1:c}{\twopassdata}%
+ \setxvalue{\s!link:#1:n}{\twopassdata}}}
+
+\def\koppeling[#1]#2%
+ {\bgroup
+ \definieerkoppeling[#1]%
+ \doglobal\increment\numberoflinks
+ \gettwopassdata{\s!link:#1}%
+ \edef\numberoflinks {0\getvalue{\s!link:#1:s}}%
+ \edef\firstlink {0\getvalue{\s!link:#1:f}}%
+ \edef\lastlink {0\getvalue{\s!link:#1:l}}%
+ \edef\currentlink {0\getvalue{\s!link:#1:n}}%
+ \edef\prevlink {0\getvalue{\s!link:#1:c}}%
+ \iftwopassdatafound
+ \edef\nextlink {0\twopassdata}%
+ \setxvalue{\s!link:#1:n}{\nextlink}%
+ \setxvalue{\s!link:#1:c}{\currentlink}%
+ \else
+ \edef\nextlink {0\getvalue{\s!link:#1:l}}%
+ \fi
+ \edef\writelink%
+ {\writeutilitycommand%
+ {\twopassentry%
+ {\s!link:#1}%
+ {\numberoflinks}%
+ {\noexpand\realfolio}}}%
+ \writelink
+ \ifnum\noflinks<2
+ \locationfalse
+ \fi
+ \iflocation
+ \hbox
+ {\stelinteractiein[\c!breedte=\!!zeropoint]%
+ \def\goto##1##2%
+ {\doganaarpagina
+ {}%
+ {\localframed
+ [\??lk]
+ {$\ifgoingtopage
+ \ifnum##2=\realpageno\relax
+ ##1%
+ \else
+ \color[\locationcolor\@@lkkleur]{##1}%
+ \fi
+ \else
+ ##1%
+ \fi$}}%
+ [##2]}%
+ \goto {\gotobegincharacter} \firstlink\hss
+ \ifnum\noflinks>2
+ \hskip\@@lkafstand
+ \goto {\gobackwardcharacter}\prevlink\hss
+ \fi
+ \hskip\@@lkafstand
+ #2\relax
+ \hskip\@@lkafstand
+ \ifnum\noflinks>2
+ \goto {\goforwardcharacter} \nextlink\hss
+ \hskip\@@lkafstand
+ \fi
+ \goto {\gotoendcharacter} \lastlink}%
+ \else
+ \hbox{#2}%
+ \fi
+ \egroup}
+
+\def\definieerkoppeling[#1]% % local loading !
+ {\doifundefined{\s!link:#1:\s!list}
+ {\expanded{\definetwopasslist{\s!link:#1}}%
+ \expanded{\doloadtwopassdata{\s!link:#1}}%
+ \getfirsttwopassdata{\s!link:#1}%
+ \let\firstlink=\twopassdata
+ \getlasttwopassdata{\s!link:#1}%
+ \let\lastlink=\twopassdata
+ \let\noflinks=\noftwopassitems
+ \gettwopassdata{\s!link:#1}%
+ \let\currentlink=\twopassdata
+ \let\nextlink=\twopassdata
+ \setxvalue{\s!link:#1:}%
+ {\firstlink:\lastlink:\noflinks:\currentlink:\nextlink}}}
+
+\def\koppeling[#1]#2%
+ {\bgroup
+ \definieerkoppeling[#1]%
+ \doglobal\increment\numberoflinks
+ \gettwopassdata{\s!link:#1}%
+ \def\next[##1:##2:##3:##4:##5]%
+ {\edef\firstlink {0##1}%
+ \edef\lastlink {0##2}%
+ \edef\noflinks {0##3}%
+ \edef\prevlink {0##4}%
+ \edef\currentlink{0##5}}%
+ \expanded{\next[\getvalue{\s!link:#1:}]}%
+ \edef\nextlink%
+ {0\iftwopassdatafound\twopassdata\else\lastlink\fi}%
+ \setxvalue{\s!link:#1:}%
+ {\firstlink:\lastlink:\noflinks:\currentlink:\nextlink}%
+ \edef\writelink%
+ {\writeutilitycommand%
+ {\twopassentry%
+ {\s!link:#1}%
+ {\numberoflinks}%
+ {\noexpand\realfolio}}}%
+ \writelink
+ \ifnum\noflinks<2
+ \locationfalse
+ \fi
+ \iflocation
+ \hbox
+ {\stelinteractiein[\c!breedte=\!!zeropoint]%
+ \def\goto##1##2%
+ {\doganaarpagina
+ {}%
+ {\localframed
+ [\??lk]
+ {$\ifgoingtopage
+ \ifnum##2=\realpageno\relax
+ ##1%
+ \else
+ \color[\locationcolor\@@lkkleur]{##1}%
+ \fi
+ \else
+ ##1%
+ \fi$}}%
+ [##2]}%
+% \goto {\gotobegincharacter} \firstlink\hss
+% \ifnum\noflinks>2
+% \hskip\@@lkafstand
+% \goto {\gobackwardcharacter}\prevlink\hss
+% \fi
+% \hskip\@@lkafstand
+% #2\relax
+% \hskip\@@lkafstand
+% \ifnum\noflinks>2
+% \goto {\goforwardcharacter} \nextlink\hss
+% \hskip\@@lkafstand
+% \fi
+% \goto {\gotoendcharacter} \lastlink}%
+%
+ #2\relax
+ \hskip\@@lkafstand
+ \goto {\gotobegincharacter} \firstlink\hss
+ \ifnum\noflinks>2
+ \goto {\gobackwardcharacter}\prevlink\hss
+ \fi
+ \ifnum\noflinks>2
+ \goto {\goforwardcharacter} \nextlink\hss
+ \hskip\@@lkafstand
+ \fi
+ \goto {\gotoendcharacter} \lastlink}%
+%
+ \else
+ \hbox{#2}%
+ \fi
+ \egroup}
+
+\stelkoppelingenin
+ [\c!afstand=.25em,
+ \c!breedte=\v!passend,
+ \c!plaats=\v!laag,
+ \c!kleur=\@@iakleur,
+ \c!kader=\v!uit,
+ \c!achtergrond=,
+ \c!achtergrondraster=\@@rsraster,
+ \c!achtergrondkleur=]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-mak.tex b/tex/context/base/core-mak.tex index c1e012c17..0c129345e 100644 --- a/tex/context/base/core-mak.tex +++ b/tex/context/base/core-mak.tex @@ -1,61 +1,62 @@ -%D \module -%D [ file=core-mak, -%D version=1997.10.05, -%D title=\CONTEXT\ Core Macros, -%D subtitle=General Makeup Commands, -%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 Core Macros / General Makeup Commands} - -\unprotect - -% \definieerplaats[naam][instellingen] -% \plaats<naam>[[instellingen]] -% -% - still undocumented and also not in setupb yet -% - kan ook intern/direct (scheelt duplicatie), zie \framedtext - -\def\dodefinieerplaats[#1][#2]% - {\getparameters - [\??pl#1] - [\c!links=\hss, - \c!rechts=\hss, - \c!regelcorrectie=\v!uit, - \c!dieptecorrectie=\v!uit, - %\c!voor=, - %\c!na=, - #2]% - \setvalue{\e!plaats#1}{\doplaats[\??pl#1]}} - -\def\definieerplaats% - {\dodoubleempty\dodefinieerplaats} - -\def\doplaats% - {\dodoubleempty\dodoplaats} - -\def\dodoplaats[#1][#2]% - {\bgroup - \dowithnextbox - {\setlocalhsize - \getparameters[#1][#2]% - \getvalue{#1\c!voor}% - \doifvalue{#1\c!regelcorrectie} {\v!aan} {\startbaselinecorrection}% - \hbox to \localhsize - {\getvalue{#1\c!links}% - \box\nextbox - \getvalue{#1\c!rechts}}% - \doifvalue{#1\c!dieptecorrectie} {\v!aan} {\baselinecorrection}% - \doifvalue{#1\c!regelcorrectie} {\v!aan} {\stopbaselinecorrection}% - \getvalue{#1\c!na}% - \egroup} - \vbox} - -\protect - -\endinput +%D \module
+%D [ file=core-mak,
+%D version=1997.10.05,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=General Makeup Commands,
+%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 Core Macros / General Makeup Commands}
+
+\unprotect
+
+% \definieerplaats[naam][instellingen]
+% \plaats<naam>[[instellingen]]
+%
+% - still undocumented and also not in setupb yet
+% - kan ook intern/direct (scheelt duplicatie), zie \framedtext
+
+\def\dodefinieerplaats[#1][#2]%
+ {\getparameters
+ [\??pl#1]
+ [\c!links=\hss,
+ \c!rechts=\hss,
+ \c!regelcorrectie=\v!uit,
+ \c!dieptecorrectie=\v!uit,
+ %\c!voor=,
+ %\c!na=,
+ #2]%
+ \setvalue{\e!plaats#1}{\doplaats[\??pl#1]}}
+
+\def\definieerplaats%
+ {\dodoubleempty\dodefinieerplaats}
+
+\def\doplaats%
+ {\dodoubleempty\dodoplaats}
+
+\def\dodoplaats[#1][#2]%
+ {\bgroup
+ \dowithnextbox
+ {\setlocalhsize
+ \getparameters[#1][#2]%
+ \getvalue{#1\c!voor}%
+ \doifvalue{#1\c!regelcorrectie} {\v!aan} {\startbaselinecorrection}%
+ \hbox to \localhsize
+ {\getvalue{#1\c!links}%
+ \box\nextbox
+ \getvalue{#1\c!rechts}}%
+ \doifvalue{#1\c!dieptecorrectie} {\v!aan} {\baselinecorrection}%
+ \doifvalue{#1\c!regelcorrectie} {\v!aan} {\stopbaselinecorrection}%
+ \getvalue{#1\c!na}%
+ \egroup}
+ \vbox}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-mul.tex b/tex/context/base/core-mul.tex index e2c291e4b..d814e8deb 100644 --- a/tex/context/base/core-mul.tex +++ b/tex/context/base/core-mul.tex @@ -1,1362 +1,1404 @@ -%D \module -%D [ file=supp-mul, -%D version=1998.03.15, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Multi Column Output, -%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 Core Macros / Multi Column Output} - -\unprotect - -%D This one will become core-mul.tex! - -%D The following macro's implement a multi||column output -%D routine. The original implementation was based on Donald -%D Knuth's implementation, which was adapted by Craig Platt to -%D support balancing of the last page. I gradually adapted -%D Platt's version to our needs but under certain -%D circumstances things still went wrong. I considered all -%D calls to Platt's \type{\balancingerror} as undesirable. - -\startmessages dutch library: columns - title: kolommen - 1: maximaal -- kolommen - 2: gebruik eventueel \string\filbreak - 3: probleempje, probeer [balanceren=nee] - 4: plaatsblok boven nog niet mogelijk - 5: plaatsblok onder nog niet mogelijk - 6: -- plaatsblok(en) opgeschort - 7: balanceren afgebroken na 100 stappen - 8: gebalanceerd in -- stap(pen) - 9: uitlijnen controleren! - 10: (minder dan) 1 regel over - 11: plaatsblok te breed voor kolom - 12: plaatsblok verplaatst naar volgende kolom - 13: breed figuur geplaatst boven kolommen -\stopmessages - -\startmessages english library: columns - title: columns - 1: only -- columns possible - 2: use \string\filbreak\space as alternative - 3: problems, disable balancing - 4: top float not yet supported - 5: bottom float not yet supported - 6: -- float(s) postponed - 7: balancing aborted after 100 steps - 8: balanced in -- step(s) - 9: check raggedness - 10: (less than) 1 line left - 11: float to wide for column - 12: float moved to next column - 13: wide float moved to top of columns -\stopmessages - -\startmessages german library: columns - title: Spalten - 1: nur -- Spalten moeglich - 2: benutzte \string\filbreak\space als Alternative - 3: Problem, verwende [ausgleich=nein] - 4: Gleitobjekt oben ncoh nicht unterstuetzt - 5: Gleitobjekt unten ncoh nicht unterstuetzt - 6: -- Gleitobjekt(e) verschoben - 7: ausgleich nach 100 Schritten abgebrocheb - 8: ausgeglichen nach -- Schritt(en) - 9: Ausrichtung ueberpruefen - 10: (weniger als) 1 Zeile uebrig - 11: Gleitobjekt zu breit fuer Spalte - 12: Gleitobjekt in naechste Zeile verschoben - 13: breites Gleitobjekt an den Anfang der Spalten verschoben -\stopmessages - -%D This completely new implementation can handle enough -%D situations for everyday documents, but is still far from -%D perfect. While at the moment the routine doesn't support -%D all kind of floats, it does support: -%D -%D \startopsomming[opelkaar] -%D \som an unlimitted number of columns -%D \som ragged or not ragged bottoms -%D \som optional balancing without \type{\balancingerrors} -%D \som different \type{\baselineskips}, \type{\spacing}, -%D \type{\topskip} and \type{\maxdepth} -%D \som left- and right indentation, e.g. within lists -%D \som moving columns floats to the next column or page -%D \som handling of floats that are to wide for a columns -%D \stopopsomming -%D -%D One could wonder why single and multi||columns modes are -%D still separated. One reason for this is that \TeX\ is not -%D suited well for handling multi||columns. As a result, the -%D single columns routines are more robust. Handling one -%D column as a special case of multi||columns is posible but at -%D the cost of worse float handling, worse page breaking, -%D worse etc. Complicated multi||column page handling should -%D be done in \kap{DTP}||systems anyway. -%D -%D There are three commands provided for entering and leaving -%D multi||column mode and for going to the next column: -%D -%D \interface \type{\beginmulticolumns} \\ \\ -%D \interface \type{\endmulticolumns} \\ \\ -%D \interface \type{\ejectcolumn} \\ \\ -%D -%D This routines are sort of stand||alone. They communicate -%D with the rest of \CONTEXT\ by means of some interface -%D macro's, which we only mention. -%D -%D \interface \type{\nofcolumns} \\ -%D the number of columns \\ -%D \interface \type{\betweencolumns} \\ -%D the stuff between columns \\ -%D \interface \type{\finaloutput{action}{box}} \\ -%D some kind of \type{\pagebody} and \type{\shipout} \\ -%D -%D \interface \type{\ifbalancecolumns} \\ -%D balancing the colums or not \\ -%D \interface \type{\ifstretchcolumns} \\ -%D ragging the bottom or not \\ -%D -%D \interface \type{\ifheightencolumns} \\ -%D fix the heigh tor not \\ -%D \interface \type{\fixedcolumnheight} \\ -%D the optional fixed height \\ -%D -%D \interface \type{\ifinheritcolumns} \\ -%D handle ragging or not \\ -%D \interface \type{\ifr@ggedbottom} \\ -%D use ragged bottoms \\ -%D \interface \type{\ifb@selinebottom} \\ -%D put the bottom line on the baseline \\ -%D \interface \type{\ifnormalbottom} \\ -%D put the bottom line at the baseline \\ -%D -%D \interface \type{\usercolumnwidth} \\ -%D the calculated width of a column \\ -%D \interface \type{\columntextwidth} \\ -%D the maximum width of a column \\ -%D \interface \type{\columntextheight} \\ -%D the minimum width of a column \\ -%D -%D \interface \type{\spacingfactor} \\ -%D the spacing factor \\ -%D \interface \type{\bodyfontsize} \\ -%D the (local) bodyfontsize \\ -%D \interface \type{\openlineheight} \\ -%D the lineheight (including \type{\spacing}) \\ -%D -%D \interface \type{\Everybodyfont} \\ -%D communication channel to font switching routines \\ -%D -%D \interface \type{\global\settopskip} \\ -%D set \type{\topskip} \\ -%D \interface \type{\setcolumnwarnings} \\ -%D set \type{\badness} and \type{\fuzz} \\ -%D \interface \type{\setcolumninserts} \\ -%D set \type{\insert}'s \\ -%D \interface \type{\setvsize} \\ -%D set \type{\vsize} and \type{\pagegoal} \\ -%D \interface \type{\sethsize} \\ -%D set \type{\hsize} \\ -%D -%D \interface \type{\flushcolumnfloats} \\ -%D push saved column floats (next page) \\ -%D \interface \type{\flushcolumnfloat} \\ -%D push saved column floats (next column) \\ -%D \interface \type{\setcolumnfloats} \\ -%D initialize column floats \\ -%D -%D \interface \type{\finishcolumnbox} \\ -%D do something special (a hook) \\ -%D \interface \type{\postprocesscolumnline} \\ -%D do something with each columnline (also a hook) \\ -%D \interface \type{\currentcolumn} \\ -%D the current column \\ -%D -%D These interface macro's are called upon or initialized -%D by the multi||column macro's. - -%D A lot of footnote stuff added! - -\def\columntextwidth {\zetbreedte} -\def\columntextheight {\teksthoogte} -\def\usercolumnwidth {\tekstbreedte} - -\def\fixedcolumnheight {\teksthoogte} -\def\betweencolumns {\hskip\bodyfontsize} - -\def\setcolumnwarnings {\dontcomplaincolumnboxes} -\def\setcolumninserts {\dontpermitcolumninserts} - -\def\setcolumnfloats {} % in CONTEXT used for floats -\def\flushcolumnfloats {} % in CONTEXT used for floats -\def\flushcolumnfloat {} % in CONTEXT used for floats - -\def\finishcolumnbox {} % in CONTEXT used for backgrounds - -%D In fact, the column height and width are set by mens of -%D two macro's. One can change their meaning if needed: - -\def\setcolumntextheight% - {\def\columntextheight{\teksthoogte}} - -\def\setcolumntextwidth% % pas op: geen \teksthoogte, anders steeds smaller - {\def\columntextwidth{\zetbreedte}} - -%D Both macros are redefined in \CONTEXT\ when backgrounds -%D are applied to columns. - -\newcount\nofcolumns \nofcolumns=2 - -\def\maxnofcolumns {16} -\def\allocatednofcolumns {0} - -\newif\ifbalancecolumns \balancecolumnsfalse -\newif\ifstretchcolumns \stretchcolumnsfalse -\newif\ifinheritcolumns \inheritcolumnsfalse -\newif\ifheightencolumns \heightencolumnsfalse - -\newbox\partialpage -\newbox\restofpage - -\newbox\savedfloatlist - -\newdimen\intercolumnwidth -\newdimen\localcolumnwidth -\newdimen\partialpageheight -\newdimen\savedpagetotal - -\newtoks\singlecolumnout - -%D During initialization the temporary boxes are allocated. -%D This enables us to use as much columns as we want, without -%D exhausting the pool of boxes too fast. We could have packed -%D them in one box, but we've got enough boxes. -%D -%D Two sets of boxes are declared, the txtboxes are used for -%D the text, the topboxes are for moved column floats. - -\def\@@txtcol{@@txtcol} -\def\@@topcol{@@topcol} - -\def\initializemulticolumns#1% - {\ifnum#1>\maxnofcolumns\relax - \showmessage{\m!columns}{1}{\maxnofcolumns}% - \nofcolumns=\maxnofcolumns - \else - \nofcolumns=#1\relax - \fi - \ifnum\nofcolumns>\allocatednofcolumns\relax - \dorecurse - {#1} - {\ifnum\recurselevel>\allocatednofcolumns\relax - \newbox\next - \global\letvalue{\@@txtcol\recurselevel}=\next - \newbox\next - \global\letvalue{\@@topcol\recurselevel}=\next - \fi}% - \xdef\allocatednofcolumns{\the\nofcolumns}% - \fi - \edef\firstcolumnbox{\getvalue{\@@txtcol1}}% - \edef\firsttopcolumnbox{\getvalue{\@@topcol1}}% - \edef\lastcolumnbox{\getvalue{\@@txtcol\the\nofcolumns}}% - \edef\lasttopcolumnbox{\getvalue{\@@topcol\the\nofcolumns}}} - -%D Without going in details we present two macro's which -%D handle the columns. The action which is transfered by the -%D the first and only parameter can do something with -%D \type{\currentcolumnbox}. In case of the mid columns, -%D \type{\firstcolumnbox} and \type{\lastcolumnbox} are handled -%D outside these macro's. - -\def\dohandlemidcolumns#1% - {\dorecurse - {\nofcolumns} - {\ifnum\recurselevel>1 - \ifnum\recurselevel<\nofcolumns\relax - \edef\currentcolumnbox{\getvalue{\@@txtcol\recurselevel}}% - \edef\currenttopcolumnbox{\getvalue{\@@topcol\recurselevel}}% - \let\currentcolumn=\recurselevel - #1\relax - \fi - \fi}} - -\def\dohandleallcolumns#1% - {\dorecurse - {\nofcolumns} - {\edef\currentcolumnbox{\getvalue{\@@txtcol\recurselevel}}% - \edef\currenttopcolumnbox{\getvalue{\@@topcol\recurselevel}}% - \let\currentcolumn=\recurselevel - #1\relax}} - -%D Going to a new columns is done by means of a -%D \type{\ejectcolumn}. The following definition does not -%D always work. - -\def\ejectcolumn% - {\goodbreak - \showmessage{\m!columns}{2}{}} - -%D The next macro should never be called so let's deal with it. -%D There were several solutions to these kind of errors. First -%D we check for a good breakpoint before firing up the -%D multi||column routine (\type{\break} or \type{\allowbreak}). -%D We do the same at the end of the routine -%D (\type{\allowbreak}). These allowances are definitely -%D needed! -%D -%D Some on first sight redundant calls to for instance -%D \type{\setvsize} in the flushing, splitting and balancing -%D macro's can definitely not be omitted! Some are just there -%D to handle situations that only few times arise. One of -%D those can be that the output routine is invoked before -%D everything is taken care of. This happens when we -%D flush (part of) the current page with an \type{\unvbox} -%D with a \type{\pagetotal}~$\approx$ \type{\pagegoal}. One -%D simply cannot balance columns that are just balanced. -%D -%D I hope one never sees the following message. Because it -%D took me a lot of time to develop the multi||columns -%D routines, every (although seldom) warning gives me the -%D creeps! - -\def\balancingerror% - {\showmessage{\m!columns}{3}{}% - \finaloutput\unvbox\normalpagebox} - -%D Here we present the two \type{\dont...} macro's, which are -%D of course \CONTEXT||specific ones. - -\def\dontcomplaincolumnboxes% - {\mindermeldingen} - -\def\dontpermitcolumninserts% - {\def\dotopfloat% - {\showmessage{\m!columns}{4}{}% - \doexecfloat}% - \def\dobotfloat% - {\showmessage{\m!columns}{5}{}% - \doexecfloat}} - -\def\getinsertionheights\to#1\\% \relax'm - {#1=\!!zeropoint - \def\doaddinsertionheight##1% - {\ifvoid##1\else - \advance#1 by \skip##1 - \advance#1 by \ht##1 - \fi}% - \doaddinsertionheight\topins - \doaddinsertionheight\botins - \ifcleverfootnotes - \doaddinsertionheight\savedfootins - \else - \doaddinsertionheight\footins - \fi} - -%D The local column width is available in the dimension -%D register \type{\localcolumnwidth}, which is calculated as: - -\def\setcolumnhsize% - {\setbox0=\hbox - {\parindent\!!zeropoint\betweencolumns}% - \intercolumnwidth=\wd0 - \localcolumnwidth=\columntextwidth - \edef\globalcolumnwidth{\the\localcolumnwidth}% - \advance\localcolumnwidth by -\leftskip - \advance\localcolumnwidth by -\rightskip - \advance\localcolumnwidth by -\nofcolumns\intercolumnwidth - \advance\localcolumnwidth by \intercolumnwidth - \divide\localcolumnwidth by \nofcolumns - \usercolumnwidth=\localcolumnwidth - \hsize=\localcolumnwidth} % we don't do it \global - -%D One should be aware that when font related dimensions are -%D used in typesetting the in||between material, these -%D dimensions are influenced by bodyfont switches inside -%D multi||column mode. - -%D The global width is saved in \type {\globalcolumnwidth}. -%D This value is used when we pack the columns in a \type -%D {\hbox}. - -\def\setcolumnvsize% - {\global\vsize=\columntextheight - \ifdim\partialpageheight>\!!zeropoint - \global\advance\vsize by -\partialpageheight - \fi - \getinsertionheights\to\dimen0\\% - \global\advance\vsize by -\dimen0 -\ifgridsnapping % evt altijd, nog testen - \getnoflines\vsize - \vsize=\noflines\openlineheight - \advance\vsize by .5\openlineheight % collect enough data -\fi - \global\vsize=\nofcolumns\vsize - \global\pagegoal=\vsize} % let's do it only here - -%D It really starts here. After some checks and initializations -%D we change the output routine to continous multi||column -%D mode. This mode handles columns that fill the current and -%D next full pages. The method used is (more or less) -%D multiplying \type{\vsize} and dividing \type{\hsize} by -%D \type{\nofcolumns}. More on this can be found in the -%D \TeX book. We save the top of the current page in box -%D \type{\partialpage}. -%D -%D We manipulate \type{\topskip} a bit, just to be shure that -%D is has no flexibility. This has te be done every time a -%D font switch takles place, because \type{\topskip} can depend -%D on this. -%D -%D Watch the trick with the \type{\vbox}. This way we get the -%D right interlining and white space. - -\def\beginmulticolumns% - {\par - \flushfootnotes - \begingroup - \dontshowcomposition - \setcolumntextwidth\relax - \setcolumntextheight\relax - \widowpenalty=0 % is gewoon beter - \clubpenalty=0 % zeker bij grids - \ifsomefloatwaiting - \showmessage{\m!columns}{6}{\the\savednoffloats}% - \global\setbox\savedfloatlist=\box\floatlist - \xdef\restoresavedfloats% - {\global\savednoffloats=\the\savednoffloats - \global\setbox\floatlist=\box\savedfloatlist - \global\noexpand\somefloatwaitingtrue}% - \global\savednoffloats=0 - \global\somefloatwaitingfalse - \else - \global\let\restoresavedfloats=\relax - \fi - \dimen0=\pagetotal - \advance\dimen0 by \parskip - \advance\dimen0 by \openlineheight - \ifdim\dimen0<\pagegoal - \allowbreak - \else - % \break Werkt in veel gevallen averechts! - \fi - \appendtoks\topskip=1\topskip\to\everybodyfont - \the\everybodyfont - \initializemulticolumns\nofcolumns - \setcolumninserts - \hangafter=0 - \hangindent=\!!zeropoint - \everypar{}% - \ifdim\pagetotal=\!!zeropoint \else - \vbox{\strut}% - \vskip-\openlineheight - \fi - \global\savedpagetotal=\pagetotal - \global\singlecolumnout=\output - \global\output={\global\setbox\partialpage=\vbox{\unvbox\normalpagebox}}% - \eject - \global\partialpageheight=\ht\partialpage - \global\output={\continuousmulticolumnsout}% - \setcolumnfloats - \dohandleallcolumns - {\global\setbox\currenttopcolumnbox=\box\voidb@x}% - \checkbegincolumnfootnotes - \let\sethsize=\setcolumnhsize - \let\setvsize=\setcolumnvsize - \sethsize - \setvsize - \showcomposition} - -%D When we leave the multi||column mode, we have to process the -%D not yet shipped out part of the columns. When we don't -%D balance, we simply force a continuous output, but a balanced -%D output is more tricky. -%D - -%D First we try to fill up the page and when all or something -%D is left we try to balance things. This is another useful -%D adaption of the ancesters of these macro's. It takes some -%D reasoning to find out what happens and maybe I'm making -%D some mistake, but it works. -%D -%D Unvoiding box \type{\partialpage} is sometimes necessary, -%D e.g. when there is no text given between \type{\begin..} -%D and \type{\end..}. The \type{\par} is needed! - -\def\endmulticolumns% - {\dontshowcomposition - \doflushcolumnfloats % added recently - \par - \ifbalancecolumns - \global\output={\continuousmulticolumnsout}% - \goodbreak - \global\output={\balancedmulticolumnsout}% - \else - \goodbreak - \fi - \eject % the prevdepth is important, try e.g. toclist in - \prevdepth\!!zeropoint % columns before some noncolumned text text - \global\output=\singlecolumnout - \ifvoid\partialpage\else - \unvbox\partialpage - \fi - \global\partialpageheight=\!!zeropoint - \endgroup % here - \nofcolumns=1 - \setvsize % the outer one! - \checkendcolumnfootnotes - \dosomebreak\allowbreak - \restoresavedfloats} - -%D NEW: still to be documented! - -\newinsert\savedfootins - -\def\checkbegincolumnfootnotes% - {\ifcleverfootnotes - \doflushfootnotes - \ifdim\ht\footins>\!!zeropoint - \global\setbox\savedfootins=\box\footins - \else - \global\setbox\savedfootins=\box\voidb@x - \fi - \global\skip\savedfootins=\skip\footins - \global\count\savedfootins=\count\footins - \setupfootnotes - \else - \global\skip\savedfootins=\skip\footins - \global\setbox\savedfootins=\box\voidb@x - \global\count\savedfootins=\count\footins - \setupfootnotes -\global\multiply\count\footins by \nofcolumns % gaat mis bij lokale - \fi} - -\def\checkendcolumnfootnotes% - {\ifcleverfootnotes\ifvoid\savedfootins\else - \global\setbox\footins=\box\savedfootins - \fi\fi - \global\skip\footins=\skip\savedfootins - \global\count\footins=\count\savedfootins} - -%D Because some initializations happen three times, we -%D defined a macro for them. The \type{\everypar{}} is -%D needed because we don't want anything to interfere. - -\def\setmulticolumnsout% - {\everypar{}% - \setcolumnwarnings - \settopskip - \setmaxdepth - \topskip=1\topskip - \splittopskip=\topskip - \splitmaxdepth=\maxdepth - \boxmaxdepth=\maxdepth - \emergencystretch=\!!zeropoint\relax} % sometimes needed ! - -%D Flushing the page comes to pasting the columns together and -%D appending the result to box \type{\partialpage}, if not -%D void. I've seen a lot of implementations in which some skip -%D was put between normal text and multi||column text. When we -%D don't want this, the baselines can be messed up. I hope the -%D seemingly complicated calculation of a correction -%D \type{\kern} is adequate to overcome this. Although not -%D watertight, spacing is taken into account and even multiple -%D mode changes on one page go well. But cross your fingers and -%D don't blame me. -%D -%D One of the complications of flushing out the boxes is that -%D \type{\partialpage} needs to be \type{\unvbox}'ed, otherwise -%D there is too less flexibility in the page when using -%D \type{\r@ggedbottom}. It took a lot of time before these -%D kind of problems were overcome. Using \type{\unvbox} at the -%D wrong moment can generate \type{\balancingerror}'s. -%D -%D One can use the macros \type {\maxcolumnheight} and \type -%D {\maxcolumndepth} when generating material between columns -%D as well as postprocessing column lines. - -\let\maxcolumnheight=\!!zeropoint -\let\maxcolumndepth =\!!zeropoint - -\def\setmaxcolumndimensions% - {\let\maxcolumnheight=\!!zeropoint - \let\maxcolumndepth =\!!zeropoint - \dohandleallcolumns - {\ifdim\ht\currentcolumnbox>\maxcolumnheight - \edef\maxcolumnheight{\the\ht\currentcolumnbox}% - \fi - \ifdim\dp\currentcolumnbox>\maxcolumndepth - \edef\maxcolumndepth{\the\dp\currentcolumnbox}% - \fi}} - -\def\flushcolumnedpage% - {\bgroup - \forgetall - \setmulticolumnsout - \showcomposition - \setmaxcolumndimensions - \postprocesscolumns - \dohandleallcolumns % \hbox i.v.m. \showcomposition - {\global\setbox\currentcolumnbox=\hbox to \localcolumnwidth - {\box\currentcolumnbox - \global\wd\currentcolumnbox=\localcolumnwidth - \ifheightencolumns - \global\ht\currentcolumnbox=\fixedcolumnheight - \fi}}% - \setmaxcolumndimensions - \overlaycolumnfootnotes - \setbox0=\vbox - {\hbox to \globalcolumnwidth - {\dohandleallcolumns - {\finishcolumnbox{\hbox{\box\currentcolumnbox}}% - \ifnum\currentcolumn<\nofcolumns - \hfil\betweencolumns\hfil - \fi}}}% - \dohandleallcolumns - {\global\setbox\currenttopcolumnbox=\box\voidb@x}% - \ifvoid\partialpage \else - \ifgridsnapping % do you believe this junk? - \scratchdimen=\savedpagetotal - \advance\scratchdimen by -\ht\partialpage - \advance\scratchdimen by -\dp\partialpage - \advance\scratchdimen by -\topskip - \box\partialpage - \kern\scratchdimen - \else - \unvbox\partialpage - \fi - \fi - \global\partialpageheight=\!!zeropoint - \setvsize - \dosomebreak\nobreak - \dp0=\!!zeropoint - \prevdepth\openstrutdepth % \dp\strutbox - \nointerlineskip - \box0 - \egroup} - -%D In case one didn't notice, finaly \type{\finishcolumnbox} is -%D applied to all boxes. One can use this hook for special -%D purposes. But there is more: -%D -%D Once upon a time I wanted to manipulate the individual lines -%D in a column. This feature is demonstrated in the two examples -%D below. -%D -%D \startbuffer -%D \def\postprocesscolumnline#1% -%D {\ruledhbox{#1}\hss} -%D -%D \startkolommen[n=4] -%D \dorecurse{25}{line: \recurselevel\par} -%D \stopkolommen -%D \stopbuffer -%D -%D \typebuffer -%D -%D Here we show the natural width of the lines: -%D -%D {\haalbuffer} -%D -%D The next example does a bit more advanced manipulation: -%D -%D \startbuffer -%D \def\postprocesscolumnline#1% -%D {\ifodd\currentcolumn -%D \hfill#1\relax -%D \else -%D \relax#1\hfill -%D \fi} -%D -%D \startkolommen[n=4] -%D \dorecurse{25}{line \recurselevel\par} -%D \stopkolommen -%D \stopbuffer -%D -%D \typebuffer -%D -%D Here we also see an application of \type{\currentcolumn}: -%D -%D {\haalbuffer} -%D -%D This feature is implemented using the reshape macros -%D presented in \type{supp-box}. - -\def\postprocesscolumns% recent extension - {\ifx\postprocesscolumnline\undefined \else - \dohandleallcolumns - {\global\setbox\currentcolumnbox=\vtop - {\beginofshapebox - \unvbox\currentcolumnbox - \unskip\unskip - \endofshapebox - \reshapebox - {\dimen0=\ht\shapebox - \dimen2=\dp\shapebox - \setbox\shapebox=\hbox to \hsize - {\postprocesscolumnline{\unhbox\shapebox}}% - \ht\shapebox=\dimen0 - \dp\shapebox=\dimen2 - \box\shapebox}% - \flushshapebox - \everypar{}\parskip\!!zeropoint % = \forgetall - \strut\endgraf - \vskip-\lineheight - \vfil}}% - \fi} - -%D We default to doing nothing! - -\let\postprocesscolumnline=\undefined - -%D Here comes the simple splitting routine. It's a bit -%D longer than expected because of ragging bottoms or not. -%D This part can be a bit shorter but I suppose that I will -%D forget what happens. The splitting takes some already -%D present material (think of floats) into account! -%D -%D First we present some auxiliary routines. Any material, -%D like for instance floats, that is already present in the -%D boxes is preserved. - -% \def\splitcolumn#1from \box#2to \dimen#3 top \box#4% -% {\bgroup -% \ifdim\ht#4>\!!zeropoint -% \dimen0=\dimen#3\relax -% \dimen2=\dimen#3\relax -% \advance\dimen0 by -\ht#4 -% \setbox0=\vsplit#2 to \dimen0 -% \global\setbox#1=\vbox to \dimen2{\unvcopy#4\unvbox0}% -% \else -% \global\setbox#1=\vsplit#2 to \dimen#3 -% \fi -% \egroup} - -\def\splitcolumn#1from \box#2to \dimen#3 top \box#4% - {\bgroup - \ifdim\ht#4>\!!zeropoint - \dimen0=\dimen#3\relax - \dimen2=\dimen2 - \advance\dimen0 by -\ht#4% - \columnfootnotecorrection{#1}{\dimen0}% - \setbox0=\vsplit#2 to \dimen0 - \global\setbox#1=\vbox to \dimen2 - {\ifgridsnapping - \dimen0=-\openstrutheight\advance\dimen0 by \topskip - \vskip\dimen0\copy#4\vskip-\dimen0 - \else - \unvcopy#4% - \fi - \unvbox0\fakecolumnfootnotes{#1}}% - \else - \ifcleverfootnotes - \columnfootnotecorrection{#1}{\dimen#3}% - \setbox0=\vsplit#2 to \dimen#3% - \global\setbox#1=\vbox to \dimen#3{\unvbox0\fakecolumnfootnotes{#1}}% - \else - \global\setbox#1=\vsplit#2 to \dimen#3% - \fi - \fi - \egroup} - -\def\splitcurrentcolumn from \box#1to \dimen#2% - {\splitcolumn\currentcolumnbox from \box#1 to \dimen#2 top \box\currenttopcolumnbox} - -\def\splitfirstcolumn from \box#1to \dimen#2% - {\splitcolumn\firstcolumnbox from \box#1 to \dimen#2 top \box\firsttopcolumnbox} - -% \def\splitlastcolumn from \box#1to \dimen#2% -% {\global\setbox\lastcolumnbox=\vbox -% {\unvcopy\lasttopcolumnbox -% \unvbox#1}} - -\def\splitlastcolumn from \box#1to \dimen#2% - {\global\setbox\lastcolumnbox=\vbox - {\unvcopy\lasttopcolumnbox - \unvbox#1 - \fakecolumnfootnotes\lastcolumnbox}} - -%D NEW: still to be documented. - -\def\fakecolumnfootnotes#1% - {\relax - \ifcleverfootnotes - \ifnum#1=\lastcolumnbox - \ifdim\ht\footins>\!!zeropoint - \vskip\skip\footins - \vskip\ht\footins - \fi - \fi - \fi} - -\def\columnfootnotecorrection#1#2% - {\relax - \ifcleverfootnotes - \ifnum#1=\lastcolumnbox\relax - \ifdim\ht\footins>\!!zeropoint - \advance#2 by -\ht\footins - \advance#2 by -\skip\footins - \fi - \fi - \fi} - -\def\overlaycolumnfootnotes% VERVANGEN !!! - {\relax - \ifcleverfootnotes\ifdim\ht\footins>\!!zeropoint - \bgroup - %\ifgridsnapping - \scratchdimen=\ht\firstcolumnbox - \advance\scratchdimen by -\openstrutdepth % \dp\strutbox - \getnoflines\scratchdimen - \advance\noflines by -2 - \scratchdimen=\noflines\lineheight - \advance\scratchdimen by \topskip - \setbox0=\hbox - {\lower\scratchdimen\vbox{\placefootnoteinserts}}% - \ht0=\openstrutheight % \ht\strutbox - \dp0=\openstrutdepth % \dp\strutbox - \scratchdimen=\ht\lastcolumnbox - \global\setbox\lastcolumnbox=\vbox to \scratchdimen - {\box\lastcolumnbox - \vskip-\scratchdimen - \box0}% - %\else - % \setbox0=\vbox to \ht\lastcolumnbox - % {\vfill\placefootnoteinserts}% - % \scratchdimen=\wd\lastcolumnbox - % \wd0=\wd\lastcolumnbox - % \wd\lastcolumnbox=\!!zeropoint - % \global\setbox\lastcolumnbox=\hbox - % {\box\lastcolumnbox\box0}% - %\fi - \egroup - \fi\fi} - - -%D Here comes the routine that splits the long box in columns. -%D The macro \type{\flushcolumnfloats} can be used to flush -%D either floats that were present before the multi||column -%D mode was entered, or floats that migrate to next columns. -%D Flushing floats is a delicate process. - -\def\continuousmulticolumnsout% - {\bgroup - \setmulticolumnsout - \dontshowcomposition -% \dimen0=\columntextheight -% \advance\dimen0 by -\partialpageheight -% \getinsertionheights\to\dimen2\\% toegevoegd ivm voetnoten -% \ifgridsnapping -% \getnoflines{\dimen2}% -% \advance\dimen0 by -\noflines\openlineheight -%\getnoflines{\dimen0}\dimen0=\noflines\openlineheight -% \else -% \advance\dimen0 by -\dimen2 -% \fi -% - \dimen0=\columntextheight - \getinsertionheights\to\dimen2\\% toegevoegd ivm voetnoten - \advance\dimen2 by \partialpageheight - \ifgridsnapping - \getnoflines{\dimen2}% - \advance\dimen0 by -\noflines\openlineheight - \getnoflines{\dimen0}% - \dimen0=\noflines\openlineheight - \else - \advance\dimen0 by -\dimen2 - \fi -% - \dohandleallcolumns - {\splitcurrentcolumn from \box\normalpagebox to \dimen0} - \setbox\restofpage=\vbox{\unvbox\normalpagebox}% - \ifinheritcolumns - \ifr@ggedbottom - \dohandleallcolumns - {\global\setbox\currentcolumnbox=\vbox to \dimen0 - {\dimen0=\dp\currentcolumnbox - \unvbox\currentcolumnbox - \vskip-\dimen0 - \vskip\openstrutdepth % \dp\strutbox - \prevdepth\openstrutdepth % \dp\strutbox - \vfill}}% - \fi - \ifn@rmalbottom - \advance\dimen0 by \maxdepth - \dohandleallcolumns - {\global\setbox\currentcolumnbox=\vbox to \dimen0 - {\unvbox\currentcolumnbox}}% - \fi - \ifb@selinebottom - % the columns are on top of the baseline - \fi - \else - \dohandleallcolumns - {\global\setbox\currentcolumnbox=\vbox to \dimen0 - {\ifstretchcolumns - \unvbox\currentcolumnbox - \else - \unvbox\currentcolumnbox % wel of niet \unvbox ? - \vfill - \fi}}% - \dohandleallcolumns - {\global\ht\currentcolumnbox=\dimen0}% - \fi - \setbox\partialpage=\vbox{\flushcolumnedpage}% - \finaloutput\box\partialpage - \sethsize - \setvsize - \flushcolumnfloats - \unvbox\restofpage - % \penalty\outputpenalty % gaat gruwelijk mis in opsommingen - \egroup} - -%D And this is the balancing stuff. Again, part of the routine -%D is dedicated to handling ragged bottoms, but here we also -%D see some handling concerning the stretching of columns. -%D We set \type{\widowpenalty} at~0, which enables us to -%D balance columns with few lines. The use of \type{\box2} and -%D \type{\box4} garantees a more robust check when skips are -%D used. - -\def\balancedmulticolumnsout% - {\bgroup - \setmulticolumnsout - \dontshowcomposition - \widowpenalty=0 - \setbox0=\vbox{\unvbox\normalpagebox}% - \ifdim\ht0>\openlineheight - \dimen0=\ht0 - \advance\dimen0 by \topskip - \advance\dimen0 by -\baselineskip - \divide\dimen0 by \nofcolumns - \vbadness=\!!tenthousand\relax - \count255=0 - \bgroup - \ifgridsnapping - \dimen2=\lineheight - \else - \dimen2=\!!onepoint % RUBISH - \dimen2=\spacingfactor\dimen2 - \fi - \loop - \advance\count255 by 1 - \global\setbox\restofpage=\copy0\relax - \splitfirstcolumn from \box\restofpage to \dimen0 - \dohandlemidcolumns - {\splitcurrentcolumn from \box\restofpage to \dimen0}% - \splitlastcolumn from \box\restofpage to \dimen0 - \setbox2=\vbox{\unvcopy\firstcolumnbox}% - \dimen4=\!!zeropoint - \dohandleallcolumns - {\setbox4=\vbox{\unvcopy\currentcolumnbox}% - \dimen6=\ht4 - \ifdim\dimen6>\dimen4 \dimen4=\dimen6\fi}% - \ifnum\count255>100\relax - \donefalse - \else\ifdim\dimen4>\ht2 - \donetrue - \else - \donefalse - \fi\fi - \ifdone - \advance\dimen0 by \dimen2\relax - \repeat - \dohandleallcolumns - {\global\setbox\currentcolumnbox=\vbox{\unvcopy\currentcolumnbox}}% NIEUW - \ifnum\count255>100\relax - \showmessage{\m!columns}{7}{}% - \else - \showmessage{\m!columns}{8}{\the\count255\space}% - \fi - \egroup - \ifinheritcolumns - \dimen0=\ht\firstcolumnbox - \dimen2=\ht\firstcolumnbox - \advance\dimen2 by -\openlineheight - \dohandleallcolumns - {\dimen4=\ht\currentcolumnbox - \dimen6=10\openlineheight - \global\setbox\currentcolumnbox=\vbox to \dimen0 - {\unvbox\currentcolumnbox - \ifdim\dimen4>\dimen6 - \ifdim\dimen4<\dimen0 - \ifdim\dimen4>\dimen2 - \vskip\!!zeropoint % !! - \else - \vskip\openlineheight - \vfill - \fi - \else - \vskip\!!zeropoint - \fi - \else - \vskip\openlineheight - \vfill - \fi}}% - \else - \bgroup - \ifstretchcolumns - \dimen0=\ht\firstcolumnbox - \dimen2=\bottomtolerance\ht\firstcolumnbox - \setbox0=\vbox{\unvcopy\lastcolumnbox}% - \advance\dimen0 by -\ht0\relax - \advance\dimen0 by -\dp0\relax - \ifdim\dimen0>\openlineheight\relax - \ifdim\dimen0>\dimen2\relax - % \stretchcolumnsfalse % beter goed slecht dan slecht goed - \showmessage{\m!columns}{9}{}% - \fi - \fi - \fi - \dohandleallcolumns - {\global\setbox\currentcolumnbox=\vbox to \ht\firstcolumnbox - {\ifstretchcolumns - \unvbox\currentcolumnbox - \else - \box\currentcolumnbox - \vfill - \fi}}% - \egroup - \fi - \else - \showmessage{\m!columns}{10}{}% - \global\setbox\firstcolumnbox=\vbox{\unvbox0}% - \fi - \global\output={\balancingerror}% - \b@selinebottomtrue % forces depth in separation rule - \flushcolumnedpage - \allowbreak - \egroup} - -%D The multicolumn mechanism is incorporated in a \CONTEXT\ -%D interface, which acts like: -%D -%D \starttypen -%D \startcolumns[n=4,balance=no,stretch=no,line=on] -%D some text -%D \stopcolumns -%D \stoptypen -%D -%D The setup is optional. The default behaviour of columns -%D can be set up with: -%D -%D \starttypen -%D \setupcolumns -%D [n=2, -%D balance=yes, -%D stretch=text, -%D line=off] -%D \stoptypen -%D -%D In this case, stretching is according to the way it's -%D done outside columns (\type{\inheritcolumnstrue}). Also -%D we can setup the \type{tolerance} within a column, the -%D \type{distance} between columns and the fixed -%D \type{height} of a column. - -%D Multi||column output: the float routines -%D -%D Here come the routines that handle the placement of column -%D floats. Floats that are to big migrate to the next -%D column. Floats that are too wide, migrate to the top of the -%D next page, where they span as much columns as needed. -%D Floats that are left over from outside the multi||column -%D mode are flushed first. In macro \type{\finaloutput} the -%D topfloats that are left from previous text should be set. -%D -%D When there are some floats in the queue, we inhibit the -%D flushing of floats on top of columns. The number of -%D waiting floats is preswent in \type{\savednoftopfloats} and -%D is saved. As long as there are floats waiting, the topfloats -%D are places as if we are outside multi||column mode. This is -%D neccessary for e.g. multicolumn lists. -%D -%D When all those floats are flushed, we switch to the local -%D flushing routine. - -\def\setcolumnfloats% - {\xdef\globalsavednoffloats{\the\savednoffloats}% - \ifnum\globalsavednoffloats>0 - \setglobalcolumnfloats - \else - \setlocalcolumnfloats - \fi} - -\def\setglobalcolumnfloats% - {\everypar={}% - \let\flushcolumnfloat=\relax - \let\doroomfloat=\relax - \let\flushcolumnfloats=\noflushcolumnfloats} - -\def\setlocalcolumnfloats% - {\everypar={\flushfootnotes\flushcolumnfloat\flushmargincontents\checkindentation} - \let\flushcolumnfloat=\doflushcolumnfloat - \let\doroomfloat=\docolumnroomfloat - \let\flushcolumnfloats=\doflushcolumnfloats - \let\dosetbothinserts=\relax - \let\dotopinsertions=\relax} - -\def\noflushcolumnfloats% - {\bgroup - \xdef\localsavednoffloats{\the\savednoffloats}% - \global\savednoffloats=\globalsavednoffloats - \dotopinsertions - \xdef\globalsavenoffloats{\the\savednoffloats}% - \ifnum\globalsavednoffloats=0 - \setlocalcolumnfloats - \fi - \global\savednoffloats=\localsavednoffloats - \egroup} - -%D We need to calculate the amount of free space in a columns. -%D When there is not enough room, we migrate the float to the -%D next column. These macro's are alternatives (and -%D look||alikes) of \type{\doroomfloat}. When a float is to -%D wide, for one column, it is moved to the top of the next -%D page. Of course such moved floats have to be taken into -%D account when we calculate the available space. It's a pitty -%D that such things are no integral part of \TEX. - -% \def\getcolumnstatus\column#1\total#2\goal#3\\% -% {\ifdim\pagegoal<\maxdimen -% \dimen0=\pagegoal -% \divide\dimen0 by \nofcolumns -% \dimen2=\!!zeropoint -% \count255=0\relax -% \dimen8=\columntextheight -% \advance\dimen8 by -\partialpageheight -% %\advance\dimen8 by -\maxdepth % recently deleted -% \def\dogetcolumnstatus% -% {\advance\count255 by 1\relax -% \advance\dimen2 by \ht\currenttopcolumnbox -% \advance\dimen2 by \dp\currenttopcolumnbox -% \dimen4=\dimen2\relax -% \advance\dimen4 by \pagetotal -% \dimen6=\count255\dimen8 -% \ifdim\dimen4>\dimen6 -% \else -% \let\dogetcolumnstatus=\relax -% \fi}% -% \dohandleallcolumns{\dogetcolumnstatus}% -% \ifdim\dimen4=\dimen6 -% \dimen4=\!!zeropoint -% \advance\count255 by 1 -% \fi -% #1=\count255 -% #2=\dimen4 -% #3=\dimen6 -% \else -% #1=1 -% #2=\!!zeropoint -% #3=\teksthoogte -% \advance#3 by -\partialpageheight -% \fi} - -\def\getcolumnstatus\column#1\total#2\goal#3\\% - {\ifdim\pagegoal<\maxdimen - \dimen0=\pagetotal - \else - \dimen0=\!!zeropoint - \fi - \dimen2=\!!zeropoint - \count255=0 - \dimen8=\columntextheight - \advance\dimen8 by -\partialpageheight - \def\dogetcolumnstatus% - {\advance\count255 by 1 - \advance\dimen2 by \ht\currenttopcolumnbox - \advance\dimen2 by \dp\currenttopcolumnbox - \dimen4=\dimen2 - \advance\dimen4 by \dimen0 - \dimen6=\count255\dimen8 - \ifdim\dimen4>\dimen6 - \else - \let\dogetcolumnstatus=\relax - \fi}% - \dohandleallcolumns{\dogetcolumnstatus}% - \ifnum\count255=0 \count255=1 \fi - #1=\count255 - #2=\dimen4 - #3=\dimen6 } - -\def\docolumnroomfloat% - {\ifnofloatpermitted - \global\roomforfloatfalse - \else - \bgroup - \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\% -\ifgridsnapping\ifnum\count255=\nofcolumns\ifvoid\footins\else - \advance\dimen0 by 1.5\openlineheight % nog nodig ? -\fi\fi\fi - \setbox\scratchbox=\vbox - {\blanko[\@@bkvoorwit] - \snaptogrid\vbox{\copy\floatbox}} - \advance\dimen0 by \ht\scratchbox - \advance\dimen0 by .5\lineheight % needed because goal a bit higher - \ifdim\dimen0>\dimen2 - \global\roomforfloatfalse - \else - \global\roomforfloattrue - \fi - \egroup - \ifdim\wd\floatbox>\hsize - \showmessage{\m!columns}{11}{}% - \global\roomforfloatfalse - \fi - \fi} - -%D Flushing one float is done as soon as possible, i.e. -%D \type{\everypar}. This means that (at the moment) -%D sidefloats are not supported (overulled)! - -\newif\ifflushingcolumnfloats \flushingcolumnfloatstrue - -\def\doflushcolumnfloat% - {\ifflushingcolumnfloats\ifprocessingverbatim\else\ifsomefloatwaiting - \bgroup - \forgetall - \let\doflushcolumnfloat=\relax - \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\% - \ifdim\dimen0>\!!zeropoint - \dogetfloat - \ifdim\wd\floatbox>\hsize - \doresavefloat - \else - \setbox2=\vbox - {\blanko[\@@bkvoorwit] - \snaptogrid\vbox{\copy\floatbox}% - \blanko[\@@bknawit]}% - \advance\dimen0 by \ht2 - \ifdim\dimen0>\dimen2 - \showmessage{\m!columns}{12}{}% - \ifnum\count255<\nofcolumns - \advance\count255 by 1 - \edef\currenttopcolumnbox{\getvalue{\@@topcol\the\count255}}% - \ifdim\ht\currenttopcolumnbox=\!!zeropoint - \global\setbox\currenttopcolumnbox=\vbox - {\snaptogrid\vbox{\copy\floatbox} - \witruimte % nodig ? - \blanko[\@@bknawit]}% - \dimen4=\ht\currenttopcolumnbox - \advance\dimen4 by \dp\currenttopcolumnbox - \global\advance\vsize by -\dimen4 - \advance\dimen4 by -\pagegoal - \global\pagegoal=-\dimen4 - \else - \doresavefloat - \fi - \else - \doresavefloat - \fi - \else - \ifhmode{\setbox0=\lastbox}\fi% waar is die er in geslopen - \par - \ifdim\prevdepth<\!!zeropoint\relax % anders bovenaan kolom witruimte - \else - \blanko[\@@bkvoorwit] - \fi - \flushfloatbox - \blanko[\@@bknawit] - \fi - \fi - \fi - \egroup - \fi\fi\fi} - -%D This one looks complicated. Upto \type{\nofcolumns} floats -%D are placed, taking the width of a float into account. This -%D routine can be improved on different ways: -%D -%D \startopsomming[intro,opelkaar] -%D \som taking into account some imaginary baseline, just to -%D get the captions in line -%D \som multipass flushing until as many floats are displaced -%D as possible -%D \stopopsomming -%D -%D When handling lots of (small) floats spacing can get worse -%D because of lining out the columns. - -\def\doflushcolumnfloats% - {\bgroup - \forgetall -% \ifnum\savednoffloats>1\relax % no \ifsomefloatwaiting -% \ifnum\savednoffloats>0\relax % no - \ifsomefloatwaiting - \dimen8=\!!zeropoint - \dimen4=\!!zeropoint - \count0=0 % count0 can be used local - \count2=\nofcolumns % count2 can be used local - \dohandleallcolumns - {\ifnum\count0>0\relax % the wide one's reserved space - \global\setbox\currenttopcolumnbox=\vbox - {\snaptogrid\hbox{\vphantom{\copy\floatbox}}% - \witruimte - \blanko[\@@bknawit]}% - \else - \dogetfloat - \ifdim\wd\floatbox>\hsize - \dimen0=\wd\floatbox - \advance\dimen0 by \intercolumnwidth - \dimen2=\hsize - \advance\dimen2 by \intercolumnwidth - \divide\dimen0 by \dimen2 - \count0=\dimen0 - \advance\count0 by 1 - \ifnum\count0>\count2 - \doresavefloat - \count0=0 - \else - \dimen0=\count0\hsize - \advance\dimen0 by \count0\intercolumnwidth - \advance\dimen0 by -\intercolumnwidth - \global\setbox\floatbox=\hbox to \dimen0 - {\hss\hbox{\copy\floatbox}\hss}% - \fi - \showmessage{\m!columns}{13}{}% - \else - % \showmessage{\m!columns}{13}{}% - \fi - \ifdim\ht\floatbox>\!!zeropoint\relax - \global\setbox\currenttopcolumnbox=\vbox - {\snaptogrid\vbox{\copy\floatbox} - \witruimte % nodig ? - \blanko[\@@bknawit]}% - \fi - \dimen6=\ht\currenttopcolumnbox - \advance\dimen6 by \dp\currenttopcolumnbox - \fi - \ifdim\dimen4<\ht\currenttopcolumnbox - \dimen4=\ht\currenttopcolumnbox - \fi - \advance\dimen8 by \dimen6 - \advance\count2 by -1 - \advance\count0 by -1\relax}% - \setvsize - \global\advance\vsize by -\dimen8 - \global\pagegoal=\vsize - \else - \doflushfloats - \fi - \egroup} - -%D This were the multi||column routines. They can and need to -%D be improved but at the moment their behaviour is acceptable. -%D -%D One inprovement can be to normalize the height of floats -%D to $n\times$\type{\lineheight} with a macro like: -%D -%D \starttypen -%D \normalizevbox{...} -%D \stoptypen - -\protect - -\endinput +%D \module
+%D [ file=supp-mul,
+%D version=1998.03.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Multi Column Output,
+%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 Core Macros / Multi Column Output}
+
+\unprotect
+
+%D This one will become core-mul.tex!
+
+%D The following macro's implement a multi||column output
+%D routine. The original implementation was based on Donald
+%D Knuth's implementation, which was adapted by Craig Platt to
+%D support balancing of the last page. I gradually adapted
+%D Platt's version to our needs but under certain
+%D circumstances things still went wrong. I considered all
+%D calls to Platt's \type{\balancingerror} as undesirable.
+
+\startmessages dutch library: columns
+ title: kolommen
+ 1: maximaal -- kolommen
+ 2: gebruik eventueel \string\filbreak
+ 3: probleempje, probeer [balanceren=nee]
+ 4: plaatsblok boven nog niet mogelijk
+ 5: plaatsblok onder nog niet mogelijk
+ 6: -- plaatsblok(en) opgeschort
+ 7: balanceren afgebroken na 100 stappen
+ 8: gebalanceerd in -- stap(pen)
+ 9: uitlijnen controleren!
+ 10: (minder dan) 1 regel over
+ 11: plaatsblok te breed voor kolom
+ 12: plaatsblok verplaatst naar volgende kolom
+ 13: breed figuur geplaatst boven kolommen
+\stopmessages
+
+\startmessages english library: columns
+ title: columns
+ 1: only -- columns possible
+ 2: use \string\filbreak\space as alternative
+ 3: problems, disable balancing
+ 4: top float not yet supported
+ 5: bottom float not yet supported
+ 6: -- float(s) postponed
+ 7: balancing aborted after 100 steps
+ 8: balanced in -- step(s)
+ 9: check raggedness
+ 10: (less than) 1 line left
+ 11: float to wide for column
+ 12: float moved to next column
+ 13: wide float moved to top of columns
+\stopmessages
+
+\startmessages german library: columns
+ title: Spalten
+ 1: nur -- Spalten moeglich
+ 2: benutzte \string\filbreak\space als Alternative
+ 3: Problem, verwende [ausgleich=nein]
+ 4: Gleitobjekt oben ncoh nicht unterstuetzt
+ 5: Gleitobjekt unten ncoh nicht unterstuetzt
+ 6: -- Gleitobjekt(e) verschoben
+ 7: ausgleich nach 100 Schritten abgebrocheb
+ 8: ausgeglichen nach -- Schritt(en)
+ 9: Ausrichtung ueberpruefen
+ 10: (weniger als) 1 Zeile uebrig
+ 11: Gleitobjekt zu breit fuer Spalte
+ 12: Gleitobjekt in naechste Zeile verschoben
+ 13: breites Gleitobjekt an den Anfang der Spalten verschoben
+\stopmessages
+
+%D This completely new implementation can handle enough
+%D situations for everyday documents, but is still far from
+%D perfect. While at the moment the routine doesn't support
+%D all kind of floats, it does support:
+%D
+%D \startopsomming[opelkaar]
+%D \som an unlimitted number of columns
+%D \som ragged or not ragged bottoms
+%D \som optional balancing without \type{\balancingerrors}
+%D \som different \type{\baselineskips}, \type{\spacing},
+%D \type{\topskip} and \type{\maxdepth}
+%D \som left- and right indentation, e.g. within lists
+%D \som moving columns floats to the next column or page
+%D \som handling of floats that are to wide for a columns
+%D \stopopsomming
+%D
+%D One could wonder why single and multi||columns modes are
+%D still separated. One reason for this is that \TeX\ is not
+%D suited well for handling multi||columns. As a result, the
+%D single columns routines are more robust. Handling one
+%D column as a special case of multi||columns is posible but at
+%D the cost of worse float handling, worse page breaking,
+%D worse etc. Complicated multi||column page handling should
+%D be done in \kap{DTP}||systems anyway.
+%D
+%D There are three commands provided for entering and leaving
+%D multi||column mode and for going to the next column:
+%D
+%D \interface \type{\beginmulticolumns} \\ \\
+%D \interface \type{\endmulticolumns} \\ \\
+%D \interface \type{\ejectcolumn} \\ \\
+%D
+%D This routines are sort of stand||alone. They communicate
+%D with the rest of \CONTEXT\ by means of some interface
+%D macro's, which we only mention.
+%D
+%D \interface \type{\nofcolumns} \\
+%D the number of columns \\
+%D \interface \type{\betweencolumns} \\
+%D the stuff between columns \\
+%D \interface \type{\finaloutput{action}{box}} \\
+%D some kind of \type{\pagebody} and \type{\shipout} \\
+%D
+%D \interface \type{\ifbalancecolumns} \\
+%D balancing the colums or not \\
+%D \interface \type{\ifstretchcolumns} \\
+%D ragging the bottom or not \\
+%D
+%D \interface \type{\ifheightencolumns} \\
+%D fix the heigh tor not \\
+%D \interface \type{\fixedcolumnheight} \\
+%D the optional fixed height \\
+%D
+%D \interface \type{\ifinheritcolumns} \\
+%D handle ragging or not \\
+%D \interface \type{\ifr@ggedbottom} \\
+%D use ragged bottoms \\
+%D \interface \type{\ifb@selinebottom} \\
+%D put the bottom line on the baseline \\
+%D \interface \type{\ifnormalbottom} \\
+%D put the bottom line at the baseline \\
+%D
+%D \interface \type{\usercolumnwidth} \\
+%D the calculated width of a column \\
+%D \interface \type{\columntextwidth} \\
+%D the maximum width of a column \\
+%D \interface \type{\columntextheight} \\
+%D the minimum width of a column \\
+%D
+%D \interface \type{\spacingfactor} \\
+%D the spacing factor \\
+%D \interface \type{\bodyfontsize} \\
+%D the (local) bodyfontsize \\
+%D \interface \type{\openlineheight} \\
+%D the lineheight (including \type{\spacing}) \\
+%D
+%D \interface \type{\Everybodyfont} \\
+%D communication channel to font switching routines \\
+%D
+%D \interface \type{\global\settopskip} \\
+%D set \type{\topskip} \\
+%D \interface \type{\setcolumnwarnings} \\
+%D set \type{\badness} and \type{\fuzz} \\
+%D \interface \type{\setcolumninserts} \\
+%D set \type{\insert}'s \\
+%D \interface \type{\setvsize} \\
+%D set \type{\vsize} and \type{\pagegoal} \\
+%D \interface \type{\sethsize} \\
+%D set \type{\hsize} \\
+%D
+%D \interface \type{\flushcolumnfloats} \\
+%D push saved column floats (next page) \\
+%D \interface \type{\flushcolumnfloat} \\
+%D push saved column floats (next column) \\
+%D \interface \type{\setcolumnfloats} \\
+%D initialize column floats \\
+%D
+%D \interface \type{\finishcolumnbox} \\
+%D do something special (a hook) \\
+%D \interface \type{\postprocesscolumnline} \\
+%D do something with each columnline (also a hook) \\
+%D \interface \type{\currentcolumn} \\
+%D the current column \\
+%D
+%D These interface macro's are called upon or initialized
+%D by the multi||column macro's.
+
+%D A lot of footnote stuff added!
+
+\def\columntextwidth {\zetbreedte}
+\def\columntextheight {\teksthoogte}
+\def\usercolumnwidth {\tekstbreedte}
+
+\def\fixedcolumnheight {\teksthoogte}
+\def\betweencolumns {\hskip\bodyfontsize}
+
+\def\setcolumnwarnings {\dontcomplaincolumnboxes}
+\def\setcolumninserts {\dontpermitcolumninserts}
+
+\def\setcolumnfloats {} % in CONTEXT used for floats
+\def\flushcolumnfloats {} % in CONTEXT used for floats
+\def\flushcolumnfloat {} % in CONTEXT used for floats
+
+\def\finishcolumnbox {} % in CONTEXT used for backgrounds
+
+%D In fact, the column height and width are set by mens of
+%D two macro's. One can change their meaning if needed:
+
+\def\setcolumntextheight%
+ {\def\columntextheight{\teksthoogte}}
+
+\def\setcolumntextwidth% % pas op: geen \teksthoogte, anders steeds smaller
+ {\def\columntextwidth{\zetbreedte}}
+
+%D Both macros are redefined in \CONTEXT\ when backgrounds
+%D are applied to columns.
+
+\newcount\nofcolumns \nofcolumns=2
+
+\def\maxnofcolumns {16}
+\def\allocatednofcolumns {0}
+
+\newif\ifbalancecolumns \balancecolumnsfalse
+\newif\ifstretchcolumns \stretchcolumnsfalse
+\newif\ifinheritcolumns \inheritcolumnsfalse
+\newif\ifheightencolumns \heightencolumnsfalse
+
+\newbox\partialpage
+\newbox\restofpage
+
+\newbox\savedfloatlist
+
+\newdimen\intercolumnwidth
+\newdimen\localcolumnwidth
+\newdimen\partialpageheight
+\newdimen\savedpagetotal
+
+\newtoks\singlecolumnout
+
+%D During initialization the temporary boxes are allocated.
+%D This enables us to use as much columns as we want, without
+%D exhausting the pool of boxes too fast. We could have packed
+%D them in one box, but we've got enough boxes.
+%D
+%D Two sets of boxes are declared, the txtboxes are used for
+%D the text, the topboxes are for moved column floats.
+
+\def\@@txtcol{@@txtcol}
+\def\@@topcol{@@topcol}
+
+\def\initializemulticolumns#1%
+ {\ifnum#1>\maxnofcolumns\relax
+ \showmessage{\m!columns}{1}{\maxnofcolumns}%
+ \nofcolumns=\maxnofcolumns
+ \else
+ \nofcolumns=#1\relax
+ \fi
+ \ifnum\nofcolumns>\allocatednofcolumns\relax
+ \dorecurse
+ {#1}
+ {\ifnum\recurselevel>\allocatednofcolumns\relax
+ \newbox\next
+ \global\letvalue{\@@txtcol\recurselevel}=\next
+ \newbox\next
+ \global\letvalue{\@@topcol\recurselevel}=\next
+ \fi}%
+ \xdef\allocatednofcolumns{\the\nofcolumns}%
+ \fi
+ \edef\firstcolumnbox{\getvalue{\@@txtcol1}}%
+ \edef\firsttopcolumnbox{\getvalue{\@@topcol1}}%
+ \edef\lastcolumnbox{\getvalue{\@@txtcol\the\nofcolumns}}%
+ \edef\lasttopcolumnbox{\getvalue{\@@topcol\the\nofcolumns}}}
+
+%D Without going in details we present two macro's which
+%D handle the columns. The action which is transfered by the
+%D the first and only parameter can do something with
+%D \type{\currentcolumnbox}. In case of the mid columns,
+%D \type{\firstcolumnbox} and \type{\lastcolumnbox} are handled
+%D outside these macro's.
+
+\def\dohandlemidcolumns#1%
+ {\dorecurse
+ {\nofcolumns}
+ {\ifnum\recurselevel>1
+ \ifnum\recurselevel<\nofcolumns\relax
+ \edef\currentcolumnbox{\getvalue{\@@txtcol\recurselevel}}%
+ \edef\currenttopcolumnbox{\getvalue{\@@topcol\recurselevel}}%
+ \let\currentcolumn=\recurselevel
+ #1\relax
+ \fi
+ \fi}}
+
+\def\dohandleallcolumns#1%
+ {\dorecurse
+ {\nofcolumns}
+ {\edef\currentcolumnbox{\getvalue{\@@txtcol\recurselevel}}%
+ \edef\currenttopcolumnbox{\getvalue{\@@topcol\recurselevel}}%
+ \let\currentcolumn=\recurselevel
+ #1\relax}}
+
+%D Going to a new columns is done by means of a
+%D \type{\ejectcolumn}. The following definition does not
+%D always work.
+
+\def\ejectcolumn%
+ {\goodbreak
+ \showmessage{\m!columns}{2}{}}
+
+%D The next macro should never be called so let's deal with it.
+%D There were several solutions to these kind of errors. First
+%D we check for a good breakpoint before firing up the
+%D multi||column routine (\type{\break} or \type{\allowbreak}).
+%D We do the same at the end of the routine
+%D (\type{\allowbreak}). These allowances are definitely
+%D needed!
+%D
+%D Some on first sight redundant calls to for instance
+%D \type{\setvsize} in the flushing, splitting and balancing
+%D macro's can definitely not be omitted! Some are just there
+%D to handle situations that only few times arise. One of
+%D those can be that the output routine is invoked before
+%D everything is taken care of. This happens when we
+%D flush (part of) the current page with an \type{\unvbox}
+%D with a \type{\pagetotal}~$\approx$ \type{\pagegoal}. One
+%D simply cannot balance columns that are just balanced.
+%D
+%D I hope one never sees the following message. Because it
+%D took me a lot of time to develop the multi||columns
+%D routines, every (although seldom) warning gives me the
+%D creeps!
+
+\def\balancingerror%
+ {\showmessage{\m!columns}{3}{}%
+ \finaloutput\unvbox\normalpagebox}
+
+%D Here we present the two \type{\dont...} macro's, which are
+%D of course \CONTEXT||specific ones.
+
+\def\dontcomplaincolumnboxes%
+ {\mindermeldingen}
+
+\def\dontpermitcolumninserts%
+ {\def\dotopfloat%
+ {\showmessage{\m!columns}{4}{}%
+ \doexecfloat}%
+ \def\dobotfloat%
+ {\showmessage{\m!columns}{5}{}%
+ \doexecfloat}}
+
+\def\getinsertionheights\to#1\\% \relax'm
+ {#1=\!!zeropoint
+ \def\doaddinsertionheight##1%
+ {\ifvoid##1\else
+ \advance#1 by \skip##1
+ \advance#1 by \ht##1
+ \fi}%
+ \doaddinsertionheight\topins
+ \doaddinsertionheight\botins
+ \ifcleverfootnotes
+ \doaddinsertionheight\savedfootins
+ \else
+ \doaddinsertionheight\footins
+ \fi}
+
+%D The local column width is available in the dimension
+%D register \type{\localcolumnwidth}, which is calculated as:
+
+\def\setcolumnhsize%
+ {\setbox0=\hbox
+ {\parindent\!!zeropoint\betweencolumns}%
+ \intercolumnwidth=\wd0
+ \localcolumnwidth=\columntextwidth
+ \edef\globalcolumnwidth{\the\localcolumnwidth}%
+ \advance\localcolumnwidth by -\leftskip
+ \advance\localcolumnwidth by -\rightskip
+ \advance\localcolumnwidth by -\nofcolumns\intercolumnwidth
+ \advance\localcolumnwidth by \intercolumnwidth
+ \divide\localcolumnwidth by \nofcolumns
+ \usercolumnwidth=\localcolumnwidth
+ \hsize=\localcolumnwidth} % we don't do it \global
+
+%D One should be aware that when font related dimensions are
+%D used in typesetting the in||between material, these
+%D dimensions are influenced by bodyfont switches inside
+%D multi||column mode.
+
+%D The global width is saved in \type {\globalcolumnwidth}.
+%D This value is used when we pack the columns in a \type
+%D {\hbox}.
+
+\def\setcolumnvsize%
+ {\global\vsize=\columntextheight
+ \ifdim\partialpageheight>\!!zeropoint
+ \global\advance\vsize by -\partialpageheight
+ \fi
+ \getinsertionheights\to\dimen0\\%
+ \global\advance\vsize by -\dimen0
+\ifgridsnapping % evt altijd, nog testen
+ \getnoflines\vsize
+ \vsize=\noflines\openlineheight
+ \advance\vsize by .5\openlineheight % collect enough data
+\fi
+ \global\vsize=\nofcolumns\vsize
+ \global\pagegoal=\vsize} % let's do it only here
+
+%D It really starts here. After some checks and initializations
+%D we change the output routine to continous multi||column
+%D mode. This mode handles columns that fill the current and
+%D next full pages. The method used is (more or less)
+%D multiplying \type{\vsize} and dividing \type{\hsize} by
+%D \type{\nofcolumns}. More on this can be found in the
+%D \TeX book. We save the top of the current page in box
+%D \type{\partialpage}.
+%D
+%D We manipulate \type{\topskip} a bit, just to be shure that
+%D is has no flexibility. This has te be done every time a
+%D font switch takles place, because \type{\topskip} can depend
+%D on this.
+%D
+%D Watch the trick with the \type{\vbox}. This way we get the
+%D right interlining and white space.
+
+\def\beginmulticolumns%
+ {\par
+ \flushfootnotes
+ \begingroup
+ \dontshowcomposition
+ \setcolumntextwidth\relax
+ \setcolumntextheight\relax
+ \widowpenalty=0 % is gewoon beter
+ \clubpenalty=0 % zeker bij grids
+ \ifsomefloatwaiting
+ \showmessage{\m!columns}{6}{\the\savednoffloats}%
+ \global\setbox\savedfloatlist=\box\floatlist
+ \xdef\restoresavedfloats%
+ {\global\savednoffloats=\the\savednoffloats
+ \global\setbox\floatlist=\box\savedfloatlist
+ \global\noexpand\somefloatwaitingtrue}%
+ \global\savednoffloats=0
+ \global\somefloatwaitingfalse
+ \else
+ \global\let\restoresavedfloats=\relax
+ \fi
+ \dimen0=\pagetotal
+ \advance\dimen0 by \parskip
+ \advance\dimen0 by \openlineheight
+ \ifdim\dimen0<\pagegoal
+ \allowbreak
+ \else
+ % \break Werkt in veel gevallen averechts!
+ \fi
+ \appendtoks\topskip=1\topskip\to\everybodyfont
+ \the\everybodyfont
+ \initializemulticolumns\nofcolumns
+ \setcolumninserts
+ \hangafter=0
+ \hangindent=\!!zeropoint
+ \everypar{}%
+ \ifdim\pagetotal=\!!zeropoint \else
+ \vbox{\strut}%
+ \vskip-\openlineheight
+ \fi
+ \global\savedpagetotal=\pagetotal
+ \global\singlecolumnout=\output
+ \global\output={\global\setbox\partialpage=\vbox{\unvbox\normalpagebox}}%
+ \eject
+ \global\partialpageheight=\ht\partialpage
+ \global\output={\continuousmulticolumnsout}%
+ \setcolumnfloats
+ \dohandleallcolumns
+ {\global\setbox\currenttopcolumnbox=\box\voidb@x}%
+ \checkbegincolumnfootnotes
+ \let\sethsize=\setcolumnhsize
+ \let\setvsize=\setcolumnvsize
+ \sethsize
+ \setvsize
+ \showcomposition}
+
+%D When we leave the multi||column mode, we have to process the
+%D not yet shipped out part of the columns. When we don't
+%D balance, we simply force a continuous output, but a balanced
+%D output is more tricky.
+%D
+
+%D First we try to fill up the page and when all or something
+%D is left we try to balance things. This is another useful
+%D adaption of the ancesters of these macro's. It takes some
+%D reasoning to find out what happens and maybe I'm making
+%D some mistake, but it works.
+%D
+%D Unvoiding box \type{\partialpage} is sometimes necessary,
+%D e.g. when there is no text given between \type{\begin..}
+%D and \type{\end..}. The \type{\par} is needed!
+
+\def\endmulticolumns%
+ {\dontshowcomposition
+ \doflushcolumnfloats % added recently
+ \par
+ \ifbalancecolumns
+ \global\output={\continuousmulticolumnsout}%
+ \goodbreak
+ \global\output={\balancedmulticolumnsout}%
+ \else
+ \goodbreak
+ \fi
+ \eject % the prevdepth is important, try e.g. toclist in
+ \prevdepth\!!zeropoint % columns before some noncolumned text text
+ \global\output=\singlecolumnout
+ \ifvoid\partialpage\else
+ \unvbox\partialpage
+ \fi
+ \global\partialpageheight=\!!zeropoint
+ \endgroup % here
+ \nofcolumns=1
+ \setvsize % the outer one!
+ \checkendcolumnfootnotes
+ \dosomebreak\allowbreak
+ \restoresavedfloats}
+
+%D NEW: still to be documented!
+
+\newinsert\savedfootins
+
+\def\checkbegincolumnfootnotes%
+ {\ifcleverfootnotes
+ \doflushfootnotes
+ \ifdim\ht\footins>\!!zeropoint
+ \global\setbox\savedfootins=\box\footins
+ \else
+ \global\setbox\savedfootins=\box\voidb@x
+ \fi
+ \global\skip\savedfootins=\skip\footins
+ \global\count\savedfootins=\count\footins
+ \setupfootnotes
+ \else
+ \global\skip\savedfootins=\skip\footins
+ \global\setbox\savedfootins=\box\voidb@x
+ \global\count\savedfootins=\count\footins
+ \setupfootnotes
+\global\multiply\count\footins by \nofcolumns % gaat mis bij lokale
+ \fi}
+
+\def\checkendcolumnfootnotes%
+ {\ifcleverfootnotes\ifvoid\savedfootins\else
+ \global\setbox\footins=\box\savedfootins
+ \fi\fi
+ \global\skip\footins=\skip\savedfootins
+ \global\count\footins=\count\savedfootins}
+
+%D Because some initializations happen three times, we
+%D defined a macro for them. The \type{\everypar{}} is
+%D needed because we don't want anything to interfere.
+
+\def\setmulticolumnsout%
+ {\everypar{}%
+ \setcolumnwarnings
+ \settopskip
+ \setmaxdepth
+ \topskip=1\topskip
+ \splittopskip=\topskip
+ \splitmaxdepth=\maxdepth
+ \boxmaxdepth=\maxdepth
+ \emergencystretch=\!!zeropoint\relax} % sometimes needed !
+
+%D Flushing the page comes to pasting the columns together and
+%D appending the result to box \type{\partialpage}, if not
+%D void. I've seen a lot of implementations in which some skip
+%D was put between normal text and multi||column text. When we
+%D don't want this, the baselines can be messed up. I hope the
+%D seemingly complicated calculation of a correction
+%D \type{\kern} is adequate to overcome this. Although not
+%D watertight, spacing is taken into account and even multiple
+%D mode changes on one page go well. But cross your fingers and
+%D don't blame me.
+%D
+%D One of the complications of flushing out the boxes is that
+%D \type{\partialpage} needs to be \type{\unvbox}'ed, otherwise
+%D there is too less flexibility in the page when using
+%D \type{\r@ggedbottom}. It took a lot of time before these
+%D kind of problems were overcome. Using \type{\unvbox} at the
+%D wrong moment can generate \type{\balancingerror}'s.
+%D
+%D One can use the macros \type {\maxcolumnheight} and \type
+%D {\maxcolumndepth} when generating material between columns
+%D as well as postprocessing column lines.
+
+\let\maxcolumnheight=\!!zeropoint
+\let\maxcolumndepth =\!!zeropoint
+
+\def\setmaxcolumndimensions%
+ {\let\maxcolumnheight=\!!zeropoint
+ \let\maxcolumndepth =\!!zeropoint
+ \dohandleallcolumns
+ {\ifdim\ht\currentcolumnbox>\maxcolumnheight
+ \edef\maxcolumnheight{\the\ht\currentcolumnbox}%
+ \fi
+ \ifdim\dp\currentcolumnbox>\maxcolumndepth
+ \edef\maxcolumndepth{\the\dp\currentcolumnbox}%
+ \fi}}
+
+\def\flushcolumnedpage%
+ {\bgroup
+ \forgetall
+ \setmulticolumnsout
+ \showcomposition
+ \setmaxcolumndimensions
+ \postprocesscolumns
+ \dohandleallcolumns % \hbox i.v.m. \showcomposition
+ {\global\setbox\currentcolumnbox=\hbox to \localcolumnwidth
+ {\box\currentcolumnbox
+ \global\wd\currentcolumnbox=\localcolumnwidth
+ \ifheightencolumns
+ \global\ht\currentcolumnbox=\fixedcolumnheight
+ \fi}}%
+ \setmaxcolumndimensions
+ \overlaycolumnfootnotes
+ \setbox0=\vbox
+ {\hbox to \globalcolumnwidth
+ {\dohandleallcolumns
+ {\finishcolumnbox{\hbox{\box\currentcolumnbox}}%
+ \ifnum\currentcolumn<\nofcolumns
+ \hfil\betweencolumns\hfil
+ \fi}}}%
+ \dohandleallcolumns
+ {\global\setbox\currenttopcolumnbox=\box\voidb@x}%
+ \ifvoid\partialpage \else
+ \ifgridsnapping % do you believe this junk?
+ \scratchdimen=\savedpagetotal
+ \advance\scratchdimen by -\ht\partialpage
+ \advance\scratchdimen by -\dp\partialpage
+ \advance\scratchdimen by -\topskip
+ \box\partialpage
+ \kern\scratchdimen
+ \else
+ \unvbox\partialpage
+ \fi
+ \fi
+ \global\partialpageheight=\!!zeropoint
+ \setvsize
+ \dosomebreak\nobreak
+ \dp0=\!!zeropoint
+ \prevdepth\openstrutdepth % \dp\strutbox
+ \nointerlineskip
+ \box0
+ \egroup}
+
+%D In case one didn't notice, finaly \type{\finishcolumnbox} is
+%D applied to all boxes. One can use this hook for special
+%D purposes. But there is more:
+%D
+%D Once upon a time I wanted to manipulate the individual lines
+%D in a column. This feature is demonstrated in the two examples
+%D below.
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1%
+%D {\ruledhbox{#1}\hss}
+%D
+%D \startkolommen[n=4]
+%D \dorecurse{25}{line: \recurselevel\par}
+%D \stopkolommen
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we show the natural width of the lines:
+%D
+%D {\haalbuffer}
+%D
+%D The next example does a bit more advanced manipulation:
+%D
+%D \startbuffer
+%D \def\postprocesscolumnline#1%
+%D {\ifodd\currentcolumn
+%D \hfill#1\relax
+%D \else
+%D \relax#1\hfill
+%D \fi}
+%D
+%D \startkolommen[n=4]
+%D \dorecurse{25}{line \recurselevel\par}
+%D \stopkolommen
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we also see an application of \type{\currentcolumn}:
+%D
+%D {\haalbuffer}
+%D
+%D This feature is implemented using the reshape macros
+%D presented in \type{supp-box}.
+
+\def\postprocesscolumns% recent extension
+ {\ifx\postprocesscolumnline\undefined \else
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox=\vtop
+ {\beginofshapebox
+ \unvbox\currentcolumnbox
+ \unskip\unskip
+ \endofshapebox
+ \reshapebox
+ {\dimen0=\ht\shapebox
+ \dimen2=\dp\shapebox
+ \setbox\shapebox=\hbox to \hsize
+ {\postprocesscolumnline{\unhbox\shapebox}}%
+ \ht\shapebox=\dimen0
+ \dp\shapebox=\dimen2
+ \box\shapebox}%
+ \flushshapebox
+ \everypar{}\parskip\!!zeropoint % = \forgetall
+ \strut\endgraf
+ \vskip-\lineheight
+ \vfil}}%
+ \fi}
+
+%D We default to doing nothing!
+
+\let\postprocesscolumnline=\undefined
+
+%D Here comes the simple splitting routine. It's a bit
+%D longer than expected because of ragging bottoms or not.
+%D This part can be a bit shorter but I suppose that I will
+%D forget what happens. The splitting takes some already
+%D present material (think of floats) into account!
+%D
+%D First we present some auxiliary routines. Any material,
+%D like for instance floats, that is already present in the
+%D boxes is preserved.
+
+% \def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
+% {\bgroup
+% \ifdim\ht#4>\!!zeropoint
+% \dimen0=\dimen#3\relax
+% \dimen2=\dimen#3\relax
+% \advance\dimen0 by -\ht#4
+% \setbox0=\vsplit#2 to \dimen0
+% \global\setbox#1=\vbox to \dimen2{\unvcopy#4\unvbox0}%
+% \else
+% \global\setbox#1=\vsplit#2 to \dimen#3
+% \fi
+% \egroup}
+
+% \def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
+% {\bgroup
+% \ifdim\ht#4>\!!zeropoint
+% \dimen0=\dimen#3\relax
+% \dimen2=\dimen2
+% \advance\dimen0 by -\ht#4%
+% \columnfootnotecorrection{#1}{\dimen0}%
+% \setbox0=\vsplit#2 to \dimen0
+% \global\setbox#1=\vbox to \dimen2
+% {\ifgridsnapping
+% \dimen0=-\openstrutheight\advance\dimen0 by \topskip
+% \vskip\dimen0\copy#4\vskip-\dimen0
+% \else
+% \unvcopy#4%
+% \fi
+% \unvbox0
+% \fakecolumnfootnotes{#1}}%
+% \else
+% \ifcleverfootnotes
+% \columnfootnotecorrection{#1}{\dimen#3}%
+% \setbox0=\vsplit#2 to \dimen#3%
+% \global\setbox#1=\vbox to \dimen#3%
+% {\unvbox0
+% \fakecolumnfootnotes{#1}}%
+% \else
+% \global\setbox#1=\vsplit#2 to \dimen#3%
+% \fi
+% \fi
+% \egroup}
+
+\def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
+ {\bgroup
+ \ifdim\ht#4>\!!zeropoint
+ \dimen0=\dimen#3\relax
+ \dimen2=\dimen2
+ \advance\dimen0 by -\ht#4%
+ \columnfootnotecorrection{#1}{\dimen0}%
+ \setbox0=\vsplit#2 to \dimen0
+ \global\setbox#1=\vbox to \dimen2
+ {\ifgridsnapping
+ \dimen0=-\openstrutheight\advance\dimen0 by \topskip
+ \vskip\dimen0\copy#4\vskip-\dimen0
+ \else
+ \unvcopy#4%
+ \fi
+ \fuzzysnappedbox\unvbox0
+ \fakecolumnfootnotes{#1}}%
+ \else
+ \ifcleverfootnotes
+ \columnfootnotecorrection{#1}{\dimen#3}%
+ \setbox0=\vsplit#2 to \dimen#3%
+ \global\setbox#1=\vbox to \dimen#3%
+ {\fuzzysnappedbox\unvbox0
+ \fakecolumnfootnotes{#1}}%
+ \else
+ \global\setbox#1=\vsplit#2 to \dimen#3%
+ \global\setbox#1=\vbox
+ {\fuzzysnappedbox\unvbox{#1}}% % or \box ?
+ \fi
+ \fi
+ \egroup}
+
+\def\splitcurrentcolumn from \box#1to \dimen#2%
+ {\splitcolumn\currentcolumnbox from \box#1 to \dimen#2 top \box\currenttopcolumnbox}
+
+\def\splitfirstcolumn from \box#1to \dimen#2%
+ {\splitcolumn\firstcolumnbox from \box#1 to \dimen#2 top \box\firsttopcolumnbox}
+
+% \def\splitlastcolumn from \box#1to \dimen#2%
+% {\global\setbox\lastcolumnbox=\vbox
+% {\unvcopy\lasttopcolumnbox
+% \unvbox#1}}
+
+% \def\splitlastcolumn from \box#1to \dimen#2%
+% {\global\setbox\lastcolumnbox=\vbox
+% {\unvcopy\lasttopcolumnbox
+% \unvbox#1
+% \fakecolumnfootnotes\lastcolumnbox}}
+
+\def\splitlastcolumn from \box#1to \dimen#2%
+ {\global\setbox\lastcolumnbox=\vbox
+ {\unvcopy\lasttopcolumnbox
+ \fuzzysnappedbox\unvbox{#1}%
+ \fakecolumnfootnotes\lastcolumnbox}}
+
+%D NEW: still to be documented.
+
+\def\fakecolumnfootnotes#1%
+ {\relax
+ \ifcleverfootnotes
+ \ifnum#1=\lastcolumnbox
+ \ifdim\ht\footins>\!!zeropoint
+ \vskip\skip\footins
+ \vskip\ht\footins
+ \fi
+ \fi
+ \fi}
+
+\def\columnfootnotecorrection#1#2%
+ {\relax
+ \ifcleverfootnotes
+ \ifnum#1=\lastcolumnbox\relax
+ \ifdim\ht\footins>\!!zeropoint
+ \advance#2 by -\ht\footins
+ \advance#2 by -\skip\footins
+ \fi
+ \fi
+ \fi}
+
+\def\overlaycolumnfootnotes% VERVANGEN !!!
+ {\relax
+ \ifcleverfootnotes\ifdim\ht\footins>\!!zeropoint
+ \bgroup
+ %\ifgridsnapping
+ \scratchdimen=\ht\firstcolumnbox
+ \advance\scratchdimen by -\openstrutdepth % \dp\strutbox
+ \getnoflines\scratchdimen
+ \advance\noflines by -2
+ \scratchdimen=\noflines\lineheight
+ \advance\scratchdimen by \topskip
+ \setbox0=\hbox
+ {\lower\scratchdimen\vbox{\placefootnoteinserts}}%
+ \ht0=\openstrutheight % \ht\strutbox
+ \dp0=\openstrutdepth % \dp\strutbox
+ \scratchdimen=\ht\lastcolumnbox
+ \global\setbox\lastcolumnbox=\vbox to \scratchdimen
+ {\box\lastcolumnbox
+ \vskip-\scratchdimen
+ \box0}%
+ %\else
+ % \setbox0=\vbox to \ht\lastcolumnbox
+ % {\vfill\placefootnoteinserts}%
+ % \scratchdimen=\wd\lastcolumnbox
+ % \wd0=\wd\lastcolumnbox
+ % \wd\lastcolumnbox=\!!zeropoint
+ % \global\setbox\lastcolumnbox=\hbox
+ % {\box\lastcolumnbox\box0}%
+ %\fi
+ \egroup
+ \fi\fi}
+
+
+%D Here comes the routine that splits the long box in columns.
+%D The macro \type{\flushcolumnfloats} can be used to flush
+%D either floats that were present before the multi||column
+%D mode was entered, or floats that migrate to next columns.
+%D Flushing floats is a delicate process.
+
+\def\continuousmulticolumnsout%
+ {\bgroup
+ \setmulticolumnsout
+ \dontshowcomposition
+% \dimen0=\columntextheight
+% \advance\dimen0 by -\partialpageheight
+% \getinsertionheights\to\dimen2\\% toegevoegd ivm voetnoten
+% \ifgridsnapping
+% \getnoflines{\dimen2}%
+% \advance\dimen0 by -\noflines\openlineheight
+%\getnoflines{\dimen0}\dimen0=\noflines\openlineheight
+% \else
+% \advance\dimen0 by -\dimen2
+% \fi
+%
+ \dimen0=\columntextheight
+ \getinsertionheights\to\dimen2\\% toegevoegd ivm voetnoten
+ \advance\dimen2 by \partialpageheight
+ \ifgridsnapping
+ \getnoflines{\dimen2}%
+ \advance\dimen0 by -\noflines\openlineheight
+ \getnoflines{\dimen0}%
+ \dimen0=\noflines\openlineheight
+ \else
+ \advance\dimen0 by -\dimen2
+ \fi
+%
+ \dohandleallcolumns
+ {\splitcurrentcolumn from \box\normalpagebox to \dimen0}
+ \setbox\restofpage=\vbox{\unvbox\normalpagebox}%
+ \ifinheritcolumns
+ \ifr@ggedbottom
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox=\vbox to \dimen0
+ {\dimen0=\dp\currentcolumnbox
+ \unvbox\currentcolumnbox
+ \vskip-\dimen0
+ \vskip\openstrutdepth % \dp\strutbox
+ \prevdepth\openstrutdepth % \dp\strutbox
+ \vfill}}%
+ \fi
+ \ifn@rmalbottom
+ \advance\dimen0 by \maxdepth
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox=\vbox to \dimen0
+ {\unvbox\currentcolumnbox}}%
+ \fi
+ \ifb@selinebottom
+ % the columns are on top of the baseline
+ \fi
+ \else
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox=\vbox to \dimen0
+ {\ifstretchcolumns
+ \unvbox\currentcolumnbox
+ \else
+ \unvbox\currentcolumnbox % wel of niet \unvbox ?
+ \vfill
+ \fi}}%
+ \dohandleallcolumns
+ {\global\ht\currentcolumnbox=\dimen0}%
+ \fi
+ \setbox\partialpage=\vbox{\flushcolumnedpage}%
+ \finaloutput\box\partialpage
+ \sethsize
+ \setvsize
+ \flushcolumnfloats
+ \unvbox\restofpage
+ % \penalty\outputpenalty % gaat gruwelijk mis in opsommingen
+ \egroup}
+
+%D And this is the balancing stuff. Again, part of the routine
+%D is dedicated to handling ragged bottoms, but here we also
+%D see some handling concerning the stretching of columns.
+%D We set \type{\widowpenalty} at~0, which enables us to
+%D balance columns with few lines. The use of \type{\box2} and
+%D \type{\box4} garantees a more robust check when skips are
+%D used.
+
+\def\balancedmulticolumnsout%
+ {\bgroup
+ \setmulticolumnsout
+ \dontshowcomposition
+ \widowpenalty=0
+ \setbox0=\vbox{\unvbox\normalpagebox}%
+ \ifdim\ht0>\openlineheight
+ \dimen0=\ht0
+ \advance\dimen0 by \topskip
+ \advance\dimen0 by -\baselineskip
+ \divide\dimen0 by \nofcolumns
+ \vbadness=\!!tenthousand\relax
+ \count255=0
+ \bgroup
+ \ifgridsnapping
+ \dimen2=\lineheight
+ \else
+ \dimen2=\!!onepoint % RUBISH
+ \dimen2=\spacingfactor\dimen2
+ \fi
+ \loop
+ \advance\count255 by 1
+ \global\setbox\restofpage=\copy0\relax
+ \splitfirstcolumn from \box\restofpage to \dimen0
+ \dohandlemidcolumns
+ {\splitcurrentcolumn from \box\restofpage to \dimen0}%
+ \splitlastcolumn from \box\restofpage to \dimen0
+ \setbox2=\vbox{\unvcopy\firstcolumnbox}%
+ \dimen4=\!!zeropoint
+ \dohandleallcolumns
+ {\setbox4=\vbox{\unvcopy\currentcolumnbox}%
+ \dimen6=\ht4
+ \ifdim\dimen6>\dimen4 \dimen4=\dimen6\fi}%
+ \ifnum\count255>100\relax
+ \donefalse
+ \else\ifdim\dimen4>\ht2
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \advance\dimen0 by \dimen2\relax
+ \repeat
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox=\vbox{\unvcopy\currentcolumnbox}}% NIEUW
+ \ifnum\count255>100\relax
+ \showmessage{\m!columns}{7}{}%
+ \else
+ \showmessage{\m!columns}{8}{\the\count255\space}%
+ \fi
+ \egroup
+ \ifinheritcolumns
+ \dimen0=\ht\firstcolumnbox
+ \dimen2=\ht\firstcolumnbox
+ \advance\dimen2 by -\openlineheight
+ \dohandleallcolumns
+ {\dimen4=\ht\currentcolumnbox
+ \dimen6=10\openlineheight
+ \global\setbox\currentcolumnbox=\vbox to \dimen0
+ {\unvbox\currentcolumnbox
+ \ifdim\dimen4>\dimen6
+ \ifdim\dimen4<\dimen0
+ \ifdim\dimen4>\dimen2
+ \vskip\!!zeropoint % !!
+ \else
+ \vskip\openlineheight
+ \vfill
+ \fi
+ \else
+ \vskip\!!zeropoint
+ \fi
+ \else
+ \vskip\openlineheight
+ \vfill
+ \fi}}%
+ \else
+ \bgroup
+ \ifstretchcolumns
+ \dimen0=\ht\firstcolumnbox
+ \dimen2=\bottomtolerance\ht\firstcolumnbox
+ \setbox0=\vbox{\unvcopy\lastcolumnbox}%
+ \advance\dimen0 by -\ht0\relax
+ \advance\dimen0 by -\dp0\relax
+ \ifdim\dimen0>\openlineheight\relax
+ \ifdim\dimen0>\dimen2\relax
+ % \stretchcolumnsfalse % beter goed slecht dan slecht goed
+ \showmessage{\m!columns}{9}{}%
+ \fi
+ \fi
+ \fi
+ \dohandleallcolumns
+ {\global\setbox\currentcolumnbox=\vbox to \ht\firstcolumnbox
+ {\ifstretchcolumns
+ \unvbox\currentcolumnbox
+ \else
+ \box\currentcolumnbox
+ \vfill
+ \fi}}%
+ \egroup
+ \fi
+ \else
+ \showmessage{\m!columns}{10}{}%
+ \global\setbox\firstcolumnbox=\vbox{\unvbox0}%
+ \fi
+ \global\output={\balancingerror}%
+ \b@selinebottomtrue % forces depth in separation rule
+ \flushcolumnedpage
+ \allowbreak
+ \egroup}
+
+%D The multicolumn mechanism is incorporated in a \CONTEXT\
+%D interface, which acts like:
+%D
+%D \starttypen
+%D \startcolumns[n=4,balance=no,stretch=no,line=on]
+%D some text
+%D \stopcolumns
+%D \stoptypen
+%D
+%D The setup is optional. The default behaviour of columns
+%D can be set up with:
+%D
+%D \starttypen
+%D \setupcolumns
+%D [n=2,
+%D balance=yes,
+%D stretch=text,
+%D line=off]
+%D \stoptypen
+%D
+%D In this case, stretching is according to the way it's
+%D done outside columns (\type{\inheritcolumnstrue}). Also
+%D we can setup the \type{tolerance} within a column, the
+%D \type{distance} between columns and the fixed
+%D \type{height} of a column.
+
+%D Multi||column output: the float routines
+%D
+%D Here come the routines that handle the placement of column
+%D floats. Floats that are to big migrate to the next
+%D column. Floats that are too wide, migrate to the top of the
+%D next page, where they span as much columns as needed.
+%D Floats that are left over from outside the multi||column
+%D mode are flushed first. In macro \type{\finaloutput} the
+%D topfloats that are left from previous text should be set.
+%D
+%D When there are some floats in the queue, we inhibit the
+%D flushing of floats on top of columns. The number of
+%D waiting floats is preswent in \type{\savednoftopfloats} and
+%D is saved. As long as there are floats waiting, the topfloats
+%D are places as if we are outside multi||column mode. This is
+%D neccessary for e.g. multicolumn lists.
+%D
+%D When all those floats are flushed, we switch to the local
+%D flushing routine.
+
+\def\setcolumnfloats%
+ {\xdef\globalsavednoffloats{\the\savednoffloats}%
+ \ifnum\globalsavednoffloats>0
+ \setglobalcolumnfloats
+ \else
+ \setlocalcolumnfloats
+ \fi}
+
+\def\setglobalcolumnfloats%
+ {\everypar={}%
+ \let\flushcolumnfloat=\relax
+ \let\doroomfloat=\relax
+ \let\flushcolumnfloats=\noflushcolumnfloats}
+
+\def\setlocalcolumnfloats%
+ {\everypar={\flushfootnotes\flushcolumnfloat\flushmargincontents\checkindentation}
+ \let\flushcolumnfloat=\doflushcolumnfloat
+ \let\doroomfloat=\docolumnroomfloat
+ \let\flushcolumnfloats=\doflushcolumnfloats
+ \let\dosetbothinserts=\relax
+ \let\dotopinsertions=\relax}
+
+\def\noflushcolumnfloats%
+ {\bgroup
+ \xdef\localsavednoffloats{\the\savednoffloats}%
+ \global\savednoffloats=\globalsavednoffloats
+ \dotopinsertions
+ \xdef\globalsavenoffloats{\the\savednoffloats}%
+ \ifnum\globalsavednoffloats=0
+ \setlocalcolumnfloats
+ \fi
+ \global\savednoffloats=\localsavednoffloats
+ \egroup}
+
+%D We need to calculate the amount of free space in a columns.
+%D When there is not enough room, we migrate the float to the
+%D next column. These macro's are alternatives (and
+%D look||alikes) of \type{\doroomfloat}. When a float is to
+%D wide, for one column, it is moved to the top of the next
+%D page. Of course such moved floats have to be taken into
+%D account when we calculate the available space. It's a pitty
+%D that such things are no integral part of \TEX.
+
+% \def\getcolumnstatus\column#1\total#2\goal#3\\%
+% {\ifdim\pagegoal<\maxdimen
+% \dimen0=\pagegoal
+% \divide\dimen0 by \nofcolumns
+% \dimen2=\!!zeropoint
+% \count255=0\relax
+% \dimen8=\columntextheight
+% \advance\dimen8 by -\partialpageheight
+% %\advance\dimen8 by -\maxdepth % recently deleted
+% \def\dogetcolumnstatus%
+% {\advance\count255 by 1\relax
+% \advance\dimen2 by \ht\currenttopcolumnbox
+% \advance\dimen2 by \dp\currenttopcolumnbox
+% \dimen4=\dimen2\relax
+% \advance\dimen4 by \pagetotal
+% \dimen6=\count255\dimen8
+% \ifdim\dimen4>\dimen6
+% \else
+% \let\dogetcolumnstatus=\relax
+% \fi}%
+% \dohandleallcolumns{\dogetcolumnstatus}%
+% \ifdim\dimen4=\dimen6
+% \dimen4=\!!zeropoint
+% \advance\count255 by 1
+% \fi
+% #1=\count255
+% #2=\dimen4
+% #3=\dimen6
+% \else
+% #1=1
+% #2=\!!zeropoint
+% #3=\teksthoogte
+% \advance#3 by -\partialpageheight
+% \fi}
+
+\def\getcolumnstatus\column#1\total#2\goal#3\\%
+ {\ifdim\pagegoal<\maxdimen
+ \dimen0=\pagetotal
+ \else
+ \dimen0=\!!zeropoint
+ \fi
+ \dimen2=\!!zeropoint
+ \count255=0
+ \dimen8=\columntextheight
+ \advance\dimen8 by -\partialpageheight
+ \def\dogetcolumnstatus%
+ {\advance\count255 by 1
+ \advance\dimen2 by \ht\currenttopcolumnbox
+ \advance\dimen2 by \dp\currenttopcolumnbox
+ \dimen4=\dimen2
+ \advance\dimen4 by \dimen0
+ \dimen6=\count255\dimen8
+ \ifdim\dimen4>\dimen6
+ \else
+ \let\dogetcolumnstatus=\relax
+ \fi}%
+ \dohandleallcolumns{\dogetcolumnstatus}%
+ \ifnum\count255=0 \count255=1 \fi
+ #1=\count255
+ #2=\dimen4
+ #3=\dimen6 }
+
+\def\docolumnroomfloat%
+ {\ifnofloatpermitted
+ \global\roomforfloatfalse
+ \else
+ \bgroup
+ \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
+\ifgridsnapping\ifnum\count255=\nofcolumns\ifvoid\footins\else
+ \advance\dimen0 by 1.5\openlineheight % nog nodig ?
+\fi\fi\fi
+ \setbox\scratchbox=\vbox
+ {\blanko[\@@bkvoorwit]
+ \snaptogrid\vbox{\copy\floatbox}}
+ \advance\dimen0 by \ht\scratchbox
+ \advance\dimen0 by .5\lineheight % needed because goal a bit higher
+ \ifdim\dimen0>\dimen2
+ \global\roomforfloatfalse
+ \else
+ \global\roomforfloattrue
+ \fi
+ \egroup
+ \ifdim\wd\floatbox>\hsize
+ \showmessage{\m!columns}{11}{}%
+ \global\roomforfloatfalse
+ \fi
+ \fi}
+
+%D Flushing one float is done as soon as possible, i.e.
+%D \type{\everypar}. This means that (at the moment)
+%D sidefloats are not supported (overulled)!
+
+\newif\ifflushingcolumnfloats \flushingcolumnfloatstrue
+
+\def\doflushcolumnfloat%
+ {\ifflushingcolumnfloats\ifprocessingverbatim\else\ifsomefloatwaiting
+ \bgroup
+ \forgetall
+ \let\doflushcolumnfloat=\relax
+ \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
+ \ifdim\dimen0>\!!zeropoint
+ \dogetfloat
+ \ifdim\wd\floatbox>\hsize
+ \doresavefloat
+ \else
+ \setbox2=\vbox
+ {\blanko[\@@bkvoorwit]
+ \snaptogrid\vbox{\copy\floatbox}%
+ \blanko[\@@bknawit]}%
+ \advance\dimen0 by \ht2
+ \ifdim\dimen0>\dimen2
+ \showmessage{\m!columns}{12}{}%
+ \ifnum\count255<\nofcolumns
+ \advance\count255 by 1
+ \edef\currenttopcolumnbox{\getvalue{\@@topcol\the\count255}}%
+ \ifdim\ht\currenttopcolumnbox=\!!zeropoint
+ \global\setbox\currenttopcolumnbox=\vbox
+ {\snaptogrid\vbox{\copy\floatbox}
+ \witruimte % nodig ?
+ \blanko[\@@bknawit]}%
+ \dimen4=\ht\currenttopcolumnbox
+ \advance\dimen4 by \dp\currenttopcolumnbox
+ \global\advance\vsize by -\dimen4
+ \advance\dimen4 by -\pagegoal
+ \global\pagegoal=-\dimen4
+ \else
+ \doresavefloat
+ \fi
+ \else
+ \doresavefloat
+ \fi
+ \else
+ \ifhmode{\setbox0=\lastbox}\fi% waar is die er in geslopen
+ \par
+ \ifdim\prevdepth<\!!zeropoint\relax % anders bovenaan kolom witruimte
+ \else
+ \blanko[\@@bkvoorwit]
+ \fi
+ \flushfloatbox
+ \blanko[\@@bknawit]
+ \fi
+ \fi
+ \fi
+ \egroup
+ \fi\fi\fi}
+
+%D This one looks complicated. Upto \type{\nofcolumns} floats
+%D are placed, taking the width of a float into account. This
+%D routine can be improved on different ways:
+%D
+%D \startopsomming[intro,opelkaar]
+%D \som taking into account some imaginary baseline, just to
+%D get the captions in line
+%D \som multipass flushing until as many floats are displaced
+%D as possible
+%D \stopopsomming
+%D
+%D When handling lots of (small) floats spacing can get worse
+%D because of lining out the columns.
+
+\def\doflushcolumnfloats%
+ {\bgroup
+ \forgetall
+% \ifnum\savednoffloats>1\relax % no \ifsomefloatwaiting
+% \ifnum\savednoffloats>0\relax % no
+ \ifsomefloatwaiting
+ \dimen8=\!!zeropoint
+ \dimen4=\!!zeropoint
+ \count0=0 % count0 can be used local
+ \count2=\nofcolumns % count2 can be used local
+ \dohandleallcolumns
+ {\ifnum\count0>0\relax % the wide one's reserved space
+ \global\setbox\currenttopcolumnbox=\vbox
+ {\snaptogrid\hbox{\vphantom{\copy\floatbox}}%
+ \witruimte
+ \blanko[\@@bknawit]}%
+ \else
+ \dogetfloat
+ \ifdim\wd\floatbox>\hsize
+ \dimen0=\wd\floatbox
+ \advance\dimen0 by \intercolumnwidth
+ \dimen2=\hsize
+ \advance\dimen2 by \intercolumnwidth
+ \divide\dimen0 by \dimen2
+ \count0=\dimen0
+ \advance\count0 by 1
+ \ifnum\count0>\count2
+ \doresavefloat
+ \count0=0
+ \else
+ \dimen0=\count0\hsize
+ \advance\dimen0 by \count0\intercolumnwidth
+ \advance\dimen0 by -\intercolumnwidth
+ \global\setbox\floatbox=\hbox to \dimen0
+ {\hss\hbox{\copy\floatbox}\hss}%
+ \fi
+ \showmessage{\m!columns}{13}{}%
+ \else
+ % \showmessage{\m!columns}{13}{}%
+ \fi
+ \ifdim\ht\floatbox>\!!zeropoint\relax
+ \global\setbox\currenttopcolumnbox=\vbox
+ {\snaptogrid\vbox{\copy\floatbox}
+ \witruimte % nodig ?
+ \blanko[\@@bknawit]}%
+ \fi
+ \dimen6=\ht\currenttopcolumnbox
+ \advance\dimen6 by \dp\currenttopcolumnbox
+ \fi
+ \ifdim\dimen4<\ht\currenttopcolumnbox
+ \dimen4=\ht\currenttopcolumnbox
+ \fi
+ \advance\dimen8 by \dimen6
+ \advance\count2 by -1
+ \advance\count0 by -1\relax}%
+ \setvsize
+ \global\advance\vsize by -\dimen8
+ \global\pagegoal=\vsize
+ \else
+ \doflushfloats
+ \fi
+ \egroup}
+
+%D This were the multi||column routines. They can and need to
+%D be improved but at the moment their behaviour is acceptable.
+%D
+%D One inprovement can be to normalize the height of floats
+%D to $n\times$\type{\lineheight} with a macro like:
+%D
+%D \starttypen
+%D \normalizevbox{...}
+%D \stoptypen
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-nav.tex b/tex/context/base/core-nav.tex index 8a3333d0b..60b843af4 100644 --- a/tex/context/base/core-nav.tex +++ b/tex/context/base/core-nav.tex @@ -1,357 +1,360 @@ -%D \module -%D [ file=core-nav, -%D version=1998.01.15, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Navigation, -%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 Core Macros / Navigation} - -\unprotect - -%D Support for interactive document is very present in -%D \CONTEXT\ and interwoven in many modules. This means that in -%D this module, where we deal with some common navigational -%D features, there will be quite some forward references. -%D -%D When I started implementing hypertext support, the macros -%D were mostly dealing with things related to locations, that -%D is click in this location and goto that one. The -%D functionality of many macro depends on the output medium: -%D paper or screen. The next boolean holds the state: - -\newif\iflocation - -%D We also allocate a scratchbox: - -\newbox\locationbox - -%D There is no interaction at all unless enabled by saying: -%D -%D \starttypen -%D \setupinteraction[state=start] -%D \stoptypen -%D -%D The other settings are: -%D -%D \showsetup{\y!stelinteractiein} -%D -%D In the special driver modules we introduced a switch that -%D forces page destinations (instead of named ones). We set -%D this switch here. - -\def\stelinteractiein% - {\dosingleargument\dostelinteractiein} - -\def\dostelinteractiein[#1]% - {\getparameters[\??ia][#1]% - \doifelse{\@@iastatus}{\v!start} - {\iflocation\else - \showmessage{\m!interactions}{2}{\ifusepagedestinations\space(PAGE)\fi}% - \global\locationtrue - \fi} - {\iflocation - \showmessage{\m!interactions}{3}{\ifusepagedestinations\space(PAGE)\fi}% - \global\locationfalse - \fi}% - \doifelse{\@@iastrut}{\v!ja} - {\locationstruttrue} - {\locationstrutfalse}% - \doifelse{\@@iapagina}{\v!ja} - {\global\usepagedestinationstrue} - {\global\usepagedestinationsfalse}} - -%D We have to make sure of some settings: - -\def\dolocationstartup% - {\iflocation - \dosetupinteraction - \setupinteractionscreens - \global\let\dolocationstartup=\relax - \fi} - -\appendtoks \dolocationstartup \to \everyshipout - -%D The next few macros are really horrible. For proper -%D navigation a in||line hypertext fragment must have -%D comfortable properties, so we must force some minimal -%D dimensions. On the other hand button, and here I mean those -%D pieces of text with fancy outlines and/or backgrounds, often -%D have fixed, preset dimensions. -%D -%D To make things even worse, if we choose to let the optimal -%D dimensions depend on the height and depth of a strut, a not -%D too uncommon practice in \TEX, we have to deal with the fact -%D that such a strut, set inside a box, is unknown too the -%D outside world. -%D -%D The solution lays in passing the strut characteristics in -%D a proper way, in our case by applying \type{\presetgoto}: -%D -%D \starttypen -%D {some piece of text \presetgoto} -%D \stoptypen -%D -%D This macro stores the current strut values. - -\newif\iflocationstrut - -\let\@@ia@@hoogte=\!!zeropoint -\let\@@ia@@diepte=\!!zeropoint - -\def\presetgoto% - {\iflocationstrut - \setstrut - \xdef\@@ia@@hoogte{\the\ht\strutbox}% - \xdef\@@ia@@diepte{\the\dp\strutbox}% - \else - \global\let\@@ia@@hoogte=\@@iahoogte - \global\let\@@ia@@diepte=\@@iadiepte - \fi} - -%D In the macros that deal with making areas into hyperlinks, -%D we use: - -\def\dostartgoto\data#1\start#2\stop#3\dostopgoto% - {\hbox - {\setbox0=\hbox{#1}% - \ifdim\wd0<\@@iabreedte\relax - \buttonwidth=\@@iabreedte\relax - \else - \buttonwidth=\wd0\relax - \fi - \ifdim\ht0<\@@ia@@hoogte\relax - \buttonheight=\@@ia@@hoogte\relax - \else - \buttonheight=\ht0 - \fi - \ifdim\dp0<\@@ia@@diepte\relax - \dimen0=\@@ia@@diepte\relax - \else - \dimen0=\dp0\relax - \fi - \advance\buttonheight by \dimen0 - \setbox2=\hbox - {\lower\dimen0\hbox - {\mindermeldingen - \dimen0=.5\wd0 - \advance\dimen0 by -.5\buttonwidth - \hskip\dimen0#2#3}}% - \ifreversegoto - \dimen0=\wd0\box0\kern-\dimen0\smashbox2\box2\kern\dimen0 - \else - \smashbox2\box2\box0 - \fi - \global\let\@@ia@@hoogte=\!!zeropoint - \global\let\@@ia@@diepte=\!!zeropoint}} - -%D The width of the active area depends on the dimensions -%D preset, the actual dimens and/or the height and depth of the -%D strut. -%D -%D Normally the hyper active area is laid on top of the text. -%D This enables stacking hyperlinks on top of each other. When, -%D for some reason the opposite is prefered, one can use the -%D next boolean to signal this wish. - -\newif\ifreversegoto \reversegotofalse - -%D As long as there a natural feeling of what can be considered -%D hyper active or not, we have to tell users where they can -%D possibly click. We've already seen a few macros that deal -%D with this visualization, something we definitely do not let -%D up to the viewer. One way of telling is using a distinctive -%D typeface, another way is using color. -%D -%D There are two colors involved: one for normal hyperlinks, -%D and one for those that point to the currentpage, the -%D contrast color. - -\definecolor [interactioncolor] [r=0, g=.6, b=0] -\definecolor [interactioncontrastcolor] [r=.8, g=0, b=0] - -\definecolor [interactiekleur] [interactioncolor] -\definecolor [interactiecontrastkleur] [interactioncontrastcolor] - -%D The next few macros are responsible for highlighting hyper -%D links. The first one, \type{\showlocation}, is used in those -%D situations where the typeface is handled by the calling -%D macro. - -%D CHECK WHERE USED / CONSISTENCY - -\def\showlocation#1% - {\iflocation\color[\@@iakleur]{#1\presetgoto}\else#1\fi} - -%D When local color settings are to be used, we can use the -%D next macro, where \type{#1} is a tag like \type{\??tg} and -%D \type{#2} some text. - -\def\showcoloredlocation#1#2% - {\iflocation - \color[\getvalue{#1\c!kleur}]{#2\presetgoto}% - \else - #2% - \fi} - -%D When we're dealing with pure page references, contrast -%D colors are used when we are already at the page mentioned. - -\def\showcontrastlocation#1#2#3% the \@EA is needed - {\iflocation - \ifnum#2=\realpageno\relax - \doifelsevaluenothing{#1\c!kleur} - {#3\presetgoto} - {\color[\getvalue{#1\c!contrastkleur}]{#3\presetgoto}}% - \else - \color[\getvalue{#1\c!kleur}]{#3\presetgoto}% - \fi - \else - #3% - \fi} - -%D The next simple macro can be used in color specifications, -%D like \type{\color[\locationcolor{green}]}. - -\def\locationcolor#1% - {\iflocation#1\fi} - -%D More tokens are spend when we want both typeface and color -%D highlighting. - -\def\dolocationattributes#1#2% - {\bgroup - \iflocation - \doifdefinedelse{#1\c!kleur} - {\edef\colorattribute{\getvalue{#1\c!kleur}}} - {\let\colorattribute\empty}% - \else - \let\colorattribute\empty - \fi - \doifdefinedelse{#1\c!letter} - {\edef\fontattribute{\getvalue{#1\c!letter}}} - {\let\fontattribute\empty}% - \startcolor[\colorattribute]% - \doconvertfont{\fontattribute}{#2}% - \stopcolor - \egroup} - -%D Special hyperlinks, namely those to pages or navigational -%D properties, are associated with symbols. - -\definesymbol [\v!eerste\v!pagina] [\gotobegincharacter] -\definesymbol [\v!vorige\v!pagina] [\gobackwardcharacter] -\definesymbol [\v!volgende\v!pagina] [\goforwardcharacter] -\definesymbol [\v!laatste\v!pagina] [\gotoendcharacter] -\definesymbol [\v!eerste\v!sub\v!pagina] [\gotobegincharacter] -\definesymbol [\v!vorige\v!sub\v!pagina] [\gobackwardcharacter] -\definesymbol [\v!volgende\v!sub\v!pagina] [\goforwardcharacter] -\definesymbol [\v!laatste\v!sub\v!pagina] [\gotoendcharacter] -\definesymbol [\v!PreviousJump] [\gobackjumpcharacter] -\definesymbol [\v!NextJump] [\goforjumpcharacter] -\definesymbol [\v!CloseDocument] [\closecharacter] - -%D These symbols are taken from the Computer Moders Roman -%D symbol set or, when present, from the additional symbols of -%D the American Mathematical Society. Of course one can use -%D his or her own symbols by redefining them. - -\def\dogotocharacter#1#2#3% - {\ifx#1\undefined#2\else#3\fi} - -\def\gotobegincharacter% - {\hbox - {\dogotocharacter\blacktriangleleft - {\setbox0=\hbox{$\triangleleft$}% - \vrule\!!width.085ex\!!height1.075\ht0\!!depth\dp0 - \kern-.11ex\box0} - {\setbox0=\hbox{$\blacktriangleleft$}% - \setbox2=\hbox{\vrule\!!height\ht0\!!depth\dp0\!!width.25ex}% - \hbox{\lower.03ex\box2\kern-.35ex\box0}}}} - -\def\gotoendcharacter% - {\hbox - {\dogotocharacter\blacktriangleright - {\setbox0=\hbox{\mathematics{\triangleright}}% - \copy0\kern-.11ex - \vrule\!!width.085ex\!!height1.075\ht0\!!depth\dp0} - {\setbox0=\hbox{$\blacktriangleright$}% - \setbox2=\hbox{\vrule\!!height\ht0\!!depth\dp0\!!width.25ex}% - \hbox{\box0\kern-.35ex\lower.03ex\box2}}}} - -\def\gobackwardcharacter% - {\mathematics{\dogotocharacter\blacktriangleright\triangleleft\blacktriangleleft}} - -\def\goforwardcharacter% - {\mathematics{\dogotocharacter\blacktriangleleft\triangleright\blacktriangleright}} - -\def\gonowherecharacter% - {\mathematics{\bullet}} - -\def\gotosomewherecharacter% {} permits ^\... - {{\hbox{\hsmash{\gobackwardcharacter}\goforwardcharacter}}} - -\unexpanded\def\closecharacter% - {\dogotocharacter\boxtimes - {\ruledhbox{\mathematics{\times}}} - {\mathematics{\boxtimes}}} - -\def\goforjumpcharacter% - {\hbox{\goforwardcharacter \kern-.5em\goforwardcharacter}} - -\def\gobackjumpcharacter% - {\hbox{\gobackwardcharacter\kern-.5em\gobackwardcharacter}} - -%D We have already seen some of the next values in action, -%D others will be applied in other modules. - -%D Although not decently supported in current viewers, a -%D provisory hiding mechanims is implemented. Areas marked as -%D such, are visible on screen, but invisible on paper. Don't -%D trust this mechanism yet! - -\def\dostartinteractie% - {\bgroup - \let\stopinteractie=\egroup - \dowithnextbox{\dostarthide\box\nextbox\dostophide\egroup}\hbox} - -\let\startinteractie = \relax -\let\stopinteractie = \relax - -% in the future: -% -% eerst boolean invoeren bij menu, achtergrond, balk, button -% enz; verder startinteractie een argument meegeven {#1} -> -% \getvalue{#1\c!print}=={\v!ja} enz. Consequent menubutton -% gebruiken! - -\def\@@iatimestamp% - {\the\normalyear - \ifnum\normalmonth<10 0\fi\the\normalmonth - \ifnum\normalday <10 0\fi\the\normalday} - -\stelinteractiein - [\c!status=\v!stop, - \c!pagina=\v!nee, - \c!menu=\v!uit, - \c!letter=\v!vet, - \c!strut=\v!ja, - \c!kleur=interactioncolor, - \c!contrastkleur=interactioncontrastcolor, - \c!breedte=1em, - \c!hoogte=\!!zeropoint, - \c!diepte=\!!zeropoint, - \c!titel=, - \c!subtitel=, - \c!auteur=, - \c!datum=\@@iatimestamp] - -\protect - -\endinput +%D \module
+%D [ file=core-nav,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Navigation,
+%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 Core Macros / Navigation}
+
+\unprotect
+
+%D Support for interactive document is very present in
+%D \CONTEXT\ and interwoven in many modules. This means that in
+%D this module, where we deal with some common navigational
+%D features, there will be quite some forward references.
+%D
+%D When I started implementing hypertext support, the macros
+%D were mostly dealing with things related to locations, that
+%D is click in this location and goto that one. The
+%D functionality of many macro depends on the output medium:
+%D paper or screen. The next boolean holds the state:
+
+\newif\iflocation
+
+%D We also allocate a scratchbox:
+
+\newbox\locationbox
+
+%D There is no interaction at all unless enabled by saying:
+%D
+%D \starttypen
+%D \setupinteraction[state=start]
+%D \stoptypen
+%D
+%D The other settings are:
+%D
+%D \showsetup{\y!stelinteractiein}
+%D
+%D In the special driver modules we introduced a switch that
+%D forces page destinations (instead of named ones). We set
+%D this switch here.
+
+\def\stelinteractiein%
+ {\dosingleargument\dostelinteractiein}
+
+\def\dostelinteractiein[#1]%
+ {\getparameters[\??ia][#1]%
+ \doifelse{\@@iastatus}{\v!start}
+ {\iflocation\else
+ \showmessage{\m!interactions}{2}{\ifusepagedestinations\space(PAGE)\fi}%
+ \global\locationtrue
+ \fi}
+ {\iflocation
+ \showmessage{\m!interactions}{3}{\ifusepagedestinations\space(PAGE)\fi}%
+ \global\locationfalse
+ \fi}%
+ \doifelse{\@@iastrut}{\v!ja}
+ {\locationstruttrue}
+ {\locationstrutfalse}%
+ \doifelse{\@@iapagina}{\v!ja}
+ {\global\usepagedestinationstrue}
+ {\global\usepagedestinationsfalse}}
+
+%D We have to make sure of some settings:
+
+\def\dolocationstartup%
+ {\iflocation
+ \dosetupinteraction
+ \setupinteractionscreens
+ \global\let\dolocationstartup=\relax
+ \fi}
+
+\appendtoks \dolocationstartup \to \everyshipout
+
+%D The next few macros are really horrible. For proper
+%D navigation a in||line hypertext fragment must have
+%D comfortable properties, so we must force some minimal
+%D dimensions. On the other hand button, and here I mean those
+%D pieces of text with fancy outlines and/or backgrounds, often
+%D have fixed, preset dimensions.
+%D
+%D To make things even worse, if we choose to let the optimal
+%D dimensions depend on the height and depth of a strut, a not
+%D too uncommon practice in \TEX, we have to deal with the fact
+%D that such a strut, set inside a box, is unknown too the
+%D outside world.
+%D
+%D The solution lays in passing the strut characteristics in
+%D a proper way, in our case by applying \type{\presetgoto}:
+%D
+%D \starttypen
+%D {some piece of text \presetgoto}
+%D \stoptypen
+%D
+%D This macro stores the current strut values.
+
+\newif\iflocationstrut
+
+\def\resetgoto%
+ {\global\let\@@ia@@hoogte=\!!zeropoint
+ \global\let\@@ia@@diepte=\!!zeropoint}
+
+\resetgoto
+
+\def\presetgoto%
+ {\iflocationstrut
+ \setstrut
+ \xdef\@@ia@@hoogte{\the\ht\strutbox}%
+ \xdef\@@ia@@diepte{\the\dp\strutbox}%
+ \else
+ \global\let\@@ia@@hoogte=\@@iahoogte
+ \global\let\@@ia@@diepte=\@@iadiepte
+ \fi}
+
+%D In the macros that deal with making areas into hyperlinks,
+%D we use:
+
+\def\dostartgoto\data#1\start#2\stop#3\dostopgoto%
+ {\hbox
+ {\setbox0=\hbox{#1}%
+ \ifdim\wd0<\@@iabreedte\relax
+ \buttonwidth=\@@iabreedte\relax
+ \else
+ \buttonwidth=\wd0\relax
+ \fi
+ \ifdim\ht0<\@@ia@@hoogte\relax
+ \buttonheight=\@@ia@@hoogte\relax
+ \else
+ \buttonheight=\ht0
+ \fi
+ \ifdim\dp0<\@@ia@@diepte\relax
+ \dimen0=\@@ia@@diepte\relax
+ \else
+ \dimen0=\dp0\relax
+ \fi
+ \advance\buttonheight by \dimen0
+ \setbox2=\hbox
+ {\lower\dimen0\hbox
+ {\mindermeldingen
+ \dimen0=.5\wd0
+ \advance\dimen0 by -.5\buttonwidth
+ \hskip\dimen0#2#3}}%
+ \ifreversegoto
+ \dimen0=\wd0\box0\kern-\dimen0\smashbox2\box2\kern\dimen0
+ \else
+ \smashbox2\box2\box0
+ \fi
+ \resetgoto}}
+
+%D The width of the active area depends on the dimensions
+%D preset, the actual dimens and/or the height and depth of the
+%D strut.
+%D
+%D Normally the hyper active area is laid on top of the text.
+%D This enables stacking hyperlinks on top of each other. When,
+%D for some reason the opposite is prefered, one can use the
+%D next boolean to signal this wish.
+
+\newif\ifreversegoto \reversegotofalse
+
+%D As long as there a natural feeling of what can be considered
+%D hyper active or not, we have to tell users where they can
+%D possibly click. We've already seen a few macros that deal
+%D with this visualization, something we definitely do not let
+%D up to the viewer. One way of telling is using a distinctive
+%D typeface, another way is using color.
+%D
+%D There are two colors involved: one for normal hyperlinks,
+%D and one for those that point to the currentpage, the
+%D contrast color.
+
+\definecolor [interactioncolor] [r=0, g=.6, b=0]
+\definecolor [interactioncontrastcolor] [r=.8, g=0, b=0]
+
+\definecolor [interactiekleur] [interactioncolor]
+\definecolor [interactiecontrastkleur] [interactioncontrastcolor]
+
+%D The next few macros are responsible for highlighting hyper
+%D links. The first one, \type{\showlocation}, is used in those
+%D situations where the typeface is handled by the calling
+%D macro.
+
+%D CHECK WHERE USED / CONSISTENCY
+
+\def\showlocation#1%
+ {\iflocation\color[\@@iakleur]{#1\presetgoto}\else#1\fi}
+
+%D When local color settings are to be used, we can use the
+%D next macro, where \type{#1} is a tag like \type{\??tg} and
+%D \type{#2} some text.
+
+\def\showcoloredlocation#1#2%
+ {\iflocation
+ \color[\getvalue{#1\c!kleur}]{#2\presetgoto}%
+ \else
+ #2%
+ \fi}
+
+%D When we're dealing with pure page references, contrast
+%D colors are used when we are already at the page mentioned.
+
+\def\showcontrastlocation#1#2#3% the \@EA is needed
+ {\iflocation
+ \ifnum#2=\realpageno\relax
+ \doifelsevaluenothing{#1\c!kleur}
+ {#3\presetgoto}
+ {\color[\getvalue{#1\c!contrastkleur}]{#3\presetgoto}}%
+ \else
+ \color[\getvalue{#1\c!kleur}]{#3\presetgoto}%
+ \fi
+ \else
+ #3%
+ \fi}
+
+%D The next simple macro can be used in color specifications,
+%D like \type{\color[\locationcolor{green}]}.
+
+\def\locationcolor#1%
+ {\iflocation#1\fi}
+
+%D More tokens are spend when we want both typeface and color
+%D highlighting.
+
+\def\dolocationattributes#1#2%
+ {\bgroup
+ \iflocation
+ \doifdefinedelse{#1\c!kleur}
+ {\edef\colorattribute{\getvalue{#1\c!kleur}}}
+ {\let\colorattribute\empty}%
+ \else
+ \let\colorattribute\empty
+ \fi
+ \doifdefinedelse{#1\c!letter}
+ {\edef\fontattribute{\getvalue{#1\c!letter}}}
+ {\let\fontattribute\empty}%
+ \startcolor[\colorattribute]%
+ \doconvertfont{\fontattribute}{#2}%
+ \stopcolor
+ \egroup}
+
+%D Special hyperlinks, namely those to pages or navigational
+%D properties, are associated with symbols.
+
+\definesymbol [\v!eerste\v!pagina] [\gotobegincharacter]
+\definesymbol [\v!vorige\v!pagina] [\gobackwardcharacter]
+\definesymbol [\v!volgende\v!pagina] [\goforwardcharacter]
+\definesymbol [\v!laatste\v!pagina] [\gotoendcharacter]
+\definesymbol [\v!eerste\v!sub\v!pagina] [\gotobegincharacter]
+\definesymbol [\v!vorige\v!sub\v!pagina] [\gobackwardcharacter]
+\definesymbol [\v!volgende\v!sub\v!pagina] [\goforwardcharacter]
+\definesymbol [\v!laatste\v!sub\v!pagina] [\gotoendcharacter]
+\definesymbol [\v!PreviousJump] [\gobackjumpcharacter]
+\definesymbol [\v!NextJump] [\goforjumpcharacter]
+\definesymbol [\v!CloseDocument] [\closecharacter]
+
+%D These symbols are taken from the Computer Moders Roman
+%D symbol set or, when present, from the additional symbols of
+%D the American Mathematical Society. Of course one can use
+%D his or her own symbols by redefining them.
+
+\def\dogotocharacter#1#2#3%
+ {\ifx#1\undefined#2\else#3\fi}
+
+\def\gotobegincharacter%
+ {\hbox
+ {\dogotocharacter\blacktriangleleft
+ {\setbox0=\hbox{$\triangleleft$}%
+ \vrule\!!width.085ex\!!height1.075\ht0\!!depth\dp0
+ \kern-.11ex\box0}
+ {\setbox0=\hbox{$\blacktriangleleft$}%
+ \setbox2=\hbox{\vrule\!!height\ht0\!!depth\dp0\!!width.25ex}%
+ \hbox{\lower.03ex\box2\kern-.35ex\box0}}}}
+
+\def\gotoendcharacter%
+ {\hbox
+ {\dogotocharacter\blacktriangleright
+ {\setbox0=\hbox{\mathematics{\triangleright}}%
+ \copy0\kern-.11ex
+ \vrule\!!width.085ex\!!height1.075\ht0\!!depth\dp0}
+ {\setbox0=\hbox{$\blacktriangleright$}%
+ \setbox2=\hbox{\vrule\!!height\ht0\!!depth\dp0\!!width.25ex}%
+ \hbox{\box0\kern-.35ex\lower.03ex\box2}}}}
+
+\def\gobackwardcharacter%
+ {\mathematics{\dogotocharacter\blacktriangleright\triangleleft\blacktriangleleft}}
+
+\def\goforwardcharacter%
+ {\mathematics{\dogotocharacter\blacktriangleleft\triangleright\blacktriangleright}}
+
+\def\gonowherecharacter%
+ {\mathematics{\bullet}}
+
+\def\gotosomewherecharacter% {} permits ^\...
+ {{\hbox{\hsmash{\gobackwardcharacter}\goforwardcharacter}}}
+
+\unexpanded\def\closecharacter%
+ {\dogotocharacter\boxtimes
+ {\ruledhbox{\mathematics{\times}}}
+ {\mathematics{\boxtimes}}}
+
+\def\goforjumpcharacter%
+ {\hbox{\goforwardcharacter \kern-.5em\goforwardcharacter}}
+
+\def\gobackjumpcharacter%
+ {\hbox{\gobackwardcharacter\kern-.5em\gobackwardcharacter}}
+
+%D We have already seen some of the next values in action,
+%D others will be applied in other modules.
+
+%D Although not decently supported in current viewers, a
+%D provisory hiding mechanims is implemented. Areas marked as
+%D such, are visible on screen, but invisible on paper. Don't
+%D trust this mechanism yet!
+
+\def\dostartinteractie%
+ {\bgroup
+ \let\stopinteractie=\egroup
+ \dowithnextbox{\dostarthide\box\nextbox\dostophide\egroup}\hbox}
+
+\let\startinteractie = \relax
+\let\stopinteractie = \relax
+
+% in the future:
+%
+% eerst boolean invoeren bij menu, achtergrond, balk, button
+% enz; verder startinteractie een argument meegeven {#1} ->
+% \getvalue{#1\c!print}=={\v!ja} enz. Consequent menubutton
+% gebruiken!
+
+\def\@@iatimestamp%
+ {\the\normalyear
+ \ifnum\normalmonth<10 0\fi\the\normalmonth
+ \ifnum\normalday <10 0\fi\the\normalday}
+
+\stelinteractiein
+ [\c!status=\v!stop,
+ \c!pagina=\v!nee,
+ \c!menu=\v!uit,
+ \c!letter=\v!vet,
+ \c!strut=\v!ja,
+ \c!kleur=interactioncolor,
+ \c!contrastkleur=interactioncontrastcolor,
+ \c!breedte=1em,
+ \c!hoogte=\!!zeropoint,
+ \c!diepte=\!!zeropoint,
+ \c!titel=,
+ \c!subtitel=,
+ \c!auteur=,
+ \c!datum=\@@iatimestamp]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-new.tex b/tex/context/base/core-new.tex index 666367e6f..5bcf5afa4 100644 --- a/tex/context/base/core-new.tex +++ b/tex/context/base/core-new.tex @@ -1,47 +1,48 @@ -%D \module -%D [ file=core-nav, -%D version=1995.1.1, -%D title=\CONTEXT\ Core Macros, -%D subtitle=New ones, -%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. - -%D To be placed elsewhere. - -\writestatus{loading}{Context Core Macros / New Ones} - -\unprotect - -% Some kind of new feature, for the moment a private one. -% -% \enablemode[screen,paper,bound] -% -% \doifmodeelse {paper} {this} {that} -% \doifmode {paper,screen} {this} -% \doifnotmode {paper,bound} {that} - -\let\currentmode=\empty - -\def\enablemode[#1]% - {\addtocommalist{#1}\currentmode} - -\def\disablemode[#1]% - {\removefromcommalist{#1}\currentmode} - -\long\def\doifmodeelse#1#2#3% - {\expandafter\doifcommonelse\expandafter{\currentmode}{#1}{#2}{#3}} - -\long\def\doifmode#1#2% - {\expandafter\doifcommonelse\expandafter{\currentmode}{#1}{#2}{}} - -\long\def\doifnotmode#1#2% - {\expandafter\doifcommonelse\expandafter{\currentmode}{#1}{}{#2}} - -\protect - -\endinput +%D \module
+%D [ file=core-nav,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=New ones,
+%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.
+
+%D To be placed elsewhere.
+
+\writestatus{loading}{Context Core Macros / New Ones}
+
+\unprotect
+
+% Some kind of new feature, for the moment a private one.
+%
+% \enablemode[screen,paper,bound]
+%
+% \doifmodeelse {paper} {this} {that}
+% \doifmode {paper,screen} {this}
+% \doifnotmode {paper,bound} {that}
+
+\let\currentmode=\empty
+
+\def\enablemode[#1]%
+ {\addtocommalist{#1}\currentmode}
+
+\def\disablemode[#1]%
+ {\removefromcommalist{#1}\currentmode}
+
+\long\def\doifmodeelse#1#2#3%
+ {\expandafter\doifcommonelse\expandafter{\currentmode}{#1}{#2}{#3}}
+
+\long\def\doifmode#1#2%
+ {\expandafter\doifcommonelse\expandafter{\currentmode}{#1}{#2}{}}
+
+\long\def\doifnotmode#1#2%
+ {\expandafter\doifcommonelse\expandafter{\currentmode}{#1}{}{#2}}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-not.tex b/tex/context/base/core-not.tex index 5077afab6..75775323c 100644 --- a/tex/context/base/core-not.tex +++ b/tex/context/base/core-not.tex @@ -1,626 +1,629 @@ -%D \module -%D [ file=core-not, -%D version=1997.09.15, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Footnote Handling, -%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 Core Macros / Footnote Handling} - -%D There are some (still) dutch core commands used in this -%D file. - -\unprotect - -%D Footnotes are can be characterized by three components: -%D -%D \startopsomming[opelkaar] -%D \som a small number \voetnoot{a footnote number} or -%D symbol {\stelvoetnotenin[conversie=set 2]\voetnoot{a -%D footnote}} -%D \som and a similar mark at the bottom of the page -%D \som followed by some additional text -%D \stopopsomming -%D -%D Because footnotes are declared at the location of their -%D reference. Footnotes can be seen as a special kind of -%D floating bodies. There placement is postponed but has to be -%D taken into account in the pagebreak calculations. This kind -%D of calculations are forced by using \type{\insert}. - -\ifx\footins\undefined \newinsert\footins \fi - -%D \macros -%D {setupfootnotes,setupfootnotedefinition} -%D -%D We can influence footnote typesetting with the setup -%D command: -%D -%D \showsetup{\y!setupfootnotes} -%D -%D It's sort of a custom to precede footnotes by a horizontal -%D rule and although fancy rules like -%D -%D \starttypen -%D \hbox to 10em{\hskip-3em\dotfill} -%D \stoptypen -%D -%D Are quite ligitimate, we default to a simple one 20\% of the -%D text width. -%D -%D When \type{n} exceeds~1, footnotes are typeset in -%D multi||columns, using the algoritm presented on page~397 -%D of \TEX book. Footnotes can be places on a per page basis -%D or whereever suitable. When we set~\type{n} to~0, we get a -%D rearanged paragraph, typeset by the algoritms on pages 398 -%D and~389. We definitely did not reinvent that wheel. - -\newif\ifendnotes \endnotesfalse - -%D The footnoterule can be a graphic and therefore calling this -%D setup macro at every skipswitch is tricky (many many MP -%D runs). Let's just reserve a few points, that probably match -%D those of the stretch component. - -\newif\ifcleverfootnotes % being [plaats=kolommen] - -\def\setupfootnotedefinition% - {\steldoordefinierenin[\??vn]} - -\doordefinieren - [\??vn] - [\c!plaats=\v!inlinker, - \c!breedte=\v!passend, - \c!letter=\@@vnletter, - \c!kleur=\@@vnkleur, - \c!voor=, - \c!na=] - -\presetlocalframed - [\??vn] - -\def\setupfootnotes% - {\dosingleempty\dosetupfootnotes} - -\def\dosetupfootnotes[#1]% - {\getparameters[\??vn][#1]% - \processaction - [\@@vnlijn] - [ \v!aan=>\def\footnoterule{\hrule \!!width .2\hsize}, - \v!uit=>\let\footnoterule=\relax, - \s!unknown=>\let\footnoterule=\@@vnlijn]% - \setbox0=\vbox - {\forgetall - \@@vnvoor - \footnoterule - \@@vnna}% - \skip\footins=\ht0 - \count\footins=1000 - \setbox0=\box\voidb@x % \somehow \box0 is used - \doifelse{\@@vnplaats}{\v!kolommen} - {\cleverfootnotestrue % global ? - \ifnum\@@kln=0 - \scratchcounter=1 - \else - \scratchcounter=\@@vnn\relax - \divide\count\footins by \scratchcounter - \fi - \global\endnotesfalse - \setcleverfootnotes} - {\cleverfootnotesfalse - \ifnum\@@vnn=0 - \settextfootnotes - \scratchcounter=1 - \else - \setcolumnfootnotes - \scratchcounter=\@@vnn\relax - \divide\count\footins by \scratchcounter - \fi - \doifelse{\@@vnplaats}{\v!pagina} - {\global\endnotesfalse} - {\global\endnotestrue - \postponefootnotes}}% - \dimen\footins=\@@vnhoogte - \multiply\dimen\footins by \scratchcounter} - -\def\setcleverfootnotes% - {\def\formatfootnumber {}% - \def\startpushfootnote {\getvalue{\e!start\??vn}}% - \def\stoppushfootnote {\getvalue{\e!stop\??vn}}% - \def\startpopfootnotes {}% - \def\stoppopfootnotes {}} - -\def\setcolumnfootnotes% - {\def\formatfootnumber {}% - \def\startpushfootnote {\setrigidcolumnhsize\@@vnbreedte\@@vnkolomafstand\@@vnn - \getvalue{\e!start\??vn}}% - \def\stoppushfootnote {\getvalue{\e!stop\??vn}}% - \def\startpopfootnotes {\setbox0=\vbox\bgroup}% - \def\stoppopfootnotes {\egroup\rigidcolumnbalance0\@@vnn}} - -\def\settextfootnotes% - {\def\formatfootnumber##1{\noindent##1}% - \def\startpushfootnote {\startvboxtohbox - \dostartattributes\??vn\relax}% - \def\stoppushfootnote {\hskip\@@vnkolomafstand % plus.5em minus.5em - \dostopattributes - \stopvboxtohbox}% - \def\startpopfootnotes {\vbox\bgroup\hsize=\@@vnbreedte}% \setvboxtohbox}% - \def\stoppopfootnotes {\convertvboxtohbox\egroup}} - -%D The numbers that accompany a footnote are generated using -%D the standard \CONTEXT\ numbering mechanism, and thereby can -%D be assigned on a per whatever sectioning basis. - -\definieernummer - [\v!voetnoot] - [\c!wijze=\@@vnwijze, - \c!sectienummer=\@@vnwijze, - \c!conversie=\@@vnconversie] - -%D Both these parameters are coupled to the setup command we -%D will implement in a moment. This means that, given a -%D suitable symbol set, symbols can be used instead of numbers, -%D by saying: -%D -%D \starttypen -%D \setupfootnotes[conversion=set 2] -%D \stoptypen - -%D \macros -%D {footnote} -%D -%D A footnote can have a reference as optional argument and -%D therefore its formal specification looks like: -%D -%D \showsetup{\y!footnote} -%D -%D This command has one optional command: the reference. By -%D saying \type{[-]} the number is omitted. The footnote -%D command is not that sensitive to spacing, so it's quite -%D legal to say: -%D -%D \startbuffer -%D Users of \CONTEXT\ must keep both feet \footnote{Given they -%D have two.} on the ground and not get confused \footnote{Or -%D even crazy.} by all those obscure \footnote{But fortunately -%D readable.} parameters. -%D \stopbuffer -%D -%D \typebuffer -%D -%D When setting the \type{conversion} to \type{set 2} we get -%D something like: -%D -%D \bgroup -%D \startsmaller -%D \stelvoetnotenin[conversie=set 1] -%D \haalbuffer -%D \stopsmaller -%D \egroup -%D -%D Typesetting footnotes is, at least for the moment, disabled -%D when reshaping boxes. - -\definecomplexorsimpleempty\footnote - -\def\complexfootnote[#1]% - {\unskip - \ifvisible - \ifreshapingbox - \let\next=\gobbletwoarguments - \else - \let\next=\dofootnote - \fi - \else - \let\next=\gobbletwoarguments - \fi - \next{#1}} - -%D \macros -%D {footnotesenabled} -%D -%D Before we come to typesetting a footnote, we first check -%D if we have to typeset a number. When a \type{-} is passed -%D instead of a reference, no number is typeset. We can -%D temporary disable footnotes by saying -%D -%D \starttypen -%D \footnotesenabledfalse -%D \stoptypen -%D -%D which can be handy while for instance typesetting tables -%D of contents. - -\newif\iffootnotesenabled \footnotesenabledtrue - -\def\dofootnote#1% - {\iffootnotesenabled - \doifelse{#1}{-} - {\let\footnotenumber=\empty} - {\verhoognummer[\v!voetnoot]% - \maakhetnummer[\v!voetnoot]% - \rawtextreference{\s!fnt}{#1}{\hetnummer}% - \def\footnotenumber{\hoog{\hetnummer}}}% - \expandafter\dostartfootnote - \else - \expandafter\gobbleoneargument - \fi} - -%D The main typesetting routine is more or less the same as the -%D \PLAIN\ \TEX\ one, except that we only handle one type while -%D \PLAIN\ also has something \type{\v...}. In most cases -%D footnotes can be handled by a straight insert, but we do so -%D by using an indirect call to the \type{\insert} primitive. - -\let\localfootinsert=\insert - -%D Making footnote numbers active is not always that logical, -%D especially when we keep the reference and text at one page. -%D On the other hand we need interactivity when we refer to -%D previous notes or use end notes. Therefore we support -%D interactive footnote numbers in two ways \voetnoot{This -%D feature was implemented years after we were able to do so, -%D mainly because endnotes had to be supported.} that is, -%D automatically (vise versa) and by user supplied reference. - -\newcounter\internalfootreference - -\let\startpushfootnote = \relax -\let\stoppushfootnote = \relax - -\newsignal\footnotesignal - -\def\dostartfootnote% nog gobble als in pagebody - {\bgroup - \unskip\unskip - \ifdim\lastkern=\footnotesignal - \hoog{\kern\@@vnafstand}% gets the font right - \fi - \ignorespaces - \doglobal\increment\internalfootreference - \nobreak - \iflocation - \naarbox{\footnotenumber}[\s!fnt:t:\internalfootreference]% - \rawreference{\s!fnt}{\s!fnt:f:\internalfootreference}{}% - \else - \footnotenumber - \fi - \localfootinsert\footins\bgroup - \forgetall - \setfootnotebodyfont - \redoconvertfont % to undo \undo calls in in headings etc - \interlinepenalty=\interfootnotelinepenalty - \splittopskip\ht\strutbox % not actually needed here - \splitmaxdepth\dp\strutbox % not actually needed here - \def\linkermargeafstand{\@@vnmargeafstand}% - \def\rechtermargeafstand{\@@vnmargeafstand}% - \startpushfootnote - {\ifx\footnotenumber\empty \else - \@@vnnummercommando - {\iflocation - \naarbox{\footnotenumber}[\s!fnt:f:\internalfootreference]% - \else - \footnotenumber - \fi}% - \fi - \iflocation - \rawreference{\s!fnt}{\s!fnt:t:\internalfootreference}{}% - \fi}% - \bgroup - \aftergroup\dostopfootnote - \begstrut - \let\next} - -\def\dostopfootnote% - {\endstrut - \stoppushfootnote - \egroup - \egroup - \kern\footnotesignal\relax} % \relax is needed to honor spaces - -%D \macros -%D {note} -%D -%D Refering to a note is accomplished by the rather short -%D command: -%D -%D \showsetup{\y!note} -%D -%D This command is implemented rather straightforward as: - -\def\note[#1]% - {\iffootnotesenabled - \bgroup - \unskip - \naarbox{\hoog{\currenttextreference}}[#1]% - \egroup - \fi} - -%D Normally footnotes are saved as inserts that are called upon -%D as soon as the pagebody is constructed. The footnote -%D insertion routine looks just like the \PLAIN\ \TEX\ one, -%D except that we check for the end note state. - -\let\startpopfootnotes = \relax -\let\stoppopfootnotes = \relax - -\def\placefootnoteinserts% - {%\ifvoid\footins \else % unsafe, strange - \ifdim\ht\footins>\!!zeropoint\relax - \ifendnotes \else - \@@vnvoor - \footnoterule % alleen in ..mode - \bgroup - \setfootnotebodyfont - \localframed - [\??vn] - [\c!breedte=\v!passend, - \c!hoogte=\v!passend, - \c!strut=\v!nee, - \c!offset=\v!overlay] - {\startpopfootnotes % == \vbox - \ifdim\dp\footins=\!!zeropoint % this hack is needed because \vadjust - \hbox{\lower\dp\strutbox\box\footins}% % in margin number placement - \else % hides the (always) present depth - \box\footins - \fi - \stoppopfootnotes}% - \egroup - \@@vnna - \fi - \fi} - -%D Supporting end notes is surprisingly easy. Even better, we -%D can combine this feature with solving the common \TEX\ -%D problem of disappearing inserts when they're called for in -%D deeply nested boxes. The general case looks like: -%D -%D \starttypen -%D \postponefootnotes -%D \.box{whatever we want with footnotes} -%D \flushfootnotes -%D \stoptypen -%D -%D This alternative can be used in headings, captions, tables -%D etc. The latter one sometimes calls for notes local to -%D the table, which can be realized by saying -%D -%D \starttypen -%D \setlocalfootnotes -%D some kind of table with local footnotes -%D \placelocalfootnotes -%D \stoptypen -%D -%D Postponing is accomplished by simply redefining the (local) -%D insert operation. A not too robust method uses the -%D \type{\insert} primitive when possible. This method fails in -%D situations where it's not entirely clear in what mode \TEX\ -%D is. Therefore the auto method can is to be overruled when -%D needed. - -\newbox\postponedfootnotes - -\def\autopostponefootnotes% - {\gdef\localfootinsert% - {\ifinner - %\message{[postponed footnote]}% - \global\setbox\postponedfootnotes=\vbox\bgroup - \unvbox\postponedfootnotes - \let\next=\gobbletwoarguments - \else - %\message{[inserted footnote]}% - \let\next=\insert - \fi - \next}} - -\def\postponefootnotes% - {\let\autopostponefootnotes=\postponefootnotes - \gdef\localfootinsert% - {%\message{[postponed footnote]}% - \global\setbox\postponedfootnotes=\vbox\bgroup - \unvbox\postponedfootnotes - \gobbletwoarguments}} - -\def\doflushfootnotes% - {\bgroup - \scratchdimen=\pagegoal - \advance\scratchdimen by -\pagetotal - \ifdim\scratchdimen<\ht\postponedfootnotes - \message{[moved footnote]}% - \fi - \egroup - \global\let\localfootinsert=\insert - \insert\footins\bgroup\unvbox\postponedfootnotes\egroup} - -\def\flushfootnotes% - {\ifinpagebody \else \ifinner \else - \ifendnotes \else \ifvoid\postponedfootnotes \else - %\ifvmode % less interference, but also less secure - \doflushfootnotes - %\fi - \fi\fi - \fi\fi} - -\def\placefootnotesintext#1% - {\par - \witruimte - \@@vnvoor - \snaptogrid\hbox - {\setfootnotebodyfont - \setbox0=\hbox - {\startpopfootnotes - \unvbox#1\par\relax - \stoppopfootnotes}% - \localframed - [\??vn] - [\c!breedte=\v!passend, - \c!hoogte=\v!passend, - \c!strut=\v!nee, - \c!offset=\v!overlay] - {\ifdim\dp0=\!!zeropoint % this hack is needed because \vadjust - \hbox{\lower\dp\strutbox\box0}% % in margin number placement - \else % hides the (always) present depth - \box0 - \fi}}% - \@@vnna} - -%D \macros -%D {startlocalfootnotes,placelocalfootnotes} -%D -%D The next two macros can be used in for instance tables, as -%D we'll demonstrate later on. -%D -%D \showsetup{\y!startlocalfootnotes} -%D \showsetup{\y!placelocalfootnotes} - -\newbox\localpostponedfootnotes - -\def\collectlocalfootnotes% - {\gdef\localfootinsert##1% - {%\message{[local footnote]}% - \global\setbox\localpostponedfootnotes=\vbox\bgroup - \unvbox\localpostponedfootnotes - \let\next}} - -\def\dostartlocalfootnotes[#1]% - {\let\autopostponefootnotes=\postponefootnotes - \let\postponefootnotes=\collectlocalfootnotes - \setupfootnotes[#1]% - \savenumber[\v!voetnoot]% - \resetnummer[\v!voetnoot]% - \collectlocalfootnotes} - -\def\startlocalfootnotes% - {\bgroup % here because we support \vbox\startlocalfootnotes - \dosingleempty\dostartlocalfootnotes} - -\def\stoplocalfootnotes% - {\restorenumber[\v!voetnoot]% - \egroup} - -\def\doplacelocalfootnotes[#1]% - {\bgroup - \setupfootnotes[#1]% - \placefootnotesintext\localpostponedfootnotes - \egroup} - -\def\placelocalfootnotes% - {\dosingleempty\doplacelocalfootnotes} - -%D These commands can be used like: -%D -%D \startbuffer -%D \startlocalfootnotes[breedte=.3\hsize,n=0] -%D \plaatstabel -%D {Some Table} -%D \plaatsonderelkaar -%D {\starttabel[|l|r|] -%D \HL -%D \VL Nota\voetnoot{Bene} \VL Bene\voetnoot{Nota} \VL\SR -%D \VL Bene\voetnoot{Nota} \VL Nota\voetnoot{Bene} \VL\SR -%D \HL -%D \stoptabel} -%D {\placelocalfootnotes} -%D \stoplocalfootnotes -%D \stopbuffer -%D -%D \typebuffer -%D -%D Because this table placement macro expect box content, and -%D thanks to the grouping of the local footnotes, we don't need -%D additional braces. -%D -%D \haalbuffer - -%D \macros -%D {placefootnotes} -%D -%D We still have no decent command for placing footnotes -%D somewhere else than at the bottom of the page (for which no -%D user action is needed). Footnotes (endnotes) can be -%D placed by using -%D -%D \showsetup{\y!placefootnotes} - -\def\doplacefootnotes[#1]% - {\bgroup - \let\@@vnhoogte=\teksthoogte - \setupfootnotes[#1]% - \ifendnotes - \ifinpagebody \else - \placefootnotesintext\postponedfootnotes - \fi - \else - \placefootnoteinserts - \fi - \egroup} - -\def\placefootnotes% - {\dosingleempty\doplacefootnotes} - -%D Now how can this mechanims be hooked into \CONTEXT\ without -%D explictly postponing footnotes? The solution turned out to -%D be rather simple: -%D -%D \starttypen -%D \everypar {...\flushfootnotes...} -%D \neverypar {...\postponefootnoes} -%D \stoptypen -%D -%D and -%D -%D \starttypen -%D \def\ejectinsert% -%D {... -%D \flushfootnotes -%D ...} -%D \stoptypen -%D -%D We can use \type{\neverypar} because in most commands -%D sensitive to footnote gobbling we disable \type{\everypar} -%D in favor for \type{\neverypar}. In fact, this footnote -%D implementation is the first to use this scheme. - -%D When typesetting footnotes, we have to return to the -%D footnote specific bodyfont size, which is in most cases derived -%D from the global document bodyfont size. In the previous macros -%D we already used a footnote specific font setting macro. - -\def\setfootnotebodyfont% - {\restoreglobalbodyfont - \switchtobodyfont[\@@vnkorps]} - -%D The footnote mechanism defaults to a traditional one -%D column way of showing them. By default we precede them by -%D a small line. - -\setupfootnotes - [\c!plaats=\v!pagina, - \c!wijze=\v!per\v!deel, - \c!sectienummer=\v!nee, - \c!conversie=, - \c!lijn=\v!aan, - \c!voor=\blanko, - \c!korps=\v!klein, - \c!letter=, - \c!kleur=, - \c!na=, - \c!kader=\v!uit, - \c!margeafstand=.5em, - \c!kolomafstand=1em, - \c!afstand=.125em, - \c!breedte=\zetbreedte, - \c!hoogte=\teksthoogte, - \c!nummercommando=\formatfootnumber, - \c!n=1] - -\protect - -\endinput +%D \module
+%D [ file=core-not,
+%D version=1997.09.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Footnote Handling,
+%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 Core Macros / Footnote Handling}
+
+%D There are some (still) dutch core commands used in this
+%D file.
+
+\unprotect
+
+%D Footnotes are can be characterized by three components:
+%D
+%D \startopsomming[opelkaar]
+%D \som a small number \voetnoot{a footnote number} or
+%D symbol {\stelvoetnotenin[conversie=set 2]\voetnoot{a
+%D footnote}}
+%D \som and a similar mark at the bottom of the page
+%D \som followed by some additional text
+%D \stopopsomming
+%D
+%D Because footnotes are declared at the location of their
+%D reference. Footnotes can be seen as a special kind of
+%D floating bodies. There placement is postponed but has to be
+%D taken into account in the pagebreak calculations. This kind
+%D of calculations are forced by using \type{\insert}.
+
+\ifx\footins\undefined \newinsert\footins \fi
+
+%D \macros
+%D {setupfootnotes,setupfootnotedefinition}
+%D
+%D We can influence footnote typesetting with the setup
+%D command:
+%D
+%D \showsetup{\y!setupfootnotes}
+%D
+%D It's sort of a custom to precede footnotes by a horizontal
+%D rule and although fancy rules like
+%D
+%D \starttypen
+%D \hbox to 10em{\hskip-3em\dotfill}
+%D \stoptypen
+%D
+%D Are quite ligitimate, we default to a simple one 20\% of the
+%D text width.
+%D
+%D When \type{n} exceeds~1, footnotes are typeset in
+%D multi||columns, using the algoritm presented on page~397
+%D of \TEX book. Footnotes can be places on a per page basis
+%D or whereever suitable. When we set~\type{n} to~0, we get a
+%D rearanged paragraph, typeset by the algoritms on pages 398
+%D and~389. We definitely did not reinvent that wheel.
+
+\newif\ifendnotes \endnotesfalse
+
+%D The footnoterule can be a graphic and therefore calling this
+%D setup macro at every skipswitch is tricky (many many MP
+%D runs). Let's just reserve a few points, that probably match
+%D those of the stretch component.
+
+\def\setupfootnotedefinition%
+ {\steldoordefinierenin[\??vn\??vn]}
+
+\doordefinieren
+ [\??vn\??vn]
+ [\c!plaats=\v!inlinker,
+ \c!breedte=\v!passend,
+ \c!kopletter=\@@vnletter,
+ \c!kopkleur=\@@vnkleur,
+ \c!voor=,
+ \c!na=]
+
+\presetlocalframed
+ [\??vn]
+
+%D The previous definitions indicate that we can frame
+%D the footnote area. The footnotes themselves are treated as
+%D definitions.
+%D
+%D \showsetup{\y!setupfootnotes}
+
+\newif\ifcleverfootnotes % being [plaats=kolommen]
+
+\def\setupfootnotes%
+ {\dosingleempty\dosetupfootnotes}
+
+\def\dosetupfootnotes[#1]%
+ {\getparameters[\??vn][#1]%
+ \processaction
+ [\@@vnlijn]
+ [ \v!aan=>\def\footnoterule{\hrule \!!width .2\hsize},
+ \v!uit=>\let\footnoterule=\relax,
+ \s!unknown=>\let\footnoterule=\@@vnlijn]%
+ \setbox0=\vbox
+ {\forgetall
+ \@@vnvoor
+ \footnoterule
+ \@@vnna}%
+ \skip\footins=\ht0
+ \count\footins=1000
+ \setbox0=\box\voidb@x % \somehow \box0 is used
+ \doifelse{\@@vnplaats}{\v!kolommen}
+ {\cleverfootnotestrue % global ?
+ \ifnum\@@kln=0
+ \scratchcounter=1
+ \else
+ \scratchcounter=\@@vnn\relax
+ \divide\count\footins by \scratchcounter
+ \fi
+ \global\endnotesfalse
+ \setcleverfootnotes}
+ {\cleverfootnotesfalse
+ \ifnum\@@vnn=0
+ \settextfootnotes
+ \scratchcounter=1
+ \else
+ \setcolumnfootnotes
+ \scratchcounter=\@@vnn\relax
+ \divide\count\footins by \scratchcounter
+ \fi
+ \doifelse{\@@vnplaats}{\v!pagina}
+ {\global\endnotesfalse}
+ {\global\endnotestrue
+ \postponefootnotes}}%
+ \dimen\footins=\@@vnhoogte
+ \multiply\dimen\footins by \scratchcounter}
+
+\def\setcleverfootnotes%
+ {\def\startpushfootnote {\getvalue{\e!start\??vn\??vn}}%
+ \def\stoppushfootnote {\getvalue{\e!stop\??vn\??vn}}%
+ \def\startpopfootnotes {}%
+ \def\stoppopfootnotes {}}
+
+\def\setcolumnfootnotes%
+ {\def\startpushfootnote {\setrigidcolumnhsize\@@vnbreedte\@@vnkolomafstand\@@vnn
+ \getvalue{\e!start\??vn\??vn}}%
+ \def\stoppushfootnote {\getvalue{\e!stop\??vn\??vn}}%
+ \def\startpopfootnotes {\setbox0=\vbox\bgroup}%
+ \def\stoppopfootnotes {\egroup\rigidcolumnbalance0\@@vnn}}
+
+\def\settextfootnotes%
+ {\def\startpushfootnote {\startvboxtohbox
+ \dostartattributes\??vn\relax}%
+ \def\stoppushfootnote {\hskip\@@vnkolomafstand % plus.5em minus.5em
+ \dostopattributes
+ \stopvboxtohbox}%
+ \def\startpopfootnotes {\vbox\bgroup\hsize=\@@vnbreedte}% \setvboxtohbox}%
+ \def\stoppopfootnotes {\convertvboxtohbox\egroup}}
+
+%D The numbers that accompany a footnote are generated using
+%D the standard \CONTEXT\ numbering mechanism, and thereby can
+%D be assigned on a per whatever sectioning basis.
+
+\definieernummer
+ [\v!voetnoot]
+ [\c!wijze=\@@vnwijze,
+ \c!sectienummer=\@@vnwijze,
+ \c!conversie=\@@vnconversie]
+
+%D Both these parameters are coupled to the setup command we
+%D will implement in a moment. This means that, given a
+%D suitable symbol set, symbols can be used instead of numbers,
+%D by saying:
+%D
+%D \starttypen
+%D \setupfootnotes[conversion=set 2]
+%D \stoptypen
+
+%D \macros
+%D {footnote}
+%D
+%D A footnote can have a reference as optional argument and
+%D therefore its formal specification looks like:
+%D
+%D \showsetup{\y!footnote}
+%D
+%D This command has one optional command: the reference. By
+%D saying \type{[-]} the number is omitted. The footnote
+%D command is not that sensitive to spacing, so it's quite
+%D legal to say:
+%D
+%D \startbuffer
+%D Users of \CONTEXT\ must keep both feet \footnote{Given they
+%D have two.} on the ground and not get confused \footnote{Or
+%D even crazy.} by all those obscure \footnote{But fortunately
+%D readable.} parameters.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D When setting the \type{conversion} to \type{set 2} we get
+%D something like:
+%D
+%D \bgroup
+%D \startsmaller
+%D \stelvoetnotenin[conversie=set 1]
+%D \haalbuffer
+%D \stopsmaller
+%D \egroup
+%D
+%D Typesetting footnotes is, at least for the moment, disabled
+%D when reshaping boxes.
+
+\definecomplexorsimpleempty\footnote
+
+\def\complexfootnote[#1]%
+ {\unskip
+ \ifvisible
+ \ifreshapingbox
+ \let\next=\gobbletwoarguments
+ \else
+ \let\next=\dofootnote
+ \fi
+ \else
+ \let\next=\gobbletwoarguments
+ \fi
+ \next{#1}}
+
+%D \macros
+%D {footnotesenabled}
+%D
+%D Before we come to typesetting a footnote, we first check
+%D if we have to typeset a number. When a \type{-} is passed
+%D instead of a reference, no number is typeset. We can
+%D temporary disable footnotes by saying
+%D
+%D \starttypen
+%D \footnotesenabledfalse
+%D \stoptypen
+%D
+%D which can be handy while for instance typesetting tables
+%D of contents.
+
+\newif\iffootnotesenabled \footnotesenabledtrue
+
+\def\dofootnote#1%
+ {\iffootnotesenabled
+ \doifelse{#1}{-}
+ {\let\footnotenumber=\empty}
+ {\verhoognummer[\v!voetnoot]%
+ \maakhetnummer[\v!voetnoot]%
+ \rawtextreference{\s!fnt}{#1}{\hetnummer}%
+ \let\footnotenumber=\hetnummer}%
+ \expandafter\dostartfootnote
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+%D The main typesetting routine is more or less the same as the
+%D \PLAIN\ \TEX\ one, except that we only handle one type while
+%D \PLAIN\ also has something \type{\v...}. In most cases
+%D footnotes can be handled by a straight insert, but we do so
+%D by using an indirect call to the \type{\insert} primitive.
+
+\let\localfootinsert=\insert
+
+%D Making footnote numbers active is not always that logical,
+%D especially when we keep the reference and text at one page.
+%D On the other hand we need interactivity when we refer to
+%D previous notes or use end notes. Therefore we support
+%D interactive footnote numbers in two ways \voetnoot{This
+%D feature was implemented years after we were able to do so,
+%D mainly because endnotes had to be supported.} that is,
+%D automatically (vise versa) and by user supplied reference.
+
+\newcounter\internalfootreference
+
+\let\startpushfootnote = \relax
+\let\stoppushfootnote = \relax
+
+\newsignal\footnotesignal
+
+\def\dostartfootnote% nog gobble als in pagebody
+ {\bgroup
+ \unskip\unskip
+ \ifdim\lastkern=\footnotesignal
+ \hoog{\kern\@@vnafstand}% gets the font right, hack !
+ \fi
+ \ignorespaces
+ \doglobal\increment\internalfootreference
+ \nobreak
+ \iflocation
+ \naarbox{\hoog{\footnotenumber}}[\s!fnt:t:\internalfootreference]%
+ \rawreference{\s!fnt}{\s!fnt:f:\internalfootreference}{}%
+ \else
+ \hoog{\footnotenumber}%
+ \fi
+ \localfootinsert\footins\bgroup
+ \forgetall
+ \setfootnotebodyfont
+ \redoconvertfont % to undo \undo calls in in headings etc
+ \interlinepenalty=\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % not actually needed here
+ \splitmaxdepth\dp\strutbox % not actually needed here
+ \def\linkermargeafstand{\@@vnmargeafstand}%
+ \def\rechtermargeafstand{\@@vnmargeafstand}%
+ \startpushfootnote
+ {\ifx\footnotenumber\empty \else
+ \iflocation
+ \naarbox{\@@vnnummercommando\footnotenumber}[\s!fnt:f:\internalfootreference]%
+ \else
+ \@@vnnummercommando\footnotenumber
+ \fi
+ \fi
+ \iflocation
+ \rawreference{\s!fnt}{\s!fnt:t:\internalfootreference}{}%
+ \fi}%
+ \bgroup
+ \aftergroup\dostopfootnote
+ \begstrut
+ \let\next}
+
+\def\dostopfootnote%
+ {\endstrut
+ \stoppushfootnote
+ \egroup
+ \egroup
+ \kern\footnotesignal\relax} % \relax is needed to honor spaces
+
+%D \macros
+%D {note}
+%D
+%D Refering to a note is accomplished by the rather short
+%D command:
+%D
+%D \showsetup{\y!note}
+%D
+%D This command is implemented rather straightforward as:
+
+\def\note[#1]%
+ {\iffootnotesenabled
+ \bgroup
+ \unskip
+ \naarbox{\hoog{\currenttextreference}}[#1]%
+ \egroup
+ \fi}
+
+%D Normally footnotes are saved as inserts that are called upon
+%D as soon as the pagebody is constructed. The footnote
+%D insertion routine looks just like the \PLAIN\ \TEX\ one,
+%D except that we check for the end note state.
+
+\let\startpopfootnotes = \relax
+\let\stoppopfootnotes = \relax
+
+\def\placefootnoteinserts%
+ {%\ifvoid\footins \else % unsafe, strange
+ \ifdim\ht\footins>\!!zeropoint\relax
+ \ifendnotes \else
+ \@@vnvoor
+ \footnoterule % alleen in ..mode
+ \bgroup
+ \setfootnotebodyfont
+ \localframed
+ [\??vn]
+ [\c!breedte=\v!passend,
+ \c!hoogte=\v!passend,
+ \c!strut=\v!nee,
+ \c!offset=\v!overlay]
+ {\startpopfootnotes % == \vbox
+ \ifdim\dp\footins=\!!zeropoint % this hack is needed because \vadjust
+ \hbox{\lower\dp\strutbox\box\footins}% % in margin number placement
+ \else % hides the (always) present depth
+ \box\footins
+ \fi
+ \stoppopfootnotes}%
+ \egroup
+ \@@vnna
+ \fi
+ \fi}
+
+%D Supporting end notes is surprisingly easy. Even better, we
+%D can combine this feature with solving the common \TEX\
+%D problem of disappearing inserts when they're called for in
+%D deeply nested boxes. The general case looks like:
+%D
+%D \starttypen
+%D \postponefootnotes
+%D \.box{whatever we want with footnotes}
+%D \flushfootnotes
+%D \stoptypen
+%D
+%D This alternative can be used in headings, captions, tables
+%D etc. The latter one sometimes calls for notes local to
+%D the table, which can be realized by saying
+%D
+%D \starttypen
+%D \setlocalfootnotes
+%D some kind of table with local footnotes
+%D \placelocalfootnotes
+%D \stoptypen
+%D
+%D Postponing is accomplished by simply redefining the (local)
+%D insert operation. A not too robust method uses the
+%D \type{\insert} primitive when possible. This method fails in
+%D situations where it's not entirely clear in what mode \TEX\
+%D is. Therefore the auto method can is to be overruled when
+%D needed.
+
+\newbox\postponedfootnotes
+
+\def\autopostponefootnotes%
+ {\gdef\localfootinsert%
+ {\ifinner
+ %\message{[postponed footnote]}%
+ \global\setbox\postponedfootnotes=\vbox\bgroup
+ \unvbox\postponedfootnotes
+ \let\next=\gobbletwoarguments
+ \else
+ %\message{[inserted footnote]}%
+ \let\next=\insert
+ \fi
+ \next}}
+
+\def\postponefootnotes%
+ {\let\autopostponefootnotes=\postponefootnotes
+ \gdef\localfootinsert%
+ {%\message{[postponed footnote]}%
+ \global\setbox\postponedfootnotes=\vbox\bgroup
+ \unvbox\postponedfootnotes
+ \gobbletwoarguments}}
+
+\def\doflushfootnotes%
+ {\bgroup
+ \scratchdimen=\pagegoal
+ \advance\scratchdimen by -\pagetotal
+ \ifdim\scratchdimen<\ht\postponedfootnotes
+ \message{[moved footnote]}%
+ \fi
+ \egroup
+ \global\let\localfootinsert=\insert
+ \insert\footins\bgroup\unvbox\postponedfootnotes\egroup}
+
+\def\flushfootnotes%
+ {\ifinpagebody \else \ifinner \else
+ \ifendnotes \else \ifvoid\postponedfootnotes \else
+ %\ifvmode % less interference, but also less secure
+ \doflushfootnotes
+ %\fi
+ \fi\fi
+ \fi\fi}
+
+\def\placefootnotesintext#1%
+ {\par
+ \witruimte
+ \@@vnvoor
+ \snaptogrid\hbox
+ {\setfootnotebodyfont
+ \setbox0=\hbox
+ {\startpopfootnotes
+ \unvbox#1\par\relax
+ \stoppopfootnotes}%
+ \localframed
+ [\??vn]
+ [\c!breedte=\v!passend,
+ \c!hoogte=\v!passend,
+ \c!strut=\v!nee,
+ \c!offset=\v!overlay]
+ {\ifdim\dp0=\!!zeropoint % this hack is needed because \vadjust
+ \hbox{\lower\dp\strutbox\box0}% % in margin number placement
+ \else % hides the (always) present depth
+ \box0
+ \fi}}%
+ \@@vnna}
+
+%D \macros
+%D {startlocalfootnotes,placelocalfootnotes}
+%D
+%D The next two macros can be used in for instance tables, as
+%D we'll demonstrate later on.
+%D
+%D \showsetup{\y!startlocalfootnotes}
+%D \showsetup{\y!placelocalfootnotes}
+
+\newbox\localpostponedfootnotes
+
+\def\collectlocalfootnotes%
+ {\gdef\localfootinsert##1%
+ {%\message{[local footnote]}%
+ \global\setbox\localpostponedfootnotes=\vbox\bgroup
+ \unvbox\localpostponedfootnotes
+ \let\next}}
+
+\def\dostartlocalfootnotes[#1]%
+ {\let\autopostponefootnotes=\postponefootnotes
+ \let\postponefootnotes=\collectlocalfootnotes
+ \setupfootnotes[#1]%
+ \savenumber[\v!voetnoot]%
+ \resetnummer[\v!voetnoot]%
+ \collectlocalfootnotes}
+
+\def\startlocalfootnotes%
+ {\bgroup % here because we support \vbox\startlocalfootnotes
+ \dosingleempty\dostartlocalfootnotes}
+
+\def\stoplocalfootnotes%
+ {\restorenumber[\v!voetnoot]%
+ \egroup}
+
+\def\doplacelocalfootnotes[#1]%
+ {\bgroup
+ \setupfootnotes[#1]%
+ \placefootnotesintext\localpostponedfootnotes
+ \egroup}
+
+\def\placelocalfootnotes%
+ {\dosingleempty\doplacelocalfootnotes}
+
+%D These commands can be used like:
+%D
+%D \startbuffer
+%D \startlocalfootnotes[breedte=.3\hsize,n=0]
+%D \plaatstabel
+%D {Some Table}
+%D \plaatsonderelkaar
+%D {\starttabel[|l|r|]
+%D \HL
+%D \VL Nota\voetnoot{Bene} \VL Bene\voetnoot{Nota} \VL\SR
+%D \VL Bene\voetnoot{Nota} \VL Nota\voetnoot{Bene} \VL\SR
+%D \HL
+%D \stoptabel}
+%D {\placelocalfootnotes}
+%D \stoplocalfootnotes
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Because this table placement macro expect box content, and
+%D thanks to the grouping of the local footnotes, we don't need
+%D additional braces.
+%D
+%D \haalbuffer
+
+%D \macros
+%D {placefootnotes}
+%D
+%D We still have no decent command for placing footnotes
+%D somewhere else than at the bottom of the page (for which no
+%D user action is needed). Footnotes (endnotes) can be
+%D placed by using
+%D
+%D \showsetup{\y!placefootnotes}
+
+\def\doplacefootnotes[#1]%
+ {\bgroup
+ \let\@@vnhoogte=\teksthoogte
+ \setupfootnotes[#1]%
+ \ifendnotes
+ \ifinpagebody \else
+ \placefootnotesintext\postponedfootnotes
+ \fi
+ \else
+ \placefootnoteinserts
+ \fi
+ \egroup}
+
+\def\placefootnotes%
+ {\dosingleempty\doplacefootnotes}
+
+%D Now how can this mechanims be hooked into \CONTEXT\ without
+%D explictly postponing footnotes? The solution turned out to
+%D be rather simple:
+%D
+%D \starttypen
+%D \everypar {...\flushfootnotes...}
+%D \neverypar {...\postponefootnoes}
+%D \stoptypen
+%D
+%D and
+%D
+%D \starttypen
+%D \def\ejectinsert%
+%D {...
+%D \flushfootnotes
+%D ...}
+%D \stoptypen
+%D
+%D We can use \type{\neverypar} because in most commands
+%D sensitive to footnote gobbling we disable \type{\everypar}
+%D in favor for \type{\neverypar}. In fact, this footnote
+%D implementation is the first to use this scheme.
+
+%D When typesetting footnotes, we have to return to the
+%D footnote specific bodyfont size, which is in most cases derived
+%D from the global document bodyfont size. In the previous macros
+%D we already used a footnote specific font setting macro.
+
+\def\setfootnotebodyfont%
+ {\restoreglobalbodyfont
+ \switchtobodyfont[\@@vnkorps]}
+
+%D The footnote mechanism defaults to a traditional one
+%D column way of showing them. By default we precede them by
+%D a small line.
+
+\setupfootnotes
+ [\c!plaats=\v!pagina,
+ \c!wijze=\v!per\v!deel,
+ \c!sectienummer=\v!nee,
+ \c!conversie=,
+ \c!lijn=\v!aan,
+ \c!voor=\blanko,
+ \c!korps=\v!klein,
+ \c!letter=,
+ \c!kleur=,
+ \c!na=,
+ \c!kader=\v!uit,
+ \c!margeafstand=.5em,
+ \c!kolomafstand=1em,
+ \c!afstand=.125em,
+ \c!breedte=\zetbreedte,
+ \c!hoogte=\teksthoogte,
+ \c!nummercommando=\hoog,
+ \c!n=1]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-obj.tex b/tex/context/base/core-obj.tex index 8a767a68e..73902f265 100644 --- a/tex/context/base/core-obj.tex +++ b/tex/context/base/core-obj.tex @@ -1,106 +1,106 @@ -%D \module -%D [ file=core-obj, -%D version=1998.01.15, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Object Handling, -%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 Core Macros / Object Handling} - -\unprotect - -\startmessages dutch library: references - 30: onbekend object -- -\stopmessages - -\startmessages english library: references - 30: unknown object -- -\stopmessages - -\startmessages german library: references - 30: unbekanntes Object -- -\stopmessages - -%D Boxes can be considered reuable objects. Unfortunaltely once -%D passed to the \DVI\ file, such objects cannot be reused. In -%D \PDF\ however, reusing is possible and sometimes even a -%D necessity. Therefore, \CONTEXT\ supports reusable objects. -%D -%D During the \TEX\ processing run, boxes can serve the purpose -%D of objects, and the \DVI\ driver module implements objects -%D using boxes. Only when \ETEX\ is widespread, and therefore -%D the limit on 256 boxes is removed, this becomes useful. -%D -%D The \PDF\ and \PDFTEX\ driver modules implement objects -%D using \PDF\ forms. There is no (real) restriction on the -%D number of objects there. -%D -%D The first application of objects in \CONTEXT\ concerned -%D \METAPOST\ graphics and fill||in form fields. The first -%D application can save lots of bytes, while the latter use is -%D more a necessity than byte saving. -%D -%D \starttypen -%D \setobject{name}=\somebox{} -%D \getobject{name} -%D \stoptypen -%D -%D Here \type{\somebox} can be whatever box specification -%D suits \TEX. - -\def\setobject#1% - {\dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}% - \dowithnextbox - {\setxvalue{\r!object#1}% - {\noexpand\dogetobject{#1} - {\ifhbox\nextbox\hbox\else\vbox\fi} - {\the\wd\nextbox}{\the\ht\nextbox}{\the\dp\nextbox}}% - \dostartobject{#1}% - {\number\wd\nextbox}{\number\ht\nextbox}{\number\dp\nextbox}% - \box\nextbox - \dostopobject}} - -\def\dogetobject#1#2#3#4#5% - {\dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}% - \bgroup - \setbox0=\vbox to #4{\vfill\doinsertobject{#1}}% - \setbox0=#2{\box0}% - \wd0=#3\ht0=#4\dp0=#5\relax - \box0 - \egroup} - -\def\getobject#1% - {\getvalue{\r!object#1}} - -%D We keep track of object references by means of the cross -%D reference mechanism. Normally, objects are defined before -%D they are used, but forward referencing sometimes occurs. -%D -%D \starttypen -%D \dosetobjectreference {identifier} {reference value} -%D \dogetobjectreference {identifier} \csname -%D \stoptypen - -\def\dosetobjectreference#1#2% - {\checkreferences - \bgroup - \locationfalse % we don't want this to be a location - \textreference[\r!driver#1]{#2}% - \egroup - \setxvalue{\r!cross\r!driver#1}{\rt!cross{}{0}{#2}{0}}} - -\def\dogetobjectreference#1#2% - {\doifrawreferencefoundelse{\r!driver#1} - {\global\let#2=\currenttextreference} - {\showmessage{\m!references}{30}{[#1]}% - \global\def#2{0}}} - -\protect - -\endinput +%D \module
+%D [ file=core-obj,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Object Handling,
+%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 Core Macros / Object Handling}
+
+\unprotect
+
+\startmessages dutch library: references
+ 30: onbekend object --
+\stopmessages
+
+\startmessages english library: references
+ 30: unknown object --
+\stopmessages
+
+\startmessages german library: references
+ 30: unbekanntes Object --
+\stopmessages
+
+%D Boxes can be considered reuable objects. Unfortunaltely once
+%D passed to the \DVI\ file, such objects cannot be reused. In
+%D \PDF\ however, reusing is possible and sometimes even a
+%D necessity. Therefore, \CONTEXT\ supports reusable objects.
+%D
+%D During the \TEX\ processing run, boxes can serve the purpose
+%D of objects, and the \DVI\ driver module implements objects
+%D using boxes. Only when \ETEX\ is widespread, and therefore
+%D the limit on 256 boxes is removed, this becomes useful.
+%D
+%D The \PDF\ and \PDFTEX\ driver modules implement objects
+%D using \PDF\ forms. There is no (real) restriction on the
+%D number of objects there.
+%D
+%D The first application of objects in \CONTEXT\ concerned
+%D \METAPOST\ graphics and fill||in form fields. The first
+%D application can save lots of bytes, while the latter use is
+%D more a necessity than byte saving.
+%D
+%D \starttypen
+%D \setobject{name}=\somebox{}
+%D \getobject{name}
+%D \stoptypen
+%D
+%D Here \type{\somebox} can be whatever box specification
+%D suits \TEX.
+
+\def\setobject#1%
+ {\dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}%
+ \dowithnextbox
+ {\setxvalue{\r!object#1}%
+ {\noexpand\dogetobject{#1}
+ {\ifhbox\nextbox\hbox\else\vbox\fi}
+ {\the\wd\nextbox}{\the\ht\nextbox}{\the\dp\nextbox}}%
+ \dostartobject{#1}%
+ {\number\wd\nextbox}{\number\ht\nextbox}{\number\dp\nextbox}%
+ \box\nextbox
+ \dostopobject}}
+
+\def\dogetobject#1#2#3#4#5%
+ {\dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}%
+ \bgroup
+ \setbox0=\vbox to #4{\vfill\doinsertobject{#1}}%
+ \setbox0=#2{\box0}%
+ \wd0=#3\ht0=#4\dp0=#5\relax
+ \box0
+ \egroup}
+
+\def\getobject#1%
+ {\getvalue{\r!object#1}}
+
+%D We keep track of object references by means of the cross
+%D reference mechanism. Normally, objects are defined before
+%D they are used, but forward referencing sometimes occurs.
+%D
+%D \starttypen
+%D \dosetobjectreference {identifier} {reference value}
+%D \dogetobjectreference {identifier} \csname
+%D \stoptypen
+
+\def\dosetobjectreference#1#2%
+ {\checkreferences
+ \bgroup
+ \locationfalse % we don't want this to be a location
+ \textreference[\r!driver#1]{#2}%
+ \egroup
+ \setxvalue{\r!cross\r!driver#1}{\rt!cross{}{0}{#2}{0}}}
+
+\def\dogetobjectreference#1#2%
+ {\doifrawreferencefoundelse{\r!driver#1}
+ {\global\let#2=\currenttextreference}
+ {\showmessage{\m!references}{30}{[#1]}%
+ \global\def#2{0}}}
+
+\protect
+
+\endinput
diff --git a/tex/context/base/core-pag.tex b/tex/context/base/core-pag.tex index 52e2d478d..d8b4c2f5e 100644 --- a/tex/context/base/core-pag.tex +++ b/tex/context/base/core-pag.tex @@ -1,284 +1,284 @@ -%D \module -%D [ file=core-pag, -%D version=1998.01.15, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Pagebody Building, -%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 Core Macros / Pagebody Building} - -\unprotect - -\newbox\arrangedpageA -\newbox\arrangedpageB - -\newif\ifswaparranged -\newif\ifnegatearranged -\newif\ifmirrorarranged -\newif\ifdoublearranged - -\def\arrangedrotationO{0} -\def\arrangedrotationE{0} - -\newcounter\arrangedpageN -\chardef\arrangedpageT=1 - -\def\stelarrangerenin[#1]% - {\global\negatearrangedfalse - \global\mirrorarrangedfalse - \global\doublearrangedfalse - \gdef\arrangedrotationO{0}% - \gdef\arrangedrotationE{180}% - \global\arrangingpagestrue - \processallactionsinset - [#1] - [ \v!gespiegeld=>\global\mirrorarrangedtrue, - \v!dubbelzijdig=>\global\doublearrangedtrue, - \v!negatief=>\global\negatearrangedtrue, - \v!geroteerd=>\gdef\arrangedrotationO{90}\gdef\arrangedrotationE{270}, - 90=>\gdef\arrangedrotationO{90}\gdef\arrangedrotationE{270}, - 180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0}, - 270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90}, - 2*8=>\global\chardef\arrangedpageX=4 - \global\chardef\arrangedpageY=2 - \global\chardef\arrangedpageT=8 - \global\chardef\horizontalcutmarks=5 - \global\chardef\verticalcutmarks=3 - \global\let\pusharrangedpage=\pusharrangedpageSIXTEEN - \global\let\poparrangedpages=\poparrangedpagesAB, - 2*4=>\global\chardef\arrangedpageX=2 - \global\chardef\arrangedpageY=2 - \global\chardef\arrangedpageT=4 - \global\chardef\horizontalcutmarks=3 - \global\chardef\verticalcutmarks=3 - \global\let\pusharrangedpage=\pusharrangedpageEIGHT - \global\let\poparrangedpages=\poparrangedpagesAB, - 2*2=>\global\chardef\arrangedpageX=2 - \global\chardef\arrangedpageY=1 - \global\chardef\arrangedpageT=2 - \global\chardef\horizontalcutmarks=3 - \global\chardef\verticalcutmarks=2 - \global\let\pusharrangedpage=\pusharrangedpageFOUR - \global\let\poparrangedpages=\poparrangedpagesAB, - 2UP=>\global\chardef\arrangedpageX=2 - \global\chardef\arrangedpageY=1 - \global\chardef\arrangedpageT=4 - \global\chardef\horizontalcutmarks=3 - \global\chardef\verticalcutmarks=2 - \global\let\handlearrangedpage=\handlearrangedpageTWOUP - \global\let\pusharrangedpage=\pusharrangedpageTWO - \global\let\poparrangedpages=\poparrangedpagesTWO, - 2DOWN=>\global\chardef\arrangedpageX=1 - \global\chardef\arrangedpageY=2 - \global\chardef\arrangedpageT=4 - \global\chardef\horizontalcutmarks=2 - \global\chardef\verticalcutmarks=3 - \global\let\handlearrangedpage=\handlearrangedpageTWODOWN - \global\let\pusharrangedpage=\pusharrangedpageTWO - \global\let\poparrangedpages=\poparrangedpagesTWO, - \s!reset=>\global\arrangingpagesfalse, - \s!unknown=>\global\arrangingpagesfalse, - \s!default=>\global\arrangingpagesfalse]% - \doifcommonelse{#1}{90,270} - {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution - \ifarrangingpages - \abortutilitygeneration - \fi} - -\def\filluparrangedpages% beware: \realpageno is 1 ahead - {\ifarrangingpages - \scratchcounter=-\realpageno - \divide\scratchcounter by \arrangedpageT - \multiply\scratchcounter by \arrangedpageT - \advance\scratchcounter by \realpageno - \advance\scratchcounter by -1 - \dorecurse{\scratchcounter} - {\geenhoofdenvoetregels - \insertdummypage} - \fi} - -\def\handlearrangedpageXY#1#2#3#4#5% - {\global\setbox#5=\hbox to \arrangedpageX\papierbreedte - {\setbox\scratchbox=\vbox to \arrangedpageY\papierhoogte - {\forgetall - \offinterlineskip - \mindermeldingen - \vskip#4\papierhoogte - \hskip#3\papierbreedte - \dorotatebox{#2}\hbox{\box#1}% - \vfill}% - \wd\scratchbox=\!!zeropoint - \box\scratchbox\box#5\hss}} - -\def\gotonextarrangepage% - {\global\advance\arrangeno by 1 - \def\pagecutmarksymbol% - {\the\arrangeno}} - -\def\outputarrangedbox#1% - {\bgroup - \gotonextarrangepage - \ifnum\arrangedrotationO\arrangedrotationE>0 - \ifdoublearranged - \ifodd\arrangeno - \setbox#1=\vbox{\dorotatebox\arrangedrotationO\hbox{\box#1}}% - \else - \setbox#1=\vbox{\dorotatebox\arrangedrotationE\hbox{\box#1}}% - \fi - \else - \setbox#1=\vbox{\dorotatebox\arrangedrotationO\hbox{\box#1}}% - \fi - \fi - \ifmirrorarranged - \setbox#1=\vbox{\domirrorbox\vbox{\box#1}}% - \fi - \ifnegatearranged - \negatecolorbox{#1}% - \fi - \finishpagebox#1 - \actualshipout{\box#1}% - \egroup} - -% 16/8/4 - -\def\poparrangedpagesAB% - {\ifnum\arrangedpageN>0 - \mindermeldingen - \papierbreedte=\arrangedpageX\papierbreedte - \papierhoogte=\arrangedpageY\papierhoogte - \outputarrangedbox\arrangedpageA - \outputarrangedbox\arrangedpageB - \doglobal\newcounter\arrangedpageN - \fi} - -\def\pusharrangedpageSIXTEEN#1% - {\doglobal\increment\arrangedpageN - \reportarrangedpage\arrangedpageN - \ifcase\arrangedpageN - \or \handlearrangedpageXY{#1}{180}{0}{1}\arrangedpageA % 1 - \or \handlearrangedpageXY{#1}{180}{3}{1}\arrangedpageB % 2 - \or \handlearrangedpageXY{#1}{180}{0}{1}\arrangedpageB % 3 - \or \handlearrangedpageXY{#1}{180}{3}{1}\arrangedpageA % 4 - \or \handlearrangedpageXY{#1} {0}{3}{0}\arrangedpageA % 5 - \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageB % 6 - \or \handlearrangedpageXY{#1} {0}{3}{0}\arrangedpageB % 7 - \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageA % 8 - \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageA % 9 - \or \handlearrangedpageXY{#1} {0}{2}{0}\arrangedpageB % 10 - \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageB % 11 - \or \handlearrangedpageXY{#1} {0}{2}{0}\arrangedpageA % 12 - \or \handlearrangedpageXY{#1}{180}{2}{1}\arrangedpageA % 13 - \or \handlearrangedpageXY{#1}{180}{1}{1}\arrangedpageB % 14 - \or \handlearrangedpageXY{#1}{180}{2}{1}\arrangedpageB % 15 - \or \handlearrangedpageXY{#1}{180}{1}{1}\arrangedpageA % 16 - \poparrangedpages - \fi} - -\def\pusharrangedpageEIGHT#1% - {\doglobal\increment\arrangedpageN - \reportarrangedpage\arrangedpageN - \ifcase\arrangedpageN - \or \handlearrangedpageXY{#1}{180}{0}{1}\arrangedpageA % 1 - \or \handlearrangedpageXY{#1}{180}{1}{1}\arrangedpageB % 2 - \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageB % 3 - \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageA % 4 - \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageA % 5 - \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageB % 6 - \or \handlearrangedpageXY{#1}{180}{0}{1}\arrangedpageB % 7 - \or \handlearrangedpageXY{#1}{180}{1}{1}\arrangedpageA % 8 - \poparrangedpages - \fi} - -\def\pusharrangedpageFOUR#1% - {\doglobal\increment\arrangedpageN - \reportarrangedpage\arrangedpageN - \ifcase\arrangedpageN - \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageA % 1 - \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageB % 2 - \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageB % 3 - \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageA % 4 - \poparrangedpages - \fi} - -% 2UP/2DOWN / 1pt prevents overflow - -\def\splitoffarrangedpagesTWO% - {\splittopskip\!!zeropoint - \global\setbox\arrangedpageA=\vsplit\arrangedpageB to \!!onepoint - \scratchdimen=\ht\arrangedpageB - \advance\scratchdimen by -\!!onepoint - \ifdim\scratchdimen>\!!onepoint - \setbox\scratchbox=\vsplit\arrangedpageB to \scratchdimen - \fi} - -\def\handlearrangedpageTWOUP% - {\splitoffarrangedpagesTWO - \ifswaparranged - \global\setbox\arrangedpageA=\hbox - {\box\arrangedpageA\box\arrangedpageB}% - \swaparrangedfalse - \else - \global\setbox\arrangedpageA=\hbox - {\box\arrangedpageB\box\arrangedpageA}% - \swaparrangedtrue - \fi - \global\ht\arrangedpageA=\papierhoogte - \global\setbox\arrangedpageB=\box\scratchbox} - -\def\handlearrangedpageTWODOWN% - {\splitoffarrangedpagesTWO - \global\ht\arrangedpageA=\papierhoogte - \global\ht\arrangedpageB=\papierhoogte - \ifswaparranged - \global\setbox\arrangedpageA=\vbox - {\forgetall\offinterlineskip\vskip\papierhoogte - \box\arrangedpageA\box\arrangedpageB}% - \swaparrangedfalse - \else - \global\setbox\arrangedpageA=\vbox - {\forgetall\offinterlineskip\vskip\papierhoogte - \box\arrangedpageB\box\arrangedpageA}% - \swaparrangedtrue - \fi - \global\setbox\arrangedpageB=\box\scratchbox} - -\def\poparrangedpagesTWO% - {\ifnum\arrangedpageN>0 - \mindermeldingen - \swaparrangedfalse - \doloop - {\handlearrangedpage - \bgroup - \papierbreedte=\arrangedpageX\papierbreedte - \papierhoogte=\arrangedpageY\papierhoogte - \ht\arrangedpageA=\papierhoogte - \wd\arrangedpageA=\papierbreedte - \outputarrangedbox\arrangedpageA - \egroup - \ifdim\ht\arrangedpageB=\!!zeropoint - \exitloop - \fi}% - \doglobal\newcounter\arrangedpageN - \fi} - -\def\pusharrangedpageTWO#1% - {\doglobal\increment\arrangedpageN - \reportarrangedpage\arrangedpageN - \global\setbox\arrangedpageB=\vbox - {\forgetall - \offinterlineskip - \unvbox\arrangedpageB - \allowbreak - \ht#1=\!!onepoint - \dp#1=\!!zeropoint - \vbox{\box#1}}} - -\protect - -\endinput +%D \module
+%D [ file=core-pag,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Pagebody Building,
+%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 Core Macros / Pagebody Building}
+
+\unprotect
+
+\newbox\arrangedpageA
+\newbox\arrangedpageB
+
+\newif\ifswaparranged
+\newif\ifnegatearranged
+\newif\ifmirrorarranged
+\newif\ifdoublearranged
+
+\def\arrangedrotationO{0}
+\def\arrangedrotationE{0}
+
+\newcounter\arrangedpageN
+\chardef\arrangedpageT=1
+
+\def\stelarrangerenin[#1]%
+ {\global\negatearrangedfalse
+ \global\mirrorarrangedfalse
+ \global\doublearrangedfalse
+ \gdef\arrangedrotationO{0}%
+ \gdef\arrangedrotationE{180}%
+ \global\arrangingpagestrue
+ \processallactionsinset
+ [#1]
+ [ \v!gespiegeld=>\global\mirrorarrangedtrue,
+ \v!dubbelzijdig=>\global\doublearrangedtrue,
+ \v!negatief=>\global\negatearrangedtrue,
+ \v!geroteerd=>\gdef\arrangedrotationO{90}\gdef\arrangedrotationE{270},
+ 90=>\gdef\arrangedrotationO{90}\gdef\arrangedrotationE{270},
+ 180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0},
+ 270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90},
+ 2*8=>\global\chardef\arrangedpageX=4
+ \global\chardef\arrangedpageY=2
+ \global\chardef\arrangedpageT=8
+ \global\chardef\horizontalcutmarks=5
+ \global\chardef\verticalcutmarks=3
+ \global\let\pusharrangedpage=\pusharrangedpageSIXTEEN
+ \global\let\poparrangedpages=\poparrangedpagesAB,
+ 2*4=>\global\chardef\arrangedpageX=2
+ \global\chardef\arrangedpageY=2
+ \global\chardef\arrangedpageT=4
+ \global\chardef\horizontalcutmarks=3
+ \global\chardef\verticalcutmarks=3
+ \global\let\pusharrangedpage=\pusharrangedpageEIGHT
+ \global\let\poparrangedpages=\poparrangedpagesAB,
+ 2*2=>\global\chardef\arrangedpageX=2
+ \global\chardef\arrangedpageY=1
+ \global\chardef\arrangedpageT=2
+ \global\chardef\horizontalcutmarks=3
+ \global\chardef\verticalcutmarks=2
+ \global\let\pusharrangedpage=\pusharrangedpageFOUR
+ \global\let\poparrangedpages=\poparrangedpagesAB,
+ 2UP=>\global\chardef\arrangedpageX=2
+ \global\chardef\arrangedpageY=1
+ \global\chardef\arrangedpageT=4
+ \global\chardef\horizontalcutmarks=3
+ \global\chardef\verticalcutmarks=2
+ \global\let\handlearrangedpage=\handlearrangedpageTWOUP
+ \global\let\pusharrangedpage=\pusharrangedpageTWO
+ \global\let\poparrangedpages=\poparrangedpagesTWO,
+ 2DOWN=>\global\chardef\arrangedpageX=1
+ \global\chardef\arrangedpageY=2
+ \global\chardef\arrangedpageT=4
+ \global\chardef\horizontalcutmarks=2
+ \global\chardef\verticalcutmarks=3
+ \global\let\handlearrangedpage=\handlearrangedpageTWODOWN
+ \global\let\pusharrangedpage=\pusharrangedpageTWO
+ \global\let\poparrangedpages=\poparrangedpagesTWO,
+ \s!reset=>\global\arrangingpagesfalse,
+ \s!unknown=>\global\arrangingpagesfalse,
+ \s!default=>\global\arrangingpagesfalse]%
+ \doifcommonelse{#1}{90,270}
+ {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
+ \ifarrangingpages
+ \abortutilitygeneration
+ \fi}
+
+\def\filluparrangedpages% beware: \realpageno is 1 ahead
+ {\ifarrangingpages
+ \scratchcounter=-\realpageno
+ \divide\scratchcounter by \arrangedpageT
+ \multiply\scratchcounter by \arrangedpageT
+ \advance\scratchcounter by \realpageno
+ \advance\scratchcounter by -1
+ \dorecurse{\scratchcounter}
+ {\geenhoofdenvoetregels
+ \insertdummypage}
+ \fi}
+
+\def\handlearrangedpageXY#1#2#3#4#5%
+ {\global\setbox#5=\hbox to \arrangedpageX\papierbreedte
+ {\setbox\scratchbox=\vbox to \arrangedpageY\papierhoogte
+ {\forgetall
+ \offinterlineskip
+ \mindermeldingen
+ \vskip#4\papierhoogte
+ \hskip#3\papierbreedte
+ \dorotatebox{#2}\hbox{\box#1}%
+ \vfill}%
+ \wd\scratchbox=\!!zeropoint
+ \box\scratchbox\box#5\hss}}
+
+\def\gotonextarrangepage%
+ {\global\advance\arrangeno by 1
+ \def\pagecutmarksymbol%
+ {\the\arrangeno}}
+
+\def\outputarrangedbox#1%
+ {\bgroup
+ \gotonextarrangepage
+ \ifnum\arrangedrotationO\arrangedrotationE>0
+ \ifdoublearranged
+ \ifodd\arrangeno
+ \setbox#1=\vbox{\dorotatebox\arrangedrotationO\hbox{\box#1}}%
+ \else
+ \setbox#1=\vbox{\dorotatebox\arrangedrotationE\hbox{\box#1}}%
+ \fi
+ \else
+ \setbox#1=\vbox{\dorotatebox\arrangedrotationO\hbox{\box#1}}%
+ \fi
+ \fi
+ \ifmirrorarranged
+ \setbox#1=\vbox{\domirrorbox\vbox{\box#1}}%
+ \fi
+ \ifnegatearranged
+ \negatecolorbox{#1}%
+ \fi
+ \finishpagebox#1
+ \actualshipout{\box#1}%
+ \egroup}
+
+% 16/8/4
+
+\def\poparrangedpagesAB%
+ {\ifnum\arrangedpageN>0
+ \mindermeldingen
+ \papierbreedte=\arrangedpageX\papierbreedte
+ \papierhoogte=\arrangedpageY\papierhoogte
+ \outputarrangedbox\arrangedpageA
+ \outputarrangedbox\arrangedpageB
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+\def\pusharrangedpageSIXTEEN#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXY{#1}{180}{0}{1}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}{180}{3}{1}\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1}{180}{0}{1}\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1}{180}{3}{1}\arrangedpageA % 4
+ \or \handlearrangedpageXY{#1} {0}{3}{0}\arrangedpageA % 5
+ \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageB % 6
+ \or \handlearrangedpageXY{#1} {0}{3}{0}\arrangedpageB % 7
+ \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageA % 8
+ \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageA % 9
+ \or \handlearrangedpageXY{#1} {0}{2}{0}\arrangedpageB % 10
+ \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageB % 11
+ \or \handlearrangedpageXY{#1} {0}{2}{0}\arrangedpageA % 12
+ \or \handlearrangedpageXY{#1}{180}{2}{1}\arrangedpageA % 13
+ \or \handlearrangedpageXY{#1}{180}{1}{1}\arrangedpageB % 14
+ \or \handlearrangedpageXY{#1}{180}{2}{1}\arrangedpageB % 15
+ \or \handlearrangedpageXY{#1}{180}{1}{1}\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageEIGHT#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXY{#1}{180}{0}{1}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}{180}{1}{1}\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageA % 4
+ \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageA % 5
+ \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageB % 6
+ \or \handlearrangedpageXY{#1}{180}{0}{1}\arrangedpageB % 7
+ \or \handlearrangedpageXY{#1}{180}{1}{1}\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+\def\pusharrangedpageFOUR#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXY{#1} {0}{1}{0}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1} {0}{0}{0}\arrangedpageA % 4
+ \poparrangedpages
+ \fi}
+
+% 2UP/2DOWN / 1pt prevents overflow
+
+\def\splitoffarrangedpagesTWO%
+ {\splittopskip\!!zeropoint
+ \global\setbox\arrangedpageA=\vsplit\arrangedpageB to \!!onepoint
+ \scratchdimen=\ht\arrangedpageB
+ \advance\scratchdimen by -\!!onepoint
+ \ifdim\scratchdimen>\!!onepoint
+ \setbox\scratchbox=\vsplit\arrangedpageB to \scratchdimen
+ \fi}
+
+\def\handlearrangedpageTWOUP%
+ {\splitoffarrangedpagesTWO
+ \ifswaparranged
+ \global\setbox\arrangedpageA=\hbox
+ {\box\arrangedpageA\box\arrangedpageB}%
+ \swaparrangedfalse
+ \else
+ \global\setbox\arrangedpageA=\hbox
+ {\box\arrangedpageB\box\arrangedpageA}%
+ \swaparrangedtrue
+ \fi
+ \global\ht\arrangedpageA=\papierhoogte
+ \global\setbox\arrangedpageB=\box\scratchbox}
+
+\def\handlearrangedpageTWODOWN%
+ {\splitoffarrangedpagesTWO
+ \global\ht\arrangedpageA=\papierhoogte
+ \global\ht\arrangedpageB=\papierhoogte
+ \ifswaparranged
+ \global\setbox\arrangedpageA=\vbox
+ {\forgetall\offinterlineskip\vskip\papierhoogte
+ \box\arrangedpageA\box\arrangedpageB}%
+ \swaparrangedfalse
+ \else
+ \global\setbox\arrangedpageA=\vbox
+ {\forgetall\offinterlineskip\vskip\papierhoogte
+ \box\arrangedpageB\box\arrangedpageA}%
+ \swaparrangedtrue
+ \fi
+ \global\setbox\arrangedpageB=\box\scratchbox}
+
+\def\poparrangedpagesTWO%
+ {\ifnum\arrangedpageN>0
+ \mindermeldingen
+ \swaparrangedfalse
+ \doloop
+ {\handlearrangedpage
+ \bgroup
+ \papierbreedte=\arrangedpageX\papierbreedte
+ \papierhoogte=\arrangedpageY\papierhoogte
+ \ht\arrangedpageA=\papierhoogte
+ \wd\arrangedpageA=\papierbreedte
+ \outputarrangedbox\arrangedpageA
+ \egroup
+ \ifdim\ht\arrangedpageB=\!!zeropoint
+ \exitloop
+ \fi}%
+ \doglobal\newcounter\arrangedpageN
+ \fi}
+
+\def\pusharrangedpageTWO#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \global\setbox\arrangedpageB=\vbox
+ {\forgetall
+ \offinterlineskip
+ \unvbox\arrangedpageB
+ \allowbreak
+ \ht#1=\!!onepoint
+ \dp#1=\!!zeropoint
+ \vbox{\box#1}}}
+
+\protect
+
+\endinput
diff --git a/tex/context/base/core-ref.tex b/tex/context/base/core-ref.tex index 3e8d0968b..57a844ffb 100644 --- a/tex/context/base/core-ref.tex +++ b/tex/context/base/core-ref.tex @@ -1,1876 +1,1869 @@ -% DUE TO NEW/FUTURE FEATURES THIS MODULE IS UNDER RECONSTRUCTION ! -% -% uitprinten -% engels maken -% rommel voorlopig naar core-01d -% programma, profiel etc als methode - -%D \module -%D [ file=core-ref, -%D version=1998.01.15, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Cross Referencing, -%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 Core Macros / Cross Referencing} - -\unprotect - -\startmessages dutch library: references - title: verwijzingen - 1: onbekende verwijzing -- - 2: dubbele verwijzing -- op pagina -- - 3: type verwijzing -- onbekend - 21: document -- geladen - 22: document -- is niet interactief - 23: onduidelijke verwijzing -- (prefix=--) -\stopmessages - -\startmessages english library: references - title: references - 1: unknown reference -- - 2: duplicate reference -- on page -- - 3: unknown reference type -- - 21: document -- loaded - 22: document -- is not interactive - 23: obscure reference -- (prefix=--) -\stopmessages - -\startmessages german library: references - title: referenzen - 1: unbekannte Referenz -- - 2: doppelte Referenz -- auf Seite -- - 3: unbekannte Referenz Typ -- - 21: Dokument -- geladen - 22: Dokument -- ist nicht aktiv - 23: Obskure Referenz -- (Prefix=--) -\stopmessages - -%D This module deals with referencing. In \CONTEXT\ referencing -%D is one of the core features, although at a first glance -%D probably nobody will notice. This is good, because -%D referencing should be as hidden as possible. -%D -%D In paper documents, referencing comes down to cross -%D referencing, but in their interactive counterparts, is also -%D involves navigation. Many features implemented here are -%D therefore closely related to navigation. -%D -%D Many \CONTEXT\ commands can optionally be fed with a -%D reference. Such a reference, when called upon, returns the -%D number of a figure, table, chapter etc, a piece of text, or -%D a pagenumber. -%D -%D There are three ways of defining a reference: -%D -%D \starttypen -%D \pagereference[here] -%D \textreference[here]{some text} -%D \stoptypen -%D -%D the third alternative combines them in: -%D -%D \starttypen -%D \reference[here]{some text} -%D \stoptypen - -\def\textreference {\dosingleargument\dotextreference} -\def\pagereference {\dosingleargument\dopagereference} -\def\reference {\dosingleargument\doreference} - -%D These are implemented in a low level form as: - -\def\dotextreference[#1]#2{\rawtextreference{\s!txt}{#1}{#2}} -\def\dopagereference [#1]{\rawpagereference{\s!pag}{#1}} -\def\doreference [#1]#2{\rawreference {\s!ref}{#1}{#2}} - -%D Actually there is not much difference between a text and a -%D full reference, but it's the concept that counts. The low -%D level implementation is: - -\def\rawpagereference#1#2% - {\makesectionformat - \writereference{#2} - {\sectionformat::\noexpand\pagenumber} - {\noexpand\realfolio} - {}} - -\def\rawtextreference#1#2#3% - {\writereference{#2} - {} - {} - {#3}} - -\def\rawreference#1#2#3% - {\makesectionformat - \writereference{#2} - {\sectionformat::\noexpand\pagenumber} - {\noexpand\realfolio} - {#3}} - -%D As we can see, these macros depend on three other ones, -%D \type {\makesectionformat}, that generated \type -%D {\sectionformat}, \type {\pagenumber}. The not yet used -%D argument \type{#1} is a tag that specifies the type of -%D reference. -%D -%D Why do we have to write down references? \TEX, and therefore -%D \CONTEXT\ is a batch processing system. During the -%D typesetting process, pages are shipped out, which means that -%D especially forward references are not yet known when the -%D page is typeset. That's why we always need a second (and -%D sometimes even a third) pass to get the cross references -%D right. The same goes for lists and other pagenumber -%D dependant data. -%D -%D Therefore, during a pass, \CONTEXT\ writes the references to -%D a the utility file. The next macro does the job and -%D generates entries like: -%D -%D \starttypen -%D \mainreference{prefix}{reference}{page}{realpage}{text} -%D \stoptypen -%D -%D We did not yet discuss prefixing. Especially in interactive -%D documents, it's not always easy to keep track of duplicate -%D references. The prefix mechanism, which we will describe -%D later on, solves this problem. By (automatically) adding a -%D prefix one keeps references local, but the global ones in -%D view. To enable this feature, we explictly split the prefix -%D from the reference. -%D -%D A former implementation used \type{\removesubstring} to get -%D rid of the don't||use||a||prefix signal (\type{-:}), but the -%D next one proved to be more than twice as fast. - -\let\referenceprefix=\empty -\let\lastreference =\empty - -%D The last reference is saved in a macro named \type -%D {\lastreference} (indeed). To keep track of the order of -%D references, later we will see for what purpose, we maintain -%D a counter. - -\newcount\crossreferencenumber \crossreferencenumber=1 - -\def\writereference#1#2#3#4% - {\ifreferencing - \doifsomething{#1} - {\def\dowritereference##1% - {\xdef\lastreference{##1}% - \@EA\dodowritereference\lastreference\empty\empty\end - {#2}{#3}{#4}}% - \processcommalist[#1]\dowritereference}% - \fi} - -\def\dodowritereference#1#2#3\end#4#5#6% - {\bgroup - \global\advance\crossreferencenumber by 1 - \if#1-\if#2:% - \let\referenceprefix=\empty - \xdef\lastreference{#3}% - \else - \xdef\lastreference{#1#2#3}% - \fi\else - \xdef\lastreference{#1#2#3}% - \fi - \ifx\lastreference\empty \else - \doiffirstreferenceoccurance{\lastreference} - {\thisisdestination{\referenceprefix\lastreference}}% - \@EA\referentieinfo\@EA>\@EA{\lastreference}% - \edef\dododowritereference% - {\writeutilitycommand - {\mainreference{\referenceprefix}{\lastreference}{#4}{#5}{#6}}}% - \dododowritereference - \fi - \egroup} - -%D We will implement \type {\doiffirstreferenceoccurance} -%D later on. - -%D When (during a second pass over the document) references are -%D loaded, they are saved in a macro, one for each reference. -%D In practice this comes to giving \type {\mainreference} a -%D appropriate meaning and loading the utility file. - -%\def\setreferences% -% {\def\mainreference##1##2##3##4##5% -% {\doifundefinedelse{\r!cross\fileprefix##1##2} -% {\setglobalcrossreference{##1##2}{##3}{##4}{##5}} -% {\showmessage{\m!references}{2}{[##1][##2],##4}}}} - -\def\setreferences% - {\def\mainreference##1##2##3##4##5% - {\doifundefinedelse{\r!cross\fileprefix##1##2} - {\setglobalcrossreference{##1##2}{##3}{##4}{##5}} - {\ifcase0##4\else\showmessage{\m!references}{2}{[##1][##2],##4}\fi}}} - -\def\resetreferences% - {\let\mainreference=\gobblefivearguments} - -\resetreferences - -%D Here we see another kind of prefix surface: \type -%D {\fileprefix}. This prefix enables us to use references from -%D different files in one document. This is no really useful in -%D paper documents, but many interactive ones cannot do -%D without. - -\let\fileprefix=\empty - -%D Loading references is done using the normal utility file -%D handling macros. The \type{\hbox} trick prevents spaces -%D creeping in (references are set globally anyway). - -\def\usereferences[#1]% - {\bgroup - \setbox0=\hbox - {\doonlyonce{references:#1}{\doutilities{references}{#1}{}{}{}}}% - \egroup} - -\def\checkreferences% - {\usereferences[\jobname]% - \checkrealpage - \global\let\checkreferences=\relax} - -%D As mentioned we will also use the cross reference mechanism -%D for navigational purposes. The main reason for this is that -%D we want to treat both categories alike: -%D -%D \starttypen -%D \goto{go back}[PreviousJump] -%D \goto{colofon}[colofon page] -%D \stoptypen -%D -%D Here \type{PreviousJump} is handled by the viewer, while the -%D \type{colofon page} reference is, apart from hyperlinking, a -%D rather normal reference. -%D -%D We already saw that cross refences are written to and read -%D from a file. The pure navigational ones don't need to be -%D written to file, but both for fast processing and -%D transparant integration, they are saved internally as a sort -%D of reference. We can easily distinguish such system -%D references from real cross reference ones by their tag: - -\chardef\rt!cross=0 -\chardef\rt!done =1 -\chardef\rt!page =2 -\chardef\rt!exec =3 -\chardef\rt!list =4 - -%D Here the \type{\rt!exec} tags a viewer specific navigational -%D reference, while for instance \type{\rt!page} gives fast -%D access to for instance the previous or next page. The -%D counter serves a purpose to be explained later. - -\newcount\crossreferenceorder - -\def\setlocalcrossreference#1#2#3#4% - {\setevalue{\r!cross\fileprefix#1}{\rt!cross{#2}{#3}{#4}{0}}} - -\def\setglobalcrossreference#1#2#3#4% - {\global\advance\crossreferenceorder by 1 - \setxvalue{\r!cross\fileprefix#1}{\rt!cross{#2}{#3}{#4}{\the\crossreferenceorder}}} - -\def\setlocalsystemreference#1#2#3% - {\setevalue{\r!cross\fileprefix#2}{#1{#3}}} - -\def\setglobalsystemreference#1#2#3% - {\setxvalue{\r!cross\fileprefix#2}{#1{#3}}} - -%D References from other files are defined globally without -%D ordering data. The first definition, the one without -%D \type{#1}, is used as a signal that references are defined. - -\def\setoutercrossreference#1#2#3#4% - {\setxvalue{\r!cross\fileprefix}{\rt!cross{}{}{1}{0}}% - \setxvalue{\r!cross\fileprefix#1}{\rt!cross{#2}{#3}{#4}{0}}} - -%D In practice accessing a reference comes down to: -%D -%D \startopsomming[opelkaar] -%D \som checking the validity -%D \som determining the type -%D \som filtering the content -%D \stopopsomming -%D -%D We'll deal with the last two steps first. References are -%D saved in the general format: -%D -%D \starttypen -%D {\referenceclass{realpage}{page}{text}} -%D {\referenceclass{type}{data}} -%D \stoptypen -%D -%D When we filter the content, next macros are set when we -%D meet a normal cross reference: - -\let\currentrealreference=\empty -\let\currentpagereference=\empty -\let\currenttextreference=\empty - -%D System references only have one component: - -\let\currentdatareference=\empty - -%D Because internally a reference comes in two disguises, one -%D with four arguments and one with only two, we need a two -%D step filter. - -\def\getreferenceelements#1% - {\edef\referenceelements{\getvalue{\r!cross\referenceprefix#1}}% - \expandafter\dogetreferenceelements\referenceelements{}{}{}{}} - -%D In the following step, the \type{\ifx#1} test is needed -%D because we can access this macro directly, and therefore -%D \type{#1} can be an undefined reference (in fact, this hack -%D was needed for the line numbering mechanism). -%D -%D We already introduced a few counters. Here we see why we -%D needed those. The discrancy between the cross reference -%D definition order (determined by the utility file) and the -%D moment the reference is defined in the text, is a measure -%D for it's forward character. This enables references like -%D {\em as we will see later on}. - -\chardef\currentreferencetype=0 - -\newif\ifforwardreference - -\def\dogetreferenceelements#1#2#3#4#5% - {\chardef\currentreferencetype=\ifx#1\relax0\else#1\fi\relax - \ifnum\currentreferencetype<2 - \def\currentpagereference{\referencepagenumber[#2]}% - \edef\currentrealreference{#3}% - \def\currenttextreference{#4}% - \ifnum0#5>\crossreferencenumber - \forwardreferencetrue - \else - \forwardreferencefalse - \fi - \else - \def\currentdatareference{#2}% - \forwardreferencefalse - \fi} - -%D When inside this tetsing macro we can savely use: - -\def\doifforwardreferenceelse#1#2% - {\ifforwardreference#1\else#2\fi} - -%D Duplicate references are reported while loading the utility -%D file. To prevent problems with document viewers cq. -%D preprocessors, one can enable a (bit time consuming) check. - -\newif\ifcheckduplicatereferences - -%D The next rather dirty trick is needed to preserve the -%D meaning of the original cross reference. In fact, -%D \type{\rt!cross} is toggled to \type{\rt!done}. - -\def\doiffirstreferenceoccurance#1#2% - {\ifcheckduplicatereferences - \doifundefinedelse{\r!cross\referenceprefix#1} - {#2} - {\getreferenceelements{#1}% - \ifnum\currentreferencetype=\rt!cross - #2% - \bgroup - \def\rt!cross##1##2##3##4% - {\setgvalue{\r!cross\referenceprefix#1}% - {\rt!done{##1}{##2}{##3}{##4}}}% - \getvalue{\r!cross\referenceprefix#1}% - \egroup - \fi}% - \else - #2% - \fi} - -%D We still have to test for the existence of a reference, but -%D before we come to that, we first look into the way a -%D reference can be accessed. It will be no surprise that -%D references can come in several forms. -%D -%D Cross references appear as numbers (figure~1.1, chapter~2) -%D or pagenumbers (page~2, page 3--2), and are called with -%D \type{\in} and \type{\at}. In interactive documents we also -%D have \type{\goto}, \type{\button} and alike. These are more -%D versatile and look like: -%D -%D \starttypen -%D \goto[reference] -%D \goto[outer reference::] -%D \goto[outer reference::inner reference] -%D \goto[operation(argument)] -%D \goto[operation(action{argument,argument})] -%D \stoptypen -%D -%D The first one is a normal reference, the second and third -%D are references to a file or \URL. The brace delimited -%D references for instance refer to a \JAVASCRIPT. The last -%D example shows that we can pass arguments to the actions. -%D -%D When we split off the components of such a reference, the -%D results are available in: -%D -%D \starttypen -%D \currentreferencespecial -%D \currentreferenceoperation -%D \currentreferencearguments -%D \currentinnerreference -%D \currentouterreference -%D \currentfullreference -%D \stoptypen -%D -%D Splitting a reference is done by: -%D -%D \starttypen -%D \splitofffullreference {reference} -%D \splitoffreference {reference} -%D \stoptypen -%D -%D The second alternative can be used in a second stage -%D splitoff and only handles \type{::}. - -\newif\ifreferencefound - -\let\currentfullreference =\empty -\let\currentreferencespecial =\empty -\let\currentreferenceoperation=\empty -\let\currentreferencearguments=\empty -\let\currentouterreference =\empty -\let\currentinnerreference =\empty - -\def\splitofffullreference#1% - {\edef\currentfullreference{#1}% - \@EA\dosplitofffullreference\currentfullreference\empty(\relax)\empty\end} - -\def\dosplitofffullreference#1(#2#3)#4#5\end - {\ifx#2)% - \let\currentreferenceoperation=\empty - \let\currentreferencearguments=\empty - \let\currentinnerreference=\empty - \dodosplitofffullreference#1::::\empty\end - \currentouterreference\currentreferencespecial - \else\ifx#2\relax - \let\currentreferencespecial=\empty - \let\currentreferenceoperation=\empty - \let\currentreferencearguments=\empty - \dodosplitofffullreference#1::::\empty\end - \currentouterreference\currentinnerreference - \else - \dosplitoffreferenceoperation#2#3{}\end - \let\currentinnerreference=\empty - \dodosplitofffullreference#1::::\empty\end - \currentouterreference\currentreferencespecial - \fi\fi} - -\def\dosplitoffreferenceoperation#1#% - {\def\currentreferenceoperation{#1}% - \dodosplitoffreferenceoperation} - -\def\dodosplitoffreferenceoperation#1#2\end - {\def\currentreferencearguments{#1}} - -\def\dodosplitofffullreference#1::#2::#3#4\end#5#6% - {\if#3:% - \edef#5{#1}\edef#6{#2}% - \else - \let#5=\empty\edef#6{#1}% - \fi} - -\def\splitoffreference#1% - {\expandafter\dodosplitofffullreference#1::::\empty\end - \currentouterreference\currentinnerreference} - -%D Although the previous split macros have a multistep -%D character, there performance is quite reasonable. -%D -%D For debugging purposes we provide a showcase macro: - -\def\showcurrentreference% - {\bgroup\tttf - /ful/\convertcommand\currentfullreference \to\ascii\ascii/\par - /spe/\convertcommand\currentreferencespecial \to\ascii\ascii/\par - /ope/\convertcommand\currentreferenceoperation\to\ascii\ascii/\par - /arg/\convertcommand\currentreferencearguments\to\ascii\ascii/\par - /out/\convertcommand\currentouterreference \to\ascii\ascii/\par - /inn/\convertcommand\currentinnerreference \to\ascii\ascii/\par - \egroup} - -%D We use this visualizer to demonstrate the way references are -%D split. -%D -%D \hbox{\splitofffullreference{rr}\showcurrentreference} -%D \hbox{\splitofffullreference{pp(qq)}\showcurrentreference} -%D \hbox{\splitofffullreference{pp(qq{aa,bb})}\showcurrentreference} -%D \hbox{\splitofffullreference{ff::}\showcurrentreference} -%D \hbox{\splitofffullreference{ff::rr}\showcurrentreference} -%D \hbox{\splitofffullreference{ff::pp()}\showcurrentreference} -%D \hbox{\splitofffullreference{ff::pp(qq)}\showcurrentreference} -%D \hbox{\splitofffullreference{ff::pp(qq{aa})}\showcurrentreference} - -%D Finaly we've come to the promissed testing step. As we can -%D see, this macro does bit more than testing: it also resolves -%D the reference. This means that whenever we test for the -%D existance of a reference at an outer level, we have all the -%D relevant properties of that reference avaliable inside the -%D true branche~(\type{#2}). -%D -%D The prefix has to do with localizing references. When a -%D prefix is set, looking for a reference comes to looking for -%D the prefixed one, and when not found, looking for the non -%D prefixed one. Consider for instance the prefix set to -%D \type{sidetrack}. -%D -%D \starttypen -%D \pagereference[important] -%D \pagereference[unimportant] -%D \setupreferencing[prefix=sidetrack] -%D \pagereference[important] -%D \stoptypen -%D -%D results in saving (writing) the references -%D -%D \starttypen -%D ...{}{important} -%D ...{}{unimportant} -%D ...{sidetrack}{important}... -%D \stoptypen -%D -%D Now when we call for \type{unimportant}, we will indeed get -%D the pagenumber associated to this reference. But when we -%D call for \type{important}, while the prefix is still set, we -%D will get the pagenumber bound to the prefixed one. -%D -%D {\em Some day, when processing time and memory are no longer -%D performance factors, we will introduce multi||level -%D prefixes.} - -% \def\doifreferencefoundelse#1#2#3% -% {\checkreferences -% \bgroup -% \let\unharmedreferenceprefix=\referenceprefix -% \bgroup -% \splitofffullreference{#1}% -% \ifx\currentreferencespecial\empty -% \ifx\currentouterreference\empty -% \doifdefinedelse{\r!cross\referenceprefix\currentfullreference} -% {\global\referencefoundtrue} -% {\let\referenceprefix=\empty -% \doifdefinedelse{\r!cross\currentfullreference} -% {\global\referencefoundtrue} -% {\global\referencefoundfalse}}% -% \else -% \global\referencefoundtrue -% \fi -% \doifpredefinedreferenceelse{\currentfullreference} % no \referenceprefix -% {\global\referencefoundfalse}{}% -% \ifreferencefound -% \getreferenceelements{\currentfullreference}% -% \fi -% \else -% \let\referenceprefix=\empty -% \let\unharmedreferenceprefix=\empty -% \doifdefinedelse{\s!do\v!test\currentreferencespecial} -% {\getvalue{\s!do\v!test\currentreferencespecial} -% {\global\referencefoundtrue}{\global\referencefoundfalse}} -% {\global\referencefoundtrue}% -% \fi -% \ifreferencefound -% #2% -% \egroup -% \else -% #3% -% \egroup -% \predefinereference{#1}% no \referenceprefix -% \fi -% \egroup} - -%D FILEPREFIX WEEDEN - -\def\doifreferencefoundelse#1#2#3% opsplitsen in inner/outer/special - {\checkreferences - \bgroup - \let\unharmedreferenceprefix=\referenceprefix - \bgroup - \splitofffullreference{#1}% - \ifx\currentreferencespecial\empty - \ifx\currentouterreference\empty - \docheckinnerreference - \else - \docheckouterreference - \fi - \ifreferencefound - \getreferenceelements\currentfullreference - \fi - \else - \docheckspecialreference - \fi - \ifreferencefound - #2\egroup - \else - #3\egroup - \fi - \egroup} - -%D The next fast one permits rather raw references with -%D \type{()}'s and is used in the object reference mechanism. - -\def\doifrawreferencefoundelse#1#2#3% - {\checkreferences - \bgroup - \edef\currentfullreference{#1}% - \doifdefinedelse{\r!cross\currentfullreference} - {\getreferenceelements\currentfullreference - \global\referencefoundtrue #2} - {\global\referencefoundfalse #3}% - \egroup} - -%D The inner case is simple. Only two cases have to be taken -%D care of: -%D -%D \starttypen -%D \naar{some text}[reference] -%D \naar{some text}[prefix:reference] -%D \stoptypen - -\def\docheckinnerreference% - {\global\let\predefinedreference=\currentinnerreference - \doifdefinedelse{\r!cross\referenceprefix\currentfullreference} - {\global\referencefoundtrue} - {\let\referenceprefix=\empty - \doifdefinedelse{\r!cross\currentfullreference} - {\global\referencefoundtrue} - {\global\referencefoundfalse}}% - \doifpredefinedreferenceelse{\global\referencefoundfalse}{}} - -%D References to other files however are treated strict or -%D tolerant, depending on their loading and availability: -%D -%D \starttypen -%D \useexternaldocument[somefile][filename][a nice description] -%D -%D \goto{checked reference}[somefile::reference] -%D \goto{unchecked reference}[somefile::] -%D \goto{unchecked reference}[anotherfile::reference] -%D \stoptypen -%D -%D Here we use the dummy reference \type{somefile::} set in -%D \type{\setouterreference} as a signal that indeed references -%D are defined for the outer file. - -\def\docheckouterreference% - {\let\referenceprefix=\empty - \let\unharmedreferenceprefix=\empty - \xdef\predefinedreference% - {\currentouterreference::\currentinnerreference}% - \ifx\innerreference\empty - \global\referencefoundtrue % no checking done - \else - \doifdefinedelse{\r!cross\currentouterreference::} - {\doifdefinedelse{\r!cross\currentfullreference} - {\global\referencefoundtrue} - {\global\referencefoundfalse}} - {\global\referencefoundtrue}% no checking done - \fi - \doifpredefinedreferenceelse{\global\referencefoundfalse}{}} - -%D Special references are only tested when some test routine is -%D defined. - -\def\docheckspecialreference% - {\let\referenceprefix=\empty - \let\unharmedreferenceprefix=\empty - \xdef\predefinedreference% - {\currentreferencespecial::\currentreferenceoperation}% - \doifdefinedelse{\s!do\v!test\currentreferencespecial} - {\getvalue{\s!do\v!test\currentreferencespecial} - {\global\referencefoundtrue} - {\global\referencefoundfalse}} - {\global\referencefoundtrue}% - \doifpredefinedreferenceelse{\global\referencefoundfalse}{}} - -%D An unknown reference is reported on the screen, in the log -%D file and, when enabled, in the left margin of the text. - -\def\unknownreference#1% - {\ifvoorlopig - \doifsomething{#1} - {\inlinker - {\infofont - \dimen0=\linkermargebreedte - \advance\dimen0 by -2em - \doboundtext{#1}{\dimen0}{..}->}}% - \fi - \doifpredefinedreferenceelse - {} - {\predefinereference - \showmessage{\m!references}{1}{[\unharmedreferenceprefix][#1]}}} - -%D Although not actually needed, we default the unharmed -%D reference prefix to the normal one. - -\def\unharmedreferenceprefix% - {\referenceprefix} - -%D When a reference is not found, we typeset a placeholder -%D (two glyphs are often enough to represent the reference -%D text). - - -\def\dummyreference% - {{\tttf ??}} - -%D To prevent repetitive messages concerning a reference -%D being defined, we set such an unknown reference to an empty -%D one after the first encounter. - -\let\predefinedreference=\s!unknown - -\def\predefinereference% - {\setxvalue{\r!cross\predefinedreference}{\rt!cross{}{}{}{}}} - -%D Testing on existance then becomes: - -\def\doifpredefinedreferenceelse% - {\doifelsevalue{\r!cross\predefinedreference}{\rt!cross{}{}{}{}}} - -%D Apart from cross references supplied by the user, \CONTEXT\ -%D generates cross references itself. Most of them are not -%D saved as a reference, but stored with their source, for -%D instance a list or an index entry. Such automatically -%D generated, for the user invisible, references are called -%D {\em internal references}. The user supplied ones are -%D labeled as {\em external references}. -%D -%D A second important characteristic is that when we want to -%D support different backends (viewers), we need to support -%D named destinations as well as page numbers. I invite readers -%D to take a glance at the special driver modules to understand -%D the fine points of this. As a result we will deal with {\em -%D locations} as well as {\em real page numbers}. We explictly -%D call this pagenumber a real one, because it is independant -%D of the page numbering scheme used in the document. -%D -%D One of the reasons for \CONTEXT\ being the first \TEX\ base -%D macropackage to support sophisticated interactive \PDF\ -%D files, lays in the mere fact that real page numbers are -%D available in most two pass data, like references, list data -%D and index entries. -%D -%D We will speak of \type{thisis...} when we are marking a -%D location, and \type{goto...} when we point to such a -%D location. The latter one can be seen as a hyperlink to the -%D former one. In the next macros one we use constructs like: -%D -%D \starttypen -%D \dostart... -%D \dostop... -%D \stoptypen -%D -%D Such macros are used to invoke the relevant specials from -%D the special driver modules (see \type{spec-ini}). The flag -%D \type{\iflocation} signals if we're in interactive mode. - -\def\thisisdestination#1% destination - {\iflocation - \dostartthisislocation{#1}% - \dostopthisislocation - \fi} - -\def\thisisrealpage#1% pagenumber - {\iflocation - \dostartthisisrealpage{#1}% - \dostopthisisrealpage - \fi} - -%D The previous tho macros were easy ones, opposite to their -%D counterparts. A common component in these is: -%D -%D \starttypen -%D \dostartgoto -%D \data {..} -%D \start {..} -%D \stop {..} -%D \dostopgoto -%D \stoptypen -%D -%D Here data can be whatever needs highlighting, e.g. {\em -%D figure 2.4}, and the start and stop entries handle the -%D specials. The two \DIMENSIONS\ \type{\buttonwidth} and -%D \type{\buttonheight} have to be set when handling the -%D data~(\type{#2}). - -\ifx\buttonheight\undefined \newdimen\buttonheight \fi -\ifx\buttonwidth \undefined \newdimen\buttonwidth \fi - -\def\gotodestination#1#2#3#4#5% url file destination page data - {\iflocation - \dostartgoto - \data - {#5}% - \start - \dostartgotolocation - {\number\buttonwidth}{\number\buttonheight} - {#1}{#2}{#3}{#4}% - \stop - \dostopgotolocation - \dostopgoto - \else - {#5}% - \fi} - -\def\gotorealpage#1#2#3#4% url file page data - {\iflocation - \dostartgoto - \data - {#4}% - \start - \dostartgotorealpage - {\number\buttonwidth}{\number\buttonheight} - {#1}{#2}{#3}% - \stop - \dostopgotorealpage - \dostopgoto - \else - {#4}% - \fi} - -%D Internal references can best be set using the next few -%D macros. Setting such references to unique values is -%D completely up to the macros that call them. -%D -%D \starttypen -%D \thisissomeinternal{tag}{identifier} -%D \gotosomeinternal {tag}{identifier}{pagenumber}{text} -%D \stoptypen - -\def\thisissomeinternal#1#2% tag reference - {\doifsomething{#2}{\thisisdestination{#1:#2}}} - -\def\gotosomeinternal#1#2#3#4% - {\gotodestination{}{}{#1:#2}{#3}{#4}} - -%D An automatic mechanism is provided too: -%D -%D \starttypen -%D \thisisnextinternal{tag} -%D \gotonextinternal {tag}{number}{pagenumber}{text} -%D \stoptypen -%D -%D The first macro increments a counter. The value of this -%D counter is available in the macro \type{\nextinternalreference} -%D and should be saved somewhere (for instance in a file) for -%D future reference. The second argument of -%D \type {\gotonextinternal} takes such a saved number. One can -%D turn on tracing these references, in which case the -%D references are a bit more verbose. - -\newcount\locationcount - -\newif\iftraceinternalreferences - -\def\nextinternalreference% - {\the\locationcount} - -\def\thisisnextinternal#1% - {\global\advance\locationcount by 1 - \thisisdestination{\s!aut\iftraceinternalreferences:#1\fi:\nextinternalreference}} - -\def\gotonextinternal#1#2#3#4% - {\gotodestination{}{}{\s!aut\iftraceinternalreferences:#1\fi:#2}{#3}{#4}} - -%D We already went through a lot of problems to sort out what -%D kind of reference we're dealing with. Sorting out the user -%D supplied cross references (show/goto this or that) as well -%D as user supplied system references (invoke this or that) is -%D already taken care of in the test routine, but we still have -%D to direct the request to the right routine. - -\def\gotolocation#1#2% - {\ifx\currentreferencespecial\empty - \ifx\currentouterreference\empty - \ifnum\currentreferencetype<2 - \gotoinnerlocation{#1}{#2}% - \else - \gotosystemlocation{#1}{#2}% - \fi - \else - \gotoouterlocation{#1}{#2}% - \fi - \else - \gotospeciallocation{#1}{#2}% - \fi} - -%D An inner reference refers to some place in the document -%D itself. - -\def\gotoinnerlocation#1#2% - {\gotodestination - {}{} - {\referenceprefix#1}{\currentrealreference} - {#2}} - -%D The outer location refers to another document, specified as -%D file or \URL. - -\def\gotoouterlocation#1#2% % page checken! - {\bgroup - \let\referenceprefix=\empty - \setouterlocation{\currentouterreference}% - \ifx\currentinnerreference\empty - \gotorealpage - {\otherURL}{\otherfile}{1} - {#2}% - \else - \gotodestination - {\otherURL}{\otherfile}{\currentinnerreference}{\currentrealreference} - {#2}% - \fi - \egroup} - -%D Special locations are those that are accessed by saying -%D things like: -%D -%D \starttypen -%D \goto{calculate total}[JS(summarize{10,23,56}] -%D \stoptypen -%D -%D After several intermediate steps this finally arrives at -%D the next macro and expands into (simplified): -%D -%D \starttypen -%D \gotoJSlocation{total{summarize{10,23,56}}}{calculate total} -%D \stoptypen -%D -%D The first argument is the full reference, the second one -%D is the text, in some kind of manipulated form. In practice -%D we split references, so we get: -%D -%D \starttypen -%D \gotoJSlocation{summarize{10,23,56}}{calculate} -%D \gotoJSlocation{summarize{10,23,56}}{total} -%D \stoptypen -%D -%D where \type{calculate} and \type{total} are colored, boxed -%D or whatever \type{\goto} is told to do. -%D -%D The macro \type{\gotoJSlocation} can use \type -%D {\currentreferenceoperation} (in our example -%D \type{summarize}) and \type{\currentreference} (here -%D being \type {10,23,56}) to perform its task. - -\def\gotospeciallocation% - {\executeifdefined - {goto\currentreferencespecial location}\gobbleoneargument} - -%D Such special macros can be defined by: - -\def\definespeciallocation#1% - {\setvalue{goto#1location}} - -%D The associated test is to be defined by: - -\def\definespecialtest#1% - {\setvalue{\s!do\v!test#1}} - -%D This \type{\def} alike macro is to be used as: -%D -%D \starttypen -%D \definespeciallocation{JS}#1#2{... #1 ... #2 ...} -%D \stoptypen -%D -%D In module \type {core-jav} one can see that \type -%D {\gotoJSlocation} looks much like the previous goto -%D definitions. - -%D A system location is not always a location, but for the -%D consistency we also consider actions as such. - -\def\gotosystemlocation% - {\getvalue{\r!syst\the\currentreferencetype}} - -\def\definesystemreferencehandler#1#2% - {\setgvalue{\r!syst\the#1}{#2}} - -%D In this module we define three system references: one for -%D handling navigational, viewer specific, commands, another -%D for jumping to special pages, like the first or last one, -%D and a third reference for linking tree like lists, like -%D tables of contents. The latter two adapt themselves to the -%D current state. - -\definesystemreferencehandler \rt!exec \handleexecreference -\definesystemreferencehandler \rt!page \handlepagereference -\definesystemreferencehandler \rt!list \handlelistreference - -\def\handleexecreference#1{\executecommand {\currentdatareference}} -\def\handlepagereference#1{\gotorealpage {}{}{\currentdatareference}} -\def\handlelistreference#1{\gotodestination{}{}{\currentdatareference}{}} - -%D We first define a whole lot of viewer specific commands. The -%D references as seen by the user, like \type {CloseDocument} -%D (in dutch, egnlish, german of whateverinterface language) -%D are translated into a bit shorter reference (\type{close}) -%D and passed to the special driver (using \type -%D {\executecommand}). - -\setglobalsystemreference \rt!exec \v!CloseDocument {close} -\setglobalsystemreference \rt!exec \v!ExitViewer {exit} -\setglobalsystemreference \rt!exec \v!FirstPage {first} -\setglobalsystemreference \rt!exec \v!LastPage {last} -\setglobalsystemreference \rt!exec \v!NextJump {forward} -\setglobalsystemreference \rt!exec \v!NextPage {next} -\setglobalsystemreference \rt!exec \v!PauseMovie {pause} -\setglobalsystemreference \rt!exec \v!PreviousJump {backward} -\setglobalsystemreference \rt!exec \v!PreviousPage {previous} -\setglobalsystemreference \rt!exec \v!PrintDocument {print} -\setglobalsystemreference \rt!exec \v!ResetForm {reset} -\setglobalsystemreference \rt!exec \v!ResumeMovie {resume} -\setglobalsystemreference \rt!exec \v!SaveDocument {save} -\setglobalsystemreference \rt!exec \v!SearchAgain {searchagain} -\setglobalsystemreference \rt!exec \v!SearchDocument {search} -\setglobalsystemreference \rt!exec \v!StartMovie {start} -\setglobalsystemreference \rt!exec \v!StopMovie {stop} -\setglobalsystemreference \rt!exec \v!SubmitForm {submit} -\setglobalsystemreference \rt!exec \v!SwapViewer {swap} -\setglobalsystemreference \rt!exec \v!ViewerHelp {help} - -%D Executing the command looks alike the previous goto macros. - -\def\executecommand#1#2% - {\iflocation - \dostartgoto - \data - {#2}% - \start - \dostartexecutecommand - {\number\buttonwidth}{\number\buttonheight} - {#1}{}% - \stop - \dostopexecutecommand - \dostopgoto - \else - {#2}% - \fi} - -%D We could have done without the short tags and thereby saving -%D some tokens, but the current approach leaves room for future -%D extensions. - -%D It is possible to disable the writing of references to the -%D utility file by setting: - -\newif\ifreferencing \referencingtrue - -%D One can also activate an automatic prefix mechanism. By -%D setting the \type{\prefix} variable to \type{+}, the prefix -%D is incremented, when set to \type{-} or empty, the prefix is -%D reset. Other values become the prefix. - -\newcount\prefixcounter - -%D These settings are accomplished by: -%D -%D \showsetup{\y!setupreferencing} -%D -%D In interactive documents verbose references don't always -%D make sense (what is a page number in an unnumbered -%D document). By setting the \type{interaction} variable, one -%D can influences the way interactive references are set. - -\def\setupreferencing% - {\dosingleargument\dosetupreferencing} - -\def\dosetupreferencing[#1]% - {\getparameters - [\??rf] - [\c!prefix=\s!unknown,#1]% - \processaction - [\@@rfstatus] - [ \v!stop=>\referencingfalse, - \v!start=>\referencingtrue]% - \processaction - [\@@rfinteractie] - [ \v!alles=>\let\dowantedreference=\docompletereference, - \v!label=>\let\dowantedreference=\dolabelonlyreference, - \v!tekst=>\let\dowantedreference=\dotextonlyreference, - \v!symbool=>\let\dowantedreference=\dosymbolreference]% - \ifx\@@rfprefix\s!unknown - % retain the current value - \else\ifx\@@rfprefix\empty - \let\referenceprefix=\empty - \else\ifx\@@rfprefix\incrementreferenceprefix - \advance\prefixcounter by 1 - \edef\referenceprefix{\the\prefixcounter:}% - \else\ifx\@@rfprefix\decrementreferenceprefix - \let\referenceprefix=\empty - \else - \edef\referenceprefix{\@@rfprefix:}% - \fi\fi\fi\fi} - -\def\incrementreferenceprefix{+} -\def\decrementreferenceprefix{-} - -%D We can typeset a reference using \type{\in} and \type{\at} -%D and goto specific locations using \type{\goto}. The last one -%D does not make that much sense in a paper document. To -%D complicate things, \PLAIN\ \TEX\ also implements an \type -%D {\in} but fortunately that one only makes sense in math -%D mode. - -%D --- VANAF HIER NOG VERENGELSEN --- - -\let\donormalin=\in - -\def\in% - {\ifmmode - \expandafter\donormalin - \else - \expandafter\doinatreference\expandafter\currenttextreference - \fi} - -\def\op% - {\doinatreference\currentpagereference} - -%D Typesetting the reference is a bit more complicated than one -%D would at first sight expect. This is due to the fact that we -%D distinguish three (five) alternative calls: -%D -%D \plaatsfiguur -%D [hier][three calls] -%D {Three alternatives reference calls.} -%D \startcombinatie[1*3] -%D {\framed{\type{ \in }}} {a} -%D {\framed{\type{ \at }}} {b} -%D {\framed{\type{\goto}}} {c} -%D \stopcombinatie -%D -%D \startbuffer -%D \in figure[fig:three calls] -%D \in{figure}[fig:three calls] -%D \in figure a[fig:three calls] -%D \in{figure}{a}[fig:three calls] -%D figure~\in[fig:three calls] -%D \stopbuffer -%D -%D \typebuffer -%D -%D This turns up as: -%D -%D \startregels -%D \haalbuffer -%D \stopregels -%D -%D The dual \type{{}} results in a split reference. In a -%D document meant for paper, one is tempted to use the last -%D (most straightforward) alternative. When a document is also -%D meant voor electronic distribution, the former alternatives -%D have preference, because everything between the \type{\in} -%D and~\type{[} becomes active (and when asked for, typeset -%D in a different color and typeface). - -\def\doinatreference#1% - {\doifnextcharelse{[} - {\dodoinatreference{#1}{}} - {\dodoinatreference{#1}}} - -\def\dodoinatreference#1% - {\def\dododoinatreference{\dodododoinatreference{#1}}% - \futurelet\next\dododoinatreference} - -\def\dodododoinatreference#1#2#3[#4]% - {\ifx\next\bgroup - \dododododoinatreference{#1#3}{#2}[#4]% - \else - \dododododoinatreference{#1}{#2#3}[#4]% - \fi} - -%D We arrived at the last step. Before we do the typesetting, -%D we forget all previous (paragraph bound) settings and make -%D sure that we remain in horizontal mode. Next we choose -%D among the several representations. - -\def\dododododoinatreference#1#2[#3]% - {\bgroup - \forgetall - \leaveoutervmode - \doifreferencefoundelse{#3} - {\doifelsenothing{#1} - {\dosymbolreference{#1}{#2}[#3]} - {\dowantedreference{#1}{#2}[#3]}} - {\dounknownreference{#1}{#2}[#3]}% - \referentieinfo{<}{#3}% - \egroup} - -%D The previously discussed setup macro lets us specify the -%D representation of references. A symbol reference does not -%D show the specific data, like the number of a figure, but -%D shows one of: \hbox {$^\goforwardcharacter$ -%D $^\gobackwardcharacter$ $^\gonowherecharacter$}, depending -%D on the direction to go. - -\def\dosymbolreference#1#2[#3]% - {\bgroup - \ifhmode\unskip\fi - \ifx\currentreferencespecial\empty - \ifx\currentouterreference\empty - \ifnum0\currentrealreference=0 - \ifhmode\strut$^\gonowherecharacter$\fi - \else\ifnum0\currentrealreference>\realpageno - \dodosymbolreference{#2}{$^\goforwardcharacter$}% - \else\ifnum0\currentrealreference<\realpageno - \dodosymbolreference{#2}{$^\gobackwardcharacter$}% - \else - \ifhmode\strut$^\gonowherecharacter$\fi - \fi\fi\fi - \else - \gotoouterlocation{#3}{\showlocation{$^\gotosomewherecharacter$}}% - \fi - \else - \gotospeciallocation{#3}{\showlocation{$^\gotosomewherecharacter$}}% - \fi - \egroup} - -\def\dodosymbolreference#1#2% - {#1\hbox{\gotorealpage{}{}{\currentrealreference} - {\dolocationattributes{\??ia}{#2}}}} - -%D The other alternatives just conform their names: only the -%D label, only the text, or the label and the text. - -\def\dounknownreference#1#2[#3]% - {\unknownreference{#3}\dotextprefix{#2}\dummyreference}% - -\def\docompletereference#1#2[#3]% - {\doifsomespaceelse{#2} - {\doifsomething{#2}{\donaarspace{#2}[#3]~}\donaarfixed{#1}[#3]} - {\donaarfixed{\dotextprefix{#2}#1}[#3]}} - -\def\dolabelonlyreference#1#2[#3]% - {\doifsomespaceelse{#2} - {\doifsomething{#2}{\donaarspace{#2}[#3]}} - {\donaarfixed{\dotextprefix{#2}}[#3]}} - -\def\dotextonlyreference#1#2[#3]% - {\dotextprefix{#2}\donaarfixed{#1}[#3]} - -\let\dowantedreference=\docompletereference - -%D --- OF MEER, OF ANDERS: --- - -\def\dotextprefix#1% - {\ConvertToConstant\doifnot{#1}{}{#1~}} - -%D In interactive documents going to a specific location is not -%D bound to cross references. The \type{\goto} commands can be -%D used to let users access another part of the document. In -%D this respect, interactive tables of contents and registers -%D can be considered goto's. Because in fact a \type{\goto} is -%D just a reference without reference specific data, the -%D previous macros are implemented using the goto -%D functionality. -%D -%D \showsetup{\y!naar} -%D -%D One important chaacteristic is that the first argument of -%D \type{\goto} (and therefore \type{\at} and \type{\in} is -%D split at spaces. This means that, although hyphenation is -%D prevented, long references can cross line endings. - -\unexpanded\def\naar#1[#2]% - {\leaveoutervmode - \doifreferencefoundelse{#2} - {\doifelsenothing{#1} - {\dosymbolreference{}{}[#2]} - {\donaarspace{#1}[#2]}} - {\unknownreference{#2}#1}% - \referentieinfo{<}{#2}} - -\def\donaarspace#1[#2]% - {{\iflocation - \def\processisolatedword##1% - {\hbox{\gotolocation{#2}{##1\presetgoto}}}% - \doattributes{\??ia} - {\processisolatedwords{#1}\processisolatedword}% - \else - #1\relax % \relax prevents #1's next macros from gobbling \fi - \fi}} - -\def\donaarfixed#1[#2]% - {{\iflocation - \hbox{\gotolocation{#2}{\doattributes{\??ia}{#1\presetgoto}}}% - \else - #1% - \fi}} - -%D In case the auto split feature is not needed or even not -%D even wanted, \type{\gotobox} can be used. - -%D --- NOG IN HANDLEIDING --- - -\unexpanded\def\naarbox#1[#2]% - {\bgroup - \locationstrutfalse - \leaveoutervmode - \doifreferencefoundelse{#2} - {\donaarfixed{#1}[#2]} - {\unknownreference{#2}#1}% - \referentieinfo{<}{#2}% - \egroup} - -%D An reference to another document can be specified as a file -%D or as an \URL. Both are handled by the same mechanism and -%D can be issued by saying something like: -%D -%D \starttypen -%D \goto[dictionary::the letter a] -%D \stoptypen -%D -%D The macros that are responsible for handling these -%D references, use the next six variables: - -\let\otherlabel = \empty -\let\fileprefix = \empty -\def\otherfile {\jobname} -\let\otherURL = \empty -\let\otherprefix = \empty -\let\dowithdocdes = \empty - -%D One can imagine that many references to such a dictionary -%D are made, so in most cases such a document reference in an -%D indirect one. -%D -%D \showsetup{\y!gebruikexterndocument} -%D -%D For example: -%D -%D \starttypen -%D \useexternaldocument -%D [dictionary][engldict] -%D [The Famous English Dictionary] -%D \stoptypen -%D -%D The next macro implements these relations, and also take -%D care of loading the document specific references. - -\def\gebruikexterndocument% - {\dotripleargument\dogebruikexterndocument} - -\def\dogebruikexterndocument[#1][#2][#3]% - {\bgroup - \doifelsenothing{#1} - {\dogebruikexterndocument[#2][#2][#3]} - {\doifelsenothing{#3} - {\dogebruikexterndocument[#1][#2][#2]} - {\doifsomething{#2} - {\setgvalue{\v!file:::#1}{\doexternaldocument{}{#2}{#3}}% - \doifparentfileelse{#2} - {\showmessage{\m!references}{21}{#2}} - {\bgroup % prevents wrong loading of \jobname - \def\fileprefix{#1::}% - \let\setglobalcrossreference=\setoutercrossreference - \usereferences[#2]% - \egroup % when called nested - \showmessage{\m!references}{21}{#2}}}}}% - \egroup} - -%D The \URL\ alternative takes four arguments: -%D -%D \showsetup{\y!gebruikURL} -%D -%D like: -%D -%D \starttypen -%D \useURL -%D [dictionary][http://www.publisher.com/public][engldict] -%D [The Famous English Dictionary] -%D \stoptypen -%D -%D This time we don't load the references when no file is -%D specified. This is logical when one keeps in mind that a -%D valid \URL\ can also be a mail address. - -\def\gebruikURL% - {\doquadrupleargument\dogebruikURL} - -\def\dogebruikURL[#1][#2][#3][#4]% - {\doifelsenothing{#4} - {\dogebruikexterndocument[#1][#2][#3][#3]} - {\doifsomething{#1} - {\setgvalue{\v!file:::#1}{\doexternaldocument{#2}{#3}{#4}}}}} - -%D Many macro definitions ago we called for the auxiliary macro -%D \type{\setouterlocation} and now is the time to define this -%D one. - -\def\setouterlocation#1% - {\doifdefinedelse{\v!file:::#1} - {\def\doexternaldocument##1##2##3% - {\edef\otherURL{##1}% - \edef\otherfile{##2}}% - \getvalue{\v!file:::#1}} - {\let\otherURL=\empty - \edef\otherfile{#1}}% - \doifparentfileelse{\otherfile} - {\let\otherURL=\empty - \let\otherfile=\empty - \global\let\otherlabel=\empty - \let\otherprefix=\empty} - {\xdef\otherlabel{#1}% - \edef\otherprefix{#1::}}} - -%D When defining the external source of information, one can -%D also specify a suitable name (the last argument). This name -%D can be called upon with: -%D -%D \showsetup{\y!uit} -%D -%D As can be expected, this macro used \type{\goto} to -%D perform its task. - -\definecomplexorsimple\uit - -\def\simpleuit% - {\bgroup - \doifdefinedelse{\v!file:::\otherlabel} - {\def\doexternaldocument##1##2##3{##3}% - \getvalue{\v!file:::\otherlabel}} - {\tttf[\otherlabel]}% - \egroup} - -\def\complexuit[#1]% - {\doifinstringelse{::}{#1} - {\docomplexuit[#1]} - {\docomplexuit[#1::]}} - -\def\docomplexuit[#1::#2]% - {\bgroup - \doifdefinedelse{\v!file:::#1} - {\def\doexternaldocument##1##2##3% - {\naar{##3}[#1::#2]}% - \getvalue{\v!file:::#1}} - {\tttf[#1]}% - \egroup} - -%D We also support: -%D -%D \starttypen -%D \goto{some text}[file(identifier{location}] -%D \stoptypen -%D -%D which is completely equivalent with -%D -%D \starttypen -%D \goto{some text}[identifier::location] -%D \stoptypen -%D -%D The fastest implementation would be: - -\definespecialtest\v!file {\handlespecialFILEandURL} -\definespecialtest\v!URL {\handlespecialFILEandURL} - -\definespeciallocation\v!file {\handlespecialallocationFILEandURL} -\definespeciallocation\v!URL {\handlespecialallocationFILEandURL} - -\def\handlespecialFILEandURL% - {\doifreferencefoundelse - {\currentreferenceoperation::\currentreferencearguments}} - -\def\handlespecialallocationFILEandURL% - {\let\currentouterreference=\currentreferenceoperation - \let\currentinnerreference=\currentreferencearguments - \let\currentreferenceoperation=\empty - \let\currentreferencearguments=\empty - \gotoouterlocation} - -%D Now we have file references as special ones, it's rather -%D logical to have the viewer specific ones available in a dual -%D way too. At first glance we could do with: -%D -%D \starttypen -%D \definespeciallocation\v!actie -%D {\getreferenceelements\currentreferenceoperation -%D \handleexecreference} -%D \stoptypen -%D -%D An better alternative, slower but error aware, is - -\definespecialtest\v!actie% - {\doifreferencefoundelse\currentreferenceoperation} - -\definespeciallocation\v!actie - {\handleexecreference} - -%D So now we can say: -%D -%D \starttypen -%D \goto{some action}[PreviousJump] -%D \stoptypen -%D -%D as well as: -%D -%D \starttypen -%D \goto{some text}[action(PreviousJump] -%D \stoptypen - -%D A special case of references are those to programs. These, -%D very system dependant references are implemented by abusing -%D some of the previous macros. -%D -%D \showsetup{\y!stelprogrammasin} -%D \showsetup{\y!definieerprogramma} -%D \showsetup{\y!programma} -%D -%D The latter gives access to the description of the program, -%D being the last argument to the definition command. - -\def\stelprogrammasin% - {\dodoubleargument\getparameters[\??pr]} - -\def\dodefinieerprogramma[#1][#2][#3]% - {\setgvalue{\v!programma:::#1}{\doprogramma{#2}{#3}}} - -\def\definieerprogramma% - {\dotripleargument\dodefinieerprogramma} - -\def\programma#1[#2]% - {\bgroup - \doifdefinedelse{\v!programma:::#2} - {\def\doprogramma##1##2% - {\doifelsenothing{#1} - {\naar{##2}[\v!programma(#2)]} - {\naar{#1}[\v!programma(#2)]}}% - \getvalue{\v!programma:::#2}} - {\tttf[#2]}% - \egroup} - -\definespeciallocation\v!programma#1#2% - {\bgroup - \iflocation - \doifdefinedelse{\v!programma:::\currentreferenceoperation} - {\def\doprogramma##1##2{\def\@@programfile{##1}}% - \getvalue{\v!programma:::\currentreferenceoperation}} - {\let\@@programfile=\currentreferenceoperation}% - \convertcommand\@@programfile\to\ascii - \dostartgoto - \data - {#2}% - \start - \dostartrunprogram - {\number\buttonwidth}{\number\buttonheight} - {\@@prgebied\ascii\space\currentreferencearguments}% - \stop - \dostoprunprogram - \dostopgoto - \else - {#2}% - \fi - \egroup} - -%D As we can see, we directly use the special reference -%D mechanism, which means that -%D -%D \starttypen -%D \goto{some text}[program(name{args})] -%D \stoptypen -%D -%D is valid. - -%D The next macro provides access to the actual pagenumbers. -%D When documenting and sanitizing the original reference -%D macros, I decided to keep the present meaning as well as to -%D make this meaning available as a special reference method. -%D So now one can use: -%D -%D \starttypen -%D \gotopage{some text}[location] -%D \gotopage{some text}[number] -%D \gotopage{some text}[file::number] -%D \stoptypen -%D -%D as well as: -%D -%D \starttypen -%D \goto{some text}[page(location)] -%D \goto{some text}[page(number)] -%D \goto{some text}[file::page(number)] -%D \stoptypen -%D -%D Here location is a keyword like \type{nextpage}. -%D -% \showsetup{\y!ganaarpagina} - -\def\dodefinieerpagina[#1][#2]% - {\setvalue{\v!pagina:::#1}{#2}} - -\def\definieerpagina% - {\dodoubleargument\dodefinieerpagina} - -\definieerpagina [\v!eerste\v!pagina] [\firstpage] -\definieerpagina [\v!vorige\v!pagina] [\prevpage] -\definieerpagina [\v!volgende\v!pagina] [\nextpage] -\definieerpagina [\v!laatste\v!pagina] [\lastpage] -\definieerpagina [\v!eerste\v!sub\v!pagina] [\firstsubpage] -\definieerpagina [\v!vorige\v!sub\v!pagina] [\prevsubpage] -\definieerpagina [\v!volgende\v!sub\v!pagina] [\nextsubpage] -\definieerpagina [\v!laatste\v!sub\v!pagina] [\lastsubpage] -\definieerpagina [\v!eerste] [\firstpage] -\definieerpagina [\v!vorige] [\prevpage] -\definieerpagina [\v!volgende] [\nextpage] -\definieerpagina [\v!laatste] [\lastpage] -\definieerpagina [\v!eerste\v!sub] [\firstsubpage] -\definieerpagina [\v!vorige\v!sub] [\prevsubpage] -\definieerpagina [\v!volgende\v!sub] [\nextsubpage] -\definieerpagina [\v!laatste\v!sub] [\lastsubpage] - -%D Because we combine both methods, we have to take care of -%D the \type{file::page(n)} as well as \type{page(file::n)}. - -\definespeciallocation\v!pagina#1#2% - {\iflocation - \ifx\currentouterreference\empty - \splitoffreference\currentreferenceoperation - \else - \let\currentinnerreference=\currentreferenceoperation - \fi - \ifx\currentouterreference\empty - \doifnonzeropositiveelse{\currentinnerreference} - {} - {\edef\currentinnerreference{1}}% - \gotorealpage{}{}{\currentinnerreference}{#2}% - \else - \setouterlocation\currentouterreference - \doifnonzeropositiveelse{\currentinnerreference} - {} - {\doifdefinedelse{\v!pagina:::\currentinnerreference} - {\edef\currentinnerreference{\getvalue{\v!pagina:::\currentinnerreference}}} - {\edef\currentinnerreference{1}}}% - \gotorealpage{\otherURL}{\otherfile}{\currentinnerreference}{#2}% - \fi - \else - {#2}% - \fi} - -\def\naarpagina#1[#2]% - {\naar{#1}[\v!pagina(#2)]} - -\let\ganaarpagina=\naarpagina - -%D A still very rudimentary|/|experimental forward|/|backward -%D reference mechanism is provided by the macro \type{\atpage}: -%D -%D \starttypen -%D ... \somewhere{backward text}{forward text}[someref] ... -%D ... \oppagina[someref] ... -%D \stoptypen -%D -%D In future versions there will be more sophisticated - -%D !!!!! \ergens documenteren in handleiding !!!!! - -%D support, also suitable for refreences to floating bodies. - -\unexpanded\def\ergens#1#2[#3]% - {\leaveoutervmode - \doifreferencefoundelse{#3} - {\ifforwardreference - \doifelsenothing{#1} - {\dosymbolreference{}{}[#3]} - {\donaarspace{#1}[#3]}% - \else - \doifelsenothing{#2} - {\dosymbolreference{}{}[#3]} - {\donaarspace{#2}[#3]}% - \fi} - {\unknownreference{#3}#1/#2}% - \referentieinfo{<}{#3}} - -\unexpanded\def\oppagina[#1]% - {\leaveoutervmode - \doifreferencefoundelse{#1} - {\doifelse{\realfolio}{\currentrealreference} - {\ifforwardreference - \donaarfixed{\labeltext{\v!hier\v!boven}}[#1]% - \else - \donaarfixed{\labeltext{\v!hier\v!onder}}[#1]% - \fi} - {\donaarfixed{\labeltext{\v!op\v!pagina}~\currentpagereference}[#1]}} - {\unknownreference{#1}% - \v!pagina~\dummyreference}% - \referentieinfo{<}{#1}} - -%D --- STRANGE HERE, BETTER IN CORE-NAV --- - -\def\checkcontrastreference#1% - {\ifnum\currentreferencetype=\rt!page\ifnum\currentdatareference=\realpageno - \doifdefined{#1\c!contrastkleur} - {\setevalue{#1\c!kleur}{\getvalue{#1\c!contrastkleur}}}% - \fi\fi} - -%D Buttons are just what their names says: things that can be -%D clicked (pushed) on. They are similar to \type{\goto}, -%D except that the text argument is not interpreted. -%D Furthermore one can apply anything to them that can be done -%D with \type{\framed}. -%D -%D \startbuffer -%D \button[width=3cm,height=1.5cm]{Exit}[ExitViewer] -%D \stopbuffer -%D -%D \typebuffer -%D -%D gives -%D -%D \haalbuffer -%D -%D This command is formally specified as: -%D -%D \showsetup{\y!button} -%D -%D The characteristics can be set with: -%D -%D \showsetup{\y!stelbuttonsin} - -\def\dostelbuttonsin[#1]% - {\getparameters[\??bt][#1]% - \dododostelinteractiemenuin{\??bt\c!onbekendeverwijzing}% - \dododostelinteractiemenuin{\??bt\c!zelfdepagina}} - -\def\stelbuttonsin% - {\dosingleargument\dostelbuttonsin} - -\definecomplexorsimpleempty\button - -\def\complexbutton% - {\docomplexbutton\??bt} - -\presetlocalframed[\??bt] - -\def\docomplexbutton#1[#2]#3[#4]% - {\ConvertConstantAfter\doifelse{#3}{\v!geen} - {\!!doneafalse} - {\!!doneatrue}% - \doifreferencefoundelse{#4} - {\setbox0=\if!!donea\hbox\else\hphantom\fi - {\localframed[#1][#2] - {\checkcontrastreference{#1}% - \dolocationattributes{#1}{\ignorespaces#3}}}% - \startinteractie - \hbox{\gotolocation{#4}{\copy0}}% - \stopinteractie} - {\unknownreference{#4}% - \if!!donea\hbox\else\hphantom\fi - {\localframed[#1][#2] - {\ignorespaces#3}}}} - -% The old one: -% -% \def\complexbutton[#1]#2[#3]% -% {\ConvertConstantAfter\doifelse{#2}{\v!geen} -% {\!!doneafalse} -% {\!!doneatrue}% -% \doifreferencefoundelse{#3} -% {\setbox0=\if!!donea\hbox\else\hphantom\fi -% {\localframed[\??bt][#1] -% {\doifelsenothing{#3} % ??? zie eerdere test -% {\doattributes{\??bt}{\ignorespaces#2}} -% {\dolocationattributes{\??bt}{\ignorespaces#2}}}}% -% \startinteractie -% \hbox{\gotolocation{#3}{\copy0}}% -% \stopinteractie} -% {\unknownreference{#3}% -% \if!!donea\hbox\else\hphantom\fi -% {\localframed[\??bt][#1] -% {\ignorespaces#2}}}} - -%D Interaction buttons, in fact a row of tiny buttons, are -%D typically only used for navigational purposed. The next -%D macro builds such a row based on a specification list. -%D -%D \startbuffer -%D \interactiebuttons -%D [breedte=\hsize][pagina,VorigeSprong,VerlaatViewer] -%D \stopbuffer -%D -%D \typebuffer -%D -%D gives -%D -%D \haalbuffer -%D -%D Apart from individual entries, one can use \type{page} and -%D \type {subpage} as shortcuts to their four associated buttons. -%D The symbols are derived from the symbols linked to the -%D entries. - -\def\interactiebuttons% - {\dodoubleempty\dointeractiebuttons} - -\def\dointeractiebuttons[#1][#2]% - {\iflocation - \ifsecondargument - \bgroup - \setbox2=\hbox - {\localframed[\??ib][]{\gobackwardcharacter}}% - \!!heighta=\ht2 - \stelinteractiebalkin[#1,\c!strut=\v!nee]% - \stelinteractiein[\c!breedte=\!!zeropoint]% - \!!widtha=\@@ibbreedte\relax - \!!counta=1 - \processallactionsinset - [#2] - [ \v!pagina=>\advance\!!counta by 4, - \v!sub\v!pagina=>\advance\!!counta by 4, - \s!unknown=>\advance\!!counta by 1]% - \divide\!!widtha by \!!counta - \def\goto##1% - {\setnostrut - \edef\localreference{##1}% - \docomplexbutton - \??ib - [\c!hoogte=\!!heighta,\c!breedte=\!!widtha]% - {\dontleavehmode\symbol[\localreference]}% - [\localreference]% - \hss}% - \hbox to \@@ibbreedte - {\processallactionsinset - [#2] - [ \v!pagina=>\goto{\v!eerste\v!pagina}% - \goto{\v!volgende\v!pagina}% - \goto{\v!vorige\v!pagina}% - \goto{\v!laatste\v!pagina}, - \v!sub\v!pagina=>\goto{\v!eerste\v!sub\v!pagina}% - \goto{\v!volgende\v!sub\v!pagina}% - \goto{\v!vorige\v!sub\v!pagina}% - \goto{\v!laatste\v!sub\v!pagina}, - \s!unknown=>\goto\commalistelement]% - \unskip}% - \egroup - \else - \interactiebuttons[][#1]% - \fi - \fi} - -%D In the next settings we see some variables that were not -%D used here and that concern the way the pagenumbers refered -%D to are typeset. - -\setupreferencing - [\c!status=\v!start, - \v!deel\c!nummer=\v!ja, - \v!hoofdstuk\c!nummer=\v!nee, - \c!interactie=\v!alles, - \c!prefix=] - -\protect - -\endinput +% DUE TO NEW/FUTURE FEATURES THIS MODULE IS UNDER RECONSTRUCTION !
+%
+% uitprinten
+% engels maken
+% rommel voorlopig naar core-01d
+% programma, profiel etc als methode
+
+%D \module
+%D [ file=core-ref,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Cross Referencing,
+%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 Core Macros / Cross Referencing}
+
+\unprotect
+
+\startmessages dutch library: references
+ title: verwijzingen
+ 1: onbekende verwijzing --
+ 2: dubbele verwijzing -- op pagina --
+ 3: type verwijzing -- onbekend
+ 21: document -- geladen
+ 22: document -- is niet interactief
+ 23: onduidelijke verwijzing -- (prefix=--)
+\stopmessages
+
+\startmessages english library: references
+ title: references
+ 1: unknown reference --
+ 2: duplicate reference -- on page --
+ 3: unknown reference type --
+ 21: document -- loaded
+ 22: document -- is not interactive
+ 23: obscure reference -- (prefix=--)
+\stopmessages
+
+\startmessages german library: references
+ title: referenzen
+ 1: unbekannte Referenz --
+ 2: doppelte Referenz -- auf Seite --
+ 3: unbekannte Referenz Typ --
+ 21: Dokument -- geladen
+ 22: Dokument -- ist nicht aktiv
+ 23: Obskure Referenz -- (Prefix=--)
+\stopmessages
+
+%D This module deals with referencing. In \CONTEXT\ referencing
+%D is one of the core features, although at a first glance
+%D probably nobody will notice. This is good, because
+%D referencing should be as hidden as possible.
+%D
+%D In paper documents, referencing comes down to cross
+%D referencing, but in their interactive counterparts, is also
+%D involves navigation. Many features implemented here are
+%D therefore closely related to navigation.
+%D
+%D Many \CONTEXT\ commands can optionally be fed with a
+%D reference. Such a reference, when called upon, returns the
+%D number of a figure, table, chapter etc, a piece of text, or
+%D a pagenumber.
+%D
+%D There are three ways of defining a reference:
+%D
+%D \starttypen
+%D \pagereference[here]
+%D \textreference[here]{some text}
+%D \stoptypen
+%D
+%D the third alternative combines them in:
+%D
+%D \starttypen
+%D \reference[here]{some text}
+%D \stoptypen
+
+\def\textreference {\dosingleargument\dotextreference}
+\def\pagereference {\dosingleargument\dopagereference}
+\def\reference {\dosingleargument\doreference}
+
+%D These are implemented in a low level form as:
+
+\def\dotextreference[#1]#2{\rawtextreference{\s!txt}{#1}{#2}}
+\def\dopagereference [#1]{\rawpagereference{\s!pag}{#1}}
+\def\doreference [#1]#2{\rawreference {\s!ref}{#1}{#2}}
+
+%D Actually there is not much difference between a text and a
+%D full reference, but it's the concept that counts. The low
+%D level implementation is:
+
+\def\rawpagereference#1#2%
+ {\makesectionformat
+ \writereference{#2}
+ {\sectionformat::\noexpand\pagenumber}
+ {\noexpand\realfolio}
+ {}}
+
+\def\rawtextreference#1#2#3%
+ {\writereference{#2}
+ {}
+ {}
+ {#3}}
+
+\def\rawreference#1#2#3%
+ {\makesectionformat
+ \writereference{#2}
+ {\sectionformat::\noexpand\pagenumber}
+ {\noexpand\realfolio}
+ {#3}}
+
+%D As we can see, these macros depend on three other ones,
+%D \type {\makesectionformat}, that generated \type
+%D {\sectionformat}, \type {\pagenumber}. The not yet used
+%D argument \type{#1} is a tag that specifies the type of
+%D reference.
+%D
+%D Why do we have to write down references? \TEX, and therefore
+%D \CONTEXT\ is a batch processing system. During the
+%D typesetting process, pages are shipped out, which means that
+%D especially forward references are not yet known when the
+%D page is typeset. That's why we always need a second (and
+%D sometimes even a third) pass to get the cross references
+%D right. The same goes for lists and other pagenumber
+%D dependant data.
+%D
+%D Therefore, during a pass, \CONTEXT\ writes the references to
+%D a the utility file. The next macro does the job and
+%D generates entries like:
+%D
+%D \starttypen
+%D \mainreference{prefix}{reference}{page}{realpage}{text}
+%D \stoptypen
+%D
+%D We did not yet discuss prefixing. Especially in interactive
+%D documents, it's not always easy to keep track of duplicate
+%D references. The prefix mechanism, which we will describe
+%D later on, solves this problem. By (automatically) adding a
+%D prefix one keeps references local, but the global ones in
+%D view. To enable this feature, we explictly split the prefix
+%D from the reference.
+%D
+%D A former implementation used \type{\removesubstring} to get
+%D rid of the don't||use||a||prefix signal (\type{-:}), but the
+%D next one proved to be more than twice as fast.
+
+\let\referenceprefix=\empty
+\let\lastreference =\empty
+
+%D The last reference is saved in a macro named \type
+%D {\lastreference} (indeed). To keep track of the order of
+%D references, later we will see for what purpose, we maintain
+%D a counter.
+
+\newcount\crossreferencenumber \crossreferencenumber=1
+
+\def\writereference#1#2#3#4%
+ {\ifreferencing
+ \doifsomething{#1}
+ {\def\dowritereference##1%
+ {\xdef\lastreference{##1}%
+ \@EA\dodowritereference\lastreference\empty\empty\end
+ {#2}{#3}{#4}}%
+ \processcommalist[#1]\dowritereference}%
+ \fi}
+
+\def\dodowritereference#1#2#3\end#4#5#6%
+ {\bgroup
+ \global\advance\crossreferencenumber by 1
+ \if#1-\if#2:%
+ \let\referenceprefix=\empty
+ \xdef\lastreference{#3}%
+ \else
+ \xdef\lastreference{#1#2#3}%
+ \fi\else
+ \xdef\lastreference{#1#2#3}%
+ \fi
+ \ifx\lastreference\empty \else
+ \doiffirstreferenceoccurance{\lastreference}
+ {\thisisdestination{\referenceprefix\lastreference}}%
+ \@EA\referentieinfo\@EA>\@EA{\lastreference}%
+ \edef\dododowritereference%
+ {\writeutilitycommand
+ {\mainreference{\referenceprefix}{\lastreference}{#4}{#5}{#6}}}%
+ \dododowritereference
+ \fi
+ \egroup}
+
+%D We will implement \type {\doiffirstreferenceoccurance}
+%D later on.
+
+%D When (during a second pass over the document) references are
+%D loaded, they are saved in a macro, one for each reference.
+%D In practice this comes to giving \type {\mainreference} a
+%D appropriate meaning and loading the utility file.
+
+%\def\setreferences%
+% {\def\mainreference##1##2##3##4##5%
+% {\doifundefinedelse{\r!cross\fileprefix##1##2}
+% {\setglobalcrossreference{##1##2}{##3}{##4}{##5}}
+% {\showmessage{\m!references}{2}{[##1][##2],##4}}}}
+
+\def\setreferences%
+ {\def\mainreference##1##2##3##4##5%
+ {\doifundefinedelse{\r!cross\fileprefix##1##2}
+ {\setglobalcrossreference{##1##2}{##3}{##4}{##5}}
+ {\ifcase0##4\else\showmessage{\m!references}{2}{[##1][##2],##4}\fi}}}
+
+\def\resetreferences%
+ {\let\mainreference=\gobblefivearguments}
+
+\resetreferences
+
+%D Here we see another kind of prefix surface: \type
+%D {\fileprefix}. This prefix enables us to use references from
+%D different files in one document. This is no really useful in
+%D paper documents, but many interactive ones cannot do
+%D without.
+
+\let\fileprefix=\empty
+
+%D Loading references is done using the normal utility file
+%D handling macros. The \type{\hbox} trick prevents spaces
+%D creeping in (references are set globally anyway).
+
+\def\usereferences[#1]%
+ {\bgroup
+ \setbox0=\hbox
+ {\doonlyonce{references:#1}{\doutilities{references}{#1}{}{}{}}}%
+ \egroup}
+
+\def\checkreferences%
+ {\usereferences[\jobname]%
+ \checkrealpage
+ \global\let\checkreferences=\relax}
+
+%D As mentioned we will also use the cross reference mechanism
+%D for navigational purposes. The main reason for this is that
+%D we want to treat both categories alike:
+%D
+%D \starttypen
+%D \goto{go back}[PreviousJump]
+%D \goto{colofon}[colofon page]
+%D \stoptypen
+%D
+%D Here \type{PreviousJump} is handled by the viewer, while the
+%D \type{colofon page} reference is, apart from hyperlinking, a
+%D rather normal reference.
+%D
+%D We already saw that cross refences are written to and read
+%D from a file. The pure navigational ones don't need to be
+%D written to file, but both for fast processing and
+%D transparant integration, they are saved internally as a sort
+%D of reference. We can easily distinguish such system
+%D references from real cross reference ones by their tag:
+
+\chardef\rt!cross=0
+\chardef\rt!done =1
+\chardef\rt!page =2
+\chardef\rt!exec =3
+\chardef\rt!list =4
+
+%D Here the \type{\rt!exec} tags a viewer specific navigational
+%D reference, while for instance \type{\rt!page} gives fast
+%D access to for instance the previous or next page. The
+%D counter serves a purpose to be explained later.
+
+\newcount\crossreferenceorder
+
+\def\setlocalcrossreference#1#2#3#4%
+ {\setevalue{\r!cross\fileprefix#1}{\rt!cross{#2}{#3}{#4}{0}}}
+
+\def\setglobalcrossreference#1#2#3#4%
+ {\global\advance\crossreferenceorder by 1
+ \setxvalue{\r!cross\fileprefix#1}{\rt!cross{#2}{#3}{#4}{\the\crossreferenceorder}}}
+
+\def\setlocalsystemreference#1#2#3%
+ {\setevalue{\r!cross\fileprefix#2}{#1{#3}}}
+
+\def\setglobalsystemreference#1#2#3%
+ {\setxvalue{\r!cross\fileprefix#2}{#1{#3}}}
+
+%D References from other files are defined globally without
+%D ordering data. The first definition, the one without
+%D \type{#1}, is used as a signal that references are defined.
+
+\def\setoutercrossreference#1#2#3#4%
+ {\setxvalue{\r!cross\fileprefix}{\rt!cross{}{}{1}{0}}%
+ \setxvalue{\r!cross\fileprefix#1}{\rt!cross{#2}{#3}{#4}{0}}}
+
+%D In practice accessing a reference comes down to:
+%D
+%D \startopsomming[opelkaar]
+%D \som checking the validity
+%D \som determining the type
+%D \som filtering the content
+%D \stopopsomming
+%D
+%D We'll deal with the last two steps first. References are
+%D saved in the general format:
+%D
+%D \starttypen
+%D {\referenceclass{realpage}{page}{text}}
+%D {\referenceclass{type}{data}}
+%D \stoptypen
+%D
+%D When we filter the content, next macros are set when we
+%D meet a normal cross reference:
+
+\let\currentrealreference=\empty
+\let\currentpagereference=\empty
+\let\currenttextreference=\empty
+
+%D System references only have one component:
+
+\let\currentdatareference=\empty
+
+%D Because internally a reference comes in two disguises, one
+%D with four arguments and one with only two, we need a two
+%D step filter.
+
+\def\getreferenceelements#1%
+ {\edef\referenceelements{\getvalue{\r!cross\referenceprefix#1}}%
+ \expandafter\dogetreferenceelements\referenceelements{}{}{}{}}
+
+%D In the following step, the \type{\ifx#1} test is needed
+%D because we can access this macro directly, and therefore
+%D \type{#1} can be an undefined reference (in fact, this hack
+%D was needed for the line numbering mechanism).
+%D
+%D We already introduced a few counters. Here we see why we
+%D needed those. The discrancy between the cross reference
+%D definition order (determined by the utility file) and the
+%D moment the reference is defined in the text, is a measure
+%D for it's forward character. This enables references like
+%D {\em as we will see later on}.
+
+\chardef\currentreferencetype=0
+
+\newif\ifforwardreference
+
+\def\dogetreferenceelements#1#2#3#4#5%
+ {\chardef\currentreferencetype=\ifx#1\relax0\else#1\fi\relax
+ \ifnum\currentreferencetype<2
+ \def\currentpagereference{\referencepagenumber[#2]}%
+ \edef\currentrealreference{#3}%
+ \def\currenttextreference{#4}%
+ \ifnum0#5>\crossreferencenumber
+ \forwardreferencetrue
+ \else
+ \forwardreferencefalse
+ \fi
+ \else
+ \def\currentdatareference{#2}%
+ \edef\currentrealreference{#3}%
+ \def\currenttextreference{#4}%
+ \forwardreferencefalse
+ \fi}
+
+%D When inside this tetsing macro we can savely use:
+
+\def\doifforwardreferenceelse#1#2%
+ {\ifforwardreference#1\else#2\fi}
+
+%D Duplicate references are reported while loading the utility
+%D file. To prevent problems with document viewers cq.
+%D preprocessors, one can enable a (bit time consuming) check.
+
+\newif\ifcheckduplicatereferences
+
+%D The next rather dirty trick is needed to preserve the
+%D meaning of the original cross reference. In fact,
+%D \type{\rt!cross} is toggled to \type{\rt!done}.
+
+\def\doiffirstreferenceoccurance#1#2%
+ {\ifcheckduplicatereferences
+ \doifundefinedelse{\r!cross\referenceprefix#1}
+ {#2}
+ {\getreferenceelements{#1}%
+ \ifnum\currentreferencetype=\rt!cross
+ #2%
+ \bgroup
+ \def\rt!cross##1##2##3##4%
+ {\setgvalue{\r!cross\referenceprefix#1}%
+ {\rt!done{##1}{##2}{##3}{##4}}}%
+ \getvalue{\r!cross\referenceprefix#1}%
+ \egroup
+ \fi}%
+ \else
+ #2%
+ \fi}
+
+%D We still have to test for the existence of a reference, but
+%D before we come to that, we first look into the way a
+%D reference can be accessed. It will be no surprise that
+%D references can come in several forms.
+%D
+%D Cross references appear as numbers (figure~1.1, chapter~2)
+%D or pagenumbers (page~2, page 3--2), and are called with
+%D \type{\in} and \type{\at}. In interactive documents we also
+%D have \type{\goto}, \type{\button} and alike. These are more
+%D versatile and look like:
+%D
+%D \starttypen
+%D \goto[reference]
+%D \goto[outer reference::]
+%D \goto[outer reference::inner reference]
+%D \goto[operation(argument)]
+%D \goto[operation(action{argument,argument})]
+%D \stoptypen
+%D
+%D The first one is a normal reference, the second and third
+%D are references to a file or \URL. The brace delimited
+%D references for instance refer to a \JAVASCRIPT. The last
+%D example shows that we can pass arguments to the actions.
+%D
+%D When we split off the components of such a reference, the
+%D results are available in:
+%D
+%D \starttypen
+%D \currentreferencespecial
+%D \currentreferenceoperation
+%D \currentreferencearguments
+%D \currentinnerreference
+%D \currentouterreference
+%D \currentfullreference
+%D \stoptypen
+%D
+%D Splitting a reference is done by:
+%D
+%D \starttypen
+%D \splitofffullreference {reference}
+%D \splitoffreference {reference}
+%D \stoptypen
+%D
+%D The second alternative can be used in a second stage
+%D splitoff and only handles \type{::}.
+
+\newif\ifreferencefound
+
+\let\currentfullreference =\empty
+\let\currentreferencespecial =\empty
+\let\currentreferenceoperation=\empty
+\let\currentreferencearguments=\empty
+\let\currentouterreference =\empty
+\let\currentinnerreference =\empty
+
+\def\splitofffullreference#1%
+ {\edef\currentfullreference{#1}%
+ \@EA\dosplitofffullreference\currentfullreference\empty(\relax)\empty\end}
+
+\def\dosplitofffullreference#1(#2#3)#4#5\end
+ {\ifx#2)%
+ \let\currentreferenceoperation=\empty
+ \let\currentreferencearguments=\empty
+ \let\currentinnerreference=\empty
+ \dodosplitofffullreference#1::::\empty\end
+ \currentouterreference\currentreferencespecial
+ \else\ifx#2\relax
+ \let\currentreferencespecial=\empty
+ \let\currentreferenceoperation=\empty
+ \let\currentreferencearguments=\empty
+ \dodosplitofffullreference#1::::\empty\end
+ \currentouterreference\currentinnerreference
+ \else
+ \dosplitoffreferenceoperation#2#3{}\end
+ \let\currentinnerreference=\empty
+ \dodosplitofffullreference#1::::\empty\end
+ \currentouterreference\currentreferencespecial
+ \fi\fi}
+
+\def\dosplitoffreferenceoperation#1#%
+ {\def\currentreferenceoperation{#1}%
+ \dodosplitoffreferenceoperation}
+
+\def\dodosplitoffreferenceoperation#1#2\end
+ {\def\currentreferencearguments{#1}}
+
+\def\dodosplitofffullreference#1::#2::#3#4\end#5#6%
+ {\if#3:%
+ \edef#5{#1}\edef#6{#2}%
+ \else
+ \let#5=\empty\edef#6{#1}%
+ \fi}
+
+\def\splitoffreference#1%
+ {\expandafter\dodosplitofffullreference#1::::\empty\end
+ \currentouterreference\currentinnerreference}
+
+%D Although the previous split macros have a multistep
+%D character, there performance is quite reasonable.
+%D
+%D For debugging purposes we provide a showcase macro:
+
+\def\showcurrentreference%
+ {\bgroup\tttf
+ /ful/\convertcommand\currentfullreference \to\ascii\ascii/\par
+ /spe/\convertcommand\currentreferencespecial \to\ascii\ascii/\par
+ /ope/\convertcommand\currentreferenceoperation\to\ascii\ascii/\par
+ /arg/\convertcommand\currentreferencearguments\to\ascii\ascii/\par
+ /out/\convertcommand\currentouterreference \to\ascii\ascii/\par
+ /inn/\convertcommand\currentinnerreference \to\ascii\ascii/\par
+ \egroup}
+
+%D We use this visualizer to demonstrate the way references are
+%D split.
+%D
+%D \hbox{\splitofffullreference{rr}\showcurrentreference}
+%D \hbox{\splitofffullreference{pp(qq)}\showcurrentreference}
+%D \hbox{\splitofffullreference{pp(qq{aa,bb})}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::rr}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::pp()}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::pp(qq)}\showcurrentreference}
+%D \hbox{\splitofffullreference{ff::pp(qq{aa})}\showcurrentreference}
+
+%D Finaly we've come to the promissed testing step. As we can
+%D see, this macro does bit more than testing: it also resolves
+%D the reference. This means that whenever we test for the
+%D existance of a reference at an outer level, we have all the
+%D relevant properties of that reference avaliable inside the
+%D true branche~(\type{#2}).
+%D
+%D The prefix has to do with localizing references. When a
+%D prefix is set, looking for a reference comes to looking for
+%D the prefixed one, and when not found, looking for the non
+%D prefixed one. Consider for instance the prefix set to
+%D \type{sidetrack}.
+%D
+%D \starttypen
+%D \pagereference[important]
+%D \pagereference[unimportant]
+%D \setupreferencing[prefix=sidetrack]
+%D \pagereference[important]
+%D \stoptypen
+%D
+%D results in saving (writing) the references
+%D
+%D \starttypen
+%D ...{}{important}
+%D ...{}{unimportant}
+%D ...{sidetrack}{important}...
+%D \stoptypen
+%D
+%D Now when we call for \type{unimportant}, we will indeed get
+%D the pagenumber associated to this reference. But when we
+%D call for \type{important}, while the prefix is still set, we
+%D will get the pagenumber bound to the prefixed one.
+%D
+%D {\em Some day, when processing time and memory are no longer
+%D performance factors, we will introduce multi||level
+%D prefixes.}
+
+% \def\doifreferencefoundelse#1#2#3%
+% {\checkreferences
+% \bgroup
+% \let\unharmedreferenceprefix=\referenceprefix
+% \bgroup
+% \splitofffullreference{#1}%
+% \ifx\currentreferencespecial\empty
+% \ifx\currentouterreference\empty
+% \doifdefinedelse{\r!cross\referenceprefix\currentfullreference}
+% {\global\referencefoundtrue}
+% {\let\referenceprefix=\empty
+% \doifdefinedelse{\r!cross\currentfullreference}
+% {\global\referencefoundtrue}
+% {\global\referencefoundfalse}}%
+% \else
+% \global\referencefoundtrue
+% \fi
+% \doifpredefinedreferenceelse{\currentfullreference} % no \referenceprefix
+% {\global\referencefoundfalse}{}%
+% \ifreferencefound
+% \getreferenceelements{\currentfullreference}%
+% \fi
+% \else
+% \let\referenceprefix=\empty
+% \let\unharmedreferenceprefix=\empty
+% \doifdefinedelse{\s!do\v!test\currentreferencespecial}
+% {\getvalue{\s!do\v!test\currentreferencespecial}
+% {\global\referencefoundtrue}{\global\referencefoundfalse}}
+% {\global\referencefoundtrue}%
+% \fi
+% \ifreferencefound
+% #2%
+% \egroup
+% \else
+% #3%
+% \egroup
+% \predefinereference{#1}% no \referenceprefix
+% \fi
+% \egroup}
+
+%D FILEPREFIX WEEDEN
+
+\def\doifreferencefoundelse#1#2#3% opsplitsen in inner/outer/special
+ {\checkreferences
+ \bgroup
+ \let\unharmedreferenceprefix=\referenceprefix
+ \bgroup
+ \splitofffullreference{#1}%
+ \ifx\currentreferencespecial\empty
+ \ifx\currentouterreference\empty
+ \docheckinnerreference
+ \else
+ \docheckouterreference
+ \fi
+ \ifreferencefound
+ \getreferenceelements\currentfullreference
+ \fi
+ \else
+ \docheckspecialreference
+ \fi
+ \ifreferencefound
+ #2\egroup
+ \else
+ #3\egroup
+ \fi
+ \egroup}
+
+%D The next fast one permits rather raw references with
+%D \type{()}'s and is used in the object reference mechanism.
+
+\def\doifrawreferencefoundelse#1#2#3%
+ {\checkreferences
+ \bgroup
+ \edef\currentfullreference{#1}%
+ \doifdefinedelse{\r!cross\currentfullreference}
+ {\getreferenceelements\currentfullreference
+ \global\referencefoundtrue #2}
+ {\global\referencefoundfalse #3}%
+ \egroup}
+
+%D The inner case is simple. Only two cases have to be taken
+%D care of:
+%D
+%D \starttypen
+%D \naar{some text}[reference]
+%D \naar{some text}[prefix:reference]
+%D \stoptypen
+
+\def\docheckinnerreference%
+ {\global\let\predefinedreference=\currentinnerreference
+ \doifdefinedelse{\r!cross\referenceprefix\currentfullreference}
+ {\global\referencefoundtrue}
+ {\let\referenceprefix=\empty
+ \doifdefinedelse{\r!cross\currentfullreference}
+ {\global\referencefoundtrue}
+ {\global\referencefoundfalse}}%
+ \doifpredefinedreferenceelse{\global\referencefoundfalse}{}}
+
+%D References to other files however are treated strict or
+%D tolerant, depending on their loading and availability:
+%D
+%D \starttypen
+%D \useexternaldocument[somefile][filename][a nice description]
+%D
+%D \goto{checked reference}[somefile::reference]
+%D \goto{unchecked reference}[somefile::]
+%D \goto{unchecked reference}[anotherfile::reference]
+%D \stoptypen
+%D
+%D Here we use the dummy reference \type{somefile::} set in
+%D \type{\setouterreference} as a signal that indeed references
+%D are defined for the outer file.
+
+\def\docheckouterreference%
+ {\let\referenceprefix=\empty
+ \let\unharmedreferenceprefix=\empty
+ \xdef\predefinedreference%
+ {\currentouterreference::\currentinnerreference}%
+ \ifx\innerreference\empty
+ \global\referencefoundtrue % no checking done
+ \else
+ \doifdefinedelse{\r!cross\currentouterreference::}
+ {\doifdefinedelse{\r!cross\currentfullreference}
+ {\global\referencefoundtrue}
+ {\global\referencefoundfalse}}
+ {\global\referencefoundtrue}% no checking done
+ \fi
+ \doifpredefinedreferenceelse{\global\referencefoundfalse}{}}
+
+%D Special references are only tested when some test routine is
+%D defined.
+
+\def\docheckspecialreference%
+ {\let\referenceprefix=\empty
+ \let\unharmedreferenceprefix=\empty
+ \xdef\predefinedreference%
+ {\currentreferencespecial::\currentreferenceoperation}%
+ \doifdefinedelse{\s!do\v!test\currentreferencespecial}
+ {\getvalue{\s!do\v!test\currentreferencespecial}
+ {\global\referencefoundtrue}
+ {\global\referencefoundfalse}}
+ {\global\referencefoundtrue}%
+ \doifpredefinedreferenceelse{\global\referencefoundfalse}{}}
+
+%D An unknown reference is reported on the screen, in the log
+%D file and, when enabled, in the left margin of the text.
+
+\def\unknownreference#1%
+ {\ifvoorlopig
+ \doifsomething{#1}
+ {\inlinker
+ {\infofont
+ \dimen0=\linkermargebreedte
+ \advance\dimen0 by -2em
+ \doboundtext{#1}{\dimen0}{..}->}}%
+ \fi
+ \doifpredefinedreferenceelse
+ {}
+ {\predefinereference
+ \showmessage{\m!references}{1}{[\unharmedreferenceprefix][#1]}}}
+
+%D Although not actually needed, we default the unharmed
+%D reference prefix to the normal one.
+
+\def\unharmedreferenceprefix%
+ {\referenceprefix}
+
+%D When a reference is not found, we typeset a placeholder
+%D (two glyphs are often enough to represent the reference
+%D text).
+
+
+\def\dummyreference%
+ {{\tttf ??}}
+
+%D To prevent repetitive messages concerning a reference
+%D being defined, we set such an unknown reference to an empty
+%D one after the first encounter.
+
+\let\predefinedreference=\s!unknown
+
+\def\predefinereference%
+ {\setxvalue{\r!cross\predefinedreference}{\rt!cross{}{}{}{}}}
+
+%D Testing on existance then becomes:
+
+\def\doifpredefinedreferenceelse%
+ {\doifelsevalue{\r!cross\predefinedreference}{\rt!cross{}{}{}{}}}
+
+%D Apart from cross references supplied by the user, \CONTEXT\
+%D generates cross references itself. Most of them are not
+%D saved as a reference, but stored with their source, for
+%D instance a list or an index entry. Such automatically
+%D generated, for the user invisible, references are called
+%D {\em internal references}. The user supplied ones are
+%D labeled as {\em external references}.
+%D
+%D A second important characteristic is that when we want to
+%D support different backends (viewers), we need to support
+%D named destinations as well as page numbers. I invite readers
+%D to take a glance at the special driver modules to understand
+%D the fine points of this. As a result we will deal with {\em
+%D locations} as well as {\em real page numbers}. We explictly
+%D call this pagenumber a real one, because it is independant
+%D of the page numbering scheme used in the document.
+%D
+%D One of the reasons for \CONTEXT\ being the first \TEX\ base
+%D macropackage to support sophisticated interactive \PDF\
+%D files, lays in the mere fact that real page numbers are
+%D available in most two pass data, like references, list data
+%D and index entries.
+%D
+%D We will speak of \type{thisis...} when we are marking a
+%D location, and \type{goto...} when we point to such a
+%D location. The latter one can be seen as a hyperlink to the
+%D former one. In the next macros one we use constructs like:
+%D
+%D \starttypen
+%D \dostart...
+%D \dostop...
+%D \stoptypen
+%D
+%D Such macros are used to invoke the relevant specials from
+%D the special driver modules (see \type{spec-ini}). The flag
+%D \type{\iflocation} signals if we're in interactive mode.
+
+\def\thisisdestination#1% destination
+ {\iflocation
+ \ifusepagedestinations \else
+ \dostartthisislocation{#1}%
+ \dostopthisislocation
+ \fi
+ \fi}
+
+\def\thisisrealpage#1% pagenumber
+ {\iflocation
+ \dostartthisisrealpage{#1}%
+ \dostopthisisrealpage
+ \fi}
+
+%D The previous tho macros were easy ones, opposite to their
+%D counterparts. A common component in these is:
+%D
+%D \starttypen
+%D \dostartgoto
+%D \data {..}
+%D \start {..}
+%D \stop {..}
+%D \dostopgoto
+%D \stoptypen
+%D
+%D Here data can be whatever needs highlighting, e.g. {\em
+%D figure 2.4}, and the start and stop entries handle the
+%D specials. The two \DIMENSIONS\ \type{\buttonwidth} and
+%D \type{\buttonheight} have to be set when handling the
+%D data~(\type{#2}).
+
+\ifx\buttonheight\undefined \newdimen\buttonheight \fi
+\ifx\buttonwidth \undefined \newdimen\buttonwidth \fi
+
+\def\gotodestination#1#2#3#4#5% url file destination page data
+ {\iflocation
+ \ifusepagedestinations
+ \gotorealpage{#1}{#2}{#4}{#5}%
+ \else
+ \dostartgoto
+ \data
+ {#5}%
+ \start
+ \dostartgotolocation
+ {\number\buttonwidth}{\number\buttonheight}
+ {#1}{#2}{#3}{#4}%
+ \stop
+ \dostopgotolocation
+ \dostopgoto
+ \fi
+ \else
+ {#5}%
+ \fi}
+
+\def\gotorealpage#1#2#3#4% url file page data
+ {\iflocation
+ \dostartgoto
+ \data
+ {#4}%
+ \start
+ \dostartgotorealpage
+ {\number\buttonwidth}{\number\buttonheight}
+ {#1}{#2}{#3}%
+ \stop
+ \dostopgotorealpage
+ \dostopgoto
+ \else
+ {#4}%
+ \fi}
+
+%D Internal references can best be set using the next few
+%D macros. Setting such references to unique values is
+%D completely up to the macros that call them.
+%D
+%D \starttypen
+%D \thisissomeinternal{tag}{identifier}
+%D \gotosomeinternal {tag}{identifier}{pagenumber}{text}
+%D \stoptypen
+
+\def\thisissomeinternal#1#2% tag reference
+ {\doifsomething{#2}{\thisisdestination{#1:#2}}}
+
+\def\gotosomeinternal#1#2#3#4%
+ {\gotodestination{}{}{#1:#2}{#3}{#4}}
+
+%D An automatic mechanism is provided too:
+%D
+%D \starttypen
+%D \thisisnextinternal{tag}
+%D \gotonextinternal {tag}{number}{pagenumber}{text}
+%D \stoptypen
+%D
+%D The first macro increments a counter. The value of this
+%D counter is available in the macro \type{\nextinternalreference}
+%D and should be saved somewhere (for instance in a file) for
+%D future reference. The second argument of
+%D \type {\gotonextinternal} takes such a saved number. One can
+%D turn on tracing these references, in which case the
+%D references are a bit more verbose.
+
+\newcount\locationcount
+
+\newif\iftraceinternalreferences
+
+\def\nextinternalreference%
+ {\the\locationcount}
+
+\def\thisisnextinternal#1%
+ {\global\advance\locationcount by 1
+ \thisisdestination{\s!aut\iftraceinternalreferences:#1\fi:\nextinternalreference}}
+
+\def\gotonextinternal#1#2#3#4%
+ {\gotodestination{}{}{\s!aut\iftraceinternalreferences:#1\fi:#2}{#3}{#4}}
+
+%D We already went through a lot of problems to sort out what
+%D kind of reference we're dealing with. Sorting out the user
+%D supplied cross references (show/goto this or that) as well
+%D as user supplied system references (invoke this or that) is
+%D already taken care of in the test routine, but we still have
+%D to direct the request to the right routine.
+
+\def\gotolocation#1#2%
+ {\ifx\currentreferencespecial\empty
+ \ifx\currentouterreference\empty
+ \ifnum\currentreferencetype<2
+ \gotoinnerlocation{#1}{#2}%
+ \else
+ \gotosystemlocation{#1}{#2}%
+ \fi
+ \else
+ \gotoouterlocation{#1}{#2}%
+ \fi
+ \else
+ \gotospeciallocation{#1}{#2}%
+ \fi}
+
+%D An inner reference refers to some place in the document
+%D itself.
+
+\def\gotoinnerlocation#1#2%
+ {\gotodestination
+ {}{}
+ {\referenceprefix#1}{\currentrealreference}
+ {#2}}
+
+%D The outer location refers to another document, specified as
+%D file or \URL.
+
+\def\gotoouterlocation#1#2% % page checken!
+ {\bgroup
+ \let\referenceprefix=\empty
+ \setouterlocation{\currentouterreference}%
+ \ifx\currentinnerreference\empty
+ \gotorealpage
+ {\otherURL}{\otherfile}{1}
+ {#2}%
+ \else
+ \gotodestination
+ {\otherURL}{\otherfile}{\currentinnerreference}{\currentrealreference}
+ {#2}%
+ \fi
+ \egroup}
+
+%D Special locations are those that are accessed by saying
+%D things like:
+%D
+%D \starttypen
+%D \goto{calculate total}[JS(summarize{10,23,56}]
+%D \stoptypen
+%D
+%D After several intermediate steps this finally arrives at
+%D the next macro and expands into (simplified):
+%D
+%D \starttypen
+%D \gotoJSlocation{total{summarize{10,23,56}}}{calculate total}
+%D \stoptypen
+%D
+%D The first argument is the full reference, the second one
+%D is the text, in some kind of manipulated form. In practice
+%D we split references, so we get:
+%D
+%D \starttypen
+%D \gotoJSlocation{summarize{10,23,56}}{calculate}
+%D \gotoJSlocation{summarize{10,23,56}}{total}
+%D \stoptypen
+%D
+%D where \type{calculate} and \type{total} are colored, boxed
+%D or whatever \type{\goto} is told to do.
+%D
+%D The macro \type{\gotoJSlocation} can use \type
+%D {\currentreferenceoperation} (in our example
+%D \type{summarize}) and \type{\currentreference} (here
+%D being \type {10,23,56}) to perform its task.
+
+\def\gotospeciallocation%
+ {\executeifdefined
+ {goto\currentreferencespecial location}\gobbleoneargument}
+
+%D Such special macros can be defined by:
+
+\def\definespeciallocation#1%
+ {\setvalue{goto#1location}}
+
+%D The associated test is to be defined by:
+
+\def\definespecialtest#1%
+ {\setvalue{\s!do\v!test#1}}
+
+%D This \type{\def} alike macro is to be used as:
+%D
+%D \starttypen
+%D \definespeciallocation{JS}#1#2{... #1 ... #2 ...}
+%D \stoptypen
+%D
+%D In module \type {core-jav} one can see that \type
+%D {\gotoJSlocation} looks much like the previous goto
+%D definitions.
+
+%D A system location is not always a location, but for the
+%D consistency we also consider actions as such.
+
+\def\gotosystemlocation%
+ {\getvalue{\r!syst\the\currentreferencetype}}
+
+\def\definesystemreferencehandler#1#2%
+ {\setgvalue{\r!syst\the#1}{#2}}
+
+%D In this module we define three system references: one for
+%D handling navigational, viewer specific, commands, another
+%D for jumping to special pages, like the first or last one,
+%D and a third reference for linking tree like lists, like
+%D tables of contents. The latter two adapt themselves to the
+%D current state.
+
+\definesystemreferencehandler \rt!exec \handleexecreference
+\definesystemreferencehandler \rt!page \handlepagereference
+\definesystemreferencehandler \rt!list \handlelistreference
+
+\def\handleexecreference#1%
+ {\executecommand{\currentdatareference}}
+
+\def\handlepagereference#1%
+ {\gotorealpage{}{}{\currentdatareference}}
+
+\def\handlelistreference#1%
+ {\gotodestination{}{}{\currentdatareference}{\getvalue{\currentdatareference}}}
+
+%D (in dutch, egnlish, german of whateverinterface language)
+%D are translated into a bit shorter reference (\type{close})
+%D and passed to the special driver (using \type
+%D {\executecommand}).
+
+\setglobalsystemreference \rt!exec \v!CloseDocument {close}
+\setglobalsystemreference \rt!exec \v!ExitViewer {exit}
+\setglobalsystemreference \rt!exec \v!FirstPage {first}
+\setglobalsystemreference \rt!exec \v!LastPage {last}
+\setglobalsystemreference \rt!exec \v!NextJump {forward}
+\setglobalsystemreference \rt!exec \v!NextPage {next}
+\setglobalsystemreference \rt!exec \v!PauseMovie {pause}
+\setglobalsystemreference \rt!exec \v!PreviousJump {backward}
+\setglobalsystemreference \rt!exec \v!PreviousPage {previous}
+\setglobalsystemreference \rt!exec \v!PrintDocument {print}
+\setglobalsystemreference \rt!exec \v!ResetForm {reset}
+\setglobalsystemreference \rt!exec \v!ResumeMovie {resume}
+\setglobalsystemreference \rt!exec \v!SaveDocument {save}
+\setglobalsystemreference \rt!exec \v!SearchAgain {searchagain}
+\setglobalsystemreference \rt!exec \v!SearchDocument {search}
+\setglobalsystemreference \rt!exec \v!StartMovie {start}
+\setglobalsystemreference \rt!exec \v!StopMovie {stop}
+\setglobalsystemreference \rt!exec \v!SubmitForm {submit}
+\setglobalsystemreference \rt!exec \v!SwapViewer {swap}
+\setglobalsystemreference \rt!exec \v!ViewerHelp {help}
+
+%D Executing the command looks alike the previous goto macros.
+
+\def\executecommand#1#2%
+ {\iflocation
+ \dostartgoto
+ \data
+ {#2}%
+ \start
+ \dostartexecutecommand
+ {\number\buttonwidth}{\number\buttonheight}
+ {#1}{}%
+ \stop
+ \dostopexecutecommand
+ \dostopgoto
+ \else
+ {#2}%
+ \fi}
+
+%D We could have done without the short tags and thereby saving
+%D some tokens, but the current approach leaves room for future
+%D extensions.
+
+%D It is possible to disable the writing of references to the
+%D utility file by setting:
+
+\newif\ifreferencing \referencingtrue
+
+%D One can also activate an automatic prefix mechanism. By
+%D setting the \type{\prefix} variable to \type{+}, the prefix
+%D is incremented, when set to \type{-} or empty, the prefix is
+%D reset. Other values become the prefix.
+
+\newcount\prefixcounter
+
+%D These settings are accomplished by:
+%D
+%D \showsetup{\y!setupreferencing}
+%D
+%D In interactive documents verbose references don't always
+%D make sense (what is a page number in an unnumbered
+%D document). By setting the \type{interaction} variable, one
+%D can influences the way interactive references are set.
+
+\def\setupreferencing%
+ {\dosingleargument\dosetupreferencing}
+
+\def\dosetupreferencing[#1]%
+ {\getparameters
+ [\??rf]
+ [\c!prefix=\s!unknown,#1]%
+ \processaction
+ [\@@rfstatus]
+ [ \v!stop=>\referencingfalse,
+ \v!start=>\referencingtrue]%
+ \processaction
+ [\@@rfinteractie]
+ [ \v!alles=>\let\dowantedreference=\docompletereference,
+ \v!label=>\let\dowantedreference=\dolabelonlyreference,
+ \v!tekst=>\let\dowantedreference=\dotextonlyreference,
+ \v!symbool=>\let\dowantedreference=\dosymbolreference]%
+ \ifx\@@rfprefix\s!unknown
+ % retain the current value
+ \else\ifx\@@rfprefix\empty
+ \let\referenceprefix=\empty
+ \else\ifx\@@rfprefix\incrementreferenceprefix
+ \advance\prefixcounter by 1
+ \edef\referenceprefix{\the\prefixcounter:}%
+ \else\ifx\@@rfprefix\decrementreferenceprefix
+ \let\referenceprefix=\empty
+ \else
+ \edef\referenceprefix{\@@rfprefix:}%
+ \fi\fi\fi\fi}
+
+\def\incrementreferenceprefix{+}
+\def\decrementreferenceprefix{-}
+
+%D We can typeset a reference using \type{\in} and \type{\at}
+%D and goto specific locations using \type{\goto}. The last one
+%D does not make that much sense in a paper document. To
+%D complicate things, \PLAIN\ \TEX\ also implements an \type
+%D {\in} but fortunately that one only makes sense in math
+%D mode.
+
+%D --- VANAF HIER NOG VERENGELSEN ---
+
+\let\donormalin=\in
+
+\def\in%
+ {\ifmmode
+ \expandafter\donormalin
+ \else
+ \expandafter\doinatreference\expandafter\currenttextreference
+ \fi}
+
+\def\op%
+ {\doinatreference\currentpagereference}
+
+%D Typesetting the reference is a bit more complicated than one
+%D would at first sight expect. This is due to the fact that we
+%D distinguish three (five) alternative calls:
+%D
+%D \plaatsfiguur
+%D [hier][three calls]
+%D {Three alternatives reference calls.}
+%D \startcombinatie[1*3]
+%D {\framed{\type{ \in }}} {a}
+%D {\framed{\type{ \at }}} {b}
+%D {\framed{\type{\goto}}} {c}
+%D \stopcombinatie
+%D
+%D \startbuffer
+%D \in figure[fig:three calls]
+%D \in{figure}[fig:three calls]
+%D \in figure a[fig:three calls]
+%D \in{figure}{a}[fig:three calls]
+%D figure~\in[fig:three calls]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This turns up as:
+%D
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D
+%D The dual \type{{}} results in a split reference. In a
+%D document meant for paper, one is tempted to use the last
+%D (most straightforward) alternative. When a document is also
+%D meant voor electronic distribution, the former alternatives
+%D have preference, because everything between the \type{\in}
+%D and~\type{[} becomes active (and when asked for, typeset
+%D in a different color and typeface).
+
+\def\doinatreference#1%
+ {\doifnextcharelse{[}
+ {\dodoinatreference{#1}{}}
+ {\dodoinatreference{#1}}}
+
+\def\dodoinatreference#1%
+ {\def\dododoinatreference{\dodododoinatreference{#1}}%
+ \futurelet\next\dododoinatreference}
+
+\def\dodododoinatreference#1#2#3[#4]%
+ {\ifx\next\bgroup
+ \dododododoinatreference{#1#3}{#2}[#4]%
+ \else
+ \dododododoinatreference{#1}{#2#3}[#4]%
+ \fi}
+
+%D We arrived at the last step. Before we do the typesetting,
+%D we forget all previous (paragraph bound) settings and make
+%D sure that we remain in horizontal mode. Next we choose
+%D among the several representations.
+
+\def\dododododoinatreference#1#2[#3]%
+ {\bgroup
+ \forgetall
+ \leaveoutervmode
+ \doifreferencefoundelse{#3}
+ {\doifelsenothing{#1}
+ {\dosymbolreference{#1}{#2}[#3]}
+ {\dowantedreference{#1}{#2}[#3]}}
+ {\dounknownreference{#1}{#2}[#3]}%
+ \referentieinfo{<}{#3}%
+ \egroup}
+
+%D The previously discussed setup macro lets us specify the
+%D representation of references. A symbol reference does not
+%D show the specific data, like the number of a figure, but
+%D shows one of: \hbox {$^\goforwardcharacter$
+%D $^\gobackwardcharacter$ $^\gonowherecharacter$}, depending
+%D on the direction to go.
+
+\def\dosymbolreference#1#2[#3]%
+ {\bgroup
+ \ifhmode\unskip\fi
+ \ifx\currentreferencespecial\empty
+ \ifx\currentouterreference\empty
+ \ifnum0\currentrealreference=0
+ \ifhmode\strut$^\gonowherecharacter$\fi
+ \else\ifnum0\currentrealreference>\realpageno
+ \dodosymbolreference{#2}{$^\goforwardcharacter$}%
+ \else\ifnum0\currentrealreference<\realpageno
+ \dodosymbolreference{#2}{$^\gobackwardcharacter$}%
+ \else
+ \ifhmode\strut$^\gonowherecharacter$\fi
+ \fi\fi\fi
+ \else
+ \gotoouterlocation{#3}{\showlocation{$^\gotosomewherecharacter$}}%
+ \fi
+ \else
+ \gotospeciallocation{#3}{\showlocation{$^\gotosomewherecharacter$}}%
+ \fi
+ \egroup}
+
+\def\dodosymbolreference#1#2%
+ {#1\hbox{\gotorealpage{}{}{\currentrealreference}
+ {\dolocationattributes{\??ia}{#2}}}}
+
+%D The other alternatives just conform their names: only the
+%D label, only the text, or the label and the text.
+
+\def\dounknownreference#1#2[#3]%
+ {\unknownreference{#3}\dotextprefix{#2}\dummyreference}%
+
+\def\docompletereference#1#2[#3]%
+ {\doifsomespaceelse{#2}
+ {\doifsomething{#2}{\donaarspace{#2}[#3]~}\donaarfixed{#1}[#3]}
+ {\donaarfixed{\dotextprefix{#2}#1}[#3]}}
+
+\def\dolabelonlyreference#1#2[#3]%
+ {\doifsomespaceelse{#2}
+ {\doifsomething{#2}{\donaarspace{#2}[#3]}}
+ {\donaarfixed{\dotextprefix{#2}}[#3]}}
+
+\def\dotextonlyreference#1#2[#3]%
+ {\dotextprefix{#2}\donaarfixed{#1}[#3]}
+
+\let\dowantedreference=\docompletereference
+
+%D --- OF MEER, OF ANDERS: ---
+
+\def\dotextprefix#1%
+ {\ConvertToConstant\doifnot{#1}{}{#1~}}
+
+%D In interactive documents going to a specific location is not
+%D bound to cross references. The \type{\goto} commands can be
+%D used to let users access another part of the document. In
+%D this respect, interactive tables of contents and registers
+%D can be considered goto's. Because in fact a \type{\goto} is
+%D just a reference without reference specific data, the
+%D previous macros are implemented using the goto
+%D functionality.
+%D
+%D \showsetup{\y!naar}
+%D
+%D One important chaacteristic is that the first argument of
+%D \type{\goto} (and therefore \type{\at} and \type{\in} is
+%D split at spaces. This means that, although hyphenation is
+%D prevented, long references can cross line endings.
+
+\unexpanded\def\naar#1[#2]%
+ {\leaveoutervmode
+ \doifreferencefoundelse{#2}
+ {\doifelsenothing{#1}
+ {\dosymbolreference{}{}[#2]}
+ {\donaarspace{#1}[#2]}}
+ {\unknownreference{#2}#1}%
+ \referentieinfo{<}{#2}}
+
+\def\donaarspace#1[#2]%
+ {{\iflocation
+ \def\processisolatedword##1%
+ {\hbox{\gotolocation{#2}{##1\presetgoto}}}%
+ \doattributes{\??ia}
+ {\processisolatedwords{#1}\processisolatedword}%
+ \else
+ #1\relax % \relax prevents #1's next macros from gobbling \fi
+ \fi}}
+
+\def\donaarfixed#1[#2]%
+ {{\iflocation
+ \hbox{\gotolocation{#2}{\doattributes{\??ia}{#1\presetgoto}}}%
+ \else
+ #1%
+ \fi}}
+
+%D In case the auto split feature is not needed or even not
+%D even wanted, \type{\gotobox} can be used.
+
+%D --- NOG IN HANDLEIDING ---
+
+\unexpanded\def\naarbox#1[#2]%
+ {\bgroup
+ \locationstrutfalse
+ \leaveoutervmode
+ \doifreferencefoundelse{#2}
+ {\donaarfixed{#1}[#2]}
+ {\unknownreference{#2}#1}%
+ \referentieinfo{<}{#2}%
+ \egroup}
+
+%D An reference to another document can be specified as a file
+%D or as an \URL. Both are handled by the same mechanism and
+%D can be issued by saying something like:
+%D
+%D \starttypen
+%D \goto[dictionary::the letter a]
+%D \stoptypen
+%D
+%D The macros that are responsible for handling these
+%D references, use the next six variables:
+
+\let\otherlabel = \empty
+\let\fileprefix = \empty
+\def\otherfile {\jobname}
+\let\otherURL = \empty
+\let\otherprefix = \empty
+\let\dowithdocdes = \empty
+
+%D One can imagine that many references to such a dictionary
+%D are made, so in most cases such a document reference in an
+%D indirect one.
+%D
+%D \showsetup{\y!gebruikexterndocument}
+%D
+%D For example:
+%D
+%D \starttypen
+%D \useexternaldocument
+%D [dictionary][engldict]
+%D [The Famous English Dictionary]
+%D \stoptypen
+%D
+%D The next macro implements these relations, and also take
+%D care of loading the document specific references.
+
+\def\gebruikexterndocument%
+ {\dotripleargument\dogebruikexterndocument}
+
+\def\dogebruikexterndocument[#1][#2][#3]%
+ {\bgroup
+ \doifelsenothing{#1}
+ {\dogebruikexterndocument[#2][#2][#3]}
+ {\doifelsenothing{#3}
+ {\dogebruikexterndocument[#1][#2][#2]}
+ {\doifsomething{#2}
+ {\setgvalue{\v!file:::#1}{\doexternaldocument{}{#2}{#3}}%
+ \doifparentfileelse{#2}
+ {\showmessage{\m!references}{21}{#2}}
+ {\bgroup % prevents wrong loading of \jobname
+ \def\fileprefix{#1::}%
+ \let\setglobalcrossreference=\setoutercrossreference
+ \usereferences[#2]%
+ \egroup % when called nested
+ \showmessage{\m!references}{21}{#2}}}}}%
+ \egroup}
+
+%D The \URL\ alternative takes four arguments:
+%D
+%D \showsetup{\y!gebruikURL}
+%D
+%D like:
+%D
+%D \starttypen
+%D \useURL
+%D [dictionary][http://www.publisher.com/public][engldict]
+%D [The Famous English Dictionary]
+%D \stoptypen
+%D
+%D This time we don't load the references when no file is
+%D specified. This is logical when one keeps in mind that a
+%D valid \URL\ can also be a mail address.
+
+\def\gebruikURL%
+ {\doquadrupleargument\dogebruikURL}
+
+\def\dogebruikURL[#1][#2][#3][#4]%
+ {\doifelsenothing{#4}
+ {\dogebruikexterndocument[#1][#2][#3][#3]}
+ {\doifsomething{#1}
+ {\setgvalue{\v!file:::#1}{\doexternaldocument{#2}{#3}{#4}}}}}
+
+%D Many macro definitions ago we called for the auxiliary macro
+%D \type{\setouterlocation} and now is the time to define this
+%D one.
+
+\def\setouterlocation#1%
+ {\doifdefinedelse{\v!file:::#1}
+ {\def\doexternaldocument##1##2##3%
+ {\edef\otherURL{##1}%
+ \edef\otherfile{##2}}%
+ \getvalue{\v!file:::#1}}
+ {\let\otherURL=\empty
+ \edef\otherfile{#1}}%
+ \doifparentfileelse{\otherfile}
+ {\let\otherURL=\empty
+ \let\otherfile=\empty
+ \global\let\otherlabel=\empty
+ \let\otherprefix=\empty}
+ {\xdef\otherlabel{#1}%
+ \edef\otherprefix{#1::}}}
+
+%D When defining the external source of information, one can
+%D also specify a suitable name (the last argument). This name
+%D can be called upon with:
+%D
+%D \showsetup{\y!uit}
+%D
+%D As can be expected, this macro used \type{\goto} to
+%D perform its task.
+
+\definecomplexorsimple\uit
+
+\def\simpleuit%
+ {\bgroup
+ \doifdefinedelse{\v!file:::\otherlabel}
+ {\def\doexternaldocument##1##2##3{##3}%
+ \getvalue{\v!file:::\otherlabel}}
+ {\tttf[\otherlabel]}%
+ \egroup}
+
+\def\complexuit[#1]%
+ {\doifinstringelse{::}{#1}
+ {\docomplexuit[#1]}
+ {\docomplexuit[#1::]}}
+
+\def\docomplexuit[#1::#2]%
+ {\bgroup
+ \doifdefinedelse{\v!file:::#1}
+ {\def\doexternaldocument##1##2##3%
+ {\naar{##3}[#1::#2]}%
+ \getvalue{\v!file:::#1}}
+ {\tttf[#1]}%
+ \egroup}
+
+%D We also support:
+%D
+%D \starttypen
+%D \goto{some text}[file(identifier{location}]
+%D \stoptypen
+%D
+%D which is completely equivalent with
+%D
+%D \starttypen
+%D \goto{some text}[identifier::location]
+%D \stoptypen
+%D
+%D The fastest implementation would be:
+
+\definespecialtest\v!file {\handlespecialFILEandURL}
+\definespecialtest\v!URL {\handlespecialFILEandURL}
+
+\definespeciallocation\v!file {\handlespecialallocationFILEandURL}
+\definespeciallocation\v!URL {\handlespecialallocationFILEandURL}
+
+\def\handlespecialFILEandURL%
+ {\doifreferencefoundelse
+ {\currentreferenceoperation::\currentreferencearguments}}
+
+\def\handlespecialallocationFILEandURL%
+ {\let\currentouterreference=\currentreferenceoperation
+ \let\currentinnerreference=\currentreferencearguments
+ \let\currentreferenceoperation=\empty
+ \let\currentreferencearguments=\empty
+ \gotoouterlocation}
+
+%D Now we have file references as special ones, it's rather
+%D logical to have the viewer specific ones available in a dual
+%D way too. At first glance we could do with:
+%D
+%D \starttypen
+%D \definespeciallocation\v!actie
+%D {\getreferenceelements\currentreferenceoperation
+%D \handleexecreference}
+%D \stoptypen
+%D
+%D An better alternative, slower but error aware, is
+
+\definespecialtest\v!actie%
+ {\doifreferencefoundelse\currentreferenceoperation}
+
+\definespeciallocation\v!actie
+ {\handleexecreference}
+
+%D So now we can say:
+%D
+%D \starttypen
+%D \goto{some action}[PreviousJump]
+%D \stoptypen
+%D
+%D as well as:
+%D
+%D \starttypen
+%D \goto{some text}[action(PreviousJump]
+%D \stoptypen
+
+%D A special case of references are those to programs. These,
+%D very system dependant references are implemented by abusing
+%D some of the previous macros.
+%D
+%D \showsetup{\y!stelprogrammasin}
+%D \showsetup{\y!definieerprogramma}
+%D \showsetup{\y!programma}
+%D
+%D The latter gives access to the description of the program,
+%D being the last argument to the definition command.
+
+\def\stelprogrammasin%
+ {\dodoubleargument\getparameters[\??pr]}
+
+\def\dodefinieerprogramma[#1][#2][#3]%
+ {\setgvalue{\v!programma:::#1}{\doprogramma{#2}{#3}}}
+
+\def\definieerprogramma%
+ {\dotripleargument\dodefinieerprogramma}
+
+\def\programma#1[#2]%
+ {\bgroup
+ \doifdefinedelse{\v!programma:::#2}
+ {\def\doprogramma##1##2%
+ {\doifelsenothing{#1}
+ {\naar{##2}[\v!programma(#2)]}
+ {\naar{#1}[\v!programma(#2)]}}%
+ \getvalue{\v!programma:::#2}}
+ {\tttf[#2]}%
+ \egroup}
+
+\definespeciallocation\v!programma#1#2%
+ {\bgroup
+ \iflocation
+ \doifdefinedelse{\v!programma:::\currentreferenceoperation}
+ {\def\doprogramma##1##2{\def\@@programfile{##1}}%
+ \getvalue{\v!programma:::\currentreferenceoperation}}
+ {\let\@@programfile=\currentreferenceoperation}%
+ \convertcommand\@@programfile\to\ascii
+ \dostartgoto
+ \data
+ {#2}%
+ \start
+ \dostartrunprogram
+ {\number\buttonwidth}{\number\buttonheight}
+ {\@@prgebied\ascii\space\currentreferencearguments}%
+ \stop
+ \dostoprunprogram
+ \dostopgoto
+ \else
+ {#2}%
+ \fi
+ \egroup}
+
+%D As we can see, we directly use the special reference
+%D mechanism, which means that
+%D
+%D \starttypen
+%D \goto{some text}[program(name{args})]
+%D \stoptypen
+%D
+%D is valid.
+
+%D The next macro provides access to the actual pagenumbers.
+%D When documenting and sanitizing the original reference
+%D macros, I decided to keep the present meaning as well as to
+%D make this meaning available as a special reference method.
+%D So now one can use:
+%D
+%D \starttypen
+%D \gotopage{some text}[location]
+%D \gotopage{some text}[number]
+%D \gotopage{some text}[file::number]
+%D \stoptypen
+%D
+%D as well as:
+%D
+%D \starttypen
+%D \goto{some text}[page(location)]
+%D \goto{some text}[page(number)]
+%D \goto{some text}[file::page(number)]
+%D \stoptypen
+%D
+%D Here location is a keyword like \type{nextpage}.
+%D
+% \showsetup{\y!ganaarpagina}
+
+\def\dodefinieerpagina[#1][#2]%
+ {\setvalue{\v!pagina:::#1}{#2}}
+
+\def\definieerpagina%
+ {\dodoubleargument\dodefinieerpagina}
+
+\definieerpagina [\v!eerste\v!pagina] [\firstpage]
+\definieerpagina [\v!vorige\v!pagina] [\prevpage]
+\definieerpagina [\v!volgende\v!pagina] [\nextpage]
+\definieerpagina [\v!laatste\v!pagina] [\lastpage]
+\definieerpagina [\v!eerste\v!sub\v!pagina] [\firstsubpage]
+\definieerpagina [\v!vorige\v!sub\v!pagina] [\prevsubpage]
+\definieerpagina [\v!volgende\v!sub\v!pagina] [\nextsubpage]
+\definieerpagina [\v!laatste\v!sub\v!pagina] [\lastsubpage]
+\definieerpagina [\v!eerste] [\firstpage]
+\definieerpagina [\v!vorige] [\prevpage]
+\definieerpagina [\v!volgende] [\nextpage]
+\definieerpagina [\v!laatste] [\lastpage]
+\definieerpagina [\v!eerste\v!sub] [\firstsubpage]
+\definieerpagina [\v!vorige\v!sub] [\prevsubpage]
+\definieerpagina [\v!volgende\v!sub] [\nextsubpage]
+\definieerpagina [\v!laatste\v!sub] [\lastsubpage]
+
+%D Because we combine both methods, we have to take care of
+%D the \type{file::page(n)} as well as \type{page(file::n)}.
+
+\definespeciallocation\v!pagina#1#2%
+ {\iflocation
+ \ifx\currentouterreference\empty
+ \splitoffreference\currentreferenceoperation
+ \else
+ \let\currentinnerreference=\currentreferenceoperation
+ \fi
+ \ifx\currentouterreference\empty
+ \doifnonzeropositiveelse{\currentinnerreference}
+ {}
+ {\edef\currentinnerreference{1}}%
+ \gotorealpage{}{}{\currentinnerreference}{#2}%
+ \else
+ \setouterlocation\currentouterreference
+ \doifnonzeropositiveelse{\currentinnerreference}
+ {}
+ {\doifdefinedelse{\v!pagina:::\currentinnerreference}
+ {\edef\currentinnerreference{\getvalue{\v!pagina:::\currentinnerreference}}}
+ {\edef\currentinnerreference{1}}}%
+ \gotorealpage{\otherURL}{\otherfile}{\currentinnerreference}{#2}%
+ \fi
+ \else
+ {#2}%
+ \fi}
+
+\def\naarpagina#1[#2]%
+ {\naar{#1}[\v!pagina(#2)]}
+
+\let\ganaarpagina=\naarpagina
+
+%D A still very rudimentary|/|experimental forward|/|backward
+%D reference mechanism is provided by the macro \type{\atpage}:
+%D
+%D \starttypen
+%D ... \somewhere{backward text}{forward text}[someref] ...
+%D ... \oppagina[someref] ...
+%D \stoptypen
+%D
+%D In future versions there will be more sophisticated
+
+%D !!!!! \ergens documenteren in handleiding !!!!!
+
+%D support, also suitable for refreences to floating bodies.
+
+\unexpanded\def\ergens#1#2[#3]%
+ {\leaveoutervmode
+ \doifreferencefoundelse{#3}
+ {\ifforwardreference
+ \doifelsenothing{#1}
+ {\dosymbolreference{}{}[#3]}
+ {\donaarspace{#1}[#3]}%
+ \else
+ \doifelsenothing{#2}
+ {\dosymbolreference{}{}[#3]}
+ {\donaarspace{#2}[#3]}%
+ \fi}
+ {\unknownreference{#3}#1/#2}%
+ \referentieinfo{<}{#3}}
+
+\unexpanded\def\oppagina[#1]%
+ {\leaveoutervmode
+ \doifreferencefoundelse{#1}
+ {\doifelse{\realfolio}{\currentrealreference}
+ {\ifforwardreference
+ \donaarfixed{\labeltext{\v!hier\v!boven}}[#1]%
+ \else
+ \donaarfixed{\labeltext{\v!hier\v!onder}}[#1]%
+ \fi}
+ {\donaarfixed{\labeltext{\v!op\v!pagina}~\currentpagereference}[#1]}}
+ {\unknownreference{#1}%
+ \v!pagina~\dummyreference}%
+ \referentieinfo{<}{#1}}
+
+%D --- STRANGE HERE, BETTER IN CORE-NAV ---
+
+\def\checkcontrastreference#1%
+ {\ifnum\currentreferencetype=\rt!page\ifnum\currentdatareference=\realpageno
+ \doifdefined{#1\c!contrastkleur}
+ {\setevalue{#1\c!kleur}{\getvalue{#1\c!contrastkleur}}}%
+ \fi\fi}
+
+%D Buttons are just what their names says: things that can be
+%D clicked (pushed) on. They are similar to \type{\goto},
+%D except that the text argument is not interpreted.
+%D Furthermore one can apply anything to them that can be done
+%D with \type{\framed}.
+%D
+%D \startbuffer
+%D \button[width=3cm,height=1.5cm]{Exit}[ExitViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \haalbuffer
+%D
+%D This command is formally specified as:
+%D
+%D \showsetup{\y!button}
+%D
+%D The characteristics can be set with:
+%D
+%D \showsetup{\y!stelbuttonsin}
+
+\def\dostelbuttonsin[#1]%
+ {\getparameters[\??bt][#1]%
+ \dododostelinteractiemenuin{\??bt\c!onbekendeverwijzing}%
+ \dododostelinteractiemenuin{\??bt\c!zelfdepagina}}
+
+\def\stelbuttonsin%
+ {\dosingleargument\dostelbuttonsin}
+
+\definecomplexorsimpleempty\button
+
+\def\complexbutton%
+ {\docomplexbutton\??bt}
+
+\presetlocalframed[\??bt]
+
+\def\docomplexbutton#1[#2]#3[#4]%
+ {\bgroup
+ \resetgoto
+ \ConvertConstantAfter\doifelse{#3}{\v!geen}
+ {\!!doneafalse}
+ {\!!doneatrue}%
+ \doifreferencefoundelse{#4}
+ {\setbox0=\if!!donea\hbox\else\hphantom\fi
+ {\localframed[#1][#2]
+ {\checkcontrastreference{#1}%
+ \dolocationattributes{#1}{\ignorespaces#3}}}%
+ \startinteractie
+ \hbox{\gotolocation{#4}{\copy0}}%
+ \stopinteractie}
+ {\unknownreference{#4}%
+ \if!!donea\hbox\else\hphantom\fi
+ {\localframed[#1][#2]
+ {\ignorespaces#3}}}%
+ \egroup}
+
+%D Interaction buttons, in fact a row of tiny buttons, are
+%D typically only used for navigational purposed. The next
+%D macro builds such a row based on a specification list.
+%D
+%D \startbuffer
+%D \interactiebuttons
+%D [breedte=\hsize][pagina,VorigeSprong,VerlaatViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \haalbuffer
+%D
+%D Apart from individual entries, one can use \type{page} and
+%D \type {subpage} as shortcuts to their four associated buttons.
+%D The symbols are derived from the symbols linked to the
+%D entries.
+
+\def\interactiebuttons%
+ {\dodoubleempty\dointeractiebuttons}
+
+\def\dointeractiebuttons[#1][#2]%
+ {\iflocation
+ \ifsecondargument
+ \bgroup
+ \setbox2=\hbox
+ {\localframed[\??ib][]{\gobackwardcharacter}}%
+ \!!heighta=\ht2
+ \stelinteractiebalkin[#1,\c!strut=\v!nee]%
+ \stelinteractiein[\c!breedte=\!!zeropoint]%
+ \!!widtha=\@@ibbreedte\relax
+ \!!counta=1
+ \processallactionsinset
+ [#2]
+ [ \v!pagina=>\advance\!!counta by 4,
+ \v!sub\v!pagina=>\advance\!!counta by 4,
+ \s!unknown=>\advance\!!counta by 1]%
+ \divide\!!widtha by \!!counta
+ \def\goto##1%
+ {\setnostrut
+ \edef\localreference{##1}%
+ \docomplexbutton\??ib
+ [\c!hoogte=\!!heighta,\c!breedte=\!!widtha]%
+ {\dontleavehmode\symbol[\localreference]}%
+ [\localreference]%
+ \hss}%
+ \hbox to \@@ibbreedte
+ {\processallactionsinset
+ [#2]
+ [ \v!pagina=>\goto{\v!eerste\v!pagina}%
+ \goto{\v!volgende\v!pagina}%
+ \goto{\v!vorige\v!pagina}%
+ \goto{\v!laatste\v!pagina},
+ \v!sub\v!pagina=>\goto{\v!eerste\v!sub\v!pagina}%
+ \goto{\v!volgende\v!sub\v!pagina}%
+ \goto{\v!vorige\v!sub\v!pagina}%
+ \goto{\v!laatste\v!sub\v!pagina},
+ \s!unknown=>\goto\commalistelement]%
+ \unskip}%
+ \egroup
+ \else
+ \interactiebuttons[][#1]%
+ \fi
+ \fi}
+
+%D In the next settings we see some variables that were not
+%D used here and that concern the way the pagenumbers refered
+%D to are typeset.
+
+\setupreferencing
+ [\c!status=\v!start,
+ \v!deel\c!nummer=\v!ja,
+ \v!hoofdstuk\c!nummer=\v!nee,
+ \c!interactie=\v!alles,
+ \c!prefix=]
+
+\protect
+
+\endinput
diff --git a/tex/context/base/core-rul.tex b/tex/context/base/core-rul.tex index a48a0f2de..8fdcd1151 100644 --- a/tex/context/base/core-rul.tex +++ b/tex/context/base/core-rul.tex @@ -1,2326 +1,2329 @@ -%D \module -%D [ file=core-rul, -%D version=1997.09.05, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Ruled Stuff Handling, -%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 Core Macros / Ruled Stuff Handling} - -\unprotect - -%D \macros -%D {linewidth, setuplinewidth} -%D -%D This module deals with rules (lines) in several ways. First -%D we introduce two macros that can be used to set some common -%D characteristics. -%D -%D \showsetup{\y!setuplinewidth} -%D -%D The linewidth is available in \type{\linewidth}. The -%D preset value of .4pt equals the default hard coded \TEX\ -%D rule width. - -\newdimen\linewidth - -\def\dosetuplinewidth[#1]% - {\assigndimension{#1}{\linewidth}{0.2pt}{0.4pt}{0.6pt}} - -\def\setuplinewidth% - {\dosingleargument\dosetuplinewidth} - -% \def\dosetuprules[#1]% -% {\getparameters[\??ln][#1]% -% \setuplinewidth[\@@lndikte]} -% -% \def\setuprules% -% {\dosingleargument\dosetuprules} - -%D \TEX\ lacks support for color and even gray scales. The next -%D macros can provide a sort of poor mans gray scales as well -%D as give access to more suitable methods of rendering. Such a -%D method looks like: -%D -%D \starttypen -%D \def\methodegraybox -%D \width#1\height#2\depth#3\raster#4\corner#5\radius#6\\% -%D { ... } -%D \stoptypen -%D -%D The string \type{graybox} is a common element in the name, -%D so we can have for instance \type {\postscriptgraybox} or -%D \type {\texgraybox}. The first three arguments take a -%D dimension, the fourth one takes a number between~0 and~1, -%D and the last argument specifies a radius of the box when -%D rounded corners are used, so: -%D -%D \startbuffer -%D \periodgraybox -%D \width.5\hsize\height1cm\depth0cm\raster.85\corner\v!nee\radius0pt\\ -%D \stopbuffer -%D -%D \typebuffer -%D -%D becomes: -%D -%D %\startregelcorrectie -%D % \vbox to 1cm{\haalbuffer} -%D %\stopregelcorrectie -%D -%D \startregelcorrectie -%D \unprotect -%D \vbox to 1cm -%D {\getvalue{\v!punt graybox}% -%D \width.5\hsize\height1cm\depth0cm\raster.85\corner\v!nee\radius0pt\\} -%D \protect -%D \stopregelcorrectie -%D -%D There are two predefined methodes, one uses periods and the -%D other uses small rules. The second method is less -%D efficient, but sometimes give better results. The dimensions -%D of the resullting box are set to zero. - -\setvalue{\v!punt graybox}% - {\processraster\symbol\rasterdot} - -\setvalue{\v!lijn graybox}% - {\processraster\symbol\rasterbox} - -\def\rasterdot% - {\rasterfont.} - -\def\rasterbox% - {\hss\vrule\!!width.4pt\!!height.4pt\!!depth\!!zeropoint} - -%D Now of course we need: - -\ifx\rasterfont\undefined \def\rasterfont{\fivepoint} \fi - -%D We implement two pure \TEX\ based generators, that use -%D \type{\leaders} to quickly gerenate the gray pattern. One -%D should beware of \DIMENSION\ conflicts, so we use some -%D registers above~8. These macros are memory hungry and byte -%D spoiling. - -\def\processraster - \symbol#1\width#2\height#3\depth#4\raster#5\corner#6\radius#7\\% - {\bgroup - \forgetall - \mindermeldingen - \dimen10=\!!onepoint - \dimen10=\@@rsfactor\dimen10 - \dimen10=#5\dimen10 - \setbox2=\hbox to #2 - {\cleaders\hbox to 2\dimen10{#1\hss}\hss}% - \dimen12=#3% - \advance\dimen12 by #4% - \setbox0=\vbox to \dimen12 - {\cleaders\vbox to 2\dimen10{\box2\vss}\vss}% - \setbox0=\hbox - {\hskip-.5\dimen10\lower0.5\dimen10\copy0 - \hskip-\wd0\hskip\dimen10\lower1.5\dimen10\box0}% - \box0 - \egroup} - -%D \macros -%D {setupscreens} -%D -%D The previous macro uses a predefined constant -%D \type{\@@rsfactor}. This factor can be set by: -%D -%D \showsetup{\y!setupscreens} - -\def\setupscreens% - {\dodoubleargument\getparameters[\??rs]} - -%D The most appropriate way to call for this feature is -%D using \type{\graybox}, which is defined as: - -\def\graybox{\getvalue{\@@rsmethode graybox}} - -%D This macro takes the five arguments mentioned earlier and -%D obey the user's settings. - -%D We just introduced two pure \TEX\ methods for generating -%D rasters. However, it's far more efficient and comfortable in -%D terms of speed, memory usage and file size, to use a driver -%D supported method. - -\setvalue{\v!extern graybox}\width#1\height#2\depth#3\raster#4\corner#5\radius#6\\% - {\setgraybox\width#1\height#2\depth#3\raster#4\corner#5\radius#6\\} - -%D For compatibility reasons we also define the original one: - -\setvalue{\v!postscript graybox}% - {\getvalue{\v!extern graybox}} - -%D A quite valid way of letting drivers do the job, is giving -%D a solid rule a gray texture. - -\def\setgraybox\width#1\height#2\depth#3\raster#4\corner#5\radius#6\\% - {\startraster[#4]% - \dofilledbox\width#1\height#2\depth#3\corner#5\radius#6\\% - \stopraster} - -%D We don't have to stick to a \TEX\ drawn rule, but -%D also can use rounded or even fancier shapes, as we will -%D see later on. - -\def\dofilledbox\width#1\height#2\depth#3\corner#4\radius#5\\% - {\bgroup - \doifelse{#4}{\v!rond} - {\dimen0=#5\relax % just in case of .x\bodyfontsize - \ifdim\dimen0=\!!zeropoint - \dofilledlinedbox\width#1\height#2\depth#3\\% - \else - \dofilledroundbox\width#1\height#2\depth#3\radius#5\\% - \fi} - {\dofilledlinedbox\width#1\height#2\depth#3\\}% - \egroup} - -\def\dofilledlinedbox\width#1\height#2\depth#3\\% - {\vrule\!!width#1\!!height#2\!!depth#3}% - -\def\dofilledroundbox\width#1\height#2\depth#3\radius#4\\% - {\ovalbox{#1}{#2}{#3}{\linewidth}{#4}{\v!nee}{\v!ja}} - -\def\ovalbox#1#2#3#4#5#6#7% - {\bgroup - \scratchdimen=#1\edef\ovalwid{\number\scratchdimen}% - \scratchdimen=#2\edef\ovalhei{\number\scratchdimen}% - \scratchdimen=#3\edef\ovaldep{\number\scratchdimen}% - \scratchdimen=#4\edef\ovallin{\number\scratchdimen}% - \scratchdimen=#5\edef\ovalrad{\number\scratchdimen}% - \doifelse{#6}{\v!ja} % will be a macro that handles - {\def\ovalstr{1}} % start, stop, ja, nee, aan, uit - {\def\ovalstr{0}}% % and something \doif - \doifelse{#7}{\v!ja} - {\def\ovalfil{1}} - {\def\ovalfil{0}}% - \doovalbox - {\ovalwid}{\ovalhei}{\ovaldep} - {\ovallin}{\ovalrad} - {\ovalstr}{\ovalfil}% - \egroup} - -%D The oval box is drawn using a special macro, depending on -%D the driver in use. - -%D It won't be a surprise that we not only provide gray boxes, -%D but also colored ones. Here it is: - -\def\setcolorbox\width#1\height#2\depth#3\color#4\corner#5\radius#6\\% - {\ifincolor - \doifsomething{#4} - {\startcolor[#4]% - \dofilledbox\width#1\height#2\depth#3\corner#5\radius#6\\% - \stopcolor}% - \else - \dofilledbox\width#1\height#2\depth#3\corner#5\radius#6\\% - \fi} - -\def\colorbox% - {\setcolorbox} - -%D \macros -%D {defineoverlay, -%D overlaywidth, overlayheight, overlaydepth, -%D overlaycolor} -%D -%D Before we define the macro that actually takes card of the -%D backgrounds, we introduce overlays. An overlay is something -%D that contrary to its name lays {\em under} the text. An -%D example of an overlay definition is: -%D -%D \startbuffer[tmp-1] -%D \defineoverlay -%D [fancy] -%D [{\externfiguur -%D [gene-011] -%D [type=eps,methode=mps, -%D breedte=\overlaywidth, -%D hoogte=\overlayheight]}] -%D \stopbuffer -%D -%D \typebuffer[tmp-1] -%D -%D That for instance can be uses in: -%D -%D \startbuffer[tmp-2] -%D \omlijnd[achtergrond=fancy]{How Fancy!} -%D \omlijnd[achtergrond=fancy,kader=uit]{Even More Fancy!} -%D \stopbuffer -%D -%D and looks like: -%D -%D \startregelcorrectie -%D \vbox{\baselineskip24pt\haalbuffer[tmp-1]\haalbuffer[tmp-2]} -%D \stopregelcorrectie -%D -%D The formal definition is: -%D -%D \showsetup{\y!defineoverlay} -%D -%D This macro's definition is a bit obscure, due the many -%D non||used arguments and the two step call that enable the -%D setting of the width, height and depth variables. -%D Multiple backgrounds are possible and are specified as: -%D -%D \starttypen -%D \omlijnd[achtergrond={one,two,three}]{Three backgrounds!} -%D \stoptypen -%D -%D Most drawing packages only know width and height. Therefore -%D the dimensions have a slightly different meaning here: -%D -%D \startopsomming[opelkaar] -%D \som \type{\overlaywidth }: width of the overlay -%D \som \type{\overlayheight}: height plus depth of the overlay -%D \som \type{\overlaydepth }: depth of the overlay -%D \stopopsomming -%D -%D The resulting box is lowered to the right depth. - -\def\defineoverlay% - {\dodoubleargument\dodefineoverlay} - -\def\dodefineoverlay[#1][#2]% - {\def\docommando##1% - {\setvalue{executeoverlay##1}{\executedefinedoverlay##1\\#2\\}}% - \processcommalist[#1]\docommando} - -\long\def\executedefinedoverlay#1\\#2\\#3#4#5#6#7#8#9% - {\bgroup - \scratchdimen=#3% - \edef\overlaywidth {\the\scratchdimen}% - \scratchdimen=#4% - \advance\scratchdimen by #5% - \edef\overlayheight{\the\scratchdimen}% - \scratchdimen=#5% - \edef\overlaydepth {\the\scratchdimen}% - \edef\overlaycolor{#6}% - %\writestatus - % {overlay} - % {#1\space w=\overlaywidth/h+d=\overlayheight/d=\overlaydepth]}% - \setbox0=\hbox{\lower\overlaydepth\hbox{#2}}% - \dimen0=\wd0 \advance\dimen0 by -\overlaywidth - \dimen2=\ht0 \advance\dimen2 by -\overlayheight - \wd0=\overlaywidth - \ht0=\overlayheight - \dp0=\overlaydepth - \setbox0=\hbox{\hskip-.5\dimen0\raise-.5\dimen2\box0}% - \wd0=\overlaywidth - \ht0=\overlayheight - \dp0=\overlaydepth - \box0 - \egroup} - -%D The empty case is: - -\def\executeoverlay#1#2#3#4#5#6#7% - {} - -%D We predefine two already familiar backgrounds: - -\setvalue{executeoverlay\v!raster}#1#2#3#4#5#6#7% - {\graybox\width#1\height#2\depth#3\raster#5\corner#6\radius#7\\} - -\setvalue{executeoverlay\v!kleur}#1#2#3#4#5#6#7% - {\colorbox\width#1\height#2\depth#3\color#4\corner#6\radius#7\\} - -%D After all these preparations, the background macro does no -%D bring to many surprises. One has to keep in mind that this -%D macro starts up a call chain, depending on the background -%D one needs: -%D -%D \startopsomming[opelkaar] -%D \som a raster, color or user defined shape -%D \som square or round corners -%D \som a \TEX\ or driver based method -%D \stopopsomming -%D -%D Here we go: - -\newbox\extraframebox - -\def\dodobackgroundbox#1#2#3#4#5#6% - {\bgroup - \setbox\extraframebox=\hbox - {\executeifdefined{executeoverlay#1}\gobblesevenarguments - {\dimen2}{\dimen4}{\dimen6}{#3}{#4}{#5}{#6}}% - \setbox\extraframebox=\hbox - {\vbox{\moveleft\dimen0\box\extraframebox}}% - \wd\extraframebox=\wd#2% - \ht\extraframebox=\ht#2% - \dp\extraframebox=\dp#2% - \box\extraframebox\hskip-\wd#2% - \egroup} - -\def\dobackgroundbox#1\background#2\color#3\raster#4\offset#5\corner - #6\radius#7\depth#8\\% - {\vbox - {\dimen0=#5\relax - \dimen2=\wd#1\advance\dimen2 by 2\dimen0 - \dimen4=\ht#1\advance\dimen4 by \dimen0 - \dimen6=\dp#1\advance\dimen6 by \dimen0\advance\dimen6 by #8\relax - \def\docommando##1% - {\dodobackgroundbox{##1}{#1}{#3}{#4}{#6}{#7}}% - \hbox - {\expanded{\rawprocesscommalist[#2]\noexpand\docommando}% - \box#1}}} - -%D We can specify overlays as a comma separated list of -%D overlays, a sometimes handy feature. - -%D Besides backgrounds (overlays) we also need some macros to -%D draw outlines (ruled borders). Again we have to deal with -%D square and round corners. The first category can be handled -%D by \TEX\ itself, the latter one depends on the driver. - -\def\dooutlinebox#1\color#2\offset#3\corner#4\radius#5\depth#6\toggle#7\\% - {\vbox % rules on top of box - {\dimen0=#3\relax - \dimen2=\wd#1\advance\dimen2 by 2\dimen0 - \dimen4=\ht#1\advance\dimen4 by \dimen0 - \dimen6=\dp#1\advance\dimen6 by \dimen0\advance\dimen6 by #6\relax - \setbox\extraframebox=\hbox - {\dostrokedbox\width\dimen2\height\dimen4\depth\dimen6% - \corner#4\radius#5\toggle#7\\}% - \setbox\extraframebox=\hbox - {\vbox{\moveleft#3\box\extraframebox}}% - \wd\extraframebox=\wd#1% - \ht\extraframebox=\ht#1% - \dp\extraframebox=\dp#1% - \hbox - {\copy#1\hskip-\wd#1% - \doifelsenothing{#2} % speeds up a little - {\box\extraframebox} - {\color[#2]{\box\extraframebox}}}}} - -\def\dostrokedbox\width#1\height#2\depth#3\corner#4\radius#5\toggle#6\\% - {\bgroup - \doifelse{#4}{\v!rond} - {\dimen0=#5\relax % just in case of .x\bodyfontsize - \ifdim\dimen0=\!!zeropoint - \dostrokedlinedbox\width#1\height#2\depth#3\toggle#6\\% - \else - \dostrokedroundbox\width#1\height#2\depth#3\radius#5\\% - \fi} - {\dostrokedlinedbox\width#1\height#2\depth#3\toggle#6\\}% - \egroup} - -%D The toggle argument in these calls concern the individual -%D rules: left, right, top and bottom. Each cna be turned on, -%D depending on the general state (\type{#4}) or the individual -%D ones (\type{#5}, \type{#6}, \type{#7} and \type{#8}). - -\def\dostrokedlinedbox\width#1\height#2\depth#3\toggle - #4\left#5\right#6\top#7\bottom#8\\% - {\bgroup - \setbox0=\null\wd0=#1\ht0=#2\dp0=#3% - \setbox2=\vbox - {\getvalue{t\@@frame@@#4#7}% - \hbox - {\getvalue{l\@@frame@@#4#5}% - \box0% - \getvalue{r\@@frame@@#4#6}} - \getvalue{b\@@frame@@#4#8}}% - \wd2=#1\ht2=#2\dp2=#3% - \box2 - \egroup} - -\def\@@frame@@{@@frame@@} - -\setvalue{t\@@frame@@\v!aan\v!aan}{\hrule\!!height\linewidth\kern-\linewidth} -\setvalue{t\@@frame@@\v!uit\v!aan}{\hrule\!!height\linewidth\kern-\linewidth} - \setvalue{t\@@frame@@\v!aan}{\hrule\!!height\linewidth\kern-\linewidth} -\setvalue{b\@@frame@@\v!aan\v!aan}{\kern-\linewidth\hrule\!!height\linewidth} -\setvalue{b\@@frame@@\v!uit\v!aan}{\kern-\linewidth\hrule\!!height\linewidth} - \setvalue{b\@@frame@@\v!aan}{\kern-\linewidth\hrule\!!height\linewidth} -\setvalue{l\@@frame@@\v!aan\v!aan}{\vrule\!!width\linewidth\kern-\linewidth} -\setvalue{l\@@frame@@\v!uit\v!aan}{\vrule\!!width\linewidth\kern-\linewidth} - \setvalue{l\@@frame@@\v!aan}{\vrule\!!width\linewidth\kern-\linewidth} -\setvalue{r\@@frame@@\v!aan\v!aan}{\kern-\linewidth\vrule\!!width\linewidth} -\setvalue{r\@@frame@@\v!uit\v!aan}{\kern-\linewidth\vrule\!!width\linewidth} - \setvalue{r\@@frame@@\v!aan}{\kern-\linewidth\vrule\!!width\linewidth} - -%D I condidered using the low level support command -%D \type{\ruledhbox}, but this would slow down processing by a -%D factor~3. - -%D Before we come to using these macros we yet have to define -%D the rounded corner alternative, which after all is not that -%D hard because it uses the previously defined macro \type -%D {\ovalbox}. - -\def\dostrokedroundbox\width#1\height#2\depth#3\radius#4\\% - {\ovalbox{#1}{#2}{#3}{\linewidth}{#4}{\v!ja}{\v!nee}} - -%D The next few macros are probably the most misused ones in -%D \CONTEXT. They deal with putting rules around boxes, provide -%D backgrounds, offer alignment features, and some more. We -%D start with defining some booleans. These give an impression -%D of what we are going to take into account. - -\newif\ifboxhasoffset -\newif\ifboxhaswidth -\newif\ifboxhasheight -\newif\ifboxhasformat -\newif\ifboxhasstrut -\newif\ifboxisoverlaid - -%D We also need a few \DIMENSIONS: - -\newdimen\@@localoffset -\newdimen\@@globalwidth - -%D The content of the box will be (temporary) saved in a box: - -\newbox\framebox - -%D We also need a box for outlines and backgrounds: - -\newbox\extraframebox - -%D \macros -%D {framed, setupframed} -%D -%D Ruled boxes are typeset using \type{\framed}. This command -%D is quite versatile and, although some users will probably -%D seldom use it, one cannot overlook its features. -%D -%D \showsetup{\y!setupframed} -%D \showsetup{\y!framed} -%D -%D This general macro is a special version of an even more -%D general case, that can easily be linked into other macros -%D that need some kind of framing. The local version is called -%D with an extra parameter: the variable identifier. The reason -%D for passing this identifier between brackets lays in the -%D mere fact that this way we can use the optional argument -%D grabbers. - -\unexpanded\def\framed% - {\bgroup - \presetlocalframed[\??ol]% - \dodoubleempty\startlocalframed[\??ol]} - -\def\presetlocalframed[#1]% - {\copylocalframed[#1][\??oi]} - -\def\copylocalframed[#1]#2[#3]% - {\copyparameters[#1][#3] - [\c!breedte,\c!hoogte,\c!offset,\c!leeg, - \c!straal,\c!hoek,\c!diepte,\c!kader,\c!kaderkleur, - \c!bovenkader,\c!onderkader,\c!linkerkader,\c!rechterkader, - \c!lijndikte,\c!kaderoffset,\c!achtergrondoffset, - \c!achtergrond,\c!achtergrondraster,\c!achtergrondkleur, - \c!uitlijnen,\c!onder,\c!boven,\c!strut,\c!plaats]% - \copyparameters[#1\c!achtergrond][#1] - [\c!straal,\c!hoek,\c!diepte]% - \copyparameters[#1\c!kader][#1] - [\c!straal,\c!hoek,\c!diepte]} - -\def\setupframed% - {\dodoubleargument\getparameters[\??oi]} - -%D The normal case first presets all parameters and next starts -%D looking for the user supplied ones. The first step is -%D omitted in the local case, because these are preset at -%D declaration time and keep their values unless explictly -%D changed. By presetting the variables everytime the normal -%D command is called, we can use this command nested, without -%D the unwanted side effect of inheritance. - -\def\localframed% - {\bgroup - \dodoubleargument\startlocalframed} - -%D Before we go into details, we present (and implement) the -%D main framing routine. I saw no real reason for splitting the -%D next two macros into smaller pieces. The content will be -%D collected in a horizontal or vertical box with fixed or free -%D dimensions and specific settings concerning aligment and -%D offsets. - -\def\startlocalframed[#1][#2]% - {\bgroup - \edef\@@framed{#1}% - \getparameters[\@@framed][#2]% - \edef\localoffset{\getvalue{\@@framed\c!offset}}% - \edef\localwidth{\getvalue{\@@framed\c!breedte}}% - \edef\localheight{\getvalue{\@@framed\c!hoogte}}% - \edef\localformat{\getvalue{\@@framed\c!uitlijnen}}% - \edef\localstrut{\getvalue{\@@framed\c!strut}}% - \doifvaluesomething{\@@framed\c!lijndikte} - {\linewidth=\getvalue{\@@framed\c!lijndikte}}% - \doifelsenothing{\localformat} - {\boxhasformatfalse} - {\boxhasformattrue - \edef\beforeframedbox{\getvalue{\@@framed\c!boven}}% - \edef\afterframedbox{\getvalue{\@@framed\c!onder}}% - \dosetraggedcommand{\localformat}}% - \doifelse{\localoffset}{\v!geen} - {\boxhasoffsetfalse - \boxhasstrutfalse - \boxisoverlaidfalse - \@@localoffset=\linewidth} - {\doifelse{\localoffset}{\v!overlay} - {\boxhasoffsetfalse - \boxhasstrutfalse - \boxisoverlaidtrue - \@@localoffset=\!!zeropoint} - {\boxhasoffsettrue - \boxhasstruttrue - \boxisoverlaidfalse - \@@localoffset=\localoffset - \advance\@@localoffset by \linewidth}}% - \doifelse{\localwidth}{\v!passend} - {\ifboxhasformat - \boxhaswidthtrue - \!!widtha=\hsize - \else - \boxhaswidthfalse - \fi} - {\doifelse{\localwidth}{\v!ruim} - {\boxhaswidthtrue - \!!widtha=\hsize} - {\boxhaswidthtrue - \!!widtha=\localwidth}}% - \doifelse{\localheight}{\v!passend} - {\boxhasheightfalse} % no longer: \boxhasstrutfalse - {\doifelse{\localheight}{\v!ruim} - {\boxhasheightfalse} - {\boxhasheighttrue - \!!heighta=\localheight}}% - \ifdim\!!widtha=\hsize - \parindent=\!!zeropoint - \setlocalhsize - \!!widtha=\localhsize - \fi - \advance\!!widtha by -2\@@localoffset - \advance\!!heighta by -2\@@localoffset - \doif{\localstrut}{\v!nee} - {\boxhasstrutfalse}% - \ifboxhasstrut - \setstrut - \let\localbegstrut=\begstrut - \let\localendstrut=\endstrut - \let\localstrut =\strut - \else - \let\localbegstrut=\relax - \let\localendstrut=\relax - \let\localstrut =\relax - \fi - \ifboxhasheight - \let\\=\vboxednewline - \ifboxhaswidth - \let\hairline=\vboxedhairline - \ifboxhasformat - \let\next=\doformatboxSomeFormat - \else - \let\next=\doformatboxNoFormat - \fi - \else - \let\hairline=\hboxedhairline - \ifboxhasformat - \let\next=\doformatboxHeight - \else - \let\next=\doformatboxVSize - \fi - \fi - \else - \ifboxhaswidth - \ifboxhasformat - \let\hairline=\vboxedhairline - \let\\=\vboxednewline - \let\next=\doformatboxWidth - \else - \let\hairline=\hboxedhairline - \let\\=\hboxednewline - \let\next=\doformatboxHSize - \fi - \else - \let\hairline=\hboxedhairline - \let\\=\hboxednewline - \let\next=\doformatboxNoSize - \fi - \fi - \def\dowithframedbox{\aftergroup\stoplocalframed}% - \afterassignment\dowithframedbox - \setbox\framebox=\next} - -%D Carefull analysis of this macro will learn us that not all -%D branches in the last conditionals can be encountered, that -%D is, some assignments to \type{\next} will never occur. -%D Nevertheless we implement the whole scheme, if not for -%D future extensions. -%D -%D The last few lines tell what to do after the content of the -%D box is collected and passed to the next macro. In the case -%D of a fixed width and centered alignment, the content is -%D evaluated and used to determine the most natural width. The -%D rest of the code deals with backgrounds and frames. - -\def\stoplocalframed% - {\dontshowcomposition - \ifboxhasformat - \doif{\localwidth}{\v!passend} - {\doreshapeframedbox - \boxhaswidthfalse}% - \fi - \ifboxhaswidth - \wd\framebox=\!!widtha - \fi - \ifboxhasheight - \ht\framebox=\!!heighta - \fi - \doifvalue{\@@framed\c!leeg}{\v!ja} - {\setbox0=\null - \wd0=\wd\framebox \ht0=\ht\framebox \dp0=\dp\framebox - \setbox\framebox=\box0\relax}% - \ifboxhasoffset - \dooffsetframebox - \fi - \ifboxisoverlaid \else - \dolocateframebox - \fi - \doframedbox - \doifvaluesomething{\@@framed\c!achtergrond} - {\dobackedbox}% - \doifvalue{\@@framed\c!plaats}{\v!laag} - {\doinlineframedbox}% - \box\framebox - \egroup - \egroup} - -%D The last conditional takes care of the special situation of -%D in||line \inframed[hoogte=3cm]{framed} boxes. Such boxes have -%D to be \inframed{aligned} with the running text. - -\def\doinframed[#1]% we could omit #1] but readibility ... - {\framed[\c!plaats=\v!laag,#1]} - -\unexpanded\def\inframed% - {\dosingleempty\doinframed} - -%D When we set \type{\c!leeg} to \type{\v!ja}, we get -%D ourselves a frame and/or background, but no content, so -%D actually we have a sort of phantom framed box. - -%D This previous framing macros needs a lot of alternatives for -%D putting rules around boxes, inserting offsets and aligning -%D text. Each step is handled by separate macros. - -\def\dooffsetframebox% - {\doifinstringelse{\getvalue{\@@framed\c!offset}}{\v!geen\c!offset} - {}{\doifelsevaluenothing{\@@framed\c!offset} - {}{\edef\do{\kern\getvalue{\@@framed\c!offset}}% - \setbox\framebox=\vbox{\do\hbox{\do\box\framebox\do}\do}}}} - -\def\dolocateframebox% - {\setbox\framebox=\vbox - {\kern\linewidth - \hbox{\kern\linewidth\box\framebox\kern\linewidth} - \kern\linewidth}} - -%D Let's hope that the next few examples show us enough of -%D what needs to be done by the auxiliary macros. -%D -%D \startbuffer -%D \framed[hoogte=1cm,offset=.5cm] {rule based learning} -%D \framed[hoogte=1cm,offset=0cm] {rule based learning} -%D \framed[hoogte=1cm,offset=geen] {rule based learning} -%D \framed[hoogte=1cm,offset=overlay]{rule based learning} -%D \stopbuffer -%D -%D \typebuffer -%D -%D \startregelcorrectie -%D \hbox{\haalbuffer} -%D \stopregelcorrectie -%D -%D \startbuffer -%D \framed[offset=.5cm] {rule based learning} -%D \framed[offset=0cm] {rule based learning} -%D \framed[offset=geen] {rule based learning} -%D \framed[offset=overlay]{rule based learning} -%D \stopbuffer -%D -%D \typebuffer -%D -%D \startregelcorrectie -%D \hbox{\haalbuffer} -%D \stopregelcorrectie -%D -%D \startbuffer -%D \framed[strut=nee,offset=.5cm] {rule based learning} -%D \framed[strut=nee,offset=0cm] {rule based learning} -%D \framed[strut=nee,offset=geen] {rule based learning} -%D \framed[strut=nee,offset=overlay]{rule based learning} -%D \stopbuffer -%D -%D \typebuffer -%D -%D \startregelcorrectie -%D \hbox{\haalbuffer} -%D \stopregelcorrectie -%D -%D \startbuffer -%D \framed[breedte=3cm,uitlijnen=links] {rule\\based\\learning} -%D \framed[breedte=3cm,uitlijnen=midden] {rule\\based\\learning} -%D \framed[breedte=3cm,uitlijnen=rechts] {rule\\based\\learning} -%D \framed[breedte=passend,uitlijnen=midden] {rule\\based\\learning} -%D \stopbuffer -%D -%D \typebuffer -%D -%D \startregelcorrectie -%D \hbox{\mindermeldingen\haalbuffer} -%D \stopregelcorrectie -%D -%D So now we're ready for the complicated stuff. We distinguish -%D between borders with straight lines and those with round -%D corners. When using the first alternative it is possible to -%D turn off one or more lines. More fancy shapes are also -%D possible by specifying dedicated backgrounds. Turning lines -%D on and off is implemented as efficient as possible and as a -%D result is interface language dependant. This next -%D implementation evolved from simpler ones. It puts for -%D instance the rules on top of the content and provides -%D additional offset capabilities. The lot of calls to other -%D macros makes this mechanism not that easy to comprehend. - -\def\doframedbox% - {\setbox\framebox=\vbox - {\dooutlinebox\framebox - \color \getvalue{\@@framed\c!kaderkleur}% - \offset \getvalue{\@@framed\c!kaderoffset}% - \corner \getvalue{\@@framed\c!kaderhoek}% - \radius \getvalue{\@@framed\c!kaderstraal}% - \depth \getvalue{\@@framed\c!kaderdiepte}% - \toggle \getvalue{\@@framed\c!kader}% - \left \getvalue{\@@framed\c!linkerkader}% - \right \getvalue{\@@framed\c!rechterkader}% - \top \getvalue{\@@framed\c!bovenkader}% - \bottom \getvalue{\@@framed\c!onderkader}\\}} - -%D Getting the backgrounds right takes less code. Again we -%D have to take care of additional offsets. - -\def\dobackedbox% - {\setbox\framebox=\vbox - {\dobackgroundbox\framebox - \background \getvalue{\@@framed\c!achtergrond}% - \color \getvalue{\@@framed\c!achtergrondkleur}% - \raster \getvalue{\@@framed\c!achtergrondraster}% - \offset \getvalue{\@@framed\c!achtergrondoffset}% - \corner \getvalue{\@@framed\c!achtergrondhoek}% - \radius \getvalue{\@@framed\c!achtergrondstraal}% - \depth \getvalue{\@@framed\c!achtergronddiepte}\\}} - -%D We handle left, right or middle alignment as well as fixed -%D or free widths and heights. Each combination gets its own -%D macro. - -\def\dopresetformatbox% - {\forgetall - \oninterlineskip} - -\def\doformatboxSomeFormat% - {\vbox to \!!heighta - \bgroup - \dopresetformatbox - \hsize\!!widtha - \vsize\!!heighta - \raggedcommand - \beforeframedbox - \bgroup - \localbegstrut - \aftergroup\localendstrut - \aftergroup\afterframedbox - \aftergroup\egroup - \let\next=} - -\def\doformatboxNoFormat% - {\vbox to \!!heighta - \bgroup - \dopresetformatbox - \hsize\!!widtha - \vsize\!!heighta - \raggedcenter - \vss - \bgroup - \localbegstrut - \aftergroup\localendstrut - \aftergroup\vss - \aftergroup\egroup - \let\next=} - -\def\doformatboxHeight% - {\vbox to \!!heighta - \bgroup - \dopresetformatbox - \raggedcommand - \vss - \bgroup - \aftergroup\localendstrut - \aftergroup\vss - \aftergroup\egroup - \localbegstrut - \let\next=} - -\def\doformatboxWidth% - {\vbox - \bgroup - \dopresetformatbox - \hsize\!!widtha - \raggedcommand - \bgroup - \localbegstrut - \aftergroup\localendstrut - \aftergroup\egroup - \let\next=} - -\def\doformatboxVSize% - {\vbox to \!!heighta - \bgroup - \forgetall - \vsize\!!heighta - \vss - \bgroup - \aftergroup\vss - \aftergroup\egroup - \hbox - \bgroup - \aftergroup\egroup - \localstrut - \let\next=} - -\def\doformatboxHSize% - {\hbox to \!!widtha - \bgroup - \forgetall - \hss - \localstrut - \bgroup - \aftergroup\hss - \aftergroup\egroup - \let\next=} - -\def\doformatboxNoSize% - {\hbox - \bgroup - \localstrut - \let\next=} - -%D On the next page we show some examples of how these macros -%D come into action. The examples show us how -%D \type{\v!passend}, \type{\v!ruim} dimensions influence the -%D formatting. Watch the visualized struts. \voetnoot {Here we -%D used \type{\toonstruts}.} -%D -%D \startuitstellen -%D \bgroup -%D \toonstruts -%D \mindermeldingen -%D \startregelcorrectie -%D \halign{#\enskip&#\enskip&#\enskip&#\enskip&#\enskip&#\cr -%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=] {a\par b\par c}\cr -%D \noalign{\vskip1em} -%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=ja] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=ja] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=ja] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=ja] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=ja] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=ja] {a\par b\par c}\cr -%D \noalign{\vskip1em} -%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=rechts] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=rechts] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=rechts] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=rechts] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=rechts] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=rechts] {a\par b\par c}\cr -%D \noalign{\vskip1em} -%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=links] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=links] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=links] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=links] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=links] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=links] {a\par b\par c}\cr -%D \noalign{\vskip1em} -%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=midden] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=midden] {a\par b\par c}& -%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=midden] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=midden] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=midden] {a\par b\par c}& -%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=midden] {a\par b\par c}\cr} -%D \stopregelcorrectie -%D \blanko[2*groot] -%D \egroup -%D \stopuitstellen - -%D It is possible to let the frame macro calculate the width -%D of a centered box automatically (\type{\v!passend}). When -%D doing so, we need to reshape the box: - -\def\doreshapeframedbox% - {\beginofshapebox - \unvcopy\framebox - \endofshapebox - \global\@@globalwidth=\!!zeropoint - \reshapebox - {\setbox0=\hbox{\unhbox\shapebox}% - \ifdim\wd0>\@@globalwidth - \global\@@globalwidth=\wd0 - \fi}% - \dosetraggedcommand{\localformat}% - \raggedcommand - \setbox\framebox=\vbox - {\hsize\@@globalwidth - \reshapebox{\hbox to \hsize{\unhbox\shapebox}}% - \flushshapebox}% - \ifboxhasheight \else - \dp\framebox=\dp\strutbox - \fi} - -%D The examples on the next page show how one can give the -%D frame as well as the background an additional offset and -%D even a bit more depth. The blue outline is the frame, the -%D red box is the background and the small black outline is the -%D vsiualization of the resulting box, that is, we applied -%D \type{\ruledhbox} to the result. - -%D \startuitstellen -%D \bgroup -%D \unprotect -%D \mindermeldingen -%D -%D \startbuffer -%D \vbox to \vsize -%D \bgroup -%D \startuitlijnen[midden] -%D \vss -%D \leavevmode\vbox to .8\vsize -%D \bgroup -%D \hsize=300pt -%D \setupframed -%D [\c!achtergrond=\v!kleur, -%D \c!achtergrondkleur=DemoRed, -%D \c!breedte=300pt, -%D \c!hoogte=60pt, -%D \c!kaderkleur=DemoBlue, -%D \c!lijndikte=2pt] -%D \def\status% -%D {\c!achtergrondoffset=\@@olachtergrondoffset\\ -%D \c!kaderoffset=\@@olkaderoffset\\ -%D \c!diepte=\@@oldiepte} -%D \leavevmode \ruledhbox{\framed[achtergrondoffset=0pt,kaderoffset=0pt]{\status}} -%D \vss -%D \leavevmode \ruledhbox{\framed[achtergrondoffset=5pt,kaderoffset=0pt]{\status}} -%D \vss -%D \leavevmode \ruledhbox{\framed[achtergrondoffset=0pt,kaderoffset=5pt]{\status}} -%D \vss -%D \leavevmode \ruledhbox{\framed[achtergrondoffset=2pt,kaderoffset=5pt]{\status}} -%D \vss -%D \leavevmode \ruledhbox{\framed[achtergrondoffset=5pt,kaderoffset=2pt]{\status}} -%D \vss -%D \leavevmode \ruledhbox{\framed[achtergrondoffset=5pt,kaderoffset=5pt]{\status}} -%D \egroup -%D \vss -%D \stopuitlijnen -%D \egroup -%D \stopbuffer -%D -%D \haalbuffer -%D -%D {\setupframed[diepte=4pt]\haalbuffer} -%D -%D \protect -%D \egroup -%D \stopuitstellen - -%D When typesetting the framed box inline, we have to keep the -%D baseline intact outside as well as inside the framed box. - -\def\doinlineframedbox% - {\getboxheight\dimen2\of\box\framebox - \advance\dimen2 by -\ht\strutbox - \dimen0=.5\dimen2 - \ifboxhasoffset - \advance\dimen0 by \getvalue{\@@framed\c!offset}% - \fi - \advance\dimen0 by 2\linewidth - \setbox\framebox=\hbox{\lower\dimen0\box\framebox}% - \ht\framebox\ht\strutbox - \dp\framebox\dp\strutbox - \box\framebox} - -%D We can draw lines from left to right and top to bottom by -%D using the normal \type{\hairline} command. Both directions -%D need a different treatment. -%D -%D \startbuffer -%D \framed[breedte=4cm] {alfa\hairline beta\hairline gamma} -%D \framed[hoogte=2cm] {alfa\hairline beta\hairline gamma} -%D \framed[breedte=4cm,hoogte=2cm]{alfa\hairline beta\hairline gamma} -%D \stopbuffer -%D -%D \typebuffer -%D -%D \startregelcorrectie -%D \hbox{\haalbuffer} -%D \stopregelcorrectie -%D -%D These macros try to adapt their behaviour as good as -%D possible to the circumstances and act as natural as -%D possible. - -\def\vboxedhairline% - {\bgroup - \dimen2=\ifboxhasoffset \localoffset \else \!!zeropoint \fi - \dimen4=\dimen2 - \advance\dimen4 by \linewidth - \setbox0=\vbox - {\advance\hsize by 2\dimen4 - \vskip\dimen2 - \hrule - \!!height\linewidth - \!!depth\!!zeropoint - \!!width\hsize - \vskip\dimen2}% - \endgraf\nointerlineskip\endgraf - \moveleft\dimen4\box0 - \endgraf\nointerlineskip\endgraf - \localbegstrut - \egroup} - -\def\hboxedhairline% - {\bgroup - \dimen2=\ifboxhasoffset \localoffset \else \!!zeropoint \fi - \ifboxhasheight - \dimen4=\localheight \divide\dimen4 by 2 - \dimen6=\dimen4 - \advance\dimen4 by \dp\strutbox - \advance\dimen6 by -\dp\strutbox - \advance\dimen4 by -2\linewidth - \advance\dimen6 by 2\linewidth - \else - \dimen4=\ht\strutbox - \advance\dimen4 by \dimen2 - \dimen6=\dp\strutbox - \advance\dimen6 by \dimen2 - \fi - \unskip - \setbox0=\hbox - {\hskip\dimen2 - \vrule - \!!height\dimen4 - \!!depth\dimen6 - \!!width\linewidth - \hskip\dimen2}% - \ht0=\ht\strutbox - \dp0=\dp\strutbox - \box0 - \ignorespaces - \egroup} - -%D The argument of the frame command accepts \type{\\} as a -%D sort of newline signal. In horizontal boxes it expands to a -%D space. - -\def\vboxednewline% - {\endgraf\ignorespaces} - -\def\hboxednewline% - {\unskip\normalspace\ignorespaces} - -%D We can set each rule on or off. The default setting is -%D inherited from \type{\c!kader}. An earlier implementation -%D use a bit different approach, but the new one seems more -%D natural: -%D -%D \bgroup -%D \steltypenin[marge=0pt] -%D \startregelcorrectie -%D \startbuffer -%D \omlijnd[offset=overlay,kader=aan] {\DemoRed\blokje} -%D \stopbuffer -%D \hbox{\haalbuffer\vbox{\typebuffer}} -%D -%D \startbuffer -%D \omlijnd[offset=overlay,kader=aan,onderkader=uit]{\DemoRed\blokje} -%D \stopbuffer -%D \hbox{\haalbuffer\vbox{\typebuffer}} -%D -%D \startbuffer -%D \omlijnd[offset=overlay,kader=aan,onderkader=aan]{\DemoRed\blokje} -%D \stopbuffer -%D \hbox{\haalbuffer\vbox{\typebuffer}} -%D -%D \startbuffer -%D \omlijnd[offset=overlay,kader=uit] {\DemoRed\blokje} -%D \stopbuffer -%D \hbox{\haalbuffer\vbox{\typebuffer}} -%D -%D \startbuffer -%D \omlijnd[offset=overlay,kader=uit,onderkader=uit]{\DemoRed\blokje} -%D \stopbuffer -%D \hbox{\haalbuffer\vbox{\typebuffer}} -%D -%D \startbuffer -%D \omlijnd[offset=overlay,kader=uit,onderkader=aan]{\DemoRed\blokje} -%D \stopbuffer -%D \hbox{\haalbuffer\vbox{\typebuffer}} -%D \stopregelcorrectie -%D \egroup - -%D \macros -%D {setupblackrules} -%D -%D The graphic capabilities of \TEX\ do not go beyond simple -%D filled rules, except of course when using specials. Let's -%D start with a warning: using this commands is far more slower -%D than using the \TEX\ primitives \type{\hrule} and -%D \type{\vrule}, but they save us some tokens. The -%D characteristics of these rule drawing command can be set by: -%D -%D \showsetup{\y!setupblackrules} - -\def\setupblackrules% - {\dodoubleargument\getparameters[\??bj]} - -%D \macros -%D {blackrule} -%D -%D The simple command draws only one rule. Its optional -%D argument can be used to specify the dimensions. By setting -%D the width, height or depth to \type{\v!max}, one gets the -%D natural dimensions. -%D -%D \showsetup{\y!blackrule} - -\def\doblackrule[#1]% - {\bgroup - \getparameters[\??bj][#1]% - \setstrut - \doif{\@@bjbreedte}{\v!max}{\def\@@bjbreedte{1em}}% - \doif{\@@bjhoogte} {\v!max}{\def\@@bjhoogte{\ht\strutbox}}% - \doif{\@@bjdiepte} {\v!max}{\def\@@bjdiepte{\dp\strutbox}}% - \vrule - \!!width\@@bjbreedte - \!!height\@@bjhoogte - \!!depth\@@bjdiepte - \egroup} - -\unexpanded\def\blackrule% - {\dosingleempty\doblackrule} - -%D \macros -%D {blackrules} -%D -%D One can call for a sequence of black rules, if needed -%D equally spaced over the given width. -%D -%D \showsetup{\y!blackrules} -%D -%D The two alternative calls are therefore: -%D -%D \startbuffer -%D Tell me, is this according to the \blokjes[n=6]? -%D These \blokjes[variant=b,n=10,afstand=.2em,breedte=4cm] are quite clear. -%D \stopbuffer -%D -%D \typebuffer -%D -%D or: -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld -%D -%D We could of course have implemented this macro using -%D \type{\leaders}, but this would probably have taken more -%D tokens. - -\def\doblackrules[#1]% - {\bgroup - \getparameters[\??bj][#1]% - \!!widtha=\@@bjbreedte - \!!widthb=\@@bjafstand - \doif{\@@bjvariant}{\c!b} - {\scratchcounter=\@@bjn - \ifnum\scratchcounter=1 - \!!widthb=\!!zeropoint - \else - \advance\scratchcounter by -1 - \advance\!!widtha by -\scratchcounter\!!widthb - \divide\!!widtha by \@@bjn - \fi}% - \dorecurse{\@@bjn} - {\vrule - \!!width\!!widtha - \!!height\@@bjhoogte - \!!depth\@@bjdiepte - \hskip\!!widthb}% - \unskip - \egroup} - -\unexpanded\def\blackrules% - {\dosingleempty\doblackrules} - -%D The next commands can be used to draw margin rules. We -%D support two methods: \marginrule{one for in||line use} and -%D one that acts on a paragraph. Drawing a margin rule is -%D rather straightforward because we can use the commands that -%D put text in the margin. - -\def\dodrawmarginrule% - {\setbox0=\hbox - {\vrule - \!!height\strutheight - \!!depth\strutdepth - \!!width\@@kadikte}% - \vsmashbox0 - \box0} - -\def\drawmarginrule% - {\strut\inlinker{\dodrawmarginrule}} - -%D \macros -%D {marginrule} -%D -%D The first method gobbles words and simply puts a bar in the -%D margin. This method is not entirely robust. -%D -%D \showsetup{\y!marginrule} - -\definecomplexorsimple\marginrule - -\def\simplemarginrule% - {\let\processword=\drawmarginrule - \processwords} - -\def\complexmarginrule[#1]% - {\ifnum#1<\@@kaniveau\relax \else - \def\@@kadefaultwidth{#1}% - \expandafter\simplemarginrule - \fi} - -%D We need an auxiliary variable - -\def\@@kadefaultwidth{1} - -%D \macros -%D {setupmarginrules} -%D -%D This macro definitions show us that we can pass an optional -%D level, which is matched against the previous set one. The -%D level can be set up with -%D -%D \showsetup{\y!setupmarginrules} - -\def\setupmarginrules% - {\dodoubleargument\getparameters[\??ka]} - -%D \macros -%D {startmarginrule} -%D -%D The second method collects text and reformats it afterwards, -%D using the shapebox macros. We prevent local margin rules. -%D -%D \showsetup{\y!startmarginrule} - -\definecomplexorsimple\startmarginrule - -\def\simplestartmarginrule% - {\bgroup - \let\drawmarginrule=\relax - \let\stopmarginrule=\dostopmarginrule - \beginofshapebox} - -\def\complexstartmarginrule[#1]% - {\bgroup - \let\drawmarginrule=\relax - \ifnum#1<\@@kaniveau\relax - \let\stopmarginrule=\egroup - \else - \def\@@kadefaultwidth{#1}% - \let\stopmarginrule=\dostopmarginrule - \expandafter\beginofshapebox - \fi} - -\def\dostopmarginrule% - {\endofshapebox - \reshapebox - {\hbox{\inlinkermarge{\dodrawmarginrule}\box\shapebox}}% - \flushshapebox - \egroup} - -%D \startbuffer -%D \stelkantlijnin[niveau=5] -%D -%D \startkantlijn[1] -%D First we set the level at~5. Next we typeset this first -%D paragraph as a level~1 one. As expected no rule show up. -%D \stopkantlijn -%D -%D \startkantlijn[5] -%D The second paragraph is a level~5 one. As we can se here, -%D the marginal rule gets a width according to its level. -%D \stopkantlijn -%D -%D \startkantlijn[8] -%D It will of course be no surprise that this third paragraph -%D has a even thicker margin rule. This behavior can be -%D overruled by specifying the width explictly. -%D \stopkantlijn -%D \stopbuffer -%D -%D In next example we show most features. Watch the rule -%D thickness adapting itself to the level. -%D -%D \startvoorbeeld -%D \haalbuffer -%D \stopvoorbeeld -%D -%D We just said: -%D -%D \typebuffer - -%D \macros -%D {vl, hl} -%D -%D The command \type{\vl} draws a vertical rule \vl\ with strut -%D dimensions, multiplied with the factor specified in the -%D optional argument. The height and depth are clipped \vl[3] -%D to the baselinedistance. Its horizontal counterpart -%D \type{\hl} draws a horizontal rule \hl\ with a width of 1em, -%D multiplied with the optional factor. The horizontal rule is -%D drawn on top of the baseline. -%D -%D \showsetup{\y!vl} -%D \showsetup{\y!hl} - -\def\complexvl[#1]% - {\bgroup - \dimen0=#1\ht\strutbox - \dimen2=#1\dp\strutbox - \setbox0=\hbox - {\vrule - \!!width\linewidth - \!!height\dimen0 - \!!depth\dimen2}% - \dp0=\dp\strutbox - \ht0=\ht\strutbox - \box0 - \egroup} - -\def\complexhl[#1]% - {\hbox - {\vrule - \!!width#1em - \!!height\linewidth - \!!depth\!!zeropoint}} - -\def\simplevl% - {\complexvl[1]} - -\def\simplehl% - {\complexhl[1]} - -\definecomplexorsimple\vl -\definecomplexorsimple\hl - -%D \macros -%D {hairline, thinrule, thinrules, setupthinrules} -%D -%D Drawing thin lines can of course easily be accomplished by -%D the \TEX\ primitives \type{\hrule} and \type{\vrule}. The -%D next few macros however free us from some specifications. -%D -%D \startbuffer -%D some text -%D -%D \hairline -%D -%D some more text -%D -%D \thinrule -%D -%D more and more text -%D -%D hi \thinrule\ there -%D -%D and then the final text -%D \stopbuffer -%D -%D \typebuffer -%D -%D becomes -%D -%D \startvoorbeeld -%D \haalbuffer -%D \stopvoorbeeld -%D -%D So we've got -%D -%D \showsetup{\y!hairline} -%D \showsetup{\y!thinrule} -%D -%D Both can be set up with: -%D -%D \showsetup{\y!setupthinrules} -%D -%D We also have -%D -%D \showsetup{\y!thinrules} -%D -%D which looks like: \thinrules[n=2] - -\def\thinrule% - {\strut - \leaders - \hrule\!!height\@@dlhoogte\!!depth\@@dlhoogte - \hfill - \strut} - -\def\hairline% - {\endgraf - \thinrule - \endgraf} - -\def\dosetupthinrules[#1]% - {\getparameters[\??dl][#1]% - \assignvalue{\@@dlafstand}{\@@dl@@afstand}{1.0}{1.5}{2.0}} - -\def\setupthinrules% - {\dosingleargument\dosetupthinrules} - -\def\dothinrules[#1]% - {\bgroup - \dosetupthinrules[#1]% - \@@dlvoor - \spacing\@@dl@@afstand - \dorecurse - {\@@dln} - {\thinrule\ifnum\recurselevel<\@@dln\endgraf\fi}% - \@@dlna - \egroup} - -\def\thinrules% - {\dosingleempty\dothinrules} - -%D \macros -%D {startframedtext, setupframedtexts, -%D defineframedtext, start<<framedtext>>, <<framedtext>>} -%D -%D The general framing command we discussed previously, is not -%D entirely suited for what we call framed texts, as for -%D instance used in intermezzo's. The next examples show what -%D we have in mind. -%D -%D \startbuffer[framed-0] -%D \stelkadertekstenin -%D [kader=uit, -%D breedte=\hsize, -%D achtergrond=raster] -%D -%D \startkadertekst -%D By default the framed text is centered \dots -%D \stopkadertekst -%D -%D \startkadertekst[rechts] -%D \dots\ but we can also align left, middle and right. -%D \stopkadertekst -%D \stopbuffer -%D -%D \startbuffer[framed-1] -%D \definieerkadertekst -%D [Example] -%D [breedte=6cm, -%D hoogte=5cm] -%D -%D \startExample -%D \typebuffer[framed-1] -%D \stopExample -%D \stopbuffer -%D -%D \startbuffer[framed-2] -%D \definieerkadertekst -%D [Example] -%D [breedte=6cm] -%D -%D \startExample -%D \typebuffer[framed-2] -%D \stopExample -%D \stopbuffer -%D -%D \startbuffer[framed-3] -%D \definieerkadertekst -%D [Example] -%D [hoogte=5cm] -%D -%D \startExample -%D \typebuffer[framed-3] -%D \stopExample -%D \stopbuffer -%D -%D \startbuffer[framed-4] -%D \definieerkadertekst -%D [Example] -%D [breedte=passend,hoogte=ruim] -%D -%D \Example{a very exciting example} -%D \stopbuffer -%D -%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-0] \egroup -%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-1] \egroup -%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-2] \egroup -%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-3] \egroup -%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-4] \egroup -%D -%D Here we can see that we have a predefined framed text class -%D as well as the tools for defining our own. So we have: -%D -%D \showsetup{\y!setupframedtexts} -%D -%D as well as the definition command: -%D -%D \showsetup{\y!defineframedtext} -%D -%D that generates two commands: -%D -%D \showsetup{\e!start<<\y!framedtext>>} -%D \showsetup{<<\y!framedtext>>} -%D -%D The next definition shows the defaults. - -\def\dodefineframedtext[#1][#2]% - {\presetlocalframed[\??kd#1]% - \getparameters[\??kd#1] - [\c!breedte=0.75\hsize, - \c!hoogte=\v!passend, - \c!uitlijnen=\v!ja, - \c!boven=, - \c!onder=\vfill, - \c!offset=1em, - \c!korps=, - \c!letter=, - \c!kleur=, - \c!links=, - \c!rechts=\hfill, - \c!voor=\blanko, - \c!na=\blanko, - \c!binnen=, - \c!kader=\v!aan, - \c!bovenkader=, - \c!onderkader=, - \c!linkerkader=, - \c!rechterkader=, - \c!straal=.5\bodyfontsize, - \c!hoek=\v!recht, - \c!achtergrond=, - \c!achtergrondkleur=, - \c!achtergrondraster=\@@rsraster, - #2]% - \setvalue{\e!start#1}{\dostartframedtext[#1]}% - \setvalue{\e!stop#1}{\dostopframedtext[#1]} - \setvalue{#1}{\doframedtext[#1]}} - -\def\defineframedtext% - {\dodoubleempty\dodefineframedtext} - -%D We define the general (and original) case by just saying: - -\defineframedtext[\v!framedtext] - -%D We need several steps before the actual job is done, -%D because we have to handle an optional identifier (and -%D because these commands evolved out of a single case). - -\def\dosetupframedtexts[#1][#2]% - {\ifsecondargument - \getparameters[\??kd#1][#2]% - \else - \getparameters[\??kd\v!framedtext][#1]% - \fi} - -\def\setupframedtexts% - {\dodoubleempty\dosetupframedtexts} - -\def\dostartframedtext% - {\bgroup\dotripleempty\dodostartframedtext} - -\def\dodostartframedtext[#1][#2][#3]% - {\doifinstringelse{=}{#2} - {\dododostartframedtext[#1][][#2]} - {\dododostartframedtext[#1][#2][#3]}} - -\def\dododostartframedtext[#1][#2][#3]% - {\processaction - [#2] - [ \v!links=>\letvalue{\??kd#1\c!links}=\relax - \letvalue{\??kd#1\c!rechts}=\hfill, - \v!rechts=>\letvalue{\??kd#1\c!links}=\hfill - \letvalue{\??kd#1\c!rechts}=\relax, - \v!midden=>\letvalue{\??kd#1\c!links}=\hfill - \letvalue{\??kd#1\c!rechts}=\hfill]% - \forgetparindent - \setbox\framebox=\vbox - \bgroup - \expanded{\switchtobodyfont[\getvalue{\??kd#1\c!korps}]}% - \localframed[\??kd#1][\c!strut=\v!nee,#3]% - \bgroup - \blanko[\v!blokkeer]% - \let\\=\endgraf - \getvalue{\??kd#1\c!binnen}% - \dostartattributes{\??kd}{}} - -\def\dostopframedtext[#1]% - {\endgraf - \removelastskip - \dostopattributes - \baselinecorrection % new, inside box - \egroup - \egroup - \ifinsidefloat - \box\framebox - \else - \doplaats[\??kd#1][\c!regelcorrectie=\v!aan]{\box\framebox}% - \fi - \egroup} - -%D The simple brace (or group) delimited case is typeset -%D slightly different and is not aligned. - -\def\doframedtext% - {\bgroup\dodoubleempty\dodoframedtext} - -\def\dodoframedtext[#1][#2]% - {\expanded{\switchtobodyfont[\getvalue{\??kd#1\c!korps}]}% - \localframed[\??kd#1][\c!strut=\v!nee,#2]% - \bgroup - \blanko[\v!blokkeer]% - \let\\=\endgraf - \getvalue{\??kd#1\c!binnen}% - \dostartattributes{\??kd}{}% - \bgroup - \aftergroup\docloseframedtext - \let\next=} - -\def\docloseframedtext% - {\removelastskip - \dostopattributes - \egroup - \egroup} - -%D \macros -%D {textrule, starttextrule, setuptextrules} -%D -%D Putting rules before and after a paragraph is very space -%D sensitive, but the next command handles that quite well. It -%D comes in to disguises: -%D -%D \startbuffer -%D \textrule[boven]{fragments} -%D \input reich -%D \textrule -%D \stopbuffer -%D -%D \bgroup \typebuffer \haalbuffer \egroup -%D -%D \startbuffer -%D \setuptextrules -%D [breedte=90pt,afstand=12pt,lijnkleur=blauw, -%D korps=klein,letter=\sc,kleur=rood] -%D -%D \starttextrule{Ship Building Tools} -%D \nl \steltolerantiein[soepel] \input materie -%D \stoptextrule -%D \stopbuffer -%D -%D \bgroup \typebuffer \haalbuffer \egroup -%D -%D \startbuffer -%D \setuptextrules -%D [plaats=inmarge, -%D korps=klein,letter=schuinvet] -%D -%D \starttextrule{wonderful} -%D \input tufte -%D \stoptextrule -%D \stopbuffer -%D -%D \bgroup \typebuffer \haalbuffer \egroup -%D -%D The formal definition of these commands is: -%D -%D \showsetup{\y!textrule} -%D \showsetup{\y!starttextrule} -%D \showsetup{\y!setuptextrules} -%D -%D The implementation looks a bit complicated due to the -%D optional arguments. - -\def\setuptextrules% - {\dodoubleargument\getparameters[\??tl]} - -\def\complextextrule[#1]% - {\processaction - [#1] - [ \v!boven=>\let\next=\dotoptextrule, - \v!onder=>\let\next=\dobottomtextrule, - \s!default=>\let\next=\dobottomtextrule, - \s!unknown=>\let\next=\dobottomtextrule]% - \dosinglegroupempty\next} - -\definecomplexorsimple\textrule - -\def\simpletextrule% - {\dosinglegroupempty\dounknowntextrule} - -\def\docomplextextrule#1% - {\bgroup - \advance\hsize by -\rightskip - \advance\hsize by -\leftskip - \setbox0=\hbox to \hsize - {\dimen4=.5ex - \dimen6=-.5ex - \advance\dimen4 by .5\linewidth - \advance\dimen6 by .5\linewidth - \dimen8=\@@tlafstand - \doifnothing{#1}{\firstargumentfalse}% - \iffirstargument - \doifelse{\@@tlplaats}{\v!inmarge}% - {\llap{\doattributes{\??tl}{#1}\hskip\linkermargeafstand}} - {\color[\@@tllijnkleur] - {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlbreedte}% - \hbox spread 2\dimen8{\hss\doattributes{\??tl}{\strut#1}\hss}}% - \fi - \color[\@@tllijnkleur] - {\leaders\hrule\!!height\dimen4\!!depth\dimen6\hfill}}% - \ht0=\ht\strutbox - \dp0=\dp\strutbox - \noindent\box0 - \egroup} - -\def\dobottomtextrule#1% - {\ifhmode - \endgraf - \fi - \dimen0=\dp\strutbox - \ifdim\prevdepth<\dp\strutbox - \ifdim\prevdepth>\!!zeropoint - \advance\dimen0 by -\prevdepth - \fi - \fi - \advance\dimen0 by .5ex - \vskip\dimen0 - \@@tltussen - \doifelsenothing{#1} - {\bgroup - \advance\hsize by -\rightskip - \advance\hsize by -\leftskip - \nointerlineskip - \moveleft-\leftskip\vbox - {\color[\@@tllijnkleur] - {\hrule\!!depth\linewidth\!!height\!!zeropoint\!!width\hsize}}% - \egroup} - {\docomplextextrule{#1}}% - \prevdepth\!!zeropoint % look at this - \@@tlna - \pagina[\v!voorkeur]} - -\def\dotoptextrule#1% - {\pagina[\v!voorkeur] - \witruimte - \@@tlvoor - \docomplextextrule{#1}% - \geenwitruimte - \@@tltussen - \endgraf} - -\def\dobottomtextrule#1% - {\ifhmode - \endgraf - \fi - \dimen0=\dp\strutbox - \ifdim\prevdepth<\dp\strutbox - \ifdim\prevdepth>\!!zeropoint - \advance\dimen0 by -\prevdepth - \fi - \fi - \advance\dimen0 by .5ex - \vskip\dimen0 - \@@tltussen - \doifelsenothing{#1} - {\bgroup - \advance\hsize by -\rightskip - \advance\hsize by -\leftskip - \nointerlineskip - \moveleft-\leftskip\vbox - {\color[\@@tllijnkleur] - {\hrule\!!depth\linewidth\!!height\!!zeropoint\!!width\hsize}}% - \egroup} - {\docomplextextrule{#1}}% - \prevdepth\!!zeropoint % look at this - \@@tlna - \pagina[\v!voorkeur]} - -\def\dounknowntextrule% - {\iffirstargument - \let\next=\dotoptextrule - \else - \def\next{\dobottomtextrule{}}% - \fi - \next} - -%D The grouped commands also supports bodyfont switching: - -\def\starttextrule#1% - {\bgroup - \dotoptextrule{#1} - \switchtobodyfont[\@@tlkorps]} - -\def\stoptextrule% - {\dobottomtextrule{}% - \egroup} - -%D \macros -%D {fillinrules, setupfillinrules} -%D -%D The next few commands do not really deserve a place in a -%D core module, because they deal with specific typography. -%D Nevertheless I decided to make them part of the core, -%D because they permit us to make questionaires. Let's start -%D with some examples. -%D -%D \fillinrules[n=2,breedte=passend]{first} -%D \fillinrules[n=2,breedte=ruim]{first} -%D \fillinrules[n=2,breedte=3cm]{first} -%D \fillinrules[n=2,breedte=3cm,afstand=.5em,scheider=:]{first} -%D \fillinrules[n=2]{first}{last} -%D \fillintext{first}{last} \input reich \par -%D -%D The main command is \type{\fillinrules}. This command takes -%D one and an optional second argument and sets a paragraph with -%D empty visualized lines. -%D -%D \showsetup{\y!fillinrules} -%D \showsetup{\y!setupfillinrules} - -\def\setupfillinrules% - {\dodoubleargument\getparameters[\??il]} - -\definecomplexorsimpleempty\fillinrules - -\def\complexfillinrules[#1]% - {\def\docomplexfillinrules##1##2% - {\dodocomplexfillinrules[#1]{##1}{##2}{\thinrules[n=\@@iln]}}% - \dodoublegroupempty\docomplexfillinrules} - -\def\dodocomplexfillinrules[#1]#2#3#4% - {\endgraf - \@@ilvoor - \begingroup - \setupfillinrules[#1]% - \noindent - \doifelse{\@@ilbreedte}{\v!passend} - {\let\@@ilafstand=\!!zeropoint - \setbox0=\hbox} - {\doifelse{\@@ilbreedte}{\v!ruim} - {\setbox0=\hbox} - {\setbox0=\hbox to \@@ilbreedte}} - \bgroup - \doattributes{\??il}{\strut#2\hfill\@@ilscheider}% - \hskip\@@ilafstand - \egroup - \hangindent=\wd0\relax - \parindent=\hangindent - \box0\relax - \stelwitruimtein[\v!groot]% - \ignorespaces - #4% - \doifsomething{#3} - {\doifnot{\@@ilbreedte}{\v!passend} - {\kern\@@ilafstand} - \doattributes{\??il}{#3\strut}}% - \endgroup - \endgraf - \@@ilna} - -%D \macros -%D {fillintext} -%D -%D To provide compatible layouts when texts and lines are -%D mixed, one can typeset a paragraph by using the command -%D \type{\fillintext}. -%D -%D \showsetup{\y!fillintext} - -\definecomplexorsimpleempty\fillintext - -\def\complexfillintext[#1]% - {\def\docomplexfillintext##1##2% - {\dowithnextbox - {\dodocomplexfillinrules[#1]{##1}{\hfill##2}{\unhbox\nextbox\unskip}}% - \hbox\bgroup\let\par\egroup\ignorespaces}% - \dodoublegroupempty\docomplexfillintext} - -%D \macros -%D {fillinline, setupfillinlines} -%D -%D Another member of the family takes care of putting a (often -%D small) rule after a piece of text, like -%D -%D \startbuffer -%D \fillinline \input reich \par -%D \fillinline[marge=0cm] \input reich \par -%D \stopbuffer -%D -%D \startvoorbeeld -%D \haalbuffer -%D \stopvoorbeeld -%D -%D which was typeset by saying: -%D -%D \typebuffer -%D -%D The two commands that take care of this are: -%D -%D \showsetup{\y!fillinline} -%D \showsetup{\y!setupfillinlines} - -\def\setupfillinlines% - {\dodoubleargument\getparameters[\??iv]} - -\definecomplexorsimpleempty\fillinline - -\def\complexfillinline[#1]% - {%\endgraf % interferes with \doordefinieren cum suis - \@@ivvoor - \begingroup - \setupfillinlines[#1]% - \advance\rightskip by \@@ivmarge - \parfillskip\!!zeropoint - \def\par% - {\unskip\hfill - \dimen0=\@@ivbreedte - \advance\dimen0 by -\@@ivafstand - \ifdim\dimen0>\@@ivmarge\else\expandafter\rlap\fi - {\kern\@@ivafstand - \vrule - \!!width\dimen0 - \!!height.5\linewidth - \!!depth.5\linewidth}% - \endgraf % ! - \endgroup - \endgraf % ! - \@@ilna}} - -%D \stopdocumentation -%D \bgroup -%D -%D \stelkadertekstenin -%D [setuptext] -%D [achtergrond=kleur,achtergrondkleur=wit] -%D -%D \startbuffer -%D \stelachtergrondin -%D [achtergrondoffset=4pt, -%D achtergrond=raster, -%D kader=aan, -%D kaderkleur=rood, -%D linkeroffset=2pt] -%D \stopbuffer -%D -%D \haalbuffer -%D -%D \startachtergrond -%D -%D \macros -%D {setupbackground,startbackground,background} -%D -%D The section deals with backgrounds in the running text. This -%D means that texts is to be collected and split over pages. To -%D show what can be done, we provide this part of the -%D documentation with some gray background and a red frame. -%D Both the background and frame can have all characteristics -%D of \type{\framed}. This time we used the setting: -%D -%D \typebuffer -%D -%D The implementation is not that sophisticated, but suffices. -%D The main problem with this kind of functionality is to get -%D the spacing all right. - -%D Specifying the background is more or less the same as -%D specifying a framed box. -%D -%D \showsetup{\y!setupbackground} - -\presetlocalframed[\??ag] - -\def\dosetupbackground[#1]% - {\getparameters[\??ag][#1]% - \doifelse{\@@agstatus}{\v!start} - {\let\startbackground=\dostartbackground - \let\stopbackground =\dostopbackground - \let\background =\dobackground} - {\let\startbackground=\relax - \let\stopbackground =\relax - \let\background =\relax}} - -\def\setupbackground% - {\dosingleargument\dosetupbackground} - -%D Actually typesetting the background is implemented rather -%D straightforward. We need to handle some spacing as well as -%D the (often) a bit smaller horizontal size. -%D -%D \showsetup{\y!startbackground} -%D -%D Although we could have used a scratch one, we first -%D declare a boolean. - -\newif\ifbackgroundsplit - -%D The \type{\vbox to \lineheight{}\vskip\!!zeropoint} -%D construction gives the first real line a decent height by -%D adding a dummy line. - -\def\dostartbackground% - {\bgroup - \setbox0=\vbox\bgroup - \vbox to \lineheight{}\vskip\!!zeropoint - \blanko[\v!blokkeer] - \advance\hsize by -\@@aglinkeroffset - \advance\hsize by -\@@agrechteroffset} - -%D This dummy line is removed by \type{\setbox2=\vsplit0 to -%D \lineheight}. That way \type{\topskip} takes care of the -%D lineheight. I'll probably forget to apply this trick -%D elsewhere. -%D -%D {\em Beware: especially the bottom depth handling needs -%D a more advanced implementation, consistent with main -%D document features. Future versions therefore can break a -%D bit different.} - -\def\dostopbackground% - {\endgraf - \removelastskip - \egroup - \everypar{} - \splitmaxdepth=\boxmaxdepth - \splittopskip=\topskip - \setbox2=\vsplit0 to \lineheight - \loop - \ifdim\prevdepth<\dp\strutbox - \dimen8=\dp\strutbox - \else - \dimen8=\prevdepth - \fi - %\advance\dimen0 by \topskip - %\advance\dimen0 by -\baselineskip - \ifdim\pagegoal=\maxdimen - \dimen0=\teksthoogte - \advance\dimen0 by \topskip - \advance\dimen0 by -\baselineskip - \advance\dimen0 by -\dp\strutbox - \else - \dimen0=\pagegoal - \advance\dimen0 by -\dimen8 - \advance\dimen0 by -\parskip - \fi - \advance\dimen0 by -\pagetotal - \advance\dimen0 by -\@@agbovenoffset - \advance\dimen0 by -\@@agonderoffset - \ifdim\dimen0>2\lineheight - \ifdim\ht0>\dimen0 - \setbox2=\vsplit0 to \dimen0 - \backgroundsplittrue - \else - \setbox2=\box0 - \backgroundsplitfalse - \fi - \else - \setbox2=\box0 - \backgroundsplitfalse - \fi - \setbox2=\vbox \ifbackgroundsplit to \dimen0 \fi - {\vskip\@@agbovenoffset - \dimen0=\dp\strutbox - \advance\dimen0 by -\dp0 - \popsplitcolor - \ifbackgroundsplit\unvbox\else\box\fi2 - \ifdim\dimen0>\!!zeropoint - \vskip\dimen0 - \fi - \vskip\@@agonderoffset - \vss} - \vskip\dimen8 % looks better - \witruimte - \ifbackgroundsplit\ifdim\pagegoal<\maxdimen - \pagegoal=1.1\pagegoal % be a bit more tolerant - \fi\fi - \localframed[\??ag][\c!offset=\v!overlay] - {\hskip\@@aglinkeroffset\box2\hskip\@@agrechteroffset}% - \ifbackgroundsplit - \pagina - \fi - \ifdim\ht0>\!!zeropoint \repeat - \egroup} - -%D As a bonus we also have a short command, that is of not -%D much use, but kept there for historic reasons. -%D -%D \showsetup{\y!background} - -\def\dobackground% - {\bgroup - \dowithnextbox - {\localframed - [\??ag][\c!offset=\v!overlay] - {\box\nextbox}% - \egroup} - \vbox} - -%D \stopdocumentation -%D \stopachtergrond -%D \egroup - -%D \macros -%D {copyright, registered} -%D -%D Some not so robust left||overs (borrowed from Knuth, -%D \TEX Book\ page 356): - -\def\omcirkeld#1% - {{\ooalign{\hfil\raise0.07ex\hbox{{\tfx#1}}\hfil\crcr\mathhexbox20D}}} - -\def\copyright% - {\omcirkeld{C}} - -\def\registered% - {\omcirkeld{R}} - -% \setuprules -% [\c!dikte=\v!middel] - -\setuplinewidth - [\v!middel] - -\setupframed - [\c!breedte=\v!passend, - \c!hoogte=\v!ruim, - \c!offset=0.25ex, - \c!leeg=\v!nee, - \c!kader=\v!aan, - \c!bovenkader=, - \c!onderkader=, - \c!linkerkader=, - \c!rechterkader=, - \c!straal=.5\bodyfontsize, - \c!lijndikte=\linewidth, - \c!hoek=\v!recht, - \c!diepte=\!!zeropoint, - \c!achtergrond=, - \c!achtergrondraster=\@@rsraster, - \c!achtergrondkleur=, - \c!achtergrondoffset=\!!zeropoint, - \c!kaderkleur=, - \c!kaderoffset=\!!zeropoint, - \c!uitlijnen=, - \c!onder=\vss, - \c!boven=, - \c!strut=\v!ja, - \c!plaats=\v!normaal] - -\setupscreens - [\c!factor=1.0, - \c!methode=\v!extern, % \c!methode=\v!punt - \c!raster=0.95] - -\setupblackrules - [\c!n=1, - \c!breedte=1em, - \c!hoogte=1ex, - \c!diepte=\!!zeropoint, - \c!variant=\c!a, - \c!afstand=.25ex] - -\setupmarginrules - [\c!niveau=0, - \c!dikte=\@@kadefaultwidth\linewidth] - -\setupthinrules - [\c!afstand=\v!klein, - \c!n=3, - \c!hoogte=.5\linewidth, - \c!diepte=\@@dlhoogte, - \c!voor=, - \c!na=] - -\setuptextrules - [\c!plaats=\v!links, - \c!voor=\blanko, - \c!na=\blanko, - \c!tussen=, - \c!breedte=2em, - \c!letter=\v!vet, - \c!kleur=, - \c!lijnkleur=, - \c!korps=, - \c!afstand=.5em] - -\setupfillinrules - [\c!breedte=\v!ruim, - \c!afstand=1em, - \c!voor=\blanko, - \c!na=\blanko, - \c!n=1, - \c!scheider=, - \c!letter=\v!normaal, - \c!kleur=] - -\setupfillinlines - [\c!breedte=3cm, - \c!marge=\@@ivbreedte, - \c!afstand=1em, - \c!voor=\blanko, - \c!na=\blanko] - -\setupbackground - [\c!linkeroffset=.5\bodyfontsize, - \c!rechteroffset=\@@aglinkeroffset, - \c!bovenoffset=\!!zeropoint, - \c!onderoffset=\@@agbovenoffset, - \c!status=\v!start, - \c!straal=.5\bodyfontsize, - \c!hoek=\v!recht, - \c!kader=\v!uit, - \c!diepte=\!!zeropoint, - \c!achtergrond=\v!raster, - \c!kleur=, - \c!achtergrondkleur=\@@agkleur, - \c!raster=\@@rsraster] - -\protect - -\endinput +%D \module
+%D [ file=core-rul,
+%D version=1997.09.05,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Ruled Stuff Handling,
+%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 Core Macros / Ruled Stuff Handling}
+
+\unprotect
+
+%D \macros
+%D {linewidth, setuplinewidth}
+%D
+%D This module deals with rules (lines) in several ways. First
+%D we introduce two macros that can be used to set some common
+%D characteristics.
+%D
+%D \showsetup{\y!setuplinewidth}
+%D
+%D The linewidth is available in \type{\linewidth}. The
+%D preset value of .4pt equals the default hard coded \TEX\
+%D rule width.
+
+\newdimen\linewidth
+
+\def\dosetuplinewidth[#1]%
+ {\assigndimension{#1}{\linewidth}{0.2pt}{0.4pt}{0.6pt}}
+
+\def\setuplinewidth%
+ {\dosingleargument\dosetuplinewidth}
+
+% \def\dosetuprules[#1]%
+% {\getparameters[\??ln][#1]%
+% \setuplinewidth[\@@lndikte]}
+%
+% \def\setuprules%
+% {\dosingleargument\dosetuprules}
+
+%D \TEX\ lacks support for color and even gray scales. The next
+%D macros can provide a sort of poor mans gray scales as well
+%D as give access to more suitable methods of rendering. Such a
+%D method looks like:
+%D
+%D \starttypen
+%D \def\methodegraybox
+%D \width#1\height#2\depth#3\raster#4\corner#5\radius#6\\%
+%D { ... }
+%D \stoptypen
+%D
+%D The string \type{graybox} is a common element in the name,
+%D so we can have for instance \type {\postscriptgraybox} or
+%D \type {\texgraybox}. The first three arguments take a
+%D dimension, the fourth one takes a number between~0 and~1,
+%D and the last argument specifies a radius of the box when
+%D rounded corners are used, so:
+%D
+%D \startbuffer
+%D \periodgraybox
+%D \width.5\hsize\height1cm\depth0cm\raster.85\corner\v!nee\radius0pt\\
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D becomes:
+%D
+%D %\startregelcorrectie
+%D % \vbox to 1cm{\haalbuffer}
+%D %\stopregelcorrectie
+%D
+%D \startregelcorrectie
+%D \unprotect
+%D \vbox to 1cm
+%D {\getvalue{\v!punt graybox}%
+%D \width.5\hsize\height1cm\depth0cm\raster.85\corner\v!nee\radius0pt\\}
+%D \protect
+%D \stopregelcorrectie
+%D
+%D There are two predefined methodes, one uses periods and the
+%D other uses small rules. The second method is less
+%D efficient, but sometimes give better results. The dimensions
+%D of the resullting box are set to zero.
+
+\setvalue{\v!punt graybox}%
+ {\processraster\symbol\rasterdot}
+
+\setvalue{\v!lijn graybox}%
+ {\processraster\symbol\rasterbox}
+
+\def\rasterdot%
+ {\rasterfont.}
+
+\def\rasterbox%
+ {\hss\vrule\!!width.4pt\!!height.4pt\!!depth\!!zeropoint}
+
+%D Now of course we need:
+
+\ifx\rasterfont\undefined \def\rasterfont{\fivepoint} \fi
+
+%D We implement two pure \TEX\ based generators, that use
+%D \type{\leaders} to quickly gerenate the gray pattern. One
+%D should beware of \DIMENSION\ conflicts, so we use some
+%D registers above~8. These macros are memory hungry and byte
+%D spoiling.
+
+\def\processraster
+ \symbol#1\width#2\height#3\depth#4\raster#5\corner#6\radius#7\\%
+ {\bgroup
+ \forgetall
+ \mindermeldingen
+ \dimen10=\!!onepoint
+ \dimen10=\@@rsfactor\dimen10
+ \dimen10=#5\dimen10
+ \setbox2=\hbox to #2
+ {\cleaders\hbox to 2\dimen10{#1\hss}\hss}%
+ \dimen12=#3%
+ \advance\dimen12 by #4%
+ \setbox0=\vbox to \dimen12
+ {\cleaders\vbox to 2\dimen10{\box2\vss}\vss}%
+ \setbox0=\hbox
+ {\hskip-.5\dimen10\lower0.5\dimen10\copy0
+ \hskip-\wd0\hskip\dimen10\lower1.5\dimen10\box0}%
+ \box0
+ \egroup}
+
+%D \macros
+%D {setupscreens}
+%D
+%D The previous macro uses a predefined constant
+%D \type{\@@rsfactor}. This factor can be set by:
+%D
+%D \showsetup{\y!setupscreens}
+
+\def\setupscreens%
+ {\dodoubleargument\getparameters[\??rs]}
+
+%D The most appropriate way to call for this feature is
+%D using \type{\graybox}, which is defined as:
+
+\def\graybox{\getvalue{\@@rsmethode graybox}}
+
+%D This macro takes the five arguments mentioned earlier and
+%D obey the user's settings.
+
+%D We just introduced two pure \TEX\ methods for generating
+%D rasters. However, it's far more efficient and comfortable in
+%D terms of speed, memory usage and file size, to use a driver
+%D supported method.
+
+\setvalue{\v!extern graybox}\width#1\height#2\depth#3\raster#4\corner#5\radius#6\\%
+ {\setgraybox\width#1\height#2\depth#3\raster#4\corner#5\radius#6\\}
+
+%D For compatibility reasons we also define the original one:
+
+\setvalue{\v!postscript graybox}%
+ {\getvalue{\v!extern graybox}}
+
+%D A quite valid way of letting drivers do the job, is giving
+%D a solid rule a gray texture.
+
+\def\setgraybox\width#1\height#2\depth#3\raster#4\corner#5\radius#6\\%
+ {\startraster[#4]%
+ \dofilledbox\width#1\height#2\depth#3\corner#5\radius#6\\%
+ \stopraster}
+
+%D We don't have to stick to a \TEX\ drawn rule, but
+%D also can use rounded or even fancier shapes, as we will
+%D see later on.
+
+\def\dofilledbox\width#1\height#2\depth#3\corner#4\radius#5\\%
+ {\bgroup
+ \doifelse{#4}{\v!rond}
+ {\dimen0=#5\relax % just in case of .x\bodyfontsize
+ \ifdim\dimen0=\!!zeropoint
+ \dofilledlinedbox\width#1\height#2\depth#3\\%
+ \else
+ \dofilledroundbox\width#1\height#2\depth#3\radius#5\\%
+ \fi}
+ {\dofilledlinedbox\width#1\height#2\depth#3\\}%
+ \egroup}
+
+\def\dofilledlinedbox\width#1\height#2\depth#3\\%
+ {\vrule\!!width#1\!!height#2\!!depth#3}%
+
+\def\dofilledroundbox\width#1\height#2\depth#3\radius#4\\%
+ {\ovalbox{#1}{#2}{#3}{\linewidth}{#4}{\v!nee}{\v!ja}}
+
+\def\ovalbox#1#2#3#4#5#6#7%
+ {\bgroup
+ \scratchdimen=#1\edef\ovalwid{\number\scratchdimen}%
+ \scratchdimen=#2\edef\ovalhei{\number\scratchdimen}%
+ \scratchdimen=#3\edef\ovaldep{\number\scratchdimen}%
+ \scratchdimen=#4\edef\ovallin{\number\scratchdimen}%
+ \scratchdimen=#5\edef\ovalrad{\number\scratchdimen}%
+ \doifelse{#6}{\v!ja} % will be a macro that handles
+ {\def\ovalstr{1}} % start, stop, ja, nee, aan, uit
+ {\def\ovalstr{0}}% % and something \doif
+ \doifelse{#7}{\v!ja}
+ {\def\ovalfil{1}}
+ {\def\ovalfil{0}}%
+ \doovalbox
+ {\ovalwid}{\ovalhei}{\ovaldep}
+ {\ovallin}{\ovalrad}
+ {\ovalstr}{\ovalfil}%
+ \egroup}
+
+%D The oval box is drawn using a special macro, depending on
+%D the driver in use.
+
+%D It won't be a surprise that we not only provide gray boxes,
+%D but also colored ones. Here it is:
+
+\def\setcolorbox\width#1\height#2\depth#3\color#4\corner#5\radius#6\\%
+ {\ifincolor
+ \doifsomething{#4}
+ {\startcolor[#4]%
+ \dofilledbox\width#1\height#2\depth#3\corner#5\radius#6\\%
+ \stopcolor}%
+ \else
+ \dofilledbox\width#1\height#2\depth#3\corner#5\radius#6\\%
+ \fi}
+
+\def\colorbox%
+ {\setcolorbox}
+
+%D \macros
+%D {defineoverlay,
+%D overlaywidth, overlayheight, overlaydepth,
+%D overlaycolor}
+%D
+%D Before we define the macro that actually takes card of the
+%D backgrounds, we introduce overlays. An overlay is something
+%D that contrary to its name lays {\em under} the text. An
+%D example of an overlay definition is:
+%D
+%D \startbuffer[tmp-1]
+%D \defineoverlay
+%D [fancy]
+%D [{\externfiguur
+%D [gene-011]
+%D [type=eps,methode=mps,
+%D breedte=\overlaywidth,
+%D hoogte=\overlayheight]}]
+%D \stopbuffer
+%D
+%D \typebuffer[tmp-1]
+%D
+%D That for instance can be uses in:
+%D
+%D \startbuffer[tmp-2]
+%D \omlijnd[achtergrond=fancy]{How Fancy!}
+%D \omlijnd[achtergrond=fancy,kader=uit]{Even More Fancy!}
+%D \stopbuffer
+%D
+%D and looks like:
+%D
+%D \startregelcorrectie
+%D \vbox{\baselineskip24pt\haalbuffer[tmp-1]\haalbuffer[tmp-2]}
+%D \stopregelcorrectie
+%D
+%D The formal definition is:
+%D
+%D \showsetup{\y!defineoverlay}
+%D
+%D This macro's definition is a bit obscure, due the many
+%D non||used arguments and the two step call that enable the
+%D setting of the width, height and depth variables.
+%D Multiple backgrounds are possible and are specified as:
+%D
+%D \starttypen
+%D \omlijnd[achtergrond={one,two,three}]{Three backgrounds!}
+%D \stoptypen
+%D
+%D Most drawing packages only know width and height. Therefore
+%D the dimensions have a slightly different meaning here:
+%D
+%D \startopsomming[opelkaar]
+%D \som \type{\overlaywidth }: width of the overlay
+%D \som \type{\overlayheight}: height plus depth of the overlay
+%D \som \type{\overlaydepth }: depth of the overlay
+%D \stopopsomming
+%D
+%D The resulting box is lowered to the right depth.
+
+\def\defineoverlay%
+ {\dodoubleargument\dodefineoverlay}
+
+\def\dodefineoverlay[#1][#2]%
+ {\def\docommando##1%
+ {\setvalue{executeoverlay##1}{\executedefinedoverlay##1\\#2\\}}%
+ \processcommalist[#1]\docommando}
+
+\long\def\executedefinedoverlay#1\\#2\\#3#4#5#6#7#8#9%
+ {\bgroup
+ \scratchdimen=#3%
+ \edef\overlaywidth {\the\scratchdimen}%
+ \scratchdimen=#4%
+ \advance\scratchdimen by #5%
+ \edef\overlayheight{\the\scratchdimen}%
+ \scratchdimen=#5%
+ \edef\overlaydepth {\the\scratchdimen}%
+ \edef\overlaycolor{#6}%
+ %\writestatus
+ % {overlay}
+ % {#1\space w=\overlaywidth/h+d=\overlayheight/d=\overlaydepth]}%
+ \setbox0=\hbox{\lower\overlaydepth\hbox{#2}}%
+ \dimen0=\wd0 \advance\dimen0 by -\overlaywidth
+ \dimen2=\ht0 \advance\dimen2 by -\overlayheight
+ \wd0=\overlaywidth
+ \ht0=\overlayheight
+ \dp0=\overlaydepth
+ \setbox0=\hbox{\hskip-.5\dimen0\raise-.5\dimen2\box0}%
+ \wd0=\overlaywidth
+ \ht0=\overlayheight
+ \dp0=\overlaydepth
+ \box0
+ \egroup}
+
+%D The empty case is:
+
+\def\executeoverlay#1#2#3#4#5#6#7%
+ {}
+
+%D We predefine two already familiar backgrounds:
+
+\setvalue{executeoverlay\v!raster}#1#2#3#4#5#6#7%
+ {\graybox\width#1\height#2\depth#3\raster#5\corner#6\radius#7\\}
+
+\setvalue{executeoverlay\v!kleur}#1#2#3#4#5#6#7%
+ {\colorbox\width#1\height#2\depth#3\color#4\corner#6\radius#7\\}
+
+%D After all these preparations, the background macro does no
+%D bring to many surprises. One has to keep in mind that this
+%D macro starts up a call chain, depending on the background
+%D one needs:
+%D
+%D \startopsomming[opelkaar]
+%D \som a raster, color or user defined shape
+%D \som square or round corners
+%D \som a \TEX\ or driver based method
+%D \stopopsomming
+%D
+%D Here we go:
+
+\newbox\extraframebox
+
+\def\dodobackgroundbox#1#2#3#4#5#6%
+ {\bgroup
+ \setbox\extraframebox=\hbox
+ {\executeifdefined{executeoverlay#1}\gobblesevenarguments
+ {\dimen2}{\dimen4}{\dimen6}{#3}{#4}{#5}{#6}}%
+ \setbox\extraframebox=\hbox
+ {\vbox{\moveleft\dimen0\box\extraframebox}}%
+ \wd\extraframebox=\wd#2%
+ \ht\extraframebox=\ht#2%
+ \dp\extraframebox=\dp#2%
+ \box\extraframebox\hskip-\wd#2%
+ \egroup}
+
+\def\dobackgroundbox#1\background#2\color#3\raster#4\offset#5\corner
+ #6\radius#7\depth#8\\%
+ {\vbox
+ {\dimen0=#5\relax
+ \dimen2=\wd#1\advance\dimen2 by 2\dimen0
+ \dimen4=\ht#1\advance\dimen4 by \dimen0
+ \dimen6=\dp#1\advance\dimen6 by \dimen0\advance\dimen6 by #8\relax
+ \def\docommando##1%
+ {\dodobackgroundbox{##1}{#1}{#3}{#4}{#6}{#7}}%
+ \hbox
+ {\expanded{\rawprocesscommalist[#2]\noexpand\docommando}%
+ \box#1}}}
+
+%D We can specify overlays as a comma separated list of
+%D overlays, a sometimes handy feature.
+
+%D Besides backgrounds (overlays) we also need some macros to
+%D draw outlines (ruled borders). Again we have to deal with
+%D square and round corners. The first category can be handled
+%D by \TEX\ itself, the latter one depends on the driver.
+
+\def\dooutlinebox#1\color#2\offset#3\corner#4\radius#5\depth#6\toggle#7\\%
+ {\vbox % rules on top of box
+ {\dimen0=#3\relax
+ \dimen2=\wd#1\advance\dimen2 by 2\dimen0
+ \dimen4=\ht#1\advance\dimen4 by \dimen0
+ \dimen6=\dp#1\advance\dimen6 by \dimen0\advance\dimen6 by #6\relax
+ \setbox\extraframebox=\hbox
+ {\dostrokedbox\width\dimen2\height\dimen4\depth\dimen6%
+ \corner#4\radius#5\toggle#7\\}%
+ \setbox\extraframebox=\hbox
+ {\vbox{\moveleft#3\box\extraframebox}}%
+ \wd\extraframebox=\wd#1%
+ \ht\extraframebox=\ht#1%
+ \dp\extraframebox=\dp#1%
+ \hbox
+ {\copy#1\hskip-\wd#1%
+ \doifelsenothing{#2} % speeds up a little
+ {\box\extraframebox}
+ {\color[#2]{\box\extraframebox}}}}}
+
+\def\dostrokedbox\width#1\height#2\depth#3\corner#4\radius#5\toggle#6\\%
+ {\bgroup
+ \doifelse{#4}{\v!rond}
+ {\dimen0=#5\relax % just in case of .x\bodyfontsize
+ \ifdim\dimen0=\!!zeropoint
+ \dostrokedlinedbox\width#1\height#2\depth#3\toggle#6\\%
+ \else
+ \dostrokedroundbox\width#1\height#2\depth#3\radius#5\\%
+ \fi}
+ {\dostrokedlinedbox\width#1\height#2\depth#3\toggle#6\\}%
+ \egroup}
+
+%D The toggle argument in these calls concern the individual
+%D rules: left, right, top and bottom. Each cna be turned on,
+%D depending on the general state (\type{#4}) or the individual
+%D ones (\type{#5}, \type{#6}, \type{#7} and \type{#8}).
+
+\def\dostrokedlinedbox\width#1\height#2\depth#3\toggle
+ #4\left#5\right#6\top#7\bottom#8\\%
+ {\bgroup
+ \setbox0=\null\wd0=#1\ht0=#2\dp0=#3%
+ \setbox2=\vbox
+ {\getvalue{t\@@frame@@#4#7}%
+ \hbox
+ {\getvalue{l\@@frame@@#4#5}%
+ \box0%
+ \getvalue{r\@@frame@@#4#6}}
+ \getvalue{b\@@frame@@#4#8}}%
+ \wd2=#1\ht2=#2\dp2=#3%
+ \box2
+ \egroup}
+
+\def\@@frame@@{@@frame@@}
+
+\setvalue{t\@@frame@@\v!aan\v!aan}{\hrule\!!height\linewidth\kern-\linewidth}
+\setvalue{t\@@frame@@\v!uit\v!aan}{\hrule\!!height\linewidth\kern-\linewidth}
+ \setvalue{t\@@frame@@\v!aan}{\hrule\!!height\linewidth\kern-\linewidth}
+\setvalue{b\@@frame@@\v!aan\v!aan}{\kern-\linewidth\hrule\!!height\linewidth}
+\setvalue{b\@@frame@@\v!uit\v!aan}{\kern-\linewidth\hrule\!!height\linewidth}
+ \setvalue{b\@@frame@@\v!aan}{\kern-\linewidth\hrule\!!height\linewidth}
+\setvalue{l\@@frame@@\v!aan\v!aan}{\vrule\!!width\linewidth\kern-\linewidth}
+\setvalue{l\@@frame@@\v!uit\v!aan}{\vrule\!!width\linewidth\kern-\linewidth}
+ \setvalue{l\@@frame@@\v!aan}{\vrule\!!width\linewidth\kern-\linewidth}
+\setvalue{r\@@frame@@\v!aan\v!aan}{\kern-\linewidth\vrule\!!width\linewidth}
+\setvalue{r\@@frame@@\v!uit\v!aan}{\kern-\linewidth\vrule\!!width\linewidth}
+ \setvalue{r\@@frame@@\v!aan}{\kern-\linewidth\vrule\!!width\linewidth}
+
+%D I condidered using the low level support command
+%D \type{\ruledhbox}, but this would slow down processing by a
+%D factor~3.
+
+%D Before we come to using these macros we yet have to define
+%D the rounded corner alternative, which after all is not that
+%D hard because it uses the previously defined macro \type
+%D {\ovalbox}.
+
+\def\dostrokedroundbox\width#1\height#2\depth#3\radius#4\\%
+ {\ovalbox{#1}{#2}{#3}{\linewidth}{#4}{\v!ja}{\v!nee}}
+
+%D The next few macros are probably the most misused ones in
+%D \CONTEXT. They deal with putting rules around boxes, provide
+%D backgrounds, offer alignment features, and some more. We
+%D start with defining some booleans. These give an impression
+%D of what we are going to take into account.
+
+\newif\ifboxhasoffset
+\newif\ifboxhaswidth
+\newif\ifboxhasheight
+\newif\ifboxhasformat
+\newif\ifboxhasstrut
+\newif\ifboxisoverlaid
+
+%D We also need a few \DIMENSIONS:
+
+\newdimen\@@localoffset
+\newdimen\@@globalwidth
+
+%D The content of the box will be (temporary) saved in a box:
+
+\newbox\framebox
+
+%D We also need a box for outlines and backgrounds:
+
+\newbox\extraframebox
+
+%D \macros
+%D {framed, setupframed}
+%D
+%D Ruled boxes are typeset using \type{\framed}. This command
+%D is quite versatile and, although some users will probably
+%D seldom use it, one cannot overlook its features.
+%D
+%D \showsetup{\y!setupframed}
+%D \showsetup{\y!framed}
+%D
+%D This general macro is a special version of an even more
+%D general case, that can easily be linked into other macros
+%D that need some kind of framing. The local version is called
+%D with an extra parameter: the variable identifier. The reason
+%D for passing this identifier between brackets lays in the
+%D mere fact that this way we can use the optional argument
+%D grabbers.
+
+\unexpanded\def\framed%
+ {\bgroup
+ \presetlocalframed[\??ol]%
+ \dodoubleempty\startlocalframed[\??ol]}
+
+\def\presetlocalframed[#1]%
+ {\copylocalframed[#1][\??oi]}
+
+\def\copylocalframed[#1]#2[#3]%
+ {\copyparameters[#1][#3]
+ [\c!breedte,\c!hoogte,\c!offset,\c!leeg,
+ \c!straal,\c!hoek,\c!diepte,\c!kader,\c!kaderkleur,
+ \c!bovenkader,\c!onderkader,\c!linkerkader,\c!rechterkader,
+ \c!lijndikte,\c!kaderoffset,\c!achtergrondoffset,
+ \c!achtergrond,\c!achtergrondraster,\c!achtergrondkleur,
+ \c!uitlijnen,\c!onder,\c!boven,\c!strut,\c!plaats]%
+ \copyparameters[#1\c!achtergrond][#1]
+ [\c!straal,\c!hoek,\c!diepte]%
+ \copyparameters[#1\c!kader][#1]
+ [\c!straal,\c!hoek,\c!diepte]}
+
+\def\setupframed%
+ {\dodoubleargument\getparameters[\??oi]}
+
+%D The normal case first presets all parameters and next starts
+%D looking for the user supplied ones. The first step is
+%D omitted in the local case, because these are preset at
+%D declaration time and keep their values unless explictly
+%D changed. By presetting the variables everytime the normal
+%D command is called, we can use this command nested, without
+%D the unwanted side effect of inheritance.
+
+\def\localframed%
+ {\bgroup
+ \dodoubleargument\startlocalframed}
+
+%D Before we go into details, we present (and implement) the
+%D main framing routine. I saw no real reason for splitting the
+%D next two macros into smaller pieces. The content will be
+%D collected in a horizontal or vertical box with fixed or free
+%D dimensions and specific settings concerning aligment and
+%D offsets.
+
+\def\startlocalframed[#1][#2]%
+ {\bgroup
+ \edef\@@framed{#1}%
+ \getparameters[\@@framed][#2]%
+ \edef\localoffset{\getvalue{\@@framed\c!offset}}%
+ \edef\localwidth{\getvalue{\@@framed\c!breedte}}%
+ \edef\localheight{\getvalue{\@@framed\c!hoogte}}%
+ \edef\localformat{\getvalue{\@@framed\c!uitlijnen}}%
+ \edef\localstrut{\getvalue{\@@framed\c!strut}}%
+ \doifvaluesomething{\@@framed\c!lijndikte}
+ {\linewidth=\getvalue{\@@framed\c!lijndikte}}%
+ \doifelsenothing{\localformat}
+ {\boxhasformatfalse}
+ {\boxhasformattrue
+ \edef\beforeframedbox{\getvalue{\@@framed\c!boven}}%
+ \edef\afterframedbox{\getvalue{\@@framed\c!onder}}%
+ \dosetraggedcommand{\localformat}}%
+ \doifelse{\localoffset}{\v!geen}
+ {\boxhasoffsetfalse
+ \boxhasstrutfalse
+ \boxisoverlaidfalse
+ \@@localoffset=\linewidth}
+ {\doifelse{\localoffset}{\v!overlay}
+ {\boxhasoffsetfalse
+ \boxhasstrutfalse
+ \boxisoverlaidtrue
+ \@@localoffset=\!!zeropoint}
+ {\boxhasoffsettrue
+ \boxhasstruttrue
+ \boxisoverlaidfalse
+ \@@localoffset=\localoffset
+ \advance\@@localoffset by \linewidth}}%
+ \doifelse{\localwidth}{\v!passend}
+ {\ifboxhasformat
+ \boxhaswidthtrue
+ \!!widtha=\hsize
+ \else
+ \boxhaswidthfalse
+ \fi}
+ {\doifelse{\localwidth}{\v!ruim}
+ {\boxhaswidthtrue
+ \!!widtha=\hsize}
+ {\boxhaswidthtrue
+ \!!widtha=\localwidth}}%
+ \doifelse{\localheight}{\v!passend}
+ {\boxhasheightfalse} % no longer: \boxhasstrutfalse
+ {\doifelse{\localheight}{\v!ruim}
+ {\boxhasheightfalse}
+ {\boxhasheighttrue
+ \!!heighta=\localheight}}%
+ \ifdim\!!widtha=\hsize
+ \parindent=\!!zeropoint
+ \setlocalhsize
+ \!!widtha=\localhsize
+ \fi
+ \advance\!!widtha by -2\@@localoffset
+ \advance\!!heighta by -2\@@localoffset
+ \doif{\localstrut}{\v!nee}
+ {\boxhasstrutfalse}%
+ \ifboxhasstrut
+ \setstrut
+ \let\localbegstrut=\begstrut
+ \let\localendstrut=\endstrut
+ \let\localstrut =\strut
+ \else
+ \let\localbegstrut=\relax
+ \let\localendstrut=\relax
+ \let\localstrut =\relax
+ \fi
+ \ifboxhasheight
+ \let\\=\vboxednewline
+ \ifboxhaswidth
+ \let\hairline=\vboxedhairline
+ \ifboxhasformat
+ \let\next=\doformatboxSomeFormat
+ \else
+ \let\next=\doformatboxNoFormat
+ \fi
+ \else
+ \let\hairline=\hboxedhairline
+ \ifboxhasformat
+ \let\next=\doformatboxHeight
+ \else
+ \let\next=\doformatboxVSize
+ \fi
+ \fi
+ \else
+ \ifboxhaswidth
+ \ifboxhasformat
+ \let\hairline=\vboxedhairline
+ \let\\=\vboxednewline
+ \let\next=\doformatboxWidth
+ \else
+ \let\hairline=\hboxedhairline
+ \let\\=\hboxednewline
+ \let\next=\doformatboxHSize
+ \fi
+ \else
+ \let\hairline=\hboxedhairline
+ \let\\=\hboxednewline
+ \let\next=\doformatboxNoSize
+ \fi
+ \fi
+ \def\dowithframedbox{\aftergroup\stoplocalframed}%
+ \afterassignment\dowithframedbox
+ \setbox\framebox=\next}
+
+%D Carefull analysis of this macro will learn us that not all
+%D branches in the last conditionals can be encountered, that
+%D is, some assignments to \type{\next} will never occur.
+%D Nevertheless we implement the whole scheme, if not for
+%D future extensions.
+%D
+%D The last few lines tell what to do after the content of the
+%D box is collected and passed to the next macro. In the case
+%D of a fixed width and centered alignment, the content is
+%D evaluated and used to determine the most natural width. The
+%D rest of the code deals with backgrounds and frames.
+
+\def\stoplocalframed%
+ {\dontshowcomposition
+ \ifboxhasformat
+ \doif{\localwidth}{\v!passend}
+ {\doreshapeframedbox
+ \boxhaswidthfalse}%
+ \fi
+ \ifboxhaswidth
+ \wd\framebox=\!!widtha
+ \fi
+ \ifboxhasheight
+ \ht\framebox=\!!heighta
+ \fi
+ \doifvalue{\@@framed\c!leeg}{\v!ja}
+ {\setbox0=\null
+ \wd0=\wd\framebox \ht0=\ht\framebox \dp0=\dp\framebox
+ \setbox\framebox=\box0\relax}%
+ \ifboxhasoffset
+ \dooffsetframebox
+ \fi
+ \ifboxisoverlaid \else
+ \dolocateframebox
+ \fi
+ \doframedbox
+ \doifvaluesomething{\@@framed\c!achtergrond}
+ {\dobackedbox}%
+ \doifvalue{\@@framed\c!plaats}{\v!laag}
+ {\doinlineframedbox}%
+ \box\framebox
+ \egroup
+ \egroup}
+
+%D The last conditional takes care of the special situation of
+%D in||line \inframed[hoogte=3cm]{framed} boxes. Such boxes have
+%D to be \inframed{aligned} with the running text.
+
+\def\doinframed[#1]% we could omit #1] but readibility ...
+ {\framed[\c!plaats=\v!laag,#1]}
+
+\unexpanded\def\inframed%
+ {\dosingleempty\doinframed}
+
+%D When we set \type{\c!leeg} to \type{\v!ja}, we get
+%D ourselves a frame and/or background, but no content, so
+%D actually we have a sort of phantom framed box.
+
+%D This previous framing macros needs a lot of alternatives for
+%D putting rules around boxes, inserting offsets and aligning
+%D text. Each step is handled by separate macros.
+
+\def\dooffsetframebox%
+ {\doifinstringelse{\getvalue{\@@framed\c!offset}}{\v!geen\c!offset}
+ {}{\doifelsevaluenothing{\@@framed\c!offset}
+ {}{\edef\do{\kern\getvalue{\@@framed\c!offset}}%
+ \setbox\framebox=\vbox{\do\hbox{\do\box\framebox\do}\do}}}}
+
+\def\dolocateframebox%
+ {\setbox\framebox=\vbox
+ {\kern\linewidth
+ \hbox{\kern\linewidth\box\framebox\kern\linewidth}
+ \kern\linewidth}}
+
+%D Let's hope that the next few examples show us enough of
+%D what needs to be done by the auxiliary macros.
+%D
+%D \startbuffer
+%D \framed[hoogte=1cm,offset=.5cm] {rule based learning}
+%D \framed[hoogte=1cm,offset=0cm] {rule based learning}
+%D \framed[hoogte=1cm,offset=geen] {rule based learning}
+%D \framed[hoogte=1cm,offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startregelcorrectie
+%D \hbox{\haalbuffer}
+%D \stopregelcorrectie
+%D
+%D \startbuffer
+%D \framed[offset=.5cm] {rule based learning}
+%D \framed[offset=0cm] {rule based learning}
+%D \framed[offset=geen] {rule based learning}
+%D \framed[offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startregelcorrectie
+%D \hbox{\haalbuffer}
+%D \stopregelcorrectie
+%D
+%D \startbuffer
+%D \framed[strut=nee,offset=.5cm] {rule based learning}
+%D \framed[strut=nee,offset=0cm] {rule based learning}
+%D \framed[strut=nee,offset=geen] {rule based learning}
+%D \framed[strut=nee,offset=overlay]{rule based learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startregelcorrectie
+%D \hbox{\haalbuffer}
+%D \stopregelcorrectie
+%D
+%D \startbuffer
+%D \framed[breedte=3cm,uitlijnen=links] {rule\\based\\learning}
+%D \framed[breedte=3cm,uitlijnen=midden] {rule\\based\\learning}
+%D \framed[breedte=3cm,uitlijnen=rechts] {rule\\based\\learning}
+%D \framed[breedte=passend,uitlijnen=midden] {rule\\based\\learning}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startregelcorrectie
+%D \hbox{\mindermeldingen\haalbuffer}
+%D \stopregelcorrectie
+%D
+%D So now we're ready for the complicated stuff. We distinguish
+%D between borders with straight lines and those with round
+%D corners. When using the first alternative it is possible to
+%D turn off one or more lines. More fancy shapes are also
+%D possible by specifying dedicated backgrounds. Turning lines
+%D on and off is implemented as efficient as possible and as a
+%D result is interface language dependant. This next
+%D implementation evolved from simpler ones. It puts for
+%D instance the rules on top of the content and provides
+%D additional offset capabilities. The lot of calls to other
+%D macros makes this mechanism not that easy to comprehend.
+
+\def\doframedbox%
+ {\setbox\framebox=\vbox
+ {\dooutlinebox\framebox
+ \color \getvalue{\@@framed\c!kaderkleur}%
+ \offset \getvalue{\@@framed\c!kaderoffset}%
+ \corner \getvalue{\@@framed\c!kaderhoek}%
+ \radius \getvalue{\@@framed\c!kaderstraal}%
+ \depth \getvalue{\@@framed\c!kaderdiepte}%
+ \toggle \getvalue{\@@framed\c!kader}%
+ \left \getvalue{\@@framed\c!linkerkader}%
+ \right \getvalue{\@@framed\c!rechterkader}%
+ \top \getvalue{\@@framed\c!bovenkader}%
+ \bottom \getvalue{\@@framed\c!onderkader}\\}}
+
+%D Getting the backgrounds right takes less code. Again we
+%D have to take care of additional offsets.
+
+\def\dobackedbox%
+ {\setbox\framebox=\vbox
+ {\dobackgroundbox\framebox
+ \background \getvalue{\@@framed\c!achtergrond}%
+ \color \getvalue{\@@framed\c!achtergrondkleur}%
+ \raster \getvalue{\@@framed\c!achtergrondraster}%
+ \offset \getvalue{\@@framed\c!achtergrondoffset}%
+ \corner \getvalue{\@@framed\c!achtergrondhoek}%
+ \radius \getvalue{\@@framed\c!achtergrondstraal}%
+ \depth \getvalue{\@@framed\c!achtergronddiepte}\\}}
+
+%D We handle left, right or middle alignment as well as fixed
+%D or free widths and heights. Each combination gets its own
+%D macro.
+
+\def\dopresetformatbox%
+ {\forgetall
+ \oninterlineskip}
+
+\def\doformatboxSomeFormat%
+ {\vbox to \!!heighta
+ \bgroup
+ \dopresetformatbox
+ \hsize\!!widtha
+ \vsize\!!heighta
+ \raggedcommand
+ \beforeframedbox
+ \bgroup
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\afterframedbox
+ \aftergroup\egroup
+ \let\next=}
+
+\def\doformatboxNoFormat%
+ {\vbox to \!!heighta
+ \bgroup
+ \dopresetformatbox
+ \hsize\!!widtha
+ \vsize\!!heighta
+ \raggedcenter
+ \vss
+ \bgroup
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\vss
+ \aftergroup\egroup
+ \let\next=}
+
+\def\doformatboxHeight%
+ {\vbox to \!!heighta
+ \bgroup
+ \dopresetformatbox
+ \raggedcommand
+ \vss
+ \bgroup
+ \aftergroup\localendstrut
+ \aftergroup\vss
+ \aftergroup\egroup
+ \localbegstrut
+ \let\next=}
+
+\def\doformatboxWidth%
+ {\vbox
+ \bgroup
+ \dopresetformatbox
+ \hsize\!!widtha
+ \raggedcommand
+ \bgroup
+ \localbegstrut
+ \aftergroup\localendstrut
+ \aftergroup\egroup
+ \let\next=}
+
+\def\doformatboxVSize%
+ {\vbox to \!!heighta
+ \bgroup
+ \forgetall
+ \vsize\!!heighta
+ \vss
+ \bgroup
+ \aftergroup\vss
+ \aftergroup\egroup
+ \hbox
+ \bgroup
+ \aftergroup\egroup
+ \localstrut
+ \let\next=}
+
+\def\doformatboxHSize%
+ {\hbox to \!!widtha
+ \bgroup
+ \forgetall
+ \hss
+ \localstrut
+ \bgroup
+ \aftergroup\hss
+ \aftergroup\egroup
+ \let\next=}
+
+\def\doformatboxNoSize%
+ {\hbox
+ \bgroup
+ \localstrut
+ \let\next=}
+
+%D On the next page we show some examples of how these macros
+%D come into action. The examples show us how
+%D \type{\v!passend}, \type{\v!ruim} dimensions influence the
+%D formatting. Watch the visualized struts. \voetnoot {Here we
+%D used \type{\toonstruts}.}
+%D
+%D \startuitstellen
+%D \bgroup
+%D \toonstruts
+%D \mindermeldingen
+%D \startregelcorrectie
+%D \halign{#\enskip&#\enskip&#\enskip&#\enskip&#\enskip&#\cr
+%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=ja] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=ja] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=ja] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=ja] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=ja] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=ja] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=rechts] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=rechts] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=rechts] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=rechts] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=rechts] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=rechts] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=links] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=links] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=links] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=links] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=links] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=links] {a\par b\par c}\cr
+%D \noalign{\vskip1em}
+%D \omlijnd[breedte=.2\hsize, hoogte=.2\hsize, uitlijnen=midden] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=ruim, uitlijnen=midden] {a\par b\par c}&
+%D \omlijnd[breedte=.2\hsize, hoogte=passend, uitlijnen=midden] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=.2\hsize, uitlijnen=midden] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=ruim, uitlijnen=midden] {a\par b\par c}&
+%D \omlijnd[breedte=passend, hoogte=passend, uitlijnen=midden] {a\par b\par c}\cr}
+%D \stopregelcorrectie
+%D \blanko[2*groot]
+%D \egroup
+%D \stopuitstellen
+
+%D It is possible to let the frame macro calculate the width
+%D of a centered box automatically (\type{\v!passend}). When
+%D doing so, we need to reshape the box:
+
+\def\doreshapeframedbox%
+ {\beginofshapebox
+ \unvcopy\framebox
+ \endofshapebox
+ \global\@@globalwidth=\!!zeropoint
+ \reshapebox
+ {\setbox0=\hbox{\unhbox\shapebox}%
+ \ifdim\wd0>\@@globalwidth
+ \global\@@globalwidth=\wd0
+ \fi}%
+ \dosetraggedcommand{\localformat}%
+ \raggedcommand
+ \setbox\framebox=\vbox
+ {\hsize\@@globalwidth
+ \reshapebox{\hbox to \hsize{\unhbox\shapebox}}%
+ \flushshapebox}%
+ \ifboxhasheight \else
+ \dp\framebox=\dp\strutbox
+ \fi}
+
+%D The examples on the next page show how one can give the
+%D frame as well as the background an additional offset and
+%D even a bit more depth. The blue outline is the frame, the
+%D red box is the background and the small black outline is the
+%D vsiualization of the resulting box, that is, we applied
+%D \type{\ruledhbox} to the result.
+
+%D \startuitstellen
+%D \bgroup
+%D \unprotect
+%D \mindermeldingen
+%D
+%D \startbuffer
+%D \vbox to \vsize
+%D \bgroup
+%D \startuitlijnen[midden]
+%D \vss
+%D \leavevmode\vbox to .8\vsize
+%D \bgroup
+%D \hsize=300pt
+%D \setupframed
+%D [\c!achtergrond=\v!kleur,
+%D \c!achtergrondkleur=DemoRed,
+%D \c!breedte=300pt,
+%D \c!hoogte=60pt,
+%D \c!kaderkleur=DemoBlue,
+%D \c!lijndikte=2pt]
+%D \def\status%
+%D {\c!achtergrondoffset=\@@olachtergrondoffset\\
+%D \c!kaderoffset=\@@olkaderoffset\\
+%D \c!diepte=\@@oldiepte}
+%D \leavevmode \ruledhbox{\framed[achtergrondoffset=0pt,kaderoffset=0pt]{\status}}
+%D \vss
+%D \leavevmode \ruledhbox{\framed[achtergrondoffset=5pt,kaderoffset=0pt]{\status}}
+%D \vss
+%D \leavevmode \ruledhbox{\framed[achtergrondoffset=0pt,kaderoffset=5pt]{\status}}
+%D \vss
+%D \leavevmode \ruledhbox{\framed[achtergrondoffset=2pt,kaderoffset=5pt]{\status}}
+%D \vss
+%D \leavevmode \ruledhbox{\framed[achtergrondoffset=5pt,kaderoffset=2pt]{\status}}
+%D \vss
+%D \leavevmode \ruledhbox{\framed[achtergrondoffset=5pt,kaderoffset=5pt]{\status}}
+%D \egroup
+%D \vss
+%D \stopuitlijnen
+%D \egroup
+%D \stopbuffer
+%D
+%D \haalbuffer
+%D
+%D {\setupframed[diepte=4pt]\haalbuffer}
+%D
+%D \protect
+%D \egroup
+%D \stopuitstellen
+
+%D When typesetting the framed box inline, we have to keep the
+%D baseline intact outside as well as inside the framed box.
+
+\def\doinlineframedbox%
+ {\getboxheight\dimen2\of\box\framebox
+ \advance\dimen2 by -\ht\strutbox
+ \dimen0=.5\dimen2
+ \ifboxhasoffset
+ \advance\dimen0 by \getvalue{\@@framed\c!offset}%
+ \fi
+ \advance\dimen0 by 2\linewidth
+ \setbox\framebox=\hbox{\lower\dimen0\box\framebox}%
+ \ht\framebox\ht\strutbox
+ \dp\framebox\dp\strutbox
+ \box\framebox}
+
+%D We can draw lines from left to right and top to bottom by
+%D using the normal \type{\hairline} command. Both directions
+%D need a different treatment.
+%D
+%D \startbuffer
+%D \framed[breedte=4cm] {alfa\hairline beta\hairline gamma}
+%D \framed[hoogte=2cm] {alfa\hairline beta\hairline gamma}
+%D \framed[breedte=4cm,hoogte=2cm]{alfa\hairline beta\hairline gamma}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startregelcorrectie
+%D \hbox{\haalbuffer}
+%D \stopregelcorrectie
+%D
+%D These macros try to adapt their behaviour as good as
+%D possible to the circumstances and act as natural as
+%D possible.
+
+\def\vboxedhairline%
+ {\bgroup
+ \dimen2=\ifboxhasoffset \localoffset \else \!!zeropoint \fi
+ \dimen4=\dimen2
+ \advance\dimen4 by \linewidth
+ \setbox0=\vbox
+ {\advance\hsize by 2\dimen4
+ \vskip\dimen2
+ \hrule
+ \!!height\linewidth
+ \!!depth\!!zeropoint
+ \!!width\hsize
+ \vskip\dimen2}%
+ \endgraf\nointerlineskip\endgraf
+ \moveleft\dimen4\box0
+ \endgraf\nointerlineskip\endgraf
+ \localbegstrut
+ \egroup}
+
+\def\hboxedhairline%
+ {\bgroup
+ \dimen2=\ifboxhasoffset \localoffset \else \!!zeropoint \fi
+ \ifboxhasheight
+ \dimen4=\localheight \divide\dimen4 by 2
+ \dimen6=\dimen4
+ \advance\dimen4 by \dp\strutbox
+ \advance\dimen6 by -\dp\strutbox
+ \advance\dimen4 by -2\linewidth
+ \advance\dimen6 by 2\linewidth
+ \else
+ \dimen4=\ht\strutbox
+ \advance\dimen4 by \dimen2
+ \dimen6=\dp\strutbox
+ \advance\dimen6 by \dimen2
+ \fi
+ \unskip
+ \setbox0=\hbox
+ {\hskip\dimen2
+ \vrule
+ \!!height\dimen4
+ \!!depth\dimen6
+ \!!width\linewidth
+ \hskip\dimen2}%
+ \ht0=\ht\strutbox
+ \dp0=\dp\strutbox
+ \box0
+ \ignorespaces
+ \egroup}
+
+%D The argument of the frame command accepts \type{\\} as a
+%D sort of newline signal. In horizontal boxes it expands to a
+%D space.
+
+\def\vboxednewline%
+ {\endgraf\ignorespaces}
+
+\def\hboxednewline%
+ {\unskip\normalspace\ignorespaces}
+
+%D We can set each rule on or off. The default setting is
+%D inherited from \type{\c!kader}. An earlier implementation
+%D use a bit different approach, but the new one seems more
+%D natural:
+%D
+%D \bgroup
+%D \steltypenin[marge=0pt]
+%D \startregelcorrectie
+%D \startbuffer
+%D \omlijnd[offset=overlay,kader=aan] {\DemoRed\blokje}
+%D \stopbuffer
+%D \hbox{\haalbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \omlijnd[offset=overlay,kader=aan,onderkader=uit]{\DemoRed\blokje}
+%D \stopbuffer
+%D \hbox{\haalbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \omlijnd[offset=overlay,kader=aan,onderkader=aan]{\DemoRed\blokje}
+%D \stopbuffer
+%D \hbox{\haalbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \omlijnd[offset=overlay,kader=uit] {\DemoRed\blokje}
+%D \stopbuffer
+%D \hbox{\haalbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \omlijnd[offset=overlay,kader=uit,onderkader=uit]{\DemoRed\blokje}
+%D \stopbuffer
+%D \hbox{\haalbuffer\vbox{\typebuffer}}
+%D
+%D \startbuffer
+%D \omlijnd[offset=overlay,kader=uit,onderkader=aan]{\DemoRed\blokje}
+%D \stopbuffer
+%D \hbox{\haalbuffer\vbox{\typebuffer}}
+%D \stopregelcorrectie
+%D \egroup
+
+%D \macros
+%D {setupblackrules}
+%D
+%D The graphic capabilities of \TEX\ do not go beyond simple
+%D filled rules, except of course when using specials. Let's
+%D start with a warning: using this commands is far more slower
+%D than using the \TEX\ primitives \type{\hrule} and
+%D \type{\vrule}, but they save us some tokens. The
+%D characteristics of these rule drawing command can be set by:
+%D
+%D \showsetup{\y!setupblackrules}
+
+\def\setupblackrules%
+ {\dodoubleargument\getparameters[\??bj]}
+
+%D \macros
+%D {blackrule}
+%D
+%D The simple command draws only one rule. Its optional
+%D argument can be used to specify the dimensions. By setting
+%D the width, height or depth to \type{\v!max}, one gets the
+%D natural dimensions.
+%D
+%D \showsetup{\y!blackrule}
+
+\def\doblackrule[#1]%
+ {\bgroup
+ \getparameters[\??bj][#1]%
+ \setstrut
+ \doif{\@@bjbreedte}{\v!max}{\def\@@bjbreedte{1em}}%
+ \doif{\@@bjhoogte} {\v!max}{\def\@@bjhoogte{\ht\strutbox}}%
+ \doif{\@@bjdiepte} {\v!max}{\def\@@bjdiepte{\dp\strutbox}}%
+ \vrule
+ \!!width\@@bjbreedte
+ \!!height\@@bjhoogte
+ \!!depth\@@bjdiepte
+ \egroup}
+
+\unexpanded\def\blackrule%
+ {\dosingleempty\doblackrule}
+
+%D \macros
+%D {blackrules}
+%D
+%D One can call for a sequence of black rules, if needed
+%D equally spaced over the given width.
+%D
+%D \showsetup{\y!blackrules}
+%D
+%D The two alternative calls are therefore:
+%D
+%D \startbuffer
+%D Tell me, is this according to the \blokjes[n=6]?
+%D These \blokjes[variant=b,n=10,afstand=.2em,breedte=4cm] are quite clear.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or:
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D We could of course have implemented this macro using
+%D \type{\leaders}, but this would probably have taken more
+%D tokens.
+
+\def\doblackrules[#1]%
+ {\bgroup
+ \getparameters[\??bj][#1]%
+ \!!widtha=\@@bjbreedte
+ \!!widthb=\@@bjafstand
+ \doif{\@@bjvariant}{\c!b}
+ {\scratchcounter=\@@bjn
+ \ifnum\scratchcounter=1
+ \!!widthb=\!!zeropoint
+ \else
+ \advance\scratchcounter by -1
+ \advance\!!widtha by -\scratchcounter\!!widthb
+ \divide\!!widtha by \@@bjn
+ \fi}%
+ \dorecurse{\@@bjn}
+ {\vrule
+ \!!width\!!widtha
+ \!!height\@@bjhoogte
+ \!!depth\@@bjdiepte
+ \hskip\!!widthb}%
+ \unskip
+ \egroup}
+
+\unexpanded\def\blackrules%
+ {\dosingleempty\doblackrules}
+
+%D The next commands can be used to draw margin rules. We
+%D support two methods: \marginrule{one for in||line use} and
+%D one that acts on a paragraph. Drawing a margin rule is
+%D rather straightforward because we can use the commands that
+%D put text in the margin.
+
+\def\dodrawmarginrule%
+ {\setbox0=\hbox
+ {\vrule
+ \!!height\strutheight
+ \!!depth\strutdepth
+ \!!width\@@kadikte}%
+ \vsmashbox0
+ \box0}
+
+\def\drawmarginrule%
+ {\strut\inlinker{\dodrawmarginrule}}
+
+%D \macros
+%D {marginrule}
+%D
+%D The first method gobbles words and simply puts a bar in the
+%D margin. This method is not entirely robust.
+%D
+%D \showsetup{\y!marginrule}
+
+\definecomplexorsimple\marginrule
+
+\def\simplemarginrule%
+ {\let\processword=\drawmarginrule
+ \processwords}
+
+\def\complexmarginrule[#1]%
+ {\ifnum#1<\@@kaniveau\relax \else
+ \def\@@kadefaultwidth{#1}%
+ \expandafter\simplemarginrule
+ \fi}
+
+%D We need an auxiliary variable
+
+\def\@@kadefaultwidth{1}
+
+%D \macros
+%D {setupmarginrules}
+%D
+%D This macro definitions show us that we can pass an optional
+%D level, which is matched against the previous set one. The
+%D level can be set up with
+%D
+%D \showsetup{\y!setupmarginrules}
+
+\def\setupmarginrules%
+ {\dodoubleargument\getparameters[\??ka]}
+
+%D \macros
+%D {startmarginrule}
+%D
+%D The second method collects text and reformats it afterwards,
+%D using the shapebox macros. We prevent local margin rules.
+%D
+%D \showsetup{\y!startmarginrule}
+
+\definecomplexorsimple\startmarginrule
+
+\def\simplestartmarginrule%
+ {\bgroup
+ \let\drawmarginrule=\relax
+ \let\stopmarginrule=\dostopmarginrule
+ \beginofshapebox}
+
+\def\complexstartmarginrule[#1]%
+ {\bgroup
+ \let\drawmarginrule=\relax
+ \ifnum#1<\@@kaniveau\relax
+ \let\stopmarginrule=\egroup
+ \else
+ \def\@@kadefaultwidth{#1}%
+ \let\stopmarginrule=\dostopmarginrule
+ \expandafter\beginofshapebox
+ \fi}
+
+\def\dostopmarginrule%
+ {\endofshapebox
+ \reshapebox
+ {\hbox{\inlinkermarge{\dodrawmarginrule}\box\shapebox}}%
+ \flushshapebox
+ \egroup}
+
+%D \startbuffer
+%D \stelkantlijnin[niveau=5]
+%D
+%D \startkantlijn[1]
+%D First we set the level at~5. Next we typeset this first
+%D paragraph as a level~1 one. As expected no rule show up.
+%D \stopkantlijn
+%D
+%D \startkantlijn[5]
+%D The second paragraph is a level~5 one. As we can se here,
+%D the marginal rule gets a width according to its level.
+%D \stopkantlijn
+%D
+%D \startkantlijn[8]
+%D It will of course be no surprise that this third paragraph
+%D has a even thicker margin rule. This behavior can be
+%D overruled by specifying the width explictly.
+%D \stopkantlijn
+%D \stopbuffer
+%D
+%D In next example we show most features. Watch the rule
+%D thickness adapting itself to the level.
+%D
+%D \startvoorbeeld
+%D \haalbuffer
+%D \stopvoorbeeld
+%D
+%D We just said:
+%D
+%D \typebuffer
+
+%D \macros
+%D {vl, hl}
+%D
+%D The command \type{\vl} draws a vertical rule \vl\ with strut
+%D dimensions, multiplied with the factor specified in the
+%D optional argument. The height and depth are clipped \vl[3]
+%D to the baselinedistance. Its horizontal counterpart
+%D \type{\hl} draws a horizontal rule \hl\ with a width of 1em,
+%D multiplied with the optional factor. The horizontal rule is
+%D drawn on top of the baseline.
+%D
+%D \showsetup{\y!vl}
+%D \showsetup{\y!hl}
+
+\def\complexvl[#1]%
+ {\bgroup
+ \dimen0=#1\ht\strutbox
+ \dimen2=#1\dp\strutbox
+ \setbox0=\hbox
+ {\vrule
+ \!!width\linewidth
+ \!!height\dimen0
+ \!!depth\dimen2}%
+ \dp0=\dp\strutbox
+ \ht0=\ht\strutbox
+ \box0
+ \egroup}
+
+\def\complexhl[#1]%
+ {\hbox
+ {\vrule
+ \!!width#1em
+ \!!height\linewidth
+ \!!depth\!!zeropoint}}
+
+\def\simplevl%
+ {\complexvl[1]}
+
+\def\simplehl%
+ {\complexhl[1]}
+
+\definecomplexorsimple\vl
+\definecomplexorsimple\hl
+
+%D \macros
+%D {hairline, thinrule, thinrules, setupthinrules}
+%D
+%D Drawing thin lines can of course easily be accomplished by
+%D the \TEX\ primitives \type{\hrule} and \type{\vrule}. The
+%D next few macros however free us from some specifications.
+%D
+%D \startbuffer
+%D some text
+%D
+%D \hairline
+%D
+%D some more text
+%D
+%D \thinrule
+%D
+%D more and more text
+%D
+%D hi \thinrule\ there
+%D
+%D and then the final text
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D becomes
+%D
+%D \startvoorbeeld
+%D \haalbuffer
+%D \stopvoorbeeld
+%D
+%D So we've got
+%D
+%D \showsetup{\y!hairline}
+%D \showsetup{\y!thinrule}
+%D
+%D Both can be set up with:
+%D
+%D \showsetup{\y!setupthinrules}
+%D
+%D We also have
+%D
+%D \showsetup{\y!thinrules}
+%D
+%D which looks like: \thinrules[n=2]
+
+\def\thinrule%
+ {\strut
+ \leaders
+ \hrule\!!height\@@dlhoogte\!!depth\@@dlhoogte
+ \hfill
+ \strut}
+
+\def\hairline%
+ {\endgraf
+ \thinrule
+ \endgraf}
+
+\def\dosetupthinrules[#1]%
+ {\getparameters[\??dl][#1]%
+ \assignvalue{\@@dlafstand}{\@@dl@@afstand}{1.0}{1.5}{2.0}}
+
+\def\setupthinrules%
+ {\dosingleargument\dosetupthinrules}
+
+\def\dothinrules[#1]%
+ {\bgroup
+ \dosetupthinrules[#1]%
+ \@@dlvoor
+ \spacing\@@dl@@afstand
+ \dorecurse
+ {\@@dln}
+ {\thinrule\ifnum\recurselevel<\@@dln\endgraf\fi}%
+ \@@dlna
+ \egroup}
+
+\def\thinrules%
+ {\dosingleempty\dothinrules}
+
+%D \macros
+%D {startframedtext, setupframedtexts,
+%D defineframedtext, start<<framedtext>>, <<framedtext>>}
+%D
+%D The general framing command we discussed previously, is not
+%D entirely suited for what we call framed texts, as for
+%D instance used in intermezzo's. The next examples show what
+%D we have in mind.
+%D
+%D \startbuffer[framed-0]
+%D \stelkadertekstenin
+%D [kader=uit,
+%D breedte=\hsize,
+%D achtergrond=raster]
+%D
+%D \startkadertekst
+%D By default the framed text is centered \dots
+%D \stopkadertekst
+%D
+%D \startkadertekst[rechts]
+%D \dots\ but we can also align left, middle and right.
+%D \stopkadertekst
+%D \stopbuffer
+%D
+%D \startbuffer[framed-1]
+%D \definieerkadertekst
+%D [Example]
+%D [breedte=6cm,
+%D hoogte=5cm]
+%D
+%D \startExample
+%D \typebuffer[framed-1]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-2]
+%D \definieerkadertekst
+%D [Example]
+%D [breedte=6cm]
+%D
+%D \startExample
+%D \typebuffer[framed-2]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-3]
+%D \definieerkadertekst
+%D [Example]
+%D [hoogte=5cm]
+%D
+%D \startExample
+%D \typebuffer[framed-3]
+%D \stopExample
+%D \stopbuffer
+%D
+%D \startbuffer[framed-4]
+%D \definieerkadertekst
+%D [Example]
+%D [breedte=passend,hoogte=ruim]
+%D
+%D \Example{a very exciting example}
+%D \stopbuffer
+%D
+%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-0] \egroup
+%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-1] \egroup
+%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-2] \egroup
+%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-3] \egroup
+%D \bgroup \steltypenin[marge=0pt] \haalbuffer[framed-4] \egroup
+%D
+%D Here we can see that we have a predefined framed text class
+%D as well as the tools for defining our own. So we have:
+%D
+%D \showsetup{\y!setupframedtexts}
+%D
+%D as well as the definition command:
+%D
+%D \showsetup{\y!defineframedtext}
+%D
+%D that generates two commands:
+%D
+%D \showsetup{\e!start<<\y!framedtext>>}
+%D \showsetup{<<\y!framedtext>>}
+%D
+%D The next definition shows the defaults.
+
+\def\dodefineframedtext[#1][#2]%
+ {\presetlocalframed[\??kd#1]%
+ \getparameters[\??kd#1]
+ [\c!breedte=0.75\hsize,
+ \c!hoogte=\v!passend,
+ \c!uitlijnen=\v!ja,
+ \c!boven=,
+ \c!onder=\vfill,
+ \c!offset=1em,
+ \c!korps=,
+ \c!letter=,
+ \c!kleur=,
+ \c!links=,
+ \c!rechts=\hfill,
+ \c!voor=\blanko,
+ \c!na=\blanko,
+ \c!binnen=,
+ \c!kader=\v!aan,
+ \c!bovenkader=,
+ \c!onderkader=,
+ \c!linkerkader=,
+ \c!rechterkader=,
+ \c!straal=.5\bodyfontsize,
+ \c!hoek=\v!recht,
+ \c!achtergrond=,
+ \c!achtergrondkleur=,
+ \c!achtergrondraster=\@@rsraster,
+ \c!regelcorrectie=\v!aan,
+ #2]%
+ \setvalue{\e!start#1}{\dostartframedtext[#1]}%
+ \setvalue{\e!stop#1}{\dostopframedtext[#1]}
+ \setvalue{#1}{\doframedtext[#1]}}
+
+\def\defineframedtext%
+ {\dodoubleempty\dodefineframedtext}
+
+%D We define the general (and original) case by just saying:
+
+\defineframedtext[\v!framedtext]
+
+%D We need several steps before the actual job is done,
+%D because we have to handle an optional identifier (and
+%D because these commands evolved out of a single case).
+
+\def\dosetupframedtexts[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??kd#1][#2]%
+ \else
+ \getparameters[\??kd\v!framedtext][#1]%
+ \fi}
+
+\def\setupframedtexts%
+ {\dodoubleempty\dosetupframedtexts}
+
+\def\dostartframedtext%
+ {\bgroup\dotripleempty\dodostartframedtext}
+
+\def\dodostartframedtext[#1][#2][#3]%
+ {\doifinstringelse{=}{#2}
+ {\dododostartframedtext[#1][][#2]}
+ {\dododostartframedtext[#1][#2][#3]}}
+
+\def\dododostartframedtext[#1][#2][#3]%
+ {\processaction
+ [#2]
+ [ \v!links=>\letvalue{\??kd#1\c!links}=\relax
+ \letvalue{\??kd#1\c!rechts}=\hfill,
+ \v!rechts=>\letvalue{\??kd#1\c!links}=\hfill
+ \letvalue{\??kd#1\c!rechts}=\relax,
+ \v!midden=>\letvalue{\??kd#1\c!links}=\hfill
+ \letvalue{\??kd#1\c!rechts}=\hfill]%
+ \forgetparindent
+ \setbox\framebox=\vbox
+ \bgroup
+ \expanded{\switchtobodyfont[\getvalue{\??kd#1\c!korps}]}%
+ \localframed[\??kd#1][\c!strut=\v!nee,#3]%
+ \bgroup
+ \blanko[\v!blokkeer]%
+ \let\\=\endgraf
+ \getvalue{\??kd#1\c!binnen}%
+ \dostartattributes{\??kd}{}}
+
+\def\dostopframedtext[#1]%
+ {\endgraf
+ \removelastskip
+ \dostopattributes
+ \baselinecorrection % new, inside box
+ \egroup
+ \egroup
+ \ifinsidefloat
+ \box\framebox
+ \else
+ %\doplaats[\??kd#1][\c!regelcorrectie=\v!aan]{\box\framebox}%
+ \doplaats[\??kd#1][]{\box\framebox}%
+ \fi
+ \egroup}
+
+%D The simple brace (or group) delimited case is typeset
+%D slightly different and is not aligned.
+
+\def\doframedtext%
+ {\bgroup\dodoubleempty\dodoframedtext}
+
+\def\dodoframedtext[#1][#2]%
+ {\expanded{\switchtobodyfont[\getvalue{\??kd#1\c!korps}]}%
+ \localframed[\??kd#1][\c!strut=\v!nee,#2]%
+ \bgroup
+ \blanko[\v!blokkeer]%
+ \let\\=\endgraf
+ \getvalue{\??kd#1\c!binnen}%
+ \dostartattributes{\??kd}{}%
+ \bgroup
+ \aftergroup\docloseframedtext
+ \let\next=}
+
+\def\docloseframedtext%
+ {\removelastskip
+ \dostopattributes
+ \egroup
+ \egroup}
+
+%D \macros
+%D {textrule, starttextrule, setuptextrules}
+%D
+%D Putting rules before and after a paragraph is very space
+%D sensitive, but the next command handles that quite well. It
+%D comes in to disguises:
+%D
+%D \startbuffer
+%D \textrule[boven]{fragments}
+%D \input reich
+%D \textrule
+%D \stopbuffer
+%D
+%D \bgroup \typebuffer \haalbuffer \egroup
+%D
+%D \startbuffer
+%D \setuptextrules
+%D [breedte=90pt,afstand=12pt,lijnkleur=blauw,
+%D korps=klein,letter=\sc,kleur=rood]
+%D
+%D \starttextrule{Ship Building Tools}
+%D \nl \steltolerantiein[soepel] \input materie
+%D \stoptextrule
+%D \stopbuffer
+%D
+%D \bgroup \typebuffer \haalbuffer \egroup
+%D
+%D \startbuffer
+%D \setuptextrules
+%D [plaats=inmarge,
+%D korps=klein,letter=schuinvet]
+%D
+%D \starttextrule{wonderful}
+%D \input tufte
+%D \stoptextrule
+%D \stopbuffer
+%D
+%D \bgroup \typebuffer \haalbuffer \egroup
+%D
+%D The formal definition of these commands is:
+%D
+%D \showsetup{\y!textrule}
+%D \showsetup{\y!starttextrule}
+%D \showsetup{\y!setuptextrules}
+%D
+%D The implementation looks a bit complicated due to the
+%D optional arguments.
+
+\def\setuptextrules%
+ {\dodoubleargument\getparameters[\??tl]}
+
+\def\complextextrule[#1]%
+ {\processaction
+ [#1]
+ [ \v!boven=>\let\next=\dotoptextrule,
+ \v!onder=>\let\next=\dobottomtextrule,
+ \s!default=>\let\next=\dobottomtextrule,
+ \s!unknown=>\let\next=\dobottomtextrule]%
+ \dosinglegroupempty\next}
+
+\definecomplexorsimple\textrule
+
+\def\simpletextrule%
+ {\dosinglegroupempty\dounknowntextrule}
+
+\def\docomplextextrule#1%
+ {\bgroup
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\leftskip
+ \setbox0=\hbox to \hsize
+ {\dimen4=.5ex
+ \dimen6=-.5ex
+ \advance\dimen4 by .5\linewidth
+ \advance\dimen6 by .5\linewidth
+ \dimen8=\@@tlafstand
+ \doifnothing{#1}{\firstargumentfalse}%
+ \iffirstargument
+ \doifelse{\@@tlplaats}{\v!inmarge}%
+ {\llap{\doattributes{\??tl}{#1}\hskip\linkermargeafstand}}
+ {\color[\@@tllijnkleur]
+ {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlbreedte}%
+ \hbox spread 2\dimen8{\hss\doattributes{\??tl}{\strut#1}\hss}}%
+ \fi
+ \color[\@@tllijnkleur]
+ {\leaders\hrule\!!height\dimen4\!!depth\dimen6\hfill}}%
+ \ht0=\ht\strutbox
+ \dp0=\dp\strutbox
+ \noindent\box0
+ \egroup}
+
+\def\dobottomtextrule#1%
+ {\ifhmode
+ \endgraf
+ \fi
+ \dimen0=\dp\strutbox
+ \ifdim\prevdepth<\dp\strutbox
+ \ifdim\prevdepth>\!!zeropoint
+ \advance\dimen0 by -\prevdepth
+ \fi
+ \fi
+ \advance\dimen0 by .5ex
+ \vskip\dimen0
+ \@@tltussen
+ \doifelsenothing{#1}
+ {\bgroup
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\leftskip
+ \nointerlineskip
+ \moveleft-\leftskip\vbox
+ {\color[\@@tllijnkleur]
+ {\hrule\!!depth\linewidth\!!height\!!zeropoint\!!width\hsize}}%
+ \egroup}
+ {\docomplextextrule{#1}}%
+ \prevdepth\!!zeropoint % look at this
+ \@@tlna
+ \pagina[\v!voorkeur]}
+
+\def\dotoptextrule#1%
+ {\pagina[\v!voorkeur]
+ \witruimte
+ \@@tlvoor
+ \docomplextextrule{#1}%
+ \geenwitruimte
+ \@@tltussen
+ \endgraf}
+
+\def\dobottomtextrule#1%
+ {\ifhmode
+ \endgraf
+ \fi
+ \dimen0=\dp\strutbox
+ \ifdim\prevdepth<\dp\strutbox
+ \ifdim\prevdepth>\!!zeropoint
+ \advance\dimen0 by -\prevdepth
+ \fi
+ \fi
+ \advance\dimen0 by .5ex
+ \vskip\dimen0
+ \@@tltussen
+ \doifelsenothing{#1}
+ {\bgroup
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\leftskip
+ \nointerlineskip
+ \moveleft-\leftskip\vbox
+ {\color[\@@tllijnkleur]
+ {\hrule\!!depth\linewidth\!!height\!!zeropoint\!!width\hsize}}%
+ \egroup}
+ {\docomplextextrule{#1}}%
+ \prevdepth\!!zeropoint % look at this
+ \@@tlna
+ \pagina[\v!voorkeur]}
+
+\def\dounknowntextrule%
+ {\iffirstargument
+ \let\next=\dotoptextrule
+ \else
+ \def\next{\dobottomtextrule{}}%
+ \fi
+ \next}
+
+%D The grouped commands also supports bodyfont switching:
+
+\def\starttextrule#1%
+ {\bgroup
+ \dotoptextrule{#1}
+ \switchtobodyfont[\@@tlkorps]}
+
+\def\stoptextrule%
+ {\dobottomtextrule{}%
+ \egroup}
+
+%D \macros
+%D {fillinrules, setupfillinrules}
+%D
+%D The next few commands do not really deserve a place in a
+%D core module, because they deal with specific typography.
+%D Nevertheless I decided to make them part of the core,
+%D because they permit us to make questionaires. Let's start
+%D with some examples.
+%D
+%D \fillinrules[n=2,breedte=passend]{first}
+%D \fillinrules[n=2,breedte=ruim]{first}
+%D \fillinrules[n=2,breedte=3cm]{first}
+%D \fillinrules[n=2,breedte=3cm,afstand=.5em,scheider=:]{first}
+%D \fillinrules[n=2]{first}{last}
+%D \fillintext{first}{last} \input reich \par
+%D
+%D The main command is \type{\fillinrules}. This command takes
+%D one and an optional second argument and sets a paragraph with
+%D empty visualized lines.
+%D
+%D \showsetup{\y!fillinrules}
+%D \showsetup{\y!setupfillinrules}
+
+\def\setupfillinrules%
+ {\dodoubleargument\getparameters[\??il]}
+
+\definecomplexorsimpleempty\fillinrules
+
+\def\complexfillinrules[#1]%
+ {\def\docomplexfillinrules##1##2%
+ {\dodocomplexfillinrules[#1]{##1}{##2}{\thinrules[n=\@@iln]}}%
+ \dodoublegroupempty\docomplexfillinrules}
+
+\def\dodocomplexfillinrules[#1]#2#3#4%
+ {\endgraf
+ \@@ilvoor
+ \begingroup
+ \setupfillinrules[#1]%
+ \noindent
+ \doifelse{\@@ilbreedte}{\v!passend}
+ {\let\@@ilafstand=\!!zeropoint
+ \setbox0=\hbox}
+ {\doifelse{\@@ilbreedte}{\v!ruim}
+ {\setbox0=\hbox}
+ {\setbox0=\hbox to \@@ilbreedte}}
+ \bgroup
+ \doattributes{\??il}{\strut#2\hfill\@@ilscheider}%
+ \hskip\@@ilafstand
+ \egroup
+ \hangindent=\wd0\relax
+ \parindent=\hangindent
+ \box0\relax
+ \stelwitruimtein[\v!groot]%
+ \ignorespaces
+ #4%
+ \doifsomething{#3}
+ {\doifnot{\@@ilbreedte}{\v!passend}
+ {\kern\@@ilafstand}
+ \doattributes{\??il}{#3\strut}}%
+ \endgroup
+ \endgraf
+ \@@ilna}
+
+%D \macros
+%D {fillintext}
+%D
+%D To provide compatible layouts when texts and lines are
+%D mixed, one can typeset a paragraph by using the command
+%D \type{\fillintext}.
+%D
+%D \showsetup{\y!fillintext}
+
+\definecomplexorsimpleempty\fillintext
+
+\def\complexfillintext[#1]%
+ {\def\docomplexfillintext##1##2%
+ {\dowithnextbox
+ {\dodocomplexfillinrules[#1]{##1}{\hfill##2}{\unhbox\nextbox\unskip}}%
+ \hbox\bgroup\let\par\egroup\ignorespaces}%
+ \dodoublegroupempty\docomplexfillintext}
+
+%D \macros
+%D {fillinline, setupfillinlines}
+%D
+%D Another member of the family takes care of putting a (often
+%D small) rule after a piece of text, like
+%D
+%D \startbuffer
+%D \fillinline \input reich \par
+%D \fillinline[marge=0cm] \input reich \par
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \haalbuffer
+%D \stopvoorbeeld
+%D
+%D which was typeset by saying:
+%D
+%D \typebuffer
+%D
+%D The two commands that take care of this are:
+%D
+%D \showsetup{\y!fillinline}
+%D \showsetup{\y!setupfillinlines}
+
+\def\setupfillinlines%
+ {\dodoubleargument\getparameters[\??iv]}
+
+\definecomplexorsimpleempty\fillinline
+
+\def\complexfillinline[#1]%
+ {%\endgraf % interferes with \doordefinieren cum suis
+ \@@ivvoor
+ \begingroup
+ \setupfillinlines[#1]%
+ \advance\rightskip by \@@ivmarge
+ \parfillskip\!!zeropoint
+ \def\par%
+ {\unskip\hfill
+ \dimen0=\@@ivbreedte
+ \advance\dimen0 by -\@@ivafstand
+ \ifdim\dimen0>\@@ivmarge\else\expandafter\rlap\fi
+ {\kern\@@ivafstand
+ \vrule
+ \!!width\dimen0
+ \!!height.5\linewidth
+ \!!depth.5\linewidth}%
+ \endgraf % !
+ \endgroup
+ \endgraf % !
+ \@@ilna}}
+
+%D \stopdocumentation
+%D \bgroup
+%D
+%D \stelkadertekstenin
+%D [setuptext]
+%D [achtergrond=kleur,achtergrondkleur=wit]
+%D
+%D \startbuffer
+%D \stelachtergrondin
+%D [achtergrondoffset=4pt,
+%D achtergrond=raster,
+%D kader=aan,
+%D kaderkleur=rood,
+%D linkeroffset=2pt]
+%D \stopbuffer
+%D
+%D \haalbuffer
+%D
+%D \startachtergrond
+%D
+%D \macros
+%D {setupbackground,startbackground,background}
+%D
+%D The section deals with backgrounds in the running text. This
+%D means that texts is to be collected and split over pages. To
+%D show what can be done, we provide this part of the
+%D documentation with some gray background and a red frame.
+%D Both the background and frame can have all characteristics
+%D of \type{\framed}. This time we used the setting:
+%D
+%D \typebuffer
+%D
+%D The implementation is not that sophisticated, but suffices.
+%D The main problem with this kind of functionality is to get
+%D the spacing all right.
+
+%D Specifying the background is more or less the same as
+%D specifying a framed box.
+%D
+%D \showsetup{\y!setupbackground}
+
+\presetlocalframed[\??ag]
+
+\def\dosetupbackground[#1]%
+ {\getparameters[\??ag][#1]%
+ \doifelse{\@@agstatus}{\v!start}
+ {\let\startbackground=\dostartbackground
+ \let\stopbackground =\dostopbackground
+ \let\background =\dobackground}
+ {\let\startbackground=\relax
+ \let\stopbackground =\relax
+ \let\background =\relax}}
+
+\def\setupbackground%
+ {\dosingleargument\dosetupbackground}
+
+%D Actually typesetting the background is implemented rather
+%D straightforward. We need to handle some spacing as well as
+%D the (often) a bit smaller horizontal size.
+%D
+%D \showsetup{\y!startbackground}
+%D
+%D Although we could have used a scratch one, we first
+%D declare a boolean.
+
+\newif\ifbackgroundsplit
+
+%D The \type{\vbox to \lineheight{}\vskip\!!zeropoint}
+%D construction gives the first real line a decent height by
+%D adding a dummy line.
+
+\def\dostartbackground%
+ {\bgroup
+ \setbox0=\vbox\bgroup
+ \vbox to \lineheight{}\vskip\!!zeropoint
+ \blanko[\v!blokkeer]
+ \advance\hsize by -\@@aglinkeroffset
+ \advance\hsize by -\@@agrechteroffset}
+
+%D This dummy line is removed by \type{\setbox2=\vsplit0 to
+%D \lineheight}. That way \type{\topskip} takes care of the
+%D lineheight. I'll probably forget to apply this trick
+%D elsewhere.
+%D
+%D {\em Beware: especially the bottom depth handling needs
+%D a more advanced implementation, consistent with main
+%D document features. Future versions therefore can break a
+%D bit different.}
+
+\def\dostopbackground%
+ {\endgraf
+ \removelastskip
+ \egroup
+ \everypar{}
+ \splitmaxdepth=\boxmaxdepth
+ \splittopskip=\topskip
+ \setbox2=\vsplit0 to \lineheight
+ \loop
+ \ifdim\prevdepth<\dp\strutbox
+ \dimen8=\dp\strutbox
+ \else
+ \dimen8=\prevdepth
+ \fi
+ %\advance\dimen0 by \topskip
+ %\advance\dimen0 by -\baselineskip
+ \ifdim\pagegoal=\maxdimen
+ \dimen0=\teksthoogte
+ \advance\dimen0 by \topskip
+ \advance\dimen0 by -\baselineskip
+ \advance\dimen0 by -\dp\strutbox
+ \else
+ \dimen0=\pagegoal
+ \advance\dimen0 by -\dimen8
+ \advance\dimen0 by -\parskip
+ \fi
+ \advance\dimen0 by -\pagetotal
+ \advance\dimen0 by -\@@agbovenoffset
+ \advance\dimen0 by -\@@agonderoffset
+ \ifdim\dimen0>2\lineheight
+ \ifdim\ht0>\dimen0
+ \setbox2=\vsplit0 to \dimen0
+ \backgroundsplittrue
+ \else
+ \setbox2=\box0
+ \backgroundsplitfalse
+ \fi
+ \else
+ \setbox2=\box0
+ \backgroundsplitfalse
+ \fi
+ \setbox2=\vbox \ifbackgroundsplit to \dimen0 \fi
+ {\vskip\@@agbovenoffset
+ \dimen0=\dp\strutbox
+ \advance\dimen0 by -\dp0
+ \popsplitcolor
+ \ifbackgroundsplit\unvbox\else\box\fi2
+ \ifdim\dimen0>\!!zeropoint
+ \vskip\dimen0
+ \fi
+ \vskip\@@agonderoffset
+ \vss}
+ \vskip\dimen8 % looks better
+ \witruimte
+ \ifbackgroundsplit\ifdim\pagegoal<\maxdimen
+ \pagegoal=1.1\pagegoal % be a bit more tolerant
+ \fi\fi
+ \localframed[\??ag][\c!offset=\v!overlay]
+ {\hskip\@@aglinkeroffset\box2\hskip\@@agrechteroffset}%
+ \ifbackgroundsplit
+ \pagina
+ \fi
+ \ifdim\ht0>\!!zeropoint \repeat
+ \egroup}
+
+%D As a bonus we also have a short command, that is of not
+%D much use, but kept there for historic reasons.
+%D
+%D \showsetup{\y!background}
+
+\def\dobackground%
+ {\bgroup
+ \dowithnextbox
+ {\localframed
+ [\??ag][\c!offset=\v!overlay]
+ {\box\nextbox}%
+ \egroup}
+ \vbox}
+
+%D \stopdocumentation
+%D \stopachtergrond
+%D \egroup
+
+%D \macros
+%D {copyright, registered}
+%D
+%D Some not so robust left||overs (borrowed from Knuth,
+%D \TEX Book\ page 356):
+
+\def\omcirkeld#1%
+ {{\ooalign{\hfil\raise0.07ex\hbox{{\tx#1}}\hfil\crcr\mathhexbox20D}}}
+
+\def\copyright%
+ {\omcirkeld{C}}
+
+\def\registered%
+ {\omcirkeld{R}}
+
+% \setuprules
+% [\c!dikte=\v!middel]
+
+\setuplinewidth
+ [\v!middel]
+
+\setupframed
+ [\c!breedte=\v!passend,
+ \c!hoogte=\v!ruim,
+ \c!offset=0.25ex,
+ \c!leeg=\v!nee,
+ \c!kader=\v!aan,
+ \c!bovenkader=,
+ \c!onderkader=,
+ \c!linkerkader=,
+ \c!rechterkader=,
+ \c!straal=.5\bodyfontsize,
+ \c!lijndikte=\linewidth,
+ \c!hoek=\v!recht,
+ \c!diepte=\!!zeropoint,
+ \c!achtergrond=,
+ \c!achtergrondraster=\@@rsraster,
+ \c!achtergrondkleur=,
+ \c!achtergrondoffset=\!!zeropoint,
+ \c!kaderkleur=,
+ \c!kaderoffset=\!!zeropoint,
+ \c!uitlijnen=,
+ \c!onder=\vss,
+ \c!boven=,
+ \c!strut=\v!ja,
+ \c!plaats=\v!normaal]
+
+\setupscreens
+ [\c!factor=1.0,
+ \c!methode=\v!extern, % \c!methode=\v!punt
+ \c!raster=0.95]
+
+\setupblackrules
+ [\c!n=1,
+ \c!breedte=1em,
+ \c!hoogte=1ex,
+ \c!diepte=\!!zeropoint,
+ \c!variant=\c!a,
+ \c!afstand=.25ex]
+
+\setupmarginrules
+ [\c!niveau=0,
+ \c!dikte=\@@kadefaultwidth\linewidth]
+
+\setupthinrules
+ [\c!afstand=\v!klein,
+ \c!n=3,
+ \c!hoogte=.5\linewidth,
+ \c!diepte=\@@dlhoogte,
+ \c!voor=,
+ \c!na=]
+
+\setuptextrules
+ [\c!plaats=\v!links,
+ \c!voor=\blanko,
+ \c!na=\blanko,
+ \c!tussen=,
+ \c!breedte=2em,
+ \c!letter=\v!vet,
+ \c!kleur=,
+ \c!lijnkleur=,
+ \c!korps=,
+ \c!afstand=.5em]
+
+\setupfillinrules
+ [\c!breedte=\v!ruim,
+ \c!afstand=1em,
+ \c!voor=\blanko,
+ \c!na=\blanko,
+ \c!n=1,
+ \c!scheider=,
+ \c!letter=\v!normaal,
+ \c!kleur=]
+
+\setupfillinlines
+ [\c!breedte=3cm,
+ \c!marge=\@@ivbreedte,
+ \c!afstand=1em,
+ \c!voor=\blanko,
+ \c!na=\blanko]
+
+\setupbackground
+ [\c!linkeroffset=.5\bodyfontsize,
+ \c!rechteroffset=\@@aglinkeroffset,
+ \c!bovenoffset=\!!zeropoint,
+ \c!onderoffset=\@@agbovenoffset,
+ \c!status=\v!start,
+ \c!straal=.5\bodyfontsize,
+ \c!hoek=\v!recht,
+ \c!kader=\v!uit,
+ \c!diepte=\!!zeropoint,
+ \c!achtergrond=\v!raster,
+ \c!kleur=,
+ \c!achtergrondkleur=\@@agkleur,
+ \c!raster=\@@rsraster]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-tab.tex b/tex/context/base/core-tab.tex index c3a34bdd2..3e2d842df 100644 --- a/tex/context/base/core-tab.tex +++ b/tex/context/base/core-tab.tex @@ -1,2075 +1,2075 @@ -%D \module -%D [ file=core-tab, -%D version=1997.10.10, -%D title=\CONTEXT\ Core Macros, -%D subtitle=\TABLE\ Embedding, -%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. - -% e-tex: reverse rows or vadjust or ... in tables -% \ifalign -% \xhrule : calls for 'special' with width - -% melden als in kleur conflict, uitgestelde test op \SR\SR - -% verengelsen -% interface - -% footnotes flushen -% \......TABLE........ namen -% kolommen testen -% unbreakable kop definieren -% voetnoten -% meldingen -% als direct \use{max} dan fout -% \BREAKPOINT -% breedte lijn telt -% errors: ook gray in handle - -% \AR -> als in DL dan \DR - -% nieuw: -% -% \NL / \NL[blanko] is skip, nog default? -% geen \HL in a row -% \HL[n] -% \VL[n] + remembers -% c{colorspec} key -% \HC[color[width] -% \VC[color] -% meldingen row, column, use, advise -% \AR: UITSTELLEN / EXPERIMENTEEL - - -% WAARDELOZE ERROR HANDLER - -% THIS RENEWED MODULE WORKS OK BUT STILL LOOKS BAD - -\writestatus{loading}{Context Core Macros / TaBlE Embedding} - -%D We felt no need to write our own table building macros, -%D simply because Michael Wichura made a terrific one. This -%D package is quite complete and well documented. In \CONTEXT\ -%D we provide a shell for consistent spacing as well as color -%D support. Implementing these features without adapting the -%D original macros is not trivial. One easilly gets conflicts -%D with \type{\omit}, \type{\span} and \type{\noalign}, which -%D means that we end up postponing and overloading macros, -%D mostly global. Now, let's start with loading the main -%D macros: - -\doifundefined{BeginTable}{\doinputonce{table.tex}} - -\unprotect - -%D \macros -%D {inintable, ifsplittable} -%D -%D First we declare some variables. These show a bit what we -%D are dealing with. First we introdoce some booleans that -%D enable us, inside as well as outside this module, to -%D determine in what mode we are. - -\newif\ifintable -\newif\ifsplittables - -%D \macros -%D {iftracetable} -%D -%D When I documented this module, I felt the need for tracing -%D options. After implementing this feature, I also added -%D warnings, error recovery and automatic spacing. - -\newif\iftracetables - -%D We show this feature in an eample that also shows some of -%D the basic table typesetting commands. -%D -%D \startbuffer -%D \starttabel[|||] -%D \HL -%D \VL first \VL second \VL\AR -%D \HL -%D \VL alfa \VL 1 \VL\AR -%D \VL beta \VL 2 \VL\AR -%D \VL gamma \VL 3 \VL\AR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \startcombinatie[2] -%D {\tracetablesfalse\haalbuffer} {\type{\tracetablesfalse}} -%D {\tracetablestrue\haalbuffer} {\type{\tracetablestrue}} -%D \stopcombinatie -%D -%D This table is specified as: -%D -%D \typebuffer -%D -%D This examples shows about the minimum of commands needed to -%D typeset such a table. In this table, the \type {\AR} is -%D automatically translated into the more primitive (but more -%D verbose) commands \type {\SR}, \type {\FR}, \type {\MR} and -%D \type {\LR} commands. -%D -%D \startbuffer -%D \starttabellen[|||] -%D \HL -%D \VL first \VL second \VL\AR -%D \HL -%D \VL alfa \VL 1 \VL\AR -%D \VL beta \VL 2 \VL\AR -%D \VL gamma \VL 3 \VL\AR -%D \HL -%D \stoptabellen -%D \stopbuffer -%D -%D When we use the split table feature, we get a bit more -%D information. -%D -%D {\tracetablesfalse\haalbuffer} -%D -%D Sometimes in tables information shows up that is not typed -%D in by the user. These messages give a cue in what aspect a -%D table definition is wrong. -%D -%D \startbuffer -%D \starttabel[||||] -%D \HL -%D \VL first second \VL third \VL\AR -%D \HL -%D \VL alfa \VL 1 \VL a \VL\AR -%D \VL beta \VL 2 \VL b \VL -%D \VL gamma \VL \THREE{3} c \VL\AR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \typebuffer -%D -%D Those terrible table has three errors, which all show up in -%D typeset messages. Errors cannot always recovered 100\% and -%D therefore can result in two or more succesive messages, like -%D in the last row. -%D -%D \haalbuffer - -%D Bringing color into tables is complicated by the mere fact -%D that color is not part of \TEX. The main complication is -%D that we don't know in advance how wide a column will be. I -%D implemented color support in tables in the early 90's -%D because I needed it for some articles on color. I have to -%D admit that I seldom use the mechanism. -%D -%D Most color support in \CONTEXT\ makes use of colored rules. -%D At first sight, one is tempted to implement colors in tables -%D in a similar way, but as said, we don't know the dimensions -%D in advance. It turns out however that we don't have to, -%D simply because alignments take care of stretching rules to -%D the appropritate dimensions. This means that we can provide -%D backgrounds by coloring rules with the height of a row, -%D skipping upwards and finally drawing the content, like in: -%D -%D \gdef\ShowExample% -%D {\startfiguurtekst -%D {geen} -%D {\haalbuffer} -%D \typebuffer -%D \stopfiguurtekst} -%D -%D \startbuffer -%D \starttabel[|c|c|] -%D \HL -%D \BL[2] \SR -%D \VL test \VL test \VL\SR -%D \HL -%D \VL test \VL test \VL\FR -%D \VL test \VL test \VL\MR -%D \VL test \VL test \VL\LR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \ShowExample -%D -%D Just to be complete we show how the other columns can be -%D given a background. Later we will provide more details over -%D the commands used. -%D -%D \startbuffer -%D \starttabel[|c|c|c|] -%D \HL -%D \BL[3] \SR -%D \VL test \VL test \VL test \VL\SR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \ShowExample -%D -%D \startbuffer -%D \starttabel[|c|c|c|] -%D \HL -%D \BC \BL[2] \SR -%D \VL test \VL test \VL test \VL\SR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \ShowExample -%D -%D \startbuffer -%D \starttabel[|c|c|c|] -%D \HL -%D \BC \BC \BL \SR -%D \VL test \VL test \VL test \VL\SR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \ShowExample -%D -%D \startbuffer -%D \starttabel[|c|c|c|] -%D \HL -%D \BC \BL \SR -%D \VL test \VL test \VL test \VL\SR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \ShowExample -%D -%D \startbuffer -%D \starttabel[|c|c|c|] -%D \BL \BL \SR -%D \HL -%D \VL test \VL test \VL test \VL\SR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \ShowExample - -%D In these examples we can clearly see that for being a real -%D background, the color or gray specification has to precede -%D the content. Just to keep things simple, we can recall this -%D specification later on: -%D -%D \startbuffer -%D \starttabel[|c|c|c|] -%D \BC \BL \SR -%D \HL -%D \VL test \VL test \VL test \VL\SR -%D \HL -%D \BR\FR -%D \VL test \VL test \VL test \VL\FR -%D \BR\MR -%D \VL test \VL test \VL test \VL\MR -%D \BR\LR -%D \VL test \VL test \VL test \VL\LR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \ShowExample -%D -%D Close study learns that we can put the specification -%D before or after the \type{\HL}, whatever suits best. Keeping -%D track of these specifications is taken care of by the next -%D variables: - -\newif \ifTABLEgrayline % executing gray line -\newif \ifTABLEgraydone % gray line executed -\newtoks \TABLEgraytoks % gray line specification - -%D A third major extension, besides spacing and color support, -%D concerns splitting tables over pages. We don't give -%D examples here, because its a waste of space. - -\newdimen\TABLEheight % These can be \newskimens -\newdimen\TABLEmaxheight % given a few \relax's when -\newdimen\TABLEheadheight % testing them with \ifdim. -\newdimen\TABLEtailheight -\newdimen\TABLEcaptionheight - -\newif\ifTABLEinbreak - -%D Nog vervangen: - -\def\c!Table {Table} - -%D We alraady saw that the table macros report errors and -%D provide automatic spacing. These features can only be -%D implemented by keeping track of the state, often the last -%D command on a row. - -\chardef\TABLEunknown = 0 - -\chardef\TABLEseparaterow = 1 -\chardef\TABLEfirstrow = 2 -\chardef\TABLEmidrow = 3 -\chardef\TABLElastrow = 4 -\chardef\TABLErule = 5 -\chardef\TABLEskip = 6 -\chardef\TABLEautorow = 7 - -\chardef\TABLEforcefirstrow = 1 -\chardef\TABLEforcelastrow = 2 - -\chardef\TABLEmissingrow = 1 -\chardef\TABLEmissingcolumn = 2 -\chardef\TABLEspanoverflow = 3 -\chardef\TABLEdivisionoverflow = 4 - -%D We store these states using efficient \type {\chardef}'s. -%D Like most variables, these are global ones. When needed, -%D especially when we flush the backgrounds, we can temporary -%D disable the assignment. - -\newif\ifsetTABLEaction - -\def\setTABLEaction#1% - {\ifsetTABLEaction\global\chardef\TABLEaction#1\fi} - -\def\setTABLEforce#1% - {\ifsetTABLEaction\global\chardef\TABLEforce#1\fi} - -\def\setTABLEerror#1% - {\global\chardef\TABLEerror#1} - -%D Before we come to using these variables, we redefine and/or -%D adapt some \TABLE\ macros. Within \TABLE's the \type{|} and -%D \type{"} have special meanings in templates and are active -%D during. Their meaning can therefore conflict with those -%D elsewhere defined. To be compatible with traditional \TABLE\ -%D as well as \CONTEXT's \type{||} and the active \type{"} -%D extensions for my german friends, we do some catcode magic. - -\newif\ifForgetTableBarAndQuote \ForgetTableBarAndQuotetrue - -\bgroup -\catcode`\|=\@@active -\catcode`\"=\@@active -\gdef\pushouterbarandquote% - {\ifForgetTableBarAndQuote - \ifnum\catcode`\|=\@@active \else - \catcode`\|=\@@active - \def|{\ifmmode\vert\else\char`\|\fi}% - \fi - \let\outertablebar=|% - \ifnum\catcode`\"=\@@active \else - \catcode`\"=\@@active - \def"{\char`\"}% - \fi - \let\outertablequote="% - \fi} -\gdef\popouterbarandquote% - {\ifForgetTableBarAndQuote - \let|=\outertablebar - \let"=\outertablequote - \else - \redefinetablebarandquote - \fi} -\gdef\ObeyTableBarAndQuote% - {\ForgetTableBarAndQuotefalse - \ifintable - \redefinetablebarandquote - \fi} -\egroup - -%D \macros -%D {ObeyTableBarAndQuote} -%D -%D As said, the \type{|} and \type{"} active characters are -%D often used for other purposes. By default, the outside -%D meanings are therefore preserved and available inside -%D tables. If for some reason one wants to use the \TABLE\ -%D primitives, one can say: -%D -%D \starttypen -%D \ObeyTableBarAndQuote -%D \stoptypen -%D -%D To keep things verbose, as well as to show what \TABLE\ -%D commands we affect, we show some meanings. - -\def\normalTABLEshortrule {\!ttShortHrule} % \- -\def\normalTABLElongrule {\!ttLongHrule} % \= -\def\normalTABLEfullrule {\!ttFullHrule} % \_ -\def\normalTABLEendofrow {\!ttEndOfRow} % \\ -\def\normalTABLEsimplebar {\unskip\!ttRightGlue&&} % | -\def\normalTABLEcomplexbar {\unskip\!ttRightGlue&\omit\!ttAlternateVrule} % \| -\def\normalTABLEquote {\unskip\!ttRightGlue&\omit&} % " -\def\normalTABLElineformat {\normalTABLEendofrow+} -\def\normalTABLElineending {\normalTABLEendofrow0 } -\def\normalTABLEsinglerule {&\normalTABLElongrule&} -\def\normalTABLEmultirule#1{&\use{#1}\normalTABLElongrule&} - -%D To give an impression of what the (well documented) source -%D of \TABLE\ looks like, we first implement an alternative for -%D the numeric keys. The quantity keys (\type{q} and \type{Q}) -%D support the more european way of writing numbers: -%D -%D \startsmaller -%D 100.000.000,00 instead of 100,000,000.00 -%D \stopsmaller -%D -%D The next table shows how to use these keys. We use braces -%D instead of brackets because we need brackets to specify the -%D format. -%D -%D \startbuffer -%D \starttabel{|q[00,000]|Q[00,00]|} -%D \HL -%D \VL -1,2 \VL 12,35 \VL\FR -%D \VL 11,203 \VL 2,4 \VL\LR -%D \HL -%D \stoptabel -%D \stopbuffer -%D -%D \ShowExample -%D -%D Although a more efficient implementation is possible |<|we -%D can for instance share common macros|>| we just adapt a copy -%D of the numeric ones. To permit double loading of this -%D module, we check for the existence of one of the macros. - -\letvalue{!tk<\string q>}=\undefined -\letvalue{!tk<\string Q>}=\undefined - -%D We just copy the original {\em comments}. -%D -%D \em Key \type{q}: quantity item, non||math mode. - -\NewFormatKey q% - {\def\!tqStyle{}% - \futurelet\!tnext\!tqTestForBracket} - -%D \em Key \type{Q}: quantity item, math mode. - -\NewFormatKey Q% - {\def\!tqStyle{$}% - \futurelet\!tnext\!tqTestForBracket} - -%D \em Note: the space between a quantity entry and the -%D following \type{|}, \type{"}, or \type{\|} is mandatory. -%D empty quantity entries are not allowed: use \type{{}} or -%D \type{\omit} instead. -%D -%D \em Test for bracket: invoked by the keys \type{q} and -%D \type{Q}. - -\def\!tqTestForBracket% - {\ifx[\!tnext - \!thx\!tqGetArgument - \else - \!thx\!tqGetCode - \fi} - -%D \em Get code: e.g. \type{4}, or \type{4,0}, \type{0,4}, or -%D \type{10,2}. - -\def\!tqGetCode#1 % note the blank - {\!tqConvertCode #1,,!} - -%D \em Convert code: e.g. converts above to \type{[0000]}, -%D \type{[0000,]}, \type{[,0000]}, \type{[0000000000,00]}. - -\def\!tqConvertCode #1,#2,#3!% - {\begingroup - \aftergroup\edef - \aftergroup\!ttemp - \aftergroup{% - \aftergroup[% - \!taCountA #1 - \!thLoop - \ifnum \!taCountA>0 - \advance\!taCountA -1 - \aftergroup0 - \repeat - \def\!ttemp{#3}% - \ifx\!ttemp\empty - \else - \aftergroup, - \!taCountA #2 - \!thLoop - \ifnum\!taCountA>0 - \advance\!taCountA -1 - \aftergroup0 - \repeat - \fi - \aftergroup]\aftergroup}% - \endgroup\relax - \!thx\!tqGetArgument\!ttemp} - -%D \em Get argument: -%D -%D \starttypen -%D <sample left field> <optional, sample right field> -%D \stoptypen - -\def\!tqGetArgument[#1]% - {\!tqMakeQuantityTemplate\!tqStyle#1,,!} - -%D \em Make quantity template. - -\def\!tqMakeQuantityTemplate#1#2,#3,#4!% #1=<empty> or $ - {\def\!ttemp{#4}% - \ifx\!ttemp\empty - \!taDimenC=0pt - \else - \setbox0=\hbox{\m@th #1,#3#1}% - \!taDimenC=\wd0 - \fi - \setbox0=\hbox{\m@th #1#2#1}% - \!thToksEdef\!taDataColumnTemplate= - {\noexpand\!tqSetQuantityItem{\the\wd0 }{\the\!taDimenC}{#1}% - \the\!taDataColumnTemplate}% - \ReadFormatKeys} - -%D \em Set numeric item. - -\def\!tqSetQuantityItem #1#2#3#4 % - {\!tqSetQuantityItemA{#1}{#2}{#3}#4,,!} - -\def\!tqSetQuantityItemA #1#2#3#4,#5,#6!% - {\def\!ttemp% - {#6}% - \hbox to #1 - {\hss\m@th#3#4#3}% - \hbox to #2 - {\ifx\!ttemp\empty - \else - \m@th#3,#5#3% - \fi - \hss}} - -%D Here ends the Q||extension. Did you watch the clever use -%D of aftergroup in \type{\!tqConvertCode}. - -% %D We also (have to) define a key for \type{\kap}: -% -% \letvalue{!tk<\string K>}=\undefined -% -% \NewFormatKey K% -% {\ReadFormatKeys b\kap} - -%D A few pages back we saw backgrounds, further on we will see -%D colored rules, and here we provide a means to color the -%D entries in a column. (We can of course always use the normal -%D color commands for individual entries.) We could not use the -%D lowercase~\type{c}, because that one is used to force {\em -%D centering}. -%D -%D \startbuffer -%D \starttabel[|C{red}|C{green}|C{blue}|] -%D \VL R(ed) \VL G(reen) \VL B(lue) \VL\SR -%D \stoptabel -%D \stopbuffer -%D -%D \ShowExample - -\letvalue{!tk<\string C>}=\undefined - -\NewFormatKey C#1% - {\ReadFormatKeys b{\localstartcolor[#1]} a{\localstopcolor}} - -%D So now we have three new keys: -%D -%D \starttabel[|||] -%D \HL -%D \NC \bf key \NC \bf meaning \NC\AR -%D \HL -%D \NC Q[x,y] \NC math mode formatted numbers \NC\AR -%D \NC q[x,y] \NC text mode formatted numbers \NC\AR -%D \NC C{identifier} \NC column entry color \NC\AR -%D \HL -%D \stoptabel - -%D Later on, we're going to implement multiple page table -%D support, therefore the next \TABLE\ macro needs to be -%D slightly adapted, i.c. the penalty is removed. - -\def\!ttFullHruleA% - {\!ttGetHalfRuleThickness - \hrule\!thHeight\dimen0\!thDepth\dimen0 - %\penalty0 - \egroup} - -%D We'll see that when we want to give a vertical rule a color, -%D we have to set and reset states. After heavy testing it -%D proved most useful to extend a \TABLE\ primitive with some -%D hooks. One thing to keep in mind is that \type{&} keeps -%D assignments local. - -\let\TABLEbeforebar=\empty -\let\TABLEafterbar =\empty - -\def\!ttInsertVrule% - {\hfil - \TABLEbeforebar % added - \vrule \!thWidth - \ifnum\!tgCode=1 - \ifx\!tgValue\empty - \LineThicknessFactor - \else - \!tgValue - \fi - \LineThicknessUnit - \else - \!tgValue - \fi - \TABLEafterbar % added - \hfil - &} - -%D We already shows the next one, but here we slightly adapt -%D the macro by adding an \type{\expandafter}. The space after -%D \type{#1} is crucial! - -\def\normalTABLEcomplexbar#1% - {\unskip\!ttRightGlue&\omit\expandafter\!ttAlternateVrule#1 } - -%D To get rid of interfering \type{\omit}'s when we are -%D checking the number of columns and reporting problems. The -%D extensions concern the second level check, the first -%D subbranch and advancing the column. - -\def\!ttuse#1% - {\ifnum#1>\@ne - \omit - \scratchcounter=\currentTABLEcolumn % added - \advance\scratchcounter by #1 % added - \advance\scratchcounter by -1 % added - \ifnum\scratchcounter>\maxTABLEcolumn % added - \def\next% % added - {\setTABLEerror\TABLEspanoverflow % added - \handleTABLEerror}% % added - \else % added - \def\next% % added - {\global\advance\currentTABLEcolumn by #1 % added - \global\advance\currentTABLEcolumn by -1 % added - \mscount=#1 % \mscount is in Plain - \advance\mscount by \m@ne - \advance\mscount by \mscount - \!thLoop - \ifnum\mscount>\@ne - \sp@n % from Plain (\span\omit \advance\mscount\m@ne) - \repeat - \span}% - \fi % added - \else % added - \def\next% conflicts with possible next \omit % added - {\global\advance\currentTABLEcolumn by 1 }% % added - \fi - \next} % added - -%D All commands that are executed between rows are to be put in -%D \type {\noalign}. We can however not verify if we (that is -%D \TABLE) does or did not enter this mode. A moderate dirty -%D but useful trick is using our own alternative:\voetnoot{Once -%D one has entered the stage of redefining \TEX\ primitives, -%D such hacks become a second nature. However, redefining \type -%D {\omit} and \type{\span} is not that easy.} - -\def\TABLEnoalign% - {\noalign\bgroup\let\noalign=\relax\let\next=} - -%D \macros -%D {starttable} -%D -%D The rest of this module is not easy to comprehend, mainly -%D because we have to take care of: -%D -%D \startopsomming[opelkaar] -%D \som \type{\startopsomming[template]} -%D \som \type{\startopsomming{template}} -%D \som \type{\startopsomming[predefined]} -%D \stopopsomming -%D -%D as well as: -%D -%D \startopsomming[verder] -%D \som restart after table break -%D \stopopsomming -%D -%D The official specification of the start command is: -%D -%D \showsetup{starttable} - -\def\starttabel% - {\bgroup - \ifinsidefloat\else - \startbaselinecorrection % \outer.. - \fi - \postponefootnotes - \firststagestartTABLE} - -\def\stoptabel% - {\finishTABLE - \ifinsidefloat\else - \stopbaselinecorrection % \outer.. - \goodbreak % compensates all the nobreaks - \fi - \egroup} - -%D Before we can grab the argument, we have to make sure that -%D the \CATCODES\ are set. The first stage takes care of that. - -\def\firststagestartTABLE% - {\bgroup % kan-ie weg? - \global\intabletrue - \pushouterbarandquote - \catcode`\|=\@@other - \complexorsimple{secondstagestartTABLE}} - -\def\simplesecondstagestartTABLE#1% - {\complexsecondstagestartTABLE[{#1}]} - -%D \macros -%D {definetabletemplate} -%D -%D The complex (and main) start macro first takes care of the -%D predefined case. Such a predefined setup looks like: -%D -%D \starttypen -%D \definetabletemplate[test][|||] -%D -%D \starttabel[test] -%D \VL test \VL test \VL\AR -%D \VL test \VL test \VL\AR -%D \VL test \VL test \VL\AR -%D \stoptabel -%D \stoptypen -%D -%D The implementation of the definition macro is not that -%D complicated: - -\def\dodefinetabletemplate[#1][#2]% - {\setgvalue{\c!Table#1}{\complexsecondstagestartTABLE[#2]}% - \egroup} - -\def\definetabletemplate% - {\bgroup - \catcode`\|=\@@other - \dodoubleargument\dodefinetabletemplate} - -%D Templates defined this way get protected names, that cannot -%D conflict with existing commands. -%D -%D \showsetup{definetabletemplate} -%D -%D The second half of the next macro prepares table -%D splitting. - -\def\complexsecondstagestartTABLE#1[#2]% - {\convertargument|\to\asciiA - \convertargument#2\to\asciiB - \doifinstringelse{\asciiA}{\asciiB} - {\gdef\restartTABLE{\thirdstagestartTABLE{#2}}} - {\doifdefinedelse{\c!Table#2} - {\gdef\restartTABLE{\getvalue{\c!Table#2}}} - {\gdef\restartTABLE{\getvalue{#2}}}}% - \prepareTABLEsplitting - \restartTABLE - \TABLEhead} - -%D The third stage involves a lot of (re)sets, which we will -%D explain later. - -\def\thirdstagestartTABLE#1% - {\global\setTABLEactiontrue - \setTABLEaction\TABLEunknown - \setTABLEforce\TABLEunknown - \setTABLEerror\TABLEunknown - \global\let\TABLEgrayline=\empty - \global\let\nextTABLEgrayline=\empty - \global\TABLEgraylinefalse - \global\TABLEgraydonefalse - \global\let\TABLEgraylineerror =\empty - \global\let\TABLEgraylinestatus=\empty - \resetVLvalues - \appendtoks\popouterbarandquote\to\EveryTable - \appendtoks\localTABLEsetup\to\EveryTable - \BeginTable[\ifsplittables u\else b\fi]% - \defineTABLEunits - \defineTABLEsteps - \defineTABLErules - \defineTABLEdivisions - \defineTABLEshorthands - \defineTABLEbackgrounds - \defineTABLEendings - \doifsomething{#1} - {\def\TABLEformat{#1}% - \expandafter\getTABLEnofcolumns\expandafter{\TABLEformat}% - \expandafter\BeginFormat\TABLEformat\EndFormat}} - -\def\finishTABLE% - {\chuckTABLEautorow - \unskip\crcr - \EndTable - \global\intablefalse - \egroup} - -%D The preparation for split columns concerns some -%D calculations. Although not explicitly needed, one can -%D predefine a tablehead as well as a tail. Each table fragment -%D is preceded by such a head and ends with a tail. This means -%D that, in order to determine the available heigth, we have to -%D take the head and tail into account. Because we want to -%D support captions too, we will also reserve some space for -%D those later on. - -\def\prepareTABLEsplitting% - {\global\TABLEheight=\!!zeropoint - \ifsplittables - \ifx\TABLEhead\empty - \global\TABLEheadheight=\!!zeropoint - \else - \setbox0=\vbox - \bgroup - \def\doEndOfTableLine##1##2##3{\normalTABLElineformat##2##3}% - \restartTABLE\TABLEhead - \finishTABLE - \global\TABLEheadheight=\ht0 - \fi - \ifx\TABLEtail\empty - \global\TABLEtailheight=\!!zeropoint - \else - \setbox0=\vbox - \bgroup - \def\doEndOfTableLine##1##2##3{\normalTABLElineformat##2##3}% - \restartTABLE\TABLEtail - \finishTABLE - \global\TABLEtailheight=\ht0 - \fi - \else - \global\TABLEheadheight=\!!zeropoint - \global\TABLEtailheight=\!!zeropoint - \fi - \global\TABLEheight=\!!zeropoint - \calculatemaxTABLEheight\docalculatemaxTABLEheight} - -%D \macros -%D {starttables} -%D -%D Split tables are specified using the plural form of the -%D start and stop commands. -%D -%D \showsetup{starttables} -%D -%D For example: -%D -%D \starttypen -%D \starttabellen[|||] -%D \HL -%D \VL element \VL atom weight \VL\AR -%D \HL -%D \VL ....... \VL ........... \VL\AR -%D \VL ....... \VL ........... \VL\AR -%D \HL -%D \stoptabellen -%D \stoptypen - -\def\starttabellen% - {\bgroup - \ifinsidefloat\else - \baselinecorrection - \flushfootnotes - \topbaselinecorrection - \fi - \forgetall - \global\let\absmaxTABLEheight=\!!zeropoint - \splittablestrue - \global\TABLEinbreakfalse - \firststagestartTABLE} - -\def\stoptabellen% - {\TABLEtail - \finishTABLE - \ifinsidefloat\else - \flushfootnotes - \botbaselinecorrection - \fi - \egroup} - -%D When the table in the previous example is split across -%D pages, only the first gets a head. We could have said -%D something like: -%D -%D \starttypen -%D \starttabelkop -%D \HL -%D \VL element \VL atom weight \VL\AR -%D \HL -%D \stoptabelkop -%D -%D \starttabelstaart -%D \HL -%D \stoptabelstaart -%D -%D \starttabellen[|||] -%D \VL ....... \VL ........... \VL\AR -%D \VL ....... \VL ........... \VL\AR -%D \stoptabellen -%D \stoptypen -%D -%D This time each split table gets a head line and ends with -%D a rule. Keep in mind that such heads also apply to the -%D unbroken ones and should be defined local (grouped) if -%D needed. The rather complicated definition below is due to -%D the fact that the stopcondition is interface language -%D dependant. - -\let\TABLEhead =\empty -\let\TABLEtail=\empty - -\letvalue{\e!start \e!tabelkop}=\undefined -\letvalue{\e!stop \e!tabelkop}=\undefined -\letvalue{\e!start\e!tabelstaart}=\undefined -\letvalue{\e!stop \e!tabelstaart}=\undefined - -\expanded - {\def\csname\e!start\e!tabelkop\endcsname##1\csname\e!stop\e!tabelkop\endcsname% - {\noexpand\def\noexpand\TABLEhead{##1}}} - -\expanded - {\def\csname\e!start\e!tabelstaart\endcsname##1\csname\e!stop\e!tabelstaart\endcsname% - {\noexpand\def\noexpand\TABLEtail{##1}}} - -%D Redudant \type{\HL}'s are removed automatically, so -%D mid||lines can be used without problems. - -%D When calculating the available height of a split table, we -%D try to handle multi||column mode as good as possible. This -%D algoritm evolved during the development of the split option -%D and will probably be improved bit by bit. - -\def\docalculatemaxTABLEheight% - {\ifbinnenkolommen - \getcolumnstatus\column\scratchcounter\total\dimen0\goal\dimen2\\% - \else - \ifdim\pagegoal<\maxdimen - \dimen0=\pagetotal - \dimen2=\pagegoal - \else - \dimen0=\!!zeropoint - \dimen2=\teksthoogte - \fi - \fi - \advance\dimen2 by -\dimen0 - \global\TABLEmaxheight=\dimen2 - \global\advance\TABLEmaxheight by -\dp\strutbox - \ifdim\prevdepth<\maxdimen\ifdim\prevdepth>\!!zeropoint - \global\advance\TABLEmaxheight by -\dp\strutbox - \global\advance\TABLEmaxheight by -\parskip - \fi\fi} - -\def\nocalculatemaxTABLEheight% - {\ifbinnenkolommen - \getcolumnstatus\column\scratchcounter\total\dimen0\goal\dimen2\\% - \else - \dimen0=\!!zeropoint - \dimen2=\teksthoogte - \fi - \advance\dimen2 by -\dimen0 - \global\TABLEmaxheight=\dimen2 - \global\advance\TABLEmaxheight by -\dp\strutbox} - -\def\calculatemaxTABLEheight#1% - {\ifsplittables - #1\relax - \ifdim\TABLEmaxheight<3\baselineskip \relax % instelbaar maken - \ifbinnenkolommen - \nobreak - \kern\dimen2 - \goodbreak - \else - \goodbreak % \pagina - \fi - \removeTABLEtopskip - \nocalculatemaxTABLEheight - \fi - \ifdim\TABLEmaxheight<\absmaxTABLEheight % forces equal columns - \global\TABLEmaxheight=\absmaxTABLEheight - \else - \xdef\absmaxTABLEheight{\the\TABLEmaxheight}% - \fi - \global\TABLEheight=\!!zeropoint - \else - \global\TABLEmaxheight=\maxdimen - \fi} - -%D When splitting tables, we have to remove the top skip when -%D we're in the main vertical list, else we remove whatever -%D skip \TEX\ adds. - -\def\removeTABLEtopskip% - {\ifinsidefloat - \hbox{\strut}\kern-\lineheight - \else - \hbox{}\kern-\topskip - \fi} - -%D We need an alternative for the normal complex or simple -%D commands, because assignments in these system commands -%D conflict with \type{\noalign}. This alternative is about -%D as efficient as possible. - -\def\complexorsimpleTable#1#2% - {\getvalue{\if[\noexpand#2\s!complex\else\s!simple\fi\c!Table#1}#2} - -%D The order of the next macros is more or less random. First -%D we implement error recovery. Errors are reported to the -%D screen and log file as well as visualized in the table in -%D teletype. - -\def\handleTABLEerror% - {\ifTABLEgrayline \else - \ifnum\TABLEerror=\TABLEunknown \else - \setTABLEaction\TABLEunknown - \global\let\checkTABLEautorow=\empty - \global\let\chuckTABLEautorow=\empty - \fi - \ifcase\TABLEerror - % no error - \or - % \TABLEmissingrow - \tttf [missing row]% - \writestatus{TABLE}{missing row}% - \SR - \or - % \TABLEmissingcolumn - \fillTABLEcolumns - \tttf [missing column]% - \writestatus{TABLE}{missing column}% - \SR - \or - % \TABLEspanoverflow - \fillTABLEcolumns - \tttf [columnspan too large]% - \writestatus{TABLE}{columnspan too large}% - \SR - \or - % \TABLEdivisionoverflow - \fillTABLEcolumns - \tttf [division line too long]% - \writestatus{TABLE}{division line too long}% - \SR - \fi - \fi - \ifnum\TABLEerror=\TABLEunknown \else - \finishTABLErow - \fi} - -\def\finishTABLErow% - {\crcr - \TABLEnoalign - {\nobreak - \setTABLEaction\TABLEunknown - \setTABLEerror\TABLEunknown - \global\let\checkTABLEautorow=\empty - \global\let\chuckTABLEautorow=\empty - \global\currentTABLEcolumn=0 }} - -\def\fillTABLEcolumns% - {\ifnum\currentTABLEcolumn>\maxTABLEcolumn \else - \global\advance\currentTABLEcolumn by 1 - \normalTABLEquote - \expandafter\fillTABLEcolumns - \fi} - -%D Next we enter the more complicated area of column and row -%D switching. I won't go into much detail from now on, but just -%D mention the general principles. -%D -%D \startopsomming[3*ruim] -%D \sym{\type{\SR}} end a separate row (between rules) -%D \sym{\type{\FR}} end a first row (after a rule) -%D \sym{\type{\MR}} end a mid row (between text lines) -%D \sym{\type{\LR}} end a last row (before a rule) -%D \stopopsomming -%D -%D and best of all: -%D -%D \startopsomming[verder] -%D \sym{\type{\AR}} end a row with automatic spacing -%D \stopopsomming -%D -%D As far as possible, we report confusing situations. In -%D most cases one can use \type{\AR}, which transfigurates -%D itself into one of the other types. -%D -%D \starttypen -%D \starttabel[||] -%D \HL -%D \VL a separate row \VL\SR -%D \HL -%D \VL a first row \VL\FR -%D \VL a mid row \VL\MR -%D \VL a last row \VL\LR -%D \HL -%D \stoptabel -%D \stoptypen -%D -%D In this example we could have used \type{\AR} without -%D problems. -%D -%D Color or gray scale backgrounds precede the content. They -%D are passed over horizontal (division) lines when needed. -%D Errors in the color template are traced elsewhere. Here we -%D only check for inconsistent spacing. Due to the way \TEX\ -%D handles alignments, we cannot automate spacing for colored -%D rows and columns. - -\chardef\TABLErowzero=0 - -\def\checkTABLErow#1% pure for message purposes - {\ifTABLEgraydone - \convertargument #1\to\asciiA - \convertcommand\TABLEendBCL\to\asciiB - \ifx\asciiA\asciiB \else - \writestatus{TABLE}{confusing \asciiA\space and \asciiB}% - \gdef\TABLEgraylineerror% - {\global\let\TABLEgraylineerror=\empty - [\asciiA\unskip<->\asciiB\unskip]}% - \fi - \global\TABLEgraydonefalse - \fi} - -\def\defineTABLEendings% - {\let\SR=\TableSR - \let\FR=\TableFR - \let\MR=\TableMR - \let\LR=\TableLR - \let\AR=\TableAR} - -\def\TableSR% - {\ifTABLEgrayline \else - \ifnum\TABLEaction=\TABLEfirstrow - \writestatus{TABLE}{change \string\SR\space into \string\MR/\string\LR}% - \else\ifnum\TABLEaction=\TABLEmidrow - \writestatus{TABLE}{change \string\SR\space into \string\MR/\string\LR}% - \else\ifnum\TABLEaction=\TABLEmidrow - \writestatus{TABLE}{change \string\SR\space into \string\MR/\string\LR}% - \fi\fi\fi - \fi - \checkTABLErow\SR - \endTABLErow\TABLEseparaterow\TABLErowfactor\TABLErowfactor} - -\def\TableFR% - {\ifTABLEgrayline \else - \ifnum\TABLEaction=\TABLEmidrow - \writestatus{TABLE}{change \string\FR\space into \string\MR/\string\LR}% - \else\ifnum\TABLEaction=\TABLElastrow - \writestatus{TABLE}{change \string\FR\space into \string\MR/\string\LR}% - \fi\fi - \fi - \checkTABLErow\FR - \endTABLErow\TABLEfirstrow\TABLErowfactor\TABLErowzero} - -\def\TableMR% - {\ifTABLEgrayline \else - \ifnum\TABLEaction=\TABLErule - \writestatus{TABLE}{change \string\MR\space into \string\FR/\string\SR}% - \else\ifnum\TABLEaction=\TABLElastrow - \writestatus{TABLE}{change \string\MR\space into \string\FR}% - \fi\fi - \fi - \checkTABLErow\MR - \endTABLErow\TABLEmidrow00} - -\def\TableLR% - {\ifTABLEgrayline \else - \ifnum\TABLEaction=\TABLErule - \writestatus{TABLE}{change \string\LR\space into \string\FR/\string\SR}% - \fi - \fi - \checkTABLErow\LR - \endTABLErow\TABLElastrow\TABLErowzero\TABLErowfactor} - -%D \macros -%D {ifcheckTABLEcolums} -%D -%D -%D The next macros handle the actual row ending. This macro -%D also take care of space corrections due to table splitting -%D when \type{\MR} and collegues are used. When tracing is -%D enabled, the corrections as well as the values used to -%D determine the available space are shown (in color). By default -%D checking is off. - -\newif\ifcheckTABLEcolumns - -\let\beforeTABLEline=\empty -\let\afterTABLEline =\empty - -\def\doendTABLErow#1#2#3% - {\handleTABLEbreak#2#3% - \beforeTABLEline - \ifcase#1\relax - % unknown - \or - \endofTABLEline[blue][\SR->\SR]\TABLErowfactor\TABLErowfactor - \or - \endofTABLEline[red][\FR->\FR]\TABLErowfactor\TABLErowzero - \or - \ifnum\TABLEforce=\TABLEforcelastrow - \endofTABLEline[red][\MR->\LR]\TABLErowzero\TABLErowfactor - \else\ifnum\TABLEforce=\TABLEforcefirstrow - \endofTABLEline[red][\MR->\FR]\TABLErowfactor\TABLErowzero - \else - \endofTABLEline[green][\MR->\MR]\TABLErowzero\TABLErowzero - \fi\fi - \or - \endofTABLEline[red][\LR->\LR]\TABLErowzero\TABLErowfactor - \fi - \TABLEnoalign - {\setTABLEforce\TABLEunknown - \global\currentTABLEcolumn=0 }% - \afterTABLEline} - -\def\endTABLErow#1#2#3% - {\setTABLEaction#1% - \ifTABLEgrayline - \finishTABLErow - \else - \ifnum\currentTABLEcolumn>\maxTABLEcolumn - \doendTABLErow{#1}{#2}{#3}% - \else\ifcheckTABLEcolumns - \setTABLEerror\TABLEmissingcolumn - \handleTABLEerror - \else - \doendTABLErow{#1}{#2}{#3}% - \fi\fi - \fi} - -%D Handling \type{\AR} is postponed till the next row. The -%D check takes care of the first and mid rows, the chuck macro -%D |<|how about that name|>| handles the last row. - -\def\TableAR% - {\ifTABLEgraydone - \global\let\checkTABLEautorow=\empty - \global\let\chuckTABLEautorow=\empty - \global\TABLEgraydonefalse - \TABLEendBCL - \else - \global\let\checkTABLEautorow=\docheckTABLEautorow - \global\let\chuckTABLEautorow=\dochuckTABLEautorow - \fi} - -\let\checkTABLEautorow=\empty -\let\chuckTABLEautorow=\empty - -\def\docheckTABLEautorow% - {\global\let\checkTABLEautorow=\empty - \ifnum\TABLEaction=\TABLErule \FR - \else\ifnum\TABLEaction=\TABLEunknown \FR - \else \MR - \fi\fi} - -\def\dochuckTABLEautorow% - {\global\let\checkTABLEautorow=\empty - \global\let\chuckTABLEautorow=\empty - \ifnum\TABLEaction=\TABLErule \SR - \else\ifnum\TABLEaction=\TABLEunknown \SR - \else \LR - \fi\fi} - -%D When a table is split, we also add a tail and when present -%D we repeat the table head. - -\def\handleTABLEbreak#1#2% - {\ifsplittables - \setbox0=\hbox{\AugmentedTableStrut{#1}{#2}}% - \getboxheight\dimen0\of\box0% - \ifTABLEgrayline \else - \global\advance\TABLEheight by \dimen0 - \fi - \ifTABLEinbreak - \global\let\beforeTABLEline=\empty - \gdef\afterTABLEline{\TABLEnoalign{\nobreak}}% - \else - \dimen2=\TABLEheight - \advance\dimen2 by \dp\strutbox - \advance\dimen2 by \TABLEtailheight - \advance\dimen2 by \TABLEcaptionheight - \advance\dimen2 by \lineheight % we're ahead - \ifdim\dimen2>\TABLEmaxheight - \gdef\beforeTABLEline% - {\setTABLEforce\TABLEforcelastrow}% - \gdef\afterTABLEline% - {\TABLEnoalign - {\nobreak - \global\TABLEinbreaktrue}% - \TABLEtail - \TABLEnoalign - {\goodbreak - \calculatemaxTABLEheight\nocalculatemaxTABLEheight - \removeTABLEtopskip - \setTABLEaction\TABLEunknown - \setTABLEforce \TABLEunknown}% - \TABLEhead - \TABLEnoalign - {\nobreak - \global\TABLEinbreakfalse - \setTABLEforce\TABLEforcefirstrow}}% - \else - \global\let\beforeTABLEline=\empty - \gdef\afterTABLEline{\TABLEnoalign{\nobreak}}% - \fi - \fi - \else - \global\let\beforeTABLEline=\empty - \gdef\afterTABLEline{\TABLEnoalign{\nobreak}}% - \fi} - -%D When tables are split, the spacing before and after a -%D horizontal rule is corrected according to whet we expect. - -\def\endofTABLEline[#1][#2->#3]#4#5% - {\ifx#2#3\else - \writestatus{TABLE}{\string#2\space changed into \string#3}% - \fi - \iftracetables - \bgroup - \tttf\space - \ifnum\TABLEerror=\TABLEunknown - \ifx#2#3\else\string#2->\fi - \else - ->% - \fi - \color[#1]{\string#3}% - \ifsplittables\space\the\TABLEmaxheight/\the\TABLEheight\fi - \ifx\TABLEgraylineerror\empty - \space\TABLEgraylinestatus - \else - \space\TABLEgraylineerror - \fi - \egroup - \else\ifx\TABLEgraylineerror\empty \else - \bgroup - \tttf\space\TABLEgraylineerror - \egroup - \fi\fi - \global\let\TABLEgraylinestatus=\empty - \global\let\TABLEgraylineerror =\empty - \expandafter\normalTABLElineformat#4#5\crcr % \crcr nodig ? - \TABLEnoalign{\nobreak\global\setTABLEactiontrue}} - -%D In order to prevent (as good as possible) alignment overflow -%D and therefore \TEX\ error messages, we check the maximum -%D number of columns. We keep track of the current column and -%D maximum column by means of two \COUNTERS. Keep in mind that -%D the number of \type{|}'s and \type{\VL}'s or alike is always -%D one more than the number of columns. - -\newcount\currentTABLEcolumn -\newcount\maxTABLEcolumn - -%D While defining this macro we change the \CATCODE\ of -%D \type{|}. When counting the bars, we use a non active -%D representation of the bar, simply because we cannot be sure -%D if the bar is active or not.\voetnoot{Normally it is, but -%D \TABLE\ changes the catcode when needed.} - -\bgroup -\catcode`\|=\@@other -\gdef\getTABLEnofcolumns#1% - {\bgroup - \convertargument#1\to\ascii - \@EA\doglobal\@EA\counttoken\@EA|\@EA\in\ascii\to\maxTABLEcolumn - \global\advance\maxTABLEcolumn by -1 - \egroup} -\egroup - -%D \startopsomming[3*ruim] -%D \sym{\type{\VL}} a vertical line -%D \sym{\type{\VC}} a vertical colored line -%D \sym{\type{\HL}} a horizontal line -%D \sym{\type{\HC}} a horizontal colored line -%D \stopopsomming - -\def\defineTABLErules% - {\let\VL=\TableVL - \let\VC=\TableVC - \let\HL=\TableHL - \let\HC=\TableHC} - -\def\TableVL% - {\checkTABLEautorow - \nextTABLEgrayline - \ifnum\currentTABLEcolumn>\maxTABLEcolumn - \setTABLEerror\TABLEmissingrow - \handleTABLEerror - \else - \global\advance\currentTABLEcolumn by 1 - \expandafter\doTableVL - \fi} - -\def\doTableVL% - {\complexorsimpleTable{VL}} - -\def\complexTableVL[#1]% - {\scratchcounter=0#1% - \multiply\scratchcounter by \@@tiVLwidth - \setxvalue{wVL\the\currentTABLEcolumn}{\the\scratchcounter}% - \simpleTableVL} - -\def\simpleTableVL% - {\doifundefined{wVL\the\currentTABLEcolumn}% - {\setgvalue{wVL\the\currentTABLEcolumn}{\@@tiVLwidth}}% - \gdef\TABLEbeforebar% - {\getvalue{bVL\the\currentTABLEcolumn}% - \global\letvalue{bVL\the\currentTABLEcolumn}=\empty}% - \gdef\TABLEafterbar% - {\getvalue{eVL\the\currentTABLEcolumn}% - \global\letvalue{eVL\the\currentTABLEcolumn}=\empty}% - \edef\@@tiVLwidth{\getvalue{wVL\the\currentTABLEcolumn}}% - \expanded{\normalTABLEcomplexbar{\@@tiVLwidth}}} - -\def\resetVLvalues% - {\dostepwiserecurse{0}{\maxTABLEcolumn}{1} - {\global\setvalue{wVL\recurselevel}{\@@tiVLwidth}% - \global\letvalue{bVL\recurselevel}=\empty - \global\letvalue{eVL\recurselevel}=\empty}% - \global\currentTABLEcolumn=0 } - -\def\TableVC% - {\checkTABLEautorow - \nextTABLEgrayline - \ifnum\currentTABLEcolumn>\maxTABLEcolumn - \setTABLEerror\TABLEmissingrow - \handleTABLEerror - \else - \global\advance\currentTABLEcolumn by 1 - \expandafter\doTableVC - \fi} - -\def\doTableVC% - {\complexorsimpleTable{VC}} - -\def\complexTableVC[#1]% - {\global\setvalue{bVC\the\currentTABLEcolumn}% - {\localstartcolor[#1]}% - \global\setvalue{eVC\the\currentTABLEcolumn}% - {\localstopcolor}% - \simpleTableVC} - -\def\simpleTableVC% - {\global\setvalue{bVL\the\currentTABLEcolumn}% - {\getvalue{bVC\the\currentTABLEcolumn}}% - \global\setvalue{eVL\the\currentTABLEcolumn}% - {\getvalue{eVC\the\currentTABLEcolumn}}% - \doTableVL} - -\def\TableHL% - {\ifnum\currentTABLEcolumn>\maxTABLEcolumn - \chuckTABLEautorow - \else\ifnum\currentTABLEcolumn=0 - \chuckTABLEautorow - \else - \setTABLEerror\TABLEmissingcolumn - \handleTABLEerror - \fi\fi - \complexorsimpleTable{HL}} - -\def\complexTableHL[#1]% - {\TABLEnoalign - {\scratchcounter=0#1% - \multiply\scratchcounter by \@@tiHLheight - \edef\@@tiHLheight{\the\scratchcounter}% - \simpleTableHL}} - -\def\simpleTableHL% - {\TABLEnoalign - {\nobreak - \ifnum\TABLEaction=\TABLErule - \writestatus{TABLE}{skipping \string\HL}% \statusmessage - \else - \ifnum\TABLEaction=\TABLEmidrow - \writestatus{TABLE}{change \string\MR\space into \string\LR/\string\SR}% - \else\ifnum\TABLEaction=\TABLEfirstrow - \writestatus{TABLE}{change \string\MR\space into \string\SR}% - \fi\fi - \startHLcommand - \expandafter\normalTABLEfullrule\@@tiHLheight - \stopHLcommand - \global\let\startHLcommand=\empty - \global\let\stopHLcommand =\empty - \accountTABLElinewidth - \fi - \setTABLEaction\TABLErule - \nobreak}} - -\let\startHLcommand=\empty -\let\stopHLcommand =\empty - -\def\TableHC% - {\complexorsimpleTable{HC}} - -\def\complexTableHC[#1]% - {\TABLEnoalign - {\gdef\startHCcommand{\localstartcolor[#1]}% - \gdef\stopHCcommand {\localstopcolor}}% - \simpleTableHC} - -\def\simpleTableHC% - {\TABLEnoalign - {\global\let\startHLcommand=\startHCcommand - \global\let\stopHLcommand =\stopHCcommand}% - \HL} - -%D \startopsomming[3*ruim] -%D \sym{\type{\NL}} a vertical skip -%D \sym{\type{\NR}} goto the next row -%D \sym{\type{\NC}} goto the next column -%D \sym{\type{\FC}} a first column -%D \sym{\type{\MC}} a mid column -%D \sym{\type{\LC}} a last column -%D \stopopsomming - -% n+1 uitleggen - -\def\defineTABLEsteps% - {\let\NL=\TableNL - \let\NR=\TableNR - \let\NC=\TableNC - \let\FC=\TableNC - \let\MC=\TableNC - \let\LC=\TableNC} - -\def\TableNL% - {\complexorsimpleTable{NL}} - -\def\complexTableNL[#1]% - {\TABLEnoalign - {\edef\@@tiNL{#1}% - \simpleTableNL}}% - -\def\simpleTableNL% - {\TABLEnoalign - {\nobreak - \setbox0=\vbox{\blanko[\@@tiNL]}% - \global\advance\TABLEheight by \ht0 - \vskip\ht0 - \nobreak}} - -\def\TableNR% - {\ifnum\currentTABLEcolumn>\maxTABLEcolumn - \global\currentTABLEcolumn=0 - \normalTABLElineending - \else - \setTABLEerror\TABLEmissingcolumn - \handleTABLEerror - \fi - \TABLEnoalign - {\nobreak - \setTABLEaction\TABLEunknown}} - -\def\TableNC% - {\checkTABLEautorow - \nextTABLEgrayline - \ifnum\currentTABLEcolumn>\maxTABLEcolumn - \setTABLEerror\TABLEmissingrow - \handleTABLEerror - \else - \global\advance\currentTABLEcolumn by 1 - \normalTABLEquote - \fi} - -\bgroup -\catcode`\|=\@@active -\catcode`\"=\@@active -\gdef\redefinetablebarandquote% - {\def|{\VL}% % \normalTABLEsimplebar - \def\|##1{\VL[##1]}% % \normalTABLEcomplexbar - \def"{\NC}} % \normalTABLEquote -\egroup - -%D \startopsomming[3*ruim] -%D \sym{\type{\DL}} -%D \sym{\type{\DC}} -%D \sym{\type{\DR}} -%D \stopopsomming - -\newif\ifTABLEdivision - -\def\defineTABLEdivisions% - {\global\TABLEdivisionfalse % in start - \let\DL=\TableDL - \let\DC=\TableDC - \let\DR=\TableDR} - -\def\checkTABLEdivision% - {\ifTABLEdivision \else - \chuckTABLEautorow - \global\currentTABLEcolumn=0 - \global\TABLEdivisiontrue - \fi} - -\def\TableDL% - {\checkTABLEdivision - \complexorsimpleTable{DL}} - -\def\simpleTableDL% - {\complexTableDL[1]} - -\def\complexTableDL[#1]% - {\ifnum\TABLEaction=\TABLErule - \writestatus{TABLE}{skipping \string\DL}% - \else - \ifnum\TABLEaction=\TABLEmidrow - \writestatus{TABLE}{change \string\MR\space into \string\LR/\string\SR}% - \else\ifnum\TABLEaction=\TABLEfirstrow - \writestatus{TABLE}{change \string\MR\space into \string\SR}% - \fi\fi - \setTABLEaction=\TABLEunknown - \ifnum\currentTABLEcolumn>\maxTABLEcolumn - \setTABLEerror\TABLEmissingrow - \handleTABLEerror - \fi - %\startHLcommand - \ifnum#1=1 - \global\advance\currentTABLEcolumn by 2 - \let\next=\normalTABLEsinglerule - \else - \ifnum#1<\maxTABLEcolumn - \global\advance\currentTABLEcolumn by 1 % was 2 - \def\next{\normalTABLEmultirule{#1}}% - \else - \setTABLEerror\TABLEdivisionoverflow - \let\next=\handleTABLEerror - \fi - \fi - \next - %\stopHLcommand - %\global\let\startHLcommand=\empty - %\global\let\stopHLcommand =\empty - \fi} - -\def\TableDC% - {\checkTABLEdivision - \checkTABLEautorow - \ifnum\currentTABLEcolumn>\maxTABLEcolumn - \setTABLEerror\TABLEmissingrow - \handleTABLEerror - \else - \global\advance\currentTABLEcolumn by 1 - \normalTABLEquote - \fi} - -\def\TableDR% - {\ifnum\currentTABLEcolumn<\maxTABLEcolumn % silent recovery - \setTABLEerror\TABLEmissingcolumn % some day warning - \handleTABLEerror - \else - \global\currentTABLEcolumn=0 % nog check - \normalTABLElineending - \fi - \TABLEnoalign - {\nobreak - \global\TABLEdivisionfalse - \accountTABLElinewidth % temporary solution - \setTABLEaction\TABLErule}} - -\def\accountTABLElinewidth% - {\scratchdimen=\LineThicknessUnit - \global\advance\TABLEheight by \@@tiHLheight\scratchdimen} - -%D \startopsomming[3*ruim] -%D \sym{\type{\BC}} -%D \sym{\type{\BR}} -%D \sym{\type{\BACKGROUND}} -%D \sym{\type{\CL}} -%D \sym{\type{\RL}} -%D \sym{\type{\BL}} -%D \sym{\type{\RASTER}} -%D \sym{\type{\COLOR}} -%D \stopopsomming - -% definieer: \BC \BL -% herhaal: \BR -% definieer: \CL \RL (eerste \CL[green] = hele row! / \CL[1,green]) -% dus: \CL en \RL mix tussen \HL en \BL - -\def\defineTABLEbackgrounds% - {\let\BC =\TableBC - \let\BL =\TableBL - \let\BR =\TableBR - \let\BACKGROUND=\TableBR - \let\CL =\TableCL - \let\RL =\TableRL - \let\COLOR =\TableCOLOR - \let\RASTER =\TableRASTER - \global\let\lastTABLEc=\@@tiachtergrondkleur - \global\let\lastTABLEr=\@@tiachtergrondraster - \doifinsetelse{\@@tiachtergrond}{c,color} - {\global\chardef\TABLEcr=1} - {\global\chardef\TABLEcr=2}} - -\def\TableBC% - {\ifTABLEgrayline - \normalTABLEquote - \else - \TABLEnoalign\bgroup - \global\let\nextTABLEgrayline=\executeTABLEgrayline - \let\BL=\doTableBL - \let\BC=\doTableBC - \expandafter\doTableBC - \fi} - -\def\doTableBC% - {\addtoTABLEgrayline{\BC}% - \gobbleTableBCL} - -\def\TableBL% - {\TABLEnoalign\bgroup - \global\let\nextTABLEgrayline=\executeTABLEgrayline - \let\BL=\doTableBL - \let\CL=\doTableCL - \let\RL=\doTableRL - \let\BC=\doTableBC - \doTableBL} - -\def\doTableBL% - {\complexorsimpleTable{BL}} - -\def\simpleTableBL% - {\complexTableBL[,]} - -\def\complexTableBL[#1]% - {\analyzeTABLEcr[#1]% - \handleTABLEcr} - -\def\TableBR#1% - {\TABLEnoalign - {\global\let\nextTABLEgrayline=\executeTABLEgrayline - \checkTABLEgrayline#1\BR - \global\TABLEgraylinetrue}} - -\def\analyzeTABLEcr[#1]% - {\doanalyzeTABLEcr[#1,,]} - -\def\doanalyzeTABLEcr[#1,#2,#3]% - {\doifnumberelse{#1x} - {\dodoanalyzeTABLEcr[#1,#2,#3]} - {\dodoanalyzeTABLEcr[1,#1,#2]}} - -\def\dodoanalyzeTABLEcr[#1,#2,#3]% - {\global\chardef\TABLEn=#1\relax - \processaction - [#2] - [ c=>\global\chardef\TABLEcr=1, - color=>\global\chardef\TABLEcr=1, - r=>\global\chardef\TABLEcr=2, - raster=>\global\chardef\TABLEcr=2]% - \ifcase\TABLEcr \or - \doifnot{#3}{}{\xdef\lastTABLEc{#3}}% - \or - \doifnot{#3}{}{\xdef\lastTABLEr{#3}}% - \fi} - -\def\handleTABLEcr% - {\relax % else funny side effect - \ifcase\TABLEcr - % Can't happen! - \or - \addtoTABLEgrayline{\complexTableCOLOR[\the\TABLEn,\lastTABLEc]}% - \else - \addtoTABLEgrayline{\complexTableRASTER[\the\TABLEn,\lastTABLEr]}% - \fi - \gobbleTableBCL} - -\def\analyzeTABLEcrl#1[#2]% - {\doanalyzeTABLEcrl#1[#2,,]} - -\def\doanalyzeTABLEcrl#1[#2,#3,#4]% - {\doifnumberelse{#2x} - {\dodoanalyzeTABLEcr[#2,#1,#3]} - {\dodoanalyzeTABLEcr[\ifTABLEgrayline1\else\maxTABLEcolumn\fi,#1,#2]}} - -\def\TableCL% - {\TABLEnoalign\bgroup - \global\let\nextTABLEgrayline=\executeTABLEgrayline - \let\BL=\doTableBL - \let\CL=\doTableCL - \let\RL=\doTableRL - \let\BC=\doTableBC - \doTableCL} - -\def\doTableCL% - {\complexorsimpleTable{CL}} - -\def\simpleTableCL% nog eens \"e\"en lijn van maken - {\BL[\the\maxTABLEcolumn,c,\lastTABLEc]} - -\def\complexTableCL[#1]% - {\analyzeTABLEcrl{c}[#1]% - \handleTABLEcr} - -\def\TableRL% - {\TABLEnoalign\bgroup - \global\let\nextTABLEgrayline=\executeTABLEgrayline - \let\BL=\doTableBL - \let\CL=\doTableCL - \let\RL=\doTableRL - \let\BC=\doTableBC - \doTableRL} - -\def\doTableRL% - {\complexorsimpleTable{RL}} - -\def\simpleTableRL% - {\BL[\the\maxTABLEcolumn,r,\lastTABLEr]} - -\def\complexTableRL[#1]% - {\analyzeTABLEcrl{r}[#1]% - \handleTABLEcr} - -\def\checkTABLEgrayline#1#2% - {\!!doneatrue - \ifx#1\AR - \!!doneafalse - \else\ifx#1\SR\else\ifx#1\FR\else\ifx#1\MR\else\ifx#1\LR\else - \!!doneafalse - \fi\fi\fi\fi\fi - \if!!donea - \gdef\TABLEgraylinestatus% - {[\string#1]}% - \gdef\TABLEendBCL% - {#1}% - \else - \gdef\TABLEgraylineerror% - {[\string#2\string#1->\string#2\string\SR]}% - \gdef\TABLEendBCL% - {\SR}% - \fi} - -\def\endTABLErowGL#1#2#3% - {\ifcase#1\relax - % unknown - \or - \doPreTableGL\TABLErowfactor\TABLErowfactor - \or - \doPreTableGL\TABLErowfactor\TABLErowzero - \or - \ifnum\TABLEforce=\TABLEforcelastrow - \doPreTableGL\TABLErowzero\TABLErowfactor - \else\ifnum\TABLEforce=\TABLEforcefirstrow - \doPreTableGL\TABLErowfactor\TABLErowzero - \else - \doPreTableGL\TABLErowzero\TABLErowzero - \fi\fi - \or - \doPreTableGL\TABLErowzero\TABLErowfactor - \fi} - -\def\doPreTableGL#1#2% betere namen - {\xdef\OldLineThicknessFactor{\the\LineThicknessFactor}% - \xdef\OldLineThicknessUnit{\the\LineThicknessUnit}% - \global\LineThicknessFactor=1 - \setbox0=\hbox{\AugmentedTableStrut{#1}{#2}}% - \getboxheight\dimen0\of\box0\relax - \xdef\TABLEgraylineHeight{\the\dimen0}% - \global\LineThicknessUnit=\TABLEgraylineHeight} - -\def\doPostTableGL% - {\global\LineThicknessFactor=\OldLineThicknessFactor - \global\LineThicknessUnit =\OldLineThicknessUnit} - -% kan simpeler - -\def\docomplexTableCOLOR[#1]% - {\dodocomplexTableGL\localstartcolor\localstopcolor - [#1,\lastTABLEc,,]} - -\gdef\docomplexTableRASTER[#1]% - {\dodocomplexTableGL\localstartraster\localstopraster - [#1,\lastTABLEr,,]} - -\def\dodocomplexTableGL#1#2[#3,#4,#5,#6]% - {\doifelsenothing{#4}{#1[#5]}{#1[#4]}% - \doPreTableGL\TABLEendofrowheight\TABLEendofrowdepth - \ifnum#3=1 % else conflict with \omit in \= - \let\next=\normalTABLEsinglerule - \else - \def\next{\normalTABLEmultirule{#3}}% - \fi - \next - \doPostTableGL - #2} - -\def\TableBACKGROUND% - {\TableBR} - -\def\simpleTableRASTER#1% - {\docomplexTableRASTER[1]#1} - -\def\complexTableRASTER[#1]% - {\docomplexTableRASTER[#1]} - -\def\simpleTableCOLOR% - {\docomplexTableCOLOR[1]} - -\def\complexTableCOLOR[#1]% - {\docomplexTableCOLOR[#1]} - -\def\TableRASTER% - {\complexorsimpleTable{RASTER}} - -\def\TableCOLOR% - {\complexorsimpleTable{COLOR}} - -\def\addtoTABLEgrayline#1% - {\TABLEgraytoks=\expandafter{\TABLEgrayline}% - \xdef\TABLEgrayline{\the\TABLEgraytoks\noexpand#1}} - -\def\setTableBCL#1#2% - {\ifx#1#2% - \gdef\TABLEgraylinestatus{[\string#1]}% - \gdef\TABLEendBCL{#1}% - \addtoTABLEgrayline{#1}% - \else - \gdef\TABLEgraylineerror{[\string#1->\string#2]}% - \gdef\TABLEendBCL{#2}% - \addtoTABLEgrayline{#2}% - \fi} - -\def\gobbleTableBCL#1% - {\ifx#1\BC \let\next=\doTableBC \else - \ifx#1\BL \let\next=\doTableBL \else - \ifx#1\SR \setTableBCL\SR\SR \let\next=\egroup \else - \ifx#1\FR \setTableBCL\FR\FR \let\next=\egroup \else - \ifx#1\MR \setTableBCL\MR\MR \let\next=\egroup \else - \ifx#1\LR \setTableBCL\LR\LR \let\next=\egroup \else - \setTableBCL#1\SR \let\next=\egroup - \fi\fi\fi\fi\fi\fi - \next} - -\def\executeTABLEgrayline% - {\TABLEnoalign - {\def\BC% - {\advance\currentTABLEcolumn by 1 }% - \def\dodocomplexTableGL##1##2[##3,##4,##5,##6]% - {\BC\advance\currentTABLEcolumn by ##3 }% - \let\endTABLErow=\endTABLEgrayrow - \currentTABLEcolumn=0 - \TABLEgrayline\TABLEendBCL % determine n of columns and height - \advance\currentTABLEcolumn by -1 - \ifnum\currentTABLEcolumn>\maxTABLEcolumn - % error message too long line - \global\let\TABLEgrayline=\empty - \else - % \message{n of color columns: \the\currentTABLEcolumn}\wait - \global\TABLEgraylinetrue % vanaf hier nog checken - \fi - \global\currentTABLEcolumn=0}% - \unskip\TABLEgrayline\TABLEendBCL - \TABLEnoalign - {\nobreak - \vskip-\TABLEgraylineHeight - \nobreak - \global\setTABLEactiontrue - \global\currentTABLEcolumn=0 - \global\let\nextTABLEgrayline=\empty - \global\TABLEgraydonetrue - \global\TABLEgraylinefalse}} - -\def\endTABLEgrayrow#1#2#3% - {\ifcase#1\relax - \global\chardef\TABLEendofrowheight=\TABLErowfactor - \global\chardef\TABLEendofrowdepth =\TABLErowfactor - \or - \global\chardef\TABLEendofrowheight=\TABLErowfactor - \global\chardef\TABLEendofrowdepth =\TABLErowfactor - \or - \global\chardef\TABLEendofrowheight=\TABLErowfactor - \global\chardef\TABLEendofrowdepth =\TABLErowzero - \or - \ifnum\TABLEforce=\TABLEforcelastrow - \global\chardef\TABLEendofrowheight=\TABLErowzero - \global\chardef\TABLEendofrowdepth =\TABLErowfactor - \else\ifnum\TABLEforce=\TABLEforcefirstrow - \global\chardef\TABLEendofrowheight=\TABLErowfactor - \global\chardef\TABLEendofrowdepth =\TABLErowzero - \else - \global\chardef\TABLEendofrowheight=\TABLErowzero - \global\chardef\TABLEendofrowdepth =\TABLErowzero - \fi\fi - \or - \global\chardef\TABLEendofrowheight=\TABLErowzero - \global\chardef\TABLEendofrowdepth =\TABLErowfactor - \fi} - - -\def\defineTABLEshorthands% - {\def\TWO {\use{2}}% - \def\THREE{\use{3}}% - \def\FOUR {\use{4}}% - \def\FIVE {\use{5}}% - \def\SIX {\use{6}}% - \def\REF {\ReFormat}} - -\def\defineTABLEunits% - {\processaction - [\@@tiafstand] - [ \v!geen=>\OpenUp{0}{0}\def\LOW{\Lower6 }, - \v!klein=>\OpenUp{0}{0}\def\LOW{\Lower6 }, % == baseline - \v!middel=>\OpenUp{1}{1}\def\LOW{\Lower7 }, - \v!groot=>\OpenUp{2}{2}\def\LOW{\Lower8 }]% - \doifelse{\@@tiafstand}{\v!geen} - {\chardef\TABLErowfactor=0 } - {\chardef\TABLErowfactor=2 }} - -\def\dohandlebar% - {\ifmmode - \let\next=\domathmodebar - \else\ifintable - \let\next=\domathmodebar - \else - \let\next=\dotextmodebar - \fi\fi - \next} - -% De macro's t.b.v. instellingen. - -\def\steltabellenin% - {\dosingleargument\dosteltabellenin} - -\def\dosteltabellenin[#1]% - {\getparameters[\??ti][#1]% - \assignalfadimension{\@@tiVL}{\@@tiVLwidth} {2}{4}{6}% - \assignalfadimension{\@@tiHL}{\@@tiHLheight}{2}{4}{6}} - -\def\localTABLEsetup% - {\@@ticommandos\relax - \expanded{\switchtobodyfont[\@@tikorps]}% - \StrutHeightFactor =8 - \StrutDepthFactor =4 - \LineThicknessFactor=4 - \NormalTLTU ={.1pt}% - \NormalTSU ={\normalbaselineskip\divide\StrutUnit by 12 }% - \NormalTableUnits} - -\steltabellenin - [HL=\v!middel, - VL=\v!middel, - NL=\v!klein, - \c!afstand=\v!middel, - \c!korps=\the\bodyfontsize, - \c!commandos=, - \c!achtergrond=\v!raster, - \c!achtergrondraster=\@@rsraster, - \c!achtergrondkleur=] - -\def\ifintabel{\ifintable} % upward compatible - -\protect \endinput +%D \module
+%D [ file=core-tab,
+%D version=1997.10.10,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=\TABLE\ Embedding,
+%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.
+
+% e-tex: reverse rows or vadjust or ... in tables
+% \ifalign
+% \xhrule : calls for 'special' with width
+
+% melden als in kleur conflict, uitgestelde test op \SR\SR
+
+% verengelsen
+% interface
+
+% footnotes flushen
+% \......TABLE........ namen
+% kolommen testen
+% unbreakable kop definieren
+% voetnoten
+% meldingen
+% als direct \use{max} dan fout
+% \BREAKPOINT
+% breedte lijn telt
+% errors: ook gray in handle
+
+% \AR -> als in DL dan \DR
+
+% nieuw:
+%
+% \NL / \NL[blanko] is skip, nog default?
+% geen \HL in a row
+% \HL[n]
+% \VL[n] + remembers
+% c{colorspec} key
+% \HC[color[width]
+% \VC[color]
+% meldingen row, column, use, advise
+% \AR: UITSTELLEN / EXPERIMENTEEL
+
+
+% WAARDELOZE ERROR HANDLER
+
+% THIS RENEWED MODULE WORKS OK BUT STILL LOOKS BAD
+
+\writestatus{loading}{Context Core Macros / TaBlE Embedding}
+
+%D We felt no need to write our own table building macros,
+%D simply because Michael Wichura made a terrific one. This
+%D package is quite complete and well documented. In \CONTEXT\
+%D we provide a shell for consistent spacing as well as color
+%D support. Implementing these features without adapting the
+%D original macros is not trivial. One easilly gets conflicts
+%D with \type{\omit}, \type{\span} and \type{\noalign}, which
+%D means that we end up postponing and overloading macros,
+%D mostly global. Now, let's start with loading the main
+%D macros:
+
+\doifundefined{BeginTable}{\doinputonce{table.tex}}
+
+\unprotect
+
+%D \macros
+%D {inintable, ifsplittable}
+%D
+%D First we declare some variables. These show a bit what we
+%D are dealing with. First we introdoce some booleans that
+%D enable us, inside as well as outside this module, to
+%D determine in what mode we are.
+
+\newif\ifintable
+\newif\ifsplittables
+
+%D \macros
+%D {iftracetable}
+%D
+%D When I documented this module, I felt the need for tracing
+%D options. After implementing this feature, I also added
+%D warnings, error recovery and automatic spacing.
+
+\newif\iftracetables
+
+%D We show this feature in an eample that also shows some of
+%D the basic table typesetting commands.
+%D
+%D \startbuffer
+%D \starttabel[|||]
+%D \HL
+%D \VL first \VL second \VL\AR
+%D \HL
+%D \VL alfa \VL 1 \VL\AR
+%D \VL beta \VL 2 \VL\AR
+%D \VL gamma \VL 3 \VL\AR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \startcombinatie[2]
+%D {\tracetablesfalse\haalbuffer} {\type{\tracetablesfalse}}
+%D {\tracetablestrue\haalbuffer} {\type{\tracetablestrue}}
+%D \stopcombinatie
+%D
+%D This table is specified as:
+%D
+%D \typebuffer
+%D
+%D This examples shows about the minimum of commands needed to
+%D typeset such a table. In this table, the \type {\AR} is
+%D automatically translated into the more primitive (but more
+%D verbose) commands \type {\SR}, \type {\FR}, \type {\MR} and
+%D \type {\LR} commands.
+%D
+%D \startbuffer
+%D \starttabellen[|||]
+%D \HL
+%D \VL first \VL second \VL\AR
+%D \HL
+%D \VL alfa \VL 1 \VL\AR
+%D \VL beta \VL 2 \VL\AR
+%D \VL gamma \VL 3 \VL\AR
+%D \HL
+%D \stoptabellen
+%D \stopbuffer
+%D
+%D When we use the split table feature, we get a bit more
+%D information.
+%D
+%D {\tracetablesfalse\haalbuffer}
+%D
+%D Sometimes in tables information shows up that is not typed
+%D in by the user. These messages give a cue in what aspect a
+%D table definition is wrong.
+%D
+%D \startbuffer
+%D \starttabel[||||]
+%D \HL
+%D \VL first second \VL third \VL\AR
+%D \HL
+%D \VL alfa \VL 1 \VL a \VL\AR
+%D \VL beta \VL 2 \VL b \VL
+%D \VL gamma \VL \THREE{3} c \VL\AR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Those terrible table has three errors, which all show up in
+%D typeset messages. Errors cannot always recovered 100\% and
+%D therefore can result in two or more succesive messages, like
+%D in the last row.
+%D
+%D \haalbuffer
+
+%D Bringing color into tables is complicated by the mere fact
+%D that color is not part of \TEX. The main complication is
+%D that we don't know in advance how wide a column will be. I
+%D implemented color support in tables in the early 90's
+%D because I needed it for some articles on color. I have to
+%D admit that I seldom use the mechanism.
+%D
+%D Most color support in \CONTEXT\ makes use of colored rules.
+%D At first sight, one is tempted to implement colors in tables
+%D in a similar way, but as said, we don't know the dimensions
+%D in advance. It turns out however that we don't have to,
+%D simply because alignments take care of stretching rules to
+%D the appropritate dimensions. This means that we can provide
+%D backgrounds by coloring rules with the height of a row,
+%D skipping upwards and finally drawing the content, like in:
+%D
+%D \gdef\ShowExample%
+%D {\startfiguurtekst
+%D {geen}
+%D {\haalbuffer}
+%D \typebuffer
+%D \stopfiguurtekst}
+%D
+%D \startbuffer
+%D \starttabel[|c|c|]
+%D \HL
+%D \BL[2] \SR
+%D \VL test \VL test \VL\SR
+%D \HL
+%D \VL test \VL test \VL\FR
+%D \VL test \VL test \VL\MR
+%D \VL test \VL test \VL\LR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D Just to be complete we show how the other columns can be
+%D given a background. Later we will provide more details over
+%D the commands used.
+%D
+%D \startbuffer
+%D \starttabel[|c|c|c|]
+%D \HL
+%D \BL[3] \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttabel[|c|c|c|]
+%D \HL
+%D \BC \BL[2] \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttabel[|c|c|c|]
+%D \HL
+%D \BC \BC \BL \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttabel[|c|c|c|]
+%D \HL
+%D \BC \BL \SR
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D \startbuffer
+%D \starttabel[|c|c|c|]
+%D \BL \BL \SR
+%D \HL
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \ShowExample
+
+%D In these examples we can clearly see that for being a real
+%D background, the color or gray specification has to precede
+%D the content. Just to keep things simple, we can recall this
+%D specification later on:
+%D
+%D \startbuffer
+%D \starttabel[|c|c|c|]
+%D \BC \BL \SR
+%D \HL
+%D \VL test \VL test \VL test \VL\SR
+%D \HL
+%D \BR\FR
+%D \VL test \VL test \VL test \VL\FR
+%D \BR\MR
+%D \VL test \VL test \VL test \VL\MR
+%D \BR\LR
+%D \VL test \VL test \VL test \VL\LR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D Close study learns that we can put the specification
+%D before or after the \type{\HL}, whatever suits best. Keeping
+%D track of these specifications is taken care of by the next
+%D variables:
+
+\newif \ifTABLEgrayline % executing gray line
+\newif \ifTABLEgraydone % gray line executed
+\newtoks \TABLEgraytoks % gray line specification
+
+%D A third major extension, besides spacing and color support,
+%D concerns splitting tables over pages. We don't give
+%D examples here, because its a waste of space.
+
+\newdimen\TABLEheight % These can be \newskimens
+\newdimen\TABLEmaxheight % given a few \relax's when
+\newdimen\TABLEheadheight % testing them with \ifdim.
+\newdimen\TABLEtailheight
+\newdimen\TABLEcaptionheight
+
+\newif\ifTABLEinbreak
+
+%D Nog vervangen:
+
+\def\c!Table {Table}
+
+%D We alraady saw that the table macros report errors and
+%D provide automatic spacing. These features can only be
+%D implemented by keeping track of the state, often the last
+%D command on a row.
+
+\chardef\TABLEunknown = 0
+
+\chardef\TABLEseparaterow = 1
+\chardef\TABLEfirstrow = 2
+\chardef\TABLEmidrow = 3
+\chardef\TABLElastrow = 4
+\chardef\TABLErule = 5
+\chardef\TABLEskip = 6
+\chardef\TABLEautorow = 7
+
+\chardef\TABLEforcefirstrow = 1
+\chardef\TABLEforcelastrow = 2
+
+\chardef\TABLEmissingrow = 1
+\chardef\TABLEmissingcolumn = 2
+\chardef\TABLEspanoverflow = 3
+\chardef\TABLEdivisionoverflow = 4
+
+%D We store these states using efficient \type {\chardef}'s.
+%D Like most variables, these are global ones. When needed,
+%D especially when we flush the backgrounds, we can temporary
+%D disable the assignment.
+
+\newif\ifsetTABLEaction
+
+\def\setTABLEaction#1%
+ {\ifsetTABLEaction\global\chardef\TABLEaction#1\fi}
+
+\def\setTABLEforce#1%
+ {\ifsetTABLEaction\global\chardef\TABLEforce#1\fi}
+
+\def\setTABLEerror#1%
+ {\global\chardef\TABLEerror#1}
+
+%D Before we come to using these variables, we redefine and/or
+%D adapt some \TABLE\ macros. Within \TABLE's the \type{|} and
+%D \type{"} have special meanings in templates and are active
+%D during. Their meaning can therefore conflict with those
+%D elsewhere defined. To be compatible with traditional \TABLE\
+%D as well as \CONTEXT's \type{||} and the active \type{"}
+%D extensions for my german friends, we do some catcode magic.
+
+\newif\ifForgetTableBarAndQuote \ForgetTableBarAndQuotetrue
+
+\bgroup
+\catcode`\|=\@@active
+\catcode`\"=\@@active
+\gdef\pushouterbarandquote%
+ {\ifForgetTableBarAndQuote
+ \ifnum\catcode`\|=\@@active \else
+ \catcode`\|=\@@active
+ \def|{\ifmmode\vert\else\char`\|\fi}%
+ \fi
+ \let\outertablebar=|%
+ \ifnum\catcode`\"=\@@active \else
+ \catcode`\"=\@@active
+ \def"{\char`\"}%
+ \fi
+ \let\outertablequote="%
+ \fi}
+\gdef\popouterbarandquote%
+ {\ifForgetTableBarAndQuote
+ \let|=\outertablebar
+ \let"=\outertablequote
+ \else
+ \redefinetablebarandquote
+ \fi}
+\gdef\ObeyTableBarAndQuote%
+ {\ForgetTableBarAndQuotefalse
+ \ifintable
+ \redefinetablebarandquote
+ \fi}
+\egroup
+
+%D \macros
+%D {ObeyTableBarAndQuote}
+%D
+%D As said, the \type{|} and \type{"} active characters are
+%D often used for other purposes. By default, the outside
+%D meanings are therefore preserved and available inside
+%D tables. If for some reason one wants to use the \TABLE\
+%D primitives, one can say:
+%D
+%D \starttypen
+%D \ObeyTableBarAndQuote
+%D \stoptypen
+%D
+%D To keep things verbose, as well as to show what \TABLE\
+%D commands we affect, we show some meanings.
+
+\def\normalTABLEshortrule {\!ttShortHrule} % \-
+\def\normalTABLElongrule {\!ttLongHrule} % \=
+\def\normalTABLEfullrule {\!ttFullHrule} % \_
+\def\normalTABLEendofrow {\!ttEndOfRow} % \\
+\def\normalTABLEsimplebar {\unskip\!ttRightGlue&&} % |
+\def\normalTABLEcomplexbar {\unskip\!ttRightGlue&\omit\!ttAlternateVrule} % \|
+\def\normalTABLEquote {\unskip\!ttRightGlue&\omit&} % "
+\def\normalTABLElineformat {\normalTABLEendofrow+}
+\def\normalTABLElineending {\normalTABLEendofrow0 }
+\def\normalTABLEsinglerule {&\normalTABLElongrule&}
+\def\normalTABLEmultirule#1{&\use{#1}\normalTABLElongrule&}
+
+%D To give an impression of what the (well documented) source
+%D of \TABLE\ looks like, we first implement an alternative for
+%D the numeric keys. The quantity keys (\type{q} and \type{Q})
+%D support the more european way of writing numbers:
+%D
+%D \startsmaller
+%D 100.000.000,00 instead of 100,000,000.00
+%D \stopsmaller
+%D
+%D The next table shows how to use these keys. We use braces
+%D instead of brackets because we need brackets to specify the
+%D format.
+%D
+%D \startbuffer
+%D \starttabel{|q[00,000]|Q[00,00]|}
+%D \HL
+%D \VL -1,2 \VL 12,35 \VL\FR
+%D \VL 11,203 \VL 2,4 \VL\LR
+%D \HL
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \ShowExample
+%D
+%D Although a more efficient implementation is possible |<|we
+%D can for instance share common macros|>| we just adapt a copy
+%D of the numeric ones. To permit double loading of this
+%D module, we check for the existence of one of the macros.
+
+\letvalue{!tk<\string q>}=\undefined
+\letvalue{!tk<\string Q>}=\undefined
+
+%D We just copy the original {\em comments}.
+%D
+%D \em Key \type{q}: quantity item, non||math mode.
+
+\NewFormatKey q%
+ {\def\!tqStyle{}%
+ \futurelet\!tnext\!tqTestForBracket}
+
+%D \em Key \type{Q}: quantity item, math mode.
+
+\NewFormatKey Q%
+ {\def\!tqStyle{$}%
+ \futurelet\!tnext\!tqTestForBracket}
+
+%D \em Note: the space between a quantity entry and the
+%D following \type{|}, \type{"}, or \type{\|} is mandatory.
+%D empty quantity entries are not allowed: use \type{{}} or
+%D \type{\omit} instead.
+%D
+%D \em Test for bracket: invoked by the keys \type{q} and
+%D \type{Q}.
+
+\def\!tqTestForBracket%
+ {\ifx[\!tnext
+ \!thx\!tqGetArgument
+ \else
+ \!thx\!tqGetCode
+ \fi}
+
+%D \em Get code: e.g. \type{4}, or \type{4,0}, \type{0,4}, or
+%D \type{10,2}.
+
+\def\!tqGetCode#1 % note the blank
+ {\!tqConvertCode #1,,!}
+
+%D \em Convert code: e.g. converts above to \type{[0000]},
+%D \type{[0000,]}, \type{[,0000]}, \type{[0000000000,00]}.
+
+\def\!tqConvertCode #1,#2,#3!%
+ {\begingroup
+ \aftergroup\edef
+ \aftergroup\!ttemp
+ \aftergroup{%
+ \aftergroup[%
+ \!taCountA #1
+ \!thLoop
+ \ifnum \!taCountA>0
+ \advance\!taCountA -1
+ \aftergroup0
+ \repeat
+ \def\!ttemp{#3}%
+ \ifx\!ttemp\empty
+ \else
+ \aftergroup,
+ \!taCountA #2
+ \!thLoop
+ \ifnum\!taCountA>0
+ \advance\!taCountA -1
+ \aftergroup0
+ \repeat
+ \fi
+ \aftergroup]\aftergroup}%
+ \endgroup\relax
+ \!thx\!tqGetArgument\!ttemp}
+
+%D \em Get argument:
+%D
+%D \starttypen
+%D <sample left field> <optional, sample right field>
+%D \stoptypen
+
+\def\!tqGetArgument[#1]%
+ {\!tqMakeQuantityTemplate\!tqStyle#1,,!}
+
+%D \em Make quantity template.
+
+\def\!tqMakeQuantityTemplate#1#2,#3,#4!% #1=<empty> or $
+ {\def\!ttemp{#4}%
+ \ifx\!ttemp\empty
+ \!taDimenC=0pt
+ \else
+ \setbox0=\hbox{\m@th #1,#3#1}%
+ \!taDimenC=\wd0
+ \fi
+ \setbox0=\hbox{\m@th #1#2#1}%
+ \!thToksEdef\!taDataColumnTemplate=
+ {\noexpand\!tqSetQuantityItem{\the\wd0 }{\the\!taDimenC}{#1}%
+ \the\!taDataColumnTemplate}%
+ \ReadFormatKeys}
+
+%D \em Set numeric item.
+
+\def\!tqSetQuantityItem #1#2#3#4 %
+ {\!tqSetQuantityItemA{#1}{#2}{#3}#4,,!}
+
+\def\!tqSetQuantityItemA #1#2#3#4,#5,#6!%
+ {\def\!ttemp%
+ {#6}%
+ \hbox to #1
+ {\hss\m@th#3#4#3}%
+ \hbox to #2
+ {\ifx\!ttemp\empty
+ \else
+ \m@th#3,#5#3%
+ \fi
+ \hss}}
+
+%D Here ends the Q||extension. Did you watch the clever use
+%D of aftergroup in \type{\!tqConvertCode}.
+
+% %D We also (have to) define a key for \type{\kap}:
+%
+% \letvalue{!tk<\string K>}=\undefined
+%
+% \NewFormatKey K%
+% {\ReadFormatKeys b\kap}
+
+%D A few pages back we saw backgrounds, further on we will see
+%D colored rules, and here we provide a means to color the
+%D entries in a column. (We can of course always use the normal
+%D color commands for individual entries.) We could not use the
+%D lowercase~\type{c}, because that one is used to force {\em
+%D centering}.
+%D
+%D \startbuffer
+%D \starttabel[|C{red}|C{green}|C{blue}|]
+%D \VL R(ed) \VL G(reen) \VL B(lue) \VL\SR
+%D \stoptabel
+%D \stopbuffer
+%D
+%D \ShowExample
+
+\letvalue{!tk<\string C>}=\undefined
+
+\NewFormatKey C#1%
+ {\ReadFormatKeys b{\localstartcolor[#1]} a{\localstopcolor}}
+
+%D So now we have three new keys:
+%D
+%D \starttabel[|||]
+%D \HL
+%D \NC \bf key \NC \bf meaning \NC\AR
+%D \HL
+%D \NC Q[x,y] \NC math mode formatted numbers \NC\AR
+%D \NC q[x,y] \NC text mode formatted numbers \NC\AR
+%D \NC C{identifier} \NC column entry color \NC\AR
+%D \HL
+%D \stoptabel
+
+%D Later on, we're going to implement multiple page table
+%D support, therefore the next \TABLE\ macro needs to be
+%D slightly adapted, i.c. the penalty is removed.
+
+\def\!ttFullHruleA%
+ {\!ttGetHalfRuleThickness
+ \hrule\!thHeight\dimen0\!thDepth\dimen0
+ %\penalty0
+ \egroup}
+
+%D We'll see that when we want to give a vertical rule a color,
+%D we have to set and reset states. After heavy testing it
+%D proved most useful to extend a \TABLE\ primitive with some
+%D hooks. One thing to keep in mind is that \type{&} keeps
+%D assignments local.
+
+\let\TABLEbeforebar=\empty
+\let\TABLEafterbar =\empty
+
+\def\!ttInsertVrule%
+ {\hfil
+ \TABLEbeforebar % added
+ \vrule \!thWidth
+ \ifnum\!tgCode=1
+ \ifx\!tgValue\empty
+ \LineThicknessFactor
+ \else
+ \!tgValue
+ \fi
+ \LineThicknessUnit
+ \else
+ \!tgValue
+ \fi
+ \TABLEafterbar % added
+ \hfil
+ &}
+
+%D We already shows the next one, but here we slightly adapt
+%D the macro by adding an \type{\expandafter}. The space after
+%D \type{#1} is crucial!
+
+\def\normalTABLEcomplexbar#1%
+ {\unskip\!ttRightGlue&\omit\expandafter\!ttAlternateVrule#1 }
+
+%D To get rid of interfering \type{\omit}'s when we are
+%D checking the number of columns and reporting problems. The
+%D extensions concern the second level check, the first
+%D subbranch and advancing the column.
+
+\def\!ttuse#1%
+ {\ifnum#1>\@ne
+ \omit
+ \scratchcounter=\currentTABLEcolumn % added
+ \advance\scratchcounter by #1 % added
+ \advance\scratchcounter by -1 % added
+ \ifnum\scratchcounter>\maxTABLEcolumn % added
+ \def\next% % added
+ {\setTABLEerror\TABLEspanoverflow % added
+ \handleTABLEerror}% % added
+ \else % added
+ \def\next% % added
+ {\global\advance\currentTABLEcolumn by #1 % added
+ \global\advance\currentTABLEcolumn by -1 % added
+ \mscount=#1 % \mscount is in Plain
+ \advance\mscount by \m@ne
+ \advance\mscount by \mscount
+ \!thLoop
+ \ifnum\mscount>\@ne
+ \sp@n % from Plain (\span\omit \advance\mscount\m@ne)
+ \repeat
+ \span}%
+ \fi % added
+ \else % added
+ \def\next% conflicts with possible next \omit % added
+ {\global\advance\currentTABLEcolumn by 1 }% % added
+ \fi
+ \next} % added
+
+%D All commands that are executed between rows are to be put in
+%D \type {\noalign}. We can however not verify if we (that is
+%D \TABLE) does or did not enter this mode. A moderate dirty
+%D but useful trick is using our own alternative:\voetnoot{Once
+%D one has entered the stage of redefining \TEX\ primitives,
+%D such hacks become a second nature. However, redefining \type
+%D {\omit} and \type{\span} is not that easy.}
+
+\def\TABLEnoalign%
+ {\noalign\bgroup\let\noalign=\relax\let\next=}
+
+%D \macros
+%D {starttable}
+%D
+%D The rest of this module is not easy to comprehend, mainly
+%D because we have to take care of:
+%D
+%D \startopsomming[opelkaar]
+%D \som \type{\startopsomming[template]}
+%D \som \type{\startopsomming{template}}
+%D \som \type{\startopsomming[predefined]}
+%D \stopopsomming
+%D
+%D as well as:
+%D
+%D \startopsomming[verder]
+%D \som restart after table break
+%D \stopopsomming
+%D
+%D The official specification of the start command is:
+%D
+%D \showsetup{starttable}
+
+\def\starttabel%
+ {\bgroup
+ \ifinsidefloat\else
+ \startbaselinecorrection % \outer..
+ \fi
+ \postponefootnotes
+ \firststagestartTABLE}
+
+\def\stoptabel%
+ {\finishTABLE
+ \ifinsidefloat\else
+ \stopbaselinecorrection % \outer..
+ \goodbreak % compensates all the nobreaks
+ \fi
+ \egroup}
+
+%D Before we can grab the argument, we have to make sure that
+%D the \CATCODES\ are set. The first stage takes care of that.
+
+\def\firststagestartTABLE%
+ {\bgroup % kan-ie weg?
+ \global\intabletrue
+ \pushouterbarandquote
+ \catcode`\|=\@@other
+ \complexorsimple{secondstagestartTABLE}}
+
+\def\simplesecondstagestartTABLE#1%
+ {\complexsecondstagestartTABLE[{#1}]}
+
+%D \macros
+%D {definetabletemplate}
+%D
+%D The complex (and main) start macro first takes care of the
+%D predefined case. Such a predefined setup looks like:
+%D
+%D \starttypen
+%D \definetabletemplate[test][|||]
+%D
+%D \starttabel[test]
+%D \VL test \VL test \VL\AR
+%D \VL test \VL test \VL\AR
+%D \VL test \VL test \VL\AR
+%D \stoptabel
+%D \stoptypen
+%D
+%D The implementation of the definition macro is not that
+%D complicated:
+
+\def\dodefinetabletemplate[#1][#2]%
+ {\setgvalue{\c!Table#1}{\complexsecondstagestartTABLE[#2]}%
+ \egroup}
+
+\def\definetabletemplate%
+ {\bgroup
+ \catcode`\|=\@@other
+ \dodoubleargument\dodefinetabletemplate}
+
+%D Templates defined this way get protected names, that cannot
+%D conflict with existing commands.
+%D
+%D \showsetup{definetabletemplate}
+%D
+%D The second half of the next macro prepares table
+%D splitting.
+
+\def\complexsecondstagestartTABLE#1[#2]%
+ {\convertargument|\to\asciiA
+ \convertargument#2\to\asciiB
+ \doifinstringelse{\asciiA}{\asciiB}
+ {\gdef\restartTABLE{\thirdstagestartTABLE{#2}}}
+ {\doifdefinedelse{\c!Table#2}
+ {\gdef\restartTABLE{\getvalue{\c!Table#2}}}
+ {\gdef\restartTABLE{\getvalue{#2}}}}%
+ \prepareTABLEsplitting
+ \restartTABLE
+ \TABLEhead}
+
+%D The third stage involves a lot of (re)sets, which we will
+%D explain later.
+
+\def\thirdstagestartTABLE#1%
+ {\global\setTABLEactiontrue
+ \setTABLEaction\TABLEunknown
+ \setTABLEforce\TABLEunknown
+ \setTABLEerror\TABLEunknown
+ \global\let\TABLEgrayline=\empty
+ \global\let\nextTABLEgrayline=\empty
+ \global\TABLEgraylinefalse
+ \global\TABLEgraydonefalse
+ \global\let\TABLEgraylineerror =\empty
+ \global\let\TABLEgraylinestatus=\empty
+ \resetVLvalues
+ \appendtoks\popouterbarandquote\to\EveryTable
+ \appendtoks\localTABLEsetup\to\EveryTable
+ \BeginTable[\ifsplittables u\else b\fi]%
+ \defineTABLEunits
+ \defineTABLEsteps
+ \defineTABLErules
+ \defineTABLEdivisions
+ \defineTABLEshorthands
+ \defineTABLEbackgrounds
+ \defineTABLEendings
+ \doifsomething{#1}
+ {\def\TABLEformat{#1}%
+ \expandafter\getTABLEnofcolumns\expandafter{\TABLEformat}%
+ \expandafter\BeginFormat\TABLEformat\EndFormat}}
+
+\def\finishTABLE%
+ {\chuckTABLEautorow
+ \unskip\crcr
+ \EndTable
+ \global\intablefalse
+ \egroup}
+
+%D The preparation for split columns concerns some
+%D calculations. Although not explicitly needed, one can
+%D predefine a tablehead as well as a tail. Each table fragment
+%D is preceded by such a head and ends with a tail. This means
+%D that, in order to determine the available heigth, we have to
+%D take the head and tail into account. Because we want to
+%D support captions too, we will also reserve some space for
+%D those later on.
+
+\def\prepareTABLEsplitting%
+ {\global\TABLEheight=\!!zeropoint
+ \ifsplittables
+ \ifx\TABLEhead\empty
+ \global\TABLEheadheight=\!!zeropoint
+ \else
+ \setbox0=\vbox
+ \bgroup
+ \def\doEndOfTableLine##1##2##3{\normalTABLElineformat##2##3}%
+ \restartTABLE\TABLEhead
+ \finishTABLE
+ \global\TABLEheadheight=\ht0
+ \fi
+ \ifx\TABLEtail\empty
+ \global\TABLEtailheight=\!!zeropoint
+ \else
+ \setbox0=\vbox
+ \bgroup
+ \def\doEndOfTableLine##1##2##3{\normalTABLElineformat##2##3}%
+ \restartTABLE\TABLEtail
+ \finishTABLE
+ \global\TABLEtailheight=\ht0
+ \fi
+ \else
+ \global\TABLEheadheight=\!!zeropoint
+ \global\TABLEtailheight=\!!zeropoint
+ \fi
+ \global\TABLEheight=\!!zeropoint
+ \calculatemaxTABLEheight\docalculatemaxTABLEheight}
+
+%D \macros
+%D {starttables}
+%D
+%D Split tables are specified using the plural form of the
+%D start and stop commands.
+%D
+%D \showsetup{starttables}
+%D
+%D For example:
+%D
+%D \starttypen
+%D \starttabellen[|||]
+%D \HL
+%D \VL element \VL atom weight \VL\AR
+%D \HL
+%D \VL ....... \VL ........... \VL\AR
+%D \VL ....... \VL ........... \VL\AR
+%D \HL
+%D \stoptabellen
+%D \stoptypen
+
+\def\starttabellen%
+ {\bgroup
+ \ifinsidefloat\else
+ \baselinecorrection
+ \flushfootnotes
+ \topbaselinecorrection
+ \fi
+ \forgetall
+ \global\let\absmaxTABLEheight=\!!zeropoint
+ \splittablestrue
+ \global\TABLEinbreakfalse
+ \firststagestartTABLE}
+
+\def\stoptabellen%
+ {\TABLEtail
+ \finishTABLE
+ \ifinsidefloat\else
+ \flushfootnotes
+ \botbaselinecorrection
+ \fi
+ \egroup}
+
+%D When the table in the previous example is split across
+%D pages, only the first gets a head. We could have said
+%D something like:
+%D
+%D \starttypen
+%D \starttabelkop
+%D \HL
+%D \VL element \VL atom weight \VL\AR
+%D \HL
+%D \stoptabelkop
+%D
+%D \starttabelstaart
+%D \HL
+%D \stoptabelstaart
+%D
+%D \starttabellen[|||]
+%D \VL ....... \VL ........... \VL\AR
+%D \VL ....... \VL ........... \VL\AR
+%D \stoptabellen
+%D \stoptypen
+%D
+%D This time each split table gets a head line and ends with
+%D a rule. Keep in mind that such heads also apply to the
+%D unbroken ones and should be defined local (grouped) if
+%D needed. The rather complicated definition below is due to
+%D the fact that the stopcondition is interface language
+%D dependant.
+
+\let\TABLEhead =\empty
+\let\TABLEtail=\empty
+
+\letvalue{\e!start \e!tabelkop}=\undefined
+\letvalue{\e!stop \e!tabelkop}=\undefined
+\letvalue{\e!start\e!tabelstaart}=\undefined
+\letvalue{\e!stop \e!tabelstaart}=\undefined
+
+\expanded
+ {\def\csname\e!start\e!tabelkop\endcsname##1\csname\e!stop\e!tabelkop\endcsname%
+ {\noexpand\def\noexpand\TABLEhead{##1}}}
+
+\expanded
+ {\def\csname\e!start\e!tabelstaart\endcsname##1\csname\e!stop\e!tabelstaart\endcsname%
+ {\noexpand\def\noexpand\TABLEtail{##1}}}
+
+%D Redudant \type{\HL}'s are removed automatically, so
+%D mid||lines can be used without problems.
+
+%D When calculating the available height of a split table, we
+%D try to handle multi||column mode as good as possible. This
+%D algoritm evolved during the development of the split option
+%D and will probably be improved bit by bit.
+
+\def\docalculatemaxTABLEheight%
+ {\ifbinnenkolommen
+ \getcolumnstatus\column\scratchcounter\total\dimen0\goal\dimen2\\%
+ \else
+ \ifdim\pagegoal<\maxdimen
+ \dimen0=\pagetotal
+ \dimen2=\pagegoal
+ \else
+ \dimen0=\!!zeropoint
+ \dimen2=\teksthoogte
+ \fi
+ \fi
+ \advance\dimen2 by -\dimen0
+ \global\TABLEmaxheight=\dimen2
+ \global\advance\TABLEmaxheight by -\dp\strutbox
+ \ifdim\prevdepth<\maxdimen\ifdim\prevdepth>\!!zeropoint
+ \global\advance\TABLEmaxheight by -\dp\strutbox
+ \global\advance\TABLEmaxheight by -\parskip
+ \fi\fi}
+
+\def\nocalculatemaxTABLEheight%
+ {\ifbinnenkolommen
+ \getcolumnstatus\column\scratchcounter\total\dimen0\goal\dimen2\\%
+ \else
+ \dimen0=\!!zeropoint
+ \dimen2=\teksthoogte
+ \fi
+ \advance\dimen2 by -\dimen0
+ \global\TABLEmaxheight=\dimen2
+ \global\advance\TABLEmaxheight by -\dp\strutbox}
+
+\def\calculatemaxTABLEheight#1%
+ {\ifsplittables
+ #1\relax
+ \ifdim\TABLEmaxheight<3\baselineskip \relax % instelbaar maken
+ \ifbinnenkolommen
+ \nobreak
+ \kern\dimen2
+ \goodbreak
+ \else
+ \goodbreak % \pagina
+ \fi
+ \removeTABLEtopskip
+ \nocalculatemaxTABLEheight
+ \fi
+ \ifdim\TABLEmaxheight<\absmaxTABLEheight % forces equal columns
+ \global\TABLEmaxheight=\absmaxTABLEheight
+ \else
+ \xdef\absmaxTABLEheight{\the\TABLEmaxheight}%
+ \fi
+ \global\TABLEheight=\!!zeropoint
+ \else
+ \global\TABLEmaxheight=\maxdimen
+ \fi}
+
+%D When splitting tables, we have to remove the top skip when
+%D we're in the main vertical list, else we remove whatever
+%D skip \TEX\ adds.
+
+\def\removeTABLEtopskip%
+ {\ifinsidefloat
+ \hbox{\strut}\kern-\lineheight
+ \else
+ \hbox{}\kern-\topskip
+ \fi}
+
+%D We need an alternative for the normal complex or simple
+%D commands, because assignments in these system commands
+%D conflict with \type{\noalign}. This alternative is about
+%D as efficient as possible.
+
+\def\complexorsimpleTable#1#2%
+ {\getvalue{\if[\noexpand#2\s!complex\else\s!simple\fi\c!Table#1}#2}
+
+%D The order of the next macros is more or less random. First
+%D we implement error recovery. Errors are reported to the
+%D screen and log file as well as visualized in the table in
+%D teletype.
+
+\def\handleTABLEerror%
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEerror=\TABLEunknown \else
+ \setTABLEaction\TABLEunknown
+ \global\let\checkTABLEautorow=\empty
+ \global\let\chuckTABLEautorow=\empty
+ \fi
+ \ifcase\TABLEerror
+ % no error
+ \or
+ % \TABLEmissingrow
+ \tttf [missing row]%
+ \writestatus{TABLE}{missing row}%
+ \SR
+ \or
+ % \TABLEmissingcolumn
+ \fillTABLEcolumns
+ \tttf [missing column]%
+ \writestatus{TABLE}{missing column}%
+ \SR
+ \or
+ % \TABLEspanoverflow
+ \fillTABLEcolumns
+ \tttf [columnspan too large]%
+ \writestatus{TABLE}{columnspan too large}%
+ \SR
+ \or
+ % \TABLEdivisionoverflow
+ \fillTABLEcolumns
+ \tttf [division line too long]%
+ \writestatus{TABLE}{division line too long}%
+ \SR
+ \fi
+ \fi
+ \ifnum\TABLEerror=\TABLEunknown \else
+ \finishTABLErow
+ \fi}
+
+\def\finishTABLErow%
+ {\crcr
+ \TABLEnoalign
+ {\nobreak
+ \setTABLEaction\TABLEunknown
+ \setTABLEerror\TABLEunknown
+ \global\let\checkTABLEautorow=\empty
+ \global\let\chuckTABLEautorow=\empty
+ \global\currentTABLEcolumn=0 }}
+
+\def\fillTABLEcolumns%
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn \else
+ \global\advance\currentTABLEcolumn by 1
+ \normalTABLEquote
+ \expandafter\fillTABLEcolumns
+ \fi}
+
+%D Next we enter the more complicated area of column and row
+%D switching. I won't go into much detail from now on, but just
+%D mention the general principles.
+%D
+%D \startopsomming[3*ruim]
+%D \sym{\type{\SR}} end a separate row (between rules)
+%D \sym{\type{\FR}} end a first row (after a rule)
+%D \sym{\type{\MR}} end a mid row (between text lines)
+%D \sym{\type{\LR}} end a last row (before a rule)
+%D \stopopsomming
+%D
+%D and best of all:
+%D
+%D \startopsomming[verder]
+%D \sym{\type{\AR}} end a row with automatic spacing
+%D \stopopsomming
+%D
+%D As far as possible, we report confusing situations. In
+%D most cases one can use \type{\AR}, which transfigurates
+%D itself into one of the other types.
+%D
+%D \starttypen
+%D \starttabel[||]
+%D \HL
+%D \VL a separate row \VL\SR
+%D \HL
+%D \VL a first row \VL\FR
+%D \VL a mid row \VL\MR
+%D \VL a last row \VL\LR
+%D \HL
+%D \stoptabel
+%D \stoptypen
+%D
+%D In this example we could have used \type{\AR} without
+%D problems.
+%D
+%D Color or gray scale backgrounds precede the content. They
+%D are passed over horizontal (division) lines when needed.
+%D Errors in the color template are traced elsewhere. Here we
+%D only check for inconsistent spacing. Due to the way \TEX\
+%D handles alignments, we cannot automate spacing for colored
+%D rows and columns.
+
+\chardef\TABLErowzero=0
+
+\def\checkTABLErow#1% pure for message purposes
+ {\ifTABLEgraydone
+ \convertargument #1\to\asciiA
+ \convertcommand\TABLEendBCL\to\asciiB
+ \ifx\asciiA\asciiB \else
+ \writestatus{TABLE}{confusing \asciiA\space and \asciiB}%
+ \gdef\TABLEgraylineerror%
+ {\global\let\TABLEgraylineerror=\empty
+ [\asciiA\unskip<->\asciiB\unskip]}%
+ \fi
+ \global\TABLEgraydonefalse
+ \fi}
+
+\def\defineTABLEendings%
+ {\let\SR=\TableSR
+ \let\FR=\TableFR
+ \let\MR=\TableMR
+ \let\LR=\TableLR
+ \let\AR=\TableAR}
+
+\def\TableSR%
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLEfirstrow
+ \writestatus{TABLE}{change \string\SR\space into \string\MR/\string\LR}%
+ \else\ifnum\TABLEaction=\TABLEmidrow
+ \writestatus{TABLE}{change \string\SR\space into \string\MR/\string\LR}%
+ \else\ifnum\TABLEaction=\TABLEmidrow
+ \writestatus{TABLE}{change \string\SR\space into \string\MR/\string\LR}%
+ \fi\fi\fi
+ \fi
+ \checkTABLErow\SR
+ \endTABLErow\TABLEseparaterow\TABLErowfactor\TABLErowfactor}
+
+\def\TableFR%
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLEmidrow
+ \writestatus{TABLE}{change \string\FR\space into \string\MR/\string\LR}%
+ \else\ifnum\TABLEaction=\TABLElastrow
+ \writestatus{TABLE}{change \string\FR\space into \string\MR/\string\LR}%
+ \fi\fi
+ \fi
+ \checkTABLErow\FR
+ \endTABLErow\TABLEfirstrow\TABLErowfactor\TABLErowzero}
+
+\def\TableMR%
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLErule
+ \writestatus{TABLE}{change \string\MR\space into \string\FR/\string\SR}%
+ \else\ifnum\TABLEaction=\TABLElastrow
+ \writestatus{TABLE}{change \string\MR\space into \string\FR}%
+ \fi\fi
+ \fi
+ \checkTABLErow\MR
+ \endTABLErow\TABLEmidrow00}
+
+\def\TableLR%
+ {\ifTABLEgrayline \else
+ \ifnum\TABLEaction=\TABLErule
+ \writestatus{TABLE}{change \string\LR\space into \string\FR/\string\SR}%
+ \fi
+ \fi
+ \checkTABLErow\LR
+ \endTABLErow\TABLElastrow\TABLErowzero\TABLErowfactor}
+
+%D \macros
+%D {ifcheckTABLEcolums}
+%D
+%D
+%D The next macros handle the actual row ending. This macro
+%D also take care of space corrections due to table splitting
+%D when \type{\MR} and collegues are used. When tracing is
+%D enabled, the corrections as well as the values used to
+%D determine the available space are shown (in color). By default
+%D checking is off.
+
+\newif\ifcheckTABLEcolumns
+
+\let\beforeTABLEline=\empty
+\let\afterTABLEline =\empty
+
+\def\doendTABLErow#1#2#3%
+ {\handleTABLEbreak#2#3%
+ \beforeTABLEline
+ \ifcase#1\relax
+ % unknown
+ \or
+ \endofTABLEline[blue][\SR->\SR]\TABLErowfactor\TABLErowfactor
+ \or
+ \endofTABLEline[red][\FR->\FR]\TABLErowfactor\TABLErowzero
+ \or
+ \ifnum\TABLEforce=\TABLEforcelastrow
+ \endofTABLEline[red][\MR->\LR]\TABLErowzero\TABLErowfactor
+ \else\ifnum\TABLEforce=\TABLEforcefirstrow
+ \endofTABLEline[red][\MR->\FR]\TABLErowfactor\TABLErowzero
+ \else
+ \endofTABLEline[green][\MR->\MR]\TABLErowzero\TABLErowzero
+ \fi\fi
+ \or
+ \endofTABLEline[red][\LR->\LR]\TABLErowzero\TABLErowfactor
+ \fi
+ \TABLEnoalign
+ {\setTABLEforce\TABLEunknown
+ \global\currentTABLEcolumn=0 }%
+ \afterTABLEline}
+
+\def\endTABLErow#1#2#3%
+ {\setTABLEaction#1%
+ \ifTABLEgrayline
+ \finishTABLErow
+ \else
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \doendTABLErow{#1}{#2}{#3}%
+ \else\ifcheckTABLEcolumns
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \else
+ \doendTABLErow{#1}{#2}{#3}%
+ \fi\fi
+ \fi}
+
+%D Handling \type{\AR} is postponed till the next row. The
+%D check takes care of the first and mid rows, the chuck macro
+%D |<|how about that name|>| handles the last row.
+
+\def\TableAR%
+ {\ifTABLEgraydone
+ \global\let\checkTABLEautorow=\empty
+ \global\let\chuckTABLEautorow=\empty
+ \global\TABLEgraydonefalse
+ \TABLEendBCL
+ \else
+ \global\let\checkTABLEautorow=\docheckTABLEautorow
+ \global\let\chuckTABLEautorow=\dochuckTABLEautorow
+ \fi}
+
+\let\checkTABLEautorow=\empty
+\let\chuckTABLEautorow=\empty
+
+\def\docheckTABLEautorow%
+ {\global\let\checkTABLEautorow=\empty
+ \ifnum\TABLEaction=\TABLErule \FR
+ \else\ifnum\TABLEaction=\TABLEunknown \FR
+ \else \MR
+ \fi\fi}
+
+\def\dochuckTABLEautorow%
+ {\global\let\checkTABLEautorow=\empty
+ \global\let\chuckTABLEautorow=\empty
+ \ifnum\TABLEaction=\TABLErule \SR
+ \else\ifnum\TABLEaction=\TABLEunknown \SR
+ \else \LR
+ \fi\fi}
+
+%D When a table is split, we also add a tail and when present
+%D we repeat the table head.
+
+\def\handleTABLEbreak#1#2%
+ {\ifsplittables
+ \setbox0=\hbox{\AugmentedTableStrut{#1}{#2}}%
+ \getboxheight\dimen0\of\box0%
+ \ifTABLEgrayline \else
+ \global\advance\TABLEheight by \dimen0
+ \fi
+ \ifTABLEinbreak
+ \global\let\beforeTABLEline=\empty
+ \gdef\afterTABLEline{\TABLEnoalign{\nobreak}}%
+ \else
+ \dimen2=\TABLEheight
+ \advance\dimen2 by \dp\strutbox
+ \advance\dimen2 by \TABLEtailheight
+ \advance\dimen2 by \TABLEcaptionheight
+ \advance\dimen2 by \lineheight % we're ahead
+ \ifdim\dimen2>\TABLEmaxheight
+ \gdef\beforeTABLEline%
+ {\setTABLEforce\TABLEforcelastrow}%
+ \gdef\afterTABLEline%
+ {\TABLEnoalign
+ {\nobreak
+ \global\TABLEinbreaktrue}%
+ \TABLEtail
+ \TABLEnoalign
+ {\goodbreak
+ \calculatemaxTABLEheight\nocalculatemaxTABLEheight
+ \removeTABLEtopskip
+ \setTABLEaction\TABLEunknown
+ \setTABLEforce \TABLEunknown}%
+ \TABLEhead
+ \TABLEnoalign
+ {\nobreak
+ \global\TABLEinbreakfalse
+ \setTABLEforce\TABLEforcefirstrow}}%
+ \else
+ \global\let\beforeTABLEline=\empty
+ \gdef\afterTABLEline{\TABLEnoalign{\nobreak}}%
+ \fi
+ \fi
+ \else
+ \global\let\beforeTABLEline=\empty
+ \gdef\afterTABLEline{\TABLEnoalign{\nobreak}}%
+ \fi}
+
+%D When tables are split, the spacing before and after a
+%D horizontal rule is corrected according to whet we expect.
+
+\def\endofTABLEline[#1][#2->#3]#4#5%
+ {\ifx#2#3\else
+ \writestatus{TABLE}{\string#2\space changed into \string#3}%
+ \fi
+ \iftracetables
+ \bgroup
+ \tttf\space
+ \ifnum\TABLEerror=\TABLEunknown
+ \ifx#2#3\else\string#2->\fi
+ \else
+ ->%
+ \fi
+ \color[#1]{\string#3}%
+ \ifsplittables\space\the\TABLEmaxheight/\the\TABLEheight\fi
+ \ifx\TABLEgraylineerror\empty
+ \space\TABLEgraylinestatus
+ \else
+ \space\TABLEgraylineerror
+ \fi
+ \egroup
+ \else\ifx\TABLEgraylineerror\empty \else
+ \bgroup
+ \tttf\space\TABLEgraylineerror
+ \egroup
+ \fi\fi
+ \global\let\TABLEgraylinestatus=\empty
+ \global\let\TABLEgraylineerror =\empty
+ \expandafter\normalTABLElineformat#4#5\crcr % \crcr nodig ?
+ \TABLEnoalign{\nobreak\global\setTABLEactiontrue}}
+
+%D In order to prevent (as good as possible) alignment overflow
+%D and therefore \TEX\ error messages, we check the maximum
+%D number of columns. We keep track of the current column and
+%D maximum column by means of two \COUNTERS. Keep in mind that
+%D the number of \type{|}'s and \type{\VL}'s or alike is always
+%D one more than the number of columns.
+
+\newcount\currentTABLEcolumn
+\newcount\maxTABLEcolumn
+
+%D While defining this macro we change the \CATCODE\ of
+%D \type{|}. When counting the bars, we use a non active
+%D representation of the bar, simply because we cannot be sure
+%D if the bar is active or not.\voetnoot{Normally it is, but
+%D \TABLE\ changes the catcode when needed.}
+
+\bgroup
+\catcode`\|=\@@other
+\gdef\getTABLEnofcolumns#1%
+ {\bgroup
+ \convertargument#1\to\ascii
+ \@EA\doglobal\@EA\counttoken\@EA|\@EA\in\ascii\to\maxTABLEcolumn
+ \global\advance\maxTABLEcolumn by -1
+ \egroup}
+\egroup
+
+%D \startopsomming[3*ruim]
+%D \sym{\type{\VL}} a vertical line
+%D \sym{\type{\VC}} a vertical colored line
+%D \sym{\type{\HL}} a horizontal line
+%D \sym{\type{\HC}} a horizontal colored line
+%D \stopopsomming
+
+\def\defineTABLErules%
+ {\let\VL=\TableVL
+ \let\VC=\TableVC
+ \let\HL=\TableHL
+ \let\HC=\TableHC}
+
+\def\TableVL%
+ {\checkTABLEautorow
+ \nextTABLEgrayline
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn by 1
+ \expandafter\doTableVL
+ \fi}
+
+\def\doTableVL%
+ {\complexorsimpleTable{VL}}
+
+\def\complexTableVL[#1]%
+ {\scratchcounter=0#1%
+ \multiply\scratchcounter by \@@tiVLwidth
+ \setxvalue{wVL\the\currentTABLEcolumn}{\the\scratchcounter}%
+ \simpleTableVL}
+
+\def\simpleTableVL%
+ {\doifundefined{wVL\the\currentTABLEcolumn}%
+ {\setgvalue{wVL\the\currentTABLEcolumn}{\@@tiVLwidth}}%
+ \gdef\TABLEbeforebar%
+ {\getvalue{bVL\the\currentTABLEcolumn}%
+ \global\letvalue{bVL\the\currentTABLEcolumn}=\empty}%
+ \gdef\TABLEafterbar%
+ {\getvalue{eVL\the\currentTABLEcolumn}%
+ \global\letvalue{eVL\the\currentTABLEcolumn}=\empty}%
+ \edef\@@tiVLwidth{\getvalue{wVL\the\currentTABLEcolumn}}%
+ \expanded{\normalTABLEcomplexbar{\@@tiVLwidth}}}
+
+\def\resetVLvalues%
+ {\dostepwiserecurse{0}{\maxTABLEcolumn}{1}
+ {\global\setvalue{wVL\recurselevel}{\@@tiVLwidth}%
+ \global\letvalue{bVL\recurselevel}=\empty
+ \global\letvalue{eVL\recurselevel}=\empty}%
+ \global\currentTABLEcolumn=0 }
+
+\def\TableVC%
+ {\checkTABLEautorow
+ \nextTABLEgrayline
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn by 1
+ \expandafter\doTableVC
+ \fi}
+
+\def\doTableVC%
+ {\complexorsimpleTable{VC}}
+
+\def\complexTableVC[#1]%
+ {\global\setvalue{bVC\the\currentTABLEcolumn}%
+ {\localstartcolor[#1]}%
+ \global\setvalue{eVC\the\currentTABLEcolumn}%
+ {\localstopcolor}%
+ \simpleTableVC}
+
+\def\simpleTableVC%
+ {\global\setvalue{bVL\the\currentTABLEcolumn}%
+ {\getvalue{bVC\the\currentTABLEcolumn}}%
+ \global\setvalue{eVL\the\currentTABLEcolumn}%
+ {\getvalue{eVC\the\currentTABLEcolumn}}%
+ \doTableVL}
+
+\def\TableHL%
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \chuckTABLEautorow
+ \else\ifnum\currentTABLEcolumn=0
+ \chuckTABLEautorow
+ \else
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \fi\fi
+ \complexorsimpleTable{HL}}
+
+\def\complexTableHL[#1]%
+ {\TABLEnoalign
+ {\scratchcounter=0#1%
+ \multiply\scratchcounter by \@@tiHLheight
+ \edef\@@tiHLheight{\the\scratchcounter}%
+ \simpleTableHL}}
+
+\def\simpleTableHL%
+ {\TABLEnoalign
+ {\nobreak
+ \ifnum\TABLEaction=\TABLErule
+ \writestatus{TABLE}{skipping \string\HL}% \statusmessage
+ \else
+ \ifnum\TABLEaction=\TABLEmidrow
+ \writestatus{TABLE}{change \string\MR\space into \string\LR/\string\SR}%
+ \else\ifnum\TABLEaction=\TABLEfirstrow
+ \writestatus{TABLE}{change \string\MR\space into \string\SR}%
+ \fi\fi
+ \startHLcommand
+ \expandafter\normalTABLEfullrule\@@tiHLheight
+ \stopHLcommand
+ \global\let\startHLcommand=\empty
+ \global\let\stopHLcommand =\empty
+ \accountTABLElinewidth
+ \fi
+ \setTABLEaction\TABLErule
+ \nobreak}}
+
+\let\startHLcommand=\empty
+\let\stopHLcommand =\empty
+
+\def\TableHC%
+ {\complexorsimpleTable{HC}}
+
+\def\complexTableHC[#1]%
+ {\TABLEnoalign
+ {\gdef\startHCcommand{\localstartcolor[#1]}%
+ \gdef\stopHCcommand {\localstopcolor}}%
+ \simpleTableHC}
+
+\def\simpleTableHC%
+ {\TABLEnoalign
+ {\global\let\startHLcommand=\startHCcommand
+ \global\let\stopHLcommand =\stopHCcommand}%
+ \HL}
+
+%D \startopsomming[3*ruim]
+%D \sym{\type{\NL}} a vertical skip
+%D \sym{\type{\NR}} goto the next row
+%D \sym{\type{\NC}} goto the next column
+%D \sym{\type{\FC}} a first column
+%D \sym{\type{\MC}} a mid column
+%D \sym{\type{\LC}} a last column
+%D \stopopsomming
+
+% n+1 uitleggen
+
+\def\defineTABLEsteps%
+ {\let\NL=\TableNL
+ \let\NR=\TableNR
+ \let\NC=\TableNC
+ \let\FC=\TableNC
+ \let\MC=\TableNC
+ \let\LC=\TableNC}
+
+\def\TableNL%
+ {\complexorsimpleTable{NL}}
+
+\def\complexTableNL[#1]%
+ {\TABLEnoalign
+ {\edef\@@tiNL{#1}%
+ \simpleTableNL}}%
+
+\def\simpleTableNL%
+ {\TABLEnoalign
+ {\nobreak
+ \setbox0=\vbox{\blanko[\@@tiNL]}%
+ \global\advance\TABLEheight by \ht0
+ \vskip\ht0
+ \nobreak}}
+
+\def\TableNR%
+ {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \global\currentTABLEcolumn=0
+ \normalTABLElineending
+ \else
+ \setTABLEerror\TABLEmissingcolumn
+ \handleTABLEerror
+ \fi
+ \TABLEnoalign
+ {\nobreak
+ \setTABLEaction\TABLEunknown}}
+
+\def\TableNC%
+ {\checkTABLEautorow
+ \nextTABLEgrayline
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn by 1
+ \normalTABLEquote
+ \fi}
+
+\bgroup
+\catcode`\|=\@@active
+\catcode`\"=\@@active
+\gdef\redefinetablebarandquote%
+ {\def|{\VL}% % \normalTABLEsimplebar
+ \def\|##1{\VL[##1]}% % \normalTABLEcomplexbar
+ \def"{\NC}} % \normalTABLEquote
+\egroup
+
+%D \startopsomming[3*ruim]
+%D \sym{\type{\DL}}
+%D \sym{\type{\DC}}
+%D \sym{\type{\DR}}
+%D \stopopsomming
+
+\newif\ifTABLEdivision
+
+\def\defineTABLEdivisions%
+ {\global\TABLEdivisionfalse % in start
+ \let\DL=\TableDL
+ \let\DC=\TableDC
+ \let\DR=\TableDR}
+
+\def\checkTABLEdivision%
+ {\ifTABLEdivision \else
+ \chuckTABLEautorow
+ \global\currentTABLEcolumn=0
+ \global\TABLEdivisiontrue
+ \fi}
+
+\def\TableDL%
+ {\checkTABLEdivision
+ \complexorsimpleTable{DL}}
+
+\def\simpleTableDL%
+ {\complexTableDL[1]}
+
+\def\complexTableDL[#1]%
+ {\ifnum\TABLEaction=\TABLErule
+ \writestatus{TABLE}{skipping \string\DL}%
+ \else
+ \ifnum\TABLEaction=\TABLEmidrow
+ \writestatus{TABLE}{change \string\MR\space into \string\LR/\string\SR}%
+ \else\ifnum\TABLEaction=\TABLEfirstrow
+ \writestatus{TABLE}{change \string\MR\space into \string\SR}%
+ \fi\fi
+ \setTABLEaction=\TABLEunknown
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \fi
+ %\startHLcommand
+ \ifnum#1=1
+ \global\advance\currentTABLEcolumn by 2
+ \let\next=\normalTABLEsinglerule
+ \else
+ \ifnum#1<\maxTABLEcolumn
+ \global\advance\currentTABLEcolumn by 1 % was 2
+ \def\next{\normalTABLEmultirule{#1}}%
+ \else
+ \setTABLEerror\TABLEdivisionoverflow
+ \let\next=\handleTABLEerror
+ \fi
+ \fi
+ \next
+ %\stopHLcommand
+ %\global\let\startHLcommand=\empty
+ %\global\let\stopHLcommand =\empty
+ \fi}
+
+\def\TableDC%
+ {\checkTABLEdivision
+ \checkTABLEautorow
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ \setTABLEerror\TABLEmissingrow
+ \handleTABLEerror
+ \else
+ \global\advance\currentTABLEcolumn by 1
+ \normalTABLEquote
+ \fi}
+
+\def\TableDR%
+ {\ifnum\currentTABLEcolumn<\maxTABLEcolumn % silent recovery
+ \setTABLEerror\TABLEmissingcolumn % some day warning
+ \handleTABLEerror
+ \else
+ \global\currentTABLEcolumn=0 % nog check
+ \normalTABLElineending
+ \fi
+ \TABLEnoalign
+ {\nobreak
+ \global\TABLEdivisionfalse
+ \accountTABLElinewidth % temporary solution
+ \setTABLEaction\TABLErule}}
+
+\def\accountTABLElinewidth%
+ {\scratchdimen=\LineThicknessUnit
+ \global\advance\TABLEheight by \@@tiHLheight\scratchdimen}
+
+%D \startopsomming[3*ruim]
+%D \sym{\type{\BC}}
+%D \sym{\type{\BR}}
+%D \sym{\type{\BACKGROUND}}
+%D \sym{\type{\CL}}
+%D \sym{\type{\RL}}
+%D \sym{\type{\BL}}
+%D \sym{\type{\RASTER}}
+%D \sym{\type{\COLOR}}
+%D \stopopsomming
+
+% definieer: \BC \BL
+% herhaal: \BR
+% definieer: \CL \RL (eerste \CL[green] = hele row! / \CL[1,green])
+% dus: \CL en \RL mix tussen \HL en \BL
+
+\def\defineTABLEbackgrounds%
+ {\let\BC =\TableBC
+ \let\BL =\TableBL
+ \let\BR =\TableBR
+ \let\BACKGROUND=\TableBR
+ \let\CL =\TableCL
+ \let\RL =\TableRL
+ \let\COLOR =\TableCOLOR
+ \let\RASTER =\TableRASTER
+ \global\let\lastTABLEc=\@@tiachtergrondkleur
+ \global\let\lastTABLEr=\@@tiachtergrondraster
+ \doifinsetelse{\@@tiachtergrond}{c,color}
+ {\global\chardef\TABLEcr=1}
+ {\global\chardef\TABLEcr=2}}
+
+\def\TableBC%
+ {\ifTABLEgrayline
+ \normalTABLEquote
+ \else
+ \TABLEnoalign\bgroup
+ \global\let\nextTABLEgrayline=\executeTABLEgrayline
+ \let\BL=\doTableBL
+ \let\BC=\doTableBC
+ \expandafter\doTableBC
+ \fi}
+
+\def\doTableBC%
+ {\addtoTABLEgrayline{\BC}%
+ \gobbleTableBCL}
+
+\def\TableBL%
+ {\TABLEnoalign\bgroup
+ \global\let\nextTABLEgrayline=\executeTABLEgrayline
+ \let\BL=\doTableBL
+ \let\CL=\doTableCL
+ \let\RL=\doTableRL
+ \let\BC=\doTableBC
+ \doTableBL}
+
+\def\doTableBL%
+ {\complexorsimpleTable{BL}}
+
+\def\simpleTableBL%
+ {\complexTableBL[,]}
+
+\def\complexTableBL[#1]%
+ {\analyzeTABLEcr[#1]%
+ \handleTABLEcr}
+
+\def\TableBR#1%
+ {\TABLEnoalign
+ {\global\let\nextTABLEgrayline=\executeTABLEgrayline
+ \checkTABLEgrayline#1\BR
+ \global\TABLEgraylinetrue}}
+
+\def\analyzeTABLEcr[#1]%
+ {\doanalyzeTABLEcr[#1,,]}
+
+\def\doanalyzeTABLEcr[#1,#2,#3]%
+ {\doifnumberelse{#1x}
+ {\dodoanalyzeTABLEcr[#1,#2,#3]}
+ {\dodoanalyzeTABLEcr[1,#1,#2]}}
+
+\def\dodoanalyzeTABLEcr[#1,#2,#3]%
+ {\global\chardef\TABLEn=#1\relax
+ \processaction
+ [#2]
+ [ c=>\global\chardef\TABLEcr=1,
+ color=>\global\chardef\TABLEcr=1,
+ r=>\global\chardef\TABLEcr=2,
+ raster=>\global\chardef\TABLEcr=2]%
+ \ifcase\TABLEcr \or
+ \doifnot{#3}{}{\xdef\lastTABLEc{#3}}%
+ \or
+ \doifnot{#3}{}{\xdef\lastTABLEr{#3}}%
+ \fi}
+
+\def\handleTABLEcr%
+ {\relax % else funny side effect
+ \ifcase\TABLEcr
+ % Can't happen!
+ \or
+ \addtoTABLEgrayline{\complexTableCOLOR[\the\TABLEn,\lastTABLEc]}%
+ \else
+ \addtoTABLEgrayline{\complexTableRASTER[\the\TABLEn,\lastTABLEr]}%
+ \fi
+ \gobbleTableBCL}
+
+\def\analyzeTABLEcrl#1[#2]%
+ {\doanalyzeTABLEcrl#1[#2,,]}
+
+\def\doanalyzeTABLEcrl#1[#2,#3,#4]%
+ {\doifnumberelse{#2x}
+ {\dodoanalyzeTABLEcr[#2,#1,#3]}
+ {\dodoanalyzeTABLEcr[\ifTABLEgrayline1\else\maxTABLEcolumn\fi,#1,#2]}}
+
+\def\TableCL%
+ {\TABLEnoalign\bgroup
+ \global\let\nextTABLEgrayline=\executeTABLEgrayline
+ \let\BL=\doTableBL
+ \let\CL=\doTableCL
+ \let\RL=\doTableRL
+ \let\BC=\doTableBC
+ \doTableCL}
+
+\def\doTableCL%
+ {\complexorsimpleTable{CL}}
+
+\def\simpleTableCL% nog eens \"e\"en lijn van maken
+ {\BL[\the\maxTABLEcolumn,c,\lastTABLEc]}
+
+\def\complexTableCL[#1]%
+ {\analyzeTABLEcrl{c}[#1]%
+ \handleTABLEcr}
+
+\def\TableRL%
+ {\TABLEnoalign\bgroup
+ \global\let\nextTABLEgrayline=\executeTABLEgrayline
+ \let\BL=\doTableBL
+ \let\CL=\doTableCL
+ \let\RL=\doTableRL
+ \let\BC=\doTableBC
+ \doTableRL}
+
+\def\doTableRL%
+ {\complexorsimpleTable{RL}}
+
+\def\simpleTableRL%
+ {\BL[\the\maxTABLEcolumn,r,\lastTABLEr]}
+
+\def\complexTableRL[#1]%
+ {\analyzeTABLEcrl{r}[#1]%
+ \handleTABLEcr}
+
+\def\checkTABLEgrayline#1#2%
+ {\!!doneatrue
+ \ifx#1\AR
+ \!!doneafalse
+ \else\ifx#1\SR\else\ifx#1\FR\else\ifx#1\MR\else\ifx#1\LR\else
+ \!!doneafalse
+ \fi\fi\fi\fi\fi
+ \if!!donea
+ \gdef\TABLEgraylinestatus%
+ {[\string#1]}%
+ \gdef\TABLEendBCL%
+ {#1}%
+ \else
+ \gdef\TABLEgraylineerror%
+ {[\string#2\string#1->\string#2\string\SR]}%
+ \gdef\TABLEendBCL%
+ {\SR}%
+ \fi}
+
+\def\endTABLErowGL#1#2#3%
+ {\ifcase#1\relax
+ % unknown
+ \or
+ \doPreTableGL\TABLErowfactor\TABLErowfactor
+ \or
+ \doPreTableGL\TABLErowfactor\TABLErowzero
+ \or
+ \ifnum\TABLEforce=\TABLEforcelastrow
+ \doPreTableGL\TABLErowzero\TABLErowfactor
+ \else\ifnum\TABLEforce=\TABLEforcefirstrow
+ \doPreTableGL\TABLErowfactor\TABLErowzero
+ \else
+ \doPreTableGL\TABLErowzero\TABLErowzero
+ \fi\fi
+ \or
+ \doPreTableGL\TABLErowzero\TABLErowfactor
+ \fi}
+
+\def\doPreTableGL#1#2% betere namen
+ {\xdef\OldLineThicknessFactor{\the\LineThicknessFactor}%
+ \xdef\OldLineThicknessUnit{\the\LineThicknessUnit}%
+ \global\LineThicknessFactor=1
+ \setbox0=\hbox{\AugmentedTableStrut{#1}{#2}}%
+ \getboxheight\dimen0\of\box0\relax
+ \xdef\TABLEgraylineHeight{\the\dimen0}%
+ \global\LineThicknessUnit=\TABLEgraylineHeight}
+
+\def\doPostTableGL%
+ {\global\LineThicknessFactor=\OldLineThicknessFactor
+ \global\LineThicknessUnit =\OldLineThicknessUnit}
+
+% kan simpeler
+
+\def\docomplexTableCOLOR[#1]%
+ {\dodocomplexTableGL\localstartcolor\localstopcolor
+ [#1,\lastTABLEc,,]}
+
+\gdef\docomplexTableRASTER[#1]%
+ {\dodocomplexTableGL\localstartraster\localstopraster
+ [#1,\lastTABLEr,,]}
+
+\def\dodocomplexTableGL#1#2[#3,#4,#5,#6]%
+ {\doifelsenothing{#4}{#1[#5]}{#1[#4]}%
+ \doPreTableGL\TABLEendofrowheight\TABLEendofrowdepth
+ \ifnum#3=1 % else conflict with \omit in \=
+ \let\next=\normalTABLEsinglerule
+ \else
+ \def\next{\normalTABLEmultirule{#3}}%
+ \fi
+ \next
+ \doPostTableGL
+ #2}
+
+\def\TableBACKGROUND%
+ {\TableBR}
+
+\def\simpleTableRASTER#1%
+ {\docomplexTableRASTER[1]#1}
+
+\def\complexTableRASTER[#1]%
+ {\docomplexTableRASTER[#1]}
+
+\def\simpleTableCOLOR%
+ {\docomplexTableCOLOR[1]}
+
+\def\complexTableCOLOR[#1]%
+ {\docomplexTableCOLOR[#1]}
+
+\def\TableRASTER%
+ {\complexorsimpleTable{RASTER}}
+
+\def\TableCOLOR%
+ {\complexorsimpleTable{COLOR}}
+
+\def\addtoTABLEgrayline#1%
+ {\TABLEgraytoks=\expandafter{\TABLEgrayline}%
+ \xdef\TABLEgrayline{\the\TABLEgraytoks\noexpand#1}}
+
+\def\setTableBCL#1#2%
+ {\ifx#1#2%
+ \gdef\TABLEgraylinestatus{[\string#1]}%
+ \gdef\TABLEendBCL{#1}%
+ \addtoTABLEgrayline{#1}%
+ \else
+ \gdef\TABLEgraylineerror{[\string#1->\string#2]}%
+ \gdef\TABLEendBCL{#2}%
+ \addtoTABLEgrayline{#2}%
+ \fi}
+
+\def\gobbleTableBCL#1%
+ {\ifx#1\BC \let\next=\doTableBC \else
+ \ifx#1\BL \let\next=\doTableBL \else
+ \ifx#1\SR \setTableBCL\SR\SR \let\next=\egroup \else
+ \ifx#1\FR \setTableBCL\FR\FR \let\next=\egroup \else
+ \ifx#1\MR \setTableBCL\MR\MR \let\next=\egroup \else
+ \ifx#1\LR \setTableBCL\LR\LR \let\next=\egroup \else
+ \setTableBCL#1\SR \let\next=\egroup
+ \fi\fi\fi\fi\fi\fi
+ \next}
+
+\def\executeTABLEgrayline%
+ {\TABLEnoalign
+ {\def\BC%
+ {\advance\currentTABLEcolumn by 1 }%
+ \def\dodocomplexTableGL##1##2[##3,##4,##5,##6]%
+ {\BC\advance\currentTABLEcolumn by ##3 }%
+ \let\endTABLErow=\endTABLEgrayrow
+ \currentTABLEcolumn=0
+ \TABLEgrayline\TABLEendBCL % determine n of columns and height
+ \advance\currentTABLEcolumn by -1
+ \ifnum\currentTABLEcolumn>\maxTABLEcolumn
+ % error message too long line
+ \global\let\TABLEgrayline=\empty
+ \else
+ % \message{n of color columns: \the\currentTABLEcolumn}\wait
+ \global\TABLEgraylinetrue % vanaf hier nog checken
+ \fi
+ \global\currentTABLEcolumn=0}%
+ \unskip\TABLEgrayline\TABLEendBCL
+ \TABLEnoalign
+ {\nobreak
+ \vskip-\TABLEgraylineHeight
+ \nobreak
+ \global\setTABLEactiontrue
+ \global\currentTABLEcolumn=0
+ \global\let\nextTABLEgrayline=\empty
+ \global\TABLEgraydonetrue
+ \global\TABLEgraylinefalse}}
+
+\def\endTABLEgrayrow#1#2#3%
+ {\ifcase#1\relax
+ \global\chardef\TABLEendofrowheight=\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth =\TABLErowfactor
+ \or
+ \global\chardef\TABLEendofrowheight=\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth =\TABLErowfactor
+ \or
+ \global\chardef\TABLEendofrowheight=\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth =\TABLErowzero
+ \or
+ \ifnum\TABLEforce=\TABLEforcelastrow
+ \global\chardef\TABLEendofrowheight=\TABLErowzero
+ \global\chardef\TABLEendofrowdepth =\TABLErowfactor
+ \else\ifnum\TABLEforce=\TABLEforcefirstrow
+ \global\chardef\TABLEendofrowheight=\TABLErowfactor
+ \global\chardef\TABLEendofrowdepth =\TABLErowzero
+ \else
+ \global\chardef\TABLEendofrowheight=\TABLErowzero
+ \global\chardef\TABLEendofrowdepth =\TABLErowzero
+ \fi\fi
+ \or
+ \global\chardef\TABLEendofrowheight=\TABLErowzero
+ \global\chardef\TABLEendofrowdepth =\TABLErowfactor
+ \fi}
+
+
+\def\defineTABLEshorthands%
+ {\def\TWO {\use{2}}%
+ \def\THREE{\use{3}}%
+ \def\FOUR {\use{4}}%
+ \def\FIVE {\use{5}}%
+ \def\SIX {\use{6}}%
+ \def\REF {\ReFormat}}
+
+\def\defineTABLEunits%
+ {\processaction
+ [\@@tiafstand]
+ [ \v!geen=>\OpenUp{0}{0}\def\LOW{\Lower6 },
+ \v!klein=>\OpenUp{0}{0}\def\LOW{\Lower6 }, % == baseline
+ \v!middel=>\OpenUp{1}{1}\def\LOW{\Lower7 },
+ \v!groot=>\OpenUp{2}{2}\def\LOW{\Lower8 }]%
+ \doifelse{\@@tiafstand}{\v!geen}
+ {\chardef\TABLErowfactor=0 }
+ {\chardef\TABLErowfactor=2 }}
+
+\def\dohandlebar%
+ {\ifmmode
+ \let\next=\domathmodebar
+ \else\ifintable
+ \let\next=\domathmodebar
+ \else
+ \let\next=\dotextmodebar
+ \fi\fi
+ \next}
+
+% De macro's t.b.v. instellingen.
+
+\def\steltabellenin%
+ {\dosingleargument\dosteltabellenin}
+
+\def\dosteltabellenin[#1]%
+ {\getparameters[\??ti][#1]%
+ \assignalfadimension{\@@tiVL}{\@@tiVLwidth} {2}{4}{6}%
+ \assignalfadimension{\@@tiHL}{\@@tiHLheight}{2}{4}{6}}
+
+\def\localTABLEsetup%
+ {\@@ticommandos\relax
+ \expanded{\switchtobodyfont[\@@tikorps]}%
+ \StrutHeightFactor =8
+ \StrutDepthFactor =4
+ \LineThicknessFactor=4
+ \NormalTLTU ={.1pt}%
+ \NormalTSU ={\normalbaselineskip\divide\StrutUnit by 12 }%
+ \NormalTableUnits}
+
+\steltabellenin
+ [HL=\v!middel,
+ VL=\v!middel,
+ NL=\v!klein,
+ \c!afstand=\v!middel,
+ \c!korps=\the\bodyfontsize,
+ \c!commandos=,
+ \c!achtergrond=\v!raster,
+ \c!achtergrondraster=\@@rsraster,
+ \c!achtergrondkleur=]
+
+\def\ifintabel{\ifintable} % upward compatible
+
+\protect \endinput
diff --git a/tex/context/base/core-var.tex b/tex/context/base/core-var.tex index 0c7d0a059..817f7117e 100644 --- a/tex/context/base/core-var.tex +++ b/tex/context/base/core-var.tex @@ -1,22 +1,23 @@ -%D \module -%D [ file=core-var, -%D version=1998.02.21, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Variables, -%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 Core Macros / Variables} - -\unprotect - -\newtoks\everyshipout - -\protect - -\endinput +%D \module
+%D [ file=core-var,
+%D version=1998.02.21,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Variables,
+%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 Core Macros / Variables}
+
+\unprotect
+
+\newtoks\everyshipout
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-ver.tex b/tex/context/base/core-ver.tex index e2d72bf42..d5838f695 100644 --- a/tex/context/base/core-ver.tex +++ b/tex/context/base/core-ver.tex @@ -1,674 +1,683 @@ -%D \module -%D [ file=core-ver, -%D version=1996.06.01, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Verbatim, -%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 Core Macros / Verbatim} - -\unprotect - -% \type{ <crlf> char} geeft bagger - -%D We are going to embed the general verbatim support macros in -%D a proper environment. First we show the common setup -%D macro, so we know what features are supported. The options -%D are hooked into the support macros via the \type{\obey} -%D macros. - -\def\prettyidentifier {TEX} -\def\prettypalet {} - -\def\setupprettiesintype#1% - {\edef\prettyidentifier{#1}% - \doifinstringelse{\prettyidentifier}{tex,TEX} - {\def\prettyidentifier{TEX}} - {\doifinstringelse{\prettyidentifier}{perl,pl,PERL,PL} - {\def\prettyidentifier{PL}} - {\doifinstringelse{\prettyidentifier}{metapost,mp,metafont,mf,METAPOST,MP,METAFONT,MF} - {\def\prettyidentifier{MP}} - {\doifinstringelse{\prettyidentifier}{javascript,js,java,jv,JAVASCRIPT,JS,JAVA,JV} - {\def\prettyidentifier{JV}} - {\def\prettyidentifier{TEX}}}}}% - \doifundefined{setuppretty\prettyidentifier type}% - {\setbox0=\hbox % get rid of spaces when in-line \newpretty loading - {\restorecatcodes % also needed when loading during \newpretty - \readsysfile{verb-\prettyidentifier.tex}{}{}}}% - \doifdefinedelse{setuppretty\prettyidentifier type}% - {\def\setupprettytype{\getvalue{setuppretty\prettyidentifier type}}} - {\let\setupprettytype=\relax}} - -\installnewpretty M {\setupprettiesintype{MP}\setupprettytype} -\installnewpretty P {\setupprettiesintype{PL}\setupprettytype} -\installnewpretty T {\setupprettiesintype{TEX}\setupprettytype} -\installnewpretty J {\setupprettiesintype{JV}\setupprettytype} - -\def\setupcommonverbatim#1% - {\def\verbatimfont {\tttf}% - \def\prettyidentifierfont {\ttsl}% - \def\prettyvariablefont {}% - \def\prettyidentifier {TEX}% - \doifvalue{#1\c!spatie}{\v!aan} - {\def\obeyspaces{\setcontrolspaces}}% - \doifvalue{#1\c!tab}{\v!aan} - {\def\obeytabs{\settabskips}}% - \doifvalue{#1\c!pagina}{\v!nee} - {\def\obeypages{\ignorepages}}% - \ExpandFirstAfter\processaction - [\getvalue{#1\c!optie}] - [ \v!geen=>\let\obeycharacters=\relax, - \v!kleur=>\setupprettiesintype{TEX}% - \let\obeycharacters=\setupprettytype - \let\obeytabs=\ignoretabs, - \v!normaal=>\let\obeycharacters=\setupgroupedtype, - \v!commandos=>\def\obeycharacters{\setupcommandsintype{#1}}% - \let\obeytabs=\ignoretabs, - \v!schuin=>\let\obeycharacters=\setupslantedtype - \let\obeytabs=\ignoretabs, - \s!unknown=>\setupprettiesintype{\getvalue{#1\c!optie}}% - \let\obeycharacters=\setupprettytype - \let\obeytabs=\ignoretabs]% - \edef\prettypalet% - {\prettyidentifier\getvalue{#1\c!palet}}} - -%D The verbatim commands have a rather long and turbulent -%D history. Most users of \CONTEXT\ probably will never use -%D some of the features, but I've kept in mind that when one is -%D writing a users manual, about everything can and undoubtly -%D will be subject to a verbatim treatment. -%D -%D Verbatim command are very sensitive to argument processing, -%D which is a direct result of the \CATCODES\ being fixed at -%D reading time. With our growing understanding of \TEX, -%D especially of the mechanism that can be used for looking -%D ahead and manipulating \CATCODES, the verbatim support -%D became more and more advanced and natural. -%D -%D Typesetting inline verbatim can be accomplished by -%D \type{\type}, which in this sentence was typeset by saying -%D just \type{\type{\type}}, which in turn was typeset by -%D \onbekend. Using the normal grouping characters \type{{}} is -%D the most natural way of using this command. -%D -%D A second, more or less redundant, alternative is delimiting -%D the argument with an own character. This method was -%D implemented in the context of a publication in the \MAPS, -%D where this way of delimiting is recognized by \LATEX\ users. -%D -%D The third, more original alternative, is the one using -%D \type{<<} and \type{>>} as delimiters. This alternative can -%D be used in situations where slanted typeseting is needed. - -\def\lesscharacter {<} -\def\morecharacter {>} - -\chardef\texescape = `\\ -\chardef\leftargument = `\{ -\chardef\rightargument = `\} - -%D \macros -%D {type} -%D {} -%D -%D We define \type{\type} as a protected command. First we -%D set the catcodes of \type{<} and \type{>} and then we start -%D looking ahead. - -\unexpanded\def\type% - {\bgroup - \catcode`\<=\@@other - \catcode`\>=\@@other - \futurelet\next\dotype} - -%D Next we distinguish between the three alternatives and call -%D for the appropriate macros. - -\def\dotype% - {\ifx\next\bgroup - \initializetype - \initializetypegrouping - \def\next% - {\afterassignment\protectfirsttype\let\next=}% - \else\if\next<% - \doifelse{\@@tyoptie}{\v!geen} - {\initializetype - \setupnotypegrouping - \def\next% - {\let\next=}} - {\def\next<##1% - {\initializetype - \if##1<% - \else - \setupalternativetypegrouping - ##1% - \fi}}% - \else - \def\next##1% - {\initializetype - \catcode`##1=\@@endgroup}% - \fi\fi - \next} - -\bgroup -\catcode`\[=\@@begingroup -\catcode`\]=\@@endgroup -\catcode`\{=\@@active -\catcode`\}=\@@active -\gdef\initializetypegrouping% - [\catcode`\{=\@@active - \catcode`\}=\@@endgroup % otherwise things go wrong ... - \def\activerightargument% - [\rightargument - \egroup]% - \def\activeleftargument% - [\bgroup - \leftargument %% this way TeXEdit can check: { - \catcode`\}=\@@active % ... in alignments (tables) - \let}=\activerightargument]% - \let{=\activeleftargument]% %% this way TeXEdit can check: } -\egroup - -\bgroup -\catcode`\<=\@@active -\catcode`\>=\@@active -\gdef\setupalternativetypegrouping% - {\catcode`\<=\@@active - \catcode`\>=\@@active - \def<% - {\bgroup - \switchslantedtype}% - \def>% - {\egroup}} -\egroup - -\def\setupnotypegrouping% - {\catcode`\<=\@@begingroup - \catcode`\>=\@@endgroup} - -%D When writing the manual to \CONTEXT\ and documenting this -%D source we needed to typeset \type{<<} and \type{>>}. Because -%D we wanted to do this in the natural way, we've adapted the -%D original definition a bit. We still show teh original -%D because we think it's shows a bit better what we are -%D doing. -%D -%D \starttypen -%D \bgroup -%D \catcode`\<=\@@active -%D \catcode`\>=\@@active -%D \gdef\setupgroupedtype% -%D {\catcode`\<=\@@active -%D \catcode`\>=\@@active -%D \def<% -%D {\def\do% -%D {\ifx\next<% -%D \def\next{\bgroup\switchslantedtype\let\next=}% -%D \else -%D \let\next=\lesscharacter -%D \fi -%D \next}% -%D \futurelet\next\do}% -%D \def>% -%D {\def\do% -%D {\ifx\next>% -%D \def\next{\egroup\let\next=}% -%D \else -%D \let\next=\morecharacter -%D \fi -%D \next}% -%D \futurelet\next\do}} -%D \egroup -%D \stoptypen -%D -%D The final implementation looks a bit further and treats the -%D lone \type{<<} and \type{>>} a bit different. - -\def\doenterdoublelesstype% - {\ifx\next\egroup - \lesscharacter\lesscharacter - \else - \bgroup\switchslantedtype - \let\doenterdoublemoretype=\egroup - \fi} - -\def\doenterdoublemoretype% - {\def\doenterdoubletype% - {\ifx\next\egroup - \morecharacter\morecharacter - \fi}} - -\bgroup -\catcode`\<=\@@active -\catcode`\>=\@@active -\gdef\setupgroupedtype% - {\catcode`\<=\@@active - \catcode`\>=\@@active - \def\doless% - {\ifx<\next - \def\next% - {\def\enterdoubletype% - {\futurelet\next\doenterdoublelesstype}% - \afterassignment\enterdoubletype - \let\next=}% - \else - \let\next=\lesscharacter - \fi - \next}% - \def\domore% - {\ifx>\next - \def\next% - {\def\enterdoubletype% - {\futurelet\next\doenterdoublemoretype}% - \afterassignment\enterdoubletype - \let\next=}% - \else - \let\next=\morecharacter - \fi - \next}% - \def<{\futurelet\next\doless}% - \def>{\futurelet\next\domore}} -\egroup - -\newif\ifslantedtypeactivated -\newif\ifslantedtypepermitted - -\def\switchslantedtype% - {\ifslantedtypepermitted - \ifslantedtypeactivated - \slantedtypeactivatedfalse\tttf - \else - \slantedtypeactivatedtrue\ttsl - \fi - \fi} - -\def\setupcommandsintype#1% - {\setupgroupedtype - \edef\!!stringa{\getvalue{#1\c!escape}}% - \@EA\catcode\@EA`\!!stringa=\@@escape} - -\def\setupslantedtype% - {\setupgroupedtype - \slantedtypepermittedtrue} - -\bgroup -\catcode`\<=\active -\catcode`\>=\active -\gdef\doprotectfirsttype% - {\ifx\next<% - \let\next=\relax - \else\ifx\next\bgroup - \let\next=\relax - \else\ifx\next\activeleftargument - \let\next=\relax - \else - \let\next=\string - \fi\fi\fi - \next} -\egroup - -\def\protectfirsttype% - {\futurelet\next\doprotectfirsttype} - -%D The neccessary initializations are done by calling -%D \type{\initializetype} which in return calls for the support -%D macro \type{\setupinlineverbatim}. - -\def\initializetype% - {\let\obeylines=\ignorelines - \setupcommonverbatim{\??ty}% - \setupinlineverbatim} - -%D \macros -%D {setuptype} -%D {} -%D -%D Some characteristics of \type{\type} can be set up by: - -\def\setuptype% - {\dodoubleargument\getparameters[\??ty]} - -%D \macros -%D {typ} -%D {} -%D -%D Although it's not clear from the macros, one character trait -%D of this macros, which are build on top of the support -%D module, is that they don't hyphenate. We therefore offer the -%D alternative \type{\typ}. The current -%D implementation works all right, but a decent hyphenation -%D support of \type{\tt} text will be implemented soon. - -% \def\obeyhyphens% % after fontswitch -% {\def\obeyedspace% -% {\hyphenchar\font=45 -% \spaceskip.5em\!!plus.25em\!!minus.25em\relax% -% \def\obeyedspace{ }}} - -\unexpanded\def\typ% - {\bgroup - \def\obeyedspace{ }% - \tttf\hyphenchar\font=45 - \ttsl\hyphenchar\font=45 - \spaceskip.5em\!!plus.25em\!!minus.25em\relax - \futurelet\next\dotype} - -%D \macros -%D {tex,arg,mat,dis} -%D {} -%D -%D Sometimes, for instance when we pass verbatim text as an -%D argument, the fixed \CATCODES\ interfere with our wishes. An -%D experimental implementation of character by character -%D processing of verbatim text did overcome this limitation, -%D but we've decided not to use that slow and sometimes -%D troublesome solution. Instead we stick to some 'old' -%D \CONTEXT\ macros for typesetting typical \TEX\ characters. -%D -%D The next implementation is more clear but less versatile, -%D so we treated it for a beter one. -%D -%D \starttypen -%D \def\dospecialtype#1#2% -%D {\bgroup -%D \initializetype -%D \catcode`\{=\@@begingroup -%D \catcode`\}=\@@endgroup -%D \def\dospecialtype% -%D {\def\dospecialtype{#2\egroup}% -%D \bgroup -%D \aftergroup\dospecialtype -%D #1}% -%D \afterassignment\dospecialtype -%D \let\next=} -%D -%D \unexpanded\def\tex{\dospecialtype\texescape\relax} -%D \unexpanded\def\arg{\dospecialtype\leftargument\rightargument} -%D \unexpanded\def\mat{\dospecialtype\$\$} -%D \unexpanded\def\dis{\dospecialtype{\$\$}{\$\$}} -%D \stoptypen -%D -% %D For sometime we used the better but less readable is -% %D alternative -% %D -% %D \starttypen -% %D \def\doprocessgroup#1#2#3% -% %D {\bgroup -% %D #1% -% %D \def\doprocessgroup% -% %D {\def\doprocessgroup{#3\egroup}% -% %D \bgroup -% %D \aftergroup\doprocessgroup -% %D #2}% -% %D \afterassignment\doprocessgroup -% %D \let\next=} -% %D -% %D \def\setgroupedtype% -% %D {\initializetype -% %D \catcode`\{=\@@begingroup -% %D \catcode`\}=\@@endgroup} -% %D -% %D \unexpanded\def\tex{\doprocessgroup\setgroupedtype\texescape\relax} -% %D \unexpanded\def\arg{\doprocessgroup\setgroupedtype\leftargument\rightargument} -% %D \unexpanded\def\mat{\doprocessgroup\setgroupedtype\$\$} -% %D \unexpanded\def\dis{\doprocessgroup\setgroupedtype{\$\$}{\$\$}} -% %D \stoptypen -% %D -%D -%D But since \type{\groupedcommand} became available, we use -%D however - -\def\setgroupedtype% - {\initializetype - \catcode`\{=\@@begingroup - \catcode`\}=\@@endgroup} - -\unexpanded\def\tex{\groupedcommand{\setgroupedtype\texescape}{\relax}} -\unexpanded\def\arg{\groupedcommand{\setgroupedtype\leftargument}{\rightargument}} -\unexpanded\def\mat{\groupedcommand{\setgroupedtype\$}{\$}} -\unexpanded\def\dis{\groupedcommand{\setgroupedtype\$\$}{\$\$}} - -%D \macros -%D {starttyping} -%D {} -%D -%D Display verbatim is realized far more easy, which is mostly -%D due to the fact that we use \type{\stop...} as delimiter. -%D The implementation inherits some features, for instance the -%D support of linenumbering, which can best be studied in the -%D documented support module. - -\def\initializetyping#1% - {\doifelsevalue{\??tp#1\c!marge}{\v!standaard} - {\ifdim\voorwit=\!!zeropoint - \advance\leftskip by \@@sllinks - \else - \advance\leftskip by \voorwit - \fi} - {\advance\leftskip by \getvalue{\??tp#1\c!marge}}% - \processaction - [\getvalue{\??tp#1\c!blanko}] - [\v!standaard=>\skip0=\tussenwit, - \v!klein=>\skip0=\blankokleinmaat, - \v!middel=>\skip0=\blankomiddelmaat, - \v!groot=>\skip0=\blankogrootmaat, - \v!regel=>\skip0=\baselineskip, - \v!geen=>\skip0=\!!zeropoint, - \s!unknown=>\skip0=\getvalue{\??tp#1\c!blanko}]% - \edef\verbatimbaselineskip{\the\skip0}% - \setupcommonverbatim{\??tp#1}} - -%D The basic display verbatim commands are defined in an -%D indirect way. As we will see, they are a specific case of a -%D more general mechanism. - -\def\dostarttyping#1% - {\getvalue{\??tp#1\c!voor}% - \startopelkaar % includes \bgroup - \initializetyping{#1}% - \expandafter\processdisplayverbatim\expandafter{\s!stop#1}} - -\def\dostoptyping#1% - {\stopopelkaar % includes \egroup - \getvalue{\??tp#1\c!na}} - -%D \macros -%D {definetyping} -%D {} -%D -%D For most users the standard \type{\start}||\type{\stop}||pair -%D will suffice, but for documentation purposes the next -%D definition command can be of use: -%D -%D \starttypen -%D \definetyping[extratyping][margin=3em] -%D -%D \startextratyping -%D these extra ones are indented by 1 em -%D \stopextratyping -%D \stoptypen -%D -%D The definitions default to the standard typing values. - -\def\presettyping[#1][#2]% - {\getparameters - [\??tp#1] - [\c!voor=\@@tpvoor, - \c!na=\@@tpna, - \c!spatie=\@@tpspatie, - \c!pagina=\@@tppagina, - \c!tab=\@@tptab, - \c!optie=\@@tpoptie, - \c!palet=\@@tppalet, - \c!marge=\@@tpmarge, - \c!blanko=\@@tpblanko, - \c!escape=\@@tpescape, - #2]} - -\def\dodefinetyping[#1][#2]% - {\setvalue{\e!start#1}{\dostarttyping{#1}}% - \setvalue{\e!stop#1}{\dostoptyping{#1}}% - \presettyping[#1][#2]} - -\def\definetyping% - {\dodoubleempty\dodefinetyping} - -\definetyping[\v!typen] - -\definetyping[MP] [\c!optie=MP] -\definetyping[PL] [\c!optie=PL] -\definetyping[JV] [\c!optie=JV] -\definetyping[TEX][\c!optie=TEX] - -%D \macros -%D {setuptyping} -%D {} -%D -%D The setup of typing accepts two arguments. The optional -%D first one identifies the user defined ones. If only one -%D argument is given, the values apply to both the standard -%D command \type{\starttyping} and \type{\typefile}. - -%\indirect\def\setuptyping\dodoubleempty[#1][#2]% -% {\iffirstargument -% \getparameters[\??tp#1][#2]% -% \else -% \getparameters[\??tp][#1]% -% \fi} -% -%\doubleemptied\def\setuptyping[#1][#2]% -% {\iffirstargument -% \getparameters[\??tp#1][#2]% -% \else -% \getparameters[\??tp][#1]% -% \fi} - -\def\dosetuptyping[#1][#2]% - {\ifsecondargument - \getparameters[\??tp#1][#2]% - \else - \getparameters[\??tp][#1]% - \fi} - -\def\setuptyping% - {\dodoubleempty\dosetuptyping} - -%D We use the \CONTEXT\ color system for switching to and from -%D color mode. We can always redefine these colors afterwards. - -\definecolor [colorprettyone] [r=.9, g=.0, b=.0] % red -\definecolor [colorprettytwo] [r=.0, g=.8, b=.0] % green -\definecolor [colorprettythree] [r=.0, g=.0, b=.9] % blue -\definecolor [colorprettyfour] [r=.8, g=.8, b=.6] % yellow - -\definecolor [grayprettyone] [s=.30] -\definecolor [grayprettytwo] [s=.45] -\definecolor [grayprettythree] [s=.60] -\definecolor [grayprettyfour] [s=.75] - -\definepalet - [colorpretty] - [ prettyone=colorprettyone, - prettytwo=colorprettytwo, - prettythree=colorprettythree, - prettyfour=colorprettyfour] - -\definepalet - [graypretty] - [ prettyone=grayprettyone, - prettytwo=grayprettytwo, - prettythree=grayprettythree, - prettyfour=grayprettyfour] - -% ---> naar verb-* ? of predefine als undefined? - -\definepalet [TEXcolorpretty] [colorpretty] -\definepalet [TEXgraypretty] [graypretty] -\definepalet [PLcolorpretty] [colorpretty] -\definepalet [PLgraypretty] [graypretty] -\definepalet [MPcolorpretty] [colorpretty] -\definepalet [MPgraypretty] [graypretty] -\definepalet [JVcolorpretty] [colorpretty] -\definepalet [JVgraypretty] [graypretty] - -%D We can use some core color commands. These are faster than -%D the standard color switching ones and work ok on a line by -%D line basis. - -% Some real in-depth knowlegde of palets: `palet:color' it is! - -\def\beginofpretty[#1]{\startcolormode{\prettypalet:#1}} -\def\endofpretty {\stopcolormode} - -%D \macros -%D {EveryPar, EveryLine, iflinepar} -%D {} -%D -%D One of the features of these commands is the support of -%D \type{\EveryPar}, \type{\EveryLine} and \type{\iflinepar}. -%D In the documentation of the verbatim support module we give -%D some examples of line- and paragraph numerbering using these -%D macros. - -%D \macros -%D {typefile} -%D {} -%D -%D Typesetting files verbatim (for the moment) only supports -%D colorization of \TEX\ sources as valid option. The other -%D setup values are inherited from display verbatim. -%D The implementation of \type{\typefile} is straightforward: - -\presettyping[\v!file][] - -\def\typefile#1% - {\getvalue{\??tp\v!file\c!voor}% - \startopelkaar % includes \bgroup - \doifinset{\getvalue{\??tp\v!file\c!optie}}{\v!commandos,\v!schuin,\v!normaal} - {\setuptyping[\v!file][\c!optie=\v!geen]}% - \doifvalue{\??tp\v!file\c!optie}{\v!kleur} - {\expandafter\aftersplitstring#1\at.\to\prettyidentifier - \letvalue{\??tp\v!file\c!optie}=\prettyidentifier}% - \initializetyping\v!file - \processfileverbatim{#1}% - \stopopelkaar % includes \egroup - \getvalue{\??tp\v!file\c!na}} - -%D The setups for inline verbatim default to: - -\setuptype - [\c!spatie=\v!uit, - \c!pagina=\v!nee, - \c!tab=\v!nee, - \c!optie=\v!normaal] - -%D The setups for display verbatim and file verbatim are -%D shared. One can adapt the extra defined typing environments, -%D but they also default to the values below. Watch the -%D alternative escape character. - -\setuptyping - [ \c!voor=\blanko, - \c!na=\blanko, - \c!spatie=\v!uit, - \c!pagina=\v!nee, - \c!tab=\v!aan, - \c!optie=\v!geen, - \c!palet=colorpretty, - \c!marge=\!!zeropoint, - \c!blanko=\v!regel, - \c!escape=/] - -\permitshiftedendofverbatim - -\optimizeverbatimtrue - -\protect - -\endinput +%D \module
+%D [ file=core-ver,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Verbatim,
+%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 Core Macros / Verbatim}
+
+\unprotect
+
+% \type{ <crlf> char} geeft bagger
+
+%D We are going to embed the general verbatim support macros in
+%D a proper environment. First we show the common setup
+%D macro, so we know what features are supported. The options
+%D are hooked into the support macros via the \type{\obey}
+%D macros.
+
+\def\prettyidentifier {TEX}
+\def\prettypalet {}
+
+\def\setupprettiesintype#1%
+ {\edef\prettyidentifier{#1}%
+ \doifinstringelse{\prettyidentifier}{tex,TEX}
+ {\def\prettyidentifier{TEX}}
+ {\doifinstringelse{\prettyidentifier}{perl,pl,PERL,PL}
+ {\def\prettyidentifier{PL}}
+ {\doifinstringelse{\prettyidentifier}{metapost,mp,metafont,mf,METAPOST,MP,METAFONT,MF}
+ {\def\prettyidentifier{MP}}
+ {\doifinstringelse{\prettyidentifier}{javascript,js,java,jv,JAVASCRIPT,JS,JAVA,JV}
+ {\def\prettyidentifier{JV}}
+ {\def\prettyidentifier{TEX}}}}}%
+ \doifundefined{setuppretty\prettyidentifier type}%
+ {\setbox0=\hbox % get rid of spaces when in-line \newpretty loading
+ {\restorecatcodes % also needed when loading during \newpretty
+ \readsysfile{verb-\prettyidentifier.tex}{}{}}}%
+ \doifdefinedelse{setuppretty\prettyidentifier type}%
+ {\def\setupprettytype{\getvalue{setuppretty\prettyidentifier type}}}
+ {\let\setupprettytype=\relax}}
+
+\installnewpretty M {\setupprettiesintype{MP}\setupprettytype}
+\installnewpretty P {\setupprettiesintype{PL}\setupprettytype}
+\installnewpretty T {\setupprettiesintype{TEX}\setupprettytype}
+\installnewpretty J {\setupprettiesintype{JV}\setupprettytype}
+
+\def\setupcommonverbatim#1%
+ {\def\verbatimfont {\tttf}%
+ \def\prettyidentifierfont {\ttsl}%
+ \def\prettyvariablefont {}%
+ \def\prettyidentifier {TEX}%
+ \doifvalue{#1\c!spatie}{\v!aan}
+ {\def\obeyspaces{\setcontrolspaces}}%
+ \doifvalue{#1\c!tab}{\v!aan}
+ {\def\obeytabs{\settabskips}}%
+ \doifvalue{#1\c!pagina}{\v!nee}
+ {\def\obeypages{\ignorepages}}%
+ \ExpandFirstAfter\processaction
+ [\getvalue{#1\c!optie}]
+ [ \v!geen=>\let\obeycharacters=\relax,
+ \v!kleur=>\setupprettiesintype{TEX}%
+ \let\obeycharacters=\setupprettytype
+ \let\obeytabs=\ignoretabs,
+ \v!normaal=>\let\obeycharacters=\setupgroupedtype,
+ \v!commandos=>\def\obeycharacters{\setupcommandsintype{#1}}%
+ \let\obeytabs=\ignoretabs,
+ \v!schuin=>\let\obeycharacters=\setupslantedtype
+ \let\obeytabs=\ignoretabs,
+ \s!unknown=>\setupprettiesintype{\getvalue{#1\c!optie}}%
+ \let\obeycharacters=\setupprettytype
+ \let\obeytabs=\ignoretabs]%
+ \edef\prettypalet%
+ {\prettyidentifier\getvalue{#1\c!palet}}}
+
+%D The verbatim commands have a rather long and turbulent
+%D history. Most users of \CONTEXT\ probably will never use
+%D some of the features, but I've kept in mind that when one is
+%D writing a users manual, about everything can and undoubtly
+%D will be subject to a verbatim treatment.
+%D
+%D Verbatim command are very sensitive to argument processing,
+%D which is a direct result of the \CATCODES\ being fixed at
+%D reading time. With our growing understanding of \TEX,
+%D especially of the mechanism that can be used for looking
+%D ahead and manipulating \CATCODES, the verbatim support
+%D became more and more advanced and natural.
+%D
+%D Typesetting inline verbatim can be accomplished by
+%D \type{\type}, which in this sentence was typeset by saying
+%D just \type{\type{\type}}, which in turn was typeset by
+%D \onbekend. Using the normal grouping characters \type{{}} is
+%D the most natural way of using this command.
+%D
+%D A second, more or less redundant, alternative is delimiting
+%D the argument with an own character. This method was
+%D implemented in the context of a publication in the \MAPS,
+%D where this way of delimiting is recognized by \LATEX\ users.
+%D
+%D The third, more original alternative, is the one using
+%D \type{<<} and \type{>>} as delimiters. This alternative can
+%D be used in situations where slanted typeseting is needed.
+
+\def\lesscharacter {<}
+\def\morecharacter {>}
+
+\chardef\texescape = `\\
+\chardef\leftargument = `\{
+\chardef\rightargument = `\}
+
+%D \macros
+%D {type}
+%D {}
+%D
+%D We define \type{\type} as a protected command. First we
+%D set the catcodes of \type{<} and \type{>} and then we start
+%D looking ahead.
+
+\unexpanded\def\type%
+ {\bgroup
+ \catcode`\<=\@@other
+ \catcode`\>=\@@other
+ \futurelet\next\dotype}
+
+%D Next we distinguish between the three alternatives and call
+%D for the appropriate macros.
+
+\def\dotype%
+ {\ifx\next\bgroup
+ \initializetype
+ \initializetypegrouping
+ \def\next%
+ {\afterassignment\protectfirsttype\let\next=}%
+ \else\if\next<%
+ \doifelse{\@@tyoptie}{\v!geen}
+ {\initializetype
+ \setupnotypegrouping
+ \def\next%
+ {\let\next=}}
+ {\def\next<##1%
+ {\initializetype
+ \if##1<%
+ \else
+ \setupalternativetypegrouping
+ ##1%
+ \fi}}%
+ \else
+ \def\next##1%
+ {\initializetype
+ \catcode`##1=\@@endgroup}%
+ \fi\fi
+ \next}
+
+\bgroup
+\catcode`\[=\@@begingroup
+\catcode`\]=\@@endgroup
+\catcode`\{=\@@active
+\catcode`\}=\@@active
+\gdef\initializetypegrouping%
+ [\catcode`\{=\@@active
+ \catcode`\}=\@@endgroup % otherwise things go wrong ...
+ \def\activerightargument%
+ [\rightargument
+ \egroup]%
+ \def\activeleftargument%
+ [\bgroup
+ \leftargument %% this way TeXEdit can check: {
+ \catcode`\}=\@@active % ... in alignments (tables)
+ \let}=\activerightargument]%
+ \let{=\activeleftargument]% %% this way TeXEdit can check: }
+\egroup
+
+\bgroup
+\catcode`\<=\@@active
+\catcode`\>=\@@active
+\gdef\setupalternativetypegrouping%
+ {\catcode`\<=\@@active
+ \catcode`\>=\@@active
+ \def<%
+ {\bgroup
+ \switchslantedtype}%
+ \def>%
+ {\egroup}}
+\egroup
+
+\def\setupnotypegrouping%
+ {\catcode`\<=\@@begingroup
+ \catcode`\>=\@@endgroup}
+
+%D When writing the manual to \CONTEXT\ and documenting this
+%D source we needed to typeset \type{<<} and \type{>>}. Because
+%D we wanted to do this in the natural way, we've adapted the
+%D original definition a bit. We still show teh original
+%D because we think it's shows a bit better what we are
+%D doing.
+%D
+%D \starttypen
+%D \bgroup
+%D \catcode`\<=\@@active
+%D \catcode`\>=\@@active
+%D \gdef\setupgroupedtype%
+%D {\catcode`\<=\@@active
+%D \catcode`\>=\@@active
+%D \def<%
+%D {\def\do%
+%D {\ifx\next<%
+%D \def\next{\bgroup\switchslantedtype\let\next=}%
+%D \else
+%D \let\next=\lesscharacter
+%D \fi
+%D \next}%
+%D \futurelet\next\do}%
+%D \def>%
+%D {\def\do%
+%D {\ifx\next>%
+%D \def\next{\egroup\let\next=}%
+%D \else
+%D \let\next=\morecharacter
+%D \fi
+%D \next}%
+%D \futurelet\next\do}}
+%D \egroup
+%D \stoptypen
+%D
+%D The final implementation looks a bit further and treats the
+%D lone \type{<<} and \type{>>} a bit different.
+
+\def\doenterdoublelesstype%
+ {\ifx\next\egroup
+ \lesscharacter\lesscharacter
+ \else
+ \bgroup\switchslantedtype
+ \let\doenterdoublemoretype=\egroup
+ \fi}
+
+\def\doenterdoublemoretype%
+ {\def\doenterdoubletype%
+ {\ifx\next\egroup
+ \morecharacter\morecharacter
+ \fi}}
+
+\bgroup
+\catcode`\<=\@@active
+\catcode`\>=\@@active
+\gdef\setupgroupedtype%
+ {\catcode`\<=\@@active
+ \catcode`\>=\@@active
+ \def\doless%
+ {\ifx<\next
+ \def\next%
+ {\def\enterdoubletype%
+ {\futurelet\next\doenterdoublelesstype}%
+ \afterassignment\enterdoubletype
+ \let\next=}%
+ \else
+ \let\next=\lesscharacter
+ \fi
+ \next}%
+ \def\domore%
+ {\ifx>\next
+ \def\next%
+ {\def\enterdoubletype%
+ {\futurelet\next\doenterdoublemoretype}%
+ \afterassignment\enterdoubletype
+ \let\next=}%
+ \else
+ \let\next=\morecharacter
+ \fi
+ \next}%
+ \def<{\futurelet\next\doless}%
+ \def>{\futurelet\next\domore}}
+\egroup
+
+\newif\ifslantedtypeactivated
+\newif\ifslantedtypepermitted
+
+\def\switchslantedtype%
+ {\ifslantedtypepermitted
+ \ifslantedtypeactivated
+ \slantedtypeactivatedfalse\tttf
+ \else
+ \slantedtypeactivatedtrue\ttsl
+ \fi
+ \fi}
+
+\def\setupcommandsintype#1%
+ {\setupgroupedtype
+ \edef\!!stringa{\getvalue{#1\c!escape}}%
+ \@EA\catcode\@EA`\!!stringa=\@@escape}
+
+\def\setupslantedtype%
+ {\setupgroupedtype
+ \slantedtypepermittedtrue}
+
+\bgroup
+\catcode`\<=\active
+\catcode`\>=\active
+\gdef\doprotectfirsttype%
+ {\ifx\next<%
+ \let\next=\relax
+ \else\ifx\next\bgroup
+ \let\next=\relax
+ \else\ifx\next\activeleftargument
+ \let\next=\relax
+ \else
+ \let\next=\string
+ \fi\fi\fi
+ \next}
+\egroup
+
+\def\protectfirsttype%
+ {\futurelet\next\doprotectfirsttype}
+
+%D The neccessary initializations are done by calling
+%D \type{\initializetype} which in return calls for the support
+%D macro \type{\setupinlineverbatim}.
+
+\def\initializetype%
+ {\let\obeylines=\ignorelines
+ \setupcommonverbatim{\??ty}%
+ \setupinlineverbatim}
+
+%D \macros
+%D {setuptype}
+%D {}
+%D
+%D Some characteristics of \type{\type} can be set up by:
+
+\def\setuptype%
+ {\dodoubleargument\getparameters[\??ty]}
+
+%D \macros
+%D {typ}
+%D {}
+%D
+%D Although it's not clear from the macros, one character trait
+%D of this macros, which are build on top of the support
+%D module, is that they don't hyphenate. We therefore offer the
+%D alternative \type{\typ}. The current
+%D implementation works all right, but a decent hyphenation
+%D support of \type{\tt} text will be implemented soon.
+
+% \def\obeyhyphens% % after fontswitch
+% {\def\obeyedspace%
+% {\hyphenchar\font=45
+% \spaceskip.5em\!!plus.25em\!!minus.25em\relax%
+% \def\obeyedspace{ }}}
+
+\unexpanded\def\typ%
+ {\bgroup
+ \def\obeyedspace{ }%
+ \tttf\hyphenchar\font=45
+ \ttsl\hyphenchar\font=45
+ \spaceskip.5em\!!plus.25em\!!minus.25em\relax
+ \futurelet\next\dotype}
+
+%D \macros
+%D {tex,arg,mat,dis}
+%D {}
+%D
+%D Sometimes, for instance when we pass verbatim text as an
+%D argument, the fixed \CATCODES\ interfere with our wishes. An
+%D experimental implementation of character by character
+%D processing of verbatim text did overcome this limitation,
+%D but we've decided not to use that slow and sometimes
+%D troublesome solution. Instead we stick to some 'old'
+%D \CONTEXT\ macros for typesetting typical \TEX\ characters.
+%D
+%D The next implementation is more clear but less versatile,
+%D so we treated it for a beter one.
+%D
+%D \starttypen
+%D \def\dospecialtype#1#2%
+%D {\bgroup
+%D \initializetype
+%D \catcode`\{=\@@begingroup
+%D \catcode`\}=\@@endgroup
+%D \def\dospecialtype%
+%D {\def\dospecialtype{#2\egroup}%
+%D \bgroup
+%D \aftergroup\dospecialtype
+%D #1}%
+%D \afterassignment\dospecialtype
+%D \let\next=}
+%D
+%D \unexpanded\def\tex{\dospecialtype\texescape\relax}
+%D \unexpanded\def\arg{\dospecialtype\leftargument\rightargument}
+%D \unexpanded\def\mat{\dospecialtype\$\$}
+%D \unexpanded\def\dis{\dospecialtype{\$\$}{\$\$}}
+%D \stoptypen
+%D
+% %D For sometime we used the better but less readable is
+% %D alternative
+% %D
+% %D \starttypen
+% %D \def\doprocessgroup#1#2#3%
+% %D {\bgroup
+% %D #1%
+% %D \def\doprocessgroup%
+% %D {\def\doprocessgroup{#3\egroup}%
+% %D \bgroup
+% %D \aftergroup\doprocessgroup
+% %D #2}%
+% %D \afterassignment\doprocessgroup
+% %D \let\next=}
+% %D
+% %D \def\setgroupedtype%
+% %D {\initializetype
+% %D \catcode`\{=\@@begingroup
+% %D \catcode`\}=\@@endgroup}
+% %D
+% %D \unexpanded\def\tex{\doprocessgroup\setgroupedtype\texescape\relax}
+% %D \unexpanded\def\arg{\doprocessgroup\setgroupedtype\leftargument\rightargument}
+% %D \unexpanded\def\mat{\doprocessgroup\setgroupedtype\$\$}
+% %D \unexpanded\def\dis{\doprocessgroup\setgroupedtype{\$\$}{\$\$}}
+% %D \stoptypen
+% %D
+%D
+%D But since \type{\groupedcommand} became available, we use
+%D however
+
+\def\setgroupedtype%
+ {\initializetype
+ \catcode`\{=\@@begingroup
+ \catcode`\}=\@@endgroup}
+
+\unexpanded\def\tex{\groupedcommand{\setgroupedtype\texescape}{\relax}}
+\unexpanded\def\arg{\groupedcommand{\setgroupedtype\leftargument}{\rightargument}}
+\unexpanded\def\mat{\groupedcommand{\setgroupedtype\$}{\$}}
+\unexpanded\def\dis{\groupedcommand{\setgroupedtype\$\$}{\$\$}}
+
+%D \macros
+%D {starttyping}
+%D {}
+%D
+%D Display verbatim is realized far more easy, which is mostly
+%D due to the fact that we use \type{\stop...} as delimiter.
+%D The implementation inherits some features, for instance the
+%D support of linenumbering, which can best be studied in the
+%D documented support module.
+
+\def\initializetyping#1%
+ {\donefalse
+ \skip0=\getvalue{\??tp#1\c!onevenmarge}\relax
+ \ifdim\skip0=\!!zeropoint\relax\else\donetrue\fi
+ \skip0=\getvalue{\??tp#1\c!evenmarge}\relax
+ \ifdim\skip0=\!!zeropoint\relax\else\donetrue\fi
+ \ifdone
+ \def\doopenupverbatimline%
+ {\getpagestatus
+ \ifrightpage
+ \hskip \getvalue{\??tp#1\c!onevenmarge}\relax
+ \else
+ \hskip \getvalue{\??tp#1\c!evenmarge}\relax
+ \fi}%
+ \else
+ \doadaptleftskip{\getvalue{\??tp#1\c!marge}}%
+ \fi
+ \processaction
+ [\getvalue{\??tp#1\c!blanko}]
+ [\v!standaard=>\skip0=\tussenwit,
+ \v!klein=>\skip0=\blankokleinmaat,
+ \v!middel=>\skip0=\blankomiddelmaat,
+ \v!groot=>\skip0=\blankogrootmaat,
+ \v!regel=>\skip0=\baselineskip,
+ \v!geen=>\skip0=\!!zeropoint,
+ \s!unknown=>\skip0=\getvalue{\??tp#1\c!blanko}]%
+ \edef\verbatimbaselineskip{\the\skip0}%
+ \setupcommonverbatim{\??tp#1}}
+
+%D The basic display verbatim commands are defined in an
+%D indirect way. As we will see, they are a specific case of a
+%D more general mechanism.
+
+\def\dostarttyping#1%
+ {\getvalue{\??tp#1\c!voor}%
+ \startopelkaar % includes \bgroup
+ \initializetyping{#1}%
+ \expandafter\processdisplayverbatim\expandafter{\s!stop#1}}
+
+\def\dostoptyping#1%
+ {\stopopelkaar % includes \egroup
+ \getvalue{\??tp#1\c!na}%
+ \doifvalue{\??tp#1\c!springvolgendein}{\v!nee}{\noindentation}}
+
+%D \macros
+%D {definetyping}
+%D {}
+%D
+%D For most users the standard \type{\start}||\type{\stop}||pair
+%D will suffice, but for documentation purposes the next
+%D definition command can be of use:
+%D
+%D \starttypen
+%D \definetyping[extratyping][margin=3em]
+%D
+%D \startextratyping
+%D these extra ones are indented by 1 em
+%D \stopextratyping
+%D \stoptypen
+%D
+%D The definitions default to the standard typing values.
+
+\def\presettyping[#1][#2]%
+ {\copyparameters
+ [\??tp#1][\??tp]
+ [\c!voor,\c!na,\c!spatie,\c!pagina,\c!tab,
+ \c!optie,\c!palet,\c!marge,\c!evenmarge,\c!onevenmarge,
+ \c!springvolgendein,\c!blanko,\c!escape]%
+ \getparameters
+ [\??tp#1]
+ [#2]}
+
+\def\dodefinetyping[#1][#2]%
+ {\setvalue{\e!start#1}{\dostarttyping{#1}}%
+ \setvalue{\e!stop#1}{\dostoptyping{#1}}%
+ \presettyping[#1][#2]}
+
+\def\definetyping%
+ {\dodoubleempty\dodefinetyping}
+
+\definetyping[\v!typen]
+
+\definetyping[MP] [\c!optie=MP]
+\definetyping[PL] [\c!optie=PL]
+\definetyping[JV] [\c!optie=JV]
+\definetyping[TEX][\c!optie=TEX]
+
+%D \macros
+%D {setuptyping}
+%D {}
+%D
+%D The setup of typing accepts two arguments. The optional
+%D first one identifies the user defined ones. If only one
+%D argument is given, the values apply to both the standard
+%D command \type{\starttyping} and \type{\typefile}.
+
+%\indirect\def\setuptyping\dodoubleempty[#1][#2]%
+% {\iffirstargument
+% \getparameters[\??tp#1][#2]%
+% \else
+% \getparameters[\??tp][#1]%
+% \fi}
+%
+%\doubleemptied\def\setuptyping[#1][#2]%
+% {\iffirstargument
+% \getparameters[\??tp#1][#2]%
+% \else
+% \getparameters[\??tp][#1]%
+% \fi}
+
+\def\dosetuptyping[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??tp#1][#2]%
+ \else
+ \getparameters[\??tp][#1]%
+ \fi}
+
+\def\setuptyping%
+ {\dodoubleempty\dosetuptyping}
+
+%D We use the \CONTEXT\ color system for switching to and from
+%D color mode. We can always redefine these colors afterwards.
+
+\definecolor [colorprettyone] [r=.9, g=.0, b=.0] % red
+\definecolor [colorprettytwo] [r=.0, g=.8, b=.0] % green
+\definecolor [colorprettythree] [r=.0, g=.0, b=.9] % blue
+\definecolor [colorprettyfour] [r=.8, g=.8, b=.6] % yellow
+
+\definecolor [grayprettyone] [s=.30]
+\definecolor [grayprettytwo] [s=.45]
+\definecolor [grayprettythree] [s=.60]
+\definecolor [grayprettyfour] [s=.75]
+
+\definepalet
+ [colorpretty]
+ [ prettyone=colorprettyone,
+ prettytwo=colorprettytwo,
+ prettythree=colorprettythree,
+ prettyfour=colorprettyfour]
+
+\definepalet
+ [graypretty]
+ [ prettyone=grayprettyone,
+ prettytwo=grayprettytwo,
+ prettythree=grayprettythree,
+ prettyfour=grayprettyfour]
+
+% ---> naar verb-* ? of predefine als undefined?
+
+\definepalet [TEXcolorpretty] [colorpretty]
+\definepalet [TEXgraypretty] [graypretty]
+\definepalet [PLcolorpretty] [colorpretty]
+\definepalet [PLgraypretty] [graypretty]
+\definepalet [MPcolorpretty] [colorpretty]
+\definepalet [MPgraypretty] [graypretty]
+\definepalet [JVcolorpretty] [colorpretty]
+\definepalet [JVgraypretty] [graypretty]
+
+%D We can use some core color commands. These are faster than
+%D the standard color switching ones and work ok on a line by
+%D line basis.
+
+% Some real in-depth knowlegde of palets: `palet:color' it is!
+
+\def\beginofpretty[#1]{\startcolormode{\prettypalet:#1}}
+\def\endofpretty {\stopcolormode}
+
+%D \macros
+%D {EveryPar, EveryLine, iflinepar}
+%D {}
+%D
+%D One of the features of these commands is the support of
+%D \type{\EveryPar}, \type{\EveryLine} and \type{\iflinepar}.
+%D In the documentation of the verbatim support module we give
+%D some examples of line- and paragraph numerbering using these
+%D macros.
+
+%D \macros
+%D {typefile}
+%D {}
+%D
+%D Typesetting files verbatim (for the moment) only supports
+%D colorization of \TEX\ sources as valid option. The other
+%D setup values are inherited from display verbatim.
+%D The implementation of \type{\typefile} is straightforward:
+
+\presettyping[\v!file][]
+
+\def\typefile#1%
+ {\getvalue{\??tp\v!file\c!voor}%
+ \startopelkaar % includes \bgroup
+ \doifinset{\getvalue{\??tp\v!file\c!optie}}{\v!commandos,\v!schuin,\v!normaal}
+ {\setuptyping[\v!file][\c!optie=\v!geen]}%
+ \doifvalue{\??tp\v!file\c!optie}{\v!kleur}
+ {\expandafter\aftersplitstring#1\at.\to\prettyidentifier
+ \letvalue{\??tp\v!file\c!optie}=\prettyidentifier}%
+ \initializetyping\v!file
+ \processfileverbatim{#1}%
+ \stopopelkaar % includes \egroup
+ \getvalue{\??tp\v!file\c!na}}
+
+%D The setups for inline verbatim default to:
+
+\setuptype
+ [\c!spatie=\v!uit,
+ \c!pagina=\v!nee,
+ \c!tab=\v!nee,
+ \c!optie=\v!normaal]
+
+%D The setups for display verbatim and file verbatim are
+%D shared. One can adapt the extra defined typing environments,
+%D but they also default to the values below. Watch the
+%D alternative escape character.
+
+\setuptyping
+ [ \c!voor=\blanko,
+ \c!na=\blanko,
+ \c!spatie=\v!uit,
+ \c!pagina=\v!nee,
+ \c!tab=\v!aan,
+ \c!optie=\v!geen,
+ \c!palet=colorpretty,
+ \c!springvolgendein=\v!ja,
+ \c!marge=\!!zeropoint,
+ \c!evenmarge=\!!zeropoint,
+ \c!onevenmarge=\!!zeropoint,
+ \c!blanko=\v!regel,
+ \c!escape=/]
+
+\permitshiftedendofverbatim
+
+\optimizeverbatimtrue
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/core-vis.tex b/tex/context/base/core-vis.tex index a9af0e2b9..37b5a768e 100644 --- a/tex/context/base/core-vis.tex +++ b/tex/context/base/core-vis.tex @@ -1,545 +1,545 @@ -%D \module -%D [ file=core-vis, -%D version=1996.06.01, -%D title=\CONTEXT\ Core Macros, -%D subtitle=Visualization, -%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. - -%D This module adds some more visualization cues to the ones -%D supplied in the support module. -%D -%D %\everypar dual character, \the\everypar and \everypar= -%D %\hrule cannot be grabbed in advance, switches mode -%D %\vrule cannot be grabbed in advance, switches mode -%D % -%D %\indent only explicit ones -%D %\noindent only explicit ones -%D %\par only explicit ones -%D -%D %\leftskip only if explicit one -%D %\rightskip only if explicit one - -\writestatus{loading}{Context Support Macros / Visualization} - -\unprotect - -%D \macros -%D {indent, noindent, -%D leavevmode, -%D par} -%D {} -%D -%D \TeX\ acts upon paragraphs. In mosts documents paragraphs -%D are separated by empty lines, which internally are handled as -%D \type{\par}. Paragraphs can be indented or not, depending on -%D the setting of \type{\parindent}, the first token of a -%D paragraph and/or user suppressed or forced indentation. -%D -%D Because the actual typesetting is based on both explicit -%D user and implicit system actions, visualization is only -%D possible for the user supplied \type{\indent}, -%D \type{\noindent}, \type{\leavevmode} and \type{\par}. Other -%D 'clever' tricks will quite certainly lead to more failures -%D than successes, so we only support these three explicit -%D primitives and one macro: - -\let\normalnoindent = \noindent -\let\normalindent = \indent -\let\normalpar = \par - -\let\normalleavevmode = \leavevmode - -\def\showparagraphcue#1#2#3#4#5% - {\bgroup - \scratchdimen#1\relax - \dontinterfere - \dontcomplain - \boxrulewidth=5\testrulewidth - #3#4\relax - \setbox0=\normalhbox to \scratchdimen - {#2{\ruledhbox to \scratchdimen - {\vrule - #5 20\testrulewidth - \!!width \!!zeropoint - \normalhss}}}% - \smashbox0 - \normalpenalty\!!tenthousand - \box0 - \egroup} - -\def\ruledhanging% - {\ifdim\hangindent>\!!zeropoint\relax - \ifnum\hangafter<0 - \normalhbox - {\boxrulewidth=5\testrulewidth - \setbox0=\ruledhbox to \hangindent - {\scratchdimen=\ht\strutbox - \advance\scratchdimen by \dp\strutbox - \vrule - \!!width\!!zeropoint - \!!height\!!zeropoint - \!!depth-\hangafter\scratchdimen}% - \normalhskip-\hangindent - \smashbox0 - \raise\ht\strutbox\box0}% - \fi - \fi} - -\def\ruledparagraphcues% - {\bgroup - \dontcomplain - \normalhbox to \!!zeropoint - {\ifdim\leftskip>\!!zeropoint\relax - \showparagraphcue\leftskip\llap\relax\relax\!!depth - \normalhskip-\leftskip - \fi - \ruledhanging - \normalhskip\hsize - \ifdim\rightskip>\!!zeropoint\relax - \normalhskip-\rightskip - \showparagraphcue\rightskip\relax\relax\relax\!!depth - \fi}% - \egroup} - -\def\ruledpar% - {\relax - \ifhmode - \showparagraphcue{40\testrulewidth}\relax\rightrulefalse\relax\!!height - \fi - \normalpar} - -\def\rulednoindent% - {\relax - \normalnoindent - \ruledparagraphcues - \showparagraphcue{40\testrulewidth}\llap\leftrulefalse\relax\!!height} - -\def\ruledindent% - {\relax - \normalnoindent - \ruledparagraphcues - \ifdim\parindent>\!!zeropoint\relax - \showparagraphcue\parindent\relax\relax\relax\!!height - \else - \showparagraphcue{40\testrulewidth}\llap\relax\relax\!!height - \fi - \normalhskip\parindent} - -\def\ruledleavevmode% - {\relax - \normalleavevmode - \ifdim\parindent>\!!zeropoint\relax - \normalhskip-\parindent - \ruledparagraphcues - \showparagraphcue\parindent\relax\leftrulefalse\rightrulefalse\!!height - \normalhskip\parindent - \else - \ruledparagraphcues - \showparagraphcue{40\testrulewidth}\llap\leftrulefalse\rightrulefalse\!!height - \fi} - -\def\dontshowimplicits% - {\let\noindent = \normalnoindent - \let\indent = \normalindent - \let\leavevmode = \normalleavevmode - \let\par = \normalpar} - -\def\showimplicits% - {\testrulewidth = \defaulttestrulewidth - \let\noindent = \rulednoindent - \let\indent = \ruledindent - \let\leavevmode = \ruledleavevmode - \let\par = \ruledpar} - -%D The next few||line examples show the four cues. Keep in -%D mind that we only see them when we explicitly open or close -%D a paragraph. -%D -%D \bgroup -%D \def\voorbeeld#1% -%D {#1Visualizing some \TeX\ primitives and Plain \TeX\ -%D macros can be very instructive, at least it is to me. -%D Here we see {\tt\string#1} and {\tt\string\ruledpar} in -%D action, while {\tt\string\parindent} equals -%D {\tt\the\parindent}.\ruledpar} -%D -%D \showimplicits -%D -%D \voorbeeld \indent -%D \voorbeeld \noindent -%D \voorbeeld \leavevmode -%D -%D \parindent=60pt -%D -%D \voorbeeld \indent -%D \voorbeeld \noindent -%D \voorbeeld \leavevmode -%D -%D \startsmaller -%D \voorbeeld \indent -%D \voorbeeld \noindent -%D \voorbeeld \leavevmode -%D \stopsmaller -%D \egroup -%D -%D These examples also demonstrate the visualization of -%D \type{\leftskip} and \type{\rightskip}. - -\newcounter\ruledbaselines - -\def\debuggertext#1% - {\ifx\ttxx\undefined - $\scriptscriptstyle#1$% - \else - {\ttxx#1}% - \fi} - -\def\ruledbaseline% - {\vrule \!!width \!!zeropoint - \bgroup - \dontinterfere - \doglobal\increment\ruledbaselines - \scratchdimen=3\baselineskip - \setbox\scratchbox=\normalvbox to 2\scratchdimen - {\leaders - \normalhbox - {\strut - \vrule - \!!height \testrulewidth - \!!depth \testrulewidth - \!!width 120pt} - \normalvfill}% - \smashbox\scratchbox - \advance\scratchdimen by \strutheightfactor\baselineskip - \setbox\scratchbox=\normalhbox - {\normalhskip -48pt - \normalhbox to 24pt - {\normalhss\debuggertext\ruledbaselines\normalhskip6pt}% - \raise\scratchdimen\box\scratchbox}% - \smashbox\scratchbox - \box\scratchbox - \egroup} - -\def\showbaselines% - {\testrulewidth=\defaulttestrulewidth - \EveryPar{\ruledbaseline}} - -%D \macros -%D {makecutbox, cuthbox, cutvbox, cutvtop} -%D -%D Although mainly used for marking the page, these macros can -%D also serve local use. -%D -%D \startbuffer -%D \setbox0=\vbox{a real \crlf vertical box} \makecutbox0 -%D \stopbuffer -%D -%D \typebuffer -%D -%D This marked \type{\vbox} shows up as: -%D -%D \startregelcorrectie -%D \haalbuffer -%D \stopregelcorrectie -%D -%D The alternative macros are used as: -%D -%D \startbuffer -%D \cuthbox{a made cut box} -%D \stopbuffer -%D -%D \typebuffer -%D -%D This is typeset as: -%D -%D \startregelcorrectie -%D \haalbuffer -%D \stopregelcorrectie -%D -%D By setting the next macros one can influence the length of -%D the marks as well as the horizontal and vertical divisions. - -\def\cutmarklength {2\bodyfontsize} -\chardef\horizontalcutmarks = 2 -\chardef\verticalcutmarks = 2 -\chardef\cutmarkoffset = 1 -\let\cutmarksymbol = \relax - -\def\horizontalcuts% - {\normalhbox to \ruledwidth - {\dorecurse{\horizontalcutmarks} - {\vrule\!!width\boxrulewidth\!!height\cutmarklength\normalhfill}% - \unskip}} - -\def\verticalcuts% - {\scratchdimen=\ruledheight - \advance\scratchdimen by \ruleddepth - \normalvbox to \scratchdimen - {\hsize\cutmarklength - \dorecurse{\verticalcutmarks} - {\vrule\!!height\boxrulewidth\!!width\hsize\normalvfill}% - \unskip}} - -\def\baselinecuts% - {\ifdim\ruleddepth>\!!zeropoint - \scratchdimen=\ruledheight - \advance\scratchdimen by \ruleddepth - \normalvbox to \scratchdimen - {\scratchdimen=\cutmarklength - \divide\scratchdimen by 2 - \hsize\scratchdimen - \normalvskip\!!zeropoint\!!plus\ruledheight - \vrule\!!height\boxrulewidth\!!width\hsize - \normalvskip\!!zeropoint\!!plus\ruleddepth}% - \fi} - -\def\cutmarksymbols% - {\setbox\scratchbox=\normalvbox to \cutmarklength - {\normalvfill - \normalhbox to \cutmarklength - {\normalhfill\ssxx\cutmarksymbol\normalhfill}% - \normalvfill}% - \normalhbox to \ruledwidth - {\scratchdimen=\cutmarklength - \divide\scratchdimen by 2 - \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}% - \normalhfill - \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}}} - -\def\makecutbox#1% - {\edef\ruledheight{\the\ht#1}% - \edef\ruleddepth {\the\dp#1}% - \edef\ruledwidth {\the\wd#1}% - \setbox#1=\normalhbox - {\dontcomplain - \forgetall - \boxmaxdepth\maxdimen - \offinterlineskip - \scratchdimen=\cutmarklength - \divide\scratchdimen by 2 - \hsize\ruledwidth - \setbox\scratchbox=\normalvbox - {\setbox\scratchbox=\normalhbox{\horizontalcuts}% - \normalvskip-\cutmarkoffset\scratchdimen - \normalvskip-2\scratchdimen - \copy\scratchbox - \normalvskip\cutmarkoffset\scratchdimen - \hbox to \ruledwidth - {\setbox\scratchbox=\normalhbox{\verticalcuts}% - \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}% - \bgroup - \setbox\scratchbox=\normalhbox{\baselinecuts}% - \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}% - \normalhfill - \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}% - \egroup - \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}}% - \normalvskip\cutmarkoffset\scratchdimen - \copy\scratchbox}% - \ht\scratchbox=\ruledheight - \dp\scratchbox=\ruleddepth - \wd\scratchbox=\!!zeropoint - \box\scratchbox - \ifx\cutmarksymbol\relax \else - \setbox\scratchbox=\normalvbox - {\setbox\scratchbox=\normalhbox{\cutmarksymbols}% - \vskip-\cutmarkoffset\scratchdimen - \vskip-\cutmarklength - \copy\scratchbox - \vskip\cutmarkoffset\scratchdimen - \vskip\ruledheight - \vskip\ruleddepth - \vskip\cutmarkoffset\scratchdimen - \copy\scratchbox}% - \ht\scratchbox=\ruledheight - \dp\scratchbox=\ruleddepth - \wd\scratchbox=\!!zeropoint - \box\scratchbox - \fi - \box#1}% - \wd#1=\ruledwidth - \ht#1=\ruledheight - \dp#1=\ruleddepth} - -\def\cuthbox% - {\normalhbox\bgroup - \dowithnextbox{\makecutbox\nextbox\box\nextbox\egroup}% - \normalhbox} - -\def\cutvbox% - {\normalvbox\bgroup - \dowithnextbox{\makecutbox\nextbox\box\nextbox\egroup}% - \normalvbox} - -\def\cutvtop% - {\normalvtop\bgroup - \dowithnextbox{\makecutbox\nextbox\box\nextbox\egroup}% - \normalvtop} - -%D \macros -%D {colormarkbox} -%D -%D This macro is used in the pagebody routine. No other use -%D is advocated here. -%D -%D \starttypen -%D \colormarkbox0 -%D \stoptypen - -\def\colormarkoffset{\cutmarkoffset} -\def\colormarklength{\cutmarklength} - -\def\colorrangeA#1#2#3#4% - {\vbox - {\scratchdimen=-\colormarklength - \multiply\scratchdimen by 4 - \advance\scratchdimen by \ruledheight - \advance\scratchdimen by \ruleddepth - \divide\scratchdimen by 21 - \def\docommando##1% - {\vbox - {\hsize\scratchdimen - \definecolor - [\s!dummy] - [\c!c=#2##1\else0\fi, - \c!m=#3##1\else0\fi, - \c!y=#4##1\else0\fi, - \c!k=0]% - \localstartcolor[\s!dummy]% - \hrule - \!!width 3em - \!!height \scratchdimen - \!!depth \!!zeropoint - \localstopcolor - \ifdim\scratchdimen>1ex - \vskip-\scratchdimen - \vbox to \scratchdimen - {\vss - \hbox to \hsize - {\hss\ifdim##1pt=0pt#1\else##1\fi\hss}% - \vss}% - \fi}}% - \offinterlineskip - \processcommalist[1.00,0.95,0.75,0.50,0.25,0.05,0.00]\docommando}} - -\def\colorrangeB% - {\hbox - {\scratchdimen=-\colormarklength - \multiply\scratchdimen by 2 - \advance\scratchdimen by \ruledwidth - \divide\scratchdimen by 11 - \def\docommando ##1 ##2 ##3##4##5##6% - {\definecolor - [\s!dummy] - [\c!c=##3##2\else0\fi, - \c!m=##4##2\else0\fi, - \c!y=##5##2\else0\fi, - \c!k=##6##2\else0\fi]% - \localstartcolor[\s!dummy]% - \vrule - \!!width \scratchdimen - \!!height \colormarklength - \!!depth \!!zeropoint - \localstopcolor - \ifdim\scratchdimen>2em - \hskip-\scratchdimen - \vbox to \colormarklength - {\vss - \hbox to \scratchdimen - {\hss\ifdim##2pt=.5pt##2~\fi##1\hss} - \vss}% - \fi}% - \docommando C .5 \iftrue \iffalse\iffalse\iffalse - \docommando M .5 \iffalse\iftrue \iffalse\iffalse - \docommando Y .5 \iffalse\iffalse\iftrue \iffalse - \docommando K .5 \iffalse\iffalse\iffalse\iftrue - \docommando C 1 \iftrue \iffalse\iffalse\iffalse - \docommando G 1 \iftrue \iffalse\iftrue \iffalse - \docommando Y 1 \iffalse\iffalse\iftrue \iffalse - \docommando R 1 \iffalse\iftrue \iftrue \iffalse - \docommando M 1 \iffalse\iftrue \iffalse\iffalse - \docommando B 1 \iftrue \iftrue \iffalse\iffalse - \docommando K 1 \iffalse\iffalse\iffalse\iftrue}} - -\def\colorrangeC% - {\hbox - {\scratchdimen=-\colormarklength - \multiply\scratchdimen by 2 - \advance\scratchdimen by \ruledwidth - \divide\scratchdimen by 14 - \def\docommando##1% - {\definecolor[\s!dummy][\c!s=##1]% - \localstartcolor[\s!dummy]% - \vrule - \!!width \scratchdimen - \!!height \colormarklength - \!!depth \!!zeropoint - \localstopcolor - \ifdim\scratchdimen>2em - \hskip-\scratchdimen - \vbox to \colormarklength - {\vss\hbox to \scratchdimen{\hss##1\hss}\vss}% - \fi}% - \processcommalist - [1.00,0.95,0.90,0.85,0.80,0.75, - 0.70,0.60,0.50,0.40,0.30,0.20,0.10,0.00]\docommando}} - -\def\docolormarkbox#1% - {\edef\ruledheight{\the\ht#1}% - \edef\ruleddepth {\the\dp#1}% - \edef\ruledwidth {\the\wd#1}% - \setbox#1=\hbox - {\scratchdimen=\colormarklength - \divide\scratchdimen by 2 - \forgetall - \ssxx - \setbox\scratchbox=\vbox - {\offinterlineskip - \vskip-\colormarkoffset\scratchdimen - \vskip-2\scratchdimen - \hbox to \ruledwidth - {\hss\hbox{\colorrangeB}\hss}% - \vskip\colormarkoffset\scratchdimen - \vbox to \ruledheight - {\vss - \hbox to \ruledwidth - {\llap{\colorrangeA C\iftrue\iffalse\iffalse\hskip\colormarkoffset\scratchdimen}% - \hfill - \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA R\iffalse\iftrue\iftrue}}% - \vss - \hbox to \ruledwidth - {\llap{\colorrangeA M\iffalse\iftrue\iffalse\hskip\colormarkoffset\scratchdimen}% - \hfill - \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA G\iftrue\iffalse\iftrue}}% - \vss - \hbox to \ruledwidth - {\llap{\colorrangeA Y\iffalse\iffalse\iftrue\hskip\colormarkoffset\scratchdimen}% - \hfill - \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA B\iftrue\iftrue\iffalse}}% - \vss} - \vskip\colormarkoffset\scratchdimen - \hbox to \ruledwidth - {\hss\lower\ruleddepth\hbox{\colorrangeC}\hss}}% - \ht\scratchbox=\ruledheight - \dp\scratchbox=\ruleddepth - \wd\scratchbox=\!!zeropoint - \box\scratchbox - \box#1}% - \wd#1=\ruledwidth - \ht#1=\ruledheight - \dp#1=\ruleddepth} - -\def\colormarkbox#1% - {\ifincolor - \docolormarkbox{#1}% - \fi} - -\protect - -\endinput +%D \module
+%D [ file=core-vis,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Visualization,
+%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.
+
+%D This module adds some more visualization cues to the ones
+%D supplied in the support module.
+%D
+%D %\everypar dual character, \the\everypar and \everypar=
+%D %\hrule cannot be grabbed in advance, switches mode
+%D %\vrule cannot be grabbed in advance, switches mode
+%D %
+%D %\indent only explicit ones
+%D %\noindent only explicit ones
+%D %\par only explicit ones
+%D
+%D %\leftskip only if explicit one
+%D %\rightskip only if explicit one
+
+\writestatus{loading}{Context Support Macros / Visualization}
+
+\unprotect
+
+%D \macros
+%D {indent, noindent,
+%D leavevmode,
+%D par}
+%D {}
+%D
+%D \TeX\ acts upon paragraphs. In mosts documents paragraphs
+%D are separated by empty lines, which internally are handled as
+%D \type{\par}. Paragraphs can be indented or not, depending on
+%D the setting of \type{\parindent}, the first token of a
+%D paragraph and/or user suppressed or forced indentation.
+%D
+%D Because the actual typesetting is based on both explicit
+%D user and implicit system actions, visualization is only
+%D possible for the user supplied \type{\indent},
+%D \type{\noindent}, \type{\leavevmode} and \type{\par}. Other
+%D 'clever' tricks will quite certainly lead to more failures
+%D than successes, so we only support these three explicit
+%D primitives and one macro:
+
+\let\normalnoindent = \noindent
+\let\normalindent = \indent
+\let\normalpar = \par
+
+\let\normalleavevmode = \leavevmode
+
+\def\showparagraphcue#1#2#3#4#5%
+ {\bgroup
+ \scratchdimen#1\relax
+ \dontinterfere
+ \dontcomplain
+ \boxrulewidth=5\testrulewidth
+ #3#4\relax
+ \setbox0=\normalhbox to \scratchdimen
+ {#2{\ruledhbox to \scratchdimen
+ {\vrule
+ #5 20\testrulewidth
+ \!!width \!!zeropoint
+ \normalhss}}}%
+ \smashbox0
+ \normalpenalty\!!tenthousand
+ \box0
+ \egroup}
+
+\def\ruledhanging%
+ {\ifdim\hangindent>\!!zeropoint\relax
+ \ifnum\hangafter<0
+ \normalhbox
+ {\boxrulewidth=5\testrulewidth
+ \setbox0=\ruledhbox to \hangindent
+ {\scratchdimen=\ht\strutbox
+ \advance\scratchdimen by \dp\strutbox
+ \vrule
+ \!!width\!!zeropoint
+ \!!height\!!zeropoint
+ \!!depth-\hangafter\scratchdimen}%
+ \normalhskip-\hangindent
+ \smashbox0
+ \raise\ht\strutbox\box0}%
+ \fi
+ \fi}
+
+\def\ruledparagraphcues%
+ {\bgroup
+ \dontcomplain
+ \normalhbox to \!!zeropoint
+ {\ifdim\leftskip>\!!zeropoint\relax
+ \showparagraphcue\leftskip\llap\relax\relax\!!depth
+ \normalhskip-\leftskip
+ \fi
+ \ruledhanging
+ \normalhskip\hsize
+ \ifdim\rightskip>\!!zeropoint\relax
+ \normalhskip-\rightskip
+ \showparagraphcue\rightskip\relax\relax\relax\!!depth
+ \fi}%
+ \egroup}
+
+\def\ruledpar%
+ {\relax
+ \ifhmode
+ \showparagraphcue{40\testrulewidth}\relax\rightrulefalse\relax\!!height
+ \fi
+ \normalpar}
+
+\def\rulednoindent%
+ {\relax
+ \normalnoindent
+ \ruledparagraphcues
+ \showparagraphcue{40\testrulewidth}\llap\leftrulefalse\relax\!!height}
+
+\def\ruledindent%
+ {\relax
+ \normalnoindent
+ \ruledparagraphcues
+ \ifdim\parindent>\!!zeropoint\relax
+ \showparagraphcue\parindent\relax\relax\relax\!!height
+ \else
+ \showparagraphcue{40\testrulewidth}\llap\relax\relax\!!height
+ \fi
+ \normalhskip\parindent}
+
+\def\ruledleavevmode%
+ {\relax
+ \normalleavevmode
+ \ifdim\parindent>\!!zeropoint\relax
+ \normalhskip-\parindent
+ \ruledparagraphcues
+ \showparagraphcue\parindent\relax\leftrulefalse\rightrulefalse\!!height
+ \normalhskip\parindent
+ \else
+ \ruledparagraphcues
+ \showparagraphcue{40\testrulewidth}\llap\leftrulefalse\rightrulefalse\!!height
+ \fi}
+
+\def\dontshowimplicits%
+ {\let\noindent = \normalnoindent
+ \let\indent = \normalindent
+ \let\leavevmode = \normalleavevmode
+ \let\par = \normalpar}
+
+\def\showimplicits%
+ {\testrulewidth = \defaulttestrulewidth
+ \let\noindent = \rulednoindent
+ \let\indent = \ruledindent
+ \let\leavevmode = \ruledleavevmode
+ \let\par = \ruledpar}
+
+%D The next few||line examples show the four cues. Keep in
+%D mind that we only see them when we explicitly open or close
+%D a paragraph.
+%D
+%D \bgroup
+%D \def\voorbeeld#1%
+%D {#1Visualizing some \TeX\ primitives and Plain \TeX\
+%D macros can be very instructive, at least it is to me.
+%D Here we see {\tt\string#1} and {\tt\string\ruledpar} in
+%D action, while {\tt\string\parindent} equals
+%D {\tt\the\parindent}.\ruledpar}
+%D
+%D \showimplicits
+%D
+%D \voorbeeld \indent
+%D \voorbeeld \noindent
+%D \voorbeeld \leavevmode
+%D
+%D \parindent=60pt
+%D
+%D \voorbeeld \indent
+%D \voorbeeld \noindent
+%D \voorbeeld \leavevmode
+%D
+%D \startsmaller
+%D \voorbeeld \indent
+%D \voorbeeld \noindent
+%D \voorbeeld \leavevmode
+%D \stopsmaller
+%D \egroup
+%D
+%D These examples also demonstrate the visualization of
+%D \type{\leftskip} and \type{\rightskip}.
+
+\newcounter\ruledbaselines
+
+\def\debuggertext#1%
+ {\ifx\ttxx\undefined
+ $\scriptscriptstyle#1$%
+ \else
+ {\ttxx#1}%
+ \fi}
+
+\def\ruledbaseline%
+ {\vrule \!!width \!!zeropoint
+ \bgroup
+ \dontinterfere
+ \doglobal\increment\ruledbaselines
+ \scratchdimen=3\baselineskip
+ \setbox\scratchbox=\normalvbox to 2\scratchdimen
+ {\leaders
+ \normalhbox
+ {\strut
+ \vrule
+ \!!height \testrulewidth
+ \!!depth \testrulewidth
+ \!!width 120pt}
+ \normalvfill}%
+ \smashbox\scratchbox
+ \advance\scratchdimen by \strutheightfactor\baselineskip
+ \setbox\scratchbox=\normalhbox
+ {\normalhskip -48pt
+ \normalhbox to 24pt
+ {\normalhss\debuggertext\ruledbaselines\normalhskip6pt}%
+ \raise\scratchdimen\box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \egroup}
+
+\def\showbaselines%
+ {\testrulewidth=\defaulttestrulewidth
+ \EveryPar{\ruledbaseline}}
+
+%D \macros
+%D {makecutbox, cuthbox, cutvbox, cutvtop}
+%D
+%D Although mainly used for marking the page, these macros can
+%D also serve local use.
+%D
+%D \startbuffer
+%D \setbox0=\vbox{a real \crlf vertical box} \makecutbox0
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This marked \type{\vbox} shows up as:
+%D
+%D \startregelcorrectie
+%D \haalbuffer
+%D \stopregelcorrectie
+%D
+%D The alternative macros are used as:
+%D
+%D \startbuffer
+%D \cuthbox{a made cut box}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This is typeset as:
+%D
+%D \startregelcorrectie
+%D \haalbuffer
+%D \stopregelcorrectie
+%D
+%D By setting the next macros one can influence the length of
+%D the marks as well as the horizontal and vertical divisions.
+
+\def\cutmarklength {2\bodyfontsize}
+\chardef\horizontalcutmarks = 2
+\chardef\verticalcutmarks = 2
+\chardef\cutmarkoffset = 1
+\let\cutmarksymbol = \relax
+
+\def\horizontalcuts%
+ {\normalhbox to \ruledwidth
+ {\dorecurse{\horizontalcutmarks}
+ {\vrule\!!width\boxrulewidth\!!height\cutmarklength\normalhfill}%
+ \unskip}}
+
+\def\verticalcuts%
+ {\scratchdimen=\ruledheight
+ \advance\scratchdimen by \ruleddepth
+ \normalvbox to \scratchdimen
+ {\hsize\cutmarklength
+ \dorecurse{\verticalcutmarks}
+ {\vrule\!!height\boxrulewidth\!!width\hsize\normalvfill}%
+ \unskip}}
+
+\def\baselinecuts%
+ {\ifdim\ruleddepth>\!!zeropoint
+ \scratchdimen=\ruledheight
+ \advance\scratchdimen by \ruleddepth
+ \normalvbox to \scratchdimen
+ {\scratchdimen=\cutmarklength
+ \divide\scratchdimen by 2
+ \hsize\scratchdimen
+ \normalvskip\!!zeropoint\!!plus\ruledheight
+ \vrule\!!height\boxrulewidth\!!width\hsize
+ \normalvskip\!!zeropoint\!!plus\ruleddepth}%
+ \fi}
+
+\def\cutmarksymbols%
+ {\setbox\scratchbox=\normalvbox to \cutmarklength
+ {\normalvfill
+ \normalhbox to \cutmarklength
+ {\normalhfill\ssxx\cutmarksymbol\normalhfill}%
+ \normalvfill}%
+ \normalhbox to \ruledwidth
+ {\scratchdimen=\cutmarklength
+ \divide\scratchdimen by 2
+ \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
+ \normalhfill
+ \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}}}
+
+\def\makecutbox#1%
+ {\edef\ruledheight{\the\ht#1}%
+ \edef\ruleddepth {\the\dp#1}%
+ \edef\ruledwidth {\the\wd#1}%
+ \setbox#1=\normalhbox
+ {\dontcomplain
+ \forgetall
+ \boxmaxdepth\maxdimen
+ \offinterlineskip
+ \scratchdimen=\cutmarklength
+ \divide\scratchdimen by 2
+ \hsize\ruledwidth
+ \setbox\scratchbox=\normalvbox
+ {\setbox\scratchbox=\normalhbox{\horizontalcuts}%
+ \normalvskip-\cutmarkoffset\scratchdimen
+ \normalvskip-2\scratchdimen
+ \copy\scratchbox
+ \normalvskip\cutmarkoffset\scratchdimen
+ \hbox to \ruledwidth
+ {\setbox\scratchbox=\normalhbox{\verticalcuts}%
+ \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
+ \bgroup
+ \setbox\scratchbox=\normalhbox{\baselinecuts}%
+ \llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
+ \normalhfill
+ \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}%
+ \egroup
+ \rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}}%
+ \normalvskip\cutmarkoffset\scratchdimen
+ \copy\scratchbox}%
+ \ht\scratchbox=\ruledheight
+ \dp\scratchbox=\ruleddepth
+ \wd\scratchbox=\!!zeropoint
+ \box\scratchbox
+ \ifx\cutmarksymbol\relax \else
+ \setbox\scratchbox=\normalvbox
+ {\setbox\scratchbox=\normalhbox{\cutmarksymbols}%
+ \vskip-\cutmarkoffset\scratchdimen
+ \vskip-\cutmarklength
+ \copy\scratchbox
+ \vskip\cutmarkoffset\scratchdimen
+ \vskip\ruledheight
+ \vskip\ruleddepth
+ \vskip\cutmarkoffset\scratchdimen
+ \copy\scratchbox}%
+ \ht\scratchbox=\ruledheight
+ \dp\scratchbox=\ruleddepth
+ \wd\scratchbox=\!!zeropoint
+ \box\scratchbox
+ \fi
+ \box#1}%
+ \wd#1=\ruledwidth
+ \ht#1=\ruledheight
+ \dp#1=\ruleddepth}
+
+\def\cuthbox%
+ {\normalhbox\bgroup
+ \dowithnextbox{\makecutbox\nextbox\box\nextbox\egroup}%
+ \normalhbox}
+
+\def\cutvbox%
+ {\normalvbox\bgroup
+ \dowithnextbox{\makecutbox\nextbox\box\nextbox\egroup}%
+ \normalvbox}
+
+\def\cutvtop%
+ {\normalvtop\bgroup
+ \dowithnextbox{\makecutbox\nextbox\box\nextbox\egroup}%
+ \normalvtop}
+
+%D \macros
+%D {colormarkbox}
+%D
+%D This macro is used in the pagebody routine. No other use
+%D is advocated here.
+%D
+%D \starttypen
+%D \colormarkbox0
+%D \stoptypen
+
+\def\colormarkoffset{\cutmarkoffset}
+\def\colormarklength{\cutmarklength}
+
+\def\colorrangeA#1#2#3#4%
+ {\vbox
+ {\scratchdimen=-\colormarklength
+ \multiply\scratchdimen by 4
+ \advance\scratchdimen by \ruledheight
+ \advance\scratchdimen by \ruleddepth
+ \divide\scratchdimen by 21
+ \def\docommando##1%
+ {\vbox
+ {\hsize\scratchdimen
+ \definecolor
+ [\s!dummy]
+ [\c!c=#2##1\else0\fi,
+ \c!m=#3##1\else0\fi,
+ \c!y=#4##1\else0\fi,
+ \c!k=0]%
+ \localstartcolor[\s!dummy]%
+ \hrule
+ \!!width 3em
+ \!!height \scratchdimen
+ \!!depth \!!zeropoint
+ \localstopcolor
+ \ifdim\scratchdimen>1ex
+ \vskip-\scratchdimen
+ \vbox to \scratchdimen
+ {\vss
+ \hbox to \hsize
+ {\hss\ifdim##1pt=0pt#1\else##1\fi\hss}%
+ \vss}%
+ \fi}}%
+ \offinterlineskip
+ \processcommalist[1.00,0.95,0.75,0.50,0.25,0.05,0.00]\docommando}}
+
+\def\colorrangeB%
+ {\hbox
+ {\scratchdimen=-\colormarklength
+ \multiply\scratchdimen by 2
+ \advance\scratchdimen by \ruledwidth
+ \divide\scratchdimen by 11
+ \def\docommando ##1 ##2 ##3##4##5##6%
+ {\definecolor
+ [\s!dummy]
+ [\c!c=##3##2\else0\fi,
+ \c!m=##4##2\else0\fi,
+ \c!y=##5##2\else0\fi,
+ \c!k=##6##2\else0\fi]%
+ \localstartcolor[\s!dummy]%
+ \vrule
+ \!!width \scratchdimen
+ \!!height \colormarklength
+ \!!depth \!!zeropoint
+ \localstopcolor
+ \ifdim\scratchdimen>2em
+ \hskip-\scratchdimen
+ \vbox to \colormarklength
+ {\vss
+ \hbox to \scratchdimen
+ {\hss\ifdim##2pt=.5pt##2~\fi##1\hss}
+ \vss}%
+ \fi}%
+ \docommando C .5 \iftrue \iffalse\iffalse\iffalse
+ \docommando M .5 \iffalse\iftrue \iffalse\iffalse
+ \docommando Y .5 \iffalse\iffalse\iftrue \iffalse
+ \docommando K .5 \iffalse\iffalse\iffalse\iftrue
+ \docommando C 1 \iftrue \iffalse\iffalse\iffalse
+ \docommando G 1 \iftrue \iffalse\iftrue \iffalse
+ \docommando Y 1 \iffalse\iffalse\iftrue \iffalse
+ \docommando R 1 \iffalse\iftrue \iftrue \iffalse
+ \docommando M 1 \iffalse\iftrue \iffalse\iffalse
+ \docommando B 1 \iftrue \iftrue \iffalse\iffalse
+ \docommando K 1 \iffalse\iffalse\iffalse\iftrue}}
+
+\def\colorrangeC%
+ {\hbox
+ {\scratchdimen=-\colormarklength
+ \multiply\scratchdimen by 2
+ \advance\scratchdimen by \ruledwidth
+ \divide\scratchdimen by 14
+ \def\docommando##1%
+ {\definecolor[\s!dummy][\c!s=##1]%
+ \localstartcolor[\s!dummy]%
+ \vrule
+ \!!width \scratchdimen
+ \!!height \colormarklength
+ \!!depth \!!zeropoint
+ \localstopcolor
+ \ifdim\scratchdimen>2em
+ \hskip-\scratchdimen
+ \vbox to \colormarklength
+ {\vss\hbox to \scratchdimen{\hss##1\hss}\vss}%
+ \fi}%
+ \processcommalist
+ [1.00,0.95,0.90,0.85,0.80,0.75,
+ 0.70,0.60,0.50,0.40,0.30,0.20,0.10,0.00]\docommando}}
+
+\def\docolormarkbox#1%
+ {\edef\ruledheight{\the\ht#1}%
+ \edef\ruleddepth {\the\dp#1}%
+ \edef\ruledwidth {\the\wd#1}%
+ \setbox#1=\hbox
+ {\scratchdimen=\colormarklength
+ \divide\scratchdimen by 2
+ \forgetall
+ \ssxx
+ \setbox\scratchbox=\vbox
+ {\offinterlineskip
+ \vskip-\colormarkoffset\scratchdimen
+ \vskip-2\scratchdimen
+ \hbox to \ruledwidth
+ {\hss\hbox{\colorrangeB}\hss}%
+ \vskip\colormarkoffset\scratchdimen
+ \vbox to \ruledheight
+ {\vss
+ \hbox to \ruledwidth
+ {\llap{\colorrangeA C\iftrue\iffalse\iffalse\hskip\colormarkoffset\scratchdimen}%
+ \hfill
+ \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA R\iffalse\iftrue\iftrue}}%
+ \vss
+ \hbox to \ruledwidth
+ {\llap{\colorrangeA M\iffalse\iftrue\iffalse\hskip\colormarkoffset\scratchdimen}%
+ \hfill
+ \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA G\iftrue\iffalse\iftrue}}%
+ \vss
+ \hbox to \ruledwidth
+ {\llap{\colorrangeA Y\iffalse\iffalse\iftrue\hskip\colormarkoffset\scratchdimen}%
+ \hfill
+ \rlap{\hskip\colormarkoffset\scratchdimen\colorrangeA B\iftrue\iftrue\iffalse}}%
+ \vss}
+ \vskip\colormarkoffset\scratchdimen
+ \hbox to \ruledwidth
+ {\hss\lower\ruleddepth\hbox{\colorrangeC}\hss}}%
+ \ht\scratchbox=\ruledheight
+ \dp\scratchbox=\ruleddepth
+ \wd\scratchbox=\!!zeropoint
+ \box\scratchbox
+ \box#1}%
+ \wd#1=\ruledwidth
+ \ht#1=\ruledheight
+ \dp#1=\ruleddepth}
+
+\def\colormarkbox#1%
+ {\ifincolor
+ \docolormarkbox{#1}%
+ \fi}
+
+\protect
+
+\endinput
diff --git a/tex/context/base/docs-ini.tex b/tex/context/base/docs-ini.tex index 7209db8f9..b78dfca0f 100644 --- a/tex/context/base/docs-ini.tex +++ b/tex/context/base/docs-ini.tex @@ -1,40 +1,41 @@ -%D \module -%D [ file=docs-ini, -%D versie=1995.10.10, -%D naam=\CONTEXT\ Document Macros (ini), -%D auteur=J. Hagen, -%D datum=\currentdate, -%D copyright=J. Hagen] - -\writestatus{loading}{Context Document Macros (ini)} - -\unprotect - -%I n=Documenten -%I c=\startdocument -%I -%I Ten behoeve van veel voorkomende soorten documenten -%I zijn speciale commando's beschikbaar. Bij dergelijke -%I documenten worden in plaats van de gebruikelijke -%I commando's \starttekst..\stoptekst de onderstaande -%I commando's gebruikt: -%I -%I \startdocument[soort document] -%I \stopdocument -%I -%I Documenten worden gedefinieerd in files met de naam -%I docs-xxx, waarbij xxx de eerste drie letters van het -%I soort overzicht zijn. -%I -%I Vooralsnog zijn alleen 'brief', 'sheet', 'sticker' en -%I 'lijst' beschikbaar. - -\definieerfilegroep - [document] - [file=docs, - voor=\starttekst, - na=\stoptekst] - -\protect - -\endinput +%D \module
+%D [ file=docs-ini,
+%D versie=1995.10.10,
+%D naam=\CONTEXT\ Document Macros (ini),
+%D auteur=J. Hagen,
+%D datum=\currentdate,
+%D copyright=J. Hagen]
+
+\writestatus{loading}{Context Document Macros (ini)}
+
+\unprotect
+
+%I n=Documenten
+%I c=\startdocument
+%I
+%I Ten behoeve van veel voorkomende soorten documenten
+%I zijn speciale commando's beschikbaar. Bij dergelijke
+%I documenten worden in plaats van de gebruikelijke
+%I commando's \starttekst..\stoptekst de onderstaande
+%I commando's gebruikt:
+%I
+%I \startdocument[soort document]
+%I \stopdocument
+%I
+%I Documenten worden gedefinieerd in files met de naam
+%I docs-xxx, waarbij xxx de eerste drie letters van het
+%I soort overzicht zijn.
+%I
+%I Vooralsnog zijn alleen 'brief', 'sheet', 'sticker' en
+%I 'lijst' beschikbaar.
+
+\definieerfilegroep
+ [document]
+ [file=docs,
+ voor=\starttekst,
+ na=\stoptekst]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-ams.tex b/tex/context/base/font-ams.tex index 41c98d183..11e104120 100644 --- a/tex/context/base/font-ams.tex +++ b/tex/context/base/font-ams.tex @@ -1,496 +1,497 @@ -%D \module -%D [ file=font-ams, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=AMS Math Symbols, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] - -%D Here we implement the symbol fonts as provided by the -%D American Mathematical Society. The names of these symbols -%D can be found in The Joy of \TeX\ by M.~Spivak. -%D -%D First we extend the already defined font sets a bit. We make -%D use of the \type{sa} option. - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt] [mm] - [ma=msam10 sa 1, - mb=msbm10 sa 1] - -\definebodyfont [8pt,7pt] [mm] - [ma=msam7 sa 1, - mb=msbm7 sa 1] - -\definebodyfont [6pt,5pt,4pt] [mm] - [ma=msam5 sa 1, - mb=msbm5 sa 1] - -%D We already have defined some additional math families. This -%D means that do not have to do this again. It would exhaust our -%D limited pool of \type{\fam}'s anyway. - -\unprotect - -\let\msafam@=\hexmafam -\let\msbfam@=\hexmbfam - -\protect - -%D The following piece of \TEX\ is part of the distribution -%D of the \AMS\ fonts. The macros are slightly adapted to the -%D \CONTEXT\ way of font handling, which means that we have -%D commented out some sections. The comments are original. - -%D \starttypen -%D %% @texfile{ -%D %% filename="amssym.def", -%D %% version="2.1", -%D %% date="5-APR-1991", -%D %% filetype="TeX: option", -%D %% copyright="Copyright (C) American Mathematical Society, -%D %% all rights reserved. Copying of this file is -%D %% authorized only if either: -%D %% (1) you make absolutely no changes to your copy -%D %% including name; OR -%D %% (2) if you do make changes, you first rename it to some -%D %% other name.", -%D %% author="American Mathematical Society", -%D %% address="American Mathematical Society, -%D %% Technical Support Department, -%D %% P. O. Box 6248, -%D %% Providence, RI 02940, -%D %% USA", -%D %% telephone="401-455-4080 or (in the USA) 800-321-4AMS", -%D %% email="Internet: Tech-Support@Math.AMS.org", -%D %% codetable="ISO/ASCII", -%D %% checksumtype="line count", -%D %% checksum="108", -%D %% keywords="amsfonts, tex", -%D %% abstract="This file contains definitions that perform the same -%D %% functions as similar ones in AMS-TeX, so that the file -%D %% AMSSYM.TEX can be used outside of AMS-TeX. Instructions -%D %% for using this file and the AMS symbol fonts are -%D %% included in the AMSFonts 2.0 User's Guide." -%D %% } -%D \stoptypen - -\expandafter\ifx\csname amssym.def\endcsname\relax \else\endinput\fi - -%D Store the catcode of the @ in the csname so that it can be -%D restored later. - -\expandafter\edef\csname amssym.def\endcsname% - {\catcode`\noexpand\@=\the\catcode`\@\normalspace} - -%D Set the catcode to 11 for use in private control sequence -%D names. - -\catcode`\@=11 - -%D Include all definitions related to the fonts msam, msbm and -%D eufm, so that when this file is used by itself, the results -%D with respect to those fonts are equivalent to what they -%D would have been using \AMSTEX. Most symbols in fonts msam -%D and msbm are defined using \type{\newsymbol}; however, a few -%D symbols that replace composites defined in plain must be -%D defined with \type{\mathchardef}. - -\def\undefine#1% - {\let#1\undefined} - -\def\newsymbol#1#2#3#4#5% - {\let\next@\relax - \ifnum#2=\@ne - \let\next@\msafam@ - \else - \ifnum#2=\tw@ - \let\next@\msbfam@ - \fi - \fi - \mathchardef#1="#3\next@#4#5} - -\def\mathhexbox@#1#2#3% - {\relax - \ifmmode - \mathpalette{}{\m@th\mathchar"#1#2#3}% - \else - \leavevmode - \hbox{$\m@th\mathchar"#1#2#3$}% - \fi} - -%D \starttypen -%D \def\hexnumber@#1% -%D {\ifcase#1 -%D 0\or 1\or 2\or 3\or -%D 4\or 5\or 6\or 7\or -%D 8\or 9\or A\or B\or -%D C\or D\or E\or F\fi} -%D -%D \font\tenmsa=msam10 -%D \font\sevenmsa=msam7 -%D \font\fivemsa=msam5 -%D \newfam\msafam -%D \textfont\msafam=\tenmsa -%D \scriptfont\msafam=\sevenmsa -%D \scriptscriptfont\msafam=\fivemsa -%D -%D \edef\msafam@% -%D {\hexnumber@\msafam} -%D \stoptypen - -\mathchardef\dabar@"0\msafam@39 - -\def\dashrightarrow {\mathrel{\dabar@\dabar@\mathchar"0\msafam@4B}} -\def\dashleftarrow {\mathrel{\mathchar"0\msafam@4C\dabar@\dabar@}} -\let\dasharrow \dashrightarrow -\def\ulcorner {\delimiter"4\msafam@70\msafam@70 } -\def\urcorner {\delimiter"5\msafam@71\msafam@71 } -\def\llcorner {\delimiter"4\msafam@78\msafam@78 } -\def\lrcorner {\delimiter"5\msafam@79\msafam@79 } -\def\yen {{\mathhexbox@\msafam@55 }} -\def\checkmark {{\mathhexbox@\msafam@58 }} -\def\circledR {{\mathhexbox@\msafam@72 }} -\def\maltese {{\mathhexbox@\msafam@7A }} - -%D \starttypen -%D \font\tenmsb=msbm10 -%D \font\sevenmsb=msbm7 -%D \font\fivemsb=msbm5 -%D \newfam\msbfam -%D \textfont\msbfam=\tenmsb -%D \scriptfont\msbfam=\sevenmsb -%D \scriptscriptfont\msbfam=\fivemsb -%D -%D \edef\msbfam@% -%D {\hexnumber@\msbfam} -%D \stoptypen - -\def\Bbb#1% - {{\fam\msbfam\relax#1}} - -\def\widehat#1% - {\setbox\z@\hbox{$\m@th#1$}% - \ifdim\wd\z@>\tw@ em% - \mathaccent"0\msbfam@5B{#1}% - \else - \mathaccent"0362{#1}% - \fi} - -\def\widetilde#1% - {\setbox\z@\hbox{$\m@th#1$}% - \ifdim\wd\z@>\tw@ em% - \mathaccent"0\msbfam@5D{#1}% - \else - \mathaccent"0365{#1}% - \fi} - -%D \starttypen -%D \font\teneufm=eufm10 -%D \font\seveneufm=eufm7 -%D \font\fiveeufm=eufm5 -%D \newfam\eufmfam -%D \textfont\eufmfam=\teneufm -%D \scriptfont\eufmfam=\seveneufm -%D \scriptscriptfont\eufmfam=\fiveeufm -%D \def\frak#1{{\fam\eufmfam\relax#1}} -%D \let\goth\frak -%D \stoptypen - -%D Restore the catcode value for @ that was previously saved. - -\csname amssym.def\endcsname - -%D \starttypen -%D %% @texfile{ -%D %% filename="amssym.tex", -%D %% version="2.1a", -%D %% date="31-OCT-1991", -%D %% filetype="TeX: option", -%D %% copyright="Copyright (C) American Mathematical Society, -%D %% all rights reserved. Copying of this file is -%D %% authorized only if either: -%D %% (1) you make absolutely no changes to your copy -%D %% including name; OR -%D %% (2) if you do make changes, you first rename it to some -%D %% other name.", -%D %% author="American Mathematical Society", -%D %% address="American Mathematical Society, -%D %% Technical Support Department, -%D %% P. O. Box 6248, -%D %% Providence, RI 02940, -%D %% USA", -%D %% telephone="401-455-4080 or (in the USA) 800-321-4AMS", -%D %% email="Internet: Tech-Support@Math.AMS.org", -%D %% codetable="ISO/ASCII", -%D %% checksumtype="line count", -%D %% checksum="279", -%D %% keywords="amstex, ams-tex, tex, amsfonts, math symbols", -%D %% abstract="This file defines names for all the math symbols in -%D %% the math symbol fonts of the AMSFonts package (MSAM and -%D %% MSBM). If this file is not used by way of the AMS-TeX -%D %% \UseAMSsymbols command, it must be used in conjunction -%D %% with AMSSYM.DEF, which provides a definition of the -%D %% \newsymbol and \undefine commands. -%D %% Instructions for using the AMS symbol fonts are -%D %% included in: AMS-TeX 2.1 User's Guide; AMSFonts 2.1 -%D %% User's Guide; The Joy of TeX, editions dated 1990 or -%D %% later." -%D %% } -%D \stoptypen - -%D Save the current value of the @-sign catcode so that it can -%D be restored afterwards. This allows us to call amssym.tex -%D either within an \AMSTEX\ document style file or by itself, -%D in addition to providing a means of testing whether the file -%D has been previously loaded. We want to avoid inputting this -%D file twice because when \AMSTEX\ is being used -%D \type{\newsymbol} will give an error message if used to -%D define a control sequence name that is already defined. - -%D If the csname is not equal to \type{\relax}, we assume this -%D file has already been loaded and \type{\endinput} -%D immediately. - -\expandafter\ifx\csname pre amssym.tex at\endcsname\relax \else \endinput\fi - -%D Otherwise we store the catcode of the @ in the csname. - -\expandafter\chardef\csname pre amssym.tex at\endcsname=\the\catcode`\@ - -%D Set the catcode to 11 for use in private control sequence -%D names. - -\catcode`\@=11 - -%D Most symbols in fonts msam and msbm are defined using -%D \type{\newsymbol}. A few that are delimiters or otherwise -%D require special treatment have already been defined as soon -%D as the fonts were loaded. Finally, a few symbols that -%D replace composites defined in plain must be undefined first. - -\newsymbol\boxdot 1200 -\newsymbol\boxplus 1201 -\newsymbol\boxtimes 1202 -\newsymbol\square 1003 -\newsymbol\blacksquare 1004 -\newsymbol\centerdot 1205 -\newsymbol\lozenge 1006 -\newsymbol\blacklozenge 1007 -\newsymbol\circlearrowright 1308 -\newsymbol\circlearrowleft 1309 -\undefine\rightleftharpoons -\newsymbol\rightleftharpoons 130A -\newsymbol\leftrightharpoons 130B -\newsymbol\boxminus 120C -\newsymbol\Vdash 130D -\newsymbol\Vvdash 130E -\newsymbol\vDash 130F -\newsymbol\twoheadrightarrow 1310 -\newsymbol\twoheadleftarrow 1311 -\newsymbol\leftleftarrows 1312 -\newsymbol\rightrightarrows 1313 -\newsymbol\upuparrows 1314 -\newsymbol\downdownarrows 1315 -\newsymbol\upharpoonright 1316 - \let\restriction\upharpoonright -\newsymbol\downharpoonright 1317 -\newsymbol\upharpoonleft 1318 -\newsymbol\downharpoonleft 1319 -\newsymbol\rightarrowtail 131A -\newsymbol\leftarrowtail 131B -\newsymbol\leftrightarrows 131C -\newsymbol\rightleftarrows 131D -\newsymbol\Lsh 131E -\newsymbol\Rsh 131F -\newsymbol\rightsquigarrow 1320 -\newsymbol\leftrightsquigarrow 1321 -\newsymbol\looparrowleft 1322 -\newsymbol\looparrowright 1323 -\newsymbol\circeq 1324 -\newsymbol\succsim 1325 -\newsymbol\gtrsim 1326 -\newsymbol\gtrapprox 1327 -\newsymbol\multimap 1328 -\newsymbol\therefore 1329 -\newsymbol\because 132A -\newsymbol\doteqdot 132B - \let\Doteq\doteqdot -\newsymbol\triangleq 132C -\newsymbol\precsim 132D -\newsymbol\lesssim 132E -\newsymbol\lessapprox 132F -\newsymbol\eqslantless 1330 -\newsymbol\eqslantgtr 1331 -\newsymbol\curlyeqprec 1332 -\newsymbol\curlyeqsucc 1333 -\newsymbol\preccurlyeq 1334 -\newsymbol\leqq 1335 -\newsymbol\leqslant 1336 -\newsymbol\lessgtr 1337 -\newsymbol\backprime 1038 -\newsymbol\risingdotseq 133A -\newsymbol\fallingdotseq 133B -\newsymbol\succcurlyeq 133C -\newsymbol\geqq 133D -\newsymbol\geqslant 133E -\newsymbol\gtrless 133F -\newsymbol\sqsubset 1340 -\newsymbol\sqsupset 1341 -\newsymbol\vartriangleright 1342 -\newsymbol\vartriangleleft 1343 -\newsymbol\trianglerighteq 1344 -\newsymbol\trianglelefteq 1345 -\newsymbol\bigstar 1046 -\newsymbol\between 1347 -\newsymbol\blacktriangledown 1048 -\newsymbol\blacktriangleright 1349 -\newsymbol\blacktriangleleft 134A -\newsymbol\vartriangle 134D -\newsymbol\blacktriangle 104E -\newsymbol\triangledown 104F -\newsymbol\eqcirc 1350 -\newsymbol\lesseqgtr 1351 -\newsymbol\gtreqless 1352 -\newsymbol\lesseqqgtr 1353 -\newsymbol\gtreqqless 1354 -\newsymbol\Rrightarrow 1356 -\newsymbol\Lleftarrow 1357 -\newsymbol\veebar 1259 -\newsymbol\barwedge 125A -\newsymbol\doublebarwedge 125B -\undefine\angle -\newsymbol\angle 105C -\newsymbol\measuredangle 105D -\newsymbol\sphericalangle 105E -\newsymbol\varpropto 135F -\newsymbol\smallsmile 1360 -\newsymbol\smallfrown 1361 -\newsymbol\Subset 1362 -\newsymbol\Supset 1363 -\newsymbol\Cup 1264 - \let\doublecup\Cup -\newsymbol\Cap 1265 - \let\doublecap\Cap -\newsymbol\curlywedge 1266 -\newsymbol\curlyvee 1267 -\newsymbol\leftthreetimes 1268 -\newsymbol\rightthreetimes 1269 -\newsymbol\subseteqq 136A -\newsymbol\supseteqq 136B -\newsymbol\bumpeq 136C -\newsymbol\Bumpeq 136D -\newsymbol\lll 136E - \let\llless\lll -\newsymbol\ggg 136F - \let\gggtr\ggg -\newsymbol\circledS 1073 -\newsymbol\pitchfork 1374 -\newsymbol\dotplus 1275 -\newsymbol\backsim 1376 -\newsymbol\backsimeq 1377 -\newsymbol\complement 107B -\newsymbol\intercal 127C -\newsymbol\circledcirc 127D -\newsymbol\circledast 127E -\newsymbol\circleddash 127F -\newsymbol\lvertneqq 2300 -\newsymbol\gvertneqq 2301 -\newsymbol\nleq 2302 -\newsymbol\ngeq 2303 -\newsymbol\nless 2304 -\newsymbol\ngtr 2305 -\newsymbol\nprec 2306 -\newsymbol\nsucc 2307 -\newsymbol\lneqq 2308 -\newsymbol\gneqq 2309 -\newsymbol\nleqslant 230A -\newsymbol\ngeqslant 230B -\newsymbol\lneq 230C -\newsymbol\gneq 230D -\newsymbol\npreceq 230E -\newsymbol\nsucceq 230F -\newsymbol\precnsim 2310 -\newsymbol\succnsim 2311 -\newsymbol\lnsim 2312 -\newsymbol\gnsim 2313 -\newsymbol\nleqq 2314 -\newsymbol\ngeqq 2315 -\newsymbol\precneqq 2316 -\newsymbol\succneqq 2317 -\newsymbol\precnapprox 2318 -\newsymbol\succnapprox 2319 -\newsymbol\lnapprox 231A -\newsymbol\gnapprox 231B -\newsymbol\nsim 231C -\newsymbol\ncong 231D -\newsymbol\diagup 231E -\newsymbol\diagdown 231F -\newsymbol\varsubsetneq 2320 -\newsymbol\varsupsetneq 2321 -\newsymbol\nsubseteqq 2322 -\newsymbol\nsupseteqq 2323 -\newsymbol\subsetneqq 2324 -\newsymbol\supsetneqq 2325 -\newsymbol\varsubsetneqq 2326 -\newsymbol\varsupsetneqq 2327 -\newsymbol\subsetneq 2328 -\newsymbol\supsetneq 2329 -\newsymbol\nsubseteq 232A -\newsymbol\nsupseteq 232B -\newsymbol\nparallel 232C -\newsymbol\nmid 232D -\newsymbol\nshortmid 232E -\newsymbol\nshortparallel 232F -\newsymbol\nvdash 2330 -\newsymbol\nVdash 2331 -\newsymbol\nvDash 2332 -\newsymbol\nVDash 2333 -\newsymbol\ntrianglerighteq 2334 -\newsymbol\ntrianglelefteq 2335 -\newsymbol\ntriangleleft 2336 -\newsymbol\ntriangleright 2337 -\newsymbol\nleftarrow 2338 -\newsymbol\nrightarrow 2339 -\newsymbol\nLeftarrow 233A -\newsymbol\nRightarrow 233B -\newsymbol\nLeftrightarrow 233C -\newsymbol\nleftrightarrow 233D -\newsymbol\divideontimes 223E -\newsymbol\varnothing 203F -\newsymbol\nexists 2040 -\newsymbol\Finv 2060 -\newsymbol\Game 2061 -\newsymbol\mho 2066 -\newsymbol\eth 2067 -\newsymbol\eqsim 2368 -\newsymbol\beth 2069 -\newsymbol\gimel 206A -\newsymbol\daleth 206B -\newsymbol\lessdot 236C -\newsymbol\gtrdot 236D -\newsymbol\ltimes 226E -\newsymbol\rtimes 226F -\newsymbol\shortmid 2370 -\newsymbol\shortparallel 2371 -\newsymbol\smallsetminus 2272 -\newsymbol\thicksim 2373 -\newsymbol\thickapprox 2374 -\newsymbol\approxeq 2375 -\newsymbol\succapprox 2376 -\newsymbol\precapprox 2377 -\newsymbol\curvearrowleft 2378 -\newsymbol\curvearrowright 2379 -\newsymbol\digamma 207A -\newsymbol\varkappa 207B -\newsymbol\Bbbk 207C -\newsymbol\hslash 207D -\undefine\hbar -\newsymbol\hbar 207E -\newsymbol\backepsilon 237F - -%D Restore the catcode value for @ that was previously saved. - -\catcode`\@=\csname pre amssym.tex at\endcsname - -\endinput +%D \module
+%D [ file=font-ams,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=AMS Math Symbols,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+%D Here we implement the symbol fonts as provided by the
+%D American Mathematical Society. The names of these symbols
+%D can be found in The Joy of \TeX\ by M.~Spivak.
+%D
+%D First we extend the already defined font sets a bit. We make
+%D use of the \type{sa} option.
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt] [mm]
+ [ma=msam10 sa 1,
+ mb=msbm10 sa 1]
+
+\definebodyfont [8pt,7pt] [mm]
+ [ma=msam7 sa 1,
+ mb=msbm7 sa 1]
+
+\definebodyfont [6pt,5pt,4pt] [mm]
+ [ma=msam5 sa 1,
+ mb=msbm5 sa 1]
+
+%D We already have defined some additional math families. This
+%D means that do not have to do this again. It would exhaust our
+%D limited pool of \type{\fam}'s anyway.
+
+\unprotect
+
+\let\msafam@=\hexmafam
+\let\msbfam@=\hexmbfam
+
+\protect
+
+%D The following piece of \TEX\ is part of the distribution
+%D of the \AMS\ fonts. The macros are slightly adapted to the
+%D \CONTEXT\ way of font handling, which means that we have
+%D commented out some sections. The comments are original.
+
+%D \starttypen
+%D %% @texfile{
+%D %% filename="amssym.def",
+%D %% version="2.1",
+%D %% date="5-APR-1991",
+%D %% filetype="TeX: option",
+%D %% copyright="Copyright (C) American Mathematical Society,
+%D %% all rights reserved. Copying of this file is
+%D %% authorized only if either:
+%D %% (1) you make absolutely no changes to your copy
+%D %% including name; OR
+%D %% (2) if you do make changes, you first rename it to some
+%D %% other name.",
+%D %% author="American Mathematical Society",
+%D %% address="American Mathematical Society,
+%D %% Technical Support Department,
+%D %% P. O. Box 6248,
+%D %% Providence, RI 02940,
+%D %% USA",
+%D %% telephone="401-455-4080 or (in the USA) 800-321-4AMS",
+%D %% email="Internet: Tech-Support@Math.AMS.org",
+%D %% codetable="ISO/ASCII",
+%D %% checksumtype="line count",
+%D %% checksum="108",
+%D %% keywords="amsfonts, tex",
+%D %% abstract="This file contains definitions that perform the same
+%D %% functions as similar ones in AMS-TeX, so that the file
+%D %% AMSSYM.TEX can be used outside of AMS-TeX. Instructions
+%D %% for using this file and the AMS symbol fonts are
+%D %% included in the AMSFonts 2.0 User's Guide."
+%D %% }
+%D \stoptypen
+
+\expandafter\ifx\csname amssym.def\endcsname\relax \else\endinput\fi
+
+%D Store the catcode of the @ in the csname so that it can be
+%D restored later.
+
+\expandafter\edef\csname amssym.def\endcsname%
+ {\catcode`\noexpand\@=\the\catcode`\@\normalspace}
+
+%D Set the catcode to 11 for use in private control sequence
+%D names.
+
+\catcode`\@=11
+
+%D Include all definitions related to the fonts msam, msbm and
+%D eufm, so that when this file is used by itself, the results
+%D with respect to those fonts are equivalent to what they
+%D would have been using \AMSTEX. Most symbols in fonts msam
+%D and msbm are defined using \type{\newsymbol}; however, a few
+%D symbols that replace composites defined in plain must be
+%D defined with \type{\mathchardef}.
+
+\def\undefine#1%
+ {\let#1\undefined}
+
+\def\newsymbol#1#2#3#4#5%
+ {\let\next@\relax
+ \ifnum#2=\@ne
+ \let\next@\msafam@
+ \else
+ \ifnum#2=\tw@
+ \let\next@\msbfam@
+ \fi
+ \fi
+ \mathchardef#1="#3\next@#4#5}
+
+\def\mathhexbox@#1#2#3%
+ {\relax
+ \ifmmode
+ \mathpalette{}{\m@th\mathchar"#1#2#3}%
+ \else
+ \leavevmode
+ \hbox{$\m@th\mathchar"#1#2#3$}%
+ \fi}
+
+%D \starttypen
+%D \def\hexnumber@#1%
+%D {\ifcase#1
+%D 0\or 1\or 2\or 3\or
+%D 4\or 5\or 6\or 7\or
+%D 8\or 9\or A\or B\or
+%D C\or D\or E\or F\fi}
+%D
+%D \font\tenmsa=msam10
+%D \font\sevenmsa=msam7
+%D \font\fivemsa=msam5
+%D \newfam\msafam
+%D \textfont\msafam=\tenmsa
+%D \scriptfont\msafam=\sevenmsa
+%D \scriptscriptfont\msafam=\fivemsa
+%D
+%D \edef\msafam@%
+%D {\hexnumber@\msafam}
+%D \stoptypen
+
+\mathchardef\dabar@"0\msafam@39
+
+\def\dashrightarrow {\mathrel{\dabar@\dabar@\mathchar"0\msafam@4B}}
+\def\dashleftarrow {\mathrel{\mathchar"0\msafam@4C\dabar@\dabar@}}
+\let\dasharrow \dashrightarrow
+\def\ulcorner {\delimiter"4\msafam@70\msafam@70 }
+\def\urcorner {\delimiter"5\msafam@71\msafam@71 }
+\def\llcorner {\delimiter"4\msafam@78\msafam@78 }
+\def\lrcorner {\delimiter"5\msafam@79\msafam@79 }
+\def\yen {{\mathhexbox@\msafam@55 }}
+\def\checkmark {{\mathhexbox@\msafam@58 }}
+\def\circledR {{\mathhexbox@\msafam@72 }}
+\def\maltese {{\mathhexbox@\msafam@7A }}
+
+%D \starttypen
+%D \font\tenmsb=msbm10
+%D \font\sevenmsb=msbm7
+%D \font\fivemsb=msbm5
+%D \newfam\msbfam
+%D \textfont\msbfam=\tenmsb
+%D \scriptfont\msbfam=\sevenmsb
+%D \scriptscriptfont\msbfam=\fivemsb
+%D
+%D \edef\msbfam@%
+%D {\hexnumber@\msbfam}
+%D \stoptypen
+
+\def\Bbb#1%
+ {{\fam\msbfam\relax#1}}
+
+\def\widehat#1%
+ {\setbox\z@\hbox{$\m@th#1$}%
+ \ifdim\wd\z@>\tw@ em%
+ \mathaccent"0\msbfam@5B{#1}%
+ \else
+ \mathaccent"0362{#1}%
+ \fi}
+
+\def\widetilde#1%
+ {\setbox\z@\hbox{$\m@th#1$}%
+ \ifdim\wd\z@>\tw@ em%
+ \mathaccent"0\msbfam@5D{#1}%
+ \else
+ \mathaccent"0365{#1}%
+ \fi}
+
+%D \starttypen
+%D \font\teneufm=eufm10
+%D \font\seveneufm=eufm7
+%D \font\fiveeufm=eufm5
+%D \newfam\eufmfam
+%D \textfont\eufmfam=\teneufm
+%D \scriptfont\eufmfam=\seveneufm
+%D \scriptscriptfont\eufmfam=\fiveeufm
+%D \def\frak#1{{\fam\eufmfam\relax#1}}
+%D \let\goth\frak
+%D \stoptypen
+
+%D Restore the catcode value for @ that was previously saved.
+
+\csname amssym.def\endcsname
+
+%D \starttypen
+%D %% @texfile{
+%D %% filename="amssym.tex",
+%D %% version="2.1a",
+%D %% date="31-OCT-1991",
+%D %% filetype="TeX: option",
+%D %% copyright="Copyright (C) American Mathematical Society,
+%D %% all rights reserved. Copying of this file is
+%D %% authorized only if either:
+%D %% (1) you make absolutely no changes to your copy
+%D %% including name; OR
+%D %% (2) if you do make changes, you first rename it to some
+%D %% other name.",
+%D %% author="American Mathematical Society",
+%D %% address="American Mathematical Society,
+%D %% Technical Support Department,
+%D %% P. O. Box 6248,
+%D %% Providence, RI 02940,
+%D %% USA",
+%D %% telephone="401-455-4080 or (in the USA) 800-321-4AMS",
+%D %% email="Internet: Tech-Support@Math.AMS.org",
+%D %% codetable="ISO/ASCII",
+%D %% checksumtype="line count",
+%D %% checksum="279",
+%D %% keywords="amstex, ams-tex, tex, amsfonts, math symbols",
+%D %% abstract="This file defines names for all the math symbols in
+%D %% the math symbol fonts of the AMSFonts package (MSAM and
+%D %% MSBM). If this file is not used by way of the AMS-TeX
+%D %% \UseAMSsymbols command, it must be used in conjunction
+%D %% with AMSSYM.DEF, which provides a definition of the
+%D %% \newsymbol and \undefine commands.
+%D %% Instructions for using the AMS symbol fonts are
+%D %% included in: AMS-TeX 2.1 User's Guide; AMSFonts 2.1
+%D %% User's Guide; The Joy of TeX, editions dated 1990 or
+%D %% later."
+%D %% }
+%D \stoptypen
+
+%D Save the current value of the @-sign catcode so that it can
+%D be restored afterwards. This allows us to call amssym.tex
+%D either within an \AMSTEX\ document style file or by itself,
+%D in addition to providing a means of testing whether the file
+%D has been previously loaded. We want to avoid inputting this
+%D file twice because when \AMSTEX\ is being used
+%D \type{\newsymbol} will give an error message if used to
+%D define a control sequence name that is already defined.
+
+%D If the csname is not equal to \type{\relax}, we assume this
+%D file has already been loaded and \type{\endinput}
+%D immediately.
+
+\expandafter\ifx\csname pre amssym.tex at\endcsname\relax \else \endinput\fi
+
+%D Otherwise we store the catcode of the @ in the csname.
+
+\expandafter\chardef\csname pre amssym.tex at\endcsname=\the\catcode`\@
+
+%D Set the catcode to 11 for use in private control sequence
+%D names.
+
+\catcode`\@=11
+
+%D Most symbols in fonts msam and msbm are defined using
+%D \type{\newsymbol}. A few that are delimiters or otherwise
+%D require special treatment have already been defined as soon
+%D as the fonts were loaded. Finally, a few symbols that
+%D replace composites defined in plain must be undefined first.
+
+\newsymbol\boxdot 1200
+\newsymbol\boxplus 1201
+\newsymbol\boxtimes 1202
+\newsymbol\square 1003
+\newsymbol\blacksquare 1004
+\newsymbol\centerdot 1205
+\newsymbol\lozenge 1006
+\newsymbol\blacklozenge 1007
+\newsymbol\circlearrowright 1308
+\newsymbol\circlearrowleft 1309
+\undefine\rightleftharpoons
+\newsymbol\rightleftharpoons 130A
+\newsymbol\leftrightharpoons 130B
+\newsymbol\boxminus 120C
+\newsymbol\Vdash 130D
+\newsymbol\Vvdash 130E
+\newsymbol\vDash 130F
+\newsymbol\twoheadrightarrow 1310
+\newsymbol\twoheadleftarrow 1311
+\newsymbol\leftleftarrows 1312
+\newsymbol\rightrightarrows 1313
+\newsymbol\upuparrows 1314
+\newsymbol\downdownarrows 1315
+\newsymbol\upharpoonright 1316
+ \let\restriction\upharpoonright
+\newsymbol\downharpoonright 1317
+\newsymbol\upharpoonleft 1318
+\newsymbol\downharpoonleft 1319
+\newsymbol\rightarrowtail 131A
+\newsymbol\leftarrowtail 131B
+\newsymbol\leftrightarrows 131C
+\newsymbol\rightleftarrows 131D
+\newsymbol\Lsh 131E
+\newsymbol\Rsh 131F
+\newsymbol\rightsquigarrow 1320
+\newsymbol\leftrightsquigarrow 1321
+\newsymbol\looparrowleft 1322
+\newsymbol\looparrowright 1323
+\newsymbol\circeq 1324
+\newsymbol\succsim 1325
+\newsymbol\gtrsim 1326
+\newsymbol\gtrapprox 1327
+\newsymbol\multimap 1328
+\newsymbol\therefore 1329
+\newsymbol\because 132A
+\newsymbol\doteqdot 132B
+ \let\Doteq\doteqdot
+\newsymbol\triangleq 132C
+\newsymbol\precsim 132D
+\newsymbol\lesssim 132E
+\newsymbol\lessapprox 132F
+\newsymbol\eqslantless 1330
+\newsymbol\eqslantgtr 1331
+\newsymbol\curlyeqprec 1332
+\newsymbol\curlyeqsucc 1333
+\newsymbol\preccurlyeq 1334
+\newsymbol\leqq 1335
+\newsymbol\leqslant 1336
+\newsymbol\lessgtr 1337
+\newsymbol\backprime 1038
+\newsymbol\risingdotseq 133A
+\newsymbol\fallingdotseq 133B
+\newsymbol\succcurlyeq 133C
+\newsymbol\geqq 133D
+\newsymbol\geqslant 133E
+\newsymbol\gtrless 133F
+\newsymbol\sqsubset 1340
+\newsymbol\sqsupset 1341
+\newsymbol\vartriangleright 1342
+\newsymbol\vartriangleleft 1343
+\newsymbol\trianglerighteq 1344
+\newsymbol\trianglelefteq 1345
+\newsymbol\bigstar 1046
+\newsymbol\between 1347
+\newsymbol\blacktriangledown 1048
+\newsymbol\blacktriangleright 1349
+\newsymbol\blacktriangleleft 134A
+\newsymbol\vartriangle 134D
+\newsymbol\blacktriangle 104E
+\newsymbol\triangledown 104F
+\newsymbol\eqcirc 1350
+\newsymbol\lesseqgtr 1351
+\newsymbol\gtreqless 1352
+\newsymbol\lesseqqgtr 1353
+\newsymbol\gtreqqless 1354
+\newsymbol\Rrightarrow 1356
+\newsymbol\Lleftarrow 1357
+\newsymbol\veebar 1259
+\newsymbol\barwedge 125A
+\newsymbol\doublebarwedge 125B
+\undefine\angle
+\newsymbol\angle 105C
+\newsymbol\measuredangle 105D
+\newsymbol\sphericalangle 105E
+\newsymbol\varpropto 135F
+\newsymbol\smallsmile 1360
+\newsymbol\smallfrown 1361
+\newsymbol\Subset 1362
+\newsymbol\Supset 1363
+\newsymbol\Cup 1264
+ \let\doublecup\Cup
+\newsymbol\Cap 1265
+ \let\doublecap\Cap
+\newsymbol\curlywedge 1266
+\newsymbol\curlyvee 1267
+\newsymbol\leftthreetimes 1268
+\newsymbol\rightthreetimes 1269
+\newsymbol\subseteqq 136A
+\newsymbol\supseteqq 136B
+\newsymbol\bumpeq 136C
+\newsymbol\Bumpeq 136D
+\newsymbol\lll 136E
+ \let\llless\lll
+\newsymbol\ggg 136F
+ \let\gggtr\ggg
+\newsymbol\circledS 1073
+\newsymbol\pitchfork 1374
+\newsymbol\dotplus 1275
+\newsymbol\backsim 1376
+\newsymbol\backsimeq 1377
+\newsymbol\complement 107B
+\newsymbol\intercal 127C
+\newsymbol\circledcirc 127D
+\newsymbol\circledast 127E
+\newsymbol\circleddash 127F
+\newsymbol\lvertneqq 2300
+\newsymbol\gvertneqq 2301
+\newsymbol\nleq 2302
+\newsymbol\ngeq 2303
+\newsymbol\nless 2304
+\newsymbol\ngtr 2305
+\newsymbol\nprec 2306
+\newsymbol\nsucc 2307
+\newsymbol\lneqq 2308
+\newsymbol\gneqq 2309
+\newsymbol\nleqslant 230A
+\newsymbol\ngeqslant 230B
+\newsymbol\lneq 230C
+\newsymbol\gneq 230D
+\newsymbol\npreceq 230E
+\newsymbol\nsucceq 230F
+\newsymbol\precnsim 2310
+\newsymbol\succnsim 2311
+\newsymbol\lnsim 2312
+\newsymbol\gnsim 2313
+\newsymbol\nleqq 2314
+\newsymbol\ngeqq 2315
+\newsymbol\precneqq 2316
+\newsymbol\succneqq 2317
+\newsymbol\precnapprox 2318
+\newsymbol\succnapprox 2319
+\newsymbol\lnapprox 231A
+\newsymbol\gnapprox 231B
+\newsymbol\nsim 231C
+\newsymbol\ncong 231D
+\newsymbol\diagup 231E
+\newsymbol\diagdown 231F
+\newsymbol\varsubsetneq 2320
+\newsymbol\varsupsetneq 2321
+\newsymbol\nsubseteqq 2322
+\newsymbol\nsupseteqq 2323
+\newsymbol\subsetneqq 2324
+\newsymbol\supsetneqq 2325
+\newsymbol\varsubsetneqq 2326
+\newsymbol\varsupsetneqq 2327
+\newsymbol\subsetneq 2328
+\newsymbol\supsetneq 2329
+\newsymbol\nsubseteq 232A
+\newsymbol\nsupseteq 232B
+\newsymbol\nparallel 232C
+\newsymbol\nmid 232D
+\newsymbol\nshortmid 232E
+\newsymbol\nshortparallel 232F
+\newsymbol\nvdash 2330
+\newsymbol\nVdash 2331
+\newsymbol\nvDash 2332
+\newsymbol\nVDash 2333
+\newsymbol\ntrianglerighteq 2334
+\newsymbol\ntrianglelefteq 2335
+\newsymbol\ntriangleleft 2336
+\newsymbol\ntriangleright 2337
+\newsymbol\nleftarrow 2338
+\newsymbol\nrightarrow 2339
+\newsymbol\nLeftarrow 233A
+\newsymbol\nRightarrow 233B
+\newsymbol\nLeftrightarrow 233C
+\newsymbol\nleftrightarrow 233D
+\newsymbol\divideontimes 223E
+\newsymbol\varnothing 203F
+\newsymbol\nexists 2040
+\newsymbol\Finv 2060
+\newsymbol\Game 2061
+\newsymbol\mho 2066
+\newsymbol\eth 2067
+\newsymbol\eqsim 2368
+\newsymbol\beth 2069
+\newsymbol\gimel 206A
+\newsymbol\daleth 206B
+\newsymbol\lessdot 236C
+\newsymbol\gtrdot 236D
+\newsymbol\ltimes 226E
+\newsymbol\rtimes 226F
+\newsymbol\shortmid 2370
+\newsymbol\shortparallel 2371
+\newsymbol\smallsetminus 2272
+\newsymbol\thicksim 2373
+\newsymbol\thickapprox 2374
+\newsymbol\approxeq 2375
+\newsymbol\succapprox 2376
+\newsymbol\precapprox 2377
+\newsymbol\curvearrowleft 2378
+\newsymbol\curvearrowright 2379
+\newsymbol\digamma 207A
+\newsymbol\varkappa 207B
+\newsymbol\Bbbk 207C
+\newsymbol\hslash 207D
+\undefine\hbar
+\newsymbol\hbar 207E
+\newsymbol\backepsilon 237F
+
+%D Restore the catcode value for @ that was previously saved.
+
+\catcode`\@=\csname pre amssym.tex at\endcsname
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-cmr.tex b/tex/context/base/font-cmr.tex index 3d586db8e..8915a8b24 100644 --- a/tex/context/base/font-cmr.tex +++ b/tex/context/base/font-cmr.tex @@ -1,501 +1,502 @@ -%D \module -%D [ file=font-cmr, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=Computer Modern, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] - -%D The Computer Modern Roman is derived from the Monotype~8a -%D Times Roman. In this module, that is loaded by default, we -%D define all relevant alternatives. - -\definebodyfont [12pt] [rm] - [tf=cmr12, - bf=cmbx12, - it=cmti12, - sl=cmsl12, - bi=cmbxti10 at 12pt, - bs=cmbxsl10 at 12pt, - tfa=cmr12 scaled \magstep1, - tfb=cmr12 scaled \magstep2, - tfc=cmr12 scaled \magstep3, - tfd=cmr12 scaled \magstep4, - sc=cmcsc10 at 12pt] - -\definebodyfont [12pt] [ss] - [tf=cmss12, - bf=cmssbx10 at 12pt, - it=cmssi12, - sl=cmssi12, - bi=cmssbx10 at 12pt, - bs=cmssbx10 at 12pt, - tfa=cmss12 scaled \magstep1, - tfb=cmss12 scaled \magstep2, - tfc=cmss12 scaled \magstep3, - tfd=cmss12 scaled \magstep4, - sc=cmss10] - -\definebodyfont [12pt] [tt] - [tf=cmtt12, - sl=cmsltt10 at 12pt, - it=cmitt10 at 12pt, - tfa=cmtt12 scaled \magstep1, - tfb=cmtt12 scaled \magstep2, - tfc=cmtt12 scaled \magstep3, - tfd=cmtt12 scaled \magstep4] - -\definebodyfont [12pt] [mm] - [ex=cmex10 at 12pt, - mi=cmmi12, - sy=cmsy10 at 12pt] - -\definebodyfont [12pt] [hw] - [tf=cmtt12] - -\definebodyfont [12pt] [cg] - [tf=cmtt12] - -\definebodyfont [11pt] [rm] - [tf=cmr10 at 11pt, - bf=cmbx10 at 11pt, - sl=cmsl10 at 11pt, - it=cmti10 at 11pt, - bi=cmbxti10 at 11pt, - bs=cmbxsl10 at 11pt, - tfa=cmr9 scaled \magstep2, - tfb=cmr9 scaled \magstep3, - tfc=cmr9 scaled \magstep4, - tfd=cmr9 scaled \magstep5, - sc=cmcsc10 at 11pt] - -\definebodyfont [11pt] [ss] - [tf=cmss10 at 11pt, - bf=cmssbx10 at 11pt, - it=cmssi10 at 11pt, - sl=cmssi10 at 11pt, - bi=cmssbx10 at 11pt, - bs=cmssbx10 at 11pt, - tfa=cmss9 scaled \magstep2, - tfb=cmss9 scaled \magstep3, - tfc=cmss9 scaled \magstep4, - tfd=cmss9 scaled \magstep5, - sc=cmss9] - -\definebodyfont [11pt] [tt] - [tf=cmtt10 at 11pt, - sl=cmsltt10 at 11pt, - it=cmitt10 at 11pt] - -\definebodyfont [11pt] [mm] - [ex=cmex10 at 11pt, - mi=cmmi10 at 11pt, - sy=cmsy10 at 11pt] - -\definebodyfont [11pt] [hw] - [tf=cmtt10 at 11pt] - -\definebodyfont [11pt] [cg] - [tf=cmtt10 at 11pt] - -\definebodyfont [10pt] [rm] - [tf=cmr10, - bf=cmbx10, - it=cmti10, - sl=cmsl10, - bi=cmbxti10, - bs=cmbxsl10, - tfa=cmr10 scaled \magstep1, - tfb=cmr10 scaled \magstep2, - tfc=cmr10 scaled \magstep3, - tfd=cmr10 scaled \magstep4, - sc=cmcsc10] - -\definebodyfont [10pt] [ss] - [tf=cmss10, - bf=cmssbx10, - it=cmssi10, - sl=cmssi10, - bi=cmssbx10, - bs=cmssbx10, - tfa=cmss10 scaled \magstep1, - tfb=cmss10 scaled \magstep2, - tfc=cmss10 scaled \magstep3, - tfd=cmss10 scaled \magstep4, - sc=cmss8] - -\definebodyfont [10pt] [tt] - [tf=cmtt10, - sl=cmsltt10, - it=cmitt10, - tfa=cmtt10 scaled \magstep1, - tfb=cmtt10 scaled \magstep2, - tfc=cmtt10 scaled \magstep3, - tfd=cmtt10 scaled \magstep4] - -\definebodyfont [10pt] [mm] - [ex=cmex10, - mi=cmmi10, - sy=cmsy10] - -\definebodyfont [10pt] [hw] - [tf=cmtt10] - -\definebodyfont [10pt] [cg] - [tf=cmtt10] - -\definebodyfont [9pt] [rm] - [tf=cmr9, - bf=cmbx9, - it=cmti9, - sl=cmsl9, - bi=cmbxti10 at 9pt, - bs=cmbxsl10 at 9pt, - tfa=cmr9 scaled \magstep1, - tfb=cmr9 scaled \magstep2, - tfc=cmr9 scaled \magstep3, - tfd=cmr9 scaled \magstep4, - sc=cmcsc10 at 9pt] - -\definebodyfont [9pt] [ss] - [tf=cmss9, - bf=cmssbx10 at 9pt, - it=cmssi9, - sl=cmssi9, - bi=cmssbx10 at 9pt, - bs=cmssbx10 at 9pt, - tfa=cmss9 scaled \magstep1, - tfb=cmss9 scaled \magstep2, - tfc=cmss9 scaled \magstep3, - tfd=cmss9 scaled \magstep4, - sc=cmss10 at 7pt] - -\definebodyfont [9pt] [tt] - [tf=cmtt9, - sl=cmsltt10 at 9pt, - it=cmitt10 at 9pt] - -\definebodyfont [9pt] [mm] - [ex=cmex10 at 9pt, - mi=cmmi9, - sy=cmsy9] - -\definebodyfont [9pt] [hw] - [tf=cmtt9] - -\definebodyfont [9pt] [cg] - [tf=cmtt9] - -\definebodyfont [8pt] [rm] - [tf=cmr8, - bf=cmbx8, - it=cmti8, - sl=cmsl8, - bi=cmbxti10 at 8pt, - bs=cmbxsl10 at 8pt, - tfa=cmr8 scaled \magstep1, - tfb=cmr8 scaled \magstep2, - tfc=cmr8 scaled \magstep3, - tfd=cmr8 scaled \magstep4, - sc=cmcsc10 at 8pt] - -\definebodyfont [8pt] [ss] - [tf=cmss8, - bf=cmssbx10 at 8pt, - it=cmssi8, - sl=cmssi8, - bi=cmssbx10 at 8pt, - bs=cmssbx10 at 8pt, - tfa=cmss8 scaled \magstep1, - tfb=cmss8 scaled \magstep2, - tfc=cmss8 scaled \magstep3, - tfd=cmss8 scaled \magstep4, - sc=cmss10 at 6pt] - -\definebodyfont [8pt] [tt] - [tf=cmtt8, - sl=cmsltt10 at 8pt, - it=cmitt10 at 8pt] - -\definebodyfont [8pt] [mm] - [ex=cmex10 at 8pt, - mi=cmmi8, - sy=cmsy8] - -\definebodyfont [8pt] [hw] - [tf=cmtt8] - -\definebodyfont [8pt] [cg] - [tf=cmtt8] - -\definebodyfont [7pt] [rm] - [tf=cmr7, - bf=cmbx7, - it=cmti10 at 7pt, - sl=cmsl10 at 7pt, - bi=cmbxti10 at 7pt, - bs=cmbxsl10 at 7pt, - tfa=cmr7 scaled \magstep1, - tfb=cmr7 scaled \magstep2, - tfc=cmr7 scaled \magstep3, - tfd=cmr7 scaled \magstep4, - sc=cmcsc10 at 7pt] - -\definebodyfont [7pt] [ss] - [tf=cmss10 at 7pt, - bf=cmssbx10 at 7pt, - it=cmssi10 at 7pt, - sl=cmssi10 at 7pt, - bs=cmssbx10 at 7pt, - bi=cmssbx10 at 7pt, - tfa=cmss8, % scaled 1000, - tfb=cmss8 scaled \magstep1, - tfc=cmss8 scaled \magstep2, - tfd=cmss8 scaled \magstep3, - sc=cmss10 at 5pt] - -\definebodyfont [7pt] [tt] - [tf=cmtt10 at 7pt, - sl=cmsltt10 at 7pt, - it=cmitt10 at 7pt] - -\definebodyfont [7pt] [mm] - [ex=cmex10 at 7pt, - mi=cmmi7, - sy=cmsy7] - -\definebodyfont [6pt] [rm] - [tf=cmr6, - bf=cmbx6, - it=cmti10 at 6pt, - sl=cmsl10 at 6pt, - bi=cmbxti10 at 6pt, - bs=cmbxsl10 at 6pt, - tfa=cmr6 scaled \magstep1, - tfb=cmr6 scaled \magstep2, - tfc=cmr6 scaled \magstep3, - tfd=cmr6 scaled \magstep4, - sc=cmcsc10 at 6pt] - -\definebodyfont [6pt] [ss] - [tf=cmss10 at 6pt, - bf=cmssbx10 at 6pt, - it=cmssi10 at 6pt, - sl=cmssi10 at 6pt, - bs=cmssbx10 at 6pt, - bi=cmssbx10 at 6pt, - sc=cmss10 at 4pt] - -\definebodyfont [6pt] [tt] - [tf=cmtt10 at 6pt, - sl=cmsltt10 at 6pt, - it=cmitt10 at 6pt] - -\definebodyfont [6pt] [mm] - [ex=cmex10 at 6pt, - mi=cmmi6, - sy=cmsy6] - -\definebodyfont [5pt] [rm] - [tf=cmr5, - bf=cmbx5, - it=cmti10 at 5pt, - sl=cmsl10 at 5pt, - bi=cmbxti10 at 5pt, - bs=cmbxsl10 at 5pt, - tfa=cmr5 scaled \magstep1, - tfb=cmr5 scaled \magstep2, - tfc=cmr5 scaled \magstep3, - tfd=cmr5 scaled \magstep4, - sc=cmcsc10 at 5pt] - -\definebodyfont [5pt] [ss] - [tf=cmss10 at 5pt, - bf=cmssbx10 at 5pt, - it=cmssi10 at 5pt, - sl=cmssi10 at 5pt, - bs=cmssbx10 at 5pt, - bi=cmssbx10 at 5pt, - sc=cmss10 at 3pt] - -\definebodyfont [5pt] [tt] - [tf=cmtt10 at 5pt, - sl=cmsltt10 at 5pt, - it=cmitt10 at 5pt] - -\definebodyfont [5pt] [mm] - [ex=cmex10 at 5pt, - mi=cmmi5, - sy=cmsy5] - -\definebodyfont [4pt] [rm] - [tf=cmr10 at 4pt, - bf=cmbx10 at 4pt, - it=cmti10 at 4pt, - sl=cmsl10 at 4pt, - bi=cmbxti10 at 4pt, - bs=cmbxsl10 at 4pt, - sc=cmr10 at 4pt] - -\definebodyfont [4pt] [ss] - [tf=cmss10 at 4pt, - bf=cmssbx10 at 4pt, - it=cmssi10 at 4pt, - sl=cmssi10 at 4pt, - bs=cmssbx10 at 4pt, - bi=cmssbx10 at 4pt, - sc=cmss10 at 4pt] - -\definebodyfont [4pt] [tt] - [tf=cmtt10 at 4pt, - sl=cmsltt10 at 4pt, - it=cmitt10 at 4pt] - -\definebodyfont [4pt] [mm] - [ex=cmex10 at 4pt, - mi=cmmi10 at 4pt, - sy=cmsy10 at 4pt] - -%D We also define some large alternatives that can be used for -%D titlepages and section headings. - -\definebodyfont [12pt] [rm] - [bfa=cmbx12 scaled \magstep1, - bfb=cmbx12 scaled \magstep2, - bfc=cmbx12 scaled \magstep3, - bfd=cmbx12 scaled \magstep4, - ita=cmti12 scaled \magstep1, - itb=cmti12 scaled \magstep2, - itc=cmti12 scaled \magstep3, - itd=cmti12 scaled \magstep4, - sla=cmsl12 scaled \magstep1, - slb=cmsl12 scaled \magstep2, - slc=cmsl12 scaled \magstep3, - sld=cmsl12 scaled \magstep4, - bsa=cmbxsl10 scaled \magstep2, - bsb=cmbxsl10 scaled \magstep3, - bsc=cmbxsl10 scaled \magstep4, - bsd=cmbxsl10 scaled \magstep5, - sca=cmcsc10 scaled \magstep2, - scb=cmcsc10 scaled \magstep3, - scc=cmcsc10 scaled \magstep4, - scd=cmcsc10 scaled \magstep5] - -\definebodyfont [11pt] [rm] - [bfa=cmbx9 scaled \magstep2, - bfb=cmbx9 scaled \magstep3, - bfc=cmbx9 scaled \magstep4, - bfd=cmbx9 scaled \magstep5, - ita=cmti9 scaled \magstep2, - itb=cmti9 scaled \magstep3, - itc=cmti9 scaled \magstep4, - itd=cmsl9 scaled \magstep5, - sla=cmsl9 scaled \magstep2, - slb=cmsl9 scaled \magstep3, - slc=cmsl9 scaled \magstep4, - sld=cmsl9 scaled \magstep5, - sca=cmcsc9 scaled \magstep2, - scb=cmcsc9 scaled \magstep3, - scc=cmcsc9 scaled \magstep4, - scd=cmcsc9 scaled \magstep5] - -\definebodyfont [10pt] [rm] - [bfa=cmbx10 scaled \magstep1, - bfb=cmbx10 scaled \magstep2, - bfc=cmbx10 scaled \magstep3, - bfd=cmbx10 scaled \magstep4, - sla=cmsl10 scaled \magstep1, - slb=cmsl10 scaled \magstep2, - slc=cmsl10 scaled \magstep3, - sld=cmsl10 scaled \magstep4, - bsa=cmbxsl10 scaled \magstep1, - bsb=cmbxsl10 scaled \magstep2, - bsc=cmbxsl10 scaled \magstep3, - bsd=cmbxsl10 scaled \magstep4, - sca=cmcsc10 scaled \magstep1, - scb=cmcsc10 scaled \magstep2, - scc=cmcsc10 scaled \magstep3, - scd=cmcsc10 scaled \magstep4] - -\definebodyfont [9pt] [rm] - [bfa=cmbx9 scaled \magstep1, - bfb=cmbx9 scaled \magstep2, - bfc=cmbx9 scaled \magstep3, - bfd=cmbx9 scaled \magstep4, - ita=cmti9 scaled \magstep1, - itb=cmti9 scaled \magstep2, - itc=cmti9 scaled \magstep3, - itd=cmti9 scaled \magstep4, - sla=cmsl9 scaled \magstep1, - slb=cmsl9 scaled \magstep2, - slc=cmsl9 scaled \magstep3, - sld=cmsl9 scaled \magstep4, - sca=cmcsc9 scaled \magstep1, - scb=cmcsc9 scaled \magstep2, - scc=cmcsc9 scaled \magstep3, - scd=cmcsc9 scaled \magstep4] - -\definebodyfont [8pt] [rm] - [bfa=cmbx8 scaled \magstep1, - bfb=cmbx8 scaled \magstep2, - bfc=cmbx8 scaled \magstep3, - bfd=cmbx8 scaled \magstep4, - sca=cmcsc8 scaled \magstep1, - scb=cmcsc8 scaled \magstep2, - scc=cmcsc8 scaled \magstep3, - scd=cmcsc8 scaled \magstep4] - -\definebodyfont [7pt] [rm] - [bfa=cmbx7 scaled \magstep1, - bfb=cmbx7 scaled \magstep2, - bfc=cmbx7 scaled \magstep3, - bfd=cmbx7 scaled \magstep4] - -\definebodyfont [6pt] [rm] - [bfa=cmbx6 scaled \magstep1, - bfb=cmbx6 scaled \magstep2, - bfc=cmbx6 scaled \magstep3, - bfd=cmbx6 scaled \magstep4] - -\definebodyfont [12pt] [ss] - [bfa=cmss12 scaled \magstep1, - bfb=cmss12 scaled \magstep2, - bfc=cmss12 scaled \magstep3, - bfd=cmss12 scaled \magstep4, - sla=cmssi10 scaled \magstep2, - slb=cmssi10 scaled \magstep3, - slc=cmssi10 scaled \magstep4, - sld=cmssi10 scaled \magstep5, - bsa=cmssi10 scaled \magstep2, - bsb=cmssi10 scaled \magstep3, - bsc=cmssi10 scaled \magstep4, - bsd=cmssi10 scaled \magstep5] - -\definebodyfont [10pt] [ss] - [bfa=cmss10 scaled \magstep1, - bfb=cmss10 scaled \magstep2, - bfc=cmss10 scaled \magstep3, - bfd=cmss10 scaled \magstep4, - sla=cmssi10 scaled \magstep1, - slb=cmssi10 scaled \magstep2, - slc=cmssi10 scaled \magstep3, - sld=cmssi10 scaled \magstep4, - bsa=cmssi10 scaled \magstep1, - bsb=cmssi10 scaled \magstep2, - bsc=cmssi10 scaled \magstep3, - bsd=cmssi10 scaled \magstep4] - -\definebodyfont [12pt] [tt] - [sla=cmsltt10 scaled \magstep2, - slb=cmsltt10 scaled \magstep3, - slc=cmsltt10 scaled \magstep4, - sld=cmsltt10 scaled \magstep5] - -\definebodyfont [10pt] [tt] - [sla=cmsltt10 scaled \magstep1, - slb=cmsltt10 scaled \magstep2, - slc=cmsltt10 scaled \magstep3, - sld=cmsltt10 scaled \magstep4] - -\endinput +%D \module
+%D [ file=font-cmr,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Computer Modern,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+%D The Computer Modern Roman is derived from the Monotype~8a
+%D Times Roman. In this module, that is loaded by default, we
+%D define all relevant alternatives.
+
+\definebodyfont [12pt] [rm]
+ [tf=cmr12,
+ bf=cmbx12,
+ it=cmti12,
+ sl=cmsl12,
+ bi=cmbxti10 at 12pt,
+ bs=cmbxsl10 at 12pt,
+ tfa=cmr12 scaled \magstep1,
+ tfb=cmr12 scaled \magstep2,
+ tfc=cmr12 scaled \magstep3,
+ tfd=cmr12 scaled \magstep4,
+ sc=cmcsc10 at 12pt]
+
+\definebodyfont [12pt] [ss]
+ [tf=cmss12,
+ bf=cmssbx10 at 12pt,
+ it=cmssi12,
+ sl=cmssi12,
+ bi=cmssbx10 at 12pt,
+ bs=cmssbx10 at 12pt,
+ tfa=cmss12 scaled \magstep1,
+ tfb=cmss12 scaled \magstep2,
+ tfc=cmss12 scaled \magstep3,
+ tfd=cmss12 scaled \magstep4,
+ sc=cmss10]
+
+\definebodyfont [12pt] [tt]
+ [tf=cmtt12,
+ sl=cmsltt10 at 12pt,
+ it=cmitt10 at 12pt,
+ tfa=cmtt12 scaled \magstep1,
+ tfb=cmtt12 scaled \magstep2,
+ tfc=cmtt12 scaled \magstep3,
+ tfd=cmtt12 scaled \magstep4]
+
+\definebodyfont [12pt] [mm]
+ [ex=cmex10 at 12pt,
+ mi=cmmi12,
+ sy=cmsy10 at 12pt]
+
+\definebodyfont [12pt] [hw]
+ [tf=cmtt12]
+
+\definebodyfont [12pt] [cg]
+ [tf=cmtt12]
+
+\definebodyfont [11pt] [rm]
+ [tf=cmr10 at 11pt,
+ bf=cmbx10 at 11pt,
+ sl=cmsl10 at 11pt,
+ it=cmti10 at 11pt,
+ bi=cmbxti10 at 11pt,
+ bs=cmbxsl10 at 11pt,
+ tfa=cmr9 scaled \magstep2,
+ tfb=cmr9 scaled \magstep3,
+ tfc=cmr9 scaled \magstep4,
+ tfd=cmr9 scaled \magstep5,
+ sc=cmcsc10 at 11pt]
+
+\definebodyfont [11pt] [ss]
+ [tf=cmss10 at 11pt,
+ bf=cmssbx10 at 11pt,
+ it=cmssi10 at 11pt,
+ sl=cmssi10 at 11pt,
+ bi=cmssbx10 at 11pt,
+ bs=cmssbx10 at 11pt,
+ tfa=cmss9 scaled \magstep2,
+ tfb=cmss9 scaled \magstep3,
+ tfc=cmss9 scaled \magstep4,
+ tfd=cmss9 scaled \magstep5,
+ sc=cmss9]
+
+\definebodyfont [11pt] [tt]
+ [tf=cmtt10 at 11pt,
+ sl=cmsltt10 at 11pt,
+ it=cmitt10 at 11pt]
+
+\definebodyfont [11pt] [mm]
+ [ex=cmex10 at 11pt,
+ mi=cmmi10 at 11pt,
+ sy=cmsy10 at 11pt]
+
+\definebodyfont [11pt] [hw]
+ [tf=cmtt10 at 11pt]
+
+\definebodyfont [11pt] [cg]
+ [tf=cmtt10 at 11pt]
+
+\definebodyfont [10pt] [rm]
+ [tf=cmr10,
+ bf=cmbx10,
+ it=cmti10,
+ sl=cmsl10,
+ bi=cmbxti10,
+ bs=cmbxsl10,
+ tfa=cmr10 scaled \magstep1,
+ tfb=cmr10 scaled \magstep2,
+ tfc=cmr10 scaled \magstep3,
+ tfd=cmr10 scaled \magstep4,
+ sc=cmcsc10]
+
+\definebodyfont [10pt] [ss]
+ [tf=cmss10,
+ bf=cmssbx10,
+ it=cmssi10,
+ sl=cmssi10,
+ bi=cmssbx10,
+ bs=cmssbx10,
+ tfa=cmss10 scaled \magstep1,
+ tfb=cmss10 scaled \magstep2,
+ tfc=cmss10 scaled \magstep3,
+ tfd=cmss10 scaled \magstep4,
+ sc=cmss8]
+
+\definebodyfont [10pt] [tt]
+ [tf=cmtt10,
+ sl=cmsltt10,
+ it=cmitt10,
+ tfa=cmtt10 scaled \magstep1,
+ tfb=cmtt10 scaled \magstep2,
+ tfc=cmtt10 scaled \magstep3,
+ tfd=cmtt10 scaled \magstep4]
+
+\definebodyfont [10pt] [mm]
+ [ex=cmex10,
+ mi=cmmi10,
+ sy=cmsy10]
+
+\definebodyfont [10pt] [hw]
+ [tf=cmtt10]
+
+\definebodyfont [10pt] [cg]
+ [tf=cmtt10]
+
+\definebodyfont [9pt] [rm]
+ [tf=cmr9,
+ bf=cmbx9,
+ it=cmti9,
+ sl=cmsl9,
+ bi=cmbxti10 at 9pt,
+ bs=cmbxsl10 at 9pt,
+ tfa=cmr9 scaled \magstep1,
+ tfb=cmr9 scaled \magstep2,
+ tfc=cmr9 scaled \magstep3,
+ tfd=cmr9 scaled \magstep4,
+ sc=cmcsc10 at 9pt]
+
+\definebodyfont [9pt] [ss]
+ [tf=cmss9,
+ bf=cmssbx10 at 9pt,
+ it=cmssi9,
+ sl=cmssi9,
+ bi=cmssbx10 at 9pt,
+ bs=cmssbx10 at 9pt,
+ tfa=cmss9 scaled \magstep1,
+ tfb=cmss9 scaled \magstep2,
+ tfc=cmss9 scaled \magstep3,
+ tfd=cmss9 scaled \magstep4,
+ sc=cmss10 at 7pt]
+
+\definebodyfont [9pt] [tt]
+ [tf=cmtt9,
+ sl=cmsltt10 at 9pt,
+ it=cmitt10 at 9pt]
+
+\definebodyfont [9pt] [mm]
+ [ex=cmex10 at 9pt,
+ mi=cmmi9,
+ sy=cmsy9]
+
+\definebodyfont [9pt] [hw]
+ [tf=cmtt9]
+
+\definebodyfont [9pt] [cg]
+ [tf=cmtt9]
+
+\definebodyfont [8pt] [rm]
+ [tf=cmr8,
+ bf=cmbx8,
+ it=cmti8,
+ sl=cmsl8,
+ bi=cmbxti10 at 8pt,
+ bs=cmbxsl10 at 8pt,
+ tfa=cmr8 scaled \magstep1,
+ tfb=cmr8 scaled \magstep2,
+ tfc=cmr8 scaled \magstep3,
+ tfd=cmr8 scaled \magstep4,
+ sc=cmcsc10 at 8pt]
+
+\definebodyfont [8pt] [ss]
+ [tf=cmss8,
+ bf=cmssbx10 at 8pt,
+ it=cmssi8,
+ sl=cmssi8,
+ bi=cmssbx10 at 8pt,
+ bs=cmssbx10 at 8pt,
+ tfa=cmss8 scaled \magstep1,
+ tfb=cmss8 scaled \magstep2,
+ tfc=cmss8 scaled \magstep3,
+ tfd=cmss8 scaled \magstep4,
+ sc=cmss10 at 6pt]
+
+\definebodyfont [8pt] [tt]
+ [tf=cmtt8,
+ sl=cmsltt10 at 8pt,
+ it=cmitt10 at 8pt]
+
+\definebodyfont [8pt] [mm]
+ [ex=cmex10 at 8pt,
+ mi=cmmi8,
+ sy=cmsy8]
+
+\definebodyfont [8pt] [hw]
+ [tf=cmtt8]
+
+\definebodyfont [8pt] [cg]
+ [tf=cmtt8]
+
+\definebodyfont [7pt] [rm]
+ [tf=cmr7,
+ bf=cmbx7,
+ it=cmti10 at 7pt,
+ sl=cmsl10 at 7pt,
+ bi=cmbxti10 at 7pt,
+ bs=cmbxsl10 at 7pt,
+ tfa=cmr7 scaled \magstep1,
+ tfb=cmr7 scaled \magstep2,
+ tfc=cmr7 scaled \magstep3,
+ tfd=cmr7 scaled \magstep4,
+ sc=cmcsc10 at 7pt]
+
+\definebodyfont [7pt] [ss]
+ [tf=cmss10 at 7pt,
+ bf=cmssbx10 at 7pt,
+ it=cmssi10 at 7pt,
+ sl=cmssi10 at 7pt,
+ bs=cmssbx10 at 7pt,
+ bi=cmssbx10 at 7pt,
+ tfa=cmss8, % scaled 1000,
+ tfb=cmss8 scaled \magstep1,
+ tfc=cmss8 scaled \magstep2,
+ tfd=cmss8 scaled \magstep3,
+ sc=cmss10 at 5pt]
+
+\definebodyfont [7pt] [tt]
+ [tf=cmtt10 at 7pt,
+ sl=cmsltt10 at 7pt,
+ it=cmitt10 at 7pt]
+
+\definebodyfont [7pt] [mm]
+ [ex=cmex10 at 7pt,
+ mi=cmmi7,
+ sy=cmsy7]
+
+\definebodyfont [6pt] [rm]
+ [tf=cmr6,
+ bf=cmbx6,
+ it=cmti10 at 6pt,
+ sl=cmsl10 at 6pt,
+ bi=cmbxti10 at 6pt,
+ bs=cmbxsl10 at 6pt,
+ tfa=cmr6 scaled \magstep1,
+ tfb=cmr6 scaled \magstep2,
+ tfc=cmr6 scaled \magstep3,
+ tfd=cmr6 scaled \magstep4,
+ sc=cmcsc10 at 6pt]
+
+\definebodyfont [6pt] [ss]
+ [tf=cmss10 at 6pt,
+ bf=cmssbx10 at 6pt,
+ it=cmssi10 at 6pt,
+ sl=cmssi10 at 6pt,
+ bs=cmssbx10 at 6pt,
+ bi=cmssbx10 at 6pt,
+ sc=cmss10 at 4pt]
+
+\definebodyfont [6pt] [tt]
+ [tf=cmtt10 at 6pt,
+ sl=cmsltt10 at 6pt,
+ it=cmitt10 at 6pt]
+
+\definebodyfont [6pt] [mm]
+ [ex=cmex10 at 6pt,
+ mi=cmmi6,
+ sy=cmsy6]
+
+\definebodyfont [5pt] [rm]
+ [tf=cmr5,
+ bf=cmbx5,
+ it=cmti10 at 5pt,
+ sl=cmsl10 at 5pt,
+ bi=cmbxti10 at 5pt,
+ bs=cmbxsl10 at 5pt,
+ tfa=cmr5 scaled \magstep1,
+ tfb=cmr5 scaled \magstep2,
+ tfc=cmr5 scaled \magstep3,
+ tfd=cmr5 scaled \magstep4,
+ sc=cmcsc10 at 5pt]
+
+\definebodyfont [5pt] [ss]
+ [tf=cmss10 at 5pt,
+ bf=cmssbx10 at 5pt,
+ it=cmssi10 at 5pt,
+ sl=cmssi10 at 5pt,
+ bs=cmssbx10 at 5pt,
+ bi=cmssbx10 at 5pt,
+ sc=cmss10 at 3pt]
+
+\definebodyfont [5pt] [tt]
+ [tf=cmtt10 at 5pt,
+ sl=cmsltt10 at 5pt,
+ it=cmitt10 at 5pt]
+
+\definebodyfont [5pt] [mm]
+ [ex=cmex10 at 5pt,
+ mi=cmmi5,
+ sy=cmsy5]
+
+\definebodyfont [4pt] [rm]
+ [tf=cmr10 at 4pt,
+ bf=cmbx10 at 4pt,
+ it=cmti10 at 4pt,
+ sl=cmsl10 at 4pt,
+ bi=cmbxti10 at 4pt,
+ bs=cmbxsl10 at 4pt,
+ sc=cmr10 at 4pt]
+
+\definebodyfont [4pt] [ss]
+ [tf=cmss10 at 4pt,
+ bf=cmssbx10 at 4pt,
+ it=cmssi10 at 4pt,
+ sl=cmssi10 at 4pt,
+ bs=cmssbx10 at 4pt,
+ bi=cmssbx10 at 4pt,
+ sc=cmss10 at 4pt]
+
+\definebodyfont [4pt] [tt]
+ [tf=cmtt10 at 4pt,
+ sl=cmsltt10 at 4pt,
+ it=cmitt10 at 4pt]
+
+\definebodyfont [4pt] [mm]
+ [ex=cmex10 at 4pt,
+ mi=cmmi10 at 4pt,
+ sy=cmsy10 at 4pt]
+
+%D We also define some large alternatives that can be used for
+%D titlepages and section headings.
+
+\definebodyfont [12pt] [rm]
+ [bfa=cmbx12 scaled \magstep1,
+ bfb=cmbx12 scaled \magstep2,
+ bfc=cmbx12 scaled \magstep3,
+ bfd=cmbx12 scaled \magstep4,
+ ita=cmti12 scaled \magstep1,
+ itb=cmti12 scaled \magstep2,
+ itc=cmti12 scaled \magstep3,
+ itd=cmti12 scaled \magstep4,
+ sla=cmsl12 scaled \magstep1,
+ slb=cmsl12 scaled \magstep2,
+ slc=cmsl12 scaled \magstep3,
+ sld=cmsl12 scaled \magstep4,
+ bsa=cmbxsl10 scaled \magstep2,
+ bsb=cmbxsl10 scaled \magstep3,
+ bsc=cmbxsl10 scaled \magstep4,
+ bsd=cmbxsl10 scaled \magstep5,
+ sca=cmcsc10 scaled \magstep2,
+ scb=cmcsc10 scaled \magstep3,
+ scc=cmcsc10 scaled \magstep4,
+ scd=cmcsc10 scaled \magstep5]
+
+\definebodyfont [11pt] [rm]
+ [bfa=cmbx9 scaled \magstep2,
+ bfb=cmbx9 scaled \magstep3,
+ bfc=cmbx9 scaled \magstep4,
+ bfd=cmbx9 scaled \magstep5,
+ ita=cmti9 scaled \magstep2,
+ itb=cmti9 scaled \magstep3,
+ itc=cmti9 scaled \magstep4,
+ itd=cmsl9 scaled \magstep5,
+ sla=cmsl9 scaled \magstep2,
+ slb=cmsl9 scaled \magstep3,
+ slc=cmsl9 scaled \magstep4,
+ sld=cmsl9 scaled \magstep5,
+ sca=cmcsc9 scaled \magstep2,
+ scb=cmcsc9 scaled \magstep3,
+ scc=cmcsc9 scaled \magstep4,
+ scd=cmcsc9 scaled \magstep5]
+
+\definebodyfont [10pt] [rm]
+ [bfa=cmbx10 scaled \magstep1,
+ bfb=cmbx10 scaled \magstep2,
+ bfc=cmbx10 scaled \magstep3,
+ bfd=cmbx10 scaled \magstep4,
+ sla=cmsl10 scaled \magstep1,
+ slb=cmsl10 scaled \magstep2,
+ slc=cmsl10 scaled \magstep3,
+ sld=cmsl10 scaled \magstep4,
+ bsa=cmbxsl10 scaled \magstep1,
+ bsb=cmbxsl10 scaled \magstep2,
+ bsc=cmbxsl10 scaled \magstep3,
+ bsd=cmbxsl10 scaled \magstep4,
+ sca=cmcsc10 scaled \magstep1,
+ scb=cmcsc10 scaled \magstep2,
+ scc=cmcsc10 scaled \magstep3,
+ scd=cmcsc10 scaled \magstep4]
+
+\definebodyfont [9pt] [rm]
+ [bfa=cmbx9 scaled \magstep1,
+ bfb=cmbx9 scaled \magstep2,
+ bfc=cmbx9 scaled \magstep3,
+ bfd=cmbx9 scaled \magstep4,
+ ita=cmti9 scaled \magstep1,
+ itb=cmti9 scaled \magstep2,
+ itc=cmti9 scaled \magstep3,
+ itd=cmti9 scaled \magstep4,
+ sla=cmsl9 scaled \magstep1,
+ slb=cmsl9 scaled \magstep2,
+ slc=cmsl9 scaled \magstep3,
+ sld=cmsl9 scaled \magstep4,
+ sca=cmcsc9 scaled \magstep1,
+ scb=cmcsc9 scaled \magstep2,
+ scc=cmcsc9 scaled \magstep3,
+ scd=cmcsc9 scaled \magstep4]
+
+\definebodyfont [8pt] [rm]
+ [bfa=cmbx8 scaled \magstep1,
+ bfb=cmbx8 scaled \magstep2,
+ bfc=cmbx8 scaled \magstep3,
+ bfd=cmbx8 scaled \magstep4,
+ sca=cmcsc8 scaled \magstep1,
+ scb=cmcsc8 scaled \magstep2,
+ scc=cmcsc8 scaled \magstep3,
+ scd=cmcsc8 scaled \magstep4]
+
+\definebodyfont [7pt] [rm]
+ [bfa=cmbx7 scaled \magstep1,
+ bfb=cmbx7 scaled \magstep2,
+ bfc=cmbx7 scaled \magstep3,
+ bfd=cmbx7 scaled \magstep4]
+
+\definebodyfont [6pt] [rm]
+ [bfa=cmbx6 scaled \magstep1,
+ bfb=cmbx6 scaled \magstep2,
+ bfc=cmbx6 scaled \magstep3,
+ bfd=cmbx6 scaled \magstep4]
+
+\definebodyfont [12pt] [ss]
+ [bfa=cmss12 scaled \magstep1,
+ bfb=cmss12 scaled \magstep2,
+ bfc=cmss12 scaled \magstep3,
+ bfd=cmss12 scaled \magstep4,
+ sla=cmssi10 scaled \magstep2,
+ slb=cmssi10 scaled \magstep3,
+ slc=cmssi10 scaled \magstep4,
+ sld=cmssi10 scaled \magstep5,
+ bsa=cmssi10 scaled \magstep2,
+ bsb=cmssi10 scaled \magstep3,
+ bsc=cmssi10 scaled \magstep4,
+ bsd=cmssi10 scaled \magstep5]
+
+\definebodyfont [10pt] [ss]
+ [bfa=cmss10 scaled \magstep1,
+ bfb=cmss10 scaled \magstep2,
+ bfc=cmss10 scaled \magstep3,
+ bfd=cmss10 scaled \magstep4,
+ sla=cmssi10 scaled \magstep1,
+ slb=cmssi10 scaled \magstep2,
+ slc=cmssi10 scaled \magstep3,
+ sld=cmssi10 scaled \magstep4,
+ bsa=cmssi10 scaled \magstep1,
+ bsb=cmssi10 scaled \magstep2,
+ bsc=cmssi10 scaled \magstep3,
+ bsd=cmssi10 scaled \magstep4]
+
+\definebodyfont [12pt] [tt]
+ [sla=cmsltt10 scaled \magstep2,
+ slb=cmsltt10 scaled \magstep3,
+ slc=cmsltt10 scaled \magstep4,
+ sld=cmsltt10 scaled \magstep5]
+
+\definebodyfont [10pt] [tt]
+ [sla=cmsltt10 scaled \magstep1,
+ slb=cmsltt10 scaled \magstep2,
+ slc=cmsltt10 scaled \magstep3,
+ sld=cmsltt10 scaled \magstep4]
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-con.tex b/tex/context/base/font-con.tex index bd8412750..edaf77f96 100644 --- a/tex/context/base/font-con.tex +++ b/tex/context/base/font-con.tex @@ -1,61 +1,62 @@ -%D \module -%D [ file=font-con, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=Concrete Roman, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] - -%D The Concrete Modern Roman is just an alternative Computer -%D Modern Roman. - -\definebodyfont [12pt] [rm] - [tf=ccr10 at 12pt, % scaled \magstep1 - it=ccti10 at 12pt, % scaled \magstep1 - sl=ccsl10 at 12pt, % scaled \magstep1 - sc=cccsc10 at 12pt] % scaled \magstep1 - -\definebodyfont [11pt] [rm] - [tf=ccr10 at 11pt, % scaled \magstephalf - it=ccti10 at 11pt, % scaled \magstephalf - sl=ccsl10 at 11pt, % scaled \magstephalf - sc=cccsc10 at 11pt] % scaled \magstephalf - -\definebodyfont [10pt] [rm] - [tf=ccr10, - it=ccti10, - sl=ccsl10, - sc=cccsc10] - -\definebodyfont [9pt] [rm] - [tf=ccr9, - it=ccr9, - sl=ccr9, - sc=ccr9] - -\definebodyfont [8pt] [rm] - [tf=ccr8, - it=ccr8, - sl=ccr8, - sc=ccr8] - -\definebodyfont [7pt] [rm] - [tf=ccr7, - it=ccr7, - sl=ccr7, - sc=ccr7] - -\definebodyfont [6pt] [rm] - [tf=ccr6, - it=ccr6, - sl=ccr6, - sc=ccr6] - -\definebodyfont [5pt] [rm] - [tf=ccr5, - it=ccr5, - sl=ccr5, - sc=ccr5] - -\endinput +%D \module
+%D [ file=font-con,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Concrete Roman,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+%D The Concrete Modern Roman is just an alternative Computer
+%D Modern Roman.
+
+\definebodyfont [12pt] [rm]
+ [tf=ccr10 at 12pt, % scaled \magstep1
+ it=ccti10 at 12pt, % scaled \magstep1
+ sl=ccsl10 at 12pt, % scaled \magstep1
+ sc=cccsc10 at 12pt] % scaled \magstep1
+
+\definebodyfont [11pt] [rm]
+ [tf=ccr10 at 11pt, % scaled \magstephalf
+ it=ccti10 at 11pt, % scaled \magstephalf
+ sl=ccsl10 at 11pt, % scaled \magstephalf
+ sc=cccsc10 at 11pt] % scaled \magstephalf
+
+\definebodyfont [10pt] [rm]
+ [tf=ccr10,
+ it=ccti10,
+ sl=ccsl10,
+ sc=cccsc10]
+
+\definebodyfont [9pt] [rm]
+ [tf=ccr9,
+ it=ccr9,
+ sl=ccr9,
+ sc=ccr9]
+
+\definebodyfont [8pt] [rm]
+ [tf=ccr8,
+ it=ccr8,
+ sl=ccr8,
+ sc=ccr8]
+
+\definebodyfont [7pt] [rm]
+ [tf=ccr7,
+ it=ccr7,
+ sl=ccr7,
+ sc=ccr7]
+
+\definebodyfont [6pt] [rm]
+ [tf=ccr6,
+ it=ccr6,
+ sl=ccr6,
+ sc=ccr6]
+
+\definebodyfont [5pt] [rm]
+ [tf=ccr5,
+ it=ccr5,
+ sl=ccr5,
+ sc=ccr5]
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-def.tex b/tex/context/base/font-def.tex new file mode 100644 index 000000000..8f310665d --- /dev/null +++ b/tex/context/base/font-def.tex @@ -0,0 +1,66 @@ +%D \module
+%D [ file=font-def,
+%D version=1998.11.4,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Default Font Names,
+%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.
+
+\definefilesynonym [Courier] [com]
+\definefilesynonym [Courier-Oblique] [coo]
+\definefilesynonym [Helvetica] [hv]
+\definefilesynonym [Helvetica-Oblique] [hvo]
+\definefilesynonym [Helvetica-Bold] [hvb]
+\definefilesynonym [Helvetica-BoldOblique] [hvbo]
+\definefilesynonym [Times-Roman] [tir]
+\definefilesynonym [Times-Italic] [tii]
+\definefilesynonym [Times-Bold] [tib]
+\definefilesynonym [Times-BoldItalic] [tibi]
+
+\definefilesynonym [LucidaBlackletter] [lbl]
+\definefilesynonym [LucidaBright] [lbr]
+\definefilesynonym [LucidaBright-Demi] [lbd]
+\definefilesynonym [LucidaBright-DemiItalic] [lbdi]
+\definefilesynonym [LucidaBright-Italic] [lbi]
+\definefilesynonym [LucidaBrightSmallcaps] [lbrsc]
+\definefilesynonym [LucidaBrightSmallcaps-Demi] [lbdsc]
+\definefilesynonym [LucidaBright-Oblique] [lbsl]
+\definefilesynonym [LucidaCalligraphy-Italic] [lbc]
+\definefilesynonym [LucidaCasual] [lbkr]
+\definefilesynonym [LucidaCasual-Italic] [lbki]
+\definefilesynonym [LucidaFax] [lfr]
+\definefilesynonym [LucidaFax-Demi] [lfd]
+\definefilesynonym [LucidaFax-DemiItalic] [lfdi]
+\definefilesynonym [LucidaFax-Italic] [lfi]
+\definefilesynonym [LucidaHandwriting-Italic] [lbh]
+\definefilesynonym [LucidaSans] [lsr]
+\definefilesynonym [LucidaSans-Demi] [lsd]
+\definefilesynonym [LucidaSans-DemiItalic] [lsdi]
+\definefilesynonym [LucidaSans-Italic] [lsi]
+\definefilesynonym [LucidaSans-Bold] [lsb]
+\definefilesynonym [LucidaSans-BoldItalic] [lsbi]
+\definefilesynonym [LucidaSans-Typewriter] [lstr]
+\definefilesynonym [LucidaSans-TypewriterBold] [lstb]
+\definefilesynonym [LucidaSans-TypewriterBoldOblique] [lstbo]
+\definefilesynonym [LucidaSans-TypewriterOblique] [lsto]
+\definefilesynonym [LucidaTypewriter] [lbtr]
+\definefilesynonym [LucidaTypewriterBold] [lbtb]
+\definefilesynonym [LucidaTypewriterBoldOblique] [lbtbo]
+\definefilesynonym [LucidaTypewriterOblique] [lbto]
+\definefilesynonym [LucidaNewMath-AltDemiItalic] [lbmdo]
+\definefilesynonym [LucidaNewMath-AltItalic] [lbmo]
+\definefilesynonym [LucidaNewMath-Arrows] [lbma]
+\definefilesynonym [LucidaNewMath-Arrows-Demi] [lbmad]
+\definefilesynonym [LucidaNewMath-Extension] [lbme]
+\definefilesynonym [LucidaNewMath-Roman] [lbmr]
+\definefilesynonym [LucidaNewMath-Demibold] [lbmd]
+\definefilesynonym [LucidaNewMath-DemiItalic] [lbmdi]
+\definefilesynonym [LucidaNewMath-Italic] [lbmi]
+\definefilesynonym [LucidaNewMath-Symbol] [lbms]
+\definefilesynonym [LucidaNewMath-Symbol-Demi] [lbmsd]
+
\ No newline at end of file diff --git a/tex/context/base/font-eul.tex b/tex/context/base/font-eul.tex index 8d356fbbe..90e1da267 100644 --- a/tex/context/base/font-eul.tex +++ b/tex/context/base/font-eul.tex @@ -1,173 +1,174 @@ -%D \module -%D [ file=font-eul, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=Euler, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] - -%D The Euler Fonts are designed by Herman Zapf and can be -%D used with the Concrete Fonts defined elsewhere. - -\definebodyfont [12pt] [mm] % scaled \magstep1 - [mi=eurm10 at 12pt, - ex=euex10 at 12pt, - ma=euex10 at 12pt, - mb=eusm10 at 12pt, - mc=eufm10 at 12pt] - -\definebodyfont [11pt] [mm] % scaled \magstephalf - [mi=eurm10 at 11pt, - ex=euex10 at 11pt, - ma=euex10 at 11pt, - mb=eusm10 at 11pt, - mc=eufm10 at 11pt] - -\definebodyfont [10pt] [mm] - [mi=eurm10, - ex=euex10, - ma=euex10, - mb=eusm10, - mc=eufm10] - -\definebodyfont [9pt] [mm] - [mi=eurm10 at 9pt, - ex=euex10 at 9pt, - ma=euex10 at 9pt, - mb=eusm10 at 9pt, - mc=eufm10 at 9pt] - -\definebodyfont [8pt] [mm] - [mi=eurm7 at 8pt, - ex=euex10 at 8pt, - ma=euex10 at 8pt, - mb=eusm7 at 8pt, - mc=eufm7 at 8pt] - -\definebodyfont [7pt] [mm] - [mi=eurm7, - ex=euex10 at 7pt, - ma=euex10 at 7pt, - mb=eusm7, - mc=eufm7] - -\definebodyfont [6pt] [mm] - [mi=eurm7 at 6pt, - ex=euex10 at 6pt, - ma=euex10 at 6pt, - mb=eusm7 at 6pt, - mc=eufm7 at 6pt] - -\definebodyfont [5pt] [mm] - [mi=eurm5, - ex=euex10 at 5pt, - ma=euex10 at 5pt, - mb=eusm5, - mc=eufm5] - -%D Here we copy part of the files that are distributed along -%D with these fonts, but first we define some extra families. - -\let\exfam=\mafam % was A -\let\smfam=\mbfam % was 8 -\let\fmfam=\mcfam % was 9 - -\let\hexexfam=\hexmafam -\let\hexsmfam=\hexmbfam -\let\hexfmfam=\hexmcfam - -%D Now we're up to the redefinitions. - -\mathcode`0="7130 -\mathcode`1="7131 -\mathcode`2="7132 -\mathcode`3="7133 -\mathcode`4="7134 -\mathcode`5="7135 -\mathcode`6="7136 -\mathcode`7="7137 -\mathcode`8="7138 -\mathcode`9="7139 - -\mathchardef\intop ="1\hexexfam 52 -\mathchardef\ointop ="1\hexexfam 48 -\mathchardef\coprod ="1\hexexfam 60 -\mathchardef\prod ="1\hexexfam 51 -\mathchardef\sum ="1\hexexfam 50 -\mathchardef\braceld ="\hexexfam 7A -\mathchardef\bracerd ="\hexexfam 7B -\mathchardef\bracelu ="\hexexfam 7C -\mathchardef\braceru ="\hexexfam 7D -\mathchardef\infty ="0\hexexfam 31 - -\mathchardef\nearrow ="3\hexexfam 25 -\mathchardef\searrow ="3\hexexfam 26 -\mathchardef\nwarrow ="3\hexexfam 2D -\mathchardef\swarrow ="3\hexexfam 2E -\mathchardef\Leftrightarrow ="3\hexexfam 2C -\mathchardef\Leftarrow ="3\hexexfam 28 -\mathchardef\Rightarrow ="3\hexexfam 29 -\mathchardef\leftrightarrow ="3\hexexfam 24 -\mathchardef\leftarrow ="3\hexexfam 20 -\mathchardef\rightarrow ="3\hexexfam 21 - -\let\gets =\leftarrow -\let\to =\rightarrow - -\mathcode`\^^W ="3\hexexfam 24 -\mathcode`\^^X ="3\hexexfam 20 -\mathcode`\^^Y ="3\hexexfam 21 -\mathcode`\^^K ="3\hexexfam 22 -\mathcode`\^^A ="3\hexexfam 23 - -\def\uparrow {\delimiter"3\hexexfam 22378 } -\def\downarrow {\delimiter"3\hexexfam 23379 } -\def\updownarrow {\delimiter"3\hexexfam 6C33F } -\def\Uparrow {\delimiter"3\hexexfam 2A37E } -\def\Downarrow {\delimiter"3\hexexfam 2B37F } -\def\Updownarrow {\delimiter"3\hexexfam 6D377 } - -\mathchardef\leftharpoonup ="3\hexexfam 18 -\mathchardef\leftharpoondown ="3\hexexfam 19 -\mathchardef\rightharpoonup ="3\hexexfam 1A -\mathchardef\rightharpoondown ="3\hexexfam 1B - -\mathcode`+="2\hexfmfam 2B -\mathcode`-="2\hexfmfam 2D -\mathcode`!="0\hexfmfam 21 -\mathcode`(="4\hexfmfam 28 \delcode`(="\hexfmfam 28300 -\mathcode`)="5\hexfmfam 29 \delcode`)="\hexfmfam 29301 -\mathcode`[="4\hexfmfam 5B \delcode`[="\hexfmfam 5B302 -\mathcode`]="5\hexfmfam 5D \delcode`]="\hexfmfam 5D303 -\mathcode`=="3\hexfmfam 3D - -\mathchardef\Relbar ="303D % we need the old = to match \Arrows -\mathchardef\Gamma ="7100 -\mathchardef\Delta ="7101 -\mathchardef\Theta ="7102 -\mathchardef\Lambda ="7103 -\mathchardef\Xi ="7104 -\mathchardef\Pi ="7105 -\mathchardef\Sigma ="7106 -\mathchardef\Upsilon ="7107 -\mathchardef\Phi ="7108 -\mathchardef\Psi ="7109 -\mathchardef\Omega ="710A - -\let\varsigma =\sigma % Euler doesn't have these -\let\varrho =\rho % Euler doesn't have these -\mathchardef\aleph ="0D40 - -\def\rbrace {\delimiter"5\hexsmfam 67A09 } \let\}=\rbrace -\def\lbrace {\delimiter"4\hexsmfam 66A08 } \let\{=\lbrace - -\mathchardef\leq ="3\hexsmfam 14 \let\le=\leq -\mathchardef\geq ="3\hexsmfam 15 \let\ge=\geq -\mathchardef\Re ="0\hexsmfam 3C -\mathchardef\Im ="0\hexsmfam 3D - -\def\vert {\delimiter"\hexsmfam 6A30C } -\def\backslash {\delimiter"\hexsmfam 6E30F } - -\endinput +%D \module
+%D [ file=font-eul,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Euler,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+%D The Euler Fonts are designed by Herman Zapf and can be
+%D used with the Concrete Fonts defined elsewhere.
+
+\definebodyfont [12pt] [mm] % scaled \magstep1
+ [mi=eurm10 at 12pt,
+ ex=euex10 at 12pt,
+ ma=euex10 at 12pt,
+ mb=eusm10 at 12pt,
+ mc=eufm10 at 12pt]
+
+\definebodyfont [11pt] [mm] % scaled \magstephalf
+ [mi=eurm10 at 11pt,
+ ex=euex10 at 11pt,
+ ma=euex10 at 11pt,
+ mb=eusm10 at 11pt,
+ mc=eufm10 at 11pt]
+
+\definebodyfont [10pt] [mm]
+ [mi=eurm10,
+ ex=euex10,
+ ma=euex10,
+ mb=eusm10,
+ mc=eufm10]
+
+\definebodyfont [9pt] [mm]
+ [mi=eurm10 at 9pt,
+ ex=euex10 at 9pt,
+ ma=euex10 at 9pt,
+ mb=eusm10 at 9pt,
+ mc=eufm10 at 9pt]
+
+\definebodyfont [8pt] [mm]
+ [mi=eurm7 at 8pt,
+ ex=euex10 at 8pt,
+ ma=euex10 at 8pt,
+ mb=eusm7 at 8pt,
+ mc=eufm7 at 8pt]
+
+\definebodyfont [7pt] [mm]
+ [mi=eurm7,
+ ex=euex10 at 7pt,
+ ma=euex10 at 7pt,
+ mb=eusm7,
+ mc=eufm7]
+
+\definebodyfont [6pt] [mm]
+ [mi=eurm7 at 6pt,
+ ex=euex10 at 6pt,
+ ma=euex10 at 6pt,
+ mb=eusm7 at 6pt,
+ mc=eufm7 at 6pt]
+
+\definebodyfont [5pt] [mm]
+ [mi=eurm5,
+ ex=euex10 at 5pt,
+ ma=euex10 at 5pt,
+ mb=eusm5,
+ mc=eufm5]
+
+%D Here we copy part of the files that are distributed along
+%D with these fonts, but first we define some extra families.
+
+\let\exfam=\mafam % was A
+\let\smfam=\mbfam % was 8
+\let\fmfam=\mcfam % was 9
+
+\let\hexexfam=\hexmafam
+\let\hexsmfam=\hexmbfam
+\let\hexfmfam=\hexmcfam
+
+%D Now we're up to the redefinitions.
+
+\mathcode`0="7130
+\mathcode`1="7131
+\mathcode`2="7132
+\mathcode`3="7133
+\mathcode`4="7134
+\mathcode`5="7135
+\mathcode`6="7136
+\mathcode`7="7137
+\mathcode`8="7138
+\mathcode`9="7139
+
+\mathchardef\intop ="1\hexexfam 52
+\mathchardef\ointop ="1\hexexfam 48
+\mathchardef\coprod ="1\hexexfam 60
+\mathchardef\prod ="1\hexexfam 51
+\mathchardef\sum ="1\hexexfam 50
+\mathchardef\braceld ="\hexexfam 7A
+\mathchardef\bracerd ="\hexexfam 7B
+\mathchardef\bracelu ="\hexexfam 7C
+\mathchardef\braceru ="\hexexfam 7D
+\mathchardef\infty ="0\hexexfam 31
+
+\mathchardef\nearrow ="3\hexexfam 25
+\mathchardef\searrow ="3\hexexfam 26
+\mathchardef\nwarrow ="3\hexexfam 2D
+\mathchardef\swarrow ="3\hexexfam 2E
+\mathchardef\Leftrightarrow ="3\hexexfam 2C
+\mathchardef\Leftarrow ="3\hexexfam 28
+\mathchardef\Rightarrow ="3\hexexfam 29
+\mathchardef\leftrightarrow ="3\hexexfam 24
+\mathchardef\leftarrow ="3\hexexfam 20
+\mathchardef\rightarrow ="3\hexexfam 21
+
+\let\gets =\leftarrow
+\let\to =\rightarrow
+
+\mathcode`\^^W ="3\hexexfam 24
+\mathcode`\^^X ="3\hexexfam 20
+\mathcode`\^^Y ="3\hexexfam 21
+\mathcode`\^^K ="3\hexexfam 22
+\mathcode`\^^A ="3\hexexfam 23
+
+\def\uparrow {\delimiter"3\hexexfam 22378 }
+\def\downarrow {\delimiter"3\hexexfam 23379 }
+\def\updownarrow {\delimiter"3\hexexfam 6C33F }
+\def\Uparrow {\delimiter"3\hexexfam 2A37E }
+\def\Downarrow {\delimiter"3\hexexfam 2B37F }
+\def\Updownarrow {\delimiter"3\hexexfam 6D377 }
+
+\mathchardef\leftharpoonup ="3\hexexfam 18
+\mathchardef\leftharpoondown ="3\hexexfam 19
+\mathchardef\rightharpoonup ="3\hexexfam 1A
+\mathchardef\rightharpoondown ="3\hexexfam 1B
+
+\mathcode`+="2\hexfmfam 2B
+\mathcode`-="2\hexfmfam 2D
+\mathcode`!="0\hexfmfam 21
+\mathcode`(="4\hexfmfam 28 \delcode`(="\hexfmfam 28300
+\mathcode`)="5\hexfmfam 29 \delcode`)="\hexfmfam 29301
+\mathcode`[="4\hexfmfam 5B \delcode`[="\hexfmfam 5B302
+\mathcode`]="5\hexfmfam 5D \delcode`]="\hexfmfam 5D303
+\mathcode`=="3\hexfmfam 3D
+
+\mathchardef\Relbar ="303D % we need the old = to match \Arrows
+\mathchardef\Gamma ="7100
+\mathchardef\Delta ="7101
+\mathchardef\Theta ="7102
+\mathchardef\Lambda ="7103
+\mathchardef\Xi ="7104
+\mathchardef\Pi ="7105
+\mathchardef\Sigma ="7106
+\mathchardef\Upsilon ="7107
+\mathchardef\Phi ="7108
+\mathchardef\Psi ="7109
+\mathchardef\Omega ="710A
+
+\let\varsigma =\sigma % Euler doesn't have these
+\let\varrho =\rho % Euler doesn't have these
+\mathchardef\aleph ="0D40
+
+\def\rbrace {\delimiter"5\hexsmfam 67A09 } \let\}=\rbrace
+\def\lbrace {\delimiter"4\hexsmfam 66A08 } \let\{=\lbrace
+
+\mathchardef\leq ="3\hexsmfam 14 \let\le=\leq
+\mathchardef\geq ="3\hexsmfam 15 \let\ge=\geq
+\mathchardef\Re ="0\hexsmfam 3C
+\mathchardef\Im ="0\hexsmfam 3D
+
+\def\vert {\delimiter"\hexsmfam 6A30C }
+\def\backslash {\delimiter"\hexsmfam 6E30F }
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-ibm.tex b/tex/context/base/font-ibm.tex index 95669d9d2..6a9fe35cd 100644 --- a/tex/context/base/font-ibm.tex +++ b/tex/context/base/font-ibm.tex @@ -1,107 +1,107 @@ -%D \module -%D [ file=font-ibm, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=IBM Keys, -%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. - -%D This module activates the \kap{IBM PC} high \ASCII\ -%D characters, such as ‰ and á. - -\unprotect - -\catcode`\‰=\@@active \unexpanded\def‰{\"e} -\catcode`\‚=\@@active \unexpanded\def‚{\'e} -\catcode`\Š=\@@active \unexpanded\defŠ{\`e} -\catcode`\ˆ=\@@active \unexpanded\defˆ{\^e} - -\catcode`\„=\@@active \unexpanded\def„{\"a} -\catcode`\ =\@@active \unexpanded\def {\'a} -\catcode`\…=\@@active \unexpanded\def…{\`a} -\catcode`\ƒ=\@@active \unexpanded\defƒ{\^a} - -\catcode`\”=\@@active \unexpanded\def”{\"o} -\catcode`\¢=\@@active \unexpanded\def¢{\'o} -\catcode`\•=\@@active \unexpanded\def•{\`o} -\catcode`\“=\@@active \unexpanded\def“{\^o} - -\catcode`\‹=\@@active \unexpanded\def‹{\"\dotlessi} -\catcode`\¡=\@@active \unexpanded\def¡{\'\dotlessi} -\catcode`\=\@@active \unexpanded\def{\`\dotlessi} -\catcode`\Œ=\@@active \unexpanded\defŒ{\^\dotlessi} - -\catcode`\=\@@active \unexpanded\def{\"u} -\catcode`\£=\@@active \unexpanded\def£{\'u} -\catcode`\—=\@@active \unexpanded\def—{\`u} -\catcode`\–=\@@active \unexpanded\def–{\^u} - -\catcode`\=\@@active \unexpanded\def{\'E} -\catcode`\Ž=\@@active \unexpanded\defŽ{\"A} -\catcode`\š=\@@active \unexpanded\defš{\"U} - -\catcode`\‡=\@@active \unexpanded\def‡{\c c} -\catcode`\€=\@@active \unexpanded\def€{\c C} - -\catcode`\¤=\@@active \unexpanded\def¤{\~n} - -\catcode`\á=\@@active \unexpanded\defá{\SS} - -\catcode`\®=\@@active -\catcode`\¯=\@@active - -\unexpanded\def®{\ifvmode\leavevmode\fi\leftguillemot\prewordbreak} -\unexpanded\def¯{\prewordbreak\rightguillemot} - -%D The next section will be changed as soon as we get grip on -%D the other encodings. -%D -%D \starttypen -%D \appendtoks\lccode`\"=0\to\everysanitize -%D -%D \appendtoks\lccode`‰=`e\to\everysanitize -%D \appendtoks\lccode`‚=`e\to\everysanitize -%D \appendtoks\lccode`Š=`e\to\everysanitize -%D \appendtoks\lccode`ˆ=`e\to\everysanitize -%D -%D \appendtoks\lccode`„=`a\to\everysanitize -%D \appendtoks\lccode` =`a\to\everysanitize -%D \appendtoks\lccode`…=`a\to\everysanitize -%D \appendtoks\lccode`ƒ=`a\to\everysanitize -%D -%D \appendtoks\lccode`”=`o\to\everysanitize -%D \appendtoks\lccode`¢=`o\to\everysanitize -%D \appendtoks\lccode`•=`o\to\everysanitize -%D \appendtoks\lccode`“=`o\to\everysanitize -%D -%D \appendtoks\lccode`‹=`i\to\everysanitize -%D \appendtoks\lccode`¡=`i\to\everysanitize -%D \appendtoks\lccode`=`i\to\everysanitize -%D \appendtoks\lccode`Œ=`i\to\everysanitize -%D -%D \appendtoks\lccode`=`u\to\everysanitize -%D \appendtoks\lccode`£=`u\to\everysanitize -%D \appendtoks\lccode`—=`u\to\everysanitize -%D \appendtoks\lccode`–=`u\to\everysanitize -%D -%D \appendtoks\lccode`=`E\to\everysanitize -%D \appendtoks\lccode`Ž=`A\to\everysanitize -%D \appendtoks\lccode`š=`U\to\everysanitize -%D -%D \appendtoks\lccode`‡=`c\to\everysanitize -%D \appendtoks\lccode`€=`c\to\everysanitize -%D \appendtoks\lccode`¤=`n\to\everysanitize -%D \appendtoks\lccode`á=`s\to\everysanitize -%D -%D \appendtoks\lccode`®=`<\to\everysanitize -%D \appendtoks\lccode`¯=`<\to\everysanitize -%D \stoptypen - -\protect - -\endinput +%D \module
+%D [ file=font-ibm,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=IBM Keys,
+%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.
+
+%D This module activates the \kap{IBM PC} high \ASCII\
+%D characters, such as ‰ and á.
+
+\unprotect
+
+\catcode`\‰=\@@active \unexpanded\def‰{\"e}
+\catcode`\‚=\@@active \unexpanded\def‚{\'e}
+\catcode`\Š=\@@active \unexpanded\defŠ{\`e}
+\catcode`\ˆ=\@@active \unexpanded\defˆ{\^e}
+
+\catcode`\„=\@@active \unexpanded\def„{\"a}
+\catcode`\ =\@@active \unexpanded\def {\'a}
+\catcode`\…=\@@active \unexpanded\def…{\`a}
+\catcode`\ƒ=\@@active \unexpanded\defƒ{\^a}
+
+\catcode`\”=\@@active \unexpanded\def”{\"o}
+\catcode`\¢=\@@active \unexpanded\def¢{\'o}
+\catcode`\•=\@@active \unexpanded\def•{\`o}
+\catcode`\“=\@@active \unexpanded\def“{\^o}
+
+\catcode`\‹=\@@active \unexpanded\def‹{\"\dotlessi}
+\catcode`\¡=\@@active \unexpanded\def¡{\'\dotlessi}
+\catcode`\=\@@active \unexpanded\def{\`\dotlessi}
+\catcode`\Œ=\@@active \unexpanded\defŒ{\^\dotlessi}
+
+\catcode`\=\@@active \unexpanded\def{\"u}
+\catcode`\£=\@@active \unexpanded\def£{\'u}
+\catcode`\—=\@@active \unexpanded\def—{\`u}
+\catcode`\–=\@@active \unexpanded\def–{\^u}
+
+\catcode`\=\@@active \unexpanded\def{\'E}
+\catcode`\Ž=\@@active \unexpanded\defŽ{\"A}
+\catcode`\š=\@@active \unexpanded\defš{\"U}
+
+\catcode`\‡=\@@active \unexpanded\def‡{\c c}
+\catcode`\€=\@@active \unexpanded\def€{\c C}
+
+\catcode`\¤=\@@active \unexpanded\def¤{\~n}
+
+\catcode`\á=\@@active \unexpanded\defá{\SS}
+
+\catcode`\®=\@@active
+\catcode`\¯=\@@active
+
+\unexpanded\def®{\ifvmode\leavevmode\fi\leftguillemot\prewordbreak}
+\unexpanded\def¯{\prewordbreak\rightguillemot}
+
+%D The next section will be changed as soon as we get grip on
+%D the other encodings.
+%D
+%D \starttypen
+%D \appendtoks\lccode`\"=0\to\everysanitize
+%D
+%D \appendtoks\lccode`‰=`e\to\everysanitize
+%D \appendtoks\lccode`‚=`e\to\everysanitize
+%D \appendtoks\lccode`Š=`e\to\everysanitize
+%D \appendtoks\lccode`ˆ=`e\to\everysanitize
+%D
+%D \appendtoks\lccode`„=`a\to\everysanitize
+%D \appendtoks\lccode` =`a\to\everysanitize
+%D \appendtoks\lccode`…=`a\to\everysanitize
+%D \appendtoks\lccode`ƒ=`a\to\everysanitize
+%D
+%D \appendtoks\lccode`”=`o\to\everysanitize
+%D \appendtoks\lccode`¢=`o\to\everysanitize
+%D \appendtoks\lccode`•=`o\to\everysanitize
+%D \appendtoks\lccode`“=`o\to\everysanitize
+%D
+%D \appendtoks\lccode`‹=`i\to\everysanitize
+%D \appendtoks\lccode`¡=`i\to\everysanitize
+%D \appendtoks\lccode`=`i\to\everysanitize
+%D \appendtoks\lccode`Œ=`i\to\everysanitize
+%D
+%D \appendtoks\lccode`=`u\to\everysanitize
+%D \appendtoks\lccode`£=`u\to\everysanitize
+%D \appendtoks\lccode`—=`u\to\everysanitize
+%D \appendtoks\lccode`–=`u\to\everysanitize
+%D
+%D \appendtoks\lccode`=`E\to\everysanitize
+%D \appendtoks\lccode`Ž=`A\to\everysanitize
+%D \appendtoks\lccode`š=`U\to\everysanitize
+%D
+%D \appendtoks\lccode`‡=`c\to\everysanitize
+%D \appendtoks\lccode`€=`c\to\everysanitize
+%D \appendtoks\lccode`¤=`n\to\everysanitize
+%D \appendtoks\lccode`á=`s\to\everysanitize
+%D
+%D \appendtoks\lccode`®=`<\to\everysanitize
+%D \appendtoks\lccode`¯=`<\to\everysanitize
+%D \stoptypen
+
+\protect
+
+\endinput
diff --git a/tex/context/base/font-ini.tex b/tex/context/base/font-ini.tex index 7c28203ef..d9ee543b0 100644 --- a/tex/context/base/font-ini.tex +++ b/tex/context/base/font-ini.tex @@ -1,2629 +1,2664 @@ -%D \module -%D [ file=font-ini, -%D version=1997.11.15, -%D title=\CONTEXT\ Font 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 Font Macros (ini)} - -\unprotect - -\startmessages dutch library: fonts - title: korps - 1: codering --, groepeer zonodig - 2: variant -- wordt geladen - 3: onbekende variant -- - 4: korps -- is niet gedefinieerd - 5: stijl -- is niet gedefinieerd - 6: -- wordt geladen - 7: onbekend formaat -- - 8: stijl -- gedefinieerd -\stopmessages - -\startmessages english library: fonts - title: bodyfont - 1: coding --, one could use grouping - 2: variant -- is loaded - 3: unknown variant -- - 4: bodyfont -- is not defined - 5: style -- is not defined - 6: -- is loaded - 7: unknown format -- - 8: style -- defined -\stopmessages - -\startmessages german library: fonts - title: Fliesstext - 1: Kodierung --, Gruppierung moeglich - 2: Variante -- ist geladen - 3: Unbekannte Variante -- - 4: Fliesstext -- ist nicht definiert - 5: Stil -- ist nicht definiert - 6: -- ist geladen - 7: unbekanntes Format -- - 8: Stil -- definiert -\stopmessages - -%D This module is one of the oldest modules of \CONTEXT. The -%D macros below evolved out of the \PLAIN\ \TEX\ macros and -%D therefore use a similar naming scheme (\type{\rm}, -%D \type{\bf}, etc). This module grew out of our needs. We -%D started with the \PLAIN\ \TEX\ definitions, generalized the -%D underlaying macros, and extended those to a level at which -%D probably no one will ever recognize them. -%D -%D One important characteristic of the font mechanism presented -%D here is the postponing of font loading. This makes it -%D possible to distribute \type{fmt} files without bothering -%D about the specific breed of \type{tfm} files. -%D -%D Another feature implemented here is the massive switching -%D from roman to {\ss sans serif}, {\tt teletype} or else. This -%D means one doesn't have to take care of all kind of relations -%D between fonts. - -%D \macros -%D {rm,ss,tt,hw,cg} -%D -%D Fonts are defined in separate files. When we define a font, -%D we distinguish between several styles. In most cases we will -%D use: -%D -%D \startregelcorrectie -%D \starttabel[|l||] -%D \HL -%D \NC roman \NC \type{\rm} \NC\FR -%D \NC sansserif \NC \type{\ss} \NC\MR -%D \NC type \NC \type{\tt} \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D The number of styles is not limited to these three. When -%D using Lucida Bright we can for instance also define: -%D -%D \startregelcorrectie -%D \starttabel[|l||] -%D \HL -%D \NC handwritten \NC \type{\hw} \NC\FR -%D \NC calligraphic \NC \type{\cg} \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D Anyone who feels the need, can define additional ones, like -%D -%D \startregelcorrectie -%D \starttabel[|l||] -%D \HL -%D \NC faxfont \NC \type{\ff} \NC\FR -%D \NC blackboard \NC \type{\bb} \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D Or even -%D -%D \startregelcorrectie -%D \starttabel[|l||] -%D \HL -%D \NC hebrew \NC \type{\hb} \NC\SR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D Styles are grouped in font sets. At the moment there are -%D three main sets defined: -%D -%D \startregelcorrectie -%D \starttabel[|l|l||] -%D \HL -%D \NC Computer Modern Roman \NC Knuth \NC \type{cmr} \NC\FR -%D \NC Lucida Bright \NC Bigelow \& Holmes \NC \type{lbr} \NC\MR -%D \NC Standard Postscript Fonts \NC Adobe \NC \type{pos} \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D There are also some Computer Modern Roman alternatives: -%D -%D \startregelcorrectie -%D \starttabel[|l|l||] -%D \HL -%D \NC Computer Modern Roman \NC Knuth \& Sauter \NC \type{sau} \NC\FR -%D \NC Euler fonts \NC Zapf \NC \type{eul} \NC\MR -%D \NC Computer Modern Concrete \NC Knuth \& Zapf \NC \type{con} \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D All these definitions are ordered in files with names like -%D \type{font-cmr} and \type{font-pos}, where the last three -%D characters specify the name as known to \CONTEXT. -%D -%D Within such a font set (\type{cmr}) and style (\type{\rm}) -%D we can define a number of text font alternatives: -%D -%D \startregelcorrectie -%D \starttabel[|l||] -%D \HL -%D \NC typeface \NC \type{\tf} \NC\FR -%D \NC boldface \NC \type{\bf} \NC\MR -%D \NC slanted \NC \type{\sl} \NC\MR -%D \NC italic \NC \type{\it} \NC\MR -%D \NC boldslanted \NC \type{\bs} \NC\MR -%D \NC bolditalic \NC \type{\bi} \NC\MR -%D \NC smallcaps \NC \type{\sc} \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie - -%D The more primitive is (still) predefined: -%D -%D \startregelcorrectie -%D \starttabel[|l||] -%D \HL -%D \NC oldstyle \NC \type{\os} \NC\SR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D The availability of these alternatives depends on the -%D completeness of a font family and of course the definitions -%D in the font files. -%D -%D But let's not forget math. In addition to the previous \TEX\ -%D families (the mysterious \type{\fam}'s) we've got some more: -%D -%D \startregelcorrectie -%D \starttabel[|l||] -%D \HL -%D \NC Math Roman \NC \type{\mr} \NC\FR -%D \NC Math Italic \NC \type{\mi} \NC\MR -%D \NC Math Symbol \NC \type{\sy} \NC\MR -%D \NC Math Extra \NC \type{\ex} \NC\MR -%D \NC Math A \NC \type{\ma} \NC\MR -%D \NC Math B \NC \type{\mb} \NC\MR -%D \NC Math C \NC \type{\mc} \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D Users can call for specific fonts in many ways. Switches to -%D other typefaces, like the switch from normal to bold, are as -%D intuitive as possible, which means that all dependant fonts -%D also switch. One can imagine that this takes quite some -%D processing time. -%D -%D Internally fonts are stored as combination of size, style -%D and alternative, e.g. \type{12pt}+\type{\ss}+\type{\bf}. -%D Users are not confronted with sizes, but use the style or -%D style+alternative to activate them. -%D -%D During the definition of a bodyfont one can also declare the -%D available larger alternatives: -%D -%D \starttypen -%D \tf \tfa \tfb \tfc ... -%D \bf \bfa \bfb \bfc ... -%D \sl \sla \slb \slc ... -%D \stoptypen -%D -%D The smaller ones are automatically supplied and derived from -%D the the bodyfont environment. -%D -%D \starttypen -%D \tfx \tfxx -%D \bfx \bfxx -%D \slx \slxx -%D \stoptypen -%D -%D There are only two smaller alternatives per style. The -%D larger alternatives on the other hand have no limitations. -%D -%D These larger alternatives are mostly used in chapter and -%D section titles or on title pages. When one switches to a -%D larger alternative, the bold an other ones automatically -%D adapt themselves: -%D -%D \startbuffer -%D \tfd Hi \bf there\sl, here \tfb I \bf am -%D \stopbuffer -%D -%S \startsmaller -%D \typebuffer -%S \stopsmaller -%D -%D therefore becomes: -%D -%D \startvoorbeeld -%D \haalbuffer -%D \stopvoorbeeld -%D -%D Maybe this mechanism isn't always as logic, but as said -%D before, we tried to make it as intuitive as possible. -%D -%D So a specific kind of glyph can be characterized by: -%D -%D \startsmaller -%D family (cmr) + bodyfont (12pt) + style (rm) + alternative (bf) + size (a) -%D \stopsmaller -%D -%D The last component (the size) is optional. -%D -%D We introduced \type{\tf} as command to call for the current -%D normally sized typeface. This commands results in roman, -%D sans serif, teletype or whatever style is in charge. Such -%D rather massive switches of style sometimes take more -%D processing time than comfortable. Of course there is a -%D workaround for this: we can call fonts directly by means of -%D commands like: -%D -%D \starttypen -%D \rmtf \sssl \tttf \rmbsa -%D \stoptypen -%D -%D One should realize that this fast calls have limitations, -%D they lack for instance automatic super- and subscript -%D support. -%D -%D This leaves us two more commands: \type{\tx} and -%D \type{\txx}. These activate a smaller and even more smaller -%D font than the current one and adapt themselves to the -%D current alternative, so when \type{\bf} is active, -%D \type{\tx} gives a smaller boldface, which in turn can be -%D called directly by \type{\bfx}. -%D -%D These two smaller alternatives are specified by the bodyfont -%D environment and therefore not necessarily have similar sizes -%D as \type{\scriptsize} and \type{\scriptscriptsize}. The main -%D reason for this incompatibility (which can easily be undone) -%D lays in the fact that we often want a bit bigger characters -%D than in math mode. In \CONTEXT\ for instance the \type{\tx} -%D and \type{\txx} commands are used for surrogate -%D \kap{smallcaps} which support both nesting and alternatives, -%D like in {\bf\kap{a \kap{small} world}}, which was typeset by -%D -%D \starttypen -%D \bf\kap{a \kap{small} world} -%D \stoptypen -%D -%D And compare $\rm \scriptstyle THIS$ with the slightly larger -%D \kap{THIS}: \ruledhbox{$\rm \scriptstyle\ scriptstyle THIS$} -%D or \ruledhbox{\kap{THIS x style}} makes a big difference. - -%D \macros -%D {mf} -%D -%D Math fonts are a species in their own. They are tightly -%D hooked into smaller and even smaller ones of similar breed -%D to form a tight family. Let's first see how these are -%D related: -%D -%D \startbuffer -%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\rm 6x^2$ -%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\rm 6x^2$ -%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\tf 6x^2$ -%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\tf 6x^2$ -%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\bf 6x^2$ -%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\bf 6x^2$ -%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\sl 6x^2$ -%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\sl 6x^2$ -%D \stopbuffer -%D -%D \typebuffer -%D -%D Gives both an expected and unexpected result: -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld -%D -%D We see here that the character shapes change accordingly to -%D the current family, but that the symbols are always typeset -%D in the font assigned to \type{\fam0}. -%D -%D \startbuffer -%D $\tf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$ -%D $\bf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$ -%D $\sl\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$ -%D $\bs\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$ -%D $\it\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$ -%D $\bi\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$ -%D \stopbuffer -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld -%D -%D In this example we see a new command \type{\mf} surface -%D which means as much as {\em math font}. This commands -%D reactivates the last font alternative and therefore equals -%D \type{\bf}, \type{\sl} etc. but by default it equals -%D \type{\tf}: - -\def\mf{\tf} - -%D The previous example was typeset saying: -%D -%D \typebuffer -%D -%D Beware: the exact location of \type{\mf} is not that -%D important, we could as well has said -%D -%D \startbuffer -%D $\bf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = \mf 6x^2$ -%D \stopbuffer -%D -%D This is due to the way \TEX\ handles fonts in math mode. -%D -%D Of course we'll have to redefine \type{\mf} every time we -%D change the current \type{\fam}. - -%D \macros -%D {mbox,enablembox,mathop} -%D -%D Now how can we put this to use? Will the next sequence -%D give the desired result? -%D -%D \startbuffer -%D $\bf x^2 + \hbox{\mf whatever} + \sin(2x)$ -%D \stopbuffer -%D -%D \typebuffer -%D -%D It won't! -%D -%D \startvoorbeeld -%D \let\mathop=\normalmathop \haalbuffer -%D \stopvoorbeeld -%D -%D The reason for this is that \type{\sin} is defined as: -%D -%D \starttypen -%D \def\sin{\mathop{\rm sin}\nolimits} -%D \stoptypen -%D -%D We can fix this by defining - -\let\normalmathop=\mathop - -\def\mathop% - {\normalmathop - \bgroup - \let\rm=\mf - \let\next=} - -%D Of course this can be fixed, if not by a very dirty trick: -%D redefining the \TEX\ primitive \type{\hbox}: -%D -%D \starttypen -%D \let\normalhbox=\hbox -%D -%D \def\hbox% -%D {\ifmmode\mbox\else\normalhbox\fi} -%D \stoptypen -%D -%D With -%D -%D \starttypen -%D \def\mbox#1#% -%D {\normalhbox#1\bgroup\mf\let\next=} -%D \stoptypen -%D -%D or more robust, that is, also accepting \type{\hbox\bgroup}: -%D -%D \starttypen -%D \def\mbox% -%D {\normalhbox\bgroup\mf -%D \dowithnextbox{\box\nextbox\egroup}% -%D \normalhbox} -%D \stoptypen -%D -%D And now: -%D -%D \startbuffer -%D $\bf x^2 + \hbox{whatever} + \sin(2x)$ -%D \stopbuffer -%D -%D \typebuffer -%D -%D Indeed gives: -%D -%D \startvoorbeeld -%D \enablembox\haalbuffer -%D \stopvoorbeeld -%D -%D But, do we want this kind of trickery to be activated? No, -%D simply because we cannot be sure of incompatibilties, -%D although for instance unboxing goes ok. Therefore we -%D introduce: - -\def\normalmbox% - {\normalhbox\bgroup\mf - \dowithnextbox{\box\nextbox\egroup}\normalhbox} - -\def\mbox% - {\ifmmode\normalmbox\else\normalhbox\fi} - -\def\enablembox% - {\appendtoks - \let\normalhbox=\hbox - \let\hbox=\mbox - \to\everymath} - -%D So in fact one can enable feature if needed. I would say: -%D go along, but use grouping if needed! - -%D \macros -%D {mrfam,mifam,syfam,exfam, -%D bsfam,bifam,scfam,tffam, -%D mafam,mbfam,msfam} -%D -%D After this short mathematical excursion, we enter the world -%D of fonts and fontswitching. We start with something very -%D \TEX: \type{\fam} specified font families. \TEX\ uses -%D families for managing fonts in math mode. Such a family has -%D three members: text, script and scriptscript: $x^{y^z}$. In -%D \CONTEXT\ we take a bit different approach than \PLAIN\ -%D \TEX\ does. \PLAIN\ \TEX\ needs at least four families for -%D typesetting math. We use those but give them symbolic names. - -\chardef\mrfam=0 % 0 (Plain TeX) Math Roman -\chardef\mifam=1 % 1 (Plain TeX) Math Italic -\chardef\syfam=2 % 2 (Plain TeX) Math Symbol -\chardef\exfam=3 % 3 (Plain TeX) Math Extra - -%D \PLAIN\ \TEX\ also defines families for {\it italic}, {\sl -%D slanted} and {\bf bold} typefaces, so we don't have to -%D define them here. -%D -%D \starttypen -%D \itfam % 4 (Plain TeX) Italic -%D \slfam % 5 (Plain TeX) Slanted -%D \bffam % 6 (Plain TeX) Boldface -%D \stoptypen -%D -%D Family~7 in \PLAIN\ \TEX\ is not used in \CONTEXT, because -%D we do massive switches from roman to sans serif, teletype or -%D other faces. -%D -%D \starttypen -%D \ttfam % 7 (Plain TeX) can be reused! -%D \stoptypen -%D -%D We define ourselves some more families for {\bs bold -%D slanted}, {\bi bold italic} and {\sc Small Caps}, so -%D we can use them in math mode too. Instead of separate -%D families for {\ss sans serif} and \type{teletype} we use the -%D more general \type{\tffam}, which stands for typeface. - -\newfam\bsfam % 8 (ConTeXt) BoldSlanted -\newfam\bifam % 9 (ConTeXt) BoldItalic -\newfam\scfam % A (ConTeXt) SmallCaps -\newfam\tffam % B (ConTeXt) TypeFace - -%D Because Taco needs a few more math families, we reuse -%D family~7 for all those typefaces that have no related -%D family, and therefore are grouped into one. - -\let\nnfam\ttfam % 7 (ReUsed) NoName - -%D Normally \type{\mrfam} equals \type{\tffam}, but a more -%D distinctive alternatives are possible, for instance the -%D Euler and Concrete Typefaces. -%D -%D After having defined all those in nature non||mathematical -%D families, we define ourselves some real math ones. These are -%D needed for the \AMS\ Symbol Fonts and Extended Lucida -%D Bright. - -\newfam\mafam % C (ConTeXt) Math A Fam (AmsTeX A) -\newfam\mbfam % D (ConTeXt) Math B Fam (AmsTeX B) -\newfam\mcfam % E (ConTeXt) Math C Fam - -%D Because there are 16~families and because \type{\ttfam} -%D is reused, at the moment we have one families left:~F. -%D -%D To ease the support of font packages, we als define -%D shortcuts to these familynames. This is necessary because -%D the family names are in fact \type{\chardef}'s, which means -%D that we're dealing with numbers (one can check this by -%D applying \type{\showthe} and \type{\show}). In the -%D specification of math symbols however we need hexadecimal -%D numbers, so we have to convert the \type{\fam}'s value. - -\def\hexnumber#1% - {\ifcase#1 - 0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or A\or B\or C\or D\or E\or F% - \fi} - -\edef\hexmrfam {\hexnumber\mrfam} \edef\hexbsfam {\hexnumber\bsfam} -\edef\hexmifam {\hexnumber\mifam} \edef\hexbifam {\hexnumber\bifam} -\edef\hexsyfam {\hexnumber\syfam} \edef\hexscfam {\hexnumber\scfam} -\edef\hexexfam {\hexnumber\exfam} \edef\hextffam {\hexnumber\tffam} -\edef\hexitfam {\hexnumber\itfam} \edef\hexmafam {\hexnumber\mafam} -\edef\hexslfam {\hexnumber\slfam} \edef\hexmbfam {\hexnumber\mbfam} -\edef\hexbffam {\hexnumber\bffam} \edef\hexmcfam {\hexnumber\mcfam} - -\edef\hexnnfam {\hexnumber\nnfam} - -%D We define some (very private) constants to improve speed, -%D memory usage and consistency. - -\def\@plain@ {@f@pl@} % plain TeX encoding vector -\def\@size@ {@f@si@} % bodyfont size prefix (12pt etc) -\def\@style@ {@f@st@} % full style prefix (roman etc) -\def\@shortstyle@ {@f@sh@} % short style prefix (rm etc) -\def\@letter@ {@f@le@} % first alternative typeface -\def\@noletter@ {@f@no@} % second alternative typeface - -%D We also define a list of all text (i.e.\ non math symbol) -%D families. I considered using something like: -%D -%D \starttypen -%D \def\familylist% -%D {\do\c!tf\do\c!sl\do\c!it\do\c!bf\do\c!bs\do\c!bi\do\c!sc} -%D \stoptypen -%D -%D By assigning \type{\do} some suitable meaning one can -%D process such lists quite fast. The current implementation -%D uses the commalist processing macros and is not that -%D slow either. - -\def\familylist% - {\c!tf,\c!sl,\c!it,\c!bf,\c!bs,\c!bi,\c!sc} - -%D This list will be extended when needed with (pseudo) -%D families. The speude ones will in fact use the NoName -%D family. - -%D All used styles, like rm, ss and tt, are saved in a comma -%D separated list. Appart from practical limitations one can -%D define as many styles as needed, but first we - -\let\stylelist=\empty - -%D Further on we have to take some precautions when dealing -%D with special characters like~\type{~}, \type{_} -%D and~\type{^}, so let us define ourselve some handy macros -%D first. - -\def\protectfontcharacters% - {\catcode`\~=\@@letter - \catcode`\_=\@@letter - \catcode`\^=\@@letter\relax} - -\def\unprotectfontcharacters% - {\catcode`\~=\@@active - \catcode`\_=\@@subscript - \catcode`\^=\@@superscript\relax} - -%D The completeness of the Computer Modern Roman typefaces -%D makes clear how incomplete other faces are. To honour 7~bit -%D \ASCII, these fonts were designed using only the first 127 -%D values of the 256 ones that can be presented by one byte. -%D Nowadays 8~bit character codings are more common, mainly -%D because they permit us to predefine some composed -%D characters, which are needed in most european languages. -%D -%D Supporting more than the standard \TEX\ encoding vector -%D |<|which in itself is far from standard and differs per -%D font|>| puts a burden on the fonts mechanism. The \CONTEXT\ -%D mechanism is far from complete, but can handle several -%D schemes at once. The main problem lays in the accented -%D characters and ligatures like~ff, although handling -%D ligatures is not the responsibility of this module. -%D -%D By default, we use \PLAIN\ \TEX's approach of placing -%D accents. All other schemes sooner or later give problems -%D when we distribute \DVI||files are distributed across -%D machines and platforms. Nevertheless, we have to take care -%D of different encoding vectors, which tell us where to find -%D the characters we need. This means that all kind of -%D character placement macro's like \type{\"} and \type{\ae} -%D have to be implemented and adapted in a way that suits -%D these vectors. -%D -%D The main difference between different vector is the way -%D accents are ordered and/or the availability of prebuilt -%D accented characters. Accented characters can for instance be -%D called for by sequences like \type{\"e}. Here the \type{\"} -%D is defined as: -%D -%D \starttypen -%D \def\"#1{{\accent"7F #1}} -%D \stoptypen -%D -%D This macro places the accent \accent"7F {} on top of an~e -%D gives \"e. Some fonts however can have prebuild accents and -%D use a more direct approach like -%D -%D \starttypen -%D \def\"#1{\if#1e\char 235\else ... \fi} -%D \stoptypen -%D -%D The latter approach is not used in \CONTEXT, because we -%D store relevant combinations of accents and characters in -%D individual macros. - -%D We define character substitutes and commands with definition -%D commands like: -%D -%D \starttypen -%D \startcoding[texnansi] -%D -%D \defineaccent " a 228 -%D \defineaccent ^ e 234 -%D \defineaccent ' {\dotlessi} 237 -%D -%D \definecharacter ae 230 -%D \definecharacter oe 156 -%D -%D \definecommand b \newansib -%D \definecommand c \newansic -%D -%D \stopcoding -%D \stoptypen -%D -%D The last argument of \type{\defineaccent} and -%D \type{\definecharacter} tells \TEX\ the position of the -%D accented character in the encoding vector. In order to -%D complish this, we tag each implementation with the character -%D coding identifier. We therefore need two auxiliary variables -%D \type{\charactercoding} and \type{\nocharactercoding}. These -%D contain the current and default encoding vectors and both -%D default to the \PLAIN\ one. - -\let\charactercoding = \@plain@ -\let\nocharactercoding = \@plain@ - -%D \macros -%D {startcoding} -%D -%D Before we can redefine accents and special characters, we -%D have to tell \CONTEXT\ what encoding is in force. The next -%D command is responsible for doing this and also takes care of -%D the definition of the recoding commands. - -\def\startcoding[#1]% - {\protectfontcharacters - \showmessage{\m!fonts}{1}{#1}% - \def\charactercoding{@#1@}} - -\def\stopcoding% - {\let\charactercoding=\@plain@ - \unprotectfontcharacters} - -%D \macros -%D {defineaccent, definecharacter, definecommand} -%D -%D The actual definition of accents, special characters and -%D commands is done with the next three commands. - -\def\defineaccent#1 #2 #3 % - {\setvalue{\charactercoding#1\string#2}{\char#3}}% - -\def\definecommand#1 #2 % - {\setvalue{\charactercoding\string#1}{#2}} - -\def\definecharacter#1 #2 % - {\setvalue{\charactercoding\string#1}{\char#2}} - -%D Here we see that redefining accents is characters is more -%D or less the same as redefining commands. We also could have -%D said: -%D -%D \starttypen -%D \def\defineaccent#1 #2 {\definecommand#1\string#2 \char} -%D \def\definecharacter#1 {\definecommand#1 \char} -%D \stoptypen - -%D \macros -%D {redefineaccent} -%D -%D Telling \CONTEXT\ how to treat accents and special -%D characters is a two stage process. First we signal the -%D system which commands are to be adapted, after which we can -%D redefine their behavior when needed. We showed this in the -%D previous paragraphs. These redefinitions are grouped at the -%D end of this file, but we show some examples here. -%D -%D Accents or accent generating commands are redefined by: -%D -%D \starttypen -%D \redefineaccent ' % grave -%D \redefineaccent " % dieresis -%D \redefineaccent ^ % circumflex -%D \redefineaccent v % caron -%D \stoptypen -%D -%D The original \PLAIN\ \TEX\ meaning of each accent generating -%D command is saved first. Next these commands are redefined to -%D do an indirect call to a macro that acts according to the -%D encoding vector in use. - -\def\redefineaccent% - {\protectfontcharacters - \doredefineaccent} - -\def\doredefineaccent#1 % - {\def\!!stringa{\nocharactercoding\string#1}% - \@EA\letvalue\@EA\!!stringa\@EA=\csname\string#1\endcsname - \setvalue{\string#1}{\dohandleaccent#1}% - \unprotectfontcharacters} - -%D \macros -%D {normalaccent} -%D -%D The next (in fact three) macros to take care of \type{\"e} -%D as well as \type{\"{e}} situations. The latter one is always -%D handled by \TEX's \type{\accent} primitive, but the former -%D one can put the accents on top of characters as well as use -%D \type{\char} to call for a character directly. - -\let\normalaccent=\accent - -\unexpanded\def\dohandleaccent#1% - {\def\dodohandleaccent% - {\ifx\next\bgroup - \def\next{\getvalue{\nocharactercoding#1}}% - \else - \def\next{\dododohandleaccent#1}% - \fi - \next}% - \futurelet\next\dodohandleaccent} - -\def\dododohandleaccent#1#2% - {\bgroup - \ifundefined{\charactercoding#1\string#2}% - \def\\{\getvalue{\nocharactercoding#1}#2\egroup}% - \else - \def\\{\getvalue{\charactercoding#1\string#2}\egroup}% - \fi - \\} - -%D The trick with \type{\\} is needed to prevent spaces from -%D being gobbled after the accented character, should we have -%D \type{\next}, we should have ended up with gobbled spaces. - -%D \macros -%D {redefinecommand} -%D -%D Redefinition of encoding dependant commands like \type{\b} -%D and \type{\c} can be triggered by: -%D -%D \starttypen -%D \redefinecommand b % something math -%D \redefinecommand c % something math -%D \stoptypen -%D -%D Handling of characters is easier than handling accents -%D because here we don't have to take care of arguments. We -%D just call for the right glyph in the right place. -%D -%D The \type{\next} construction permits handling of commands -%D that take arguments. This means that we can use this -%D command to redefine accent handling commands too. - -\def\redefinecommand#1 % - {\def\!!stringa{\nocharactercoding#1}% - \@EA\letvalue\@EA\!!stringa\@EA=\csname#1\endcsname - \setvalue{#1}{\dohandlecommand{#1}}}% - -\unexpanded\def\dohandlecommand#1% - {\doifdefinedelse{\charactercoding#1} - {\def\next{\getvalue{\charactercoding#1}}} - {\def\next{\getvalue{\nocharactercoding#1}}}% - \next} - -%D \macros -%D {redefinecharacter} -%D -%D Special characters, which differ from accented characters -%D in that they are to be presented as they are, are redefined -%D by -%D -%D \starttypen -%D \redefinecharacter ae % ae -%D \redefinecharacter cc % ccedilla -%D \stoptypen -%D -%D To keep things simple, we just copy this command: - -\let\redefinecharacter=\redefinecommand - -%D \macros -%D {magfactor,magfactorhalf} -%D -%D There are several ways to specify a font. Three of them are -%D pure \TeX\ ones, the fourth one is new: -%D -%D \starttypen -%D \font\name=cmr12 -%D \font\name=cmr12 at 10pt -%D \font\name=cmr12 scaled \magstep2 -%D \font\name=cmr12 sa 1.440 -%D \stoptypen -%D -%D The non||\TEX\ alternative \type{sa} stands for {\em scaled -%D at}. This means as much as: scale the bodyfontsize with this -%D factor. The value 1.440 in this example is derived -%D from the \type{\magstep}'s as mentioned in -%D \in{table}[tab:magstep]. We therefore introduce -%D \type{\magfactor} as an alternative for \type{\magstep}. -%D -%D \plaatstabel[hier][tab:magstep] -%D {Factors to be used with \type{sa.}} -%D \starttabel[|c|c|c|] -%D \HL -%D \NC \bf magstep \NC \bf equivalent \NC \bf factor \NC\SR -%D \HL -%D \NC 1 \NC \type{\magfactor1} \NC 1.200 \NC\FR -%D \NC 2 \NC \type{\magfactor2} \NC 1.440 \NC\MR -%D \NC 3 \NC \type{\magfactor3} \NC 1.728 \NC\MR -%D \NC 4 \NC \type{\magfactor4} \NC 2.074 \NC\MR -%D \NC 5 \NC \type{\magfactor5} \NC 2.488 \NC\LR -%D \HL -%D \stoptabel - -\def\magfactor#1% - {\ifcase#1 1.000\or 1.200\or 1.440\or 1.728\or 2.074\or 2.488\or 1\fi} - -\def\magfactorhalf% - {1.095} - -%D These macros enable the use of definitions like \type{sa -%D \magfactor3} which saves us both (mis|)|calculations and -%D potential mistypings. -%D -%D Because \type{sa} is not a \TEX\ supported alternative, we -%D have to test for it ourselves. In doing so, we need an -%D auxiliary \DIMENSION. We cannot use \type{\scratchdimen} -%D because font loading can happen at any moment due to -%D postponed loading. We could instead have used dirty grouping -%D tricks, but this one works too. - -\newdimen\scaledfont - -\def\docalculatefont#1 sa #2sa#3*#4*#5*% The spaces are needed! - {\edef\fontscale{#2}% - \ifx\fontscale\empty - \expandafter\font\csname#4#5\endcsname=#1\relax - \else - \scaledfont=#4\relax - \expandafter\font\csname#4#5\endcsname=#1 at \fontscale\scaledfont\relax - \fi} - -%D I considered checking for mistakenly use of \PLAIN's -%D \type{\magstep}'s but although it would take only a few -%D lines of code, this would not add to consistent use. I -%D therefore removed this check. Here we also handle the -%D optional hyphenchar definitions, like: -%D -%D \starttypen -%D \definebodyfont [12pt] [rm] [hyphenchar=45] -%D \stoptypen - -\def\dodoloadfont#1#2#3#4% - {\expanded{\docalculatefont\getvalue{\??ft#1#2#3} sa sa*#1*#2#3*}% - \doifdefinedelse{#1#2\s!hyphenchar} - {\expandafter\hyphenchar\csname#1#2#3\endcsname= - \getvalue{#1#2\s!hyphenchar}\relax} - {\expandafter\hyphenchar\csname#1#2#3\endcsname= - #4\relax}% - \getvalue{#1#2#3}} - -%D A more ugly but correct alternative for this is: -%D -%D \starttypen -%D \def\docalculatefont#1sa #2sa#3*#4*#5*% -%D {\edef\fontscale{#2}% -%D \scaledfont=#4\relax -%D \expandafter\font\csname#4#5\endcsname=#1 -%D \ifx\fontscale\empty\else at \fontscale\scaledfont\fi} -%D \stoptypen -%D -%D This one saves a few bytes of memory, but is not particular -%D faster due to the often unneeded assignment. - -%D The loading macro is used in two macros. One of them takes -%D care of fixed width teletype fonts. - -\def\doloadfont#1#2#3% - {\debuggerinfo{\m!fonts}{loaded #1#2#3}% - \dodoloadfont{#1}{#2}{#3}{45}} - -\def\doloadttfont#1#2#3% - {\debuggerinfo{\m!fonts}{loaded fixed #1#2#3}% - \dodoloadfont{#1}{#2}{#3}{-1}} - -%D \macros -%D {getfontname} -%D -%D The names of the fonts can be called with the rather simple -%D macro \type{\getfontname}. When for instance we pass -%D \type{12ptrmtf} as argument, we get \getfontname{12ptrmtf}. - -\def\getfontname#1% - {\getvalue{\??ft#1}} - -%D Now we enter the area of font switching. The switching -%D mechanism has to take care of several situations, like: -%D -%D \startopsomming[opelkaar] -%D \som changing the overal document fonts (including margins, -%D headers and footers) -%D \som changing local fonts (only the running text) -%D \som smaller and even more smaller alternatives (super- -%D and subscripts) -%D \stopopsomming -%D -%D \TEX\ offers a powerfull family mechanism for super- and -%D subscripts in math mode. In text mode however, we don't use -%D families for the smaller alternatives, and therefore have -%D to take care of it otherwise. - -%D \macros -%D {definebodyfontenvironment} -%D -%D The relationship between the several sizes of a font, is -%D defined by: -%D -%D \showsetup{\y!definebodyfontenvironment} -%D -%D Later on we will see how these parameters are used, so for -%D the moment we stick with an example: -%D -%D \starttypen -%D \definebodyfontenvironment -%D [12pt] -%D [ text=12pt, -%D script=9pt, -%D scriptscript=7pt, -%D x=10pt, -%D xx=8pt, -%D big=12pt, -%D small=10pt] -%D \stoptypen -%D -%D The first argument specifies the bodyfont size to which the -%D settings apply. All second parameters are specified in -%D dimensions and tell us more about related sizes. -%D -%D Due to the fact that \type{\c!text} and \type{\s!text} can -%D have a similar meaning, and therefore can lead to an -%D unwanted loop, we temporary redefine \type{\c!text}. For -%D the moment this in only place that some trickery is needed -%D to fool the multilingual interface. - -\def\definebodyfontenvironment% - {\dodoubleempty\dodefinebodyfontenvironment} - -\def\dodefinebodyfontenvironment[#1][#2]% - {\let\c!savedtext=\c!text - \let\c!text=\s!text - \doifundefined{\??ft#1\s!text} - {\getparameters[\??ft#1] - [\s!text=#1,\s!script=#1,\s!scriptscript=#1, - \c!x=#1,\c!xx=#1, - \c!groot=#1,\c!klein=#1]}% - \getparameters[\??ft#1][#2]% - \let\c!text=\c!savedtext - \setvalue{\@size@#1}{\docompletefontswitch[#1]}} - -%D We default all parameters to the main bodyfont size (begin -%D \type{#1}), so the next setup is valid too: -%D -%D \starttypen -%D \definebodyfontenvironment[24pt] -%D \stoptypen -%D -%D All parameters can be redefined when needed, so one does -%D not have to stick to the default ones. - -%D \macros -%D {definebodyfont} -%D -%D The next step in defining a bodyfont involves the actual font -%D files, which can be recognized by their extension -%D \type{tfm}. Installing those file is often beyond the -%D scope of the user and up to the system administrator. -%D -%D \showsetup{\y!definebodyfont} -%D -%D This commands takes three arguments, where \ShowArgument\ -%D takes a (series of) bodyfont size(s) and \ShowArgument\ -%D the style group to which the definitions belong. -%D -%D Argument \ShowArgument\ accepts any suitable alternative, -%D as specified by the \TEX\ families, extended with~a, b~and -%D higher sizes or the normal \TEX\ mathematical families and -%D some more. -%D -%D We show two examples, that show all the alternative -%D scaling options. The \type{\tfa} alternatives can be -%D extended with \type{\bfa}, \type{\slb}, etc. or even -%D \type{e} and higher alternatives. -%D -%D \starttypen -%D \definebodyfont [12pt] [rm] -%D [tf=cmr12, -%D bf=cmbx12, -%D it=cmti12, -%D sl=cmsl12, -%D bi=cmbxti10 at 12pt, -%D bs=cmbxsl10 at 12pt, -%D tfa=cmr12 scaled \magstep1, -%D tfb=cmr12 scaled \magstep2, -%D tfc=cmr12 scaled \magstep3, -%D tfd=cmr12 scaled \magstep4, -%D sc=cmcsc10 at 12pt] -%D -%D \definebodyfont [12pt,11pt,10pt,9pt,8pt] [rm] -%D [tf=lbr sa 1, -%D bf=lbd sa 1, -%D it=lbi sa 1, -%D sl=lbsl sa 1, -%D bi=lbdi sa 1, -%D bs=lbdi sa 1, -%D tfa=lbr sa 1.200, -%D tfb=lbr sa 1.440, -%D tfc=lbr sa 1.728, -%D tfd=lbr sa 2.074, -%D sc=lbr sa 0.833] -%D \stoptypen -%D -%D The second example shows that we can define more sizes at -%D once. The main difference between these examples is that the -%D Computer Modern Roman come in many design sizes. This means -%D that there we cannot define them in bulk using \type{sa}. -%D Instead of \type{rm} (roman) one can define \type{ss} (sans -%D serif), \type{tt} (teletype), \type{hw} (hand written), -%D \type{cg} (calygraphic) and whatever styles. - -\def\definebodyfont% - {\dotripleargument\dodefinebodyfont} - -%D The first argument may be a comma separated list. This, -%D combined with specifications using \type{sa} can save a lot -%D of typing. Although all arguments should be specified, we -%D treat the second argument as optional. - -\def\dodefinebodyfont[#1][#2][#3]% - {\ifthirdargument - \def\dododefinebodyfont##1% - {\dodododefinebodyfont[##1][#2][#3]}% - \processcommalist[#1]\dododefinebodyfont - \else - \definebodyfont[#1][\c!rm][#2]% - \fi} - -%D Defining a bodyfont involves two actions: defining the specific -%D style related alternatives, like \type{\rma}, \type{\bfa} -%D and \type{\rmsla}, and storing the definitions of their -%D bodyfont size related fonts. The first step is bodyfont -%D independant but executed every time. This permits user -%D definitions like \type{\tfw} or \type{\bfq} for real large -%D alternatives. - -\def\dodododefinebodyfont[#1][#2][#3]% - {\geteparameters[\??ft#1#2][#3]% We expand them! - \dodefinebodyfontenvironment[#1][]% Just to be sure. - \def\doiffamily##1##2##3\\% adapted - {\doifinstringelse{##1##2}\familylist - {} - {\addtocommalist{##1##2}\familylist - %\settextfonts - \unexpanded\setvalue{##1##2}% - {\getvalue{#2}\getvalue{##1##2}}% - \unexpanded\setvalue{##1##2\c!x}% - {\getvalue{##1##2}\getvalue{##1##2\c!x}}% - \unexpanded\setvalue{##1##2\c!xx}% - {\getvalue{##1##2}\getvalue{##1##2\c!xx}}}% - \doifsomething{##3} - {\setvalue{#2##3}% eg: \rma, \ssa - {\donottest\switchtofontstyle{#2}{##3}}% - \setvalue{##1##2##3}% eg: \tfa, \bfa - {\donottest\switchtofontalternative{##1##2}{##3}}% - \setvalue{#2##1##2##3}% eg: \rmtfa, \ssbfa - {\donottest\switchtofontstylealternative{#2}{##1##2}{##3}}}}% - \def\dodefinefont##1% - {\doifnot{##1}{\s!hyphenchar} - {\doifdefined{\??ft#1#2##1} - {\letvalue{@#1#2##1@}=\charactercoding - \doifelse{#2}{\c!tt} - {\setvalue{#1#2##1}{\donottest\doloadttfont{#1}{#2}{##1}}} - {\setvalue{#1#2##1}{\donottest\doloadfont{#1}{#2}{##1}}}% - \bgroup - \let\relax=\empty - \debuggerinfo - {\m!fonts}{\getvalue{\??ft#1#2##1} defined as #1 #2 ##1}% - \egroup}% - \doifnot{#2}{\c!mm} % new! - {\expandafter\doiffamily##1\\}}}% - \processassignlist[#3]\dodefinefont} - -%D Unknown families are added to the family list! For the -%D moment we also set the direct calls here. Some day a better -%D solution will be implemented. - -%D These macros show that quite some definitions take place. -%D Fonts are not loeaded yet! This means that at format -%D generation time, no font files are preloaded. -%D -%D We could have use \type{\unexpanded\setvalue} instead of -%D the \type{\donottest} prefixes. However, this would lead to -%D about 400 extra entries in the hash table. -%D -%D We can save ourselved some 400 csnames by packing the name -%D and the encoding. But ..... not done yet ..... - -%D \macros -%D {everybodyfont,Everybodyfont} -%D -%D Every change in bodyfont size has conseqences for the baseline -%D distance and skips between paragraphs. These are initialized -%D in other modules. Here we only provide the hooks that -%D garantees their handling. - -\newevery \everybodyfont \Everybodyfont - -%D At the system level one can initialize thing like: -%D -%D \starttypen -%D \appendtoks \setupspacing \to \everybodyfont -%D \stoptypen -%D -%D While users can add their own non standard commands like: -%D -%D \starttypen -%D \Everybodyfont{\message{changing to bodyfont \the\bodyfontsize}} -%D \stoptypen -%D -%D Personnaly I never felt the need for such extensions, but -%D at least its possible. - -%D \macros -%D {globalbodyfontsize,localbodyfontsize} -%D -%D Next we'll do the tough job of font switching. Here we -%D have to distinguish between the global (overal) bodyfont size -%D and the local (sometimes in the textflow) size. We store -%D these dimensions in two \DIMENSION\ registers. - -\newdimen\globalbodyfontsize \globalbodyfontsize=12pt -\newdimen\localbodyfontsize \localbodyfontsize =\globalbodyfontsize - -%D \macros -%D {bodyfontsize} -%D -%D These two registers are not to be misused in calculations. -%D For this purpose we keep a copy: - -\newdimen\bodyfontsize \bodyfontsize=\globalbodyfontsize - -%D \macros -%D {outputresolution} -%D -%D Sometimes (to be honest: not in this module) we need to -%D take the system resolution into account. Therefore we also -%D define a macro: - -\def\outputresolution {300} - -%D \macros -%D {bodyfontfactor,bodyfontpoints} -%D -%D For multiplication purposes we keep an auxiliary counter -%D and macro (here the expansion is not explicitly needed): - -\newcount\bodyfontpoints \dimensiontocount\bodyfontsize\bodyfontpoints - -\edef\bodyfontfactor{\withoutpt\the\bodyfontsize} - -%D When we assign for instance 12pt to a \DIMENSION\ register -%D the \type{\the}'d value comes out as 12.0pt, which is -%D often not the way users specifie the bodyfont size. Therefore -%D we also store the normalized value. - -\def\normalizebodyfontsize#1\to#2% - {\scratchdimen=#1\relax - \doifinstringelse{.0}{\withoutpt\the\scratchdimen} - {\dimensiontocount\scratchdimen\scratchcounter - \edef#2{\the\scratchcounter pt}} - {\edef#2{\the\scratchdimen}}} - -\normalizebodyfontsize\bodyfontsize\to\normalizedglobalbodyfontsize -\normalizebodyfontsize\bodyfontsize\to\normalizedlocalbodyfontsize -\normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize - -%D To be internationalized: - -\def\korpsgrootte {\bodyfontsize} -\def\korpspunten {\bodyfontpoints} - -%D some day. - -%D \macros -%D {fontsize,fontstyle} -%D -%D Within a bodyfont, fonts can come in different sizes. For -%D instance \type{\tf} is accompanied by \type{\tfa}, -%D \type{\tfb} etc. The third character in these sequences -%D represents the size. The actual size is saved in a macro - -\let\fontsize = \empty - -%D The style, being roman (\type{\rm}), sans serif (\type{\ss}) -%D etc. is also available in a macro in \type{rm}, \type{ss} -%D etc. form: - -\let\fontstyle = \empty - -%D All things related to fonts are grouped into files with -%D names like \type{font-cmr}. These files are loaded by: - -\def\doreadfontdefinitionfile#1% - {\doifundefined{\c!file\f!fontprefix#1}% - {\setvalue{\c!file\f!fontprefix#1}{}% - \makeshortfilename[\f!fontprefix\truefilename{#1}]% - \startreadingfile - \readsysfile{\shortfilename} - {\showmessage{\m!fonts}{2}{#1}} - {\showmessage{\m!fonts}{3}{#1}}% - \stopreadingfile}} - -%D Such files are only loaded once! This permits redundant -%D loading, but at the same time forced grouping when we want -%D continuously mix all kind of font, which of course is a kind -%D of typographically sin. The \type{"} is made inactive if -%D needed to prevent problems with loading files that use this -%D character in numbers. - -\def\doswitchpoints[#1]% - {\expanded{\dodoswitchpoints{#1}}} - -\def\dodoswitchpoints#1% - {\doifdefinedelse{\@size@#1} - {\getvalue{\@size@#1}% - \localbodyfontsize=#1\relax - \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize - \the\everybodyfont} - {\showmessage{\m!fonts}{4}{#1}}} - -\def\doswitchstyle[#1]% - {\doifdefinedelse{\@style@#1} - {\getvalue{\@style@#1}% - \edef\fontstyle{#1}} - {\showmessage{\m!fonts}{5}{#1}}} - -%D \TEX\ loads font metric files like \type{cmr10.tfm} and -%D \type{tir.tfm} only once. In \PLAIN\ \TEX\ some font files -%D are {\em preloaded}. This means that the font files are -%D loaded, but not accessible yet by name. This is accomplished -%D by saying: -%D -%D \starttypen -%D \font\preloaded=cmr10 at 11pt -%D \stoptypen -%D -%D and using the name \type{\preloaded} again and again, so -%D fonts are indeed loaded, but unnamed, and therefore -%D unaccessible. In \CONTEXT\ we don't preload fonts, not even -%D the \PLAIN\ \TEX\ ones, although users can access them. Now -%D why is this done? - -%D Defining fonts using \type{\definebodyfont} takes time, so we -%D prefer to predefine at least the Computer Modern Roman -%D fonts. However, loading all those fonts at definition time -%D would take both time and space. But even worse, once fonts -%D are loaded into memory, their encoding vector is fixed, -%D which is a handicap when we want to distribute the compact -%D \type{fmt} files. So what we want to do is defining fonts in -%D a way that postpones the loading. We accomplish this by only -%D loading the fonts when we switch to another bodyfont size. -%D Among the other alternatives, such as loading the font at -%D the moment of activation and redefining the activation -%D macro afterwards, this proved to be the most efficient -%D alternative. -%D -%D The next few macros take care of the one exeption on this -%D scheme. When at format generation time we load the default -%D font file, the one that defines the Computer Modern Fonts, -%D we don't want the fonts metrics to end up in the format -%D file, so we temporary prohibit loading. This means that at -%D runtime we have to load the default bodyfont size just before -%D we start typesetting. -%D -%D Therefore we have to signal the font switching macros that -%D we are preloading fonts. As long as the next boolean is, -%D true, no loading is done. - -\newif\ifloadingfonts \loadingfontstrue - -%D \macros -%D {preloadfonts} -%D -%D Preloading is only called for once, during the startup -%D sequence of a session. After the loading job is done, the -%D macro relaxes itself and reset the signal. - -\def\preloadfonts% - {\showmessage{\m!fonts}{6}{\normalizedbodyfontsize\normalspace\fontstyle}% - \doswitchpoints[\normalizedbodyfontsize]% - \doswitchstyle[\fontstyle]% - \global\let\preloadfonts=\relax - \global\loadingfontsfalse} - -%D Here comes the main font switching macros. These macros -%D handle changes in size as well as returning to the global -%D bodyfont size. - -\def\dosetfont[#1]% - {\doifelse{#1}{\v!globaal} - {\restoreglobalbodyfont} - {\processcommalist[#1]\dodosetfont - \ifloadingfonts\else - \doswitchpoints[\normalizedbodyfontsize]% - \doswitchstyle[\fontstyle]% - \fi}% - \chardef\currentxfontsize=0\relax} - -\def\dodosetfont#1% - {\dododosetfont{#1}{\showmessage{\m!fonts}{4}{#1}}} - -\def\dododosetfont#1#2% - {\doifnumberelse{#1} - {\scratchdimen=#1\relax - \normalizebodyfontsize\scratchdimen\to\normalizedsetfont - \doifdefinedelse{\@size@\normalizedsetfont} - {\localbodyfontsize=\normalizedsetfont - \let\normalizedbodyfontsize=\normalizedsetfont} - {#2\dosetsubstitutefont{#1}}} - {\doifdefinedelse{\@style@#1} - {\edef\fontstyle{#1}} - {\doreadfontdefinitionfile{#1}}}} - -%D In the previous macros we use \type{\currentxfontsize} to -%D hold the current x||size of the font. This enables us to -%D support for instance \type{\sl} inside a \type{\tx} switch. - -\chardef\currentxfontsize=0 - -%D When users specify for instance a 13 point bodyfont while no -%D such bodyfont is defined, the system automatically tries to -%D find a best fit, that is the nearest smaller defined -%D bodyfontzize. A smaller one is definitely better than a larger -%D one, simply because otherwise a lot of overfull box messages -%D are more probable to occur. By taking a value slightly -%D smaller than half a point, we can use the next method. - -\def\dosetsubstitutefont#1% - {\scratchdimen=#1\relax - \advance\scratchdimen by .499pt - \dimensiontocount\scratchdimen\scratchcounter - \advance\scratchcounter by -1 - \ifnum\scratchcounter>3 - \dododosetfont{\the\scratchcounter pt}{}% - \fi} - -%D Next we're going to implement some switching macros we -%D already used in when defining fonts. The first one takes -%D care of the style and is used by commands like \type{\rma}. - -\def\switchtofontstyle#1#2% - {\getvalue{#1}% - \getvalue{\c!tf#2}} - -%D The second one is responsible for commands like \type{\bfa} -%D and the third one handles the combined \type{\rmbfa} -%D alternatives. - -\def\switchtofontalternative#1#2% - {\def\fontsize{#2}% - \setfontstyle{\fontstyle}{\fontstyle}% - \donottest\getvalue{#1}} - -\def\switchtofontstylealternative#1#2#3% - {\getvalue{\normalizedbodyfontsize#1#2#3}} - -%D Setting the normal sized as well as the x and xx smaller -%D sizes is accomplished by the next set of macros. When in -%D math mode, the commands \type{\tx} and \type{\txx} are -%D just a switch to the script and double script styles, but -%D in text mode the values defined by the bodyfontenvironment are -%D used. Here we also set \type{\currentxfontsize}. - -\def\dosetsomextypeface#1% - {\doifdefinedelse{#1} - {\getvalue{#1}} - {\showmessage{\m!fonts}{7}{#1}}}% - -\def\dosetxtypeface#1% - {\chardef\currentxfontsize=1 - \ifmmode - \scriptstyle - \else - \dosetsomextypeface - {\getvalue{\??ft\normalizedbodyfontsize\c!x}% % pt - \getvalue{\@shortstyle@\fontstyle}% % rm - #1}% % tf - \unexpanded\def\tx{\dosetxxtypeface{#1}}% - \fi} - -\def\dosetxxtypeface#1% - {\chardef\currentxfontsize=2 - \ifmmode - \scriptscriptstyle - \else - \dosetsomextypeface - {\getvalue{\??ft\normalizedbodyfontsize\c!xx}% % pt - \getvalue{\@shortstyle@\fontstyle}% % rm - #1}% % tf - \let\tx=\relax - \let\txx=\relax - \fi} - -%D These macros also show us that when we call for \type{\tx}, -%D this macro is redefined to be \type{\txx}. Therefore calls -%D like: -%D -%D \startbuffer -%D {small \tx is \tx beautiful} -%D {small \tx is \txx beautiful} -%D {small \txx is \tx beautiful} -%D {small \txx is \txx beautiful} -%D \stopbuffer -%D -%D \typebuffer -%D -%D result in: -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld -%D -%D Setting the main size involves the style list and therefore -%D takes a bit more time. Keep in mind that the fontsize is -%D represented by a character or empty. - -\def\settextfont#1% - {\def\dosettextfont##1% - {\doifdefinedelse{\textface#1##1\fontsize} - {\setvalue{#1##1}{\donottest\getvalue{\textface#1##1\fontsize}}} - {\setvalue{#1##1}{\donottest\getvalue{\textface#1##1}}}}% - \rawprocesscommalist[\familylist]\dosettextfont} - -\def\settextfonts% - {\rawprocesscommalist[\stylelist]\settextfont} - -%D All three sizes come together in the macro: - -\def\settypefaces#1#2% - {\setvalue{#2}% - {\donottest\dosettypeface{#1}{#2}}% - \setvalue{#2\c!x}% - {\donottest\dosetxtypeface{#2}}% - \setvalue{#2\c!xx}% - {\donottest\dosetxxtypeface{#2}}}% - -%D Earlier in this module we defined some \TEX\ families. Here -%D we introduce the macros that are responsible for setting -%D them. The first argument of the next macro takes the style -%D in its short form (rm, ss, etc). The second argument is the -%D alternative (tf, bf, etc). - -%D Before actually assigning the font to a family we activate -%D it. This is needed because loading of fonts is postponed -%D until the first time it's called for. This also forces us to -%D set the text family after we've set the script ones, else -%D the latter one would be in force after executing this macro. - -\def\settextfamily#1#2#3% - {\def\setfamily##1##2% - {\doifdefinedelse{##2\c!mm#2} - {\debuggerinfo{\m!fonts}{##2#1#2 overruled by ##2\c!mm#2}% - \getvalue{##2\c!mm#2}\relax % activate font - \expandafter##1\getvalue{#3\s!fam}=\getvalue{##2\c!mm#2}} - {\doifdefinedelse{##2#1#2} - {\debuggerinfo{\m!fonts}{defined ##2#1#2}% - \getvalue{##2#1#2}\relax % activate font - \expandafter##1\getvalue{#3\s!fam}=\getvalue{##2#1#2}} - {\doifdefinedelse{##2#1\c!tf} - {\debuggerinfo{\m!fonts}{##2#1#2 replaced by ##2#1\c!tf}% - \getvalue{##2#1\c!tf}\relax % activate font - \expandafter##1\getvalue{#3\s!fam}=\getvalue{##2#1\c!tf}} - {\debuggerinfo{\m!fonts}{not defined ##2#1#2}}}}}% - \scriptscriptfont\getvalue{#3\s!fam}=\scriptfont\getvalue{#3\s!fam}% - \setfamily\scriptscriptfont\scriptscriptface - \scriptfont \getvalue{#3\s!fam}=\textfont \getvalue{#3\s!fam}% - \setfamily\scriptfont\scriptface - \textfont \getvalue{#3\s!fam}=\textfont \tffam - \setfamily\textfont\textface} - -%D The previous macro lets definitions like -%D -%D \starttypen -%D \definebodyfont[mm][10pt][bf=cmbx10 at 10.25pt] -%D \stoptypen -%D -%D take preference over -%D -%D \starttypen -%D \definebodyfont[rm][10pt][bf=cmbx10 at 10pt] -%D \stoptypen - -%D \macros -%D {defineoverallstyle} -%D -%D When setting of switching the overall style we can use the -%D short identifier like rm and ss, but when defined we can -%D also use more verbose names like roman or sansserif. Such -%D names are defined by: -%D -%D \starttypen -%D \defineoverallstyle [roman, rm] [rm] -%D \defineoverallstyle [sansserif, ss] [ss] -%D \stoptypen - -\def\dodefineoverallstyle[#1][#2]% - {\rawdoifinsetelse{#2}{\stylelist} - {\debuggerinfo{\m!fonts}{unknown style #2}} - {\addtocommalist{#2}\stylelist - \showmessage{\m!fonts}{8}{#2}}% - \setvalue{#2\c!x}% - {\getvalue{#2}\getvalue{\c!tf\c!x}}% - \setvalue{#2\c!xx}% - {\getvalue{#2}\getvalue{\c!tf\c!xx}}% - \def\docommando##1% - {\setvalue{\@shortstyle@##1}{#2}% - \setvalue{\@style@##1}{\getvalue{#2}}% - \setvalue{#2}{\donottest\setfontstyle{##1}{#2}}}% - \processcommalist[#1]\docommando} - -\def\defineoverallstyle% - {\dodoubleargument\dodefineoverallstyle} - -%D CHECKEN WAT \type{\fontstyle} HIER DOET - -\def\setfontstyle#1#2% #1:name (roman, romaan) #2:style (rm) - {\edef\fontstyle{#1}% - \def\dosettextfamily##1% - {\doifdefinedelse{##1\s!fam} % added - {\settextfamily{#2}{##1}{##1}} - {\settextfamily{#2}{##1}{\c!nn}}% - \settypefaces{#2}{##1}}% - \rawprocesscommalist[\familylist]\dosettextfamily - \fam\tffam\relax - \unexpanded\def\tx{\tfx}% - \donottest\tf} - -%D Setting the math families looks much like setting the texts -%D ones. This time however we use the 12 point font as a -%D default when nothing is defined. This enables us to -%D implement partial schemes. Here we also set the -%D \type{\skewchar}, which takes care of accents in math mode -%D (actually it's the largest accent). The first family needs a -%D bit different treatment because it can be set to the default -%D roman as well as a user defined font. - -\def\setmathfamilies% - {\setskewchar{\textface\c!mm\c!mi}{'177}% - \setskewchar{\textface\c!mm\c!sy}{'60}% - \setmathfamily\mrfam\textface\scriptface\scriptscriptface - {\c!mm\c!mr}{\c!rm\c!tf}% - \setmathfamily\mifam\textface\scriptface\scriptscriptface - {\c!mm\c!mi}{}% - \setmathfamily\syfam\textface\scriptface\scriptscriptface - {\c!mm\c!sy}{}% - \setmathfamily\exfam\textface\textface\textface - {\c!mm\c!ex}{}% - \setmathfamily\mafam\textface\scriptface\scriptscriptface - {\c!mm\c!ma}{}% - \setmathfamily\mbfam\textface\scriptface\scriptscriptface - {\c!mm\c!mb}{}% - \setmathfamily\mcfam\textface\scriptface\scriptscriptface - {\c!mm\c!mc}{}} - -%D Optionally skew characters can be set on a per font basis, -%D like: -%D -%D \starttypen -%D \definebodyfont -%D [12pt] [mm] -%D [mi=cmmi10,sy=cmsy10,syskewchar='50] -%D \stoptypen -%D -%D When setting the \type{\skewchar} we need to test on the -%D availability first. - -\def\setskewchar#1#2% - {\doifdefined{#1} - {\doifdefinedelse{\??ft#1\s!skewchar} - {\dosetskewchar{#1}{\getvalue{\??ft#1\s!skewchar}}} - {\dosetskewchar{#1}{#2}}}} - -\def\dosetskewchar#1#2% - {\getvalue{#1}\skewchar\getvalue{#1}=#2\relax} - -%D First we try to set the font at the math specific one (the -%D fifth argment), next we take the alternative the last -%D argument, which of often empty, and finally we default to -%D the 12 point alternative. - -\def\setmathfamily#1#2#3#4#5#6% - {\def\dosetmathfamily##1##2% - {\doifdefinedelse{##2#5} - {\getvalue{##2#5}\relax - ##1#1=\getvalue{##2#5}\relax} - {\doifdefinedelse{##2#6} - {\getvalue{##2#6}\relax - ##1#1=\getvalue{##2#6}\relax} - {\doifdefinedelse{12pt#5} - {\getvalue{12pt#5}\relax - ##1#1=\getvalue{12pt#5}\relax} - {##1#1=\nullfont}}}}% - \dosetmathfamily\scriptscriptfont{#4}% - \dosetmathfamily\scriptfont{#3}% - \dosetmathfamily\textfont{#2}} - -%D The previous macros show that it's is not always -%D neccessary to define the whole bunch of fonts, take for -%D instance the sequence: -%D -%D \starttypen -%D \setupbodyfont -%D [ams] -%D -%D \definebodyfont [24pt] [mm] -%D [ma=msam10 at 24pt, -%D mb=msbm10 at 24pt] -%D -%D \switchtobodyfont -%D [24pt] -%D -%D This is a 24pt $\blacktriangleleft$ -%D \stoptypen -%D -%D Here we didn't define the 24 point bodyfont environment, so -%D it's defined automatically. Of course one can always use the -%D \TEX\ primitive \type{\font} to switch to whatever font -%D needed. - -%D When asking for a complete font switch, for instance from 10 -%D to 12~points, the next macro does the job. First we -%D normalize the size, nect we define the current range of -%D text, script and scriptscript sizes, then we set the text -%D fonts and the math families and finally we activate the -%D default typeface and also set the font specific parameters -%D assigned to \type{\everybodyfont} - -\def\docompletefontswitch[#1]% - {\bodyfontsize=#1\relax - \dimensiontocount\bodyfontsize\bodyfontpoints - \edef\bodyfontfactor{\withoutpt\the\bodyfontsize}% - \normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize - \edef\textface{\getvalue{\??ft\normalizedbodyfontsize\s!text}}% - \edef\scriptface{\getvalue{\??ft\normalizedbodyfontsize\s!script}}% - \edef\scriptscriptface{\getvalue{\??ft\normalizedbodyfontsize\s!scriptscript}}% - \settextfonts - \setmathfamilies - \rmtf - \the\everybodyfont} - -%D \macros -%D {setupbodyfont,switchtobodyfont} -%D -%D The next two macros are user ones. With \type{\setupbodyfont} -%D one can set the document bodyfont size, font family, style -%D and/or options defined in files, for example: -%D -%D \starttypen -%D \setupbodyfont[cmr,ams,12pt,roman] -%D \stoptypen -%D -%D This command affects the document as a whole: text, headers -%D and footers. The second macro however affects only the text: -%D -%D \starttypen -%D \switchtobodyfont[10pt] -%D \stoptypen -%D -%D So we've got: -%D -%D \showsetup{\y!setupbodyfont} -%D \showsetup{\y!switchtobodyfont} -%D -%D Both macros look alike. The second one also has to take -%D all kind of keywords into account. - -\def\setupbodyfont[#1]% - {\doifsomething{#1} - {\dosetfont[#1]% - \globalbodyfontsize=\localbodyfontsize - \normalizebodyfontsize\globalbodyfontsize\to\normalizedglobalbodyfontize - \let\globalfontstyle=\fontstyle - \the\everybodyfont}} - -\unexpanded\def\switchtobodyfont[#1]% - {\doifsomething{#1} - {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#1}} - {\doswitchpoints[\getvalue{\??ft\normalizedbodyfontsize\interfaced{#1}}]% - \doswitchstyle[\fontstyle]} - {\dosetfont[#1]}% - \the\everybodyfont}} - -%D Because the last macro can appear in arguments or be assigned -%D to parameters, we protect this one for unwanted expansion. - -\def\dosetmathfont#1% - {\def\rm{\fam0}% - \doifdefinedelse{#1\s!fam} % adapted - {\edef\mffam{\getvalue{#1\s!fam}}} - {\edef\mffam{\getvalue{\c!nn\s!fam}}}% - \textfont \mrfam=\textfont \mffam - \scriptfont \mrfam=\scriptfont \mffam - \scriptscriptfont\mrfam=\scriptscriptfont\mffam} - -\def\dosettypeface#1#2% - {\doifdefinedelse{@\normalizedbodyfontsize#1#2@} - {\edef\charactercoding{\getvalue{@\normalizedbodyfontsize#1#2@}}} - {\let\charactercoding=\@plain@}% - \unexpanded\def\tx% - {\dosetxtypeface{#2\fontsize}}% - \unexpanded\def\txx% - {\dosetxxtypeface{#2\fontsize}}% - \doifdefinedelse{#2\s!fam} % adapted - {\expandafter\fam\getvalue{#2\s!fam}} - {\expandafter\fam\getvalue{\c!nn\s!fam}}% - \def\mf{\donottest{\dosetmathfont{#2}}}% - \donottest\getvalue{#1#2}% - \ifcase\currentxfontsize\or\tx\or\txx\fi} - -%D \macros -%D {os} -%D -%D Old style numerals can be typeset with \type{\os} and look -%D like {\os 1234567890} instead of the more common looking -%D 1234567890. -%D -%D {\em Some day this macro will be made more geneal. For the -%D moment it's behavior is tigthly coupled to the Computer -%D Modern Roman.} - -\unexpanded\def\os% - {\getvalue{\normalizedbodyfontsize\c!mm\c!mi}} - -%D \macros -%D {definebodyfontswitch} -%D -%D \PLAIN\ \TEX\ defines some macro's like \type{\tenpoint} -%D to switch to a specific bodyfontsize. Just for the sake of -%D compatibility we can define them like: -%D -%D \starttypen -%D \definebodyfontswitch [twelvepoint] [12pt] -%D \stoptypen -%D -%D We don't support language specific synonyms here, mainly -%D because \PLAIN\ \TEX\ is english anyway. - -\def\dodefinebodyfontswitch[#1][#2]% - {\def\docommando##1% - {\setvalue{##1}{\switchtobodyfont[#2]}}% - \processcommalist[#1]\docommando} - -\def\definebodyfontswitch% - {\dodoubleargument\dodefinebodyfontswitch} - -%D \macros -%D {setsmallbodyfont,setmainbodyfont,setbigbodyfont} -%D -%D When we're typesetting at for instance 10pt, we can call for -%D the \type{small} as well as the \type{big} alternative, -%D related to this main size, using \type{\switchtobodyfont[small]}. -%D The three alternatives can be activated by the next three -%D system calls and are defined by the bodyfontenvironment. - -\def\setsmallbodyfont% - {\doswitchpoints[\getvalue{\??ft\normalizedbodyfontsize\v!klein}]% - \doswitchstyle[\fontstyle]} - -\def\setmainbodyfont% - {\doswitchpoints[\normalizedbodyfontsize]% - \doswitchstyle[\fontstyle]} - -\def\setbigbodyfont% - {\doswitchpoints[\getvalue{\??ft\normalizedbodyfontsize\v!groot}]% - \doswitchstyle[\fontstyle]} - -%D \macros -%D {restoreglobalbodyfont} -%D -%D Users can set whatever font available while typesetting text. -%D Pagenumnbers, footers, headers etc. however must be typeset -%D in the main bodyfont and style of the document. Returning to -%D the global state can be done with the next macro: - -\def\restoreglobalbodyfont% - {\let\fontsize=\empty - \doswitchpoints[\normalizedglobalbodyfontize]% - \doswitchstyle[\globalfontstyle]% - \redoconvertfont % just in case a pagebreak occurs - \tf} - -%D This macro has to be called when entering the pagebody -%D handling routine as well as the footnote insert routine. -%D Users can access this feature |<|for instance when one wants -%D to typeset tables and alike in the main bodyfont and style -%D while the running text is temporary set to a smaller one|>| -%D by saying \type{\switchtobodyfont[global]}. - -%D \macros -%D {rasterfont} -%D -%D There are (at the moment) two situations in which we want to -%D have fast access to a particular font. When we are using -%D \TEX\ to typeset rasters, we use small {\rasterfont.}'s -%D (a rather small period indeed), the same as \PICTEX\ uses -%D for drawing purposes. - -\def\rasterfont% - {\getvalue{\!!fivepoint\c!rm\c!tf}} - -%D \macros -%D {infofont} -%D -%D The second situation occurs when we enable the info mode, -%D and put all kind of status information in the margin. We -%D don't want huge switches to the main bodyfont and style, so -%D here too we use a direct method. - -\def\infofont% - {\getvalue{\!!sixpoint\c!tt\c!tf}% - \the\everybodyfont} - -%D \macros -%D {definealternativestyle} -%D -%D In the main modules we are going to implement lots of -%D parameterized commands and one of these parameters will -%D concern the font to use. To suit consistent use of fonts we -%D here implement a mechanism for defining the keywords that -%D present a particular style or alternative. -%D -%D \starttypen -%D \definealternativestyle [keywords] [\style] [\nostyle] -%D \stoptypen -%D -%D The first command is used in the normal textflow, while the -%D second command takes care of headings and alike. Consider -%D the next two definitions: -%D -%D \starttypen -%D \definealternativestyle [bold] [\bf] [] -%D \definealternativestyle [cap] [\kap] [\kap] -%D \stoptypen -%D -%D A change \type{\bf} in a heading which is to be set in -%D \type{\tfd} does not look that well, so therefore we leave -%D the second argument of \type{\definealternativestyle} empty. -%D When we capatalize characters using the pseudo small cap -%D command \type{\kap}, we want this to take effect in both -%D text and headings, which is accomplished by assigning both -%D arguments. - -\def\dodefinealternativestyle[#1][#2][#3]% - {\def\docommando##1% - {\doifundefined{##1} - {\expandafter\ifx\csname##1\endcsname#2\else - \setvalue{##1}{\groupedcommand{#2}{}}% - \fi}% - \setvalue{\@letter@##1}{#2}% - \setvalue{\@noletter@##1}{#3}}% - \processcommalist[#1]\docommando} - -\def\definealternativestyle% - {\dotripleargument\dodefinealternativestyle} - -%D This command also defines the keyword as command. This means -%D that the example definition of \type{bold} we gave before, -%D results in a command \type{\bold} which can be used as: -%D -%D \startbuffer -%D He's a \bold{man} man with a {\bold head}. -%D \stopbuffer -%D -%D \typebuffer -%D -%D or -%D -%D \startvoorbeeld -%D \definealternativestyle[bold][\bf][]\haalbuffer -%D \stopvoorbeeld -%D -%D Such definitions are of course unwanted for \type{\kap} -%D because this would result in an endless recursive call. -%D Therefore we check on the existance of both the command and -%D the substitution. The latter is needed because for instance -%D \type{\type} is an entirely diferent command. That command -%D handles verbatim, while the style command would just switch -%D to teletype font. This is just an example of a tricky -%D naming coincidence. - -%D \macros -%D {doconvertfont,noconvertfont, -%D dontconvertfont,redoconvertfont} -%D -%D After having defined such keywords, we can call for them by -%D using -%D -%D \starttypen -%D \doconvertfont{keyword}{text} -%D \stoptypen -%D -%D We deliberately pass an argument. This enables us to -%D assign converters that handle one agrument, like -%D \type{\kap}. -%D -%D By default the first specification is used to set the style, -%D exept when we say \type{\dontconvertfont}, after which the -%D second specification is used. We can also directly call for -%D \type{\noconvertfont}. In nested calls, we can restore the -%D conversion by saying \type{\redoconvertfont}. - -\unexpanded\def\dodoconvertfont#1#2% - {\doifdefinedelse{\@letter@#1} - {\doifelsenothing{#1} - {\def\next{}} - {\def\next{\getvalue{\@letter@#1}}}} - {\doifdefinedelse{#1} - {\def\next{\getvalue{#1}}} - {\def\next{#1}}}% - \next{#2}} - -\let\doconvertfont=\dodoconvertfont - -\def\noconvertfont#1#2% - {\doifdefinedelse{\@noletter@#1} - {\doifelsenothing{#1} - {\def\next{}} - {\def\next{\getvalue{\@noletter@#1}}}} - {\def\next{#1}}% - \next{#2}} - -\unexpanded\def\dontconvertfont% - {\let\doconvertfont=\noconvertfont} - -\unexpanded\def\redoconvertfont% - {\let\doconvertfont=\dodoconvertfont} - -%D These commands are not grouped! Grouping is most probably -%D done by the calling macro's and would lead to unnecessary -%D overhead. - -%D \macros -%D {em,emphasistypeface,emphasisboldface} -%D -%D The next macro started as a copy of Donald Arseneau's -%D \type{\em} (\TUGNEWS\ Vol.~3, no.~1, 1994). His -%D implementation was a bit more sophisticated version of the -%D standard \LATEX\ one. We furter enhanced the macro, so now -%D it also adapts itself to boldface mode. Because we favor -%D {\sl slanted} type over {\it italic}, we made the emphasis -%D adaptable, for instance: -%D -%D \starttypen -%D \def\emphasistypeface {\it} -%D \def\emphasisboldface {\bi} -%D \stoptypen -%D -%D But we prefer: - -\def\emphasistypeface {\sl} -\def\emphasisboldface {\bs} - -\unexpanded\def\em% - {\ifnum\fam=\itfam - \def\emphasistypeface{\it}\tf - \else\ifnum\fam=\slfam - \def\emphasistypeface{\sl}\tf - \else\ifnum\fam=\bffam - \emphasisboldface - \else\ifnum\fam=\bsfam - \def\emphasisboldface{\bs}\bf - \else\ifnum\fam=\bifam - \def\emphasisboldface{\bi}\bf - \else - \emphasistypeface - \fi\fi\fi\fi\fi - \ifdim\fontdimen1\font>\!!zeropoint - \expandafter\aftergroup - \fi - \emphasiscorrection} - -%D Donald's (adapted) macros take the next character into -%D account when placing italic correction. As a bonus we also -%D look for something that looks like a dash, in which case we -%D don't correct. - -\def\emphasiscorrection% - {\ifhmode - \expandafter\emphasislook - \fi} - -\def\emphasislook% - {\begingroup - \futurelet\next\emphasistest} - -\def\emphasistest% - {\ifcat\noexpand\next,% - \setbox\scratchbox=\hbox{\next}% - \ifdim\ht\scratchbox<.3ex - \let\doemphasiscorrection\endgroup - \fi - \fi - \doemphasiscorrection} - -\def\doemphasiscorrection% - {\scratchskip=\lastskip - \ifdim\scratchskip=\!!zeropoint - \/\relax - \else - \unskip\/\hskip\scratchskip - \fi - \endgroup} - -%D We end with some examples which show the behavior when -%D some punctuation is met. We also show how the mechanism -%D adapts itself to bold, italic and slanted typing. -%D -%D \startbuffer -%D test {test}test \par -%D test {\em test}test \par -%D test {\em test}--test \par -%D -%D test {test}, test \par -%D test {\em test}, test \par -%D -%D test {\em test {\em test {\em test} test} test} test \par -%D test {\bf test {\em test {\em test} test} test} test \par -%D test {\sl test {\em test {\em test} test} test} test \par -%D test {\it test {\em test {\em test} test} test} test \par -%D \stopbuffer -%D -%D \typebuffer -%D -%D We get: -%D -%D \startvoorbeeld -%D \startopelkaar -%D \haalbuffer -%D \stopopelkaar -%D \stopvoorbeeld - -%D \macros -%D {setfont} -%D -%D Every now and then we want to define a font directly, for -%D instance when we typeset title pages. The next macro saves -%D some typing: - -\def\setfont% - {\def\dosetfont% - {\nextfont\stelinterliniein}% - \afterassignment\dosetfont - \font\nextfont=} - -%D One can call this macro as: -%D -%D \starttypen -%D \setfont cmr10 at 60pt -%D \stoptypen -%D -%D After which the font is active and the baselines and -%D struts are set. - -%D \macros -%D {showbodyfont} -%D -%D One can call for a rather simple overview of a bodyfont and the -%D relations between its alternative fonts. -%D -%D \showsetup{\y!showbodyfont} -%D -%D The current bodyfont (here we omitted the argument) looks like: -%D -%D \showbodyfont -%D -%D The implementation is rather straightforward in using -%D \type{\halign}. - -\def\doshowbodyfont[#1]% - {\startbaselinecorrection - \vbox - {\def\bigstrut##1##2% - {\hbox{\vrule - \!!height ##1\ht\strutbox - \!!depth ##2\dp\strutbox - \!!width \!!zeropoint}} - \doifelsenothing{#1} - {\def\title{\the\korpsgrootte}} - {\switchtobodyfont[#1]\def\title{#1}} - \tabskip\!!zeropoint - \parindent\!!zeropoint - \def\next##1##2##3% - {&&##1&&##2\tf##3&&##2\sc##3% - &&##2\sl##3&&##2\it##3&&##2\bf##3&&##2\bs##3&&##2\bi##3% - &&##2\tfx##3&&##2\tfxx##3% - &&##2\tfa##3&&##2\tfb##3&&##2\tfc##3&&##2\tfd##3&\cr}% - \setlocalhsize - \halign to \localhsize - {\bigstrut{1.5}{2}##&\vrule## - \tabskip=\!!zeropoint \!!plus 1fill - &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## - &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## - &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## - &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## - &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## - &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## - &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule - \tabskip=\!!zeropoint\cr - \noalign{\hrule} - &\multispan{29}{\vrule\hfil\tttf\strut[\title]\hfil\vrule}\cr - \noalign{\hrule}\next{}{\tt\string}{} - \noalign{\hrule}\next{\tt\string\rm}{\rm}{Ag} - \noalign{\hrule}\next{\tt\string\ss}{\ss}{Ag} - \noalign{\hrule}\next{\tt\string\tt}{\tt}{Ag} - \noalign{\hrule}}} - \stopbaselinecorrection} - -\def\showbodyfont% - {\dosingleempty\doshowbodyfont} - -%D \macros -%D {showbodyfontenvironment} -%D -%D The current bodyfontenvironment is: -%D -%D \showbodyfontenvironment -%D -%D This overview is generated using: -%D -%D \showsetup{\y!showbodyfontenvironment} - -\def\doshowbodyfontenvironment[#1]% - {\startbaselinecorrection - \vbox - {\tabskip\!!zeropoint - \parindent\!!zeropoint - \doifelsenothing{#1} - {\def\title{\the\korpsgrootte}} - {\switchtobodyfont[#1]\def\title{#1}} - \def\do##1##2% - {\getvalue{\??ft##1##2}} - \def\next##1##2% - {&&##1{##2}{\s!text}&&##1{##2}{\s!script}&&##1{##2}{\s!scriptscript}% - &&##1{##2}{\c!x}&&##1{##2}{\c!xx}% - &&##1{##2}{\v!klein}&&##1{##2}{\v!groot}&\cr - \noalign{\hrule}} - \def\donext##1% - {\doifdefined{\??ft##1\s!text}{\next\do##1}} - \setlocalhsize - \halign to \localhsize - {##&\vrule##\strut - \tabskip=\!!zeropoint \!!plus 1fill - &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## - &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule## - &\hfil##\hfil&##\vrule - \tabskip=\!!zeropoint\cr - \noalign{\hrule} - &\multispan{15}{\vrule\hfil\tttf\strut[\title]\hfil}\vrule\cr - \noalign{\hrule} - \next\bf\relax - \donext\!!twelvepoint\donext\!!elevenpoint\donext\!!tenpoint - \donext\!!ninepoint \donext\!!eightpoint \donext\!!sevenpoint - \donext\!!sixpoint \donext\!!fivepoint \donext\!!fourpoint}} - \stopbaselinecorrection} - -\def\showbodyfontenvironment% - {\dosingleempty\doshowbodyfontenvironment} - -%D Fonts can only be used when loaded. In \CONTEXT\ we -%D postpone the loading of fonts, even when we load \PLAIN. -%D This means that we have to redefine one of the \PLAIN\ -%D macros. Let's tell that to the user first: - -\writestatus{loading}{Postponed Plain TeX Font Definitions} - -%D \macros -%D {bordermatrix} -%D -%D In \PLAIN\ \TEX\ the width of a parenthesis is stored in -%D the \DIMENSION\ \type{\p@renwd}. This value is derived from -%D the width of \type{\tenrm B}, so let's take care of it now: - -\let\normalbordermatrix=\bordermatrix - -\def\bordermatrix% - {\bgroup - \setbox0=\hbox{\getvalue{\textface\c!mm\c!ex}B}% - \global\p@renwd=\wd0\relax - \egroup - \normalbordermatrix} - -%D Because we want to be as \PLAIN\ compatible as possible, we -%D make most of \PLAIN's font mechanisme available to the -%D \CONTEXT\ user. - -\def\setplainfonts#1#2% - {\setvalue{ten#1}{\getvalue{\!!tenpoint#2}}% - \setvalue{seven#1}{\getvalue{\!!sevenpoint#2}}% - \setvalue{five#1}{\getvalue{\!!fivepoint#2}}} - -\setplainfonts {\c!rm} {\c!rm\c!tf} -\setplainfonts {\c!bf} {\c!rm\c!bf} -\setplainfonts {\c!sl} {\c!rm\c!sl} -\setplainfonts {\c!it} {\c!rm\c!it} -\setplainfonts {\c!tt} {\c!rm\c!tt} -\setplainfonts {\c!sy} {\c!mm\c!sy} -\setplainfonts {\c!ex} {\c!mm\c!ex} -\setplainfonts {\c!i} {\c!mm\c!mi} - -\let\setplainfonts=\undefined - -%D \macros -%D {ss, SS} -%D -%D We are going to redefine \type{\ss} but for those wo still -%D want to have access to the german \SS, we save it's value in -%D \type{\SS}. Ok, I should have used \type{\sf} insead of -%D \type{\ss} in the first place. - -\let\SS=\ss - -%D \macros -%D {xi} -%D -%D We are going to redefine \type{\xi}, but fortunately this -%D is a math mode character, so we can just say: - -\let\normalxi=\xi - -%D \macros -%D {dotlessi,dotlessj} -%D -%D We also save both dotless~\dotlessi\ and~\dotlessj. This -%D way we still have them were we expect them, even when -%D macros of font providers redefine them. - -\let\dotlessi=\i -\let\dotlessj=\j - -%D \macros -%D {smashaccent} -%D {} -%D -%D When we let \TEX\ put an accent on top of a character, such -%D composed characters can get more height that height of a -%D standard \type{\strut}. The next macro takes care of such -%D unwanted compositions. -%D -%D We need to reach over the number that specifies the accent, -% %D and in doing so we use \type{\hyphenchar} as a placeholder -%D and in doing so we use \type{\scratchcounter} as a placeholder -%D because it accepts 8 bit numbers in octal, decimal or -%D hexadecimal format. Next we set the height of the accented -%D character to the natural height of the character. - -\def\dodosmashaccent#1% - {\bgroup - \setbox0=\hbox{#1}% - \setbox2=\hbox{\normalaccent\scratchcounter#1}% - \ht2=\ht0\box2 - \egroup - \nobreak} - -\def\dosmashaccent% - {\afterassignment\dodosmashaccent\expandafter\scratchcounter} - -\def\smashaccent% - {\dontleavehmode - \let\accent=\dosmashaccent} - -%D For instance we can say: -%D -%D \starttypen -%D \smashaccent\"Uberhaupt -%D \stoptypen -%D -%D But normally one will use it as a prefix in definitions. - -%D \macros -%D {moveaccent} -%D -%D Exact positioning of accents cns be realized by saying: -%D -%D \starttypen -%D \moveaccent{-.1ex}\"uberhaupt -%D \stoptypen -%D -%D Again, this one will mostly used as a prefix in definitions. - -\def\dodomoveaccent#1% - {\bgroup - \dimen0=\fontdimen5\font - \dimen2=\dimen0 - \advance\dimen2 by -\accentdisplacement - \fontdimen5\font=\dimen2 - \normalaccent\scratchcounter#1\relax - \fontdimen5\font=\dimen0 - \egroup} - -\def\domoveaccent% - {\afterassignment\dodomoveaccent\expandafter\scratchcounter} - -\def\moveaccent#1% - {\dontleavehmode - \def\accentdisplacement{#1}% - \let\accent=\domoveaccent} - -%D \macros -%D {everyuppercase, EveryUppercase} -%D -%D When we want to uppercase strings of characters, we have to -%D take care of those characters that have a special meaning or -%D are only accessible by means of macros. The next hack was -%D introduced when Tobias Burnus started translating head and -%D label texts into spanish and italian. The first application -%D of this token register therefore can be found in the module -%D that deals with these texts. - -\newevery \everyuppercase \EveryUppercase - -\appendtoks \def\i{I}\to \everyuppercase -\appendtoks \def\j{J}\to \everyuppercase -\appendtoks \def\ss{SS}\to \everyuppercase -\appendtoks \let\l=\L\to \everyuppercase -\appendtoks \let\ae=\AE\to \everyuppercase -\appendtoks \let\aa=\AA\to \everyuppercase -\appendtoks \let\o=\O\to \everyuppercase -\appendtoks \let\oe=\OE\to \everyuppercase - -%D \macros -%D {everysanitize, EverySanitize} -%D -%D Whenever we are sanitizing strings, like we sometimes do -%D when we deal with specials, the next token register can be -%D called. - -\newevery \everysanitize \EverySanitize - -%D \macros -%D {obeylccodes} -%D -%D One way of manipulating characters is changing the their -%D \type{\lccode} and applying \type{\lowcase}. An example of -%D this can be found in \type{spec-mis}. - -\def\obeylccodes% - {\scratchcounter=32 - \loop - \ifnum\scratchcounter<127 - \lccode\scratchcounter=\scratchcounter - \advance\scratchcounter by 1 - \repeat - \ifeightbitcharacters - \scratchcounter=128 - \loop - \ifnum\scratchcounter<255 - \lccode\scratchcounter=`. - \advance\scratchcounter by 1 - \repeat - \fi} - -%D Here come the definitions. - -\redefineaccent ' % grave -\redefineaccent ` % acute -\redefineaccent " % dieresis -\redefineaccent ^ % circumflex -\redefineaccent ~ % tilde -\redefineaccent v % caron -\redefineaccent u % breve -\redefineaccent . % dotaccent -\redefineaccent H % hungarumlaut -\redefineaccent t % ........ - -\redefinecharacter ae % ae -\redefinecharacter AE % AE -\redefinecharacter oe % oe -\redefinecharacter OE % OE -\redefinecharacter o % oslash -\redefinecharacter O % Oslash -\redefinecharacter ss % germandbls -\redefinecharacter SS % germandbls -\redefinecharacter aa % aring -\redefinecharacter AA % Aring -\redefinecharacter cc % ccedilla -\redefinecharacter CC % Ccedilla - -\redefinecommand b -\redefinecommand c - -\definebodyfontenvironment - [\!!fourteenpointfour] - [ \s!text=\!!fourteenpointfour, - \s!script=\!!elevenpoint, - \s!scriptscript=\!!ninepoint, - \c!x=\!!twelvepoint, - \c!xx=\!!tenpoint, - \c!groot=\!!fourteenpointfour, - \c!klein=\!!twelvepoint] - -\definebodyfontenvironment - [\!!twelvepoint] - [ \s!text=\!!twelvepoint, - \s!script=\!!ninepoint, - \s!scriptscript=\!!sevenpoint, - \c!x=\!!tenpoint, - \c!xx=\!!eightpoint, - \c!groot=\!!fourteenpointfour, - \c!klein=\!!tenpoint] - -\definebodyfontenvironment - [\!!elevenpoint] - [ \s!text=\!!elevenpoint, - \s!script=\!!eightpoint, - \s!scriptscript=\!!sixpoint, - \c!x=\!!ninepoint, - \c!xx=\!!sevenpoint, - \c!groot=\!!twelvepoint, - \c!klein=\!!ninepoint] - -\definebodyfontenvironment - [\!!tenpoint] - [ \s!text=\!!tenpoint, - \s!script=\!!sevenpoint, - \s!scriptscript=\!!fivepoint, - \c!x=\!!eightpoint, - \c!xx=\!!sixpoint, - \c!groot=\!!twelvepoint, - \c!klein=\!!eightpoint] - -\definebodyfontenvironment - [\!!ninepoint] - [ \s!text=\!!ninepoint, - \s!script=\!!sevenpoint, - \s!scriptscript=\!!fivepoint, - \c!x=\!!sevenpoint, - \c!xx=\!!fivepoint, - \c!groot=\!!elevenpoint, - \c!klein=\!!sevenpoint] - -\definebodyfontenvironment - [\!!eightpoint] - [ \s!text=\!!eightpoint, - \s!script=\!!sixpoint, - \s!scriptscript=\!!fivepoint, - \c!x=\!!sixpoint, - \c!xx=\!!fivepoint, - \c!groot=\!!tenpoint, - \c!klein=\!!sixpoint] - -\definebodyfontenvironment - [\!!sevenpoint] - [ \s!text=\!!sevenpoint, - \s!script=\!!sixpoint, - \s!scriptscript=\!!fivepoint, - \c!x=\!!sixpoint, - \c!xx=\!!fivepoint, - \c!groot=\!!ninepoint, - \c!klein=\!!fivepoint] - -\definebodyfontenvironment - [\!!sixpoint] - [ \s!text=\!!sixpoint, - \s!script=\!!fivepoint, - \s!scriptscript=\!!fivepoint, - \c!x=\!!fivepoint, - \c!xx=\!!fivepoint, - \c!groot=\!!eightpoint, - \c!klein=\!!fivepoint] - -\definebodyfontenvironment - [\!!fivepoint] - [ \s!text=\!!fivepoint, - \s!script=\!!fivepoint, - \s!scriptscript=\!!fivepoint, - \c!x=\!!fivepoint, - \c!xx=\!!fivepoint, - \c!groot=\!!sevenpoint, - \c!klein=\!!fivepoint] - -\definebodyfontenvironment - [\!!fourpoint] - [ \s!text=\!!fourpoint, - \s!script=\!!fourpoint, - \s!scriptscript=\!!fourpoint, - \c!x=\!!fourpoint, - \c!xx=\!!fourpoint, - \c!groot=\!!sixpoint, - \c!klein=\!!fourpoint] - -\definebodyfontswitch [fourteenpointfour] [\!!fourteenpointfour] -\definebodyfontswitch [twelvepoint] [\!!twelvepoint] -\definebodyfontswitch [elevenpoint] [\!!elevenpoint] -\definebodyfontswitch [tenpoint] [\!!tenpoint] -\definebodyfontswitch [ninepoint] [\!!ninepoint] -\definebodyfontswitch [eightpoint] [\!!eightpoint] -\definebodyfontswitch [sevenpoint] [\!!sevenpoint] -\definebodyfontswitch [sixpoint] [\!!sixpoint] -\definebodyfontswitch [fivepoint] [\!!fivepoint] -\definebodyfontswitch [fourpoint] [\!!fourpoint] - -\definebodyfontswitch [xii] [\!!twelvepoint] -\definebodyfontswitch [xi] [\!!elevenpoint] -\definebodyfontswitch [x] [\!!tenpoint] -\definebodyfontswitch [ix] [\!!ninepoint] -\definebodyfontswitch [viii] [\!!eightpoint] -\definebodyfontswitch [vii] [\!!sevenpoint] -\definebodyfontswitch [vi] [\!!sixpoint] - -\defineoverallstyle [\v!romaan, \c!rm] [\c!rm] -\defineoverallstyle [\v!schreefloos, \c!ss] [\c!ss] -\defineoverallstyle [\v!type, \c!tt] [\c!tt] -\defineoverallstyle [\v!handschrift, \c!hw] [\c!hw] -\defineoverallstyle [\v!calligrafie, \c!cg] [\c!cg] - -\definealternativestyle [\v!mediaeval] [\os] [] -\definealternativestyle [\v!normaal] [\tf] [] -\definealternativestyle [\v!vet] [\bf] [] -\definealternativestyle [\v!type] [\tt] [] -\definealternativestyle [\v!schuin] [\sl] [] -\definealternativestyle [\v!vetschuin,\v!schuinvet] [\bs] [] -\definealternativestyle [\v!klein,\v!kleinnormaal] [\tfx] [] -\definealternativestyle [\v!kleinvet] [\bfx] [] -\definealternativestyle [\v!kleintype] [\ttx] [] -\definealternativestyle [\v!kleinschuin] [\slx] [] -\definealternativestyle [\v!kleinvetschuin,\v!kleinschuinvet] [\bsx] [] -\definealternativestyle [\v!kap,\v!kapitaal] [\kap] [\kap] - -%D We still have to take care of \type{\xi}, so: - -\def\xi% - {\ifmmode\normalxi\else\elevenpoint\fi} - -%D By default we load the Computer Modern Roman fonts and -%D activate the 12pt roman bodyfont. Sans serif and teletype are -%D also available and can be called for by \type{\ss} and -%D \type{\tt}. - -%D We also load the high \ASCII\ waarde as defined by the -%D standard \kap{IBM PC} codepage. Finaly we load the -%D \POSTSCRIPT\ standard predefined accented characters -%D encoding vector as provided by Y\&Y named \type{texnansi}. -%D These are for instance used when we load Lucida Bright -%D (\type{lbr}) or \POSTSCRIPT\ Times Roman (\type{ptr}), -%D Helvetica (\type{phv}) and Courier (\type{pcr}) which are -%D also available as whole (\type{\setupbodyfont[pos]}). - -\setupbodyfont [cmr, 12pt, \v!romaan, ibm, ans] - -\protect - -\endinput +%D \module
+%D [ file=font-ini,
+%D version=1997.11.15,
+%D title=\CONTEXT\ Font 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 Font Macros (ini)}
+
+\unprotect
+
+\startmessages dutch library: fonts
+ title: korps
+ 1: codering --, groepeer zonodig
+ 2: variant -- wordt geladen
+ 3: onbekende variant --
+ 4: korps -- is niet gedefinieerd
+ 5: stijl -- is niet gedefinieerd
+ 6: -- wordt geladen
+ 7: onbekend formaat --
+ 8: stijl -- gedefinieerd
+\stopmessages
+
+\startmessages english library: fonts
+ title: bodyfont
+ 1: coding --, one could use grouping
+ 2: variant -- is loaded
+ 3: unknown variant --
+ 4: bodyfont -- is not defined
+ 5: style -- is not defined
+ 6: -- is loaded
+ 7: unknown format --
+ 8: style -- defined
+\stopmessages
+
+\startmessages german library: fonts
+ title: Fliesstext
+ 1: Kodierung --, Gruppierung moeglich
+ 2: Variante -- ist geladen
+ 3: Unbekannte Variante --
+ 4: Fliesstext -- ist nicht definiert
+ 5: Stil -- ist nicht definiert
+ 6: -- ist geladen
+ 7: unbekanntes Format --
+ 8: Stil -- definiert
+\stopmessages
+
+%D This module is one of the oldest modules of \CONTEXT. The
+%D macros below evolved out of the \PLAIN\ \TEX\ macros and
+%D therefore use a similar naming scheme (\type{\rm},
+%D \type{\bf}, etc). This module grew out of our needs. We
+%D started with the \PLAIN\ \TEX\ definitions, generalized the
+%D underlaying macros, and extended those to a level at which
+%D probably no one will ever recognize them.
+%D
+%D One important characteristic of the font mechanism presented
+%D here is the postponing of font loading. This makes it
+%D possible to distribute \type{fmt} files without bothering
+%D about the specific breed of \type{tfm} files.
+%D
+%D Another feature implemented here is the massive switching
+%D from roman to {\ss sans serif}, {\tt teletype} or else. This
+%D means one doesn't have to take care of all kind of relations
+%D between fonts.
+
+%D \macros
+%D {rm,ss,tt,hw,cg}
+%D
+%D Fonts are defined in separate files. When we define a font,
+%D we distinguish between several styles. In most cases we will
+%D use:
+%D
+%D \startregelcorrectie
+%D \starttabel[|l||]
+%D \HL
+%D \NC roman \NC \type{\rm} \NC\FR
+%D \NC sansserif \NC \type{\ss} \NC\MR
+%D \NC type \NC \type{\tt} \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D The number of styles is not limited to these three. When
+%D using Lucida Bright we can for instance also define:
+%D
+%D \startregelcorrectie
+%D \starttabel[|l||]
+%D \HL
+%D \NC handwritten \NC \type{\hw} \NC\FR
+%D \NC calligraphic \NC \type{\cg} \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D Anyone who feels the need, can define additional ones, like
+%D
+%D \startregelcorrectie
+%D \starttabel[|l||]
+%D \HL
+%D \NC faxfont \NC \type{\ff} \NC\FR
+%D \NC blackboard \NC \type{\bb} \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D Or even
+%D
+%D \startregelcorrectie
+%D \starttabel[|l||]
+%D \HL
+%D \NC hebrew \NC \type{\hb} \NC\SR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D Styles are grouped in font sets. At the moment there are
+%D three main sets defined:
+%D
+%D \startregelcorrectie
+%D \starttabel[|l|l||]
+%D \HL
+%D \NC Computer Modern Roman \NC Knuth \NC \type{cmr} \NC\FR
+%D \NC Lucida Bright \NC Bigelow \& Holmes \NC \type{lbr} \NC\MR
+%D \NC Standard Postscript Fonts \NC Adobe \NC \type{pos} \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D There are also some Computer Modern Roman alternatives:
+%D
+%D \startregelcorrectie
+%D \starttabel[|l|l||]
+%D \HL
+%D \NC Computer Modern Roman \NC Knuth \& Sauter \NC \type{sau} \NC\FR
+%D \NC Euler fonts \NC Zapf \NC \type{eul} \NC\MR
+%D \NC Computer Modern Concrete \NC Knuth \& Zapf \NC \type{con} \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D All these definitions are ordered in files with names like
+%D \type{font-cmr} and \type{font-pos}, where the last three
+%D characters specify the name as known to \CONTEXT.
+%D
+%D Within such a font set (\type{cmr}) and style (\type{\rm})
+%D we can define a number of text font alternatives:
+%D
+%D \startregelcorrectie
+%D \starttabel[|l||]
+%D \HL
+%D \NC typeface \NC \type{\tf} \NC\FR
+%D \NC boldface \NC \type{\bf} \NC\MR
+%D \NC slanted \NC \type{\sl} \NC\MR
+%D \NC italic \NC \type{\it} \NC\MR
+%D \NC boldslanted \NC \type{\bs} \NC\MR
+%D \NC bolditalic \NC \type{\bi} \NC\MR
+%D \NC smallcaps \NC \type{\sc} \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+
+%D The more primitive is (still) predefined:
+%D
+%D \startregelcorrectie
+%D \starttabel[|l||]
+%D \HL
+%D \NC oldstyle \NC \type{\os} \NC\SR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D The availability of these alternatives depends on the
+%D completeness of a font family and of course the definitions
+%D in the font files.
+%D
+%D But let's not forget math. In addition to the previous \TEX\
+%D families (the mysterious \type{\fam}'s) we've got some more:
+%D
+%D \startregelcorrectie
+%D \starttabel[|l||]
+%D \HL
+%D \NC Math Roman \NC \type{\mr} \NC\FR
+%D \NC Math Italic \NC \type{\mi} \NC\MR
+%D \NC Math Symbol \NC \type{\sy} \NC\MR
+%D \NC Math Extra \NC \type{\ex} \NC\MR
+%D \NC Math A \NC \type{\ma} \NC\MR
+%D \NC Math B \NC \type{\mb} \NC\MR
+%D \NC Math C \NC \type{\mc} \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D Users can call for specific fonts in many ways. Switches to
+%D other typefaces, like the switch from normal to bold, are as
+%D intuitive as possible, which means that all dependant fonts
+%D also switch. One can imagine that this takes quite some
+%D processing time.
+%D
+%D Internally fonts are stored as combination of size, style
+%D and alternative, e.g. \type{12pt}+\type{\ss}+\type{\bf}.
+%D Users are not confronted with sizes, but use the style or
+%D style+alternative to activate them.
+%D
+%D During the definition of a bodyfont one can also declare the
+%D available larger alternatives:
+%D
+%D \starttypen
+%D \tf \tfa \tfb \tfc ...
+%D \bf \bfa \bfb \bfc ...
+%D \sl \sla \slb \slc ...
+%D \stoptypen
+%D
+%D The smaller ones are automatically supplied and derived from
+%D the the bodyfont environment.
+%D
+%D \starttypen
+%D \tfx \tfxx
+%D \bfx \bfxx
+%D \slx \slxx
+%D \stoptypen
+%D
+%D There are only two smaller alternatives per style. The
+%D larger alternatives on the other hand have no limitations.
+%D
+%D These larger alternatives are mostly used in chapter and
+%D section titles or on title pages. When one switches to a
+%D larger alternative, the bold an other ones automatically
+%D adapt themselves:
+%D
+%D \startbuffer
+%D \tfd Hi \bf there\sl, here \tfb I \bf am
+%D \stopbuffer
+%D
+%S \startsmaller
+%D \typebuffer
+%S \stopsmaller
+%D
+%D therefore becomes:
+%D
+%D \startvoorbeeld
+%D \haalbuffer
+%D \stopvoorbeeld
+%D
+%D Maybe this mechanism isn't always as logic, but as said
+%D before, we tried to make it as intuitive as possible.
+%D
+%D So a specific kind of glyph can be characterized by:
+%D
+%D \startsmaller
+%D family (cmr) + bodyfont (12pt) + style (rm) + alternative (bf) + size (a)
+%D \stopsmaller
+%D
+%D The last component (the size) is optional.
+%D
+%D We introduced \type{\tf} as command to call for the current
+%D normally sized typeface. This commands results in roman,
+%D sans serif, teletype or whatever style is in charge. Such
+%D rather massive switches of style sometimes take more
+%D processing time than comfortable. Of course there is a
+%D workaround for this: we can call fonts directly by means of
+%D commands like:
+%D
+%D \starttypen
+%D \rmtf \sssl \tttf \rmbsa
+%D \stoptypen
+%D
+%D One should realize that this fast calls have limitations,
+%D they lack for instance automatic super- and subscript
+%D support.
+%D
+%D This leaves us two more commands: \type{\tx} and
+%D \type{\txx}. These activate a smaller and even more smaller
+%D font than the current one and adapt themselves to the
+%D current alternative, so when \type{\bf} is active,
+%D \type{\tx} gives a smaller boldface, which in turn can be
+%D called directly by \type{\bfx}.
+%D
+%D These two smaller alternatives are specified by the bodyfont
+%D environment and therefore not necessarily have similar sizes
+%D as \type{\scriptsize} and \type{\scriptscriptsize}. The main
+%D reason for this incompatibility (which can easily be undone)
+%D lays in the fact that we often want a bit bigger characters
+%D than in math mode. In \CONTEXT\ for instance the \type{\tx}
+%D and \type{\txx} commands are used for surrogate
+%D \kap{smallcaps} which support both nesting and alternatives,
+%D like in {\bf\kap{a \kap{small} world}}, which was typeset by
+%D
+%D \starttypen
+%D \bf\kap{a \kap{small} world}
+%D \stoptypen
+%D
+%D And compare $\rm \scriptstyle THIS$ with the slightly larger
+%D \kap{THIS}: \ruledhbox{$\rm \scriptstyle\ scriptstyle THIS$}
+%D or \ruledhbox{\kap{THIS x style}} makes a big difference.
+
+%D \macros
+%D {mf}
+%D
+%D Math fonts are a species in their own. They are tightly
+%D hooked into smaller and even smaller ones of similar breed
+%D to form a tight family. Let's first see how these are
+%D related:
+%D
+%D \startbuffer
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\rm 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\rm 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\tf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\tf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\bf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\bf 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+ \bi x^2 =\sl 6x^2$
+%D $\tf x^2+\bf x^2+\sl x^2+\it x^2+\bs x^2+{\bi x^2}=\sl 6x^2$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Gives both an expected and unexpected result:
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D We see here that the character shapes change accordingly to
+%D the current family, but that the symbols are always typeset
+%D in the font assigned to \type{\fam0}.
+%D
+%D \startbuffer
+%D $\tf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\bf\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\sl\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\bs\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\it\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D $\bi\mf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = 6x^2$
+%D \stopbuffer
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D In this example we see a new command \type{\mf} surface
+%D which means as much as {\em math font}. This commands
+%D reactivates the last font alternative and therefore equals
+%D \type{\bf}, \type{\sl} etc. but by default it equals
+%D \type{\tf}:
+
+\def\mf{\tf}
+
+%D The previous example was typeset saying:
+%D
+%D \typebuffer
+%D
+%D Beware: the exact location of \type{\mf} is not that
+%D important, we could as well has said
+%D
+%D \startbuffer
+%D $\bf x^2 + x^2 + x^2 + x^2 + x^2 + x^2 = \mf 6x^2$
+%D \stopbuffer
+%D
+%D This is due to the way \TEX\ handles fonts in math mode.
+%D
+%D Of course we'll have to redefine \type{\mf} every time we
+%D change the current \type{\fam}.
+
+%D \macros
+%D {mbox,enablembox,mathop}
+%D
+%D Now how can we put this to use? Will the next sequence
+%D give the desired result?
+%D
+%D \startbuffer
+%D $\bf x^2 + \hbox{\mf whatever} + \sin(2x)$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D It won't!
+%D
+%D \startvoorbeeld
+%D \let\mathop=\normalmathop \haalbuffer
+%D \stopvoorbeeld
+%D
+%D The reason for this is that \type{\sin} is defined as:
+%D
+%D \starttypen
+%D \def\sin{\mathop{\rm sin}\nolimits}
+%D \stoptypen
+%D
+%D We can fix this by defining
+
+\let\normalmathop=\mathop
+
+\def\mathop%
+ {\normalmathop
+ \bgroup
+ \let\rm=\mf
+ \let\next=}
+
+%D Of course this can be fixed, if not by a very dirty trick:
+%D redefining the \TEX\ primitive \type{\hbox}:
+%D
+%D \starttypen
+%D \let\normalhbox=\hbox
+%D
+%D \def\hbox%
+%D {\ifmmode\mbox\else\normalhbox\fi}
+%D \stoptypen
+%D
+%D With
+%D
+%D \starttypen
+%D \def\mbox#1#%
+%D {\normalhbox#1\bgroup\mf\let\next=}
+%D \stoptypen
+%D
+%D or more robust, that is, also accepting \type{\hbox\bgroup}:
+%D
+%D \starttypen
+%D \def\mbox%
+%D {\normalhbox\bgroup\mf
+%D \dowithnextbox{\box\nextbox\egroup}%
+%D \normalhbox}
+%D \stoptypen
+%D
+%D And now:
+%D
+%D \startbuffer
+%D $\bf x^2 + \hbox{whatever} + \sin(2x)$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Indeed gives:
+%D
+%D \startvoorbeeld
+%D \enablembox\haalbuffer
+%D \stopvoorbeeld
+%D
+%D But, do we want this kind of trickery to be activated? No,
+%D simply because we cannot be sure of incompatibilties,
+%D although for instance unboxing goes ok. Therefore we
+%D introduce:
+
+\def\normalmbox%
+ {\normalhbox\bgroup\mf
+ \dowithnextbox{\box\nextbox\egroup}\normalhbox}
+
+\def\mbox%
+ {\ifmmode\normalmbox\else\normalhbox\fi}
+
+\def\enablembox%
+ {\appendtoks
+ \let\normalhbox=\hbox
+ \let\hbox=\mbox
+ \to\everymath}
+
+%D So in fact one can enable feature if needed. I would say:
+%D go along, but use grouping if needed!
+
+%D \macros
+%D {mrfam,mifam,syfam,exfam,
+%D bsfam,bifam,scfam,tffam,
+%D mafam,mbfam,msfam}
+%D
+%D After this short mathematical excursion, we enter the world
+%D of fonts and fontswitching. We start with something very
+%D \TEX: \type{\fam} specified font families. \TEX\ uses
+%D families for managing fonts in math mode. Such a family has
+%D three members: text, script and scriptscript: $x^{y^z}$. In
+%D \CONTEXT\ we take a bit different approach than \PLAIN\
+%D \TEX\ does. \PLAIN\ \TEX\ needs at least four families for
+%D typesetting math. We use those but give them symbolic names.
+
+\chardef\mrfam=0 % 0 (Plain TeX) Math Roman
+\chardef\mifam=1 % 1 (Plain TeX) Math Italic
+\chardef\syfam=2 % 2 (Plain TeX) Math Symbol
+\chardef\exfam=3 % 3 (Plain TeX) Math Extra
+
+%D \PLAIN\ \TEX\ also defines families for {\it italic}, {\sl
+%D slanted} and {\bf bold} typefaces, so we don't have to
+%D define them here.
+%D
+%D \starttypen
+%D \itfam % 4 (Plain TeX) Italic
+%D \slfam % 5 (Plain TeX) Slanted
+%D \bffam % 6 (Plain TeX) Boldface
+%D \stoptypen
+%D
+%D Family~7 in \PLAIN\ \TEX\ is not used in \CONTEXT, because
+%D we do massive switches from roman to sans serif, teletype or
+%D other faces.
+%D
+%D \starttypen
+%D \ttfam % 7 (Plain TeX) can be reused!
+%D \stoptypen
+%D
+%D We define ourselves some more families for {\bs bold
+%D slanted}, {\bi bold italic} and {\sc Small Caps}, so
+%D we can use them in math mode too. Instead of separate
+%D families for {\ss sans serif} and \type{teletype} we use the
+%D more general \type{\tffam}, which stands for typeface.
+
+\newfam\bsfam % 8 (ConTeXt) BoldSlanted
+\newfam\bifam % 9 (ConTeXt) BoldItalic
+\newfam\scfam % A (ConTeXt) SmallCaps
+\newfam\tffam % B (ConTeXt) TypeFace
+
+%D Because Taco needs a few more math families, we reuse
+%D family~7 for all those typefaces that have no related
+%D family, and therefore are grouped into one.
+
+\let\nnfam\ttfam % 7 (ReUsed) NoName
+
+%D Normally \type{\mrfam} equals \type{\tffam}, but a more
+%D distinctive alternatives are possible, for instance the
+%D Euler and Concrete Typefaces.
+%D
+%D After having defined all those in nature non||mathematical
+%D families, we define ourselves some real math ones. These are
+%D needed for the \AMS\ Symbol Fonts and Extended Lucida
+%D Bright.
+
+\newfam\mafam % C (ConTeXt) Math A Fam (AmsTeX A)
+\newfam\mbfam % D (ConTeXt) Math B Fam (AmsTeX B)
+\newfam\mcfam % E (ConTeXt) Math C Fam
+
+%D Because there are 16~families and because \type{\ttfam}
+%D is reused, at the moment we have one families left:~F.
+%D
+%D To ease the support of font packages, we als define
+%D shortcuts to these familynames. This is necessary because
+%D the family names are in fact \type{\chardef}'s, which means
+%D that we're dealing with numbers (one can check this by
+%D applying \type{\showthe} and \type{\show}). In the
+%D specification of math symbols however we need hexadecimal
+%D numbers, so we have to convert the \type{\fam}'s value.
+
+\def\hexnumber#1%
+ {\ifcase#1
+ 0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or A\or B\or C\or D\or E\or F%
+ \fi}
+
+\edef\hexmrfam {\hexnumber\mrfam} \edef\hexbsfam {\hexnumber\bsfam}
+\edef\hexmifam {\hexnumber\mifam} \edef\hexbifam {\hexnumber\bifam}
+\edef\hexsyfam {\hexnumber\syfam} \edef\hexscfam {\hexnumber\scfam}
+\edef\hexexfam {\hexnumber\exfam} \edef\hextffam {\hexnumber\tffam}
+\edef\hexitfam {\hexnumber\itfam} \edef\hexmafam {\hexnumber\mafam}
+\edef\hexslfam {\hexnumber\slfam} \edef\hexmbfam {\hexnumber\mbfam}
+\edef\hexbffam {\hexnumber\bffam} \edef\hexmcfam {\hexnumber\mcfam}
+
+\edef\hexnnfam {\hexnumber\nnfam}
+
+%D We define some (very private) constants to improve speed,
+%D memory usage and consistency.
+
+\def\@plain@ {@f@pl@} % plain TeX encoding vector
+\def\@size@ {@f@si@} % bodyfont size prefix (12pt etc)
+\def\@style@ {@f@st@} % full style prefix (roman etc)
+\def\@shortstyle@ {@f@sh@} % short style prefix (rm etc)
+\def\@letter@ {@f@le@} % first alternative typeface
+\def\@noletter@ {@f@no@} % second alternative typeface
+
+%D We also define a list of all text (i.e.\ non math symbol)
+%D families. I considered using something like:
+%D
+%D \starttypen
+%D \def\familylist%
+%D {\do\c!tf\do\c!sl\do\c!it\do\c!bf\do\c!bs\do\c!bi\do\c!sc}
+%D \stoptypen
+%D
+%D By assigning \type{\do} some suitable meaning one can
+%D process such lists quite fast. The current implementation
+%D uses the commalist processing macros and is not that
+%D slow either.
+
+\def\familylist%
+ {\c!tf,\c!sl,\c!it,\c!bf,\c!bs,\c!bi,\c!sc}
+
+%D This list will be extended when needed with (pseudo)
+%D families. The speude ones will in fact use the NoName
+%D family.
+
+%D All used styles, like rm, ss and tt, are saved in a comma
+%D separated list. Appart from practical limitations one can
+%D define as many styles as needed, but first we
+
+\let\stylelist=\empty
+
+%D Further on we have to take some precautions when dealing
+%D with special characters like~\type{~}, \type{_}
+%D and~\type{^}, so let us define ourselve some handy macros
+%D first.
+
+\def\protectfontcharacters%
+ {\catcode`\~=\@@letter
+ \catcode`\_=\@@letter
+ \catcode`\^=\@@letter\relax}
+
+\def\unprotectfontcharacters%
+ {\catcode`\~=\@@active
+ \catcode`\_=\@@subscript
+ \catcode`\^=\@@superscript\relax}
+
+%D The completeness of the Computer Modern Roman typefaces
+%D makes clear how incomplete other faces are. To honour 7~bit
+%D \ASCII, these fonts were designed using only the first 127
+%D values of the 256 ones that can be presented by one byte.
+%D Nowadays 8~bit character codings are more common, mainly
+%D because they permit us to predefine some composed
+%D characters, which are needed in most european languages.
+%D
+%D Supporting more than the standard \TEX\ encoding vector
+%D |<|which in itself is far from standard and differs per
+%D font|>| puts a burden on the fonts mechanism. The \CONTEXT\
+%D mechanism is far from complete, but can handle several
+%D schemes at once. The main problem lays in the accented
+%D characters and ligatures like~ff, although handling
+%D ligatures is not the responsibility of this module.
+%D
+%D By default, we use \PLAIN\ \TEX's approach of placing
+%D accents. All other schemes sooner or later give problems
+%D when we distribute \DVI||files are distributed across
+%D machines and platforms. Nevertheless, we have to take care
+%D of different encoding vectors, which tell us where to find
+%D the characters we need. This means that all kind of
+%D character placement macro's like \type{\"} and \type{\ae}
+%D have to be implemented and adapted in a way that suits
+%D these vectors.
+%D
+%D The main difference between different vector is the way
+%D accents are ordered and/or the availability of prebuilt
+%D accented characters. Accented characters can for instance be
+%D called for by sequences like \type{\"e}. Here the \type{\"}
+%D is defined as:
+%D
+%D \starttypen
+%D \def\"#1{{\accent"7F #1}}
+%D \stoptypen
+%D
+%D This macro places the accent \accent"7F {} on top of an~e
+%D gives \"e. Some fonts however can have prebuild accents and
+%D use a more direct approach like
+%D
+%D \starttypen
+%D \def\"#1{\if#1e\char 235\else ... \fi}
+%D \stoptypen
+%D
+%D The latter approach is not used in \CONTEXT, because we
+%D store relevant combinations of accents and characters in
+%D individual macros.
+
+%D We define character substitutes and commands with definition
+%D commands like:
+%D
+%D \starttypen
+%D \startcoding[texnansi]
+%D
+%D \defineaccent " a 228
+%D \defineaccent ^ e 234
+%D \defineaccent ' {\dotlessi} 237
+%D
+%D \definecharacter ae 230
+%D \definecharacter oe 156
+%D
+%D \definecommand b \newansib
+%D \definecommand c \newansic
+%D
+%D \stopcoding
+%D \stoptypen
+%D
+%D The last argument of \type{\defineaccent} and
+%D \type{\definecharacter} tells \TEX\ the position of the
+%D accented character in the encoding vector. In order to
+%D complish this, we tag each implementation with the character
+%D coding identifier. We therefore need two auxiliary variables
+%D \type{\charactercoding} and \type{\nocharactercoding}. These
+%D contain the current and default encoding vectors and both
+%D default to the \PLAIN\ one.
+
+\let\charactercoding = \@plain@
+\let\nocharactercoding = \@plain@
+
+%D \macros
+%D {startcoding}
+%D
+%D Before we can redefine accents and special characters, we
+%D have to tell \CONTEXT\ what encoding is in force. The next
+%D command is responsible for doing this and also takes care of
+%D the definition of the recoding commands.
+
+\def\startcoding[#1]%
+ {\protectfontcharacters
+ \showmessage{\m!fonts}{1}{#1}%
+ \def\charactercoding{@#1@}}
+
+\def\stopcoding%
+ {\let\charactercoding=\@plain@
+ \unprotectfontcharacters}
+
+%D \macros
+%D {defineaccent, definecharacter, definecommand}
+%D
+%D The actual definition of accents, special characters and
+%D commands is done with the next three commands.
+
+\def\defineaccent#1 #2 #3 %
+ {\setvalue{\charactercoding#1\string#2}{\char#3}}%
+
+\def\definecommand#1 #2 %
+ {\setvalue{\charactercoding\string#1}{#2}}
+
+\def\definecharacter#1 #2 %
+ {\setvalue{\charactercoding\string#1}{\char#2}}
+
+%D Here we see that redefining accents is characters is more
+%D or less the same as redefining commands. We also could have
+%D said:
+%D
+%D \starttypen
+%D \def\defineaccent#1 #2 {\definecommand#1\string#2 \char}
+%D \def\definecharacter#1 {\definecommand#1 \char}
+%D \stoptypen
+
+%D \macros
+%D {redefineaccent}
+%D
+%D Telling \CONTEXT\ how to treat accents and special
+%D characters is a two stage process. First we signal the
+%D system which commands are to be adapted, after which we can
+%D redefine their behavior when needed. We showed this in the
+%D previous paragraphs. These redefinitions are grouped at the
+%D end of this file, but we show some examples here.
+%D
+%D Accents or accent generating commands are redefined by:
+%D
+%D \starttypen
+%D \redefineaccent ' % grave
+%D \redefineaccent " % dieresis
+%D \redefineaccent ^ % circumflex
+%D \redefineaccent v % caron
+%D \stoptypen
+%D
+%D The original \PLAIN\ \TEX\ meaning of each accent generating
+%D command is saved first. Next these commands are redefined to
+%D do an indirect call to a macro that acts according to the
+%D encoding vector in use.
+
+\def\redefineaccent%
+ {\protectfontcharacters
+ \doredefineaccent}
+
+\def\doredefineaccent#1 %
+ {\def\!!stringa{\nocharactercoding\string#1}%
+ \@EA\letvalue\@EA\!!stringa\@EA=\csname\string#1\endcsname
+ \setvalue{\string#1}{\dohandleaccent#1}%
+ \unprotectfontcharacters}
+
+%D \macros
+%D {normalaccent}
+%D
+%D The next (in fact three) macros to take care of \type{\"e}
+%D as well as \type{\"{e}} situations. The latter one is always
+%D handled by \TEX's \type{\accent} primitive, but the former
+%D one can put the accents on top of characters as well as use
+%D \type{\char} to call for a character directly.
+
+\let\normalaccent=\accent
+
+\unexpanded\def\dohandleaccent#1%
+ {\def\dodohandleaccent%
+ {\ifx\next\bgroup
+ \def\next{\getvalue{\nocharactercoding#1}}%
+ \else
+ \def\next{\dododohandleaccent#1}%
+ \fi
+ \next}%
+ \futurelet\next\dodohandleaccent}
+
+\def\dododohandleaccent#1#2%
+ {\bgroup
+ \ifundefined{\charactercoding#1\string#2}%
+ \def\\{\getvalue{\nocharactercoding#1}#2\egroup}%
+ \else
+ \def\\{\getvalue{\charactercoding#1\string#2}\egroup}%
+ \fi
+ \\}
+
+%D The trick with \type{\\} is needed to prevent spaces from
+%D being gobbled after the accented character, should we have
+%D \type{\next}, we should have ended up with gobbled spaces.
+
+%D \macros
+%D {redefinecommand}
+%D
+%D Redefinition of encoding dependant commands like \type{\b}
+%D and \type{\c} can be triggered by:
+%D
+%D \starttypen
+%D \redefinecommand b % something math
+%D \redefinecommand c % something math
+%D \stoptypen
+%D
+%D Handling of characters is easier than handling accents
+%D because here we don't have to take care of arguments. We
+%D just call for the right glyph in the right place.
+%D
+%D The \type{\next} construction permits handling of commands
+%D that take arguments. This means that we can use this
+%D command to redefine accent handling commands too.
+
+\def\redefinecommand#1 %
+ {\def\!!stringa{\nocharactercoding#1}%
+ \@EA\letvalue\@EA\!!stringa\@EA=\csname#1\endcsname
+ \setvalue{#1}{\dohandlecommand{#1}}}%
+
+\unexpanded\def\dohandlecommand#1%
+ {\doifdefinedelse{\charactercoding#1}
+ {\def\next{\getvalue{\charactercoding#1}}}
+ {\def\next{\getvalue{\nocharactercoding#1}}}%
+ \next}
+
+%D \macros
+%D {redefinecharacter}
+%D
+%D Special characters, which differ from accented characters
+%D in that they are to be presented as they are, are redefined
+%D by
+%D
+%D \starttypen
+%D \redefinecharacter ae % ae
+%D \redefinecharacter cc % ccedilla
+%D \stoptypen
+%D
+%D To keep things simple, we just copy this command:
+
+\let\redefinecharacter=\redefinecommand
+
+%D \macros
+%D {magfactor,magfactorhalf}
+%D
+%D There are several ways to specify a font. Three of them are
+%D pure \TeX\ ones, the fourth one is new:
+%D
+%D \starttypen
+%D \font\name=cmr12
+%D \font\name=cmr12 at 10pt
+%D \font\name=cmr12 scaled \magstep2
+%D \font\name=cmr12 sa 1.440
+%D \stoptypen
+%D
+%D The non||\TEX\ alternative \type{sa} stands for {\em scaled
+%D at}. This means as much as: scale the bodyfontsize with this
+%D factor. The value 1.440 in this example is derived
+%D from the \type{\magstep}'s as mentioned in
+%D \in{table}[tab:magstep]. We therefore introduce
+%D \type{\magfactor} as an alternative for \type{\magstep}.
+%D
+%D \plaatstabel[hier][tab:magstep]
+%D {Factors to be used with \type{sa.}}
+%D \starttabel[|c|c|c|]
+%D \HL
+%D \NC \bf magstep \NC \bf equivalent \NC \bf factor \NC\SR
+%D \HL
+%D \NC 1 \NC \type{\magfactor1} \NC 1.200 \NC\FR
+%D \NC 2 \NC \type{\magfactor2} \NC 1.440 \NC\MR
+%D \NC 3 \NC \type{\magfactor3} \NC 1.728 \NC\MR
+%D \NC 4 \NC \type{\magfactor4} \NC 2.074 \NC\MR
+%D \NC 5 \NC \type{\magfactor5} \NC 2.488 \NC\LR
+%D \HL
+%D \stoptabel
+
+\def\magfactor#1%
+ {\ifcase#1 1.000\or 1.200\or 1.440\or 1.728\or 2.074\or 2.488\or 1\fi}
+
+\def\magfactorhalf%
+ {1.095}
+
+%D These macros enable the use of definitions like \type{sa
+%D \magfactor3} which saves us both (mis|)|calculations and
+%D potential mistypings.
+%D
+%D Because \type{sa} is not a \TEX\ supported alternative, we
+%D have to test for it ourselves. In doing so, we need an
+%D auxiliary \DIMENSION. We cannot use \type{\scratchdimen}
+%D because font loading can happen at any moment due to
+%D postponed loading. We could instead have used dirty grouping
+%D tricks, but this one works too.
+
+\newdimen\scaledfont
+
+% \def\docalculatefont#1 sa #2sa#3*#4*#5*% The spaces are needed!
+% {\edef\fontscale{#2}%
+% \ifx\fontscale\empty
+% \expandafter\font\csname#4#5\endcsname=#1\relax
+% \else
+% \scaledfont=#4\relax
+% \expandafter\font\csname#4#5\endcsname=#1 at \fontscale\scaledfont\relax
+% \fi}
+
+\def\splitfontdefinition#1 #2 #3 #4\end%
+ {\def\somefontname{#1}%
+ \doifelse{#2}{*}
+ {\let\somefontspec=\empty}
+ {\def\somefontspec{ #2 #3}}}
+
+\def\docalculatefont#1 sa #2sa#3*#4*#5*% The spaces are needed!
+ {\edef\fontscale{#2}%
+ \expandafter\splitfontdefinition#1 * * \end
+ \ifx\fontscale\empty \else
+ \scaledfont=#4\relax
+ \def\somefontspec{ at \fontscale\scaledfont}%
+ \fi
+ \expandafter\font\csname#4#5\endcsname=
+ \truefilename{\somefontname}\somefontspec\relax}
+
+%D While looking for fonts, filesynonyms are for accessing
+%D the files!
+
+%D A more ugly but correct alternative for this is:
+%D
+%D \starttypen
+%D \def\docalculatefont#1sa #2sa#3*#4*#5*%
+%D {\edef\fontscale{#2}%
+%D \scaledfont=#4\relax
+%D \expandafter\font\csname#4#5\endcsname=#1
+%D \ifx\fontscale\empty\else at \fontscale\scaledfont\fi}
+%D \stoptypen
+%D
+%D This one saves a few bytes of memory, but is not particular
+%D faster due to the often unneeded assignment.
+
+%D I considered checking for mistakenly use of \PLAIN's
+%D \type{\magstep}'s but although it would take only a few
+%D lines of code, this would not add to consistent use. I
+%D therefore removed this check. Here we also handle the
+%D optional hyphenchar definitions, like:
+%D
+%D \starttypen
+%D \definebodyfont [12pt] [rm] [hyphenchar=45]
+%D \stoptypen
+
+\def\dodoloadfont#1#2#3#4%
+ {\expanded{\docalculatefont\getvalue{\??ft#1#2#3} sa sa*#1*#2#3*}%
+ \doifdefinedelse{#1#2\s!hyphenchar}
+ {\expandafter\hyphenchar\csname#1#2#3\endcsname=
+ \getvalue{#1#2\s!hyphenchar}\relax}
+ {\expandafter\hyphenchar\csname#1#2#3\endcsname=
+ #4\relax}%
+ \getvalue{#1#2#3}}
+
+%D The loading macro is used in two macros. One of them takes
+%D care of fixed width teletype fonts.
+
+\def\doloadfont#1#2#3%
+ {\debuggerinfo{\m!fonts}{loaded #1#2#3}%
+ \dodoloadfont{#1}{#2}{#3}{45}}
+
+\def\doloadttfont#1#2#3%
+ {\debuggerinfo{\m!fonts}{loaded fixed #1#2#3}%
+ \dodoloadfont{#1}{#2}{#3}{-1}}
+
+%D \macros
+%D {getfontname}
+%D
+%D The names of the fonts can be called with the rather simple
+%D macro \type{\getfontname}. When for instance we pass
+%D \type{12ptrmtf} as argument, we get \getfontname{12ptrmtf}.
+
+\def\getfontname#1%
+ {\getvalue{\??ft#1}}
+
+%D Now we enter the area of font switching. The switching
+%D mechanism has to take care of several situations, like:
+%D
+%D \startopsomming[opelkaar]
+%D \som changing the overal document fonts (including margins,
+%D headers and footers)
+%D \som changing local fonts (only the running text)
+%D \som smaller and even more smaller alternatives (super-
+%D and subscripts)
+%D \stopopsomming
+%D
+%D \TEX\ offers a powerfull family mechanism for super- and
+%D subscripts in math mode. In text mode however, we don't use
+%D families for the smaller alternatives, and therefore have
+%D to take care of it otherwise.
+
+%D \macros
+%D {definebodyfontenvironment}
+%D
+%D The relationship between the several sizes of a font, is
+%D defined by:
+%D
+%D \showsetup{\y!definebodyfontenvironment}
+%D
+%D Later on we will see how these parameters are used, so for
+%D the moment we stick with an example:
+%D
+%D \starttypen
+%D \definebodyfontenvironment
+%D [12pt]
+%D [ text=12pt,
+%D script=9pt,
+%D scriptscript=7pt,
+%D x=10pt,
+%D xx=8pt,
+%D big=12pt,
+%D small=10pt]
+%D \stoptypen
+%D
+%D The first argument specifies the bodyfont size to which the
+%D settings apply. All second parameters are specified in
+%D dimensions and tell us more about related sizes.
+%D
+%D Due to the fact that \type{\c!text} and \type{\s!text} can
+%D have a similar meaning, and therefore can lead to an
+%D unwanted loop, we temporary redefine \type{\c!text}. For
+%D the moment this in only place that some trickery is needed
+%D to fool the multilingual interface.
+
+\def\definebodyfontenvironment%
+ {\dodoubleempty\dodefinebodyfontenvironment}
+
+\def\dodefinebodyfontenvironment[#1][#2]%
+ {\let\c!savedtext=\c!text
+ \let\c!text=\s!text
+ \doifundefined{\??ft#1\s!text}
+ {\getparameters[\??ft#1]
+ [\s!text=#1,\s!script=#1,\s!scriptscript=#1,
+ \c!x=#1,\c!xx=#1,
+ \c!groot=#1,\c!klein=#1,
+ \c!interlinie=]}%
+ \getparameters[\??ft#1][#2]%
+ \let\c!text=\c!savedtext
+ \setvalue{\@size@#1}{\docompletefontswitch[#1]}}
+
+%D We default all parameters to the main bodyfont size (begin
+%D \type{#1}), so the next setup is valid too:
+%D
+%D \starttypen
+%D \definebodyfontenvironment[24pt]
+%D \stoptypen
+%D
+%D All parameters can be redefined when needed, so one does
+%D not have to stick to the default ones.
+
+%D \macros
+%D {definebodyfont}
+%D
+%D The next step in defining a bodyfont involves the actual font
+%D files, which can be recognized by their extension
+%D \type{tfm}. Installing those file is often beyond the
+%D scope of the user and up to the system administrator.
+%D
+%D \showsetup{\y!definebodyfont}
+%D
+%D This commands takes three arguments, where \ShowArgument\
+%D takes a (series of) bodyfont size(s) and \ShowArgument\
+%D the style group to which the definitions belong.
+%D
+%D Argument \ShowArgument\ accepts any suitable alternative,
+%D as specified by the \TEX\ families, extended with~a, b~and
+%D higher sizes or the normal \TEX\ mathematical families and
+%D some more.
+%D
+%D We show two examples, that show all the alternative
+%D scaling options. The \type{\tfa} alternatives can be
+%D extended with \type{\bfa}, \type{\slb}, etc. or even
+%D \type{e} and higher alternatives.
+%D
+%D \starttypen
+%D \definebodyfont [12pt] [rm]
+%D [tf=cmr12,
+%D bf=cmbx12,
+%D it=cmti12,
+%D sl=cmsl12,
+%D bi=cmbxti10 at 12pt,
+%D bs=cmbxsl10 at 12pt,
+%D tfa=cmr12 scaled \magstep1,
+%D tfb=cmr12 scaled \magstep2,
+%D tfc=cmr12 scaled \magstep3,
+%D tfd=cmr12 scaled \magstep4,
+%D sc=cmcsc10 at 12pt]
+%D
+%D \definebodyfont [12pt,11pt,10pt,9pt,8pt] [rm]
+%D [tf=lbr sa 1,
+%D bf=lbd sa 1,
+%D it=lbi sa 1,
+%D sl=lbsl sa 1,
+%D bi=lbdi sa 1,
+%D bs=lbdi sa 1,
+%D tfa=lbr sa 1.200,
+%D tfb=lbr sa 1.440,
+%D tfc=lbr sa 1.728,
+%D tfd=lbr sa 2.074,
+%D sc=lbr sa 0.833]
+%D \stoptypen
+%D
+%D The second example shows that we can define more sizes at
+%D once. The main difference between these examples is that the
+%D Computer Modern Roman come in many design sizes. This means
+%D that there we cannot define them in bulk using \type{sa}.
+%D Instead of \type{rm} (roman) one can define \type{ss} (sans
+%D serif), \type{tt} (teletype), \type{hw} (hand written),
+%D \type{cg} (calygraphic) and whatever styles.
+
+\def\definebodyfont%
+ {\dotripleargument\dodefinebodyfont}
+
+%D The first argument may be a comma separated list. This,
+%D combined with specifications using \type{sa} can save a lot
+%D of typing. Although all arguments should be specified, we
+%D treat the second argument as optional.
+
+\def\dodefinebodyfont[#1][#2][#3]%
+ {\ifthirdargument
+ \def\dododefinebodyfont##1%
+ {\dodododefinebodyfont[##1][#2][#3]}%
+ \processcommalist[#1]\dododefinebodyfont
+ \else
+ \definebodyfont[#1][\c!rm][#2]%
+ \fi}
+
+%D Defining a bodyfont involves two actions: defining the specific
+%D style related alternatives, like \type{\rma}, \type{\bfa}
+%D and \type{\rmsla}, and storing the definitions of their
+%D bodyfont size related fonts. The first step is bodyfont
+%D independant but executed every time. This permits user
+%D definitions like \type{\tfw} or \type{\bfq} for real large
+%D alternatives.
+
+\def\dodododefinebodyfont[#1][#2][#3]%
+ {\geteparameters[\??ft#1#2][#3]% We expand them!
+ \dodefinebodyfontenvironment[#1][]% Just to be sure.
+ \def\doiffamily##1##2##3\\% adapted
+ {\doifinstringelse{##1##2}\familylist
+ {}
+ {\addtocommalist{##1##2}\familylist
+ %\settextfonts
+ \unexpanded\setvalue{##1##2}%
+ {\getvalue{#2}\getvalue{##1##2}}%
+ \unexpanded\setvalue{##1##2\c!x}%
+ {\getvalue{##1##2}\getvalue{##1##2\c!x}}%
+ \unexpanded\setvalue{##1##2\c!xx}%
+ {\getvalue{##1##2}\getvalue{##1##2\c!xx}}}%
+ \doifsomething{##3}
+ {\setvalue{#2##3}% eg: \rma, \ssa
+ {\donottest\switchtofontstyle{#2}{##3}}%
+ \setvalue{##1##2##3}% eg: \tfa, \bfa
+ {\donottest\switchtofontalternative{##1##2}{##3}}%
+ \setvalue{#2##1##2##3}% eg: \rmtfa, \ssbfa
+ {\donottest\switchtofontstylealternative{#2}{##1##2}{##3}}}}%
+ \def\dodefinefont##1%
+ {\doifnot{##1}{\s!hyphenchar}
+ {\doifdefined{\??ft#1#2##1}
+ {\letvalue{@#1#2##1@}=\charactercoding
+ \doifelse{#2}{\c!tt}
+ {\setvalue{#1#2##1}{\donottest\doloadttfont{#1}{#2}{##1}}}
+ {\setvalue{#1#2##1}{\donottest\doloadfont{#1}{#2}{##1}}}%
+ \bgroup
+ \let\relax=\empty
+ \debuggerinfo
+ {\m!fonts}{\getvalue{\??ft#1#2##1} defined as #1 #2 ##1}%
+ \egroup}%
+ \doifnot{#2}{\c!mm} % new!
+ {\expandafter\doiffamily##1\\}}}%
+ \processassignlist[#3]\dodefinefont}
+
+%D Unknown families are added to the family list! For the
+%D moment we also set the direct calls here. Some day a better
+%D solution will be implemented.
+
+%D These macros show that quite some definitions take place.
+%D Fonts are not loeaded yet! This means that at format
+%D generation time, no font files are preloaded.
+%D
+%D We could have use \type{\unexpanded\setvalue} instead of
+%D the \type{\donottest} prefixes. However, this would lead to
+%D about 400 extra entries in the hash table.
+%D
+%D We can save ourselved some 400 csnames by packing the name
+%D and the encoding. But ..... not done yet .....
+
+%D \macros
+%D {everybodyfont,Everybodyfont}
+%D
+%D Every change in bodyfont size has conseqences for the baseline
+%D distance and skips between paragraphs. These are initialized
+%D in other modules. Here we only provide the hooks that
+%D garantees their handling.
+
+\newevery \everybodyfont \Everybodyfont
+
+%D At the system level one can initialize thing like:
+%D
+%D \starttypen
+%D \appendtoks \setupspacing \to \everybodyfont
+%D \stoptypen
+%D
+%D While users can add their own non standard commands like:
+%D
+%D \starttypen
+%D \Everybodyfont{\message{changing to bodyfont \the\bodyfontsize}}
+%D \stoptypen
+%D
+%D Personnaly I never felt the need for such extensions, but
+%D at least its possible.
+
+%D \macros
+%D {globalbodyfontsize,localbodyfontsize}
+%D
+%D Next we'll do the tough job of font switching. Here we
+%D have to distinguish between the global (overal) bodyfont
+%D size and the local (sometimes in the textflow) size. We
+%D store these dimensions in two \DIMENSION\ registers.
+
+\newdimen\globalbodyfontsize \globalbodyfontsize=12pt
+\newdimen\localbodyfontsize \localbodyfontsize =\globalbodyfontsize
+
+%D \macros
+%D {bodyfontsize}
+%D
+%D These two registers are not to be misused in calculations.
+%D For this purpose we keep a copy:
+
+\newdimen\bodyfontsize \bodyfontsize=\globalbodyfontsize
+
+%D \macros
+%D {outputresolution}
+%D
+%D Sometimes (to be honest: not in this module) we need to
+%D take the system resolution into account. Therefore we also
+%D define a macro:
+
+\def\outputresolution {300}
+
+%D \macros
+%D {bodyfontfactor,bodyfontpoints}
+%D
+%D For multiplication purposes we keep an auxiliary counter
+%D and macro (here the expansion is not explicitly needed):
+
+\newcount\bodyfontpoints \dimensiontocount\bodyfontsize\bodyfontpoints
+
+\edef\bodyfontfactor{\withoutpt\the\bodyfontsize}
+
+%D When we assign for instance 12pt to a \DIMENSION\ register
+%D the \type{\the}'d value comes out as 12.0pt, which is
+%D often not the way users specifie the bodyfont size. Therefore
+%D we also store the normalized value.
+
+\def\normalizebodyfontsize#1\to#2%
+ {\scratchdimen=#1\relax
+ \doifinstringelse{.0}{\withoutpt\the\scratchdimen}
+ {\dimensiontocount\scratchdimen\scratchcounter
+ \edef#2{\the\scratchcounter pt}}
+ {\edef#2{\the\scratchdimen}}}
+
+\normalizebodyfontsize\bodyfontsize\to\normalizedglobalbodyfontsize
+\normalizebodyfontsize\bodyfontsize\to\normalizedlocalbodyfontsize
+\normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
+
+%D To be internationalized:
+
+\def\korpsgrootte {\bodyfontsize}
+\def\korpspunten {\bodyfontpoints}
+
+%D some day.
+
+%D \macros
+%D {fontsize,fontstyle}
+%D
+%D Within a bodyfont, fonts can come in different sizes. For
+%D instance \type{\tf} is accompanied by \type{\tfa},
+%D \type{\tfb} etc. The third character in these sequences
+%D represents the size. The actual size is saved in a macro
+
+\let\fontsize = \empty
+
+%D The style, being roman (\type{\rm}), sans serif (\type{\ss})
+%D etc. is also available in a macro in \type{rm}, \type{ss}
+%D etc. form:
+
+\let\fontstyle = \empty
+
+%D All things related to fonts are grouped into files with
+%D names like \type{font-cmr}. These files are loaded by:
+
+\def\doreadfontdefinitionfile#1%
+ {\doifundefined{\c!file\f!fontprefix#1}%
+ {\setvalue{\c!file\f!fontprefix#1}{}%
+ \makeshortfilename[\f!fontprefix\truefilename{#1}]%
+ \startreadingfile
+ \readsysfile{\shortfilename}
+ {\showmessage{\m!fonts}{2}{#1}}
+ {\showmessage{\m!fonts}{3}{#1}}%
+ \stopreadingfile}}
+
+%D Such files are only loaded once! This permits redundant
+%D loading, but at the same time forced grouping when we want
+%D continuously mix all kind of font, which of course is a kind
+%D of typographically sin. The \type{"} is made inactive if
+%D needed to prevent problems with loading files that use this
+%D character in numbers.
+
+\def\doswitchpoints[#1]%
+ {\expanded{\dodoswitchpoints{#1}}}
+
+\def\dodoswitchpoints#1%
+ {\doifdefinedelse{\@size@#1}
+ {\getvalue{\@size@#1}%
+ \localbodyfontsize=#1\relax
+ \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
+ \the\everybodyfont}
+ {\showmessage{\m!fonts}{4}{#1}}}
+
+\def\doswitchstyle[#1]%
+ {\doifdefinedelse{\@style@#1}
+ {\getvalue{\@style@#1}%
+ \edef\fontstyle{#1}}
+ {\showmessage{\m!fonts}{5}{#1}}}
+
+%D \TEX\ loads font metric files like \type{cmr10.tfm} and
+%D \type{tir.tfm} only once. In \PLAIN\ \TEX\ some font files
+%D are {\em preloaded}. This means that the font files are
+%D loaded, but not accessible yet by name. This is accomplished
+%D by saying:
+%D
+%D \starttypen
+%D \font\preloaded=cmr10 at 11pt
+%D \stoptypen
+%D
+%D and using the name \type{\preloaded} again and again, so
+%D fonts are indeed loaded, but unnamed, and therefore
+%D unaccessible. In \CONTEXT\ we don't preload fonts, not even
+%D the \PLAIN\ \TEX\ ones, although users can access them. Now
+%D why is this done?
+
+%D Defining fonts using \type{\definebodyfont} takes time, so we
+%D prefer to predefine at least the Computer Modern Roman
+%D fonts. However, loading all those fonts at definition time
+%D would take both time and space. But even worse, once fonts
+%D are loaded into memory, their encoding vector is fixed,
+%D which is a handicap when we want to distribute the compact
+%D \type{fmt} files. So what we want to do is defining fonts in
+%D a way that postpones the loading. We accomplish this by only
+%D loading the fonts when we switch to another bodyfont size.
+%D Among the other alternatives, such as loading the font at
+%D the moment of activation and redefining the activation
+%D macro afterwards, this proved to be the most efficient
+%D alternative.
+%D
+%D The next few macros take care of the one exeption on this
+%D scheme. When at format generation time we load the default
+%D font file, the one that defines the Computer Modern Fonts,
+%D we don't want the fonts metrics to end up in the format
+%D file, so we temporary prohibit loading. This means that at
+%D runtime we have to load the default bodyfont size just before
+%D we start typesetting.
+%D
+%D Therefore we have to signal the font switching macros that
+%D we are preloading fonts. As long as the next boolean is,
+%D true, no loading is done.
+
+\newif\ifloadingfonts \loadingfontstrue
+
+%D \macros
+%D {preloadfonts}
+%D
+%D Preloading is only called for once, during the startup
+%D sequence of a session. After the loading job is done, the
+%D macro relaxes itself and reset the signal.
+
+\def\preloadfonts%
+ {\showmessage{\m!fonts}{6}{\normalizedbodyfontsize\normalspace\fontstyle}%
+ \doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]%
+ \global\let\preloadfonts=\relax
+ \global\loadingfontsfalse}
+
+%D Here comes the main font switching macros. These macros
+%D handle changes in size as well as returning to the global
+%D bodyfont size.
+
+\def\dosetfont[#1]%
+ {\doifelse{#1}{\v!globaal}
+ {\restoreglobalbodyfont}
+ {\processcommalist[#1]\dodosetfont
+ \ifloadingfonts\else
+ \doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]%
+ \fi}%
+ \chardef\currentxfontsize=0\relax}
+
+\def\dodosetfont#1%
+ {\dododosetfont{#1}{\showmessage{\m!fonts}{4}{#1}}}
+
+\def\dododosetfont#1#2%
+ {\doifnumberelse{#1}
+ {\scratchdimen=#1\relax
+ \normalizebodyfontsize\scratchdimen\to\normalizedsetfont
+ \doifdefinedelse{\@size@\normalizedsetfont}
+ {\localbodyfontsize=\normalizedsetfont
+ \let\normalizedbodyfontsize=\normalizedsetfont}
+ {#2\dosetsubstitutefont{#1}}}
+ {\doifelse{#1}{\v!reset}
+ {\def\fontsize{}}
+ {\doifdefinedelse{\@style@#1}
+ {\edef\fontstyle{#1}}
+ {\doreadfontdefinitionfile{#1}}}}}
+
+%D In the previous macros we use \type{\currentxfontsize} to
+%D hold the current x||size of the font. This enables us to
+%D support for instance \type{\sl} inside a \type{\tx} switch.
+
+\chardef\currentxfontsize=0
+
+%D When users specify for instance a 13 point bodyfont while no
+%D such bodyfont is defined, the system automatically tries to
+%D find a best fit, that is the nearest smaller defined
+%D bodyfontzize. A smaller one is definitely better than a larger
+%D one, simply because otherwise a lot of overfull box messages
+%D are more probable to occur. By taking a value slightly
+%D smaller than half a point, we can use the next method.
+
+\def\dosetsubstitutefont#1%
+ {\scratchdimen=#1\relax
+ \advance\scratchdimen by .499pt
+ \dimensiontocount\scratchdimen\scratchcounter
+ \advance\scratchcounter by -1
+ \ifnum\scratchcounter>3
+ \dododosetfont{\the\scratchcounter pt}{}%
+ \fi}
+
+%D Next we're going to implement some switching macros we
+%D already used in when defining fonts. The first one takes
+%D care of the style and is used by commands like \type{\rma}.
+
+\def\switchtofontstyle#1#2%
+ {\getvalue{#1}%
+ \getvalue{\c!tf#2}}
+
+%D The second one is responsible for commands like \type{\bfa}
+%D and the third one handles the combined \type{\rmbfa}
+%D alternatives.
+
+\def\switchtofontalternative#1#2%
+ {\def\fontsize{#2}%
+ \setfontstyle{\fontstyle}{\fontstyle}%
+ \donottest\getvalue{#1}}
+
+\def\switchtofontstylealternative#1#2#3%
+ {\getvalue{\normalizedbodyfontsize#1#2#3}}
+
+%D Setting the normal sized as well as the x and xx smaller
+%D sizes is accomplished by the next set of macros. When in
+%D math mode, the commands \type{\tx} and \type{\txx} are
+%D just a switch to the script and double script styles, but
+%D in text mode the values defined by the bodyfontenvironment are
+%D used. Here we also set \type{\currentxfontsize}.
+
+\def\dosetsomextypeface#1%
+ {\doifdefinedelse{#1}
+ {\getvalue{#1}}
+ {\showmessage{\m!fonts}{7}{#1}}}%
+
+\def\dosetxtypeface#1%
+ {\chardef\currentxfontsize=1
+ \ifmmode
+ \scriptstyle
+ \else
+ \dosetsomextypeface
+ {\getvalue{\??ft\normalizedbodyfontsize\c!x}% % pt
+ \getvalue{\@shortstyle@\fontstyle}% % rm
+ #1}% % tf
+ \unexpanded\def\tx{\dosetxxtypeface{#1}}%
+ \fi}
+
+\def\dosetxxtypeface#1%
+ {\chardef\currentxfontsize=2
+ \ifmmode
+ \scriptscriptstyle
+ \else
+ \dosetsomextypeface
+ {\getvalue{\??ft\normalizedbodyfontsize\c!xx}% % pt
+ \getvalue{\@shortstyle@\fontstyle}% % rm
+ #1}% % tf
+ \let\tx=\relax
+ \let\txx=\relax
+ \fi}
+
+%D These macros also show us that when we call for \type{\tx},
+%D this macro is redefined to be \type{\txx}. Therefore calls
+%D like:
+%D
+%D \startbuffer
+%D {small \tx is \tx beautiful}
+%D {small \tx is \txx beautiful}
+%D {small \txx is \tx beautiful}
+%D {small \txx is \txx beautiful}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D result in:
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D Setting the main size involves the style list and therefore
+%D takes a bit more time. Keep in mind that the fontsize is
+%D represented by a character or empty.
+
+\def\settextfont#1%
+ {\def\dosettextfont##1%
+ {\doifdefinedelse{\textface#1##1\fontsize}
+ {\setvalue{#1##1}{\donottest\getvalue{\textface#1##1\fontsize}}}
+ {\setvalue{#1##1}{\donottest\getvalue{\textface#1##1}}}}%
+ \rawprocesscommalist[\familylist]\dosettextfont}
+
+\def\settextfonts%
+ {\rawprocesscommalist[\stylelist]\settextfont}
+
+%D All three sizes come together in the macro:
+
+\def\settypefaces#1#2%
+ {\setvalue{#2}%
+ {\donottest\dosettypeface{#1}{#2}}%
+ \setvalue{#2\c!x}%
+ {\donottest\dosetxtypeface{#2}}%
+ \setvalue{#2\c!xx}%
+ {\donottest\dosetxxtypeface{#2}}}%
+
+%D Earlier in this module we defined some \TEX\ families. Here
+%D we introduce the macros that are responsible for setting
+%D them. The first argument of the next macro takes the style
+%D in its short form (rm, ss, etc). The second argument is the
+%D alternative (tf, bf, etc).
+
+%D Before actually assigning the font to a family we activate
+%D it. This is needed because loading of fonts is postponed
+%D until the first time it's called for. This also forces us to
+%D set the text family after we've set the script ones, else
+%D the latter one would be in force after executing this macro.
+
+\def\settextfamily#1#2#3%
+ {\def\setfamily##1##2%
+ {\doifdefinedelse{##2\c!mm#2}
+ {\debuggerinfo{\m!fonts}{##2#1#2 overruled by ##2\c!mm#2}%
+ \getvalue{##2\c!mm#2}\relax % activate font
+ \expandafter##1\getvalue{#3\s!fam}=\getvalue{##2\c!mm#2}}
+ {\doifdefinedelse{##2#1#2}
+ {\debuggerinfo{\m!fonts}{defined ##2#1#2}%
+ \getvalue{##2#1#2}\relax % activate font
+ \expandafter##1\getvalue{#3\s!fam}=\getvalue{##2#1#2}}
+ {\doifdefinedelse{##2#1\c!tf}
+ {\debuggerinfo{\m!fonts}{##2#1#2 replaced by ##2#1\c!tf}%
+ \getvalue{##2#1\c!tf}\relax % activate font
+ \expandafter##1\getvalue{#3\s!fam}=\getvalue{##2#1\c!tf}}
+ {\debuggerinfo{\m!fonts}{not defined ##2#1#2}}}}}%
+ \scriptscriptfont\getvalue{#3\s!fam}=\scriptfont\getvalue{#3\s!fam}%
+ \setfamily\scriptscriptfont\scriptscriptface
+ \scriptfont \getvalue{#3\s!fam}=\textfont \getvalue{#3\s!fam}%
+ \setfamily\scriptfont\scriptface
+ \textfont \getvalue{#3\s!fam}=\textfont \tffam
+ \setfamily\textfont\textface}
+
+%D The previous macro lets definitions like
+%D
+%D \starttypen
+%D \definebodyfont[mm][10pt][bf=cmbx10 at 10.25pt]
+%D \stoptypen
+%D
+%D take preference over
+%D
+%D \starttypen
+%D \definebodyfont[rm][10pt][bf=cmbx10 at 10pt]
+%D \stoptypen
+
+%D \macros
+%D {defineoverallstyle}
+%D
+%D When setting of switching the overall style we can use the
+%D short identifier like rm and ss, but when defined we can
+%D also use more verbose names like roman or sansserif. Such
+%D names are defined by:
+%D
+%D \starttypen
+%D \defineoverallstyle [roman, rm] [rm]
+%D \defineoverallstyle [sansserif, ss] [ss]
+%D \stoptypen
+
+\def\dodefineoverallstyle[#1][#2]%
+ {\rawdoifinsetelse{#2}{\stylelist}
+ {\debuggerinfo{\m!fonts}{unknown style #2}}
+ {\addtocommalist{#2}\stylelist
+ \showmessage{\m!fonts}{8}{#2}}%
+ \setvalue{#2\c!x}%
+ {\getvalue{#2}\getvalue{\c!tf\c!x}}%
+ \setvalue{#2\c!xx}%
+ {\getvalue{#2}\getvalue{\c!tf\c!xx}}%
+ \def\docommando##1%
+ {\setvalue{\@shortstyle@##1}{#2}%
+ \setvalue{\@style@##1}{\getvalue{#2}}%
+ \setvalue{#2}{\donottest\setfontstyle{##1}{#2}}}%
+ \processcommalist[#1]\docommando}
+
+\def\defineoverallstyle%
+ {\dodoubleargument\dodefineoverallstyle}
+
+%D CHECKEN WAT \type{\fontstyle} HIER DOET
+
+\def\setfontstyle#1#2% #1:name (roman, romaan) #2:style (rm)
+ {\edef\fontstyle{#1}%
+ \def\dosettextfamily##1%
+ {\doifdefinedelse{##1\s!fam} % added
+ {\settextfamily{#2}{##1}{##1}}
+ {\settextfamily{#2}{##1}{\c!nn}}%
+ \settypefaces{#2}{##1}}%
+ \rawprocesscommalist[\familylist]\dosettextfamily
+ \fam\tffam\relax
+ \unexpanded\def\tx{\tfx}%
+ \donottest\tf}
+
+%D Setting the math families looks much like setting the texts
+%D ones. This time however we use the 12 point font as a
+%D default when nothing is defined. This enables us to
+%D implement partial schemes. Here we also set the
+%D \type{\skewchar}, which takes care of accents in math mode
+%D (actually it's the largest accent). The first family needs a
+%D bit different treatment because it can be set to the default
+%D roman as well as a user defined font.
+
+\def\setmathfamilies%
+ {\setskewchar{\textface\c!mm\c!mi}{'177}%
+ \setskewchar{\textface\c!mm\c!sy}{'60}%
+ \setmathfamily\mrfam\textface\scriptface\scriptscriptface
+ {\c!mm\c!mr}{\c!rm\c!tf}%
+ \setmathfamily\mifam\textface\scriptface\scriptscriptface
+ {\c!mm\c!mi}{}%
+ \setmathfamily\syfam\textface\scriptface\scriptscriptface
+ {\c!mm\c!sy}{}%
+ \setmathfamily\exfam\textface\textface\textface
+ {\c!mm\c!ex}{}%
+ \setmathfamily\mafam\textface\scriptface\scriptscriptface
+ {\c!mm\c!ma}{}%
+ \setmathfamily\mbfam\textface\scriptface\scriptscriptface
+ {\c!mm\c!mb}{}%
+ \setmathfamily\mcfam\textface\scriptface\scriptscriptface
+ {\c!mm\c!mc}{}}
+
+%D Optionally skew characters can be set on a per font basis,
+%D like:
+%D
+%D \starttypen
+%D \definebodyfont
+%D [12pt] [mm]
+%D [mi=cmmi10,sy=cmsy10,syskewchar='50]
+%D \stoptypen
+%D
+%D When setting the \type{\skewchar} we need to test on the
+%D availability first.
+
+\def\setskewchar#1#2%
+ {\doifdefined{#1}
+ {\doifdefinedelse{\??ft#1\s!skewchar}
+ {\dosetskewchar{#1}{\getvalue{\??ft#1\s!skewchar}}}
+ {\dosetskewchar{#1}{#2}}}}
+
+\def\dosetskewchar#1#2%
+ {\getvalue{#1}\skewchar\getvalue{#1}=#2\relax}
+
+%D First we try to set the font at the math specific one (the
+%D fifth argment), next we take the alternative the last
+%D argument, which of often empty, and finally we default to
+%D the 12 point alternative.
+
+\def\setmathfamily#1#2#3#4#5#6%
+ {\def\dosetmathfamily##1##2%
+ {\doifdefinedelse{##2#5}
+ {\getvalue{##2#5}\relax
+ ##1#1=\getvalue{##2#5}\relax}
+ {\doifdefinedelse{##2#6}
+ {\getvalue{##2#6}\relax
+ ##1#1=\getvalue{##2#6}\relax}
+ {\doifdefinedelse{12pt#5}
+ {\getvalue{12pt#5}\relax
+ ##1#1=\getvalue{12pt#5}\relax}
+ {##1#1=\nullfont}}}}%
+ \dosetmathfamily\scriptscriptfont{#4}%
+ \dosetmathfamily\scriptfont{#3}%
+ \dosetmathfamily\textfont{#2}}
+
+%D The previous macros show that it's is not always
+%D neccessary to define the whole bunch of fonts, take for
+%D instance the sequence:
+%D
+%D \starttypen
+%D \setupbodyfont
+%D [ams]
+%D
+%D \definebodyfont [24pt] [mm]
+%D [ma=msam10 at 24pt,
+%D mb=msbm10 at 24pt]
+%D
+%D \switchtobodyfont
+%D [24pt]
+%D
+%D This is a 24pt $\blacktriangleleft$
+%D \stoptypen
+%D
+%D Here we didn't define the 24 point bodyfont environment, so
+%D it's defined automatically. Of course one can always use the
+%D \TEX\ primitive \type{\font} to switch to whatever font
+%D needed.
+
+%D When asking for a complete font switch, for instance from 10
+%D to 12~points, the next macro does the job. First we
+%D normalize the size, nect we define the current range of
+%D text, script and scriptscript sizes, then we set the text
+%D fonts and the math families and finally we activate the
+%D default typeface and also set the font specific parameters
+%D assigned to \type{\everybodyfont}
+
+\def\docompletefontswitch[#1]%
+ {\bodyfontsize=#1\relax
+ \dimensiontocount\bodyfontsize\bodyfontpoints
+ \edef\bodyfontfactor{\withoutpt\the\bodyfontsize}%
+ \normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
+ \edef\textface{\getvalue{\??ft\normalizedbodyfontsize\s!text}}%
+ \edef\scriptface{\getvalue{\??ft\normalizedbodyfontsize\s!script}}%
+ \edef\scriptscriptface{\getvalue{\??ft\normalizedbodyfontsize\s!scriptscript}}%
+ \settextfonts
+ \setmathfamilies
+ \rmtf
+ \the\everybodyfont}
+
+%D \macros
+%D {setupbodyfont,switchtobodyfont}
+%D
+%D The next two macros are user ones. With \type{\setupbodyfont}
+%D one can set the document bodyfont size, font family, style
+%D and/or options defined in files, for example:
+%D
+%D \starttypen
+%D \setupbodyfont[cmr,ams,12pt,roman]
+%D \stoptypen
+%D
+%D This command affects the document as a whole: text, headers
+%D and footers. The second macro however affects only the text:
+%D
+%D \starttypen
+%D \switchtobodyfont[10pt]
+%D \stoptypen
+%D
+%D So we've got:
+%D
+%D \showsetup{\y!setupbodyfont}
+%D \showsetup{\y!switchtobodyfont}
+%D
+%D Both macros look alike. The second one also has to take
+%D all kind of keywords into account.
+
+\def\setupbodyfont[#1]%
+ {\doifsomething{#1}
+ {\dosetfont[#1]%
+ \globalbodyfontsize=\localbodyfontsize
+ \normalizebodyfontsize\globalbodyfontsize\to\normalizedglobalbodyfontize
+ \let\globalfontstyle=\fontstyle
+ \the\everybodyfont}}
+
+\unexpanded\def\switchtobodyfont[#1]%
+ {\doifsomething{#1}
+ {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#1}}
+ {\doswitchpoints[\getvalue{\??ft\normalizedbodyfontsize\interfaced{#1}}]%
+ \doswitchstyle[\fontstyle]}
+ {\dosetfont[#1]}%
+ \the\everybodyfont}}
+
+%D Because the last macro can appear in arguments or be assigned
+%D to parameters, we protect this one for unwanted expansion.
+
+\def\dosetmathfont#1%
+ {\def\rm{\fam0}%
+ \doifdefinedelse{#1\s!fam} % adapted
+ {\edef\mffam{\getvalue{#1\s!fam}}}
+ {\edef\mffam{\getvalue{\c!nn\s!fam}}}%
+ \textfont \mrfam=\textfont \mffam
+ \scriptfont \mrfam=\scriptfont \mffam
+ \scriptscriptfont\mrfam=\scriptscriptfont\mffam}
+
+\let\fontalternative=\c!tf
+
+\def\dosettypeface#1#2%
+ {\doifdefinedelse{@\normalizedbodyfontsize#1#2@}
+ {\edef\charactercoding{\getvalue{@\normalizedbodyfontsize#1#2@}}}
+ {\let\charactercoding=\@plain@}%
+ \def\fontalternative{#2}%
+ \unexpanded\def\tx%
+ {\dosetxtypeface{#2\fontsize}}%
+ \unexpanded\def\txx%
+ {\dosetxxtypeface{#2\fontsize}}%
+ \doifdefinedelse{#2\s!fam} % adapted
+ {\expandafter\fam\getvalue{#2\s!fam}}
+ {\expandafter\fam\getvalue{\c!nn\s!fam}}%
+ \def\mf{\donottest{\dosetmathfont{#2}}}%
+ \donottest\getvalue{#1#2}%
+ \ifcase\currentxfontsize\or\tx\or\txx\fi}
+
+%D Just an experiment: \type{..\sl..\switchstyleonly\tt..}.
+
+\def\switchstyleonly#1%
+ {\let\savedfontalternative=\fontalternative
+ \chardef\savedescapechar=\escapechar
+ \escapechar=-1
+ \getvalue{\string#1}%
+ \escapechar=\savedescapechar
+ \getvalue{\savedfontalternative}}
+
+%D \macros
+%D {os}
+%D
+%D Old style numerals can be typeset with \type{\os} and look
+%D like {\os 1234567890} instead of the more common looking
+%D 1234567890.
+%D
+%D {\em Some day this macro will be made more geneal. For the
+%D moment it's behavior is tigthly coupled to the Computer
+%D Modern Roman.}
+
+\unexpanded\def\os%
+ {\getvalue{\normalizedbodyfontsize\c!mm\c!mi}}
+
+%D \macros
+%D {definebodyfontswitch}
+%D
+%D \PLAIN\ \TEX\ defines some macro's like \type{\tenpoint}
+%D to switch to a specific bodyfontsize. Just for the sake of
+%D compatibility we can define them like:
+%D
+%D \starttypen
+%D \definebodyfontswitch [twelvepoint] [12pt]
+%D \stoptypen
+%D
+%D We don't support language specific synonyms here, mainly
+%D because \PLAIN\ \TEX\ is english anyway.
+
+\def\dodefinebodyfontswitch[#1][#2]%
+ {\def\docommando##1%
+ {\setvalue{##1}{\switchtobodyfont[#2]}}%
+ \processcommalist[#1]\docommando}
+
+\def\definebodyfontswitch%
+ {\dodoubleargument\dodefinebodyfontswitch}
+
+%D \macros
+%D {setsmallbodyfont,setmainbodyfont,setbigbodyfont}
+%D
+%D When we're typesetting at for instance 10pt, we can call for
+%D the \type{small} as well as the \type{big} alternative,
+%D related to this main size, using \type{\switchtobodyfont[small]}.
+%D The three alternatives can be activated by the next three
+%D system calls and are defined by the bodyfontenvironment.
+
+\def\setsmallbodyfont%
+ {\doswitchpoints[\getvalue{\??ft\normalizedbodyfontsize\v!klein}]%
+ \doswitchstyle[\fontstyle]}
+
+\def\setmainbodyfont%
+ {\doswitchpoints[\normalizedbodyfontsize]%
+ \doswitchstyle[\fontstyle]}
+
+\def\setbigbodyfont%
+ {\doswitchpoints[\getvalue{\??ft\normalizedbodyfontsize\v!groot}]%
+ \doswitchstyle[\fontstyle]}
+
+%D \macros
+%D {restoreglobalbodyfont}
+%D
+%D Users can set whatever font available while typesetting text.
+%D Pagenumnbers, footers, headers etc. however must be typeset
+%D in the main bodyfont and style of the document. Returning to
+%D the global state can be done with the next macro:
+
+\def\restoreglobalbodyfont%
+ {\let\fontsize=\empty
+ \doswitchpoints[\normalizedglobalbodyfontize]%
+ \doswitchstyle[\globalfontstyle]%
+ \redoconvertfont % just in case a pagebreak occurs
+ \tf}
+
+%D This macro has to be called when entering the pagebody
+%D handling routine as well as the footnote insert routine.
+%D Users can access this feature |<|for instance when one wants
+%D to typeset tables and alike in the main bodyfont and style
+%D while the running text is temporary set to a smaller one|>|
+%D by saying \type{\switchtobodyfont[global]}.
+
+%D \macros
+%D {rasterfont}
+%D
+%D There are (at the moment) two situations in which we want to
+%D have fast access to a particular font. When we are using
+%D \TEX\ to typeset rasters, we use small {\rasterfont.}'s
+%D (a rather small period indeed), the same as \PICTEX\ uses
+%D for drawing purposes.
+
+\def\rasterfont%
+ {\getvalue{\!!fivepoint\c!rm\c!tf}}
+
+%D \macros
+%D {infofont}
+%D
+%D The second situation occurs when we enable the info mode,
+%D and put all kind of status information in the margin. We
+%D don't want huge switches to the main bodyfont and style, so
+%D here too we use a direct method.
+
+\def\infofont%
+ {\getvalue{\!!sixpoint\c!tt\c!tf}%
+ \the\everybodyfont}
+
+%D \macros
+%D {definealternativestyle}
+%D
+%D In the main modules we are going to implement lots of
+%D parameterized commands and one of these parameters will
+%D concern the font to use. To suit consistent use of fonts we
+%D here implement a mechanism for defining the keywords that
+%D present a particular style or alternative.
+%D
+%D \starttypen
+%D \definealternativestyle [keywords] [\style] [\nostyle]
+%D \stoptypen
+%D
+%D The first command is used in the normal textflow, while the
+%D second command takes care of headings and alike. Consider
+%D the next two definitions:
+%D
+%D \starttypen
+%D \definealternativestyle [bold] [\bf] []
+%D \definealternativestyle [cap] [\kap] [\kap]
+%D \stoptypen
+%D
+%D A change \type{\bf} in a heading which is to be set in
+%D \type{\tfd} does not look that well, so therefore we leave
+%D the second argument of \type{\definealternativestyle} empty.
+%D When we capatalize characters using the pseudo small cap
+%D command \type{\kap}, we want this to take effect in both
+%D text and headings, which is accomplished by assigning both
+%D arguments.
+
+\def\dodefinealternativestyle[#1][#2][#3]%
+ {\def\docommando##1%
+ {\doifundefined{##1}
+ {\expandafter\ifx\csname##1\endcsname#2\else
+ \setvalue{##1}{\groupedcommand{#2}{}}%
+ \fi}%
+ \setvalue{\@letter@##1}{#2}%
+ \setvalue{\@noletter@##1}{#3}}%
+ \processcommalist[#1]\docommando}
+
+\def\definealternativestyle%
+ {\dotripleargument\dodefinealternativestyle}
+
+%D This command also defines the keyword as command. This means
+%D that the example definition of \type{bold} we gave before,
+%D results in a command \type{\bold} which can be used as:
+%D
+%D \startbuffer
+%D He's a \bold{man} man with a {\bold head}.
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D or
+%D
+%D \startvoorbeeld
+%D \definealternativestyle[bold][\bf][]\haalbuffer
+%D \stopvoorbeeld
+%D
+%D Such definitions are of course unwanted for \type{\kap}
+%D because this would result in an endless recursive call.
+%D Therefore we check on the existance of both the command and
+%D the substitution. The latter is needed because for instance
+%D \type{\type} is an entirely diferent command. That command
+%D handles verbatim, while the style command would just switch
+%D to teletype font. This is just an example of a tricky
+%D naming coincidence.
+
+%D \macros
+%D {doconvertfont,noconvertfont,
+%D dontconvertfont,redoconvertfont}
+%D
+%D After having defined such keywords, we can call for them by
+%D using
+%D
+%D \starttypen
+%D \doconvertfont{keyword}{text}
+%D \stoptypen
+%D
+%D We deliberately pass an argument. This enables us to
+%D assign converters that handle one agrument, like
+%D \type{\kap}.
+%D
+%D By default the first specification is used to set the style,
+%D exept when we say \type{\dontconvertfont}, after which the
+%D second specification is used. We can also directly call for
+%D \type{\noconvertfont}. In nested calls, we can restore the
+%D conversion by saying \type{\redoconvertfont}.
+
+\unexpanded\def\dodoconvertfont#1#2%
+ {\doifdefinedelse{\@letter@#1}
+ {\doifelsenothing{#1}
+ {\def\next{}}
+ {\def\next{\getvalue{\@letter@#1}}}}
+ {\doifdefinedelse{#1}
+ {\def\next{\getvalue{#1}}}
+ {\def\next{#1}}}%
+ \next{#2}}
+
+\let\doconvertfont=\dodoconvertfont
+
+\def\noconvertfont#1#2%
+ {\doifdefinedelse{\@noletter@#1}
+ {\doifelsenothing{#1}
+ {\def\next{}}
+ {\def\next{\getvalue{\@noletter@#1}}}}
+ {\def\next{#1}}%
+ \next{#2}}
+
+\unexpanded\def\dontconvertfont%
+ {\let\doconvertfont=\noconvertfont}
+
+\unexpanded\def\redoconvertfont%
+ {\let\doconvertfont=\dodoconvertfont}
+
+%D These commands are not grouped! Grouping is most probably
+%D done by the calling macro's and would lead to unnecessary
+%D overhead.
+
+%D \macros
+%D {em,emphasistypeface,emphasisboldface}
+%D
+%D The next macro started as a copy of Donald Arseneau's
+%D \type{\em} (\TUGNEWS\ Vol.~3, no.~1, 1994). His
+%D implementation was a bit more sophisticated version of the
+%D standard \LATEX\ one. We furter enhanced the macro, so now
+%D it also adapts itself to boldface mode. Because we favor
+%D {\sl slanted} type over {\it italic}, we made the emphasis
+%D adaptable, for instance:
+%D
+%D \starttypen
+%D \def\emphasistypeface {\it}
+%D \def\emphasisboldface {\bi}
+%D \stoptypen
+%D
+%D But we prefer:
+
+\def\emphasistypeface {\sl}
+\def\emphasisboldface {\bs}
+
+\unexpanded\def\em%
+ {\ifnum\fam=\itfam
+ \def\emphasistypeface{\it}\tf
+ \else\ifnum\fam=\slfam
+ \def\emphasistypeface{\sl}\tf
+ \else\ifnum\fam=\bffam
+ \emphasisboldface
+ \else\ifnum\fam=\bsfam
+ \def\emphasisboldface{\bs}\bf
+ \else\ifnum\fam=\bifam
+ \def\emphasisboldface{\bi}\bf
+ \else
+ \emphasistypeface
+ \fi\fi\fi\fi\fi
+ \ifdim\fontdimen1\font>\!!zeropoint
+ \expandafter\aftergroup
+ \fi
+ \emphasiscorrection}
+
+%D Donald's (adapted) macros take the next character into
+%D account when placing italic correction. As a bonus we also
+%D look for something that looks like a dash, in which case we
+%D don't correct.
+
+\def\emphasiscorrection%
+ {\ifhmode
+ \expandafter\emphasislook
+ \fi}
+
+\def\emphasislook%
+ {\begingroup
+ \futurelet\next\emphasistest}
+
+\def\emphasistest%
+ {\ifcat\noexpand\next,%
+ \setbox\scratchbox=\hbox{\next}%
+ \ifdim\ht\scratchbox<.3ex
+ \let\doemphasiscorrection\endgroup
+ \fi
+ \fi
+ \doemphasiscorrection}
+
+\def\doemphasiscorrection%
+ {\scratchskip=\lastskip
+ \ifdim\scratchskip=\!!zeropoint
+ \/\relax
+ \else
+ \unskip\/\hskip\scratchskip
+ \fi
+ \endgroup}
+
+%D We end with some examples which show the behavior when
+%D some punctuation is met. We also show how the mechanism
+%D adapts itself to bold, italic and slanted typing.
+%D
+%D \startbuffer
+%D test {test}test \par
+%D test {\em test}test \par
+%D test {\em test}--test \par
+%D
+%D test {test}, test \par
+%D test {\em test}, test \par
+%D
+%D test {\em test {\em test {\em test} test} test} test \par
+%D test {\bf test {\em test {\em test} test} test} test \par
+%D test {\sl test {\em test {\em test} test} test} test \par
+%D test {\it test {\em test {\em test} test} test} test \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D We get:
+%D
+%D \startvoorbeeld
+%D \startopelkaar
+%D \haalbuffer
+%D \stopopelkaar
+%D \stopvoorbeeld
+
+%D \macros
+%D {setfont}
+%D
+%D Every now and then we want to define a font directly, for
+%D instance when we typeset title pages. The next macro saves
+%D some typing:
+
+\def\setfont%
+ {\def\dosetfont%
+ {\nextfont\stelinterliniein}%
+ \afterassignment\dosetfont
+ \font\nextfont=}
+
+%D One can call this macro as:
+%D
+%D \starttypen
+%D \setfont cmr10 at 60pt
+%D \stoptypen
+%D
+%D After which the font is active and the baselines and
+%D struts are set.
+
+%D \macros
+%D {showbodyfont}
+%D
+%D One can call for a rather simple overview of a bodyfont and the
+%D relations between its alternative fonts.
+%D
+%D \showsetup{\y!showbodyfont}
+%D
+%D The current bodyfont (here we omitted the argument) looks like:
+%D
+%D \showbodyfont
+%D
+%D The implementation is rather straightforward in using
+%D \type{\halign}.
+
+\def\doshowbodyfont[#1]%
+ {\startbaselinecorrection
+ \vbox
+ {\def\bigstrut##1##2%
+ {\hbox{\vrule
+ \!!height ##1\ht\strutbox
+ \!!depth ##2\dp\strutbox
+ \!!width \!!zeropoint}}
+ \doifelsenothing{#1}
+ {\def\title{\the\korpsgrootte}}
+ {\switchtobodyfont[#1]\def\title{#1}}
+ \tabskip\!!zeropoint
+ \parindent\!!zeropoint
+ \def\next##1##2##3%
+ {&&##1&&##2\tf##3&&##2\sc##3%
+ &&##2\sl##3&&##2\it##3&&##2\bf##3&&##2\bs##3&&##2\bi##3%
+ &&##2\tfx##3&&##2\tfxx##3%
+ &&##2\tfa##3&&##2\tfb##3&&##2\tfc##3&&##2\tfd##3&\cr}%
+ \setlocalhsize
+ \halign to \localhsize
+ {\bigstrut{1.5}{2}##&\vrule##
+ \tabskip=\!!zeropoint \!!plus 1fill
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule
+ \tabskip=\!!zeropoint\cr
+ \noalign{\hrule}
+ &\multispan{29}{\vrule\hfil\tttf\strut[\title]\hfil\vrule}\cr
+ \noalign{\hrule}\next{}{\tt\string}{}
+ \noalign{\hrule}\next{\tt\string\rm}{\rm}{Ag}
+ \noalign{\hrule}\next{\tt\string\ss}{\ss}{Ag}
+ \noalign{\hrule}\next{\tt\string\tt}{\tt}{Ag}
+ \noalign{\hrule}}}
+ \stopbaselinecorrection}
+
+\def\showbodyfont%
+ {\dosingleempty\doshowbodyfont}
+
+%D \macros
+%D {showbodyfontenvironment}
+%D
+%D The current bodyfontenvironment is:
+%D
+%D \showbodyfontenvironment
+%D
+%D This overview is generated using:
+%D
+%D \showsetup{\y!showbodyfontenvironment}
+
+\def\doshowbodyfontenvironment[#1]%
+ {\startbaselinecorrection
+ \vbox
+ {\tabskip\!!zeropoint
+ \parindent\!!zeropoint
+ \doifelsenothing{#1}
+ {\def\title{\the\korpsgrootte}}
+ {\switchtobodyfont[#1]\def\title{#1}}
+ \def\do##1##2%
+ {\getvalue{\??ft##1##2}}
+ \def\next##1##2%
+ {&&##1{##2}{\s!text}&&##1{##2}{\s!script}&&##1{##2}{\s!scriptscript}%
+ &&##1{##2}{\c!x}&&##1{##2}{\c!xx}%
+ &&##1{##2}{\v!klein}&&##1{##2}{\v!groot}&\cr
+ \noalign{\hrule}}
+ \def\donext##1%
+ {\doifdefined{\??ft##1\s!text}{\next\do##1}}
+ \setlocalhsize
+ \halign to \localhsize
+ {##&\vrule##\strut
+ \tabskip=\!!zeropoint \!!plus 1fill
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
+ &\hfil##\hfil&##\vrule
+ \tabskip=\!!zeropoint\cr
+ \noalign{\hrule}
+ &\multispan{15}{\vrule\hfil\tttf\strut[\title]\hfil}\vrule\cr
+ \noalign{\hrule}
+ \next\bf\relax
+ \donext\!!twelvepoint\donext\!!elevenpoint\donext\!!tenpoint
+ \donext\!!ninepoint \donext\!!eightpoint \donext\!!sevenpoint
+ \donext\!!sixpoint \donext\!!fivepoint \donext\!!fourpoint}}
+ \stopbaselinecorrection}
+
+\def\showbodyfontenvironment%
+ {\dosingleempty\doshowbodyfontenvironment}
+
+%D Fonts can only be used when loaded. In \CONTEXT\ we
+%D postpone the loading of fonts, even when we load \PLAIN.
+%D This means that we have to redefine one of the \PLAIN\
+%D macros. Let's tell that to the user first:
+
+\writestatus{loading}{Postponed Plain TeX Font Definitions}
+
+%D \macros
+%D {bordermatrix}
+%D
+%D In \PLAIN\ \TEX\ the width of a parenthesis is stored in
+%D the \DIMENSION\ \type{\p@renwd}. This value is derived from
+%D the width of \type{\tenrm B}, so let's take care of it now:
+
+\let\normalbordermatrix=\bordermatrix
+
+\def\bordermatrix%
+ {\bgroup
+ \setbox0=\hbox{\getvalue{\textface\c!mm\c!ex}B}%
+ \global\p@renwd=\wd0\relax
+ \egroup
+ \normalbordermatrix}
+
+%D Because we want to be as \PLAIN\ compatible as possible, we
+%D make most of \PLAIN's font mechanisme available to the
+%D \CONTEXT\ user.
+
+\def\setplainfonts#1#2%
+ {\setvalue{ten#1}{\getvalue{\!!tenpoint#2}}%
+ \setvalue{seven#1}{\getvalue{\!!sevenpoint#2}}%
+ \setvalue{five#1}{\getvalue{\!!fivepoint#2}}}
+
+\setplainfonts {\c!rm} {\c!rm\c!tf}
+\setplainfonts {\c!bf} {\c!rm\c!bf}
+\setplainfonts {\c!sl} {\c!rm\c!sl}
+\setplainfonts {\c!it} {\c!rm\c!it}
+\setplainfonts {\c!tt} {\c!rm\c!tt}
+\setplainfonts {\c!sy} {\c!mm\c!sy}
+\setplainfonts {\c!ex} {\c!mm\c!ex}
+\setplainfonts {\c!i} {\c!mm\c!mi}
+
+\let\setplainfonts=\undefined
+
+%D \macros
+%D {ss, SS}
+%D
+%D We are going to redefine \type{\ss} but for those wo still
+%D want to have access to the german \SS, we save it's value in
+%D \type{\SS}. Ok, I should have used \type{\sf} insead of
+%D \type{\ss} in the first place.
+
+\let\SS=\ss
+
+%D \macros
+%D {xi}
+%D
+%D We are going to redefine \type{\xi}, but fortunately this
+%D is a math mode character, so we can just say:
+
+\let\normalxi=\xi
+
+%D \macros
+%D {dotlessi,dotlessj}
+%D
+%D We also save both dotless~\dotlessi\ and~\dotlessj. This
+%D way we still have them were we expect them, even when
+%D macros of font providers redefine them.
+
+\let\dotlessi=\i
+\let\dotlessj=\j
+
+%D \macros
+%D {smashaccent}
+%D {}
+%D
+%D When we let \TEX\ put an accent on top of a character, such
+%D composed characters can get more height that height of a
+%D standard \type{\strut}. The next macro takes care of such
+%D unwanted compositions.
+%D
+%D We need to reach over the number that specifies the accent,
+% %D and in doing so we use \type{\hyphenchar} as a placeholder
+%D and in doing so we use \type{\scratchcounter} as a placeholder
+%D because it accepts 8 bit numbers in octal, decimal or
+%D hexadecimal format. Next we set the height of the accented
+%D character to the natural height of the character.
+
+\def\dodosmashaccent#1%
+ {\bgroup
+ \setbox0=\hbox{#1}%
+ \setbox2=\hbox{\normalaccent\scratchcounter#1}%
+ \ht2=\ht0\box2
+ \egroup
+ \nobreak}
+
+\def\dosmashaccent%
+ {\afterassignment\dodosmashaccent\expandafter\scratchcounter}
+
+\def\smashaccent%
+ {\dontleavehmode
+ \let\accent=\dosmashaccent}
+
+%D For instance we can say:
+%D
+%D \starttypen
+%D \smashaccent\"Uberhaupt
+%D \stoptypen
+%D
+%D But normally one will use it as a prefix in definitions.
+
+%D \macros
+%D {moveaccent}
+%D
+%D Exact positioning of accents cns be realized by saying:
+%D
+%D \starttypen
+%D \moveaccent{-.1ex}\"uberhaupt
+%D \stoptypen
+%D
+%D Again, this one will mostly used as a prefix in definitions.
+
+\def\dodomoveaccent#1%
+ {\bgroup
+ \dimen0=\fontdimen5\font
+ \dimen2=\dimen0
+ \advance\dimen2 by -\accentdisplacement
+ \fontdimen5\font=\dimen2
+ \normalaccent\scratchcounter#1\relax
+ \fontdimen5\font=\dimen0
+ \egroup}
+
+\def\domoveaccent%
+ {\afterassignment\dodomoveaccent\expandafter\scratchcounter}
+
+\def\moveaccent#1%
+ {\dontleavehmode
+ \def\accentdisplacement{#1}%
+ \let\accent=\domoveaccent}
+
+%D \macros
+%D {everyuppercase, EveryUppercase}
+%D
+%D When we want to uppercase strings of characters, we have to
+%D take care of those characters that have a special meaning or
+%D are only accessible by means of macros. The next hack was
+%D introduced when Tobias Burnus started translating head and
+%D label texts into spanish and italian. The first application
+%D of this token register therefore can be found in the module
+%D that deals with these texts.
+
+\newevery \everyuppercase \EveryUppercase
+
+\appendtoks \def\i{I}\to \everyuppercase
+\appendtoks \def\j{J}\to \everyuppercase
+\appendtoks \def\ss{SS}\to \everyuppercase
+\appendtoks \let\l=\L\to \everyuppercase
+\appendtoks \let\ae=\AE\to \everyuppercase
+\appendtoks \let\aa=\AA\to \everyuppercase
+\appendtoks \let\o=\O\to \everyuppercase
+\appendtoks \let\oe=\OE\to \everyuppercase
+
+%D \macros
+%D {everysanitize, EverySanitize}
+%D
+%D Whenever we are sanitizing strings, like we sometimes do
+%D when we deal with specials, the next token register can be
+%D called.
+
+\newevery \everysanitize \EverySanitize
+
+%D \macros
+%D {obeylccodes}
+%D
+%D One way of manipulating characters is changing the their
+%D \type{\lccode} and applying \type{\lowcase}. An example of
+%D this can be found in \type{spec-mis}.
+
+\def\obeylccodes%
+ {\scratchcounter=32
+ \loop
+ \ifnum\scratchcounter<127
+ \lccode\scratchcounter=\scratchcounter
+ \advance\scratchcounter by 1
+ \repeat
+ \ifeightbitcharacters
+ \scratchcounter=128
+ \loop
+ \ifnum\scratchcounter<255
+ \lccode\scratchcounter=`.
+ \advance\scratchcounter by 1
+ \repeat
+ \fi}
+
+%D Here come the definitions.
+
+\redefineaccent ' % grave
+\redefineaccent ` % acute
+\redefineaccent " % dieresis
+\redefineaccent ^ % circumflex
+\redefineaccent ~ % tilde
+\redefineaccent v % caron
+\redefineaccent u % breve
+\redefineaccent . % dotaccent
+\redefineaccent H % hungarumlaut
+\redefineaccent t % ........
+
+\redefinecharacter ae % ae
+\redefinecharacter AE % AE
+\redefinecharacter oe % oe
+\redefinecharacter OE % OE
+\redefinecharacter o % oslash
+\redefinecharacter O % Oslash
+\redefinecharacter ss % germandbls
+\redefinecharacter SS % germandbls
+\redefinecharacter aa % aring
+\redefinecharacter AA % Aring
+\redefinecharacter cc % ccedilla
+\redefinecharacter CC % Ccedilla
+
+\redefinecommand b
+\redefinecommand c
+
+\definebodyfontenvironment
+ [\!!fourteenpointfour]
+ [ \s!text=\!!fourteenpointfour,
+ \s!script=\!!elevenpoint,
+ \s!scriptscript=\!!ninepoint,
+ \c!x=\!!twelvepoint,
+ \c!xx=\!!tenpoint,
+ \c!groot=\!!fourteenpointfour,
+ \c!klein=\!!twelvepoint]
+
+\definebodyfontenvironment
+ [\!!twelvepoint]
+ [ \s!text=\!!twelvepoint,
+ \s!script=\!!ninepoint,
+ \s!scriptscript=\!!sevenpoint,
+ \c!x=\!!tenpoint,
+ \c!xx=\!!eightpoint,
+ \c!groot=\!!fourteenpointfour,
+ \c!klein=\!!tenpoint]
+
+\definebodyfontenvironment
+ [\!!elevenpoint]
+ [ \s!text=\!!elevenpoint,
+ \s!script=\!!eightpoint,
+ \s!scriptscript=\!!sixpoint,
+ \c!x=\!!ninepoint,
+ \c!xx=\!!sevenpoint,
+ \c!groot=\!!twelvepoint,
+ \c!klein=\!!ninepoint]
+
+\definebodyfontenvironment
+ [\!!tenpoint]
+ [ \s!text=\!!tenpoint,
+ \s!script=\!!sevenpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!eightpoint,
+ \c!xx=\!!sixpoint,
+ \c!groot=\!!twelvepoint,
+ \c!klein=\!!eightpoint]
+
+\definebodyfontenvironment
+ [\!!ninepoint]
+ [ \s!text=\!!ninepoint,
+ \s!script=\!!sevenpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!sevenpoint,
+ \c!xx=\!!fivepoint,
+ \c!groot=\!!elevenpoint,
+ \c!klein=\!!sevenpoint]
+
+\definebodyfontenvironment
+ [\!!eightpoint]
+ [ \s!text=\!!eightpoint,
+ \s!script=\!!sixpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!sixpoint,
+ \c!xx=\!!fivepoint,
+ \c!groot=\!!tenpoint,
+ \c!klein=\!!sixpoint]
+
+\definebodyfontenvironment
+ [\!!sevenpoint]
+ [ \s!text=\!!sevenpoint,
+ \s!script=\!!sixpoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!sixpoint,
+ \c!xx=\!!fivepoint,
+ \c!groot=\!!ninepoint,
+ \c!klein=\!!fivepoint]
+
+\definebodyfontenvironment
+ [\!!sixpoint]
+ [ \s!text=\!!sixpoint,
+ \s!script=\!!fivepoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!fivepoint,
+ \c!xx=\!!fivepoint,
+ \c!groot=\!!eightpoint,
+ \c!klein=\!!fivepoint]
+
+\definebodyfontenvironment
+ [\!!fivepoint]
+ [ \s!text=\!!fivepoint,
+ \s!script=\!!fivepoint,
+ \s!scriptscript=\!!fivepoint,
+ \c!x=\!!fivepoint,
+ \c!xx=\!!fivepoint,
+ \c!groot=\!!sevenpoint,
+ \c!klein=\!!fivepoint]
+
+\definebodyfontenvironment
+ [\!!fourpoint]
+ [ \s!text=\!!fourpoint,
+ \s!script=\!!fourpoint,
+ \s!scriptscript=\!!fourpoint,
+ \c!x=\!!fourpoint,
+ \c!xx=\!!fourpoint,
+ \c!groot=\!!sixpoint,
+ \c!klein=\!!fourpoint]
+
+\definebodyfontswitch [fourteenpointfour] [\!!fourteenpointfour]
+\definebodyfontswitch [twelvepoint] [\!!twelvepoint]
+\definebodyfontswitch [elevenpoint] [\!!elevenpoint]
+\definebodyfontswitch [tenpoint] [\!!tenpoint]
+\definebodyfontswitch [ninepoint] [\!!ninepoint]
+\definebodyfontswitch [eightpoint] [\!!eightpoint]
+\definebodyfontswitch [sevenpoint] [\!!sevenpoint]
+\definebodyfontswitch [sixpoint] [\!!sixpoint]
+\definebodyfontswitch [fivepoint] [\!!fivepoint]
+\definebodyfontswitch [fourpoint] [\!!fourpoint]
+
+\definebodyfontswitch [xii] [\!!twelvepoint]
+\definebodyfontswitch [xi] [\!!elevenpoint]
+\definebodyfontswitch [x] [\!!tenpoint]
+\definebodyfontswitch [ix] [\!!ninepoint]
+\definebodyfontswitch [viii] [\!!eightpoint]
+\definebodyfontswitch [vii] [\!!sevenpoint]
+\definebodyfontswitch [vi] [\!!sixpoint]
+
+\defineoverallstyle [\v!romaan, \c!rm] [\c!rm]
+\defineoverallstyle [\v!schreefloos, \c!ss] [\c!ss]
+\defineoverallstyle [\v!type, \c!tt] [\c!tt]
+\defineoverallstyle [\v!handschrift, \c!hw] [\c!hw]
+\defineoverallstyle [\v!calligrafie, \c!cg] [\c!cg]
+
+\definealternativestyle [\v!mediaeval] [\os] []
+\definealternativestyle [\v!normaal] [\tf] []
+\definealternativestyle [\v!vet] [\bf] []
+\definealternativestyle [\v!type] [\tt] []
+\definealternativestyle [\v!schuin] [\sl] []
+\definealternativestyle [\v!vetschuin,\v!schuinvet] [\bs] []
+\definealternativestyle [\v!klein,\v!kleinnormaal] [\tfx] []
+\definealternativestyle [\v!kleinvet] [\bfx] []
+\definealternativestyle [\v!kleintype] [\ttx] []
+\definealternativestyle [\v!kleinschuin] [\slx] []
+\definealternativestyle [\v!kleinvetschuin,\v!kleinschuinvet] [\bsx] []
+\definealternativestyle [\v!kap,\v!kapitaal] [\kap] [\kap]
+
+%D We still have to take care of \type{\xi}, so:
+
+\def\xi%
+ {\ifmmode\normalxi\else\elevenpoint\fi}
+
+%D By default we load the Computer Modern Roman fonts and
+%D activate the 12pt roman bodyfont. Sans serif and teletype are
+%D also available and can be called for by \type{\ss} and
+%D \type{\tt}.
+
+%D We also load the high \ASCII\ waarde as defined by the
+%D standard \kap{IBM PC} codepage. Finaly we load the
+%D \POSTSCRIPT\ standard predefined accented characters
+%D encoding vector as provided by Y\&Y named \type{texnansi}.
+%D These are for instance used when we load Lucida Bright
+%D (\type{lbr}) or \POSTSCRIPT\ Times Roman (\type{ptr}),
+%D Helvetica (\type{phv}) and Courier (\type{pcr}) which are
+%D also available as whole (\type{\setupbodyfont[pos]}).
+
+\setupbodyfont [cmr, def, 12pt, \v!romaan, ibm, ans]
+
+\protect
+
+\endinput
diff --git a/tex/context/base/font-kb.tex b/tex/context/base/font-kb.tex new file mode 100644 index 000000000..98f369488 --- /dev/null +++ b/tex/context/base/font-kb.tex @@ -0,0 +1,38 @@ +%D \module
+%D [ file=font-kb,
+%D version=1998.11.4,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Karl Berry Font Names,
+%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.
+
+\definefilesynonym [Courier] [pcr]
+\definefilesynonym [Courier-Oblique] [pcro]
+\definefilesynonym [Helvetica] [phv]
+\definefilesynonym [Helvetica-Oblique] [phvo]
+\definefilesynonym [Helvetica-Bold] [phvb]
+\definefilesynonym [Helvetica-BoldOblique] [phvbo]
+\definefilesynonym [Times-Roman] [ptm]
+\definefilesynonym [Times-Italic] [ptmi]
+\definefilesynonym [Times-Bold] [ptmb]
+\definefilesynonym [Times-BoldItalic] [ptmbi]
+
+\definefilesynonym [AvantGarde] [pag]
+\definefilesynonym [BookmanLight] [pbk]
+\definefilesynonym [CentaurMT] [pur]
+\definefilesynonym [Garamond] [pgm]
+\definefilesynonym [GillSans] [pgs]
+\definefilesynonym [NewBaskerville] [pnb]
+\definefilesynonym [Optima] [pop]
+\definefilesynonym [Palatino] [ppl]
+\definefilesynonym [Symbol] [psy]
+\definefilesynonym [Univers] [pun]
+\definefilesynonym [Utopia] [put]
+\definefilesynonym [ZapfChancery] [pzc]
+\definefilesynonym [ZapfDingbats] [pzd]
+
\ No newline at end of file diff --git a/tex/context/base/font-lbr.tex b/tex/context/base/font-lbr.tex index 92937c18e..dcddb44d7 100644 --- a/tex/context/base/font-lbr.tex +++ b/tex/context/base/font-lbr.tex @@ -1,348 +1,349 @@ -%D \module -%D [ file=font-lbr, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=Lucida Bright, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] - -%D The Lucida Bright fonts are both good looking and and -%D complete. These fonts have prebuilt accented characters, -%D which means that we use another encoding vector: \YandY\ -%D texnansi. These fonts are a good illustration that a 12 -%D point bodyfont is indeed never that size. The Lucida Bright -%D fonts come in one design size. - -\startcoding[texnansi] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [rm] - [tf=lbr sa 1, - bf=lbd sa 1, - it=lbi sa 1, - sl=lbsl sa 1, - bi=lbdi sa 1, - bs=lbdi sa 1, - tfa=lbr sa 1.200, - tfb=lbr sa 1.440, - tfc=lbr sa 1.728, - tfd=lbr sa 2.074, - sc=lbr sa 0.833] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [ss] - [tf=lsr sa 1, - bf=lsd sa 1, - it=lsi sa 1, - sl=lsi sa 1, - bi=lsdi sa 1, - bs=lsdi sa 1, - tfa=lsr sa 1.200, - tfb=lsr sa 1.440, - tfc=lsr sa 1.728, - tfd=lsr sa 2.074, - sc=lsr sa 0.833] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [tt] - [tf=lstr sa 1, - sl=lsto sa 1, - it=lsto sa 1, - bf=lstb sa 1, - bs=lstbo sa 1, - tfa=lstr sa 1.200, - tfb=lstr sa 1.440, - tfc=lstr sa 1.728, - tfd=lstr sa 2.074] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [hw] - [tf=lbh sa 1] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [cg] - [tf=lbc sa 1] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [mm] - [ex=lbme sa 1, - mi=lbmo sa 1, - sy=lbms sa 1, - ma=lbma sa 1] - -\definebodyfont [7pt,6pt,5pt,4pt] [rm] - [tf=lbr sa 1, - bf=lbd sa 1, - sl=lbi sa 1, - it=lbi sa 1] - -\definebodyfont [7pt,6pt,5pt,4pt] [ss] - [tf=lsr sa 1, - sl=lsd sa 1, - it=lsi sa 1, - bf=lsi sa 1] - -\definebodyfont [7pt,6pt,5pt,4pt] [tt] - [tf=lstr sa 1, - sl=lsto sa 1] - -\definebodyfont [7pt,6pt,5pt,4pt] [mm] - [ex=lbme sa 1, - mi=lbmo sa 1, - sy=lbms sa 1, - ma=lbma sa 1] - -%D Defining the larger alternatives takes only a few -%D commands, thanks to \type{sa}. - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [rm] - [bfa=lbd sa 1.200, - bfb=lbd sa 1.440, - bfc=lbd sa 1.728, - bfd=lbd sa 2.074, - sla=lbsl sa 1.200, - slb=lbsl sa 1.440, - slc=lbsl sa 1.728, - sld=lbsl sa 2.074, - bsa=lbdi sa 1.200, - bsb=lbdi sa 1.440, - bsc=lbdi sa 1.728, - bsd=lbdi sa 2.074] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [ss] - [bfa=lsr sa 1.200, - bfb=lsr sa 1.440, - bfc=lsr sa 1.728, - bfd=lsr sa 2.074, - sla=lsd sa 1.200, - slb=lsd sa 1.440, - slc=lsd sa 1.728, - sld=lsd sa 2.074, - bsa=lsi sa 1.200, - bsb=lsi sa 1.440, - bsc=lsi sa 1.728, - bsd=lsi sa 2.074] - -\definebodyfont [14.4pt,12pt,10pt] [tt] - [sla=lsto sa 1.220, - slb=lsto sa 1.440, - slc=lsto sa 1.728, - sld=lsto sa 2.074] - -\stopcoding - -%D The Lucida Bright TeleType font does not contain \TEX's -%D visual space. The next definition offers an alternative. - -\def\controlspace% - {\hbox{\font\next=cmtt10 at \bodyfontsize\next\char32}} - -%D Next we implement some alternatives for \AMS\ symbols. -%D These can be overrules by loading the \AMS\ font module -%D afterwards. - -\unprotect - -\mathchardef\blacktriangleleft ="01F0 -\mathchardef\blacktriangleright="01F1 -\mathchardef\boxtimes ="02EC - -%D Here I copied the definition file that is part of the -%D \YandY\ distribution. - -%D \framed[breedte=\hsize] -%D {Copyright (C) 1991 - 1993 \YandY, Inc. All Rights Reserved} - -%D This part of the definition is adapted bij J. Hagen. There -%D is already an extra family: \type{\mafam} (Math A ). Also, -%D the loading of fonts is done somewhere else. - -\let\arfam = \mafam -\let\thearfam = \hexmafam - -%D This part is adapted to the \CONTEXT\ font||naming method. -%D Also, we use \type{\setskewchar}, which activates the not -%D yet loaded font. - -%D The next definitions are already taken care of. - -%D \starttypen -%D % \setskewchar{12ptmmmi}='177 -%D % \setskewchar{11ptmmmi}='177 -%D % \setskewchar{10ptmmmi}='177 -%D % \setskewchar{9ptmmmi}='177 -%D % \setskewchar{8ptmmmi}='177 -%D % \setskewchar{7ptmmmi}='177 -%D % \setskewchar{6ptmmmi}='177 -%D % \setskewchar{5ptmmmi}='177 -%D \stoptypen - -%D \starttypen -%D % \setskewchar{12ptmmsy}='60 -%D % \setskewchar{11ptmmsy}='60 -%D % \setskewchar{10ptmmsy}='60 -%D % \setskewchar{9ptmmsy}='60 -%D % \setskewchar{8ptmmsy}='60 -%D % \setskewchar{7ptmmsy}='60 -%D % \setskewchar{6ptmmsy}='60 -%D % \setskewchar{5ptmmsy}='60 -%D \stoptypen - -%D Adjusted for LucidaNewMath||Extension at 10pt and math axis -%D at 3.13pt Note: delimiter increments are 5.5pt (as opposed -%D to 6pt in \kap{CM}). - -\def\big #1{{\hbox{$\left#1\vbox to8.20\p@{}\right.\n@space$}}} -\def\Big #1{{\hbox{$\left#1\vbox to10.80\p@{}\right.\n@space$}}} -\def\bigg #1{{\hbox{$\left#1\vbox to13.42\p@{}\right.\n@space$}}} -\def\Bigg #1{{\hbox{$\left#1\vbox to16.03\p@{}\right.\n@space$}}} -\def\biggg #1{{\hbox{$\left#1\vbox to17.72\p@{}\right.\n@space$}}} -\def\Biggg #1{{\hbox{$\left#1\vbox to21.25\p@{}\right.\n@space$}}} -\def\n@space {\nulldelimiterspace\z@ \m@th} - -%D Define some extra large sizes. It's always done using -%D extensible parts. - -\def\bigggl{\mathopen\biggg} -\def\bigggr{\mathclose\biggg} -\def\Bigggl{\mathopen\Biggg} -\def\Bigggr{\mathclose\Biggg} - -%D The following is needed if the roman text font is {\em -%D not} just \kap{LBR}. - -%D Draw the small sizes of $[$ and $]$ from \kap{LBMO} instead -%D of \kap{LBR}. - -\mathcode`\[="4186 \delcode`\[="186302 -\mathcode`\]="5187 \delcode`\]="187303 - -%D Draw the small sizes of $($ and $)$ from \kap{LBMO} instead -%D of \kap{LBR}. - -\mathcode`\(="4184 \delcode`\(="184300 -\mathcode`\)="5185 \delcode`\)="185301 - -%D The small sizes of $\{$ and $\}$ are already drawn from -%D \kap{LBMS}. - -%D Draw small $/$ from \kap{LBMO} instead of \kap{LBR}. - -\mathcode`\/="013D \delcode`\/="13D30E - -%D Draw $=$ and $+$ from \kap{LBMS} instead of \kap{LBR}. - -\mathcode`\=="3283 \mathcode`\+="2282 - -%D Make open face brackets accessible, i.e. [[ and ]]. - -\def\ldbrack{\delimiter"4182382} -\def\rdbrack{\delimiter"5183383} - -%D Provide access to surface integral signs (linked from text -%D to display size). - -\mathchardef\surfintop="1390 -\def\surfint{\surfintop\nolimits} - -%D Make medium size integrals available ({\em not} linked to -%D display size). - -\mathchardef\midintop="1392 -\def\midint{\midintop\nolimits} - -\mathchardef\midointop="1393 -\def\midoint{\midointop\nolimits} - -\mathchardef\midsurfintop="1394 -\def\midsurfint{\midsurfintop\nolimits} - -%D Extensible integral (use with \type{\bigg}, \type{\Bigg}, -%D \type{\biggg}, \type{\Biggg} etc). - -\def\largeint{\delimiter"135A395} - -%D Various types of small integrals. - -\mathchardef\dblint ="0188 -\mathchardef\trplint ="0189 -\mathchardef\contint ="018A -\mathchardef\surfint ="018B -\mathchardef\volint ="018C -\mathchardef\clwint ="018D -\mathchardef\cclwcint="018E -\mathchardef\clwcint ="018F - -%D To close up gaps in special math characters constructed -%D from pieces. - -\def\joinrel{\mathrel{\mkern-4mu}} - -%D Some characters that need construction in \kap{CM} exist -%D complete in \kap{LBMO} or \kap{LBMS}. - -\mathchardef\bowtie="31F6 -\mathchardef\models="32EE -\mathchardef\doteq ="32C9 -\mathchardef\cong ="329B -\mathchardef\angle ="028B - -%D Some more characters. - -% \mathchardef\hbar ="0\thearfam 1B -\mathchardef\hbar ="019D -\mathchardef\neq ="3\thearfam 94 -\mathchardef\rightleftharpoons="3\thearfam 7A -\mathchardef\leftrightharpoons="3\thearfam 79 -\mathchardef\hookleftarrow ="3\thearfam 3C -\mathchardef\hookrightarrow ="3\thearfam 3E -\mathchardef\mapsto ="3\thearfam 2C - -% \def\longmapsto{\mapstochar\longrightarrow} - -%D The ( is not large enough for strut in \kap{LBMO}. - -\def\mathstrut{\vphantom{f}} - -%D In $n$\hoog{th} root, don't want the $n$ to come too close -%D to the radical. - -\def\r@@t#1#2% - {\setbox\z@\hbox{$\m@th#1\sqrt{#2}$} - \dimen@\ht\z@ \advance\dimen@-\dp\z@ - \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-7.5mu \box\z@} - -%D Draw upper case upright greek from LucidaNewMath||Extension. - -\mathchardef\Gamma ="03D0 -\mathchardef\Delta ="03D1 -\mathchardef\Theta ="03D2 -\mathchardef\Lambda ="03D3 -\mathchardef\Xi ="03D4 -\mathchardef\Pi ="03D5 -\mathchardef\Sigma ="03D6 -\mathchardef\Upsilon="03D7 -\mathchardef\Phi ="03D8 -\mathchardef\Psi ="03D9 -\mathchardef\Omega ="03DA - -%D Draw upper case italic greek from LucidaNewMath||Italic. - -\mathchardef\varGamma ="0100 -\mathchardef\varDelta ="0101 -\mathchardef\varTheta ="0102 -\mathchardef\varLambda ="0103 -\mathchardef\varXi ="0104 -\mathchardef\varPi ="0105 -\mathchardef\varSigma ="0106 -\mathchardef\varUpsilon="0107 -\mathchardef\varPhi ="0108 -\mathchardef\varPsi ="0109 -\mathchardef\varOmega ="010A - -%D \type{\matrix} is changed because \kap{LBMO} is not at 10pt. - -\def\matrix#1% - {\null\,\vcenter{\normalbaselines\m@th - \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr - \mathstrut\crcr\noalign{\kern-0.9\baselineskip} - #1\crcr\mathstrut\crcr\noalign{\kern-0.9\baselineskip}}}\,} - -\protect - -\endinput +%D \module
+%D [ file=font-lbr,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Lucida Bright,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+%D The Lucida Bright fonts are both good looking and and
+%D complete. These fonts have prebuilt accented characters,
+%D which means that we use another encoding vector: \YandY\
+%D texnansi. These fonts are a good illustration that a 12
+%D point bodyfont is indeed never that size. The Lucida Bright
+%D fonts come in one design size.
+
+\startcoding[texnansi]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [rm]
+ [tf=LucidaBright sa 1,
+ bf=LucidaBright-Demi sa 1,
+ it=LucidaBright-Italic sa 1,
+ sl=LucidaBright-Oblique sa 1,
+ bi=LucidaBright-DemiItalic sa 1,
+ bs=LucidaBright-DemiItalic sa 1,
+ tfa=LucidaBright sa 1.200,
+ tfb=LucidaBright sa 1.440,
+ tfc=LucidaBright sa 1.728,
+ tfd=LucidaBright sa 2.074,
+ sc=LucidaBright sa 0.833]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [ss]
+ [tf=LucidaSans sa 1,
+ bf=LucidaSans-Demi sa 1,
+ it=LucidaSans-Italic sa 1,
+ sl=LucidaSans-Italic sa 1,
+ bi=LucidaSans-DemiItalic sa 1,
+ bs=LucidaSans-DemiItalic sa 1,
+ tfa=LucidaSans sa 1.200,
+ tfb=LucidaSans sa 1.440,
+ tfc=LucidaSans sa 1.728,
+ tfd=LucidaSans sa 2.074,
+ sc=LucidaSans sa 0.833]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [tt]
+ [tf=LucidaSans-Typewriter sa 1,
+ sl=LucidaSans-TypewriterOblique sa 1,
+ it=LucidaSans-TypewriterOblique sa 1,
+ bf=LucidaSans-TypewriterBold sa 1,
+ bs=LucidaSans-TypewriterBoldOblique sa 1,
+ tfa=LucidaSans-Typewriter sa 1.200,
+ tfb=LucidaSans-Typewriter sa 1.440,
+ tfc=LucidaSans-Typewriter sa 1.728,
+ tfd=LucidaSans-Typewriter sa 2.074]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [hw]
+ [tf=LucidaHandwriting-Italic sa 1]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [cg]
+ [tf=LucidaCalligraphy-Italic sa 1]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [mm]
+ [ex=LucidaNewMath-Extension sa 1,
+ mi=LucidaNewMath-AltItalic sa 1,
+ sy=LucidaNewMath-Symbol sa 1,
+ ma=LucidaNewMath-Arrows sa 1]
+
+\definebodyfont [7pt,6pt,5pt,4pt] [rm]
+ [tf=LucidaBright sa 1,
+ bf=LucidaBright-Demi sa 1,
+ sl=LucidaBright-Italic sa 1,
+ it=LucidaBright-Italic sa 1]
+
+\definebodyfont [7pt,6pt,5pt,4pt] [ss]
+ [tf=LucidaSans sa 1,
+ sl=LucidaSans-Demi sa 1,
+ it=LucidaSans-Italic sa 1,
+ bf=LucidaSans-Italic sa 1]
+
+\definebodyfont [7pt,6pt,5pt,4pt] [tt]
+ [tf=LucidaSans-Typewriter sa 1,
+ sl=LucidaSans-TypewriterOblique sa 1]
+
+\definebodyfont [7pt,6pt,5pt,4pt] [mm]
+ [ex=LucidaNewMath-Extension sa 1,
+ mi=LucidaNewMath-AltItalic sa 1,
+ sy=LucidaNewMath-Symbol sa 1,
+ ma=LucidaNewMath-Arrows sa 1]
+
+%D Defining the larger alternatives takes only a few
+%D commands, thanks to \type{sa}.
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [rm]
+ [bfa=LucidaBright-Demi sa 1.200,
+ bfb=LucidaBright-Demi sa 1.440,
+ bfc=LucidaBright-Demi sa 1.728,
+ bfd=LucidaBright-Demi sa 2.074,
+ sla=LucidaBright-Oblique sa 1.200,
+ slb=LucidaBright-Oblique sa 1.440,
+ slc=LucidaBright-Oblique sa 1.728,
+ sld=LucidaBright-Oblique sa 2.074,
+ bsa=LucidaBright-DemiItalic sa 1.200,
+ bsb=LucidaBright-DemiItalic sa 1.440,
+ bsc=LucidaBright-DemiItalic sa 1.728,
+ bsd=LucidaBright-DemiItalic sa 2.074]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [ss]
+ [bfa=LucidaSans sa 1.200,
+ bfb=LucidaSans sa 1.440,
+ bfc=LucidaSans sa 1.728,
+ bfd=LucidaSans sa 2.074,
+ sla=LucidaSans-Demi sa 1.200,
+ slb=LucidaSans-Demi sa 1.440,
+ slc=LucidaSans-Demi sa 1.728,
+ sld=LucidaSans-Demi sa 2.074,
+ bsa=LucidaSans-Italic sa 1.200,
+ bsb=LucidaSans-Italic sa 1.440,
+ bsc=LucidaSans-Italic sa 1.728,
+ bsd=LucidaSans-Italic sa 2.074]
+
+\definebodyfont [14.4pt,12pt,10pt] [tt]
+ [sla=LucidaSans-TypewriterOblique sa 1.220,
+ slb=LucidaSans-TypewriterOblique sa 1.440,
+ slc=LucidaSans-TypewriterOblique sa 1.728,
+ sld=LucidaSans-TypewriterOblique sa 2.074]
+
+\stopcoding
+
+%D The Lucida Bright TeleType font does not contain \TEX's
+%D visual space. The next definition offers an alternative.
+
+\def\controlspace%
+ {\hbox{\font\next=cmtt10 at \bodyfontsize\next\char32}}
+
+%D Next we implement some alternatives for \AMS\ symbols.
+%D These can be overrules by loading the \AMS\ font module
+%D afterwards.
+
+\unprotect
+
+\mathchardef\blacktriangleleft ="01F0
+\mathchardef\blacktriangleright="01F1
+\mathchardef\boxtimes ="02EC
+
+%D Here I copied the definition file that is part of the
+%D \YandY\ distribution.
+
+%D \framed[breedte=\hsize]
+%D {Copyright (C) 1991 - 1993 \YandY, Inc. All Rights Reserved}
+
+%D This part of the definition is adapted bij J. Hagen. There
+%D is already an extra family: \type{\mafam} (Math A ). Also,
+%D the loading of fonts is done somewhere else.
+
+\let\arfam = \mafam
+\let\thearfam = \hexmafam
+
+%D This part is adapted to the \CONTEXT\ font||naming method.
+%D Also, we use \type{\setskewchar}, which activates the not
+%D yet loaded font.
+
+%D The next definitions are already taken care of.
+
+%D \starttypen
+%D % \setskewchar{12ptmmmi}='177
+%D % \setskewchar{11ptmmmi}='177
+%D % \setskewchar{10ptmmmi}='177
+%D % \setskewchar{9ptmmmi}='177
+%D % \setskewchar{8ptmmmi}='177
+%D % \setskewchar{7ptmmmi}='177
+%D % \setskewchar{6ptmmmi}='177
+%D % \setskewchar{5ptmmmi}='177
+%D \stoptypen
+
+%D \starttypen
+%D % \setskewchar{12ptmmsy}='60
+%D % \setskewchar{11ptmmsy}='60
+%D % \setskewchar{10ptmmsy}='60
+%D % \setskewchar{9ptmmsy}='60
+%D % \setskewchar{8ptmmsy}='60
+%D % \setskewchar{7ptmmsy}='60
+%D % \setskewchar{6ptmmsy}='60
+%D % \setskewchar{5ptmmsy}='60
+%D \stoptypen
+
+%D Adjusted for LucidaNewMath||Extension at 10pt and math axis
+%D at 3.13pt Note: delimiter increments are 5.5pt (as opposed
+%D to 6pt in \kap{CM}).
+
+\def\big #1{{\hbox{$\left#1\vbox to8.20\p@{}\right.\n@space$}}}
+\def\Big #1{{\hbox{$\left#1\vbox to10.80\p@{}\right.\n@space$}}}
+\def\bigg #1{{\hbox{$\left#1\vbox to13.42\p@{}\right.\n@space$}}}
+\def\Bigg #1{{\hbox{$\left#1\vbox to16.03\p@{}\right.\n@space$}}}
+\def\biggg #1{{\hbox{$\left#1\vbox to17.72\p@{}\right.\n@space$}}}
+\def\Biggg #1{{\hbox{$\left#1\vbox to21.25\p@{}\right.\n@space$}}}
+\def\n@space {\nulldelimiterspace\z@ \m@th}
+
+%D Define some extra large sizes. It's always done using
+%D extensible parts.
+
+\def\bigggl{\mathopen\biggg}
+\def\bigggr{\mathclose\biggg}
+\def\Bigggl{\mathopen\Biggg}
+\def\Bigggr{\mathclose\Biggg}
+
+%D The following is needed if the roman text font is {\em
+%D not} just \kap{LBR}.
+
+%D Draw the small sizes of $[$ and $]$ from \kap{LBMO} instead
+%D of \kap{LBR}.
+
+\mathcode`\[="4186 \delcode`\[="186302
+\mathcode`\]="5187 \delcode`\]="187303
+
+%D Draw the small sizes of $($ and $)$ from \kap{LBMO} instead
+%D of \kap{LBR}.
+
+\mathcode`\(="4184 \delcode`\(="184300
+\mathcode`\)="5185 \delcode`\)="185301
+
+%D The small sizes of $\{$ and $\}$ are already drawn from
+%D \kap{LBMS}.
+
+%D Draw small $/$ from \kap{LBMO} instead of \kap{LBR}.
+
+\mathcode`\/="013D \delcode`\/="13D30E
+
+%D Draw $=$ and $+$ from \kap{LBMS} instead of \kap{LBR}.
+
+\mathcode`\=="3283 \mathcode`\+="2282
+
+%D Make open face brackets accessible, i.e. [[ and ]].
+
+\def\ldbrack{\delimiter"4182382}
+\def\rdbrack{\delimiter"5183383}
+
+%D Provide access to surface integral signs (linked from text
+%D to display size).
+
+\mathchardef\surfintop="1390
+\def\surfint{\surfintop\nolimits}
+
+%D Make medium size integrals available ({\em not} linked to
+%D display size).
+
+\mathchardef\midintop="1392
+\def\midint{\midintop\nolimits}
+
+\mathchardef\midointop="1393
+\def\midoint{\midointop\nolimits}
+
+\mathchardef\midsurfintop="1394
+\def\midsurfint{\midsurfintop\nolimits}
+
+%D Extensible integral (use with \type{\bigg}, \type{\Bigg},
+%D \type{\biggg}, \type{\Biggg} etc).
+
+\def\largeint{\delimiter"135A395}
+
+%D Various types of small integrals.
+
+\mathchardef\dblint ="0188
+\mathchardef\trplint ="0189
+\mathchardef\contint ="018A
+\mathchardef\surfint ="018B
+\mathchardef\volint ="018C
+\mathchardef\clwint ="018D
+\mathchardef\cclwcint="018E
+\mathchardef\clwcint ="018F
+
+%D To close up gaps in special math characters constructed
+%D from pieces.
+
+\def\joinrel{\mathrel{\mkern-4mu}}
+
+%D Some characters that need construction in \kap{CM} exist
+%D complete in \kap{LBMO} or \kap{LBMS}.
+
+\mathchardef\bowtie="31F6
+\mathchardef\models="32EE
+\mathchardef\doteq ="32C9
+\mathchardef\cong ="329B
+\mathchardef\angle ="028B
+
+%D Some more characters.
+
+% \mathchardef\hbar ="0\thearfam 1B
+\mathchardef\hbar ="019D
+\mathchardef\neq ="3\thearfam 94
+\mathchardef\rightleftharpoons="3\thearfam 7A
+\mathchardef\leftrightharpoons="3\thearfam 79
+\mathchardef\hookleftarrow ="3\thearfam 3C
+\mathchardef\hookrightarrow ="3\thearfam 3E
+\mathchardef\mapsto ="3\thearfam 2C
+
+% \def\longmapsto{\mapstochar\longrightarrow}
+
+%D The ( is not large enough for strut in \kap{LBMO}.
+
+\def\mathstrut{\vphantom{f}}
+
+%D In $n$\hoog{th} root, don't want the $n$ to come too close
+%D to the radical.
+
+\def\r@@t#1#2%
+ {\setbox\z@\hbox{$\m@th#1\sqrt{#2}$}
+ \dimen@\ht\z@ \advance\dimen@-\dp\z@
+ \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-7.5mu \box\z@}
+
+%D Draw upper case upright greek from LucidaNewMath||Extension.
+
+\mathchardef\Gamma ="03D0
+\mathchardef\Delta ="03D1
+\mathchardef\Theta ="03D2
+\mathchardef\Lambda ="03D3
+\mathchardef\Xi ="03D4
+\mathchardef\Pi ="03D5
+\mathchardef\Sigma ="03D6
+\mathchardef\Upsilon="03D7
+\mathchardef\Phi ="03D8
+\mathchardef\Psi ="03D9
+\mathchardef\Omega ="03DA
+
+%D Draw upper case italic greek from LucidaNewMath||Italic.
+
+\mathchardef\varGamma ="0100
+\mathchardef\varDelta ="0101
+\mathchardef\varTheta ="0102
+\mathchardef\varLambda ="0103
+\mathchardef\varXi ="0104
+\mathchardef\varPi ="0105
+\mathchardef\varSigma ="0106
+\mathchardef\varUpsilon="0107
+\mathchardef\varPhi ="0108
+\mathchardef\varPsi ="0109
+\mathchardef\varOmega ="010A
+
+%D \type{\matrix} is changed because \kap{LBMO} is not at 10pt.
+
+\def\matrix#1%
+ {\null\,\vcenter{\normalbaselines\m@th
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-0.9\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-0.9\baselineskip}}}\,}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-pcr.tex b/tex/context/base/font-pcr.tex index 7251f3f48..adee397bd 100644 --- a/tex/context/base/font-pcr.tex +++ b/tex/context/base/font-pcr.tex @@ -1,45 +1,46 @@ -%D \module -%D [ file=font-pcr, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=Adobe Courier, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] - -%D This module defines the Standard Adobe Courier. We use -%D the \YandY\ texnansi encoding vector. - -\startcoding[texnansi] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [tt] - [tf=com sa 1, - sl=coo sa 1, - tfa=com sa 1.200, - tfb=com sa 1.440, - tfc=com sa 1.728, - tfd=com sa 2.074] - -\definebodyfont [7pt,6pt,5pt] [tt] - [tf=com sa 1, - sl=coo sa 1] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt,7pt,6pt,5pt] [tt] - [tf=com sa 1, - sl=coo sa 1] - -\definebodyfont [14.4pt,12pt,10pt] [tt] - [sla=coo sa 1.200, - slb=coo sa 1.440, - slc=coo sa 1.728, - sld=coo sa 2.074] - -\stopcoding - -%D The Courier font does not contain \TEX's visual space. The -%D next definition offers an alternative. - -\def\controlspace% - {\hbox{\font\next=cmtt10 at \bodyfontsize\next\char32}} - -\endinput +%D \module
+%D [ file=font-pcr,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Adobe Courier,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+%D This module defines the Standard Adobe Courier. We use
+%D the \YandY\ texnansi encoding vector.
+
+\startcoding[texnansi]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [tt]
+ [tf=Courier sa 1,
+ sl=Courier-Oblique sa 1,
+ tfa=Courier sa 1.200,
+ tfb=Courier sa 1.440,
+ tfc=Courier sa 1.728,
+ tfd=Courier sa 2.074]
+
+\definebodyfont [7pt,6pt,5pt] [tt]
+ [tf=Courier sa 1,
+ sl=Courier-Oblique sa 1]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt,7pt,6pt,5pt] [tt]
+ [tf=Courier sa 1,
+ sl=Courier-Oblique sa 1]
+
+\definebodyfont [14.4pt,12pt,10pt] [tt]
+ [sla=Courier-Oblique sa 1.200,
+ slb=Courier-Oblique sa 1.440,
+ slc=Courier-Oblique sa 1.728,
+ sld=Courier-Oblique sa 2.074]
+
+\stopcoding
+
+%D The Courier font does not contain \TEX's visual space. The
+%D next definition offers an alternative.
+
+\def\controlspace%
+ {\hbox{\font\next=cmtt10 at \bodyfontsize\next\char32}}
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-phv.tex b/tex/context/base/font-phv.tex index c9d1a6477..1230bc236 100644 --- a/tex/context/base/font-phv.tex +++ b/tex/context/base/font-phv.tex @@ -1,52 +1,53 @@ -%D \module -%D [ file=font-phv, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=Adobe Helvetica, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] - -%D This module defines the Standard Adobe Helvetica. We use -%D the \YandY\ texnansi encoding vector. - -\startcoding [texnansi] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [ss] - [tf=hv sa 1, - bf=hvb sa 1, - it=hvo sa 1, - sl=hvo sa 1, - bs=hvbo sa 1, - bi=hvbo sa 1, - tfa=hv sa 1.200, - tfb=hv sa 1.440, - tfc=hv sa 1.728, - tfd=hv sa 2.074, - sc=hv sa 0.833] - -\definebodyfont [7pt,6pt,5pt] [ss] - [tf=hv sa 1, - bf=hvb sa 1, - it=hvo sa 1, - sl=hvo sa 1, - bs=hvbo sa 1, - bi=hvbo sa 1] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [tt] - [bfa=hvb sa 1.200, - bfb=hvb sa 1.440, - bfc=hvb sa 1.728, - bfd=hvb sa 2.074, - sla=hvo sa 1.200, - slb=hvo sa 1.440, - slc=hvo sa 1.728, - sld=hvo sa 2.074, - bsa=hvbo sa 1.200, - bsb=hvbo sa 1.440, - bsc=hvbo sa 1.728, - bsd=hvbo sa 2.074] - -\stopcoding - -\endinput +%D \module
+%D [ file=font-phv,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Adobe Helvetica,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+%D This module defines the Standard Adobe Helvetica. We use
+%D the \YandY\ texnansi encoding vector.
+
+\startcoding [texnansi]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [ss]
+ [tf=Helvetica sa 1,
+ bf=Helvetica-Bold sa 1,
+ it=Helvetica-Oblique sa 1,
+ sl=Helvetica-Oblique sa 1,
+ bs=Helvetica-BoldOblique sa 1,
+ bi=Helvetica-BoldOblique sa 1,
+ tfa=Helvetica sa 1.200,
+ tfb=Helvetica sa 1.440,
+ tfc=Helvetica sa 1.728,
+ tfd=Helvetica sa 2.074,
+ sc=Helvetica sa 0.833]
+
+\definebodyfont [7pt,6pt,5pt] [ss]
+ [tf=Helvetica sa 1,
+ bf=Helvetica-Bold sa 1,
+ it=Helvetica-Oblique sa 1,
+ sl=Helvetica-Oblique sa 1,
+ bs=Helvetica-BoldOblique sa 1,
+ bi=Helvetica-BoldOblique sa 1]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [tt]
+ [bfa=Helvetica-Bold sa 1.200,
+ bfb=Helvetica-Bold sa 1.440,
+ bfc=Helvetica-Bold sa 1.728,
+ bfd=Helvetica-Bold sa 2.074,
+ sla=Helvetica-Oblique sa 1.200,
+ slb=Helvetica-Oblique sa 1.440,
+ slc=Helvetica-Oblique sa 1.728,
+ sld=Helvetica-Oblique sa 2.074,
+ bsa=Helvetica-BoldOblique sa 1.200,
+ bsb=Helvetica-BoldOblique sa 1.440,
+ bsc=Helvetica-BoldOblique sa 1.728,
+ bsd=Helvetica-BoldOblique sa 2.074]
+
+\stopcoding
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-pos.tex b/tex/context/base/font-pos.tex index c168d1121..4783df561 100644 --- a/tex/context/base/font-pos.tex +++ b/tex/context/base/font-pos.tex @@ -1,17 +1,18 @@ -%D \module -%D [ file=font-pos, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=Standard Postscript, -%D author=J. Hagen, -%D date=\currentdate, -%D copyright=J. Hagen] - -%D This file load the Adobe Times Roman, Helvetica and -%D Courier. - -\input font-ptm -\input font-phv -\input font-pcr - -\endinput +%D \module
+%D [ file=font-pos,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Standard Postscript,
+%D author=J. Hagen,
+%D date=\currentdate,
+%D copyright=J. Hagen]
+
+%D This file load the Adobe Times Roman, Helvetica and
+%D Courier.
+
+\input font-ptm
+\input font-phv
+\input font-pcr
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-ptm.tex b/tex/context/base/font-ptm.tex index 4e748d960..8c1960536 100644 --- a/tex/context/base/font-ptm.tex +++ b/tex/context/base/font-ptm.tex @@ -1,52 +1,53 @@ -%D \module -%D [ file=font-ptm, -%D version=1995.1.1, -%D title=\CONTEXT\ Font Macros, -%D subtitle=Adobe Times Roman, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] - -%D This module defines the Standard Adobe Times Roman. We use -%D the \YandY\ texnansi encoding vector. - -\startcoding [texnansi] - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [rm] - [tf=tir sa 1, - bf=tib sa 1, - it=tii sa 1, - sl=tii sa 1, % tio - bi=tibi sa 1, - bs=tib sa 1, % tibio - tfa=tir sa 1.200, - tfb=tir sa 1.440, - tfc=tir sa 1.728, - tfd=tir sa 2.074, - sc=tir sa 0.833] - -\definebodyfont [7pt,6pt,5pt] [rm] - [tf=tir sa 1, - bf=tib sa 1, - it=tii sa 1, - sl=tii sa 1, % tio - bi=tibi sa 1, - bs=tib sa 1] % tibio - -\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [rm] - [bfa=tib sa 1.200, - bfb=tib sa 1.440, - bfc=tib sa 1.728, - bfd=tib sa 2.074, - sla=tii sa 1.200, % tio - slb=tii sa 1.440, % tio - slc=tii sa 1.728, % tio - sld=tii sa 2.074, % tio - bsa=tib sa 1.200, % tibio - bsb=tib sa 1.440, % tibio - bsc=tib sa 1.728, % tibio - bsd=tib sa 2.074] % tibio - -\stopcoding - -\endinput +%D \module
+%D [ file=font-ptm,
+%D version=1995.1.1,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Adobe Times Roman,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+
+%D This module defines the Standard Adobe Times Roman. We use
+%D the \YandY\ texnansi encoding vector.
+
+\startcoding [texnansi]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [rm]
+ [tf=Times-Roman sa 1,
+ bf=Times-Bold sa 1,
+ it=Times-Italic sa 1,
+ sl=Times-Italic sa 1,
+ bi=Times-BoldItalic sa 1,
+ bs=Times-Bold sa 1,
+ tfa=Times-Roman sa 1.200,
+ tfb=Times-Roman sa 1.440,
+ tfc=Times-Roman sa 1.728,
+ tfd=Times-Roman sa 2.074,
+ sc=Times-Roman sa 0.833]
+
+\definebodyfont [7pt,6pt,5pt] [rm]
+ [tf=Times-Roman sa 1,
+ bf=Times-Bold sa 1,
+ it=Times-Italic sa 1,
+ sl=Times-Italic sa 1,
+ bi=Times-BoldItalic sa 1,
+ bs=Times-Bold sa 1]
+
+\definebodyfont [14.4pt,12pt,11pt,10pt,9pt,8pt] [rm]
+ [bfa=Times-Bold sa 1.200,
+ bfb=Times-Bold sa 1.440,
+ bfc=Times-Bold sa 1.728,
+ bfd=Times-Bold sa 2.074,
+ sla=Times-Italic sa 1.200,
+ slb=Times-Italic sa 1.440,
+ slc=Times-Italic sa 1.728,
+ sld=Times-Italic sa 2.074,
+ bsa=Times-Bold sa 1.200,
+ bsb=Times-Bold sa 1.440,
+ bsc=Times-Bold sa 1.728,
+ bsd=Times-Bold sa 2.074]
+
+\stopcoding
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/font-win.tex b/tex/context/base/font-win.tex new file mode 100644 index 000000000..ccdbaa4c5 --- /dev/null +++ b/tex/context/base/font-win.tex @@ -0,0 +1,124 @@ +%D \module
+%D [ file=font-win,
+%D version=1997.8.29,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Windows 1252 ANSI keys,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+%D This module activates the (western) \kap{windows} high \ANSI\
+%D characters, such as ë and á.
+
+\unprotect
+
+\catcode`\À=\@@active \unexpanded\defÀ{\`A}
+\catcode`\Á=\@@active \unexpanded\defÁ{\'A}
+\catcode`\Â=\@@active \unexpanded\defÂ{\^A}
+\catcode`\Ã=\@@active \unexpanded\defÃ{\~A}
+\catcode`\Ä=\@@active \unexpanded\defÄ{\"A}
+\catcode`\Å=\@@active \unexpanded\defÅ{\AA}
+\catcode`\Æ=\@@active \unexpanded\defÆ{\AE}
+
+\catcode`\à=\@@active \unexpanded\defà{\`a}
+\catcode`\á=\@@active \unexpanded\defá{\'a}
+\catcode`\â=\@@active \unexpanded\defâ{\^a}
+\catcode`\ã=\@@active \unexpanded\defã{\~a}
+\catcode`\ä=\@@active \unexpanded\defä{\"a}
+\catcode`\å=\@@active \unexpanded\defå{\aa}
+\catcode`\æ=\@@active \unexpanded\defæ{\ae}
+
+\catcode`\Ç=\@@active \unexpanded\defÇ{\c C}
+\catcode`\ç=\@@active \unexpanded\defç{\c c}
+
+\catcode`\È=\@@active \unexpanded\defÈ{\`E}
+\catcode`\É=\@@active \unexpanded\defÉ{\'E}
+\catcode`\Ê=\@@active \unexpanded\defÊ{\^E}
+\catcode`\Ë=\@@active \unexpanded\defË{\"E}
+
+\catcode`\è=\@@active \unexpanded\defè{\`e}
+\catcode`\é=\@@active \unexpanded\defé{\'e}
+\catcode`\ê=\@@active \unexpanded\defê{\^e}
+\catcode`\ë=\@@active \unexpanded\defë{\"e}
+
+\catcode`\Ì=\@@active \unexpanded\defÌ{\`I}
+\catcode`\Í=\@@active \unexpanded\defÍ{\'I}
+\catcode`\Î=\@@active \unexpanded\defÎ{\^I}
+\catcode`\Ï=\@@active \unexpanded\defÏ{\"I}
+
+\catcode`\ì=\@@active \unexpanded\defì{\`i}
+\catcode`\í=\@@active \unexpanded\defí{\'i}
+\catcode`\î=\@@active \unexpanded\defî{\^i}
+\catcode`\ï=\@@active \unexpanded\defï{\"i}
+
+\catcode`\Ñ=\@@active \unexpanded\defÑ{\~N}
+\catcode`\ñ=\@@active \unexpanded\defñ{\~n}
+
+\catcode`\Ò=\@@active \unexpanded\defÒ{\`O}
+\catcode`\Ó=\@@active \unexpanded\defÓ{\'O}
+\catcode`\Ô=\@@active \unexpanded\defÔ{\^O}
+\catcode`\Õ=\@@active \unexpanded\defÕ{\~O}
+\catcode`\Ö=\@@active \unexpanded\defÖ{\"O}
+\catcode`\Œ=\@@active \unexpanded\defŒ{\OE}
+\catcode`\Ø=\@@active \unexpanded\defØ{\O}
+
+\catcode`\ò=\@@active \unexpanded\defò{\`o}
+\catcode`\ó=\@@active \unexpanded\defó{\'o}
+\catcode`\ô=\@@active \unexpanded\defô{\^o}
+\catcode`\õ=\@@active \unexpanded\defõ{\~o}
+\catcode`\ö=\@@active \unexpanded\defö{\"o}
+\catcode`\œ=\@@active \unexpanded\defœ{\oe}
+\catcode`\ø=\@@active \unexpanded\defø{\o}
+
+\catcode`\Š=\@@active \unexpanded\defŠ{\v{S}}
+\catcode`\š=\@@active \unexpanded\defš{\v{s}}
+\catcode`\ß=\@@active \unexpanded\defß{\SS}
+
+\catcode`\Ù=\@@active \unexpanded\defÙ{\`U}
+\catcode`\Ú=\@@active \unexpanded\defÚ{\'U}
+\catcode`\Û=\@@active \unexpanded\defÛ{\^U}
+\catcode`\Ü=\@@active \unexpanded\defÜ{\"U}
+
+\catcode`\ù=\@@active \unexpanded\defù{\`u}
+\catcode`\ú=\@@active \unexpanded\defú{\'u}
+\catcode`\û=\@@active \unexpanded\defû{\^u}
+\catcode`\ü=\@@active \unexpanded\defü{\"u}
+
+\catcode`\Ý=\@@active \unexpanded\defÝ{\'Y}
+\catcode`\ý=\@@active \unexpanded\defý{\'y}
+\catcode`\ÿ=\@@active \unexpanded\defÿ{\"y}
+
+\catcode`\¿=\@@active \unexpanded\def¿{?`}
+\catcode`\¡=\@@active \unexpanded\def¡{!`}
+\catcode`\†=\@@active \unexpanded\def†{\dag}
+\catcode`\‡=\@@active \unexpanded\def‡{\ddag}
+\catcode`\¶=\@@active \unexpanded\def¶{\P}
+\catcode`\§=\@@active \unexpanded\def§{\S}
+\catcode`\–=\@@active \unexpanded\def–{--}
+\catcode`\—=\@@active \unexpanded\def—{---}
+\catcode`\…=\@@active \unexpanded\def…{\dots}
+\catcode`\©=\@@active \unexpanded\def©{\copyright}
+\catcode`\£=\@@active \unexpanded\def£{\pounds}
+
+\catcode`\„=\@@active \unexpanded\def„{\char44\kern-.1em\char44}
+\catcode`\“=\@@active \unexpanded\def“{\char96\kern-.1em\char96}
+\catcode`\”=\@@active \unexpanded\def”{\char34}
+\catcode`\‘=\@@active \unexpanded\def‘{\upperleftsinglesixquote}
+\catcode`\’=\@@active \unexpanded\def’{\char39}
+\catcode`\›=\@@active \unexpanded\def›{\rightsubguillemot}
+\catcode`\‹=\@@active \unexpanded\def‹{\leftsubguillemot}
+
+\catcode`\«=\@@active
+\catcode`\»=\@@active
+
+\unexpanded\def«{\ifvmode\leavevmode\fi\leftguillemot\prewordbreak}
+\unexpanded\def»{\prewordbreak\rightguillemot}
+
+\protect
+
+\endinput
+
diff --git a/tex/context/base/lang-alt.tex b/tex/context/base/lang-alt.tex index 41614f2e7..b6504ffeb 100644 --- a/tex/context/base/lang-alt.tex +++ b/tex/context/base/lang-alt.tex @@ -1,86 +1,87 @@ -%D \module -%D [ file=lang-alt, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Altaic Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% Uigur, Uzbek -% Azeri/Azerbaijani, Chuvash, TURKISH, Turkmen -% Kazakh, Kazar, Kireghiz, Noghay, Talar -% Buryat, Kalmuck, Khalkha - -\writestatus{loading}{Altaic Languages} - -\unprotect - -\installlanguage - [\s!tr] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!default=\s!en, - \c!status=\v!stop] - -\setupheadtext [\s!tr] [\v!inhoud=Fihrist] -\setupheadtext [\s!tr] [\v!tabellen=Cetrel..] -\setupheadtext [\s!tr] [\v!figuren=Risim..] -\setupheadtext [\s!tr] [\v!grafieken=Grafik..] -\setupheadtext [\s!tr] [\v!intermezzos=Entermezzos] -\setupheadtext [\s!tr] [\v!index=Endeks] -\setupheadtext [\s!tr] [\v!afkortingen=K\i saltma..] -\setupheadtext [\s!tr] [\v!logos=Logos] -\setupheadtext [\s!tr] [\v!eenheden=Birlik] - -\setuplabeltext [\s!tr] [\v!tabel=Cetrel ] -\setuplabeltext [\s!tr] [\v!figuur=Risim ] -\setuplabeltext [\s!tr] [\v!intermezzo=Entermezzo ] -\setuplabeltext [\s!tr] [\v!grafiek=Grafik ] -\setuplabeltext [\s!tr] [\v!hoofdstuk=] -\setuplabeltext [\s!tr] [\v!paragraaf=] -\setuplabeltext [\s!tr] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!tr] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!tr] [\v!bijlage=] -\setuplabeltext [\s!tr] [\v!deel=Fas\i l ] -\setuplabeltext [\s!tr] [\v!regel=sat\i r] -\setuplabeltext [\s!tr] [\v!regels=sat\i r..] - -\setuplabeltext [\s!tr] [\v!january=ocak] -\setuplabeltext [\s!tr] [\v!february=\c{s}ubat] -\setuplabeltext [\s!tr] [\v!march=mart] -\setuplabeltext [\s!tr] [\v!april=nisan] -\setuplabeltext [\s!tr] [\v!may=may\i s] -\setuplabeltext [\s!tr] [\v!june=haziran] -\setuplabeltext [\s!tr] [\v!july=temmuz] -\setuplabeltext [\s!tr] [\v!august=a\u{g}ustos] -\setuplabeltext [\s!tr] [\v!september=eyl\"ul] -\setuplabeltext [\s!tr] [\v!october=ekim] -\setuplabeltext [\s!tr] [\v!november=kas\i m] -\setuplabeltext [\s!tr] [\v!december=aral\i k] - -\setuplabeltext [\s!tr] [\v!sunday=pazar] -\setuplabeltext [\s!tr] [\v!monday=pazartesi] -\setuplabeltext [\s!tr] [\v!tuesday=sal\i] -\setuplabeltext [\s!tr] [\v!wednesday=\c{c}ar\c{s}amba] -\setuplabeltext [\s!tr] [\v!thursday=per\c{s}embe] -\setuplabeltext [\s!tr] [\v!friday=cuma] -\setuplabeltext [\s!tr] [\v!saturday=cumartesi] - -%D \ShowAllLanguageValues [\s!tr] [turkish] turks fruit - -\protect - -\endinput +%D \module
+%D [ file=lang-alt,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Altaic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Uigur, Uzbek
+% Azeri/Azerbaijani, Chuvash, TURKISH, Turkmen
+% Kazakh, Kazar, Kireghiz, Noghay, Talar
+% Buryat, Kalmuck, Khalkha
+
+\writestatus{loading}{Altaic Languages}
+
+\unprotect
+
+\installlanguage
+ [\s!tr]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\setupheadtext [\s!tr] [\v!inhoud=Fihrist]
+\setupheadtext [\s!tr] [\v!tabellen=Cetrel..]
+\setupheadtext [\s!tr] [\v!figuren=Risim..]
+\setupheadtext [\s!tr] [\v!grafieken=Grafik..]
+\setupheadtext [\s!tr] [\v!intermezzos=Entermezzos]
+\setupheadtext [\s!tr] [\v!index=Endeks]
+\setupheadtext [\s!tr] [\v!afkortingen=K\i saltma..]
+\setupheadtext [\s!tr] [\v!logos=Logos]
+\setupheadtext [\s!tr] [\v!eenheden=Birlik]
+
+\setuplabeltext [\s!tr] [\v!tabel=Cetrel ]
+\setuplabeltext [\s!tr] [\v!figuur=Risim ]
+\setuplabeltext [\s!tr] [\v!intermezzo=Entermezzo ]
+\setuplabeltext [\s!tr] [\v!grafiek=Grafik ]
+\setuplabeltext [\s!tr] [\v!hoofdstuk=]
+\setuplabeltext [\s!tr] [\v!paragraaf=]
+\setuplabeltext [\s!tr] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!tr] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!tr] [\v!bijlage=]
+\setuplabeltext [\s!tr] [\v!deel=Fas\i l ]
+\setuplabeltext [\s!tr] [\v!regel=sat\i r]
+\setuplabeltext [\s!tr] [\v!regels=sat\i r..]
+
+\setuplabeltext [\s!tr] [\v!january=ocak]
+\setuplabeltext [\s!tr] [\v!february=\c{s}ubat]
+\setuplabeltext [\s!tr] [\v!march=mart]
+\setuplabeltext [\s!tr] [\v!april=nisan]
+\setuplabeltext [\s!tr] [\v!may=may\i s]
+\setuplabeltext [\s!tr] [\v!june=haziran]
+\setuplabeltext [\s!tr] [\v!july=temmuz]
+\setuplabeltext [\s!tr] [\v!august=a\u{g}ustos]
+\setuplabeltext [\s!tr] [\v!september=eyl\"ul]
+\setuplabeltext [\s!tr] [\v!october=ekim]
+\setuplabeltext [\s!tr] [\v!november=kas\i m]
+\setuplabeltext [\s!tr] [\v!december=aral\i k]
+
+\setuplabeltext [\s!tr] [\v!sunday=pazar]
+\setuplabeltext [\s!tr] [\v!monday=pazartesi]
+\setuplabeltext [\s!tr] [\v!tuesday=sal\i]
+\setuplabeltext [\s!tr] [\v!wednesday=\c{c}ar\c{s}amba]
+\setuplabeltext [\s!tr] [\v!thursday=per\c{s}embe]
+\setuplabeltext [\s!tr] [\v!friday=cuma]
+\setuplabeltext [\s!tr] [\v!saturday=cumartesi]
+
+%D \ShowAllLanguageValues [\s!tr] [turkish] turks fruit
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-ana.tex b/tex/context/base/lang-ana.tex index 5f5b021bf..742d5f6fb 100644 --- a/tex/context/base/lang-ana.tex +++ b/tex/context/base/lang-ana.tex @@ -1,20 +1,21 @@ -%D \module -%D [ file=lang-ana, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Anatolian Languages, -%D author=Hans Hagen / Tobias Burnus, -%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}{Anatolian Languages} - -\unprotect - -\protect - -\endinput +%D \module
+%D [ file=lang-ana,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Anatolian Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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}{Anatolian Languages}
+
+\unprotect
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-art.tex b/tex/context/base/lang-art.tex index 3538e774e..d91be59fb 100644 --- a/tex/context/base/lang-art.tex +++ b/tex/context/base/lang-art.tex @@ -1,22 +1,23 @@ -%D \module -%D [ file=lang-art, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Artificial Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% Esperanto - -\writestatus{loading}{Artificial Languages} - -\unprotect - -\protect - -\endinput +%D \module
+%D [ file=lang-art,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Artificial Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Esperanto
+
+\writestatus{loading}{Artificial Languages}
+
+\unprotect
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-bal.tex b/tex/context/base/lang-bal.tex index a0b043019..2d95f3735 100644 --- a/tex/context/base/lang-bal.tex +++ b/tex/context/base/lang-bal.tex @@ -1,22 +1,23 @@ -%D \module -%D [ file=lang-bal, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Baltic Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% Lettish/Latvian, Lithuanian - -\writestatus{loading}{Baltic Languages} - -\unprotect - -\protect - -\endinput +%D \module
+%D [ file=lang-bal,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Baltic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Lettish/Latvian, Lithuanian
+
+\writestatus{loading}{Baltic Languages}
+
+\unprotect
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-cel.tex b/tex/context/base/lang-cel.tex index 90dd3f8ce..2f104e9e1 100644 --- a/tex/context/base/lang-cel.tex +++ b/tex/context/base/lang-cel.tex @@ -1,22 +1,23 @@ -%D \module -%D [ file=lang-cel, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Celtic Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% Breton, Welsh, Irish, Manx, Scottish Gaelic - -\writestatus{loading}{Celtic Languages} - -\unprotect - -\protect - -\endinput +%D \module
+%D [ file=lang-cel,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Celtic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Breton, Welsh, Irish, Manx, Scottish Gaelic
+
+\writestatus{loading}{Celtic Languages}
+
+\unprotect
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-da.pat b/tex/context/base/lang-da.pat index e49c9fe4e..7259cee1d 100644 --- a/tex/context/base/lang-da.pat +++ b/tex/context/base/lang-da.pat @@ -1,1154 +1,1154 @@ -\endinput - -% dkhyphen.tex; created by Frank Jensen (fj@iesd.auc.dk) -% -% This file contains the hyphenation patterns for danish. -% -\patterns{ -.ae3 -.an3k -.an1s -.be5la -.be1t -.bi4tr -.der3i -.diagno5 -.her3 -.hoved3 -.ne4t5 -.n^^e6v5nt. -.om1 -.ove4 -.po1 -.s^^e53 -.til3 -.yd5r -.^^e6r5i -.^^f8v3r -ab5le -3abst -a3c -ade5la -5adg -a1e -5afg -5a4f1l -af3r -af4ri -5afs -a4gef -a4gi -ag5in -ag5si -3agti -a4gy -a3h -ais5t -a3j -a5ka -a3ke -a5kr -aku5 -a3la -a1le -a1li -al3k -4alkv -a1lo -al5si -a3lu -a1ly -am4pa -3analy -an4k5r -a3nu -3anv -a5o -a5pe -a3pi -a5po -a1ra -ar5af -1arb -a1re -5arg -a1ri -a3ro -a3sa -a3sc -a1si -a3sk -a3so -3a3sp -a3ste -a3sti -a1ta1 -a1te -a1ti -a4t5in -a1to -ato5v -a5tr -a1tu -a3t^^f8 -a5va -a1ve -a5v^^e6 -a5z -1ba -ba4ti -4bd -1be -be1k -be3ro -be5ru -be1s4 -be1tr -1bi -bi5sk -b1j -4b1n -1bo -bo4gr -bo3ra -bo5re -1br4 -br^^f8d3 -4bs -bs5k -b3so -b1st -b5t -3bu -bu4s5tr -b5w -1by -by5s -5b^^e6 -4c1c -1ce -ce5ro -3ch -4ch. -ci4o -ck3 -5cy -3da -4d3af -d5anta -da4s -d1b -d1d4 -1de -de5d -4de4lem -der5eri -de4rig -de5sk -d1f -d1g -d3h -1di -di1e -di5l -d3j -d1k -d1l -d1m -4d1n -3do -4dop -d5ov -d1p -4drett -5d4reve -3drif -3driv -d5ros -d5ru -5dr^^f8v -ds5an -ds5in -d1ski -d4sm -dst^^e54 -d4su -dsu5l -ds5vi -d3ta -d1te -dt5o -d5tr -dt5u -1du -dub5 -d1v -3dy -3d^^e6 -3d^^f8 -e5ad -e3af -e5ag -e3ak -e1al -ea4la -e3an -e5ap -e3at -e3bl -ebs3 -e1ci -ed5ar -edde4 -eddel5 -e4do -ed5ra -ed3re -ed3rin -ed4str -e3e -3eff -e3fr -3eft -e3gu -e1h -e3in -ei5s -e3je -e4j5el -e1ka -e3ke -e3kl -4e1ko -e5kr -ek5sa -3eksem -3eksp -e3ku -e1kv -e5ky -e3lad -el3ak -el3ar -e1las -e3le -e4lek -3elem -e1li -5elim -e3lo -el5sa -e5lu -e3ly -e3l^^e6 -e3l^^f8 -e4mad -em4p5le -em1s -en5ak -e4nan -4enn -e4no -en3so -e5nu -e5ol -e3op -e1or -e3ov -epi3 -e1pr -e3ra -er3af -e4rag -e4rak -e1re -e4ref -er5ege -5erhv -e1ri -e4rib -er1k -ero5d -er5ov -er3s -er5tr -e3rum -er5un -e5ry -e3r^^f8 -er5^^f8n -e1ta -e1te -etek4s -e1ti -e3tj -e1to -e3tr -e3tu -e1ty -e5t^^e6 -e5t^^f8 -e3um -e3un -3eur -e1va -e3ve -e4v3erf -e1vi -e1v^^e6 -e5x -e3^^e6 -e5^^e5 -1fa -fa4ce -fags3 -f1b -f1d -1fe -fej4 -fejl1 -f1f -f1g -f1h -1fi -f1k -3fl -1fo -for1en -fo4ri -f1p -f1s4 -4ft -f3ta -f1te -f1ti -f5to -f5tvi -1fu -f1v -3fy -3f^^e6 -3f^^f8 -f^^f84r5en -1ga -g3art -g1b -g1d -1ge -4g5enden -ger3in -ge3s -g3f -g1g -g1h -1gi -gi4b -gi3st -gi^^f84 -5gj -g3k -g1l -g1m -3go -4g5om -g5ov -g3p -1gr -gs1a -gsde4len -g4se -gsha4 -g5sla -gs3or -gs1p -g5s4tide -g4str -gs1v -g4s^^f8 -g5s^^e5 -g3ta -g1te -g1ti -g5to -g3tr -gt4s -g3ud -gun5 -g3v -1gy -g5yd -3g^^e6 -3g^^f81 -3g^^e5 -4ha. -heds3 -he5s -4het -hi4e -hi4n5 -hi3s -ho5ko -ho5ve -4h3t -hun4 -hund3 -hvo4 -i1a -i3b -i4ble -i1c -i3dr -ids5k -i1el -i1en -i3er -i3et. -if3r -i3gu -i3h -i5i -i5j -i1ka -i1ke -ik1l -i5ko -ik3re -ik5ri -iks5t -ik4tu -i3ku -ik3v -i3lag -il3eg -il5ej -il5el -i3li -i4l5id -il3k -i1lo -il5u -i3mu -ind3t -5inf -ings1 -in3s -in4sv -inter1 -i3nu -i3od -i3og -i5ok -i3ol -ion4 -ions1 -i5o5r -i3ot -i5pi -i3pli -i5pr -i3re -i3ri -ir5t -i3sc -i3si -i4sm -is3p -i1ster -i3sti -i5sua -i1ta -i1te -i1ti -i3to -i3tr -it5re. -i1tu -i3ty -i5t^^e6 -i1u -i1va -i1ve -i1vi -i3^^f8 -j3ag -jde4rer -jds1 -jek4to -4j5en. -j5k -j3le -j3li -jlmeld5 -jlmel4di -j3r -jre5 -ju3s -5kap -k5au -5kav -k5b -kel5s -ke3sk -ke5st -ke4t5a -k3h -ki3e -ki3st -k1k -k5lak -k1le -3klu -k4ny -5kod -1kon -ko3ra -3kort -ko3v -1kra -5kry -ks3an -k1si -ks3k -ks1p -k3ste -k5stu -ks5v -k1t -k4tar -k4terh -kti4e -kt5re -kt5s -3kur -1kus -3kut -k4vo -k4vu -3k^^f8 -3k^^e5 -5lab -lad3r -5lagd -la4g3r -5lam -1lat -l1b -ldiagnos5 -l3dr -ld3st -1le. -5led -4lele -le4mo -3len -1ler -1les -4leu -l1f -lfin4 -lfind5 -l1go1 -l3h -li4ga -lingeni^^f84 -4l5ins -4l3int -li5o -l3j -l1ke -l1ko -l3ky -l1l -l5mu -lo4du -l3op -4l5or -3lov -4l3p -l4ps -l3r -4ls -lses1 -ls5in -l5sj -l1ta -l4taf -l1te -l4t5erf -l3ti -lt3o -l3tr -l3tu -lu5l -l3ve -l3vi -l3v^^e6 -5l^^f8s -1ma -m1b -m3d -1me -4m5ej -m3f -m1g -m3h -1mi -mi3k -m5ing -mi4o -mi5sty -m3k -m1l -m1m -mmen5 -m1n -3mo -mo4da -4mop -4m5ov -m1pe -m3pi -m3pl -m1po -m3pr -m1r -mse5s -ms5in -m5sk -ms3p -m3ste -ms5v -m3ta -m3te -m3ti -m3tr -m5t^^e5 -m1ud -1mul -mu1li -3my -1m^^e6 -3m^^f8 -3m^^e5 -3na -4nak -1nal -n1b -n1c -4nd -n3dr -nd5si -nd5sk -nd5sp -1ne -ne5a -ne4da -nemen4 -nement5e -neo4 -n3erk -n5erl -ne5sl -ne5st -n1f -n4go -4n1h -1ni -4nim -ni5o -ni3st -n1ke -n1ko -n3kr -n3ku -n5kv -n3k^^e6 -4n1l -n1m -n1n -1no -n3ord -n5p -n3r -4ns -n3si -n1sku -ns3po -n1sta -n5sti -n1ta -nta4le -n1te -n1ti -ntiali4 -n3to -n1tr -nt4s5t -nt4su -n3tu -n3ty -n5t^^e6 -4n1v -3ny -n3z -3n^^e6 -4n5^^e6b -5n^^f8 -o3a -o4as -ob3li -o1c -o4din -od5ri -od5s -od5un -o1e -of5r -o4gek -o4gel -o4g5o -og5re -og5sk -o5h -o5in -oi6s5e -o1j -o3ka -o1ke -o3ku -o3la -o3le -o1li -o1lo -o3lu -o5ly -o5l^^e6 -1omr -on3k -ook5 -o3or -o5ov -o3pi -op3l -op3r -op3s -3opta -4or. -or1an -3ordn -ord5s -o3re. -o3reg -o3rek -o3rer -o3re3s -o3ret -o3ri -3orient -or5im -o4r5in -or3k -or5o -or3sl -or3st -or3^^f8 -o3si -o3so -o3t -o1te -o5un -ov4s -o5^^e5 -3pa -pa5gh -p5anl -p3d -4pec -3pen -1per -pe1ra -pe5s -pe3u -p3f -4p5h -1pla -p4lan -4ple. -4pler -4ples -p3m -p3n -5pok -4po3re -3pot -4p5p4 -p4ro -1proc -5pr^^e6 -p3sk -p5so -ps4p -p3st -p1t -1pu -pu5b -p5ule -p5v -5py3 -5p^^e6d -p^^e53 -qu4 -4raf -ra5is -4rarb -r1b -r4d5ar -r3dr -rd4s3 -4reks -1rel -re5la -r5enss -5rese -re5spo -4ress -re3st -re5s4u -5rett -r1f -r1gu -r1h -ri1e -ri5la -4rimo -r4ing -ringse4 -ringso4r -4rinp -4rint -r3ka -r1ke -r1ki -rk3so -r3ku -r5k^^e6 -r1l -rmo4 -r5mu -r1n -ro1b -ro3p -r3or -r3p -r1r -rre5s -rro4n5 -r1sa -r1si -r5skr -r4sk5v -rs4n -r3sp -r5stu -r5su -r3sv -r5tal -r1te -r4teli -r1ti -r3to -r4t5or -rt5rat -rt3re -r5tri -r5tro -rt3s -r5ty -r5t^^e6 -r5t^^f8 -r3ud -run4da -5rut -r3va -r1ve -r3vi -r3v^^e6 -ry4s -r5^^e6l -4r^^f8n -5r^^f8r -3r^^e5d -r5^^e5r -s3af -1sam -sa4ma -s3ap -s1ar -1sat -4s1b -s1d -sdy4 -1se -s4ed -5s4er -se4se -s1f -4s1g4 -4s3h -si4bl -1sig -s5int -5sis -5sit -5siu -s5ju -4sk. -1skab -1ske -s3kl -sk5s4 -5sky -s4k^^e5 -s1le -s1li -slo3 -5slu -s5ly -3sl^^e5 -s1m -s4my -4snin -s4nit -s4n^^e6 -so5k -5sol -5som. -3somm -s5oms -5somt -3son -4s1op -sp4 -3spec -4sper -3s4pi -s1pl -3sprog. -s5r4 -s1s4 -4st. -5s4tam -1stan -st5as -3stat -1stav -1ste. -1sted -3stel -5stemo -1sten -5step -3ster. -3stes -5stet -5stj -3sto -st5om -1str -5st^^f8 -1st^^e5 -s1ud -3sul -s3un -3sur -s3ve -3s4y -1sy1s -1s^^e6 -4s5^^e6n -1s^^f8 -s5^^f8k -s^^e54r5 -5ta. -1tag -tands3 -4tanv -4tb -tede4l -teds5 -3teg -5tekn -teo1 -5term -te5ro -4t1f -6t3g -t1h -tialis5t -3tid -ti4en -ti3st -ti4^^f8 -4t3k -4t1l -tli4s5 -t1m -t1n -to5ra -to1re -to1ri -tor4m -4t3p -t4ra -4tres -tro5v -1try -3tr^^e6k. -4ts -t3si -ts4pa -ts5pr -t3st -ts5ul -t4s^^f8 -t5s^^e5 -4t1t -t5uds -5tur -t5ve -t3v^^e6 -1typ -u1a -5udl -ud5r -ud3s -3udv -u1e -ue4t5 -uge4ri -ugs3 -u5gu -u3i -u5kl -uk4ta -uk4tr -u1la -u1le -u5ly -u3l^^e6 -u5pe -up5l -u5q -u3ra -u3re -u4r3eg -u1rer -u3ro -us5a -u3si -u5ska -u5so -us5v -u1te -u1ti -u1to -ut5r -ut5s4 -5u5v -va5d -3varm -1ved -ve4l5e -ve4reg -ve3s -5vet -v5h -vi4l3in -1vis -v5j -v5k -vl4 -v3le -v5li -vls1 -1vo -4v5om -v5p -v5re -v3st -v5su -v5t -3vu -3v^^e6rd -1v^^e6rk -5v^^e5 -y3a -y5dr -y3e -y3ke -y5ki -yk3li -y3ko -yk4s5 -y3kv -y5li -y5lo -y5mu -yns5 -y5o -y1pe -y3pi -y3re -yr3ek -y3ri -y3si -y3ti -y5t3r -y5ve -y5v^^e6 -zi5o -^^e6b3l -^^e63c -^^e63e -^^e6g5a -^^e64gek -^^e64g5r -^^e6gs5 -^^e65i -^^e65kv -^^e6lle4 -^^e6n1dr -^^e65o -^^e61re -^^e6r4g5r -^^e63ri -^^e6r4ma -^^e6r4mo -^^e6r5s -^^e65si -^^e63so -^^e63ste -^^e63ve -^^f8de5 -^^f83e -^^f81je -^^f83ke -^^f83le -^^f8ms5 -^^f8n3st -^^f8n4t3 -^^f81re -^^f83ri -^^f8rne3 -^^f8r5o -^^f81ve -^^e51d -^^e51e -^^e55h -^^e53l -^^e53re -^^e5rs5t -^^e55sk -^^e53t -} -\endinput +\endinput
+
+% dkhyphen.tex; created by Frank Jensen (fj@iesd.auc.dk)
+%
+% This file contains the hyphenation patterns for danish.
+%
+\patterns{
+.ae3
+.an3k
+.an1s
+.be5la
+.be1t
+.bi4tr
+.der3i
+.diagno5
+.her3
+.hoved3
+.ne4t5
+.n^^e6v5nt.
+.om1
+.ove4
+.po1
+.s^^e53
+.til3
+.yd5r
+.^^e6r5i
+.^^f8v3r
+ab5le
+3abst
+a3c
+ade5la
+5adg
+a1e
+5afg
+5a4f1l
+af3r
+af4ri
+5afs
+a4gef
+a4gi
+ag5in
+ag5si
+3agti
+a4gy
+a3h
+ais5t
+a3j
+a5ka
+a3ke
+a5kr
+aku5
+a3la
+a1le
+a1li
+al3k
+4alkv
+a1lo
+al5si
+a3lu
+a1ly
+am4pa
+3analy
+an4k5r
+a3nu
+3anv
+a5o
+a5pe
+a3pi
+a5po
+a1ra
+ar5af
+1arb
+a1re
+5arg
+a1ri
+a3ro
+a3sa
+a3sc
+a1si
+a3sk
+a3so
+3a3sp
+a3ste
+a3sti
+a1ta1
+a1te
+a1ti
+a4t5in
+a1to
+ato5v
+a5tr
+a1tu
+a3t^^f8
+a5va
+a1ve
+a5v^^e6
+a5z
+1ba
+ba4ti
+4bd
+1be
+be1k
+be3ro
+be5ru
+be1s4
+be1tr
+1bi
+bi5sk
+b1j
+4b1n
+1bo
+bo4gr
+bo3ra
+bo5re
+1br4
+br^^f8d3
+4bs
+bs5k
+b3so
+b1st
+b5t
+3bu
+bu4s5tr
+b5w
+1by
+by5s
+5b^^e6
+4c1c
+1ce
+ce5ro
+3ch
+4ch.
+ci4o
+ck3
+5cy
+3da
+4d3af
+d5anta
+da4s
+d1b
+d1d4
+1de
+de5d
+4de4lem
+der5eri
+de4rig
+de5sk
+d1f
+d1g
+d3h
+1di
+di1e
+di5l
+d3j
+d1k
+d1l
+d1m
+4d1n
+3do
+4dop
+d5ov
+d1p
+4drett
+5d4reve
+3drif
+3driv
+d5ros
+d5ru
+5dr^^f8v
+ds5an
+ds5in
+d1ski
+d4sm
+dst^^e54
+d4su
+dsu5l
+ds5vi
+d3ta
+d1te
+dt5o
+d5tr
+dt5u
+1du
+dub5
+d1v
+3dy
+3d^^e6
+3d^^f8
+e5ad
+e3af
+e5ag
+e3ak
+e1al
+ea4la
+e3an
+e5ap
+e3at
+e3bl
+ebs3
+e1ci
+ed5ar
+edde4
+eddel5
+e4do
+ed5ra
+ed3re
+ed3rin
+ed4str
+e3e
+3eff
+e3fr
+3eft
+e3gu
+e1h
+e3in
+ei5s
+e3je
+e4j5el
+e1ka
+e3ke
+e3kl
+4e1ko
+e5kr
+ek5sa
+3eksem
+3eksp
+e3ku
+e1kv
+e5ky
+e3lad
+el3ak
+el3ar
+e1las
+e3le
+e4lek
+3elem
+e1li
+5elim
+e3lo
+el5sa
+e5lu
+e3ly
+e3l^^e6
+e3l^^f8
+e4mad
+em4p5le
+em1s
+en5ak
+e4nan
+4enn
+e4no
+en3so
+e5nu
+e5ol
+e3op
+e1or
+e3ov
+epi3
+e1pr
+e3ra
+er3af
+e4rag
+e4rak
+e1re
+e4ref
+er5ege
+5erhv
+e1ri
+e4rib
+er1k
+ero5d
+er5ov
+er3s
+er5tr
+e3rum
+er5un
+e5ry
+e3r^^f8
+er5^^f8n
+e1ta
+e1te
+etek4s
+e1ti
+e3tj
+e1to
+e3tr
+e3tu
+e1ty
+e5t^^e6
+e5t^^f8
+e3um
+e3un
+3eur
+e1va
+e3ve
+e4v3erf
+e1vi
+e1v^^e6
+e5x
+e3^^e6
+e5^^e5
+1fa
+fa4ce
+fags3
+f1b
+f1d
+1fe
+fej4
+fejl1
+f1f
+f1g
+f1h
+1fi
+f1k
+3fl
+1fo
+for1en
+fo4ri
+f1p
+f1s4
+4ft
+f3ta
+f1te
+f1ti
+f5to
+f5tvi
+1fu
+f1v
+3fy
+3f^^e6
+3f^^f8
+f^^f84r5en
+1ga
+g3art
+g1b
+g1d
+1ge
+4g5enden
+ger3in
+ge3s
+g3f
+g1g
+g1h
+1gi
+gi4b
+gi3st
+gi^^f84
+5gj
+g3k
+g1l
+g1m
+3go
+4g5om
+g5ov
+g3p
+1gr
+gs1a
+gsde4len
+g4se
+gsha4
+g5sla
+gs3or
+gs1p
+g5s4tide
+g4str
+gs1v
+g4s^^f8
+g5s^^e5
+g3ta
+g1te
+g1ti
+g5to
+g3tr
+gt4s
+g3ud
+gun5
+g3v
+1gy
+g5yd
+3g^^e6
+3g^^f81
+3g^^e5
+4ha.
+heds3
+he5s
+4het
+hi4e
+hi4n5
+hi3s
+ho5ko
+ho5ve
+4h3t
+hun4
+hund3
+hvo4
+i1a
+i3b
+i4ble
+i1c
+i3dr
+ids5k
+i1el
+i1en
+i3er
+i3et.
+if3r
+i3gu
+i3h
+i5i
+i5j
+i1ka
+i1ke
+ik1l
+i5ko
+ik3re
+ik5ri
+iks5t
+ik4tu
+i3ku
+ik3v
+i3lag
+il3eg
+il5ej
+il5el
+i3li
+i4l5id
+il3k
+i1lo
+il5u
+i3mu
+ind3t
+5inf
+ings1
+in3s
+in4sv
+inter1
+i3nu
+i3od
+i3og
+i5ok
+i3ol
+ion4
+ions1
+i5o5r
+i3ot
+i5pi
+i3pli
+i5pr
+i3re
+i3ri
+ir5t
+i3sc
+i3si
+i4sm
+is3p
+i1ster
+i3sti
+i5sua
+i1ta
+i1te
+i1ti
+i3to
+i3tr
+it5re.
+i1tu
+i3ty
+i5t^^e6
+i1u
+i1va
+i1ve
+i1vi
+i3^^f8
+j3ag
+jde4rer
+jds1
+jek4to
+4j5en.
+j5k
+j3le
+j3li
+jlmeld5
+jlmel4di
+j3r
+jre5
+ju3s
+5kap
+k5au
+5kav
+k5b
+kel5s
+ke3sk
+ke5st
+ke4t5a
+k3h
+ki3e
+ki3st
+k1k
+k5lak
+k1le
+3klu
+k4ny
+5kod
+1kon
+ko3ra
+3kort
+ko3v
+1kra
+5kry
+ks3an
+k1si
+ks3k
+ks1p
+k3ste
+k5stu
+ks5v
+k1t
+k4tar
+k4terh
+kti4e
+kt5re
+kt5s
+3kur
+1kus
+3kut
+k4vo
+k4vu
+3k^^f8
+3k^^e5
+5lab
+lad3r
+5lagd
+la4g3r
+5lam
+1lat
+l1b
+ldiagnos5
+l3dr
+ld3st
+1le.
+5led
+4lele
+le4mo
+3len
+1ler
+1les
+4leu
+l1f
+lfin4
+lfind5
+l1go1
+l3h
+li4ga
+lingeni^^f84
+4l5ins
+4l3int
+li5o
+l3j
+l1ke
+l1ko
+l3ky
+l1l
+l5mu
+lo4du
+l3op
+4l5or
+3lov
+4l3p
+l4ps
+l3r
+4ls
+lses1
+ls5in
+l5sj
+l1ta
+l4taf
+l1te
+l4t5erf
+l3ti
+lt3o
+l3tr
+l3tu
+lu5l
+l3ve
+l3vi
+l3v^^e6
+5l^^f8s
+1ma
+m1b
+m3d
+1me
+4m5ej
+m3f
+m1g
+m3h
+1mi
+mi3k
+m5ing
+mi4o
+mi5sty
+m3k
+m1l
+m1m
+mmen5
+m1n
+3mo
+mo4da
+4mop
+4m5ov
+m1pe
+m3pi
+m3pl
+m1po
+m3pr
+m1r
+mse5s
+ms5in
+m5sk
+ms3p
+m3ste
+ms5v
+m3ta
+m3te
+m3ti
+m3tr
+m5t^^e5
+m1ud
+1mul
+mu1li
+3my
+1m^^e6
+3m^^f8
+3m^^e5
+3na
+4nak
+1nal
+n1b
+n1c
+4nd
+n3dr
+nd5si
+nd5sk
+nd5sp
+1ne
+ne5a
+ne4da
+nemen4
+nement5e
+neo4
+n3erk
+n5erl
+ne5sl
+ne5st
+n1f
+n4go
+4n1h
+1ni
+4nim
+ni5o
+ni3st
+n1ke
+n1ko
+n3kr
+n3ku
+n5kv
+n3k^^e6
+4n1l
+n1m
+n1n
+1no
+n3ord
+n5p
+n3r
+4ns
+n3si
+n1sku
+ns3po
+n1sta
+n5sti
+n1ta
+nta4le
+n1te
+n1ti
+ntiali4
+n3to
+n1tr
+nt4s5t
+nt4su
+n3tu
+n3ty
+n5t^^e6
+4n1v
+3ny
+n3z
+3n^^e6
+4n5^^e6b
+5n^^f8
+o3a
+o4as
+ob3li
+o1c
+o4din
+od5ri
+od5s
+od5un
+o1e
+of5r
+o4gek
+o4gel
+o4g5o
+og5re
+og5sk
+o5h
+o5in
+oi6s5e
+o1j
+o3ka
+o1ke
+o3ku
+o3la
+o3le
+o1li
+o1lo
+o3lu
+o5ly
+o5l^^e6
+1omr
+on3k
+ook5
+o3or
+o5ov
+o3pi
+op3l
+op3r
+op3s
+3opta
+4or.
+or1an
+3ordn
+ord5s
+o3re.
+o3reg
+o3rek
+o3rer
+o3re3s
+o3ret
+o3ri
+3orient
+or5im
+o4r5in
+or3k
+or5o
+or3sl
+or3st
+or3^^f8
+o3si
+o3so
+o3t
+o1te
+o5un
+ov4s
+o5^^e5
+3pa
+pa5gh
+p5anl
+p3d
+4pec
+3pen
+1per
+pe1ra
+pe5s
+pe3u
+p3f
+4p5h
+1pla
+p4lan
+4ple.
+4pler
+4ples
+p3m
+p3n
+5pok
+4po3re
+3pot
+4p5p4
+p4ro
+1proc
+5pr^^e6
+p3sk
+p5so
+ps4p
+p3st
+p1t
+1pu
+pu5b
+p5ule
+p5v
+5py3
+5p^^e6d
+p^^e53
+qu4
+4raf
+ra5is
+4rarb
+r1b
+r4d5ar
+r3dr
+rd4s3
+4reks
+1rel
+re5la
+r5enss
+5rese
+re5spo
+4ress
+re3st
+re5s4u
+5rett
+r1f
+r1gu
+r1h
+ri1e
+ri5la
+4rimo
+r4ing
+ringse4
+ringso4r
+4rinp
+4rint
+r3ka
+r1ke
+r1ki
+rk3so
+r3ku
+r5k^^e6
+r1l
+rmo4
+r5mu
+r1n
+ro1b
+ro3p
+r3or
+r3p
+r1r
+rre5s
+rro4n5
+r1sa
+r1si
+r5skr
+r4sk5v
+rs4n
+r3sp
+r5stu
+r5su
+r3sv
+r5tal
+r1te
+r4teli
+r1ti
+r3to
+r4t5or
+rt5rat
+rt3re
+r5tri
+r5tro
+rt3s
+r5ty
+r5t^^e6
+r5t^^f8
+r3ud
+run4da
+5rut
+r3va
+r1ve
+r3vi
+r3v^^e6
+ry4s
+r5^^e6l
+4r^^f8n
+5r^^f8r
+3r^^e5d
+r5^^e5r
+s3af
+1sam
+sa4ma
+s3ap
+s1ar
+1sat
+4s1b
+s1d
+sdy4
+1se
+s4ed
+5s4er
+se4se
+s1f
+4s1g4
+4s3h
+si4bl
+1sig
+s5int
+5sis
+5sit
+5siu
+s5ju
+4sk.
+1skab
+1ske
+s3kl
+sk5s4
+5sky
+s4k^^e5
+s1le
+s1li
+slo3
+5slu
+s5ly
+3sl^^e5
+s1m
+s4my
+4snin
+s4nit
+s4n^^e6
+so5k
+5sol
+5som.
+3somm
+s5oms
+5somt
+3son
+4s1op
+sp4
+3spec
+4sper
+3s4pi
+s1pl
+3sprog.
+s5r4
+s1s4
+4st.
+5s4tam
+1stan
+st5as
+3stat
+1stav
+1ste.
+1sted
+3stel
+5stemo
+1sten
+5step
+3ster.
+3stes
+5stet
+5stj
+3sto
+st5om
+1str
+5st^^f8
+1st^^e5
+s1ud
+3sul
+s3un
+3sur
+s3ve
+3s4y
+1sy1s
+1s^^e6
+4s5^^e6n
+1s^^f8
+s5^^f8k
+s^^e54r5
+5ta.
+1tag
+tands3
+4tanv
+4tb
+tede4l
+teds5
+3teg
+5tekn
+teo1
+5term
+te5ro
+4t1f
+6t3g
+t1h
+tialis5t
+3tid
+ti4en
+ti3st
+ti4^^f8
+4t3k
+4t1l
+tli4s5
+t1m
+t1n
+to5ra
+to1re
+to1ri
+tor4m
+4t3p
+t4ra
+4tres
+tro5v
+1try
+3tr^^e6k.
+4ts
+t3si
+ts4pa
+ts5pr
+t3st
+ts5ul
+t4s^^f8
+t5s^^e5
+4t1t
+t5uds
+5tur
+t5ve
+t3v^^e6
+1typ
+u1a
+5udl
+ud5r
+ud3s
+3udv
+u1e
+ue4t5
+uge4ri
+ugs3
+u5gu
+u3i
+u5kl
+uk4ta
+uk4tr
+u1la
+u1le
+u5ly
+u3l^^e6
+u5pe
+up5l
+u5q
+u3ra
+u3re
+u4r3eg
+u1rer
+u3ro
+us5a
+u3si
+u5ska
+u5so
+us5v
+u1te
+u1ti
+u1to
+ut5r
+ut5s4
+5u5v
+va5d
+3varm
+1ved
+ve4l5e
+ve4reg
+ve3s
+5vet
+v5h
+vi4l3in
+1vis
+v5j
+v5k
+vl4
+v3le
+v5li
+vls1
+1vo
+4v5om
+v5p
+v5re
+v3st
+v5su
+v5t
+3vu
+3v^^e6rd
+1v^^e6rk
+5v^^e5
+y3a
+y5dr
+y3e
+y3ke
+y5ki
+yk3li
+y3ko
+yk4s5
+y3kv
+y5li
+y5lo
+y5mu
+yns5
+y5o
+y1pe
+y3pi
+y3re
+yr3ek
+y3ri
+y3si
+y3ti
+y5t3r
+y5ve
+y5v^^e6
+zi5o
+^^e6b3l
+^^e63c
+^^e63e
+^^e6g5a
+^^e64gek
+^^e64g5r
+^^e6gs5
+^^e65i
+^^e65kv
+^^e6lle4
+^^e6n1dr
+^^e65o
+^^e61re
+^^e6r4g5r
+^^e63ri
+^^e6r4ma
+^^e6r4mo
+^^e6r5s
+^^e65si
+^^e63so
+^^e63ste
+^^e63ve
+^^f8de5
+^^f83e
+^^f81je
+^^f83ke
+^^f83le
+^^f8ms5
+^^f8n3st
+^^f8n4t3
+^^f81re
+^^f83ri
+^^f8rne3
+^^f8r5o
+^^f81ve
+^^e51d
+^^e51e
+^^e55h
+^^e53l
+^^e53re
+^^e5rs5t
+^^e55sk
+^^e53t
+}
+\endinput
diff --git a/tex/context/base/lang-de.pat b/tex/context/base/lang-de.pat index 6a9a897f4..e0373ee4e 100644 --- a/tex/context/base/lang-de.pat +++ b/tex/context/base/lang-de.pat @@ -1,2580 +1,2581 @@ -% These are optimized german hyphenation patterns for use with TeX -% generated at -% Rechenzentrum Ruhr-Universitaet Bochum -% Universitaetsstrasse 150 -% D-4630 Bochum 1 -% as of 1986-11-01. -% Copyright Rechenzentrum der Ruhr-Universitaet Bochum 1986 -% General permission for non-profit use is granted. -% For commercial use, contact the above address. -\patterns{% -.ab5b -.ab5l -.ab1r -.ana5c -.an3s6 -.at6h -.au2f1 -.au2s3 -.be3erb -.da6r1 -.einge3 -.en2t1 -.er5bl -.er6da -.er4d3r -.er1e -.er1i -.erwi3s -.es5c -.est5ri -.fal4sc -.fe2s -.fest3 -.for4t -.gan4 -.ge5na -.he2l -.he2r -.her3a -.herr3s -.in1 -.ingeni5 -.lab6b5r -.liie4 -.li3t -.mi2t1 -.nul4 -.or6a -.pa4s3te -.pf4 -.rap4s -.rau4m -.ro6str -.sch6 -.see1 -.spor4 -.ta5la -.tal4g -.ta6to -.tisch3 -.tor4f3 -.tu1s -.um5 -.un5sc -.ur1 -.vol4l3 -.wah4l3 -.wohl3e -.wun4s -.zi2e -aa2gr -aa3ru -aat4s3 -a5au -1abd -ab5eb -ab5eis -a4bend. -ab5erk -1abf -3abg -1abko -a1bl -5a6bon -ab1re -ab1ru -1abs -abs2p -ab3sz -3abtei -ab5ur -1abw -1abz -4ach. -ach1a -a1che -a6chent -a1chi -ach1l -ach3m -a1cho -a1chu -ach1w -a1d -a4d3ac -ade4n -2adi -adi3en -1adj -1adl -ad5ri -ad6t5 -5adv -a3e1 -ae4d -af1an -a5far -a6fent -af3ers -3afri -a4g3ei -age4n -age2s -ag1l -a1g2n -ag1re -a6gri -ag5rie -a1ha -a1he -a6h5erh -a1hi -ahl1a -ah1le -ah6ner -ah5o -ah1re -ah5ri -ah1ru -ai1e -a5ind -ai1sc -a3isch. -a5iv. -a1j -2a1ke -a5ki -5akk -ak5n -3aktu -a6kus -a3lag -a3lak -ala6n -a5lang -al3ans -al1au -al6bl -al1c -al6der -ald5r -2a1le -a4l3e4b -al5ein -a6l5eng -a6l5ins -al4lar -a1lo -alo6p -1alph -al2tr -al5tra -a1lu6 -al5um -al5ute -3a2mei -am2sc -am2ta -a1mu -3analy -a2n1au -and5arm -ande4s -an2d3r -1anfa -3anfer -3angab -an6go -6ani -ani6o -an5ion. -an2k1r -1anl -5anm -anma3c -an1om -3a2n1or -an5sd -1anst -1antr -1anw -3anzug -an6z5w -a1o -a1pa -3apfel -a1pi -3appa -a1pr -a1ra -a2r1al -a2r1au -3arbei -6arben -1ar1c -ar6da -ar6dr -a1re2 -a6rei -ar6fr -2a1ri -ar2na -a1ro -a6r5o6d -a6r5or -ar6p5f -6arrt -ar6schm -ar6tau -3artig. -a5r6tio -ar6t5ram -1arzt -1a2sia -asi2s -aso3 -as5pa -a6stes -a6st5re -a1ta -at5eig -a1th -athe5 -at5her -1athl -2a1ti -1atm -a1to -at5ort -a1t6r -at6s5e -atz1a -au3a -aude6r5 -au6dr -au2fa -au6f5enl -1aufg -5auf1l -1aufn -auf1t -au6ga -3auge. -aum5p -aun2e -1ausb -1ausf -1ausg -au4s3tr -3ausz -1auto -auwei6 -a1v -a1w -a1x -a4xio -a1z -1ba -2b1ab -b1ac -6b5af -ba6k -bak5i -bak5r -ba1la -2b1am -ba1na -b3arb -ba1ru -2b1b -b2bli -bbu6 -6b1c -4b1d -5bdg -1be -be1a -be1ch -be3en -be3erd -be1g -bei5b -4b3eigen -be5inh -bei3s -be1na -ben3d4w -be1ra -be5r6e -be1ur -4b1f6 -2b1g -2b1h -1bi -bi5on -bi6stu -4b1j -2b1k -2b1lag -b5lam -b5lein -4blich -6blich. -b4lie -b4lind -1b2lio -b4lit -4b1m -bma3c -2b1n -1bo -bo1ra -bo1re -6b1p -6braa -6brecht -3bri -5brie -bro1 -bro4n -2b1s -b5sc -b6sn -b6sof -bs6t1h -bs5tol -bs2zi -2b1t -b2t1h -1bu -5buch. -6b1v -2b1w -1by -6b5z -5ca -1ce -2ch. -ch1ah -3chari -2chei -ch3eil -ch5eis -chi5er. -6chj -ch3ler -4ch2m -chn2 -5chn. -ch2na -ch5orc -chr6 -ch5rt -2cht -6chuh -chut2 -5ci -6c2k -ck1a -ck1ei -ck5l -ck3n -ck5sp -1co -co6u -c3t -cti6 -1cu -6d5abr -6dabt -1dac -d5achs -da5la -da6lu -3damp -da5na -2danl -danla4 -6danzu -6d1ap -da2r5a6 -6d1arb -1dat -4d1aus -2d1b -2d1d -1de -de1a -de6be -de1ch -2d1ein -de6lau -de6lo -den5a -den3g -der3ab -der3an -de5re. -6d5erhi -6derneu -de3r4o -de2s1a -de4sin -6d5eul -2d1f -2d1g -2d1h -1di -di1na -6dinf -6d5inn -di5ot -di1sc -di3s4pe -di4str -di6ta -2d1j -2d1k -2d1l -2d1m -2d1n6 -1do -d2on -6dord -2d1p -6dq -dr2 -4drad -1drah -d1rec -d1ren -6d5rh -1dro -d6roh -6d5rot -1dru -2ds -d6san -dsanga6 -d1sc -d1sp -2dt -d5ti -d5to -d1tr -1du -2d1uh -6d5umk -durch3 -6d5urt -2d1v -2d1w -dwa6r -dy1 -2d1z -e1ac -ea4gent -e1ah -e1ak -e1al. -e5alg -e3als -e1am -e1an -e4ano -e1ar. -e5arb -e3arf -e3arm -eatu6 -e1b -eb6ac -e4b3ar -eb6rie -eb2se -eb2sk -e1che -e1chi -e1cho -ech6s5en -e1chu -ecke4 -e1d -ede4re -ee5a -ee5e -e1ei -eei6g -e5em. -ee5ro -ee6tat -eeu6 -e1e2x1 -e1f -efek4 -efe3ra -ef2fl -ef3ta -e6fum -ege6sp -eg1lo -eg3lu -eg3s4t -e1ha -eh1ap -e1he -ehe3ra -e1hi -eh1le -ehl6er -2ehm -eh1mu -e1ho -ehr1a -eh1re -eh1ri -ehr4s -eh1ru -eh5s -e1hu -eh1w -e1hy -ei1a -ei6ba -ei4chi -ei1e -1eign -6eil. -ei5le -1eina -ein1g -3einhal -ein5k -3einlag -3einn -ei2n1o -3eintei -ei5p -eipf6 -e1irr -ei4str -ei2t3a -eit1h -ei6t5um -e1j -e1ke -e1ki -e1k2l -e1kn -ekte4 -e1la -el3al -e4l1ar -el5aus -e1le -el1ec -el5ein -el3eisen -1elek -3elem -4elem. -ele6n -elf4 -5elf. -elg2 -e1lo -el6s5o -3eltern -elt3h -e1lu -el1um -6emi -1emp1f -e1mu -en3achs -en1am -e2n1ar -en3a6s -en5auf -en6d5ess -e4nein -en5eis -e6nel -e6n5end -3energi -en3ers -en4men -en4san -ensen6 -en5spa -6enst -3entf -3entla -3entsp -1entw -enwi2 -e1o2b -e2om -e5or. -eo5re -eor4h -e5ort -2ep -e1pa -e1pf2 -ep6p3a -e1pr -ep5to -e1q -er1ac -er5alb -er5amt -e3rand -er3ans -er5a6si -e1rat -e3raum -er3aus -er4bli -3erbs -er1c -5erdb -2e1re -er3eck -ere2h -3ereig -e4r3ein -ere2k -e5rem -er3ero -er3ers -ere2s -er3ess -2e1ri -e3rif -er3ins -e3rit -5erneu -e1ro. -er3ob -e6rof -e3rog -e1rol -er1or -ero5s -3ersatz -er5sc -ersch4 -er2th -e5rtn -2e1ru -er5uhr -er1um -e1s -esa6 -6esc -esch4l -6esi -esi3g2 -es3int -e2sk -es2ko -es5op -es2pu -e6stin -es6tr -est5ro -e1ta -e1ti -1etn -e1to -e1tr -et2t3a -et4tr -etu1s -e6ty -6etz -eu6ga -euge6n -euk2 -e3um. -eun2e -e5unt -e5us. -eu6zw -e1v -e1w -ewa1s -ewi2s -ex3a4m -5exp -e1z -fa1b -5fah -fai5 -fan5d -fa1sc -2f1b2 -4f3c -4f1d -1fe -6f5eb -fe6be -6f5eins -fe2l5a -fe6lo -fe2mi -6femp -fen5ei -2f1f -ffe5i -ff5ing -f6flo -ff2sp -2f3g2 -fge1 -fgewen4 -2f1h -1fi -fi1na -2f1k -f5leb -6f5lein -2f1m -2f1n -1fo -foh1 -f4on -2f1op -fo1re -fort5r -fo5ru -2f1p -f1q -fr4 -f6re. -f5reic -f5reis -f1ric -f5rig -1fris -2f1s -f2sk -f2sn -fspu6 -2ft -ft5ak -f6tent -ft1h -f1ti -f1tr -ft4su -ftwa6r -1fu -6f1v -2f1w -f1z -1ga -6gabz -ga6d -ga1la -gang3a -6ganl -2g1arm -g3arti -2g1b -4gd -g5da -3ge -ge1a -ge1e -6g5eff -gef2l -ge1g2l -ge4ig -ge1na -genlini6 -ge1o -ge1ra -ge1ro -ges2p -ge1ur -2g1f -2g1g -gge6bu -gg1le -2g1h -1gi -2g1k -g5leb -3gleic -g3lein -3glem -g1ler -6g5leu -g2lie -6g1los -g6ly -2g1m -g1n -6gn. -g6nin -1go -6gob -2gog -g2on -go1r -got6 -gott5 -2g1p -1gr6 -g3reic -gri2e -6groh -2gs -gsa4g -g6s1ak -g4s1an -gsan6zu -g5sat -gs1au4 -g1s6c -g2s1e -g5seil -g5set -g2s1i -g2s1o -g2s1p -g5s6pi -gs3tak -g2s3tr -g2s1u -2g1t -g2t1h -1gu -gu5a -gu2e -gu2i -6g5und -gung6 -gu2t1 -2g1v -2g1w -5g6wes -2g1z -ha5be -ha6bei -haf6e -haft4s -ha5la -hal4b3r -2hap -h6ari -h5arm. -h3arme -har6th -haufga6 -h1b -h1c -h1d -6hea -he2bl -h3echt -he6fa -h5e6he. -6helt -1hemm -h1emp -he6ni -hen4ru -hen4sta -hen6wa -6heo1 -her5bl -he5rin -her4zw -heu3s -he3xa -h1f6 -h1g -h1h -hil4fr -h3ins -h1k -hkon6z -hlaf3r -hl5anz -h1le. -h6l5ein -hl3erh -h1les -h2lif -h2lit -6hm -h2ma -h3man -h2mi -h2mo -h5nam -h2nei -hn3ein -h2nel -h6n5id -h2nip -h2nit -h2nor -h2nul -ho5be -hoch1 -hoh1l -h2on -ho1re -ho3sl -ho4s3p -h1p -h1q -h3rech -h5ref -hren6s -h1ric -h3ros -hr5st -hr6ste -hr2th -h1s -h6s5ac -hs5amt -h2san -h6sau -h6sein -h2sk -h6spu -hs5tau -hs5tie -h4s3tu -2ht -ht5ac -ht3ar -hte6b -h2t1ec -ht1e2h -h4temp -h6t5ers -ht1h -h1ti -h6tin -h3tra -ht5re -h5tro -ht6so -ht6spa -hub3l -hu6f5 -huh3 -hu6ha -h5uhr -hu2la -2husi -h1v -hwi2d1 -h1z -i1al. -i5ala -i1alb -i1ald -i5alet -i1alf -i1alk -i3all -i3alp -i1als -i3alv -i5alz -i1an -i1a6r -i1asm -i5ast. -i1at. -i6b5eis -ibe6s -i1br -ib5ren -i6b5unt -ich1a -i1che -i1chi -ich3l -ich3m -ich4sa -icht3an -i1chu -ich1w -i1d -i2dea -i6d5ei -ide5ri -id5ru -idu5a -ie2bl -ie6b5re -ieder3e -ie3e -ie6felt -ief3f6 -ie2f5l -ie6fr -iege4r3e -ie6lei -ie4lek -i1ell -ielo6b -ie2lu -i1en. -i5ens. -i5env -i1enz -ie3o -ier3a2 -ie6r5in -ie6s5c -ie6ta -ie6t5ert -iet5h -2if -i1fa -if5an -if1l -if1r -i5f6ro -i1g -ig3art -i6g5ei -i2gl -ig3le -i2gn -ig6r -i5ha -i1he -i5hi -ih1n -i1hu -i6h5um -ih1w -6i1i2 -i1j -i1k -i1la -i6lans -ild5ent -i1le -ile6h -il5ehe -i6lel -il2fl -ilf4s -illu5s -il2m5a6 -i1lo -i1lu -il6z5i -i6mel -i6m5id -im4man -i1mu -in3arb -in1au -6ind. -i6n5eh -i2n1ei -i6n5erl -i6n5erw -3infek -inge6bir -3inhab -5inj -in6pu -ins5ert -in5spe -3instr -io1c -i1o2d -i5ol. -i3om. -ion6 -i1ons1 -i1or -i5os. -i5ox -i1pa -i1pi -i1pr -i1ra -i1re -i1ri -ir2k5l -i5rol -is5amt -i6scheh -ischen4 -isch3la -isch3r -i5stra -ist3re -i1ta -i5t6ak -it5ein -it1hi -i1ti -i4tia -i6t5in -i1to -it5raf -it3rau -it1re -i1tri -it4t3r -itu3al -i1u -i1v -i1w -i1z -i6za -1ja -je2t1 -jo3r4a -1ju -ju5t -1ka -kaf5 -ka1la -ka1na -2kanl -6kapf -k5arm -ka3ru -kauf4s -4k3aus -kau5t6 -2k1b -6k1d -kehrs3 -6k5eic -2k1eig -ke6lo -ken6sta -ke1ra -6kerd -4k1f -4k1g -kgela6 -2k1h -ki1c -kie6l5 -k5im -ki5o -ki6r -kit2s -4kiz -2k1k -kl6 -1kla -k3leit -2k1ler -2klic -k2lin -kli1s -kloi6 -4klung. -2k1m -k2n2 -kni4e -1k2o -ko1i -kol3l -ko3o4 -6kop. -kop6f1 -ko1r6a -kor6der -6k5ox -2k1p6 -1kr -6krad -2k1rec -2ks -k1sc -k6so -2k1t -k6tau -k2t1h -1ku -ku1c -2k1uh5 -kuie5re -kun6s -kunst3 -6kunt -ku3ta -6k1v -6k1w -2k1z -lach5r -5lack. -1lad -lade3 -6ladv -laf5l -laf3t -la2g1a -4lal -l3amt -la1na -1land -lap6pl -l1arb -la5ru -la1sc -la6s5p -la6sta -6latm -6laug -6lav -l1b -l6b5e6b -lb2s -lbst1 -6lc -l1che -l1chi -6ld -ld5a6n -l6d5eb -ld1re -ld5rom -le4b3ri -2lec -5led -3lef -4l3eff -1leh -6lehe -lei6br -lei4fa -4leisen -2lem6e -6lemp -4lentw -5lepa -le4rer -l3erg -5leri -2l1err -4l1erz -le3sk -6l5eth -l1f -lfo6 -lf5ra -l1g -l6g5au -6l1h -1li -2lick -li1en -3lig -li5gn -2lim -li1na -li5ne -4l3inh -6linj -6linz -6lish -2lix -l1j -l1k -lk5erd -lk2l -lk2s3 -l1la -l5lad -l1le -ll5eis -l3li -l1lo -l2l1or -ll5ov -ll4spr -ll5th -l1lu -6l1m -l4m3o4d -l5na -l5o4bl -6lock -l5ohr -l2on -2l1ord -lo1re -lo5ro -1los. -3lose -lo6s5tr -6lou -lo6ve -l1p -lp2f2 -l2pt -l1q -l1r -l1s -l2s1er -l2sk -ls2p -2l1t -lt5amp -ltanla6 -lt3ans -l5te -l6t3ein -l2th -lt5ho -lt1re -lt5um -5luf -luft3a -1lun -lung4 -3lung. -6l5uni -4l3unte -2l1urg -lu4st3r -lu5the -l1v -lve5ru -l1w -1ly -lz3ar -1ma -ma2dr -ma4gna -2m1ago -ma5la -mal3d -ma6lei -ma6lut -2m1ana -mani5e -4mappa -2m1arb -3m6as -ma1sc -mau1s -2m1b -mb6r -6m1d -1me -me1ch -3meld -me5nad -men6e -me6ni -6m5enth -4mentsp -m2er -me1ra -me1ro -mer5t -3mes -me1th -2m1f4 -mfan2 -2m1g -2m1h -1mi -mi3ak -6mibe -3mig -mi5gl -mi1na -mise1 -5mitt -2m1k -2m1l6 -6m1m -m6mab -m6m5ak -m2m1ei -mme4r5a -2m1n -1m2o -mo6dr -mo2o -mo1ra -mo6st5 -m1pa -m1pi -m5pr -m1q -6m1r -2m1s -m6san -m5sche -msch4l -ms6k -2m1t -m5tam -mt1ar -m2t1h -1mun -mu1sc -5musi -mu1ta -2m1v -2m1w -my5a -2m1z -1na. -6n1ab -na2c -nach5e -nacht4s3t -na6der -1nadi -1n2ag -na5gl -1nah -1nai -1nal. -5nale -n3alt -6n5amt -4n1an. -n1and -2n1ang -6n5anr -n3anzu -n4ar. -2narc -n1arm -5n6ars -4n3art -1nat -5nat. -3nate -2natm -4nauf -n5auss -n3aust -1nav -n1b2 -n1c -nch3m -n1d -nda5ru -nde4lan -nde4s3e -n2dot -nd1ta -1ne -ne2bl -6n5ebn -2nec -n3eck. -2nee -3neei -ne2h -4neif -6neis -n2en. -n2ens -nen4tr -ne6p -n2er. -ne1ra -2n1erb -4n3erd -nerfor4 -4nerg -n3ergi -n2erh -n1erk -n1err -n2ert -6n5ertr -4n3erz -6n5ess -6n5e6tu -n1f -n5fa -nf2l -6ng -n4g3ac -ng1lo -ng6na -ng2sa -n1h -5n6he. -n5hie -nho6s -1ni -ni5ak -ni1al -ni1b -ni4d -nie4d3r -ni1el -ni1en -4n3i4gel -4n1imp -2n1ind -n6ing -n3ins -ni3ol -nir2s -n1j -n6ji -n1ke -n1ki -n1kle -n6klo -n1kn -n3l -n5lan -n6lande -nli2m -n1m -nmen2 -nmo1 -n1na -n6nau -nni1s -nn5sp -nn4tak -n5nu -1no -no5be -no1c -n5o6d -no6ke -6n5o6le -no2ma -n4on -no3ny -nor2a -n3ort -no6t5a -n1p2 -npa2t -n1q -n1r -nsa2b -n2s1ak -n6s5alt -ns3ang -n1sc -n5sche -n4schli -ns6de -n6self -n6s5ent -nsi3g4 -nsi4ons -ns3par -ns5tat. -n6stor -6nt -n1ta -n5te. -nt1eh -n3t4en -nte3na -nten4ar -nter3a -n6t5ess -nt5hie -nt1ho -n1ti -nti2d -n1to -n6t5o6d -n1tr -nt5rin -n5trop -nt1s -nt5sa -ntu1a -nt1z -1nu -2nuc -2nud -4n3uh -n3ums -n5umw -nung4 -2n1unt -2nup -2nur -nu6si -n6ut -nu5ta -n1v -n5w -nwid3r -nwi5sc -nwoh3l -n1z -n6zar -nzi4ga -o1a -oa2l -oa6m -oa6x -ob6ab -o4ber -1obj -o1bl -ob5la -ob5li -ob1r -1obs6 -ob6sta -o1che -o3chu -o1d -od5ele -od5ru -o5e6b -o1ef -o1e2l -o5er -o5e6x -o1fa1 -1o4fen -of6fin -3offiz -of2fl -of6f5r -o5fl -4o1g -o5g6h -og2n -o5ha -o1he -o1hi -ohl1a -oh3len -o1ho -oh1re -oh5ru -o1hu -oh3w -o5hy -o1id. -o5ism -o1j -o1k -o6kula -6okult -o1la -o1le -ole1r -ol6fr -ol4gl -olk5r -ol2la -ol6lei -o1lo -o1lu -o2m1ab -om6an -o6m5au -o6mene -o6m5erz -o1mu -1on. -o1na -on5a6m -o4n3arb -on5g6 -o6n5ok -6onsmel -6onsn -6onspr -o1of -o5on -o1or -o1pa -o6pau -oper6 -opf5l -o1pi -op2p3l -o1pr -1opt -or1a -or2al -o3r4ant -or4as -o3r2at -1ordn -o6r1ei -o3ren. -1orga -or2gl -o1ri -or1or -or6t5au -o1s2k -os2lo -o4sta -oste6r5 -o1ta -ot6e -otem5 -otemp6 -o5t6h -o1ti -o1to -ot1r -ot6ro -ot2tr -ou5i -o1un -3ou5t -o1v -o1w -o1x -o1z6 -4pab -pa5g6 -p6ak -pa3la -pa6no -1pap -pa4r3af -6parg -3partei -pau1 -p1b -p3c -1pe -pe5ep -2pek -pen5k -pe1ra -pere4 -pe4re. -2perr -pfa6 -pf5ade -pf3as -p4ferd -pf5t -1ph -2ph. -p5han -6phb -4p3hei -6pht -6phz -pie6la -pi1en -5pil -pi1s -pis4k -p1k -1pl6 -4p3ler -p2li -2plig -2p3lu -p1m -p1n -1p4o -po1ch -3pol -po1ra -po1re -p1pa -ppe4n1 -pp3f -p6p5ha -p1pi -p1pr -pp1s -5prei -5pres -3prod -5prog -ps5er -p1t -pt1ac -pteu6 -p2to -pt5ro -1pu -pu1b2 -puf6fr -6p5uh -2pur -pu6rei -pu1ta -p5v -6p5w -5py5 -p1z -1qu2 -6rabd -r1abt -1rad -ra4dan -6radd -ra4dr -raf1a -ra4fer -1rahm -r5ahn -ra4l5o -r4anb -r2and -r6ane -r5angr -r3anzu -3rape -1rapi -2r1ar -3rar. -rar2s -r6at. -ra6ta -ra6the -6r1auf -6r3aug -r1b -r1che -rch1l -6r1d -rd5erge -1re. -re3alt -re6b5l -5recht -2reck -re1e -3regi -4reig -6r5eime -rei6sa -reli3ef -6remp -re1pi -6repp -1rer -5r6er. -6rerb -6r5erd -6r5erf -r3erla -r4ersei -6r5erzi -5res. -2ress -r1e2w -6r5e6x -r1f -rf4lie -r1g -rge4bl -r4gn -r1h -rhe6ber. -ri5alg -ri1el -ri1en -ri3er. -ri6fa -riie6 -6r5inb -2r3ind -r4inde -1rinn -4rins -2r1ir -ri1sc -ri5sko -r2it -ri6tal -rizi5 -r1j -r1k -rkau6e -rk6lo -r1l -r1m -rmen4s -r1na -rn5ade -rna6r -rn5ari -rn3eif -r6nene -rn6er -rn3g -rn1k -r6n5or -ro5ba -ro1ch -1rohr -ro5i6 -r2on -ro1re -ro1sp -rovisi6 -r1p2 -r6p5an -rpf2 -rpro6g5n -r4p5t -r5pu -rpum6 -r1q -4rr -r5r6a -r5re -rres2 -r1ri -r1ro -r3ru -6r1s -r6sanf -r3sche -rschri6 -rs2k -r6sku -rs2n -rs2p -rswi3 -rswid4 -r1t -rt3ac -r2t1ar -r6t5erl -r6t5erm -rt1he -r2t1hi -rt4so -rt6s5ti -1ruf -2rum -6rundz -r6ung. -6r1unt -6r1u4r3 -ru1ta -r1v -r1w -ry2 -r1z -rz5ac -r6zad -r6z1ar -r2z1em -1sa -2s1ab -sab5l -s3a4der -sa1fa -sa3fl -sa3fr -sa5ik -sa1la -2s1alp -5sam. -5samk -s3anb -san2c -s6ann -2s1ap -2s1ar -3s4ar. -2s1atl -4s1aus -2s1b -2sch. -2schb -1sche -4schec -schen4b -schen4h -schen4z -2schf -4schh -1schi -2schk -sch6ne -3schof -6schp -3schri -2schs -2scht -sch5ta -5schu -6schv -2s1d -1se -se5ag -6s5ec -se4e -see5i -se6h5a -6s1eig -5s6eit -4selem -sen6e -6sersa -se5ru -se6ruh -ser6um -s1erz -2s1ex -2s1f -2s1g2 -2s1h -1si -si1b -si1en -4s3inte -si5ru -si1sc -s1j -s1k -6sk. -3skiz -s5ku -2s1l -5slav -s5li -2s1m -s1n -1so -s2on -s1ord -so1re -4sorga -sp2 -1spal -spani5e -6spap -s2pei -1spek -s2pez -s1pf2 -1spi -6spil -2s3pla -1spr -s5ps -s6pul -1spur -s1q -2s1r4 -2s5s2 -ssag6 -ssali6 -ssen6st -1s2t -2st. -st2ab -4staf -2stag -2stak -st5anb -4stanf -st3ans -4starbei -4staus -2stb -2std -ste6g5 -st4ei -ste6ne -ste5re -6sterm -6st3eur -6s5tex -2stf -2stg -2sth -st3ho -6stj -2stk -2stl -2stm -6stn -2stp -6stref -6strun -2st1s -5s6tub -5s6tun -2stv -2stw -4stz -1su -su6b3 -such4s -2s1v -2s1w -swi2d1 -1sy -2s1z -szula6 -ta4bla -2tac -3tafe -3t4ag -ta2g1a -ta6ka -6tamp -t1amt -tan6c -t5anf -tan6k5l -4tanl -6tanw -4tarb -t3arbe -t1arm -ta1sc -ta6sto -3taube. -2t1b2 -tbi6b5 -2t1c -2t1d -1te -te2a -5techn -2teh -teh5l -4teif -3teil -tei4l3a -4teinh -6t1eis -te6lau -te6lo -ten1a -ten5g -te2ni -ten3s6p -te6nu -te3ral -te4ren -te5ren. -te6r5it -3term -t5e6se -3test -te6sto -te6str -te5th -te3xa -2t1f2 -2t1g2 -6th. -2t1ha -t1heb -2t1hei -3theo -1thes -thi1s -2th1l -th3m -1thr -3thus -2t1id -ti1en -tik6 -t3ind -ti6q -ti5tr -t1j -2t1k -2t5l6 -tle4digt -tlo4b -2t1m -2t5n -to5be -to1ch -tode2 -to6del -to4d3er -toh1 -toi6r -t2on -to1ra -t1ord -to1re -5tou -2t1p -tpf2 -tr4a -6trad -3trag -tra1s -4trec -t3rech -5t6ree -5t6ref -6treg -t5reih -t5rep -3t4ret -3trib -t6rie -5trieb -5t6rigk -tri4o3 -t6rop -t3rot. -2trs -5trun -2ts -t2s1an -t2s1au -t1sc -t5sche -ts3ort -t1spa -ts3th -ts3un -t2s1ur -2t1t -t5ta. -tt5ab -tt3eif -t5t6ra -tt1re -t6tro -tt5ru -1tu -6tuh -tul4p -5tum. -tun6f -6t1unt -tu4ran -tur2m3 -2t1v -2t1w -1ty -2tz -tz1an -t6zent -tz6th -tz5wi -u6ale -u1ar. -u1br -ubs2k -6uc -uch3a -u1che -u1chi -uch1l -uch1r -u1chu -uch1w -u1d -udi3en -u6d5on -u1e -ue2n -uen1e -uer1a -u1fa -u6f3ent -uff2l -uf1la -uf1re -u1g -u6gabt -ug5am -ug2gl -u2gl -u2gn -u1ha -u1he -u1hi -u1ho -uh1re -u1ie2 -ui5em -u1ig -u3in. -u1j -u1ke -u1kl -ukle5i -u1kn -u1la -u1le -ul6lo -u1lo -ulo6i -ul6sa -u1lu -um5ak -1uml -3umschl -u1mu -u1n1a -un6al -un4d3ar -5undz -un1e -une2b -une6d -3unfal -un1gl -un5gn -un2g3r -ungs1 -ungs3ta -un1in -u4nion -un1kl -un1o -1unr -un1s2p -3unterr -u5n1u -unvol4 -unvoll3 -u1or -u5os. -u1pa -upe6 -uper3 -up6fi -u1pi -u1pr -up2ta -up6tr -up4tur -u1ra -ura6d -ur6an. -u1re -ur5eis -u1ri -1url -ur6nan -u1ro -3ursa -u1ru -ur2za -ur2z1w -usch3w -us5im -us3tau -ute5re -ut5h -ut6her -u1ti -u1to -u1tr -ut4schl -ut6s5t -u1u -u1v -u1w -u1z -va6t5a -va6tei -ve2r1 -vera6 -ver5b2 -vere2 -ve2sp -vete3 -2v1g -vi4el -vi5et -vi6la -vi3ro -vi1ru -v2o -vol4k -vo6n -vor5a -vor1c -vo4r1e -2v1t -wa4g3n -1wald -wan6dar -war5u -war2z5 -1was -w6e -wede5r -we6fl -we6ga -we6g5eng -we6g5es -weg1l -we2g3r -weib4s -1weis -wei5sc -wel4t -welt3a -welt3r -we4ra -werbe3 -werbes4 -wer6bl -wer4fl -wer6ga -wer4ka -wer4kl -wer6ta -we2sp -we6str -1wid -wil6den -wil6dr -win4d3r -wi1sc -wi6schl -wi6schn -wo1c -wo3ren -wo6r5i -wor5u -wu1s -wu2t1 -4w3w -x1ak -6x5amt -x5and -xan5t -1xe -x1emp -x5erz -6x1h -1xi -xi5c -xich6 -x1k -x6o -x1p2 -6x1t -x6ta -xti6 -1xu -6xy -x1z -y5al. -y1c -y1d -y1e6 -y1g -y5i -y1k2 -yklo3 -y1l -ym1 -yna5 -yn5e -yn1t -y5om -y1p -ype4 -yper3 -y6ps -y2p3t -y1r -yr5r6 -y1s -y6te -y1t6h -y1ti -y1z -6z5ab -z3a4der -1zah -z5al -6z5am -zanla6 -z1arb -zausga6 -2z1b -6z5c -6zd -1ze -zei6t5er -ze5m6e -zen3a -zen6za -ze5ra -zerhau6 -2z1f -2z1g -2z1h -1zi -zi3alg -zi5alr -zi5cho -zi1en -z3imp -6z5inf -6zinh -zinha6 -zin6ser -zi1sc -zi3th -zi3tr -2z1k -2z1l -2z1m -4z1n -5zo -zo5f -zo6gl -zo5re -zor4na -2z1p -2z1r -2z1s6 -2z1t -z4t3end -zte5r -zt5hi -1zu -zu1a -zu1b2 -zuch4 -zucht3 -zu1f2 -zu5i -zun2a -zun2e -6zunt -zu3o -zu1s -zu1t -2z1v -3zwan -2z1wer -zwer6k5 -z3wo -zy5 -2z5z6} -\endinput +% These are optimized german hyphenation patterns for use with TeX
+% generated at
+% Rechenzentrum Ruhr-Universitaet Bochum
+% Universitaetsstrasse 150
+% D-4630 Bochum 1
+% as of 1986-11-01.
+% Copyright Rechenzentrum der Ruhr-Universitaet Bochum 1986
+% General permission for non-profit use is granted.
+% For commercial use, contact the above address.
+\patterns{%
+.ab5b
+.ab5l
+.ab1r
+.ana5c
+.an3s6
+.at6h
+.au2f1
+.au2s3
+.be3erb
+.da6r1
+.einge3
+.en2t1
+.er5bl
+.er6da
+.er4d3r
+.er1e
+.er1i
+.erwi3s
+.es5c
+.est5ri
+.fal4sc
+.fe2s
+.fest3
+.for4t
+.gan4
+.ge5na
+.he2l
+.he2r
+.her3a
+.herr3s
+.in1
+.ingeni5
+.lab6b5r
+.liie4
+.li3t
+.mi2t1
+.nul4
+.or6a
+.pa4s3te
+.pf4
+.rap4s
+.rau4m
+.ro6str
+.sch6
+.see1
+.spor4
+.ta5la
+.tal4g
+.ta6to
+.tisch3
+.tor4f3
+.tu1s
+.um5
+.un5sc
+.ur1
+.vol4l3
+.wah4l3
+.wohl3e
+.wun4s
+.zi2e
+aa2gr
+aa3ru
+aat4s3
+a5au
+1abd
+ab5eb
+ab5eis
+a4bend.
+ab5erk
+1abf
+3abg
+1abko
+a1bl
+5a6bon
+ab1re
+ab1ru
+1abs
+abs2p
+ab3sz
+3abtei
+ab5ur
+1abw
+1abz
+4ach.
+ach1a
+a1che
+a6chent
+a1chi
+ach1l
+ach3m
+a1cho
+a1chu
+ach1w
+a1d
+a4d3ac
+ade4n
+2adi
+adi3en
+1adj
+1adl
+ad5ri
+ad6t5
+5adv
+a3e1
+ae4d
+af1an
+a5far
+a6fent
+af3ers
+3afri
+a4g3ei
+age4n
+age2s
+ag1l
+a1g2n
+ag1re
+a6gri
+ag5rie
+a1ha
+a1he
+a6h5erh
+a1hi
+ahl1a
+ah1le
+ah6ner
+ah5o
+ah1re
+ah5ri
+ah1ru
+ai1e
+a5ind
+ai1sc
+a3isch.
+a5iv.
+a1j
+2a1ke
+a5ki
+5akk
+ak5n
+3aktu
+a6kus
+a3lag
+a3lak
+ala6n
+a5lang
+al3ans
+al1au
+al6bl
+al1c
+al6der
+ald5r
+2a1le
+a4l3e4b
+al5ein
+a6l5eng
+a6l5ins
+al4lar
+a1lo
+alo6p
+1alph
+al2tr
+al5tra
+a1lu6
+al5um
+al5ute
+3a2mei
+am2sc
+am2ta
+a1mu
+3analy
+a2n1au
+and5arm
+ande4s
+an2d3r
+1anfa
+3anfer
+3angab
+an6go
+6ani
+ani6o
+an5ion.
+an2k1r
+1anl
+5anm
+anma3c
+an1om
+3a2n1or
+an5sd
+1anst
+1antr
+1anw
+3anzug
+an6z5w
+a1o
+a1pa
+3apfel
+a1pi
+3appa
+a1pr
+a1ra
+a2r1al
+a2r1au
+3arbei
+6arben
+1ar1c
+ar6da
+ar6dr
+a1re2
+a6rei
+ar6fr
+2a1ri
+ar2na
+a1ro
+a6r5o6d
+a6r5or
+ar6p5f
+6arrt
+ar6schm
+ar6tau
+3artig.
+a5r6tio
+ar6t5ram
+1arzt
+1a2sia
+asi2s
+aso3
+as5pa
+a6stes
+a6st5re
+a1ta
+at5eig
+a1th
+athe5
+at5her
+1athl
+2a1ti
+1atm
+a1to
+at5ort
+a1t6r
+at6s5e
+atz1a
+au3a
+aude6r5
+au6dr
+au2fa
+au6f5enl
+1aufg
+5auf1l
+1aufn
+auf1t
+au6ga
+3auge.
+aum5p
+aun2e
+1ausb
+1ausf
+1ausg
+au4s3tr
+3ausz
+1auto
+auwei6
+a1v
+a1w
+a1x
+a4xio
+a1z
+1ba
+2b1ab
+b1ac
+6b5af
+ba6k
+bak5i
+bak5r
+ba1la
+2b1am
+ba1na
+b3arb
+ba1ru
+2b1b
+b2bli
+bbu6
+6b1c
+4b1d
+5bdg
+1be
+be1a
+be1ch
+be3en
+be3erd
+be1g
+bei5b
+4b3eigen
+be5inh
+bei3s
+be1na
+ben3d4w
+be1ra
+be5r6e
+be1ur
+4b1f6
+2b1g
+2b1h
+1bi
+bi5on
+bi6stu
+4b1j
+2b1k
+2b1lag
+b5lam
+b5lein
+4blich
+6blich.
+b4lie
+b4lind
+1b2lio
+b4lit
+4b1m
+bma3c
+2b1n
+1bo
+bo1ra
+bo1re
+6b1p
+6braa
+6brecht
+3bri
+5brie
+bro1
+bro4n
+2b1s
+b5sc
+b6sn
+b6sof
+bs6t1h
+bs5tol
+bs2zi
+2b1t
+b2t1h
+1bu
+5buch.
+6b1v
+2b1w
+1by
+6b5z
+5ca
+1ce
+2ch.
+ch1ah
+3chari
+2chei
+ch3eil
+ch5eis
+chi5er.
+6chj
+ch3ler
+4ch2m
+chn2
+5chn.
+ch2na
+ch5orc
+chr6
+ch5rt
+2cht
+6chuh
+chut2
+5ci
+6c2k
+ck1a
+ck1ei
+ck5l
+ck3n
+ck5sp
+1co
+co6u
+c3t
+cti6
+1cu
+6d5abr
+6dabt
+1dac
+d5achs
+da5la
+da6lu
+3damp
+da5na
+2danl
+danla4
+6danzu
+6d1ap
+da2r5a6
+6d1arb
+1dat
+4d1aus
+2d1b
+2d1d
+1de
+de1a
+de6be
+de1ch
+2d1ein
+de6lau
+de6lo
+den5a
+den3g
+der3ab
+der3an
+de5re.
+6d5erhi
+6derneu
+de3r4o
+de2s1a
+de4sin
+6d5eul
+2d1f
+2d1g
+2d1h
+1di
+di1na
+6dinf
+6d5inn
+di5ot
+di1sc
+di3s4pe
+di4str
+di6ta
+2d1j
+2d1k
+2d1l
+2d1m
+2d1n6
+1do
+d2on
+6dord
+2d1p
+6dq
+dr2
+4drad
+1drah
+d1rec
+d1ren
+6d5rh
+1dro
+d6roh
+6d5rot
+1dru
+2ds
+d6san
+dsanga6
+d1sc
+d1sp
+2dt
+d5ti
+d5to
+d1tr
+1du
+2d1uh
+6d5umk
+durch3
+6d5urt
+2d1v
+2d1w
+dwa6r
+dy1
+2d1z
+e1ac
+ea4gent
+e1ah
+e1ak
+e1al.
+e5alg
+e3als
+e1am
+e1an
+e4ano
+e1ar.
+e5arb
+e3arf
+e3arm
+eatu6
+e1b
+eb6ac
+e4b3ar
+eb6rie
+eb2se
+eb2sk
+e1che
+e1chi
+e1cho
+ech6s5en
+e1chu
+ecke4
+e1d
+ede4re
+ee5a
+ee5e
+e1ei
+eei6g
+e5em.
+ee5ro
+ee6tat
+eeu6
+e1e2x1
+e1f
+efek4
+efe3ra
+ef2fl
+ef3ta
+e6fum
+ege6sp
+eg1lo
+eg3lu
+eg3s4t
+e1ha
+eh1ap
+e1he
+ehe3ra
+e1hi
+eh1le
+ehl6er
+2ehm
+eh1mu
+e1ho
+ehr1a
+eh1re
+eh1ri
+ehr4s
+eh1ru
+eh5s
+e1hu
+eh1w
+e1hy
+ei1a
+ei6ba
+ei4chi
+ei1e
+1eign
+6eil.
+ei5le
+1eina
+ein1g
+3einhal
+ein5k
+3einlag
+3einn
+ei2n1o
+3eintei
+ei5p
+eipf6
+e1irr
+ei4str
+ei2t3a
+eit1h
+ei6t5um
+e1j
+e1ke
+e1ki
+e1k2l
+e1kn
+ekte4
+e1la
+el3al
+e4l1ar
+el5aus
+e1le
+el1ec
+el5ein
+el3eisen
+1elek
+3elem
+4elem.
+ele6n
+elf4
+5elf.
+elg2
+e1lo
+el6s5o
+3eltern
+elt3h
+e1lu
+el1um
+6emi
+1emp1f
+e1mu
+en3achs
+en1am
+e2n1ar
+en3a6s
+en5auf
+en6d5ess
+e4nein
+en5eis
+e6nel
+e6n5end
+3energi
+en3ers
+en4men
+en4san
+ensen6
+en5spa
+6enst
+3entf
+3entla
+3entsp
+1entw
+enwi2
+e1o2b
+e2om
+e5or.
+eo5re
+eor4h
+e5ort
+2ep
+e1pa
+e1pf2
+ep6p3a
+e1pr
+ep5to
+e1q
+er1ac
+er5alb
+er5amt
+e3rand
+er3ans
+er5a6si
+e1rat
+e3raum
+er3aus
+er4bli
+3erbs
+er1c
+5erdb
+2e1re
+er3eck
+ere2h
+3ereig
+e4r3ein
+ere2k
+e5rem
+er3ero
+er3ers
+ere2s
+er3ess
+2e1ri
+e3rif
+er3ins
+e3rit
+5erneu
+e1ro.
+er3ob
+e6rof
+e3rog
+e1rol
+er1or
+ero5s
+3ersatz
+er5sc
+ersch4
+er2th
+e5rtn
+2e1ru
+er5uhr
+er1um
+e1s
+esa6
+6esc
+esch4l
+6esi
+esi3g2
+es3int
+e2sk
+es2ko
+es5op
+es2pu
+e6stin
+es6tr
+est5ro
+e1ta
+e1ti
+1etn
+e1to
+e1tr
+et2t3a
+et4tr
+etu1s
+e6ty
+6etz
+eu6ga
+euge6n
+euk2
+e3um.
+eun2e
+e5unt
+e5us.
+eu6zw
+e1v
+e1w
+ewa1s
+ewi2s
+ex3a4m
+5exp
+e1z
+fa1b
+5fah
+fai5
+fan5d
+fa1sc
+2f1b2
+4f3c
+4f1d
+1fe
+6f5eb
+fe6be
+6f5eins
+fe2l5a
+fe6lo
+fe2mi
+6femp
+fen5ei
+2f1f
+ffe5i
+ff5ing
+f6flo
+ff2sp
+2f3g2
+fge1
+fgewen4
+2f1h
+1fi
+fi1na
+2f1k
+f5leb
+6f5lein
+2f1m
+2f1n
+1fo
+foh1
+f4on
+2f1op
+fo1re
+fort5r
+fo5ru
+2f1p
+f1q
+fr4
+f6re.
+f5reic
+f5reis
+f1ric
+f5rig
+1fris
+2f1s
+f2sk
+f2sn
+fspu6
+2ft
+ft5ak
+f6tent
+ft1h
+f1ti
+f1tr
+ft4su
+ftwa6r
+1fu
+6f1v
+2f1w
+f1z
+1ga
+6gabz
+ga6d
+ga1la
+gang3a
+6ganl
+2g1arm
+g3arti
+2g1b
+4gd
+g5da
+3ge
+ge1a
+ge1e
+6g5eff
+gef2l
+ge1g2l
+ge4ig
+ge1na
+genlini6
+ge1o
+ge1ra
+ge1ro
+ges2p
+ge1ur
+2g1f
+2g1g
+gge6bu
+gg1le
+2g1h
+1gi
+2g1k
+g5leb
+3gleic
+g3lein
+3glem
+g1ler
+6g5leu
+g2lie
+6g1los
+g6ly
+2g1m
+g1n
+6gn.
+g6nin
+1go
+6gob
+2gog
+g2on
+go1r
+got6
+gott5
+2g1p
+1gr6
+g3reic
+gri2e
+6groh
+2gs
+gsa4g
+g6s1ak
+g4s1an
+gsan6zu
+g5sat
+gs1au4
+g1s6c
+g2s1e
+g5seil
+g5set
+g2s1i
+g2s1o
+g2s1p
+g5s6pi
+gs3tak
+g2s3tr
+g2s1u
+2g1t
+g2t1h
+1gu
+gu5a
+gu2e
+gu2i
+6g5und
+gung6
+gu2t1
+2g1v
+2g1w
+5g6wes
+2g1z
+ha5be
+ha6bei
+haf6e
+haft4s
+ha5la
+hal4b3r
+2hap
+h6ari
+h5arm.
+h3arme
+har6th
+haufga6
+h1b
+h1c
+h1d
+6hea
+he2bl
+h3echt
+he6fa
+h5e6he.
+6helt
+1hemm
+h1emp
+he6ni
+hen4ru
+hen4sta
+hen6wa
+6heo1
+her5bl
+he5rin
+her4zw
+heu3s
+he3xa
+h1f6
+h1g
+h1h
+hil4fr
+h3ins
+h1k
+hkon6z
+hlaf3r
+hl5anz
+h1le.
+h6l5ein
+hl3erh
+h1les
+h2lif
+h2lit
+6hm
+h2ma
+h3man
+h2mi
+h2mo
+h5nam
+h2nei
+hn3ein
+h2nel
+h6n5id
+h2nip
+h2nit
+h2nor
+h2nul
+ho5be
+hoch1
+hoh1l
+h2on
+ho1re
+ho3sl
+ho4s3p
+h1p
+h1q
+h3rech
+h5ref
+hren6s
+h1ric
+h3ros
+hr5st
+hr6ste
+hr2th
+h1s
+h6s5ac
+hs5amt
+h2san
+h6sau
+h6sein
+h2sk
+h6spu
+hs5tau
+hs5tie
+h4s3tu
+2ht
+ht5ac
+ht3ar
+hte6b
+h2t1ec
+ht1e2h
+h4temp
+h6t5ers
+ht1h
+h1ti
+h6tin
+h3tra
+ht5re
+h5tro
+ht6so
+ht6spa
+hub3l
+hu6f5
+huh3
+hu6ha
+h5uhr
+hu2la
+2husi
+h1v
+hwi2d1
+h1z
+i1al.
+i5ala
+i1alb
+i1ald
+i5alet
+i1alf
+i1alk
+i3all
+i3alp
+i1als
+i3alv
+i5alz
+i1an
+i1a6r
+i1asm
+i5ast.
+i1at.
+i6b5eis
+ibe6s
+i1br
+ib5ren
+i6b5unt
+ich1a
+i1che
+i1chi
+ich3l
+ich3m
+ich4sa
+icht3an
+i1chu
+ich1w
+i1d
+i2dea
+i6d5ei
+ide5ri
+id5ru
+idu5a
+ie2bl
+ie6b5re
+ieder3e
+ie3e
+ie6felt
+ief3f6
+ie2f5l
+ie6fr
+iege4r3e
+ie6lei
+ie4lek
+i1ell
+ielo6b
+ie2lu
+i1en.
+i5ens.
+i5env
+i1enz
+ie3o
+ier3a2
+ie6r5in
+ie6s5c
+ie6ta
+ie6t5ert
+iet5h
+2if
+i1fa
+if5an
+if1l
+if1r
+i5f6ro
+i1g
+ig3art
+i6g5ei
+i2gl
+ig3le
+i2gn
+ig6r
+i5ha
+i1he
+i5hi
+ih1n
+i1hu
+i6h5um
+ih1w
+6i1i2
+i1j
+i1k
+i1la
+i6lans
+ild5ent
+i1le
+ile6h
+il5ehe
+i6lel
+il2fl
+ilf4s
+illu5s
+il2m5a6
+i1lo
+i1lu
+il6z5i
+i6mel
+i6m5id
+im4man
+i1mu
+in3arb
+in1au
+6ind.
+i6n5eh
+i2n1ei
+i6n5erl
+i6n5erw
+3infek
+inge6bir
+3inhab
+5inj
+in6pu
+ins5ert
+in5spe
+3instr
+io1c
+i1o2d
+i5ol.
+i3om.
+ion6
+i1ons1
+i1or
+i5os.
+i5ox
+i1pa
+i1pi
+i1pr
+i1ra
+i1re
+i1ri
+ir2k5l
+i5rol
+is5amt
+i6scheh
+ischen4
+isch3la
+isch3r
+i5stra
+ist3re
+i1ta
+i5t6ak
+it5ein
+it1hi
+i1ti
+i4tia
+i6t5in
+i1to
+it5raf
+it3rau
+it1re
+i1tri
+it4t3r
+itu3al
+i1u
+i1v
+i1w
+i1z
+i6za
+1ja
+je2t1
+jo3r4a
+1ju
+ju5t
+1ka
+kaf5
+ka1la
+ka1na
+2kanl
+6kapf
+k5arm
+ka3ru
+kauf4s
+4k3aus
+kau5t6
+2k1b
+6k1d
+kehrs3
+6k5eic
+2k1eig
+ke6lo
+ken6sta
+ke1ra
+6kerd
+4k1f
+4k1g
+kgela6
+2k1h
+ki1c
+kie6l5
+k5im
+ki5o
+ki6r
+kit2s
+4kiz
+2k1k
+kl6
+1kla
+k3leit
+2k1ler
+2klic
+k2lin
+kli1s
+kloi6
+4klung.
+2k1m
+k2n2
+kni4e
+1k2o
+ko1i
+kol3l
+ko3o4
+6kop.
+kop6f1
+ko1r6a
+kor6der
+6k5ox
+2k1p6
+1kr
+6krad
+2k1rec
+2ks
+k1sc
+k6so
+2k1t
+k6tau
+k2t1h
+1ku
+ku1c
+2k1uh5
+kuie5re
+kun6s
+kunst3
+6kunt
+ku3ta
+6k1v
+6k1w
+2k1z
+lach5r
+5lack.
+1lad
+lade3
+6ladv
+laf5l
+laf3t
+la2g1a
+4lal
+l3amt
+la1na
+1land
+lap6pl
+l1arb
+la5ru
+la1sc
+la6s5p
+la6sta
+6latm
+6laug
+6lav
+l1b
+l6b5e6b
+lb2s
+lbst1
+6lc
+l1che
+l1chi
+6ld
+ld5a6n
+l6d5eb
+ld1re
+ld5rom
+le4b3ri
+2lec
+5led
+3lef
+4l3eff
+1leh
+6lehe
+lei6br
+lei4fa
+4leisen
+2lem6e
+6lemp
+4lentw
+5lepa
+le4rer
+l3erg
+5leri
+2l1err
+4l1erz
+le3sk
+6l5eth
+l1f
+lfo6
+lf5ra
+l1g
+l6g5au
+6l1h
+1li
+2lick
+li1en
+3lig
+li5gn
+2lim
+li1na
+li5ne
+4l3inh
+6linj
+6linz
+6lish
+2lix
+l1j
+l1k
+lk5erd
+lk2l
+lk2s3
+l1la
+l5lad
+l1le
+ll5eis
+l3li
+l1lo
+l2l1or
+ll5ov
+ll4spr
+ll5th
+l1lu
+6l1m
+l4m3o4d
+l5na
+l5o4bl
+6lock
+l5ohr
+l2on
+2l1ord
+lo1re
+lo5ro
+1los.
+3lose
+lo6s5tr
+6lou
+lo6ve
+l1p
+lp2f2
+l2pt
+l1q
+l1r
+l1s
+l2s1er
+l2sk
+ls2p
+2l1t
+lt5amp
+ltanla6
+lt3ans
+l5te
+l6t3ein
+l2th
+lt5ho
+lt1re
+lt5um
+5luf
+luft3a
+1lun
+lung4
+3lung.
+6l5uni
+4l3unte
+2l1urg
+lu4st3r
+lu5the
+l1v
+lve5ru
+l1w
+1ly
+lz3ar
+1ma
+ma2dr
+ma4gna
+2m1ago
+ma5la
+mal3d
+ma6lei
+ma6lut
+2m1ana
+mani5e
+4mappa
+2m1arb
+3m6as
+ma1sc
+mau1s
+2m1b
+mb6r
+6m1d
+1me
+me1ch
+3meld
+me5nad
+men6e
+me6ni
+6m5enth
+4mentsp
+m2er
+me1ra
+me1ro
+mer5t
+3mes
+me1th
+2m1f4
+mfan2
+2m1g
+2m1h
+1mi
+mi3ak
+6mibe
+3mig
+mi5gl
+mi1na
+mise1
+5mitt
+2m1k
+2m1l6
+6m1m
+m6mab
+m6m5ak
+m2m1ei
+mme4r5a
+2m1n
+1m2o
+mo6dr
+mo2o
+mo1ra
+mo6st5
+m1pa
+m1pi
+m5pr
+m1q
+6m1r
+2m1s
+m6san
+m5sche
+msch4l
+ms6k
+2m1t
+m5tam
+mt1ar
+m2t1h
+1mun
+mu1sc
+5musi
+mu1ta
+2m1v
+2m1w
+my5a
+2m1z
+1na.
+6n1ab
+na2c
+nach5e
+nacht4s3t
+na6der
+1nadi
+1n2ag
+na5gl
+1nah
+1nai
+1nal.
+5nale
+n3alt
+6n5amt
+4n1an.
+n1and
+2n1ang
+6n5anr
+n3anzu
+n4ar.
+2narc
+n1arm
+5n6ars
+4n3art
+1nat
+5nat.
+3nate
+2natm
+4nauf
+n5auss
+n3aust
+1nav
+n1b2
+n1c
+nch3m
+n1d
+nda5ru
+nde4lan
+nde4s3e
+n2dot
+nd1ta
+1ne
+ne2bl
+6n5ebn
+2nec
+n3eck.
+2nee
+3neei
+ne2h
+4neif
+6neis
+n2en.
+n2ens
+nen4tr
+ne6p
+n2er.
+ne1ra
+2n1erb
+4n3erd
+nerfor4
+4nerg
+n3ergi
+n2erh
+n1erk
+n1err
+n2ert
+6n5ertr
+4n3erz
+6n5ess
+6n5e6tu
+n1f
+n5fa
+nf2l
+6ng
+n4g3ac
+ng1lo
+ng6na
+ng2sa
+n1h
+5n6he.
+n5hie
+nho6s
+1ni
+ni5ak
+ni1al
+ni1b
+ni4d
+nie4d3r
+ni1el
+ni1en
+4n3i4gel
+4n1imp
+2n1ind
+n6ing
+n3ins
+ni3ol
+nir2s
+n1j
+n6ji
+n1ke
+n1ki
+n1kle
+n6klo
+n1kn
+n3l
+n5lan
+n6lande
+nli2m
+n1m
+nmen2
+nmo1
+n1na
+n6nau
+nni1s
+nn5sp
+nn4tak
+n5nu
+1no
+no5be
+no1c
+n5o6d
+no6ke
+6n5o6le
+no2ma
+n4on
+no3ny
+nor2a
+n3ort
+no6t5a
+n1p2
+npa2t
+n1q
+n1r
+nsa2b
+n2s1ak
+n6s5alt
+ns3ang
+n1sc
+n5sche
+n4schli
+ns6de
+n6self
+n6s5ent
+nsi3g4
+nsi4ons
+ns3par
+ns5tat.
+n6stor
+6nt
+n1ta
+n5te.
+nt1eh
+n3t4en
+nte3na
+nten4ar
+nter3a
+n6t5ess
+nt5hie
+nt1ho
+n1ti
+nti2d
+n1to
+n6t5o6d
+n1tr
+nt5rin
+n5trop
+nt1s
+nt5sa
+ntu1a
+nt1z
+1nu
+2nuc
+2nud
+4n3uh
+n3ums
+n5umw
+nung4
+2n1unt
+2nup
+2nur
+nu6si
+n6ut
+nu5ta
+n1v
+n5w
+nwid3r
+nwi5sc
+nwoh3l
+n1z
+n6zar
+nzi4ga
+o1a
+oa2l
+oa6m
+oa6x
+ob6ab
+o4ber
+1obj
+o1bl
+ob5la
+ob5li
+ob1r
+1obs6
+ob6sta
+o1che
+o3chu
+o1d
+od5ele
+od5ru
+o5e6b
+o1ef
+o1e2l
+o5er
+o5e6x
+o1fa1
+1o4fen
+of6fin
+3offiz
+of2fl
+of6f5r
+o5fl
+4o1g
+o5g6h
+og2n
+o5ha
+o1he
+o1hi
+ohl1a
+oh3len
+o1ho
+oh1re
+oh5ru
+o1hu
+oh3w
+o5hy
+o1id.
+o5ism
+o1j
+o1k
+o6kula
+6okult
+o1la
+o1le
+ole1r
+ol6fr
+ol4gl
+olk5r
+ol2la
+ol6lei
+o1lo
+o1lu
+o2m1ab
+om6an
+o6m5au
+o6mene
+o6m5erz
+o1mu
+1on.
+o1na
+on5a6m
+o4n3arb
+on5g6
+o6n5ok
+6onsmel
+6onsn
+6onspr
+o1of
+o5on
+o1or
+o1pa
+o6pau
+oper6
+opf5l
+o1pi
+op2p3l
+o1pr
+1opt
+or1a
+or2al
+o3r4ant
+or4as
+o3r2at
+1ordn
+o6r1ei
+o3ren.
+1orga
+or2gl
+o1ri
+or1or
+or6t5au
+o1s2k
+os2lo
+o4sta
+oste6r5
+o1ta
+ot6e
+otem5
+otemp6
+o5t6h
+o1ti
+o1to
+ot1r
+ot6ro
+ot2tr
+ou5i
+o1un
+3ou5t
+o1v
+o1w
+o1x
+o1z6
+4pab
+pa5g6
+p6ak
+pa3la
+pa6no
+1pap
+pa4r3af
+6parg
+3partei
+pau1
+p1b
+p3c
+1pe
+pe5ep
+2pek
+pen5k
+pe1ra
+pere4
+pe4re.
+2perr
+pfa6
+pf5ade
+pf3as
+p4ferd
+pf5t
+1ph
+2ph.
+p5han
+6phb
+4p3hei
+6pht
+6phz
+pie6la
+pi1en
+5pil
+pi1s
+pis4k
+p1k
+1pl6
+4p3ler
+p2li
+2plig
+2p3lu
+p1m
+p1n
+1p4o
+po1ch
+3pol
+po1ra
+po1re
+p1pa
+ppe4n1
+pp3f
+p6p5ha
+p1pi
+p1pr
+pp1s
+5prei
+5pres
+3prod
+5prog
+ps5er
+p1t
+pt1ac
+pteu6
+p2to
+pt5ro
+1pu
+pu1b2
+puf6fr
+6p5uh
+2pur
+pu6rei
+pu1ta
+p5v
+6p5w
+5py5
+p1z
+1qu2
+6rabd
+r1abt
+1rad
+ra4dan
+6radd
+ra4dr
+raf1a
+ra4fer
+1rahm
+r5ahn
+ra4l5o
+r4anb
+r2and
+r6ane
+r5angr
+r3anzu
+3rape
+1rapi
+2r1ar
+3rar.
+rar2s
+r6at.
+ra6ta
+ra6the
+6r1auf
+6r3aug
+r1b
+r1che
+rch1l
+6r1d
+rd5erge
+1re.
+re3alt
+re6b5l
+5recht
+2reck
+re1e
+3regi
+4reig
+6r5eime
+rei6sa
+reli3ef
+6remp
+re1pi
+6repp
+1rer
+5r6er.
+6rerb
+6r5erd
+6r5erf
+r3erla
+r4ersei
+6r5erzi
+5res.
+2ress
+r1e2w
+6r5e6x
+r1f
+rf4lie
+r1g
+rge4bl
+r4gn
+r1h
+rhe6ber.
+ri5alg
+ri1el
+ri1en
+ri3er.
+ri6fa
+riie6
+6r5inb
+2r3ind
+r4inde
+1rinn
+4rins
+2r1ir
+ri1sc
+ri5sko
+r2it
+ri6tal
+rizi5
+r1j
+r1k
+rkau6e
+rk6lo
+r1l
+r1m
+rmen4s
+r1na
+rn5ade
+rna6r
+rn5ari
+rn3eif
+r6nene
+rn6er
+rn3g
+rn1k
+r6n5or
+ro5ba
+ro1ch
+1rohr
+ro5i6
+r2on
+ro1re
+ro1sp
+rovisi6
+r1p2
+r6p5an
+rpf2
+rpro6g5n
+r4p5t
+r5pu
+rpum6
+r1q
+4rr
+r5r6a
+r5re
+rres2
+r1ri
+r1ro
+r3ru
+6r1s
+r6sanf
+r3sche
+rschri6
+rs2k
+r6sku
+rs2n
+rs2p
+rswi3
+rswid4
+r1t
+rt3ac
+r2t1ar
+r6t5erl
+r6t5erm
+rt1he
+r2t1hi
+rt4so
+rt6s5ti
+1ruf
+2rum
+6rundz
+r6ung.
+6r1unt
+6r1u4r3
+ru1ta
+r1v
+r1w
+ry2
+r1z
+rz5ac
+r6zad
+r6z1ar
+r2z1em
+1sa
+2s1ab
+sab5l
+s3a4der
+sa1fa
+sa3fl
+sa3fr
+sa5ik
+sa1la
+2s1alp
+5sam.
+5samk
+s3anb
+san2c
+s6ann
+2s1ap
+2s1ar
+3s4ar.
+2s1atl
+4s1aus
+2s1b
+2sch.
+2schb
+1sche
+4schec
+schen4b
+schen4h
+schen4z
+2schf
+4schh
+1schi
+2schk
+sch6ne
+3schof
+6schp
+3schri
+2schs
+2scht
+sch5ta
+5schu
+6schv
+2s1d
+1se
+se5ag
+6s5ec
+se4e
+see5i
+se6h5a
+6s1eig
+5s6eit
+4selem
+sen6e
+6sersa
+se5ru
+se6ruh
+ser6um
+s1erz
+2s1ex
+2s1f
+2s1g2
+2s1h
+1si
+si1b
+si1en
+4s3inte
+si5ru
+si1sc
+s1j
+s1k
+6sk.
+3skiz
+s5ku
+2s1l
+5slav
+s5li
+2s1m
+s1n
+1so
+s2on
+s1ord
+so1re
+4sorga
+sp2
+1spal
+spani5e
+6spap
+s2pei
+1spek
+s2pez
+s1pf2
+1spi
+6spil
+2s3pla
+1spr
+s5ps
+s6pul
+1spur
+s1q
+2s1r4
+2s5s2
+ssag6
+ssali6
+ssen6st
+1s2t
+2st.
+st2ab
+4staf
+2stag
+2stak
+st5anb
+4stanf
+st3ans
+4starbei
+4staus
+2stb
+2std
+ste6g5
+st4ei
+ste6ne
+ste5re
+6sterm
+6st3eur
+6s5tex
+2stf
+2stg
+2sth
+st3ho
+6stj
+2stk
+2stl
+2stm
+6stn
+2stp
+6stref
+6strun
+2st1s
+5s6tub
+5s6tun
+2stv
+2stw
+4stz
+1su
+su6b3
+such4s
+2s1v
+2s1w
+swi2d1
+1sy
+2s1z
+szula6
+ta4bla
+2tac
+3tafe
+3t4ag
+ta2g1a
+ta6ka
+6tamp
+t1amt
+tan6c
+t5anf
+tan6k5l
+4tanl
+6tanw
+4tarb
+t3arbe
+t1arm
+ta1sc
+ta6sto
+3taube.
+2t1b2
+tbi6b5
+2t1c
+2t1d
+1te
+te2a
+5techn
+2teh
+teh5l
+4teif
+3teil
+tei4l3a
+4teinh
+6t1eis
+te6lau
+te6lo
+ten1a
+ten5g
+te2ni
+ten3s6p
+te6nu
+te3ral
+te4ren
+te5ren.
+te6r5it
+3term
+t5e6se
+3test
+te6sto
+te6str
+te5th
+te3xa
+2t1f2
+2t1g2
+6th.
+2t1ha
+t1heb
+2t1hei
+3theo
+1thes
+thi1s
+2th1l
+th3m
+1thr
+3thus
+2t1id
+ti1en
+tik6
+t3ind
+ti6q
+ti5tr
+t1j
+2t1k
+2t5l6
+tle4digt
+tlo4b
+2t1m
+2t5n
+to5be
+to1ch
+tode2
+to6del
+to4d3er
+toh1
+toi6r
+t2on
+to1ra
+t1ord
+to1re
+5tou
+2t1p
+tpf2
+tr4a
+6trad
+3trag
+tra1s
+4trec
+t3rech
+5t6ree
+5t6ref
+6treg
+t5reih
+t5rep
+3t4ret
+3trib
+t6rie
+5trieb
+5t6rigk
+tri4o3
+t6rop
+t3rot.
+2trs
+5trun
+2ts
+t2s1an
+t2s1au
+t1sc
+t5sche
+ts3ort
+t1spa
+ts3th
+ts3un
+t2s1ur
+2t1t
+t5ta.
+tt5ab
+tt3eif
+t5t6ra
+tt1re
+t6tro
+tt5ru
+1tu
+6tuh
+tul4p
+5tum.
+tun6f
+6t1unt
+tu4ran
+tur2m3
+2t1v
+2t1w
+1ty
+2tz
+tz1an
+t6zent
+tz6th
+tz5wi
+u6ale
+u1ar.
+u1br
+ubs2k
+6uc
+uch3a
+u1che
+u1chi
+uch1l
+uch1r
+u1chu
+uch1w
+u1d
+udi3en
+u6d5on
+u1e
+ue2n
+uen1e
+uer1a
+u1fa
+u6f3ent
+uff2l
+uf1la
+uf1re
+u1g
+u6gabt
+ug5am
+ug2gl
+u2gl
+u2gn
+u1ha
+u1he
+u1hi
+u1ho
+uh1re
+u1ie2
+ui5em
+u1ig
+u3in.
+u1j
+u1ke
+u1kl
+ukle5i
+u1kn
+u1la
+u1le
+ul6lo
+u1lo
+ulo6i
+ul6sa
+u1lu
+um5ak
+1uml
+3umschl
+u1mu
+u1n1a
+un6al
+un4d3ar
+5undz
+un1e
+une2b
+une6d
+3unfal
+un1gl
+un5gn
+un2g3r
+ungs1
+ungs3ta
+un1in
+u4nion
+un1kl
+un1o
+1unr
+un1s2p
+3unterr
+u5n1u
+unvol4
+unvoll3
+u1or
+u5os.
+u1pa
+upe6
+uper3
+up6fi
+u1pi
+u1pr
+up2ta
+up6tr
+up4tur
+u1ra
+ura6d
+ur6an.
+u1re
+ur5eis
+u1ri
+1url
+ur6nan
+u1ro
+3ursa
+u1ru
+ur2za
+ur2z1w
+usch3w
+us5im
+us3tau
+ute5re
+ut5h
+ut6her
+u1ti
+u1to
+u1tr
+ut4schl
+ut6s5t
+u1u
+u1v
+u1w
+u1z
+va6t5a
+va6tei
+ve2r1
+vera6
+ver5b2
+vere2
+ve2sp
+vete3
+2v1g
+vi4el
+vi5et
+vi6la
+vi3ro
+vi1ru
+v2o
+vol4k
+vo6n
+vor5a
+vor1c
+vo4r1e
+2v1t
+wa4g3n
+1wald
+wan6dar
+war5u
+war2z5
+1was
+w6e
+wede5r
+we6fl
+we6ga
+we6g5eng
+we6g5es
+weg1l
+we2g3r
+weib4s
+1weis
+wei5sc
+wel4t
+welt3a
+welt3r
+we4ra
+werbe3
+werbes4
+wer6bl
+wer4fl
+wer6ga
+wer4ka
+wer4kl
+wer6ta
+we2sp
+we6str
+1wid
+wil6den
+wil6dr
+win4d3r
+wi1sc
+wi6schl
+wi6schn
+wo1c
+wo3ren
+wo6r5i
+wor5u
+wu1s
+wu2t1
+4w3w
+x1ak
+6x5amt
+x5and
+xan5t
+1xe
+x1emp
+x5erz
+6x1h
+1xi
+xi5c
+xich6
+x1k
+x6o
+x1p2
+6x1t
+x6ta
+xti6
+1xu
+6xy
+x1z
+y5al.
+y1c
+y1d
+y1e6
+y1g
+y5i
+y1k2
+yklo3
+y1l
+ym1
+yna5
+yn5e
+yn1t
+y5om
+y1p
+ype4
+yper3
+y6ps
+y2p3t
+y1r
+yr5r6
+y1s
+y6te
+y1t6h
+y1ti
+y1z
+6z5ab
+z3a4der
+1zah
+z5al
+6z5am
+zanla6
+z1arb
+zausga6
+2z1b
+6z5c
+6zd
+1ze
+zei6t5er
+ze5m6e
+zen3a
+zen6za
+ze5ra
+zerhau6
+2z1f
+2z1g
+2z1h
+1zi
+zi3alg
+zi5alr
+zi5cho
+zi1en
+z3imp
+6z5inf
+6zinh
+zinha6
+zin6ser
+zi1sc
+zi3th
+zi3tr
+2z1k
+2z1l
+2z1m
+4z1n
+5zo
+zo5f
+zo6gl
+zo5re
+zor4na
+2z1p
+2z1r
+2z1s6
+2z1t
+z4t3end
+zte5r
+zt5hi
+1zu
+zu1a
+zu1b2
+zuch4
+zucht3
+zu1f2
+zu5i
+zun2a
+zun2e
+6zunt
+zu3o
+zu1s
+zu1t
+2z1v
+3zwan
+2z1wer
+zwer6k5
+z3wo
+zy5
+2z5z6}
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-en.pat b/tex/context/base/lang-en.pat index efd11cdf1..57341a7a2 100644 --- a/tex/context/base/lang-en.pat +++ b/tex/context/base/lang-en.pat @@ -1,4467 +1,4468 @@ -% The Plain TeX hyphenation tables [NOT TO BE CHANGED IN ANY WAY!] -\patterns{ % just type <return> if you're not using INITEX -.ach4 -.ad4der -.af1t -.al3t -.am5at -.an5c -.ang4 -.ani5m -.ant4 -.an3te -.anti5s -.ar5s -.ar4tie -.ar4ty -.as3c -.as1p -.as1s -.aster5 -.atom5 -.au1d -.av4i -.awn4 -.ba4g -.ba5na -.bas4e -.ber4 -.be5ra -.be3sm -.be5sto -.bri2 -.but4ti -.cam4pe -.can5c -.capa5b -.car5ol -.ca4t -.ce4la -.ch4 -.chill5i -.ci2 -.cit5r -.co3e -.co4r -.cor5ner -.de4moi -.de3o -.de3ra -.de3ri -.des4c -.dictio5 -.do4t -.du4c -.dumb5 -.earth5 -.eas3i -.eb4 -.eer4 -.eg2 -.el5d -.el3em -.enam3 -.en3g -.en3s -.eq5ui5t -.er4ri -.es3 -.eu3 -.eye5 -.fes3 -.for5mer -.ga2 -.ge2 -.gen3t4 -.ge5og -.gi5a -.gi4b -.go4r -.hand5i -.han5k -.he2 -.hero5i -.hes3 -.het3 -.hi3b -.hi3er -.hon5ey -.hon3o -.hov5 -.id4l -.idol3 -.im3m -.im5pin -.in1 -.in3ci -.ine2 -.in2k -.in3s -.ir5r -.is4i -.ju3r -.la4cy -.la4m -.lat5er -.lath5 -.le2 -.leg5e -.len4 -.lep5 -.lev1 -.li4g -.lig5a -.li2n -.li3o -.li4t -.mag5a5 -.mal5o -.man5a -.mar5ti -.me2 -.mer3c -.me5ter -.mis1 -.mist5i -.mon3e -.mo3ro -.mu5ta -.muta5b -.ni4c -.od2 -.odd5 -.of5te -.or5ato -.or3c -.or1d -.or3t -.os3 -.os4tl -.oth3 -.out3 -.ped5al -.pe5te -.pe5tit -.pi4e -.pio5n -.pi2t -.pre3m -.ra4c -.ran4t -.ratio5na -.ree2 -.re5mit -.res2 -.re5stat -.ri4g -.rit5u -.ro4q -.ros5t -.row5d -.ru4d -.sci3e -.self5 -.sell5 -.se2n -.se5rie -.sh2 -.si2 -.sing4 -.st4 -.sta5bl -.sy2 -.ta4 -.te4 -.ten5an -.th2 -.ti2 -.til4 -.tim5o5 -.ting4 -.tin5k -.ton4a -.to4p -.top5i -.tou5s -.trib5ut -.un1a -.un3ce -.under5 -.un1e -.un5k -.un5o -.un3u -.up3 -.ure3 -.us5a -.ven4de -.ve5ra -.wil5i -.ye4 -4ab. -a5bal -a5ban -abe2 -ab5erd -abi5a -ab5it5ab -ab5lat -ab5o5liz -4abr -ab5rog -ab3ul -a4car -ac5ard -ac5aro -a5ceou -ac1er -a5chet -4a2ci -a3cie -ac1in -a3cio -ac5rob -act5if -ac3ul -ac4um -a2d -ad4din -ad5er. -2adi -a3dia -ad3ica -adi4er -a3dio -a3dit -a5diu -ad4le -ad3ow -ad5ran -ad4su -4adu -a3duc -ad5um -ae4r -aeri4e -a2f -aff4 -a4gab -aga4n -ag5ell -age4o -4ageu -ag1i -4ag4l -ag1n -a2go -3agog -ag3oni -a5guer -ag5ul -a4gy -a3ha -a3he -ah4l -a3ho -ai2 -a5ia -a3ic. -ai5ly -a4i4n -ain5in -ain5o -ait5en -a1j -ak1en -al5ab -al3ad -a4lar -4aldi -2ale -al3end -a4lenti -a5le5o -al1i -al4ia. -ali4e -al5lev -4allic -4alm -a5log. -a4ly. -4alys -5a5lyst -5alyt -3alyz -4ama -am5ab -am3ag -ama5ra -am5asc -a4matis -a4m5ato -am5era -am3ic -am5if -am5ily -am1in -ami4no -a2mo -a5mon -amor5i -amp5en -a2n -an3age -3analy -a3nar -an3arc -anar4i -a3nati -4and -ande4s -an3dis -an1dl -an4dow -a5nee -a3nen -an5est. -a3neu -2ang -ang5ie -an1gl -a4n1ic -a3nies -an3i3f -an4ime -a5nimi -a5nine -an3io -a3nip -an3ish -an3it -a3niu -an4kli -5anniz -ano4 -an5ot -anoth5 -an2sa -an4sco -an4sn -an2sp -ans3po -an4st -an4sur -antal4 -an4tie -4anto -an2tr -an4tw -an3ua -an3ul -a5nur -4ao -apar4 -ap5at -ap5ero -a3pher -4aphi -a4pilla -ap5illar -ap3in -ap3ita -a3pitu -a2pl -apoc5 -ap5ola -apor5i -apos3t -aps5es -a3pu -aque5 -2a2r -ar3act -a5rade -ar5adis -ar3al -a5ramete -aran4g -ara3p -ar4at -a5ratio -ar5ativ -a5rau -ar5av4 -araw4 -arbal4 -ar4chan -ar5dine -ar4dr -ar5eas -a3ree -ar3ent -a5ress -ar4fi -ar4fl -ar1i -ar5ial -ar3ian -a3riet -ar4im -ar5inat -ar3io -ar2iz -ar2mi -ar5o5d -a5roni -a3roo -ar2p -ar3q -arre4 -ar4sa -ar2sh -4as. -as4ab -as3ant -ashi4 -a5sia. -a3sib -a3sic -5a5si4t -ask3i -as4l -a4soc -as5ph -as4sh -as3ten -as1tr -asur5a -a2ta -at3abl -at5ac -at3alo -at5ap -ate5c -at5ech -at3ego -at3en. -at3era -ater5n -a5terna -at3est -at5ev -4ath -ath5em -a5then -at4ho -ath5om -4ati. -a5tia -at5i5b -at1ic -at3if -ation5ar -at3itu -a4tog -a2tom -at5omiz -a4top -a4tos -a1tr -at5rop -at4sk -at4tag -at5te -at4th -a2tu -at5ua -at5ue -at3ul -at3ura -a2ty -au4b -augh3 -au3gu -au4l2 -aun5d -au3r -au5sib -aut5en -au1th -a2va -av3ag -a5van -ave4no -av3era -av5ern -av5ery -av1i -avi4er -av3ig -av5oc -a1vor -3away -aw3i -aw4ly -aws4 -ax4ic -ax4id -ay5al -aye4 -ays4 -azi4er -azz5i -5ba. -bad5ger -ba4ge -bal1a -ban5dag -ban4e -ban3i -barbi5 -bari4a -bas4si -1bat -ba4z -2b1b -b2be -b3ber -bbi4na -4b1d -4be. -beak4 -beat3 -4be2d -be3da -be3de -be3di -be3gi -be5gu -1bel -be1li -be3lo -4be5m -be5nig -be5nu -4bes4 -be3sp -be5str -3bet -bet5iz -be5tr -be3tw -be3w -be5yo -2bf -4b3h -bi2b -bi4d -3bie -bi5en -bi4er -2b3if -1bil -bi3liz -bina5r4 -bin4d -bi5net -bi3ogr -bi5ou -bi2t -3bi3tio -bi3tr -3bit5ua -b5itz -b1j -bk4 -b2l2 -blath5 -b4le. -blen4 -5blesp -b3lis -b4lo -blun4t -4b1m -4b3n -bne5g -3bod -bod3i -bo4e -bol3ic -bom4bi -bon4a -bon5at -3boo -5bor. -4b1ora -bor5d -5bore -5bori -5bos4 -b5ota -both5 -bo4to -bound3 -4bp -4brit -broth3 -2b5s2 -bsor4 -2bt -bt4l -b4to -b3tr -buf4fer -bu4ga -bu3li -bumi4 -bu4n -bunt4i -bu3re -bus5ie -buss4e -5bust -4buta -3butio -b5uto -b1v -4b5w -5by. -bys4 -1ca -cab3in -ca1bl -cach4 -ca5den -4cag4 -2c5ah -ca3lat -cal4la -call5in -4calo -can5d -can4e -can4ic -can5is -can3iz -can4ty -cany4 -ca5per -car5om -cast5er -cas5tig -4casy -ca4th -4cativ -cav5al -c3c -ccha5 -cci4a -ccompa5 -ccon4 -ccou3t -2ce. -4ced. -4ceden -3cei -5cel. -3cell -1cen -3cenc -2cen4e -4ceni -3cent -3cep -ce5ram -4cesa -3cessi -ces5si5b -ces5t -cet4 -c5e4ta -cew4 -2ch -4ch. -4ch3ab -5chanic -ch5a5nis -che2 -cheap3 -4ched -che5lo -3chemi -ch5ene -ch3er. -ch3ers -4ch1in -5chine. -ch5iness -5chini -5chio -3chit -chi2z -3cho2 -ch4ti -1ci -3cia -ci2a5b -cia5r -ci5c -4cier -5cific. -4cii -ci4la -3cili -2cim -2cin -c4ina -3cinat -cin3em -c1ing -c5ing. -5cino -cion4 -4cipe -ci3ph -4cipic -4cista -4cisti -2c1it -cit3iz -5ciz -ck1 -ck3i -1c4l4 -4clar -c5laratio -5clare -cle4m -4clic -clim4 -cly4 -c5n -1co -co5ag -coe2 -2cog -co4gr -coi4 -co3inc -col5i -5colo -col3or -com5er -con4a -c4one -con3g -con5t -co3pa -cop3ic -co4pl -4corb -coro3n -cos4e -cov1 -cove4 -cow5a -coz5e -co5zi -c1q -cras5t -5crat. -5cratic -cre3at -5cred -4c3reta -cre4v -cri2 -cri5f -c4rin -cris4 -5criti -cro4pl -crop5o -cros4e -cru4d -4c3s2 -2c1t -cta4b -ct5ang -c5tant -c2te -c3ter -c4ticu -ctim3i -ctu4r -c4tw -cud5 -c4uf -c4ui -cu5ity -5culi -cul4tis -3cultu -cu2ma -c3ume -cu4mi -3cun -cu3pi -cu5py -cur5a4b -cu5ria -1cus -cuss4i -3c4ut -cu4tie -4c5utiv -4cutr -1cy -cze4 -1d2a -5da. -2d3a4b -dach4 -4daf -2dag -da2m2 -dan3g -dard5 -dark5 -4dary -3dat -4dativ -4dato -5dav4 -dav5e -5day -d1b -d5c -d1d4 -2de. -deaf5 -deb5it -de4bon -decan4 -de4cil -de5com -2d1ed -4dee. -de5if -deli4e -del5i5q -de5lo -d4em -5dem. -3demic -dem5ic. -de5mil -de4mons -demor5 -1den -de4nar -de3no -denti5f -de3nu -de1p -de3pa -depi4 -de2pu -d3eq -d4erh -5derm -dern5iz -der5s -des2 -d2es. -de1sc -de2s5o -des3ti -de3str -de4su -de1t -de2to -de1v -dev3il -4dey -4d1f -d4ga -d3ge4t -dg1i -d2gy -d1h2 -5di. -1d4i3a -dia5b -di4cam -d4ice -3dict -3did -5di3en -d1if -di3ge -di4lato -d1in -1dina -3dine. -5dini -di5niz -1dio -dio5g -di4pl -dir2 -di1re -dirt5i -dis1 -5disi -d4is3t -d2iti -1di1v -d1j -d5k2 -4d5la -3dle. -3dled -3dles. -4dless -2d3lo -4d5lu -2dly -d1m -4d1n4 -1do -3do. -do5de -5doe -2d5of -d4og -do4la -doli4 -do5lor -dom5iz -do3nat -doni4 -doo3d -dop4p -d4or -3dos -4d5out -do4v -3dox -d1p -1dr -drag5on -4drai -dre4 -drea5r -5dren -dri4b -dril4 -dro4p -4drow -5drupli -4dry -2d1s2 -ds4p -d4sw -d4sy -d2th -1du -d1u1a -du2c -d1uca -duc5er -4duct. -4ducts -du5el -du4g -d3ule -dum4be -du4n -4dup -du4pe -d1v -d1w -d2y -5dyn -dy4se -dys5p -e1a4b -e3act -ead1 -ead5ie -ea4ge -ea5ger -ea4l -eal5er -eal3ou -eam3er -e5and -ear3a -ear4c -ear5es -ear4ic -ear4il -ear5k -ear2t -eart3e -ea5sp -e3ass -east3 -ea2t -eat5en -eath3i -e5atif -e4a3tu -ea2v -eav3en -eav5i -eav5o -2e1b -e4bel. -e4bels -e4ben -e4bit -e3br -e4cad -ecan5c -ecca5 -e1ce -ec5essa -ec2i -e4cib -ec5ificat -ec5ifie -ec5ify -ec3im -eci4t -e5cite -e4clam -e4clus -e2col -e4comm -e4compe -e4conc -e2cor -ec3ora -eco5ro -e1cr -e4crem -ec4tan -ec4te -e1cu -e4cul -ec3ula -2e2da -4ed3d -e4d1er -ede4s -4edi -e3dia -ed3ib -ed3ica -ed3im -ed1it -edi5z -4edo -e4dol -edon2 -e4dri -e4dul -ed5ulo -ee2c -eed3i -ee2f -eel3i -ee4ly -ee2m -ee4na -ee4p1 -ee2s4 -eest4 -ee4ty -e5ex -e1f -e4f3ere -1eff -e4fic -5efici -efil4 -e3fine -ef5i5nite -3efit -efor5es -e4fuse. -4egal -eger4 -eg5ib -eg4ic -eg5ing -e5git5 -eg5n -e4go. -e4gos -eg1ul -e5gur -5egy -e1h4 -eher4 -ei2 -e5ic -ei5d -eig2 -ei5gl -e3imb -e3inf -e1ing -e5inst -eir4d -eit3e -ei3th -e5ity -e1j -e4jud -ej5udi -eki4n -ek4la -e1la -e4la. -e4lac -elan4d -el5ativ -e4law -elaxa4 -e3lea -el5ebra -5elec -e4led -el3ega -e5len -e4l1er -e1les -el2f -el2i -e3libe -e4l5ic. -el3ica -e3lier -el5igib -e5lim -e4l3ing -e3lio -e2lis -el5ish -e3liv3 -4ella -el4lab -ello4 -e5loc -el5og -el3op. -el2sh -el4ta -e5lud -el5ug -e4mac -e4mag -e5man -em5ana -em5b -e1me -e2mel -e4met -em3ica -emi4e -em5igra -em1in2 -em5ine -em3i3ni -e4mis -em5ish -e5miss -em3iz -5emniz -emo4g -emoni5o -em3pi -e4mul -em5ula -emu3n -e3my -en5amo -e4nant -ench4er -en3dic -e5nea -e5nee -en3em -en5ero -en5esi -en5est -en3etr -e3new -en5ics -e5nie -e5nil -e3nio -en3ish -en3it -e5niu -5eniz -4enn -4eno -eno4g -e4nos -en3ov -en4sw -ent5age -4enthes -en3ua -en5uf -e3ny. -4en3z -e5of -eo2g -e4oi4 -e3ol -eop3ar -e1or -eo3re -eo5rol -eos4 -e4ot -eo4to -e5out -e5ow -e2pa -e3pai -ep5anc -e5pel -e3pent -ep5etitio -ephe4 -e4pli -e1po -e4prec -ep5reca -e4pred -ep3reh -e3pro -e4prob -ep4sh -ep5ti5b -e4put -ep5uta -e1q -equi3l -e4q3ui3s -er1a -era4b -4erand -er3ar -4erati. -2erb -er4bl -er3ch -er4che -2ere. -e3real -ere5co -ere3in -er5el. -er3emo -er5ena -er5ence -4erene -er3ent -ere4q -er5ess -er3est -eret4 -er1h -er1i -e1ria4 -5erick -e3rien -eri4er -er3ine -e1rio -4erit -er4iu -eri4v -e4riva -er3m4 -er4nis -4ernit -5erniz -er3no -2ero -er5ob -e5roc -ero4r -er1ou -er1s -er3set -ert3er -4ertl -er3tw -4eru -eru4t -5erwau -e1s4a -e4sage. -e4sages -es2c -e2sca -es5can -e3scr -es5cu -e1s2e -e2sec -es5ecr -es5enc -e4sert. -e4serts -e4serva -4esh -e3sha -esh5en -e1si -e2sic -e2sid -es5iden -es5igna -e2s5im -es4i4n -esis4te -esi4u -e5skin -es4mi -e2sol -es3olu -e2son -es5ona -e1sp -es3per -es5pira -es4pre -2ess -es4si4b -estan4 -es3tig -es5tim -4es2to -e3ston -2estr -e5stro -estruc5 -e2sur -es5urr -es4w -eta4b -eten4d -e3teo -ethod3 -et1ic -e5tide -etin4 -eti4no -e5tir -e5titio -et5itiv -4etn -et5ona -e3tra -e3tre -et3ric -et5rif -et3rog -et5ros -et3ua -et5ym -et5z -4eu -e5un -e3up -eu3ro -eus4 -eute4 -euti5l -eu5tr -eva2p5 -e2vas -ev5ast -e5vea -ev3ell -evel3o -e5veng -even4i -ev1er -e5verb -e1vi -ev3id -evi4l -e4vin -evi4v -e5voc -e5vu -e1wa -e4wag -e5wee -e3wh -ewil5 -ew3ing -e3wit -1exp -5eyc -5eye. -eys4 -1fa -fa3bl -fab3r -fa4ce -4fag -fain4 -fall5e -4fa4ma -fam5is -5far -far5th -fa3ta -fa3the -4fato -fault5 -4f5b -4fd -4fe. -feas4 -feath3 -fe4b -4feca -5fect -2fed -fe3li -fe4mo -fen2d -fend5e -fer1 -5ferr -fev4 -4f1f -f4fes -f4fie -f5fin. -f2f5is -f4fly -f2fy -4fh -1fi -fi3a -2f3ic. -4f3ical -f3ican -4ficate -f3icen -fi3cer -fic4i -5ficia -5ficie -4fics -fi3cu -fi5del -fight5 -fil5i -fill5in -4fily -2fin -5fina -fin2d5 -fi2ne -f1in3g -fin4n -fis4ti -f4l2 -f5less -flin4 -flo3re -f2ly5 -4fm -4fn -1fo -5fon -fon4de -fon4t -fo2r -fo5rat -for5ay -fore5t -for4i -fort5a -fos5 -4f5p -fra4t -f5rea -fres5c -fri2 -fril4 -frol5 -2f3s -2ft -f4to -f2ty -3fu -fu5el -4fug -fu4min -fu5ne -fu3ri -fusi4 -fus4s -4futa -1fy -1ga -gaf4 -5gal. -3gali -ga3lo -2gam -ga5met -g5amo -gan5is -ga3niz -gani5za -4gano -gar5n4 -gass4 -gath3 -4gativ -4gaz -g3b -gd4 -2ge. -2ged -geez4 -gel4in -ge5lis -ge5liz -4gely -1gen -ge4nat -ge5niz -4geno -4geny -1geo -ge3om -g4ery -5gesi -geth5 -4geto -ge4ty -ge4v -4g1g2 -g2ge -g3ger -gglu5 -ggo4 -gh3in -gh5out -gh4to -5gi. -1gi4a -gia5r -g1ic -5gicia -g4ico -gien5 -5gies. -gil4 -g3imen -3g4in. -gin5ge -5g4ins -5gio -3gir -gir4l -g3isl -gi4u -5giv -3giz -gl2 -gla4 -glad5i -5glas -1gle -gli4b -g3lig -3glo -glo3r -g1m -g4my -gn4a -g4na. -gnet4t -g1ni -g2nin -g4nio -g1no -g4non -1go -3go. -gob5 -5goe -3g4o4g -go3is -gon2 -4g3o3na -gondo5 -go3ni -5goo -go5riz -gor5ou -5gos. -gov1 -g3p -1gr -4grada -g4rai -gran2 -5graph. -g5rapher -5graphic -4graphy -4gray -gre4n -4gress. -4grit -g4ro -gruf4 -gs2 -g5ste -gth3 -gu4a -3guard -2gue -5gui5t -3gun -3gus -4gu4t -g3w -1gy -2g5y3n -gy5ra -h3ab4l -hach4 -hae4m -hae4t -h5agu -ha3la -hala3m -ha4m -han4ci -han4cy -5hand. -han4g -hang5er -hang5o -h5a5niz -han4k -han4te -hap3l -hap5t -ha3ran -ha5ras -har2d -hard3e -har4le -harp5en -har5ter -has5s -haun4 -5haz -haz3a -h1b -1head -3hear -he4can -h5ecat -h4ed -he5do5 -he3l4i -hel4lis -hel4ly -h5elo -hem4p -he2n -hena4 -hen5at -heo5r -hep5 -h4era -hera3p -her4ba -here5a -h3ern -h5erou -h3ery -h1es -he2s5p -he4t -het4ed -heu4 -h1f -h1h -hi5an -hi4co -high5 -h4il2 -himer4 -h4ina -hion4e -hi4p -hir4l -hi3ro -hir4p -hir4r -his3el -his4s -hith5er -hi2v -4hk -4h1l4 -hlan4 -h2lo -hlo3ri -4h1m -hmet4 -2h1n -h5odiz -h5ods -ho4g -hoge4 -hol5ar -3hol4e -ho4ma -home3 -hon4a -ho5ny -3hood -hoon4 -hor5at -ho5ris -hort3e -ho5ru -hos4e -ho5sen -hos1p -1hous -house3 -hov5el -4h5p -4hr4 -hree5 -hro5niz -hro3po -4h1s2 -h4sh -h4tar -ht1en -ht5es -h4ty -hu4g -hu4min -hun5ke -hun4t -hus3t4 -hu4t -h1w -h4wart -hy3pe -hy3ph -hy2s -2i1a -i2al -iam4 -iam5ete -i2an -4ianc -ian3i -4ian4t -ia5pe -iass4 -i4ativ -ia4tric -i4atu -ibe4 -ib3era -ib5ert -ib5ia -ib3in -ib5it. -ib5ite -i1bl -ib3li -i5bo -i1br -i2b5ri -i5bun -4icam -5icap -4icar -i4car. -i4cara -icas5 -i4cay -iccu4 -4iceo -4ich -2ici -i5cid -ic5ina -i2cip -ic3ipa -i4cly -i2c5oc -4i1cr -5icra -i4cry -ic4te -ictu2 -ic4t3ua -ic3ula -ic4um -ic5uo -i3cur -2id -i4dai -id5anc -id5d -ide3al -ide4s -i2di -id5ian -idi4ar -i5die -id3io -idi5ou -id1it -id5iu -i3dle -i4dom -id3ow -i4dr -i2du -id5uo -2ie4 -ied4e -5ie5ga -ield3 -ien5a4 -ien4e -i5enn -i3enti -i1er. -i3esc -i1est -i3et -4if. -if5ero -iff5en -if4fr -4ific. -i3fie -i3fl -4ift -2ig -iga5b -ig3era -ight3i -4igi -i3gib -ig3il -ig3in -ig3it -i4g4l -i2go -ig3or -ig5ot -i5gre -igu5i -ig1ur -i3h -4i5i4 -i3j -4ik -i1la -il3a4b -i4lade -i2l5am -ila5ra -i3leg -il1er -ilev4 -il5f -il1i -il3ia -il2ib -il3io -il4ist -2ilit -il2iz -ill5ab -4iln -il3oq -il4ty -il5ur -il3v -i4mag -im3age -ima5ry -imenta5r -4imet -im1i -im5ida -imi5le -i5mini -4imit -im4ni -i3mon -i2mu -im3ula -2in. -i4n3au -4inav -incel4 -in3cer -4ind -in5dling -2ine -i3nee -iner4ar -i5ness -4inga -4inge -in5gen -4ingi -in5gling -4ingo -4ingu -2ini -i5ni. -i4nia -in3io -in1is -i5nite. -5initio -in3ity -4ink -4inl -2inn -2i1no -i4no4c -ino4s -i4not -2ins -in3se -insur5a -2int. -2in4th -in1u -i5nus -4iny -2io -4io. -ioge4 -io2gr -i1ol -io4m -ion3at -ion4ery -ion3i -io5ph -ior3i -i4os -io5th -i5oti -io4to -i4our -2ip -ipe4 -iphras4 -ip3i -ip4ic -ip4re4 -ip3ul -i3qua -iq5uef -iq3uid -iq3ui3t -4ir -i1ra -ira4b -i4rac -ird5e -ire4de -i4ref -i4rel4 -i4res -ir5gi -ir1i -iri5de -ir4is -iri3tu -5i5r2iz -ir4min -iro4g -5iron. -ir5ul -2is. -is5ag -is3ar -isas5 -2is1c -is3ch -4ise -is3er -3isf -is5han -is3hon -ish5op -is3ib -isi4d -i5sis -is5itiv -4is4k -islan4 -4isms -i2so -iso5mer -is1p -is2pi -is4py -4is1s -is4sal -issen4 -is4ses -is4ta. -is1te -is1ti -ist4ly -4istral -i2su -is5us -4ita. -ita4bi -i4tag -4ita5m -i3tan -i3tat -2ite -it3era -i5teri -it4es -2ith -i1ti -4itia -4i2tic -it3ica -5i5tick -it3ig -it5ill -i2tim -2itio -4itis -i4tism -i2t5o5m -4iton -i4tram -it5ry -4itt -it3uat -i5tud -it3ul -4itz. -i1u -2iv -iv3ell -iv3en. -i4v3er. -i4vers. -iv5il. -iv5io -iv1it -i5vore -iv3o3ro -i4v3ot -4i5w -ix4o -4iy -4izar -izi4 -5izont -5ja -jac4q -ja4p -1je -jer5s -4jestie -4jesty -jew3 -jo4p -5judg -3ka. -k3ab -k5ag -kais4 -kal4 -k1b -k2ed -1kee -ke4g -ke5li -k3en4d -k1er -kes4 -k3est. -ke4ty -k3f -kh4 -k1i -5ki. -5k2ic -k4ill -kilo5 -k4im -k4in. -kin4de -k5iness -kin4g -ki4p -kis4 -k5ish -kk4 -k1l -4kley -4kly -k1m -k5nes -1k2no -ko5r -kosh4 -k3ou -kro5n -4k1s2 -k4sc -ks4l -k4sy -k5t -k1w -lab3ic -l4abo -laci4 -l4ade -la3dy -lag4n -lam3o -3land -lan4dl -lan5et -lan4te -lar4g -lar3i -las4e -la5tan -4lateli -4lativ -4lav -la4v4a -2l1b -lbin4 -4l1c2 -lce4 -l3ci -2ld -l2de -ld4ere -ld4eri -ldi4 -ld5is -l3dr -l4dri -le2a -le4bi -left5 -5leg. -5legg -le4mat -lem5atic -4len. -3lenc -5lene. -1lent -le3ph -le4pr -lera5b -ler4e -3lerg -3l4eri -l4ero -les2 -le5sco -5lesq -3less -5less. -l3eva -lev4er. -lev4era -lev4ers -3ley -4leye -2lf -l5fr -4l1g4 -l5ga -lgar3 -l4ges -lgo3 -2l3h -li4ag -li2am -liar5iz -li4as -li4ato -li5bi -5licio -li4cor -4lics -4lict. -l4icu -l3icy -l3ida -lid5er -3lidi -lif3er -l4iff -li4fl -5ligate -3ligh -li4gra -3lik -4l4i4l -lim4bl -lim3i -li4mo -l4im4p -l4ina -1l4ine -lin3ea -lin3i -link5er -li5og -4l4iq -lis4p -l1it -l2it. -5litica -l5i5tics -liv3er -l1iz -4lj -lka3 -l3kal -lka4t -l1l -l4law -l2le -l5lea -l3lec -l3leg -l3lel -l3le4n -l3le4t -ll2i -l2lin4 -l5lina -ll4o -lloqui5 -ll5out -l5low -2lm -l5met -lm3ing -l4mod -lmon4 -2l1n2 -3lo. -lob5al -lo4ci -4lof -3logic -l5ogo -3logu -lom3er -5long -lon4i -l3o3niz -lood5 -5lope. -lop3i -l3opm -lora4 -lo4rato -lo5rie -lor5ou -5los. -los5et -5losophiz -5losophy -los4t -lo4ta -loun5d -2lout -4lov -2lp -lpa5b -l3pha -l5phi -lp5ing -l3pit -l4pl -l5pr -4l1r -2l1s2 -l4sc -l2se -l4sie -4lt -lt5ag -ltane5 -l1te -lten4 -ltera4 -lth3i -l5ties. -ltis4 -l1tr -ltu2 -ltur3a -lu5a -lu3br -luch4 -lu3ci -lu3en -luf4 -lu5id -lu4ma -5lumi -l5umn. -5lumnia -lu3o -luo3r -4lup -luss4 -lus3te -1lut -l5ven -l5vet4 -2l1w -1ly -4lya -4lyb -ly5me -ly3no -2lys4 -l5yse -1ma -2mab -ma2ca -ma5chine -ma4cl -mag5in -5magn -2mah -maid5 -4mald -ma3lig -ma5lin -mal4li -mal4ty -5mania -man5is -man3iz -4map -ma5rine. -ma5riz -mar4ly -mar3v -ma5sce -mas4e -mas1t -5mate -math3 -ma3tis -4matiza -4m1b -mba4t5 -m5bil -m4b3ing -mbi4v -4m5c -4me. -2med -4med. -5media -me3die -m5e5dy -me2g -mel5on -mel4t -me2m -mem1o3 -1men -men4a -men5ac -men4de -4mene -men4i -mens4 -mensu5 -3ment -men4te -me5on -m5ersa -2mes -3mesti -me4ta -met3al -me1te -me5thi -m4etr -5metric -me5trie -me3try -me4v -4m1f -2mh -5mi. -mi3a -mid4a -mid4g -mig4 -3milia -m5i5lie -m4ill -min4a -3mind -m5inee -m4ingl -min5gli -m5ingly -min4t -m4inu -miot4 -m2is -mis4er. -mis5l -mis4ti -m5istry -4mith -m2iz -4mk -4m1l -m1m -mma5ry -4m1n -mn4a -m4nin -mn4o -1mo -4mocr -5mocratiz -mo2d1 -mo4go -mois2 -moi5se -4mok -mo5lest -mo3me -mon5et -mon5ge -moni3a -mon4ism -mon4ist -mo3niz -monol4 -mo3ny. -mo2r -4mora. -mos2 -mo5sey -mo3sp -moth3 -m5ouf -3mous -mo2v -4m1p -mpara5 -mpa5rab -mpar5i -m3pet -mphas4 -m2pi -mpi4a -mp5ies -m4p1in -m5pir -mp5is -mpo3ri -mpos5ite -m4pous -mpov5 -mp4tr -m2py -4m3r -4m1s2 -m4sh -m5si -4mt -1mu -mula5r4 -5mult -multi3 -3mum -mun2 -4mup -mu4u -4mw -1na -2n1a2b -n4abu -4nac. -na4ca -n5act -nag5er. -nak4 -na4li -na5lia -4nalt -na5mit -n2an -nanci4 -nan4it -nank4 -nar3c -4nare -nar3i -nar4l -n5arm -n4as -nas4c -nas5ti -n2at -na3tal -nato5miz -n2au -nau3se -3naut -nav4e -4n1b4 -ncar5 -n4ces. -n3cha -n5cheo -n5chil -n3chis -nc1in -nc4it -ncour5a -n1cr -n1cu -n4dai -n5dan -n1de -nd5est. -ndi4b -n5d2if -n1dit -n3diz -n5duc -ndu4r -nd2we -2ne. -n3ear -ne2b -neb3u -ne2c -5neck -2ned -ne4gat -neg5ativ -5nege -ne4la -nel5iz -ne5mi -ne4mo -1nen -4nene -3neo -ne4po -ne2q -n1er -nera5b -n4erar -n2ere -n4er5i -ner4r -1nes -2nes. -4nesp -2nest -4nesw -3netic -ne4v -n5eve -ne4w -n3f -n4gab -n3gel -nge4n4e -n5gere -n3geri -ng5ha -n3gib -ng1in -n5git -n4gla -ngov4 -ng5sh -n1gu -n4gum -n2gy -4n1h4 -nha4 -nhab3 -nhe4 -3n4ia -ni3an -ni4ap -ni3ba -ni4bl -ni4d -ni5di -ni4er -ni2fi -ni5ficat -n5igr -nik4 -n1im -ni3miz -n1in -5nine. -nin4g -ni4o -5nis. -nis4ta -n2it -n4ith -3nitio -n3itor -ni3tr -n1j -4nk2 -n5kero -n3ket -nk3in -n1kl -4n1l -n5m -nme4 -nmet4 -4n1n2 -nne4 -nni3al -nni4v -nob4l -no3ble -n5ocl -4n3o2d -3noe -4nog -noge4 -nois5i -no5l4i -5nologis -3nomic -n5o5miz -no4mo -no3my -no4n -non4ag -non5i -n5oniz -4nop -5nop5o5li -nor5ab -no4rary -4nosc -nos4e -nos5t -no5ta -1nou -3noun -nov3el3 -nowl3 -n1p4 -npi4 -npre4c -n1q -n1r -nru4 -2n1s2 -ns5ab -nsati4 -ns4c -n2se -n4s3es -nsid1 -nsig4 -n2sl -ns3m -n4soc -ns4pe -n5spi -nsta5bl -n1t -nta4b -nter3s -nt2i -n5tib -nti4er -nti2f -n3tine -n4t3ing -nti4p -ntrol5li -nt4s -ntu3me -nu1a -nu4d -nu5en -nuf4fe -n3uin -3nu3it -n4um -nu1me -n5umi -3nu4n -n3uo -nu3tr -n1v2 -n1w4 -nym4 -nyp4 -4nz -n3za -4oa -oad3 -o5a5les -oard3 -oas4e -oast5e -oat5i -ob3a3b -o5bar -obe4l -o1bi -o2bin -ob5ing -o3br -ob3ul -o1ce -och4 -o3chet -ocif3 -o4cil -o4clam -o4cod -oc3rac -oc5ratiz -ocre3 -5ocrit -octor5a -oc3ula -o5cure -od5ded -od3ic -odi3o -o2do4 -odor3 -od5uct. -od5ucts -o4el -o5eng -o3er -oe4ta -o3ev -o2fi -of5ite -ofit4t -o2g5a5r -og5ativ -o4gato -o1ge -o5gene -o5geo -o4ger -o3gie -1o1gis -og3it -o4gl -o5g2ly -3ogniz -o4gro -ogu5i -1ogy -2ogyn -o1h2 -ohab5 -oi2 -oic3es -oi3der -oiff4 -oig4 -oi5let -o3ing -oint5er -o5ism -oi5son -oist5en -oi3ter -o5j -2ok -o3ken -ok5ie -o1la -o4lan -olass4 -ol2d -old1e -ol3er -o3lesc -o3let -ol4fi -ol2i -o3lia -o3lice -ol5id. -o3li4f -o5lil -ol3ing -o5lio -o5lis. -ol3ish -o5lite -o5litio -o5liv -olli4e -ol5ogiz -olo4r -ol5pl -ol2t -ol3ub -ol3ume -ol3un -o5lus -ol2v -o2ly -om5ah -oma5l -om5atiz -om2be -om4bl -o2me -om3ena -om5erse -o4met -om5etry -o3mia -om3ic. -om3ica -o5mid -om1in -o5mini -5ommend -omo4ge -o4mon -om3pi -ompro5 -o2n -on1a -on4ac -o3nan -on1c -3oncil -2ond -on5do -o3nen -on5est -on4gu -on1ic -o3nio -on1is -o5niu -on3key -on4odi -on3omy -on3s -onspi4 -onspir5a -onsu4 -onten4 -on3t4i -ontif5 -on5um -onva5 -oo2 -ood5e -ood5i -oo4k -oop3i -o3ord -oost5 -o2pa -ope5d -op1er -3opera -4operag -2oph -o5phan -o5pher -op3ing -o3pit -o5pon -o4posi -o1pr -op1u -opy5 -o1q -o1ra -o5ra. -o4r3ag -or5aliz -or5ange -ore5a -o5real -or3ei -ore5sh -or5est. -orew4 -or4gu -4o5ria -or3ica -o5ril -or1in -o1rio -or3ity -o3riu -or2mi -orn2e -o5rof -or3oug -or5pe -3orrh -or4se -ors5en -orst4 -or3thi -or3thy -or4ty -o5rum -o1ry -os3al -os2c -os4ce -o3scop -4oscopi -o5scr -os4i4e -os5itiv -os3ito -os3ity -osi4u -os4l -o2so -os4pa -os4po -os2ta -o5stati -os5til -os5tit -o4tan -otele4g -ot3er. -ot5ers -o4tes -4oth -oth5esi -oth3i4 -ot3ic. -ot5ica -o3tice -o3tif -o3tis -oto5s -ou2 -ou3bl -ouch5i -ou5et -ou4l -ounc5er -oun2d -ou5v -ov4en -over4ne -over3s -ov4ert -o3vis -oviti4 -o5v4ol -ow3der -ow3el -ow5est -ow1i -own5i -o4wo -oy1a -1pa -pa4ca -pa4ce -pac4t -p4ad -5pagan -p3agat -p4ai -pain4 -p4al -pan4a -pan3el -pan4ty -pa3ny -pa1p -pa4pu -para5bl -par5age -par5di -3pare -par5el -p4a4ri -par4is -pa2te -pa5ter -5pathic -pa5thy -pa4tric -pav4 -3pay -4p1b -pd4 -4pe. -3pe4a -pear4l -pe2c -2p2ed -3pede -3pedi -pedia4 -ped4ic -p4ee -pee4d -pek4 -pe4la -peli4e -pe4nan -p4enc -pen4th -pe5on -p4era. -pera5bl -p4erag -p4eri -peri5st -per4mal -perme5 -p4ern -per3o -per3ti -pe5ru -per1v -pe2t -pe5ten -pe5tiz -4pf -4pg -4ph. -phar5i -phe3no -ph4er -ph4es. -ph1ic -5phie -ph5ing -5phisti -3phiz -ph2l -3phob -3phone -5phoni -pho4r -4phs -ph3t -5phu -1phy -pi3a -pian4 -pi4cie -pi4cy -p4id -p5ida -pi3de -5pidi -3piec -pi3en -pi4grap -pi3lo -pi2n -p4in. -pind4 -p4ino -3pi1o -pion4 -p3ith -pi5tha -pi2tu -2p3k2 -1p2l2 -3plan -plas5t -pli3a -pli5er -4plig -pli4n -ploi4 -plu4m -plum4b -4p1m -2p3n -po4c -5pod. -po5em -po3et5 -5po4g -poin2 -5point -poly5t -po4ni -po4p -1p4or -po4ry -1pos -pos1s -p4ot -po4ta -5poun -4p1p -ppa5ra -p2pe -p4ped -p5pel -p3pen -p3per -p3pet -ppo5site -pr2 -pray4e -5preci -pre5co -pre3em -pref5ac -pre4la -pre3r -p3rese -3press -pre5ten -pre3v -5pri4e -prin4t3 -pri4s -pris3o -p3roca -prof5it -pro3l -pros3e -pro1t -2p1s2 -p2se -ps4h -p4sib -2p1t -pt5a4b -p2te -p2th -pti3m -ptu4r -p4tw -pub3 -pue4 -puf4 -pul3c -pu4m -pu2n -pur4r -5pus -pu2t -5pute -put3er -pu3tr -put4ted -put4tin -p3w -qu2 -qua5v -2que. -3quer -3quet -2rab -ra3bi -rach4e -r5acl -raf5fi -raf4t -r2ai -ra4lo -ram3et -r2ami -rane5o -ran4ge -r4ani -ra5no -rap3er -3raphy -rar5c -rare4 -rar5ef -4raril -r2as -ration4 -rau4t -ra5vai -rav3el -ra5zie -r1b -r4bab -r4bag -rbi2 -rbi4f -r2bin -r5bine -rb5ing. -rb4o -r1c -r2ce -rcen4 -r3cha -rch4er -r4ci4b -rc4it -rcum3 -r4dal -rd2i -rdi4a -rdi4er -rdin4 -rd3ing -2re. -re1al -re3an -re5arr -5reav -re4aw -r5ebrat -rec5oll -rec5ompe -re4cre -2r2ed -re1de -re3dis -red5it -re4fac -re2fe -re5fer. -re3fi -re4fy -reg3is -re5it -re1li -re5lu -r4en4ta -ren4te -re1o -re5pin -re4posi -re1pu -r1er4 -r4eri -rero4 -re5ru -r4es. -re4spi -ress5ib -res2t -re5stal -re3str -re4ter -re4ti4z -re3tri -reu2 -re5uti -rev2 -re4val -rev3el -r5ev5er. -re5vers -re5vert -re5vil -rev5olu -re4wh -r1f -rfu4 -r4fy -rg2 -rg3er -r3get -r3gic -rgi4n -rg3ing -r5gis -r5git -r1gl -rgo4n -r3gu -rh4 -4rh. -4rhal -ri3a -ria4b -ri4ag -r4ib -rib3a -ric5as -r4ice -4rici -5ricid -ri4cie -r4ico -rid5er -ri3enc -ri3ent -ri1er -ri5et -rig5an -5rigi -ril3iz -5riman -rim5i -3rimo -rim4pe -r2ina -5rina. -rin4d -rin4e -rin4g -ri1o -5riph -riph5e -ri2pl -rip5lic -r4iq -r2is -r4is. -ris4c -r3ish -ris4p -ri3ta3b -r5ited. -rit5er. -rit5ers -rit3ic -ri2tu -rit5ur -riv5el -riv3et -riv3i -r3j -r3ket -rk4le -rk4lin -r1l -rle4 -r2led -r4lig -r4lis -rl5ish -r3lo4 -r1m -rma5c -r2me -r3men -rm5ers -rm3ing -r4ming. -r4mio -r3mit -r4my -r4nar -r3nel -r4ner -r5net -r3ney -r5nic -r1nis4 -r3nit -r3niv -rno4 -r4nou -r3nu -rob3l -r2oc -ro3cr -ro4e -ro1fe -ro5fil -rok2 -ro5ker -5role. -rom5ete -rom4i -rom4p -ron4al -ron4e -ro5n4is -ron4ta -1room -5root -ro3pel -rop3ic -ror3i -ro5ro -ros5per -ros4s -ro4the -ro4ty -ro4va -rov5el -rox5 -r1p -r4pea -r5pent -rp5er. -r3pet -rp4h4 -rp3ing -r3po -r1r4 -rre4c -rre4f -r4reo -rre4st -rri4o -rri4v -rron4 -rros4 -rrys4 -4rs2 -r1sa -rsa5ti -rs4c -r2se -r3sec -rse4cr -rs5er. -rs3es -rse5v2 -r1sh -r5sha -r1si -r4si4b -rson3 -r1sp -r5sw -rtach4 -r4tag -r3teb -rten4d -rte5o -r1ti -rt5ib -rti4d -r4tier -r3tig -rtil3i -rtil4l -r4tily -r4tist -r4tiv -r3tri -rtroph4 -rt4sh -ru3a -ru3e4l -ru3en -ru4gl -ru3in -rum3pl -ru2n -runk5 -run4ty -r5usc -ruti5n -rv4e -rvel4i -r3ven -rv5er. -r5vest -r3vey -r3vic -rvi4v -r3vo -r1w -ry4c -5rynge -ry3t -sa2 -2s1ab -5sack -sac3ri -s3act -5sai -salar4 -sal4m -sa5lo -sal4t -3sanc -san4de -s1ap -sa5ta -5sa3tio -sat3u -sau4 -sa5vor -5saw -4s5b -scan4t5 -sca4p -scav5 -s4ced -4scei -s4ces -sch2 -s4cho -3s4cie -5scin4d -scle5 -s4cli -scof4 -4scopy -scour5a -s1cu -4s5d -4se. -se4a -seas4 -sea5w -se2c3o -3sect -4s4ed -se4d4e -s5edl -se2g -seg3r -5sei -se1le -5self -5selv -4seme -se4mol -sen5at -4senc -sen4d -s5ened -sen5g -s5enin -4sentd -4sentl -sep3a3 -4s1er. -s4erl -ser4o -4servo -s1e4s -se5sh -ses5t -5se5um -5sev -sev3en -sew4i -5sex -4s3f -2s3g -s2h -2sh. -sh1er -5shev -sh1in -sh3io -3ship -shiv5 -sho4 -sh5old -shon3 -shor4 -short5 -4shw -si1b -s5icc -3side. -5sides -5sidi -si5diz -4signa -sil4e -4sily -2s1in -s2ina -5sine. -s3ing -1sio -5sion -sion5a -si2r -sir5a -1sis -3sitio -5siu -1siv -5siz -sk2 -4ske -s3ket -sk5ine -sk5ing -s1l2 -s3lat -s2le -slith5 -2s1m -s3ma -small3 -sman3 -smel4 -s5men -5smith -smol5d4 -s1n4 -1so -so4ce -soft3 -so4lab -sol3d2 -so3lic -5solv -3som -3s4on. -sona4 -son4g -s4op -5sophic -s5ophiz -s5ophy -sor5c -sor5d -4sov -so5vi -2spa -5spai -spa4n -spen4d -2s5peo -2sper -s2phe -3spher -spho5 -spil4 -sp5ing -4spio -s4ply -s4pon -spor4 -4spot -squal4l -s1r -2ss -s1sa -ssas3 -s2s5c -s3sel -s5seng -s4ses. -s5set -s1si -s4sie -ssi4er -ss5ily -s4sl -ss4li -s4sn -sspend4 -ss2t -ssur5a -ss5w -2st. -s2tag -s2tal -stam4i -5stand -s4ta4p -5stat. -s4ted -stern5i -s5tero -ste2w -stew5a -s3the -st2i -s4ti. -s5tia -s1tic -5stick -s4tie -s3tif -st3ing -5stir -s1tle -5stock -stom3a -5stone -s4top -3store -st4r -s4trad -5stratu -s4tray -s4trid -4stry -4st3w -s2ty -1su -su1al -su4b3 -su2g3 -su5is -suit3 -s4ul -su2m -sum3i -su2n -su2r -4sv -sw2 -4swo -s4y -4syc -3syl -syn5o -sy5rin -1ta -3ta. -2tab -ta5bles -5taboliz -4taci -ta5do -4taf4 -tai5lo -ta2l -ta5la -tal5en -tal3i -4talk -tal4lis -ta5log -ta5mo -tan4de -tanta3 -ta5per -ta5pl -tar4a -4tarc -4tare -ta3riz -tas4e -ta5sy -4tatic -ta4tur -taun4 -tav4 -2taw -tax4is -2t1b -4tc -t4ch -tch5et -4t1d -4te. -tead4i -4teat -tece4 -5tect -2t1ed -te5di -1tee -teg4 -te5ger -te5gi -3tel. -teli4 -5tels -te2ma2 -tem3at -3tenan -3tenc -3tend -4tenes -1tent -ten4tag -1teo -te4p -te5pe -ter3c -5ter3d -1teri -ter5ies -ter3is -teri5za -5ternit -ter5v -4tes. -4tess -t3ess. -teth5e -3teu -3tex -4tey -2t1f -4t1g -2th. -than4 -th2e -4thea -th3eas -the5at -the3is -3thet -th5ic. -th5ica -4thil -5think -4thl -th5ode -5thodic -4thoo -thor5it -tho5riz -2ths -1tia -ti4ab -ti4ato -2ti2b -4tick -t4ico -t4ic1u -5tidi -3tien -tif2 -ti5fy -2tig -5tigu -till5in -1tim -4timp -tim5ul -2t1in -t2ina -3tine. -3tini -1tio -ti5oc -tion5ee -5tiq -ti3sa -3tise -tis4m -ti5so -tis4p -5tistica -ti3tl -ti4u -1tiv -tiv4a -1tiz -ti3za -ti3zen -2tl -t5la -tlan4 -3tle. -3tled -3tles. -t5let. -t5lo -4t1m -tme4 -2t1n2 -1to -to3b -to5crat -4todo -2tof -to2gr -to5ic -to2ma -tom4b -to3my -ton4ali -to3nat -4tono -4tony -to2ra -to3rie -tor5iz -tos2 -5tour -4tout -to3war -4t1p -1tra -tra3b -tra5ch -traci4 -trac4it -trac4te -tras4 -tra5ven -trav5es5 -tre5f -tre4m -trem5i -5tria -tri5ces -5tricia -4trics -2trim -tri4v -tro5mi -tron5i -4trony -tro5phe -tro3sp -tro3v -tru5i -trus4 -4t1s2 -t4sc -tsh4 -t4sw -4t3t2 -t4tes -t5to -ttu4 -1tu -tu1a -tu3ar -tu4bi -tud2 -4tue -4tuf4 -5tu3i -3tum -tu4nis -2t3up. -3ture -5turi -tur3is -tur5o -tu5ry -3tus -4tv -tw4 -4t1wa -twis4 -4two -1ty -4tya -2tyl -type3 -ty5ph -4tz -tz4e -4uab -uac4 -ua5na -uan4i -uar5ant -uar2d -uar3i -uar3t -u1at -uav4 -ub4e -u4bel -u3ber -u4bero -u1b4i -u4b5ing -u3ble. -u3ca -uci4b -uc4it -ucle3 -u3cr -u3cu -u4cy -ud5d -ud3er -ud5est -udev4 -u1dic -ud3ied -ud3ies -ud5is -u5dit -u4don -ud4si -u4du -u4ene -uens4 -uen4te -uer4il -3ufa -u3fl -ugh3en -ug5in -2ui2 -uil5iz -ui4n -u1ing -uir4m -uita4 -uiv3 -uiv4er. -u5j -4uk -u1la -ula5b -u5lati -ulch4 -5ulche -ul3der -ul4e -u1len -ul4gi -ul2i -u5lia -ul3ing -ul5ish -ul4lar -ul4li4b -ul4lis -4ul3m -u1l4o -4uls -uls5es -ul1ti -ultra3 -4ultu -u3lu -ul5ul -ul5v -um5ab -um4bi -um4bly -u1mi -u4m3ing -umor5o -um2p -unat4 -u2ne -un4er -u1ni -un4im -u2nin -un5ish -uni3v -un3s4 -un4sw -unt3ab -un4ter. -un4tes -unu4 -un5y -un5z -u4ors -u5os -u1ou -u1pe -uper5s -u5pia -up3ing -u3pl -up3p -upport5 -upt5ib -uptu4 -u1ra -4ura. -u4rag -u4ras -ur4be -urc4 -ur1d -ure5at -ur4fer -ur4fr -u3rif -uri4fic -ur1in -u3rio -u1rit -ur3iz -ur2l -url5ing. -ur4no -uros4 -ur4pe -ur4pi -urs5er -ur5tes -ur3the -urti4 -ur4tie -u3ru -2us -u5sad -u5san -us4ap -usc2 -us3ci -use5a -u5sia -u3sic -us4lin -us1p -us5sl -us5tere -us1tr -u2su -usur4 -uta4b -u3tat -4ute. -4utel -4uten -uten4i -4u1t2i -uti5liz -u3tine -ut3ing -ution5a -u4tis -5u5tiz -u4t1l -ut5of -uto5g -uto5matic -u5ton -u4tou -uts4 -u3u -uu4m -u1v2 -uxu3 -uz4e -1va -5va. -2v1a4b -vac5il -vac3u -vag4 -va4ge -va5lie -val5o -val1u -va5mo -va5niz -va5pi -var5ied -3vat -4ve. -4ved -veg3 -v3el. -vel3li -ve4lo -v4ely -ven3om -v5enue -v4erd -5vere. -v4erel -v3eren -ver5enc -v4eres -ver3ie -vermi4n -3verse -ver3th -v4e2s -4ves. -ves4te -ve4te -vet3er -ve4ty -vi5ali -5vian -5vide. -5vided -4v3iden -5vides -5vidi -v3if -vi5gn -vik4 -2vil -5vilit -v3i3liz -v1in -4vi4na -v2inc -vin5d -4ving -vio3l -v3io4r -vi1ou -vi4p -vi5ro -vis3it -vi3so -vi3su -4viti -vit3r -4vity -3viv -5vo. -voi4 -3vok -vo4la -v5ole -5volt -3volv -vom5i -vor5ab -vori4 -vo4ry -vo4ta -4votee -4vv4 -v4y -w5abl -2wac -wa5ger -wag5o -wait5 -w5al. -wam4 -war4t -was4t -wa1te -wa5ver -w1b -wea5rie -weath3 -wed4n -weet3 -wee5v -wel4l -w1er -west3 -w3ev -whi4 -wi2 -wil2 -will5in -win4de -win4g -wir4 -3wise -with3 -wiz5 -w4k -wl4es -wl3in -w4no -1wo2 -wom1 -wo5ven -w5p -wra4 -wri4 -writa4 -w3sh -ws4l -ws4pe -w5s4t -4wt -wy4 -x1a -xac5e -x4ago -xam3 -x4ap -xas5 -x3c2 -x1e -xe4cuto -x2ed -xer4i -xe5ro -x1h -xhi2 -xhil5 -xhu4 -x3i -xi5a -xi5c -xi5di -x4ime -xi5miz -x3o -x4ob -x3p -xpan4d -xpecto5 -xpe3d -x1t2 -x3ti -x1u -xu3a -xx4 -y5ac -3yar4 -y5at -y1b -y1c -y2ce -yc5er -y3ch -ych4e -ycom4 -ycot4 -y1d -y5ee -y1er -y4erf -yes4 -ye4t -y5gi -4y3h -y1i -y3la -ylla5bl -y3lo -y5lu -ymbol5 -yme4 -ympa3 -yn3chr -yn5d -yn5g -yn5ic -5ynx -y1o4 -yo5d -y4o5g -yom4 -yo5net -y4ons -y4os -y4ped -yper5 -yp3i -y3po -y4poc -yp2ta -y5pu -yra5m -yr5ia -y3ro -yr4r -ys4c -y3s2e -ys3ica -ys3io -3ysis -y4so -yss4 -ys1t -ys3ta -ysur4 -y3thin -yt3ic -y1w -za1 -z5a2b -zar2 -4zb -2ze -ze4n -ze4p -z1er -ze3ro -zet4 -2z1i -z4il -z4is -5zl -4zm -1zo -zo4m -zo5ol -zte4 -4z1z2 -z4zy -} -\hyphenation{ % Do NOT make any alterations to this list! --- DEK -as-so-ciate -as-so-ciates -dec-li-na-tion -oblig-a-tory -phil-an-thropic -present -presents -project -projects -reci-procity -re-cog-ni-zance -ref-or-ma-tion -ret-ri-bu-tion -ta-ble -} -\endinput +% The Plain TeX hyphenation tables [NOT TO BE CHANGED IN ANY WAY!]
+\patterns{ % just type <return> if you're not using INITEX
+.ach4
+.ad4der
+.af1t
+.al3t
+.am5at
+.an5c
+.ang4
+.ani5m
+.ant4
+.an3te
+.anti5s
+.ar5s
+.ar4tie
+.ar4ty
+.as3c
+.as1p
+.as1s
+.aster5
+.atom5
+.au1d
+.av4i
+.awn4
+.ba4g
+.ba5na
+.bas4e
+.ber4
+.be5ra
+.be3sm
+.be5sto
+.bri2
+.but4ti
+.cam4pe
+.can5c
+.capa5b
+.car5ol
+.ca4t
+.ce4la
+.ch4
+.chill5i
+.ci2
+.cit5r
+.co3e
+.co4r
+.cor5ner
+.de4moi
+.de3o
+.de3ra
+.de3ri
+.des4c
+.dictio5
+.do4t
+.du4c
+.dumb5
+.earth5
+.eas3i
+.eb4
+.eer4
+.eg2
+.el5d
+.el3em
+.enam3
+.en3g
+.en3s
+.eq5ui5t
+.er4ri
+.es3
+.eu3
+.eye5
+.fes3
+.for5mer
+.ga2
+.ge2
+.gen3t4
+.ge5og
+.gi5a
+.gi4b
+.go4r
+.hand5i
+.han5k
+.he2
+.hero5i
+.hes3
+.het3
+.hi3b
+.hi3er
+.hon5ey
+.hon3o
+.hov5
+.id4l
+.idol3
+.im3m
+.im5pin
+.in1
+.in3ci
+.ine2
+.in2k
+.in3s
+.ir5r
+.is4i
+.ju3r
+.la4cy
+.la4m
+.lat5er
+.lath5
+.le2
+.leg5e
+.len4
+.lep5
+.lev1
+.li4g
+.lig5a
+.li2n
+.li3o
+.li4t
+.mag5a5
+.mal5o
+.man5a
+.mar5ti
+.me2
+.mer3c
+.me5ter
+.mis1
+.mist5i
+.mon3e
+.mo3ro
+.mu5ta
+.muta5b
+.ni4c
+.od2
+.odd5
+.of5te
+.or5ato
+.or3c
+.or1d
+.or3t
+.os3
+.os4tl
+.oth3
+.out3
+.ped5al
+.pe5te
+.pe5tit
+.pi4e
+.pio5n
+.pi2t
+.pre3m
+.ra4c
+.ran4t
+.ratio5na
+.ree2
+.re5mit
+.res2
+.re5stat
+.ri4g
+.rit5u
+.ro4q
+.ros5t
+.row5d
+.ru4d
+.sci3e
+.self5
+.sell5
+.se2n
+.se5rie
+.sh2
+.si2
+.sing4
+.st4
+.sta5bl
+.sy2
+.ta4
+.te4
+.ten5an
+.th2
+.ti2
+.til4
+.tim5o5
+.ting4
+.tin5k
+.ton4a
+.to4p
+.top5i
+.tou5s
+.trib5ut
+.un1a
+.un3ce
+.under5
+.un1e
+.un5k
+.un5o
+.un3u
+.up3
+.ure3
+.us5a
+.ven4de
+.ve5ra
+.wil5i
+.ye4
+4ab.
+a5bal
+a5ban
+abe2
+ab5erd
+abi5a
+ab5it5ab
+ab5lat
+ab5o5liz
+4abr
+ab5rog
+ab3ul
+a4car
+ac5ard
+ac5aro
+a5ceou
+ac1er
+a5chet
+4a2ci
+a3cie
+ac1in
+a3cio
+ac5rob
+act5if
+ac3ul
+ac4um
+a2d
+ad4din
+ad5er.
+2adi
+a3dia
+ad3ica
+adi4er
+a3dio
+a3dit
+a5diu
+ad4le
+ad3ow
+ad5ran
+ad4su
+4adu
+a3duc
+ad5um
+ae4r
+aeri4e
+a2f
+aff4
+a4gab
+aga4n
+ag5ell
+age4o
+4ageu
+ag1i
+4ag4l
+ag1n
+a2go
+3agog
+ag3oni
+a5guer
+ag5ul
+a4gy
+a3ha
+a3he
+ah4l
+a3ho
+ai2
+a5ia
+a3ic.
+ai5ly
+a4i4n
+ain5in
+ain5o
+ait5en
+a1j
+ak1en
+al5ab
+al3ad
+a4lar
+4aldi
+2ale
+al3end
+a4lenti
+a5le5o
+al1i
+al4ia.
+ali4e
+al5lev
+4allic
+4alm
+a5log.
+a4ly.
+4alys
+5a5lyst
+5alyt
+3alyz
+4ama
+am5ab
+am3ag
+ama5ra
+am5asc
+a4matis
+a4m5ato
+am5era
+am3ic
+am5if
+am5ily
+am1in
+ami4no
+a2mo
+a5mon
+amor5i
+amp5en
+a2n
+an3age
+3analy
+a3nar
+an3arc
+anar4i
+a3nati
+4and
+ande4s
+an3dis
+an1dl
+an4dow
+a5nee
+a3nen
+an5est.
+a3neu
+2ang
+ang5ie
+an1gl
+a4n1ic
+a3nies
+an3i3f
+an4ime
+a5nimi
+a5nine
+an3io
+a3nip
+an3ish
+an3it
+a3niu
+an4kli
+5anniz
+ano4
+an5ot
+anoth5
+an2sa
+an4sco
+an4sn
+an2sp
+ans3po
+an4st
+an4sur
+antal4
+an4tie
+4anto
+an2tr
+an4tw
+an3ua
+an3ul
+a5nur
+4ao
+apar4
+ap5at
+ap5ero
+a3pher
+4aphi
+a4pilla
+ap5illar
+ap3in
+ap3ita
+a3pitu
+a2pl
+apoc5
+ap5ola
+apor5i
+apos3t
+aps5es
+a3pu
+aque5
+2a2r
+ar3act
+a5rade
+ar5adis
+ar3al
+a5ramete
+aran4g
+ara3p
+ar4at
+a5ratio
+ar5ativ
+a5rau
+ar5av4
+araw4
+arbal4
+ar4chan
+ar5dine
+ar4dr
+ar5eas
+a3ree
+ar3ent
+a5ress
+ar4fi
+ar4fl
+ar1i
+ar5ial
+ar3ian
+a3riet
+ar4im
+ar5inat
+ar3io
+ar2iz
+ar2mi
+ar5o5d
+a5roni
+a3roo
+ar2p
+ar3q
+arre4
+ar4sa
+ar2sh
+4as.
+as4ab
+as3ant
+ashi4
+a5sia.
+a3sib
+a3sic
+5a5si4t
+ask3i
+as4l
+a4soc
+as5ph
+as4sh
+as3ten
+as1tr
+asur5a
+a2ta
+at3abl
+at5ac
+at3alo
+at5ap
+ate5c
+at5ech
+at3ego
+at3en.
+at3era
+ater5n
+a5terna
+at3est
+at5ev
+4ath
+ath5em
+a5then
+at4ho
+ath5om
+4ati.
+a5tia
+at5i5b
+at1ic
+at3if
+ation5ar
+at3itu
+a4tog
+a2tom
+at5omiz
+a4top
+a4tos
+a1tr
+at5rop
+at4sk
+at4tag
+at5te
+at4th
+a2tu
+at5ua
+at5ue
+at3ul
+at3ura
+a2ty
+au4b
+augh3
+au3gu
+au4l2
+aun5d
+au3r
+au5sib
+aut5en
+au1th
+a2va
+av3ag
+a5van
+ave4no
+av3era
+av5ern
+av5ery
+av1i
+avi4er
+av3ig
+av5oc
+a1vor
+3away
+aw3i
+aw4ly
+aws4
+ax4ic
+ax4id
+ay5al
+aye4
+ays4
+azi4er
+azz5i
+5ba.
+bad5ger
+ba4ge
+bal1a
+ban5dag
+ban4e
+ban3i
+barbi5
+bari4a
+bas4si
+1bat
+ba4z
+2b1b
+b2be
+b3ber
+bbi4na
+4b1d
+4be.
+beak4
+beat3
+4be2d
+be3da
+be3de
+be3di
+be3gi
+be5gu
+1bel
+be1li
+be3lo
+4be5m
+be5nig
+be5nu
+4bes4
+be3sp
+be5str
+3bet
+bet5iz
+be5tr
+be3tw
+be3w
+be5yo
+2bf
+4b3h
+bi2b
+bi4d
+3bie
+bi5en
+bi4er
+2b3if
+1bil
+bi3liz
+bina5r4
+bin4d
+bi5net
+bi3ogr
+bi5ou
+bi2t
+3bi3tio
+bi3tr
+3bit5ua
+b5itz
+b1j
+bk4
+b2l2
+blath5
+b4le.
+blen4
+5blesp
+b3lis
+b4lo
+blun4t
+4b1m
+4b3n
+bne5g
+3bod
+bod3i
+bo4e
+bol3ic
+bom4bi
+bon4a
+bon5at
+3boo
+5bor.
+4b1ora
+bor5d
+5bore
+5bori
+5bos4
+b5ota
+both5
+bo4to
+bound3
+4bp
+4brit
+broth3
+2b5s2
+bsor4
+2bt
+bt4l
+b4to
+b3tr
+buf4fer
+bu4ga
+bu3li
+bumi4
+bu4n
+bunt4i
+bu3re
+bus5ie
+buss4e
+5bust
+4buta
+3butio
+b5uto
+b1v
+4b5w
+5by.
+bys4
+1ca
+cab3in
+ca1bl
+cach4
+ca5den
+4cag4
+2c5ah
+ca3lat
+cal4la
+call5in
+4calo
+can5d
+can4e
+can4ic
+can5is
+can3iz
+can4ty
+cany4
+ca5per
+car5om
+cast5er
+cas5tig
+4casy
+ca4th
+4cativ
+cav5al
+c3c
+ccha5
+cci4a
+ccompa5
+ccon4
+ccou3t
+2ce.
+4ced.
+4ceden
+3cei
+5cel.
+3cell
+1cen
+3cenc
+2cen4e
+4ceni
+3cent
+3cep
+ce5ram
+4cesa
+3cessi
+ces5si5b
+ces5t
+cet4
+c5e4ta
+cew4
+2ch
+4ch.
+4ch3ab
+5chanic
+ch5a5nis
+che2
+cheap3
+4ched
+che5lo
+3chemi
+ch5ene
+ch3er.
+ch3ers
+4ch1in
+5chine.
+ch5iness
+5chini
+5chio
+3chit
+chi2z
+3cho2
+ch4ti
+1ci
+3cia
+ci2a5b
+cia5r
+ci5c
+4cier
+5cific.
+4cii
+ci4la
+3cili
+2cim
+2cin
+c4ina
+3cinat
+cin3em
+c1ing
+c5ing.
+5cino
+cion4
+4cipe
+ci3ph
+4cipic
+4cista
+4cisti
+2c1it
+cit3iz
+5ciz
+ck1
+ck3i
+1c4l4
+4clar
+c5laratio
+5clare
+cle4m
+4clic
+clim4
+cly4
+c5n
+1co
+co5ag
+coe2
+2cog
+co4gr
+coi4
+co3inc
+col5i
+5colo
+col3or
+com5er
+con4a
+c4one
+con3g
+con5t
+co3pa
+cop3ic
+co4pl
+4corb
+coro3n
+cos4e
+cov1
+cove4
+cow5a
+coz5e
+co5zi
+c1q
+cras5t
+5crat.
+5cratic
+cre3at
+5cred
+4c3reta
+cre4v
+cri2
+cri5f
+c4rin
+cris4
+5criti
+cro4pl
+crop5o
+cros4e
+cru4d
+4c3s2
+2c1t
+cta4b
+ct5ang
+c5tant
+c2te
+c3ter
+c4ticu
+ctim3i
+ctu4r
+c4tw
+cud5
+c4uf
+c4ui
+cu5ity
+5culi
+cul4tis
+3cultu
+cu2ma
+c3ume
+cu4mi
+3cun
+cu3pi
+cu5py
+cur5a4b
+cu5ria
+1cus
+cuss4i
+3c4ut
+cu4tie
+4c5utiv
+4cutr
+1cy
+cze4
+1d2a
+5da.
+2d3a4b
+dach4
+4daf
+2dag
+da2m2
+dan3g
+dard5
+dark5
+4dary
+3dat
+4dativ
+4dato
+5dav4
+dav5e
+5day
+d1b
+d5c
+d1d4
+2de.
+deaf5
+deb5it
+de4bon
+decan4
+de4cil
+de5com
+2d1ed
+4dee.
+de5if
+deli4e
+del5i5q
+de5lo
+d4em
+5dem.
+3demic
+dem5ic.
+de5mil
+de4mons
+demor5
+1den
+de4nar
+de3no
+denti5f
+de3nu
+de1p
+de3pa
+depi4
+de2pu
+d3eq
+d4erh
+5derm
+dern5iz
+der5s
+des2
+d2es.
+de1sc
+de2s5o
+des3ti
+de3str
+de4su
+de1t
+de2to
+de1v
+dev3il
+4dey
+4d1f
+d4ga
+d3ge4t
+dg1i
+d2gy
+d1h2
+5di.
+1d4i3a
+dia5b
+di4cam
+d4ice
+3dict
+3did
+5di3en
+d1if
+di3ge
+di4lato
+d1in
+1dina
+3dine.
+5dini
+di5niz
+1dio
+dio5g
+di4pl
+dir2
+di1re
+dirt5i
+dis1
+5disi
+d4is3t
+d2iti
+1di1v
+d1j
+d5k2
+4d5la
+3dle.
+3dled
+3dles.
+4dless
+2d3lo
+4d5lu
+2dly
+d1m
+4d1n4
+1do
+3do.
+do5de
+5doe
+2d5of
+d4og
+do4la
+doli4
+do5lor
+dom5iz
+do3nat
+doni4
+doo3d
+dop4p
+d4or
+3dos
+4d5out
+do4v
+3dox
+d1p
+1dr
+drag5on
+4drai
+dre4
+drea5r
+5dren
+dri4b
+dril4
+dro4p
+4drow
+5drupli
+4dry
+2d1s2
+ds4p
+d4sw
+d4sy
+d2th
+1du
+d1u1a
+du2c
+d1uca
+duc5er
+4duct.
+4ducts
+du5el
+du4g
+d3ule
+dum4be
+du4n
+4dup
+du4pe
+d1v
+d1w
+d2y
+5dyn
+dy4se
+dys5p
+e1a4b
+e3act
+ead1
+ead5ie
+ea4ge
+ea5ger
+ea4l
+eal5er
+eal3ou
+eam3er
+e5and
+ear3a
+ear4c
+ear5es
+ear4ic
+ear4il
+ear5k
+ear2t
+eart3e
+ea5sp
+e3ass
+east3
+ea2t
+eat5en
+eath3i
+e5atif
+e4a3tu
+ea2v
+eav3en
+eav5i
+eav5o
+2e1b
+e4bel.
+e4bels
+e4ben
+e4bit
+e3br
+e4cad
+ecan5c
+ecca5
+e1ce
+ec5essa
+ec2i
+e4cib
+ec5ificat
+ec5ifie
+ec5ify
+ec3im
+eci4t
+e5cite
+e4clam
+e4clus
+e2col
+e4comm
+e4compe
+e4conc
+e2cor
+ec3ora
+eco5ro
+e1cr
+e4crem
+ec4tan
+ec4te
+e1cu
+e4cul
+ec3ula
+2e2da
+4ed3d
+e4d1er
+ede4s
+4edi
+e3dia
+ed3ib
+ed3ica
+ed3im
+ed1it
+edi5z
+4edo
+e4dol
+edon2
+e4dri
+e4dul
+ed5ulo
+ee2c
+eed3i
+ee2f
+eel3i
+ee4ly
+ee2m
+ee4na
+ee4p1
+ee2s4
+eest4
+ee4ty
+e5ex
+e1f
+e4f3ere
+1eff
+e4fic
+5efici
+efil4
+e3fine
+ef5i5nite
+3efit
+efor5es
+e4fuse.
+4egal
+eger4
+eg5ib
+eg4ic
+eg5ing
+e5git5
+eg5n
+e4go.
+e4gos
+eg1ul
+e5gur
+5egy
+e1h4
+eher4
+ei2
+e5ic
+ei5d
+eig2
+ei5gl
+e3imb
+e3inf
+e1ing
+e5inst
+eir4d
+eit3e
+ei3th
+e5ity
+e1j
+e4jud
+ej5udi
+eki4n
+ek4la
+e1la
+e4la.
+e4lac
+elan4d
+el5ativ
+e4law
+elaxa4
+e3lea
+el5ebra
+5elec
+e4led
+el3ega
+e5len
+e4l1er
+e1les
+el2f
+el2i
+e3libe
+e4l5ic.
+el3ica
+e3lier
+el5igib
+e5lim
+e4l3ing
+e3lio
+e2lis
+el5ish
+e3liv3
+4ella
+el4lab
+ello4
+e5loc
+el5og
+el3op.
+el2sh
+el4ta
+e5lud
+el5ug
+e4mac
+e4mag
+e5man
+em5ana
+em5b
+e1me
+e2mel
+e4met
+em3ica
+emi4e
+em5igra
+em1in2
+em5ine
+em3i3ni
+e4mis
+em5ish
+e5miss
+em3iz
+5emniz
+emo4g
+emoni5o
+em3pi
+e4mul
+em5ula
+emu3n
+e3my
+en5amo
+e4nant
+ench4er
+en3dic
+e5nea
+e5nee
+en3em
+en5ero
+en5esi
+en5est
+en3etr
+e3new
+en5ics
+e5nie
+e5nil
+e3nio
+en3ish
+en3it
+e5niu
+5eniz
+4enn
+4eno
+eno4g
+e4nos
+en3ov
+en4sw
+ent5age
+4enthes
+en3ua
+en5uf
+e3ny.
+4en3z
+e5of
+eo2g
+e4oi4
+e3ol
+eop3ar
+e1or
+eo3re
+eo5rol
+eos4
+e4ot
+eo4to
+e5out
+e5ow
+e2pa
+e3pai
+ep5anc
+e5pel
+e3pent
+ep5etitio
+ephe4
+e4pli
+e1po
+e4prec
+ep5reca
+e4pred
+ep3reh
+e3pro
+e4prob
+ep4sh
+ep5ti5b
+e4put
+ep5uta
+e1q
+equi3l
+e4q3ui3s
+er1a
+era4b
+4erand
+er3ar
+4erati.
+2erb
+er4bl
+er3ch
+er4che
+2ere.
+e3real
+ere5co
+ere3in
+er5el.
+er3emo
+er5ena
+er5ence
+4erene
+er3ent
+ere4q
+er5ess
+er3est
+eret4
+er1h
+er1i
+e1ria4
+5erick
+e3rien
+eri4er
+er3ine
+e1rio
+4erit
+er4iu
+eri4v
+e4riva
+er3m4
+er4nis
+4ernit
+5erniz
+er3no
+2ero
+er5ob
+e5roc
+ero4r
+er1ou
+er1s
+er3set
+ert3er
+4ertl
+er3tw
+4eru
+eru4t
+5erwau
+e1s4a
+e4sage.
+e4sages
+es2c
+e2sca
+es5can
+e3scr
+es5cu
+e1s2e
+e2sec
+es5ecr
+es5enc
+e4sert.
+e4serts
+e4serva
+4esh
+e3sha
+esh5en
+e1si
+e2sic
+e2sid
+es5iden
+es5igna
+e2s5im
+es4i4n
+esis4te
+esi4u
+e5skin
+es4mi
+e2sol
+es3olu
+e2son
+es5ona
+e1sp
+es3per
+es5pira
+es4pre
+2ess
+es4si4b
+estan4
+es3tig
+es5tim
+4es2to
+e3ston
+2estr
+e5stro
+estruc5
+e2sur
+es5urr
+es4w
+eta4b
+eten4d
+e3teo
+ethod3
+et1ic
+e5tide
+etin4
+eti4no
+e5tir
+e5titio
+et5itiv
+4etn
+et5ona
+e3tra
+e3tre
+et3ric
+et5rif
+et3rog
+et5ros
+et3ua
+et5ym
+et5z
+4eu
+e5un
+e3up
+eu3ro
+eus4
+eute4
+euti5l
+eu5tr
+eva2p5
+e2vas
+ev5ast
+e5vea
+ev3ell
+evel3o
+e5veng
+even4i
+ev1er
+e5verb
+e1vi
+ev3id
+evi4l
+e4vin
+evi4v
+e5voc
+e5vu
+e1wa
+e4wag
+e5wee
+e3wh
+ewil5
+ew3ing
+e3wit
+1exp
+5eyc
+5eye.
+eys4
+1fa
+fa3bl
+fab3r
+fa4ce
+4fag
+fain4
+fall5e
+4fa4ma
+fam5is
+5far
+far5th
+fa3ta
+fa3the
+4fato
+fault5
+4f5b
+4fd
+4fe.
+feas4
+feath3
+fe4b
+4feca
+5fect
+2fed
+fe3li
+fe4mo
+fen2d
+fend5e
+fer1
+5ferr
+fev4
+4f1f
+f4fes
+f4fie
+f5fin.
+f2f5is
+f4fly
+f2fy
+4fh
+1fi
+fi3a
+2f3ic.
+4f3ical
+f3ican
+4ficate
+f3icen
+fi3cer
+fic4i
+5ficia
+5ficie
+4fics
+fi3cu
+fi5del
+fight5
+fil5i
+fill5in
+4fily
+2fin
+5fina
+fin2d5
+fi2ne
+f1in3g
+fin4n
+fis4ti
+f4l2
+f5less
+flin4
+flo3re
+f2ly5
+4fm
+4fn
+1fo
+5fon
+fon4de
+fon4t
+fo2r
+fo5rat
+for5ay
+fore5t
+for4i
+fort5a
+fos5
+4f5p
+fra4t
+f5rea
+fres5c
+fri2
+fril4
+frol5
+2f3s
+2ft
+f4to
+f2ty
+3fu
+fu5el
+4fug
+fu4min
+fu5ne
+fu3ri
+fusi4
+fus4s
+4futa
+1fy
+1ga
+gaf4
+5gal.
+3gali
+ga3lo
+2gam
+ga5met
+g5amo
+gan5is
+ga3niz
+gani5za
+4gano
+gar5n4
+gass4
+gath3
+4gativ
+4gaz
+g3b
+gd4
+2ge.
+2ged
+geez4
+gel4in
+ge5lis
+ge5liz
+4gely
+1gen
+ge4nat
+ge5niz
+4geno
+4geny
+1geo
+ge3om
+g4ery
+5gesi
+geth5
+4geto
+ge4ty
+ge4v
+4g1g2
+g2ge
+g3ger
+gglu5
+ggo4
+gh3in
+gh5out
+gh4to
+5gi.
+1gi4a
+gia5r
+g1ic
+5gicia
+g4ico
+gien5
+5gies.
+gil4
+g3imen
+3g4in.
+gin5ge
+5g4ins
+5gio
+3gir
+gir4l
+g3isl
+gi4u
+5giv
+3giz
+gl2
+gla4
+glad5i
+5glas
+1gle
+gli4b
+g3lig
+3glo
+glo3r
+g1m
+g4my
+gn4a
+g4na.
+gnet4t
+g1ni
+g2nin
+g4nio
+g1no
+g4non
+1go
+3go.
+gob5
+5goe
+3g4o4g
+go3is
+gon2
+4g3o3na
+gondo5
+go3ni
+5goo
+go5riz
+gor5ou
+5gos.
+gov1
+g3p
+1gr
+4grada
+g4rai
+gran2
+5graph.
+g5rapher
+5graphic
+4graphy
+4gray
+gre4n
+4gress.
+4grit
+g4ro
+gruf4
+gs2
+g5ste
+gth3
+gu4a
+3guard
+2gue
+5gui5t
+3gun
+3gus
+4gu4t
+g3w
+1gy
+2g5y3n
+gy5ra
+h3ab4l
+hach4
+hae4m
+hae4t
+h5agu
+ha3la
+hala3m
+ha4m
+han4ci
+han4cy
+5hand.
+han4g
+hang5er
+hang5o
+h5a5niz
+han4k
+han4te
+hap3l
+hap5t
+ha3ran
+ha5ras
+har2d
+hard3e
+har4le
+harp5en
+har5ter
+has5s
+haun4
+5haz
+haz3a
+h1b
+1head
+3hear
+he4can
+h5ecat
+h4ed
+he5do5
+he3l4i
+hel4lis
+hel4ly
+h5elo
+hem4p
+he2n
+hena4
+hen5at
+heo5r
+hep5
+h4era
+hera3p
+her4ba
+here5a
+h3ern
+h5erou
+h3ery
+h1es
+he2s5p
+he4t
+het4ed
+heu4
+h1f
+h1h
+hi5an
+hi4co
+high5
+h4il2
+himer4
+h4ina
+hion4e
+hi4p
+hir4l
+hi3ro
+hir4p
+hir4r
+his3el
+his4s
+hith5er
+hi2v
+4hk
+4h1l4
+hlan4
+h2lo
+hlo3ri
+4h1m
+hmet4
+2h1n
+h5odiz
+h5ods
+ho4g
+hoge4
+hol5ar
+3hol4e
+ho4ma
+home3
+hon4a
+ho5ny
+3hood
+hoon4
+hor5at
+ho5ris
+hort3e
+ho5ru
+hos4e
+ho5sen
+hos1p
+1hous
+house3
+hov5el
+4h5p
+4hr4
+hree5
+hro5niz
+hro3po
+4h1s2
+h4sh
+h4tar
+ht1en
+ht5es
+h4ty
+hu4g
+hu4min
+hun5ke
+hun4t
+hus3t4
+hu4t
+h1w
+h4wart
+hy3pe
+hy3ph
+hy2s
+2i1a
+i2al
+iam4
+iam5ete
+i2an
+4ianc
+ian3i
+4ian4t
+ia5pe
+iass4
+i4ativ
+ia4tric
+i4atu
+ibe4
+ib3era
+ib5ert
+ib5ia
+ib3in
+ib5it.
+ib5ite
+i1bl
+ib3li
+i5bo
+i1br
+i2b5ri
+i5bun
+4icam
+5icap
+4icar
+i4car.
+i4cara
+icas5
+i4cay
+iccu4
+4iceo
+4ich
+2ici
+i5cid
+ic5ina
+i2cip
+ic3ipa
+i4cly
+i2c5oc
+4i1cr
+5icra
+i4cry
+ic4te
+ictu2
+ic4t3ua
+ic3ula
+ic4um
+ic5uo
+i3cur
+2id
+i4dai
+id5anc
+id5d
+ide3al
+ide4s
+i2di
+id5ian
+idi4ar
+i5die
+id3io
+idi5ou
+id1it
+id5iu
+i3dle
+i4dom
+id3ow
+i4dr
+i2du
+id5uo
+2ie4
+ied4e
+5ie5ga
+ield3
+ien5a4
+ien4e
+i5enn
+i3enti
+i1er.
+i3esc
+i1est
+i3et
+4if.
+if5ero
+iff5en
+if4fr
+4ific.
+i3fie
+i3fl
+4ift
+2ig
+iga5b
+ig3era
+ight3i
+4igi
+i3gib
+ig3il
+ig3in
+ig3it
+i4g4l
+i2go
+ig3or
+ig5ot
+i5gre
+igu5i
+ig1ur
+i3h
+4i5i4
+i3j
+4ik
+i1la
+il3a4b
+i4lade
+i2l5am
+ila5ra
+i3leg
+il1er
+ilev4
+il5f
+il1i
+il3ia
+il2ib
+il3io
+il4ist
+2ilit
+il2iz
+ill5ab
+4iln
+il3oq
+il4ty
+il5ur
+il3v
+i4mag
+im3age
+ima5ry
+imenta5r
+4imet
+im1i
+im5ida
+imi5le
+i5mini
+4imit
+im4ni
+i3mon
+i2mu
+im3ula
+2in.
+i4n3au
+4inav
+incel4
+in3cer
+4ind
+in5dling
+2ine
+i3nee
+iner4ar
+i5ness
+4inga
+4inge
+in5gen
+4ingi
+in5gling
+4ingo
+4ingu
+2ini
+i5ni.
+i4nia
+in3io
+in1is
+i5nite.
+5initio
+in3ity
+4ink
+4inl
+2inn
+2i1no
+i4no4c
+ino4s
+i4not
+2ins
+in3se
+insur5a
+2int.
+2in4th
+in1u
+i5nus
+4iny
+2io
+4io.
+ioge4
+io2gr
+i1ol
+io4m
+ion3at
+ion4ery
+ion3i
+io5ph
+ior3i
+i4os
+io5th
+i5oti
+io4to
+i4our
+2ip
+ipe4
+iphras4
+ip3i
+ip4ic
+ip4re4
+ip3ul
+i3qua
+iq5uef
+iq3uid
+iq3ui3t
+4ir
+i1ra
+ira4b
+i4rac
+ird5e
+ire4de
+i4ref
+i4rel4
+i4res
+ir5gi
+ir1i
+iri5de
+ir4is
+iri3tu
+5i5r2iz
+ir4min
+iro4g
+5iron.
+ir5ul
+2is.
+is5ag
+is3ar
+isas5
+2is1c
+is3ch
+4ise
+is3er
+3isf
+is5han
+is3hon
+ish5op
+is3ib
+isi4d
+i5sis
+is5itiv
+4is4k
+islan4
+4isms
+i2so
+iso5mer
+is1p
+is2pi
+is4py
+4is1s
+is4sal
+issen4
+is4ses
+is4ta.
+is1te
+is1ti
+ist4ly
+4istral
+i2su
+is5us
+4ita.
+ita4bi
+i4tag
+4ita5m
+i3tan
+i3tat
+2ite
+it3era
+i5teri
+it4es
+2ith
+i1ti
+4itia
+4i2tic
+it3ica
+5i5tick
+it3ig
+it5ill
+i2tim
+2itio
+4itis
+i4tism
+i2t5o5m
+4iton
+i4tram
+it5ry
+4itt
+it3uat
+i5tud
+it3ul
+4itz.
+i1u
+2iv
+iv3ell
+iv3en.
+i4v3er.
+i4vers.
+iv5il.
+iv5io
+iv1it
+i5vore
+iv3o3ro
+i4v3ot
+4i5w
+ix4o
+4iy
+4izar
+izi4
+5izont
+5ja
+jac4q
+ja4p
+1je
+jer5s
+4jestie
+4jesty
+jew3
+jo4p
+5judg
+3ka.
+k3ab
+k5ag
+kais4
+kal4
+k1b
+k2ed
+1kee
+ke4g
+ke5li
+k3en4d
+k1er
+kes4
+k3est.
+ke4ty
+k3f
+kh4
+k1i
+5ki.
+5k2ic
+k4ill
+kilo5
+k4im
+k4in.
+kin4de
+k5iness
+kin4g
+ki4p
+kis4
+k5ish
+kk4
+k1l
+4kley
+4kly
+k1m
+k5nes
+1k2no
+ko5r
+kosh4
+k3ou
+kro5n
+4k1s2
+k4sc
+ks4l
+k4sy
+k5t
+k1w
+lab3ic
+l4abo
+laci4
+l4ade
+la3dy
+lag4n
+lam3o
+3land
+lan4dl
+lan5et
+lan4te
+lar4g
+lar3i
+las4e
+la5tan
+4lateli
+4lativ
+4lav
+la4v4a
+2l1b
+lbin4
+4l1c2
+lce4
+l3ci
+2ld
+l2de
+ld4ere
+ld4eri
+ldi4
+ld5is
+l3dr
+l4dri
+le2a
+le4bi
+left5
+5leg.
+5legg
+le4mat
+lem5atic
+4len.
+3lenc
+5lene.
+1lent
+le3ph
+le4pr
+lera5b
+ler4e
+3lerg
+3l4eri
+l4ero
+les2
+le5sco
+5lesq
+3less
+5less.
+l3eva
+lev4er.
+lev4era
+lev4ers
+3ley
+4leye
+2lf
+l5fr
+4l1g4
+l5ga
+lgar3
+l4ges
+lgo3
+2l3h
+li4ag
+li2am
+liar5iz
+li4as
+li4ato
+li5bi
+5licio
+li4cor
+4lics
+4lict.
+l4icu
+l3icy
+l3ida
+lid5er
+3lidi
+lif3er
+l4iff
+li4fl
+5ligate
+3ligh
+li4gra
+3lik
+4l4i4l
+lim4bl
+lim3i
+li4mo
+l4im4p
+l4ina
+1l4ine
+lin3ea
+lin3i
+link5er
+li5og
+4l4iq
+lis4p
+l1it
+l2it.
+5litica
+l5i5tics
+liv3er
+l1iz
+4lj
+lka3
+l3kal
+lka4t
+l1l
+l4law
+l2le
+l5lea
+l3lec
+l3leg
+l3lel
+l3le4n
+l3le4t
+ll2i
+l2lin4
+l5lina
+ll4o
+lloqui5
+ll5out
+l5low
+2lm
+l5met
+lm3ing
+l4mod
+lmon4
+2l1n2
+3lo.
+lob5al
+lo4ci
+4lof
+3logic
+l5ogo
+3logu
+lom3er
+5long
+lon4i
+l3o3niz
+lood5
+5lope.
+lop3i
+l3opm
+lora4
+lo4rato
+lo5rie
+lor5ou
+5los.
+los5et
+5losophiz
+5losophy
+los4t
+lo4ta
+loun5d
+2lout
+4lov
+2lp
+lpa5b
+l3pha
+l5phi
+lp5ing
+l3pit
+l4pl
+l5pr
+4l1r
+2l1s2
+l4sc
+l2se
+l4sie
+4lt
+lt5ag
+ltane5
+l1te
+lten4
+ltera4
+lth3i
+l5ties.
+ltis4
+l1tr
+ltu2
+ltur3a
+lu5a
+lu3br
+luch4
+lu3ci
+lu3en
+luf4
+lu5id
+lu4ma
+5lumi
+l5umn.
+5lumnia
+lu3o
+luo3r
+4lup
+luss4
+lus3te
+1lut
+l5ven
+l5vet4
+2l1w
+1ly
+4lya
+4lyb
+ly5me
+ly3no
+2lys4
+l5yse
+1ma
+2mab
+ma2ca
+ma5chine
+ma4cl
+mag5in
+5magn
+2mah
+maid5
+4mald
+ma3lig
+ma5lin
+mal4li
+mal4ty
+5mania
+man5is
+man3iz
+4map
+ma5rine.
+ma5riz
+mar4ly
+mar3v
+ma5sce
+mas4e
+mas1t
+5mate
+math3
+ma3tis
+4matiza
+4m1b
+mba4t5
+m5bil
+m4b3ing
+mbi4v
+4m5c
+4me.
+2med
+4med.
+5media
+me3die
+m5e5dy
+me2g
+mel5on
+mel4t
+me2m
+mem1o3
+1men
+men4a
+men5ac
+men4de
+4mene
+men4i
+mens4
+mensu5
+3ment
+men4te
+me5on
+m5ersa
+2mes
+3mesti
+me4ta
+met3al
+me1te
+me5thi
+m4etr
+5metric
+me5trie
+me3try
+me4v
+4m1f
+2mh
+5mi.
+mi3a
+mid4a
+mid4g
+mig4
+3milia
+m5i5lie
+m4ill
+min4a
+3mind
+m5inee
+m4ingl
+min5gli
+m5ingly
+min4t
+m4inu
+miot4
+m2is
+mis4er.
+mis5l
+mis4ti
+m5istry
+4mith
+m2iz
+4mk
+4m1l
+m1m
+mma5ry
+4m1n
+mn4a
+m4nin
+mn4o
+1mo
+4mocr
+5mocratiz
+mo2d1
+mo4go
+mois2
+moi5se
+4mok
+mo5lest
+mo3me
+mon5et
+mon5ge
+moni3a
+mon4ism
+mon4ist
+mo3niz
+monol4
+mo3ny.
+mo2r
+4mora.
+mos2
+mo5sey
+mo3sp
+moth3
+m5ouf
+3mous
+mo2v
+4m1p
+mpara5
+mpa5rab
+mpar5i
+m3pet
+mphas4
+m2pi
+mpi4a
+mp5ies
+m4p1in
+m5pir
+mp5is
+mpo3ri
+mpos5ite
+m4pous
+mpov5
+mp4tr
+m2py
+4m3r
+4m1s2
+m4sh
+m5si
+4mt
+1mu
+mula5r4
+5mult
+multi3
+3mum
+mun2
+4mup
+mu4u
+4mw
+1na
+2n1a2b
+n4abu
+4nac.
+na4ca
+n5act
+nag5er.
+nak4
+na4li
+na5lia
+4nalt
+na5mit
+n2an
+nanci4
+nan4it
+nank4
+nar3c
+4nare
+nar3i
+nar4l
+n5arm
+n4as
+nas4c
+nas5ti
+n2at
+na3tal
+nato5miz
+n2au
+nau3se
+3naut
+nav4e
+4n1b4
+ncar5
+n4ces.
+n3cha
+n5cheo
+n5chil
+n3chis
+nc1in
+nc4it
+ncour5a
+n1cr
+n1cu
+n4dai
+n5dan
+n1de
+nd5est.
+ndi4b
+n5d2if
+n1dit
+n3diz
+n5duc
+ndu4r
+nd2we
+2ne.
+n3ear
+ne2b
+neb3u
+ne2c
+5neck
+2ned
+ne4gat
+neg5ativ
+5nege
+ne4la
+nel5iz
+ne5mi
+ne4mo
+1nen
+4nene
+3neo
+ne4po
+ne2q
+n1er
+nera5b
+n4erar
+n2ere
+n4er5i
+ner4r
+1nes
+2nes.
+4nesp
+2nest
+4nesw
+3netic
+ne4v
+n5eve
+ne4w
+n3f
+n4gab
+n3gel
+nge4n4e
+n5gere
+n3geri
+ng5ha
+n3gib
+ng1in
+n5git
+n4gla
+ngov4
+ng5sh
+n1gu
+n4gum
+n2gy
+4n1h4
+nha4
+nhab3
+nhe4
+3n4ia
+ni3an
+ni4ap
+ni3ba
+ni4bl
+ni4d
+ni5di
+ni4er
+ni2fi
+ni5ficat
+n5igr
+nik4
+n1im
+ni3miz
+n1in
+5nine.
+nin4g
+ni4o
+5nis.
+nis4ta
+n2it
+n4ith
+3nitio
+n3itor
+ni3tr
+n1j
+4nk2
+n5kero
+n3ket
+nk3in
+n1kl
+4n1l
+n5m
+nme4
+nmet4
+4n1n2
+nne4
+nni3al
+nni4v
+nob4l
+no3ble
+n5ocl
+4n3o2d
+3noe
+4nog
+noge4
+nois5i
+no5l4i
+5nologis
+3nomic
+n5o5miz
+no4mo
+no3my
+no4n
+non4ag
+non5i
+n5oniz
+4nop
+5nop5o5li
+nor5ab
+no4rary
+4nosc
+nos4e
+nos5t
+no5ta
+1nou
+3noun
+nov3el3
+nowl3
+n1p4
+npi4
+npre4c
+n1q
+n1r
+nru4
+2n1s2
+ns5ab
+nsati4
+ns4c
+n2se
+n4s3es
+nsid1
+nsig4
+n2sl
+ns3m
+n4soc
+ns4pe
+n5spi
+nsta5bl
+n1t
+nta4b
+nter3s
+nt2i
+n5tib
+nti4er
+nti2f
+n3tine
+n4t3ing
+nti4p
+ntrol5li
+nt4s
+ntu3me
+nu1a
+nu4d
+nu5en
+nuf4fe
+n3uin
+3nu3it
+n4um
+nu1me
+n5umi
+3nu4n
+n3uo
+nu3tr
+n1v2
+n1w4
+nym4
+nyp4
+4nz
+n3za
+4oa
+oad3
+o5a5les
+oard3
+oas4e
+oast5e
+oat5i
+ob3a3b
+o5bar
+obe4l
+o1bi
+o2bin
+ob5ing
+o3br
+ob3ul
+o1ce
+och4
+o3chet
+ocif3
+o4cil
+o4clam
+o4cod
+oc3rac
+oc5ratiz
+ocre3
+5ocrit
+octor5a
+oc3ula
+o5cure
+od5ded
+od3ic
+odi3o
+o2do4
+odor3
+od5uct.
+od5ucts
+o4el
+o5eng
+o3er
+oe4ta
+o3ev
+o2fi
+of5ite
+ofit4t
+o2g5a5r
+og5ativ
+o4gato
+o1ge
+o5gene
+o5geo
+o4ger
+o3gie
+1o1gis
+og3it
+o4gl
+o5g2ly
+3ogniz
+o4gro
+ogu5i
+1ogy
+2ogyn
+o1h2
+ohab5
+oi2
+oic3es
+oi3der
+oiff4
+oig4
+oi5let
+o3ing
+oint5er
+o5ism
+oi5son
+oist5en
+oi3ter
+o5j
+2ok
+o3ken
+ok5ie
+o1la
+o4lan
+olass4
+ol2d
+old1e
+ol3er
+o3lesc
+o3let
+ol4fi
+ol2i
+o3lia
+o3lice
+ol5id.
+o3li4f
+o5lil
+ol3ing
+o5lio
+o5lis.
+ol3ish
+o5lite
+o5litio
+o5liv
+olli4e
+ol5ogiz
+olo4r
+ol5pl
+ol2t
+ol3ub
+ol3ume
+ol3un
+o5lus
+ol2v
+o2ly
+om5ah
+oma5l
+om5atiz
+om2be
+om4bl
+o2me
+om3ena
+om5erse
+o4met
+om5etry
+o3mia
+om3ic.
+om3ica
+o5mid
+om1in
+o5mini
+5ommend
+omo4ge
+o4mon
+om3pi
+ompro5
+o2n
+on1a
+on4ac
+o3nan
+on1c
+3oncil
+2ond
+on5do
+o3nen
+on5est
+on4gu
+on1ic
+o3nio
+on1is
+o5niu
+on3key
+on4odi
+on3omy
+on3s
+onspi4
+onspir5a
+onsu4
+onten4
+on3t4i
+ontif5
+on5um
+onva5
+oo2
+ood5e
+ood5i
+oo4k
+oop3i
+o3ord
+oost5
+o2pa
+ope5d
+op1er
+3opera
+4operag
+2oph
+o5phan
+o5pher
+op3ing
+o3pit
+o5pon
+o4posi
+o1pr
+op1u
+opy5
+o1q
+o1ra
+o5ra.
+o4r3ag
+or5aliz
+or5ange
+ore5a
+o5real
+or3ei
+ore5sh
+or5est.
+orew4
+or4gu
+4o5ria
+or3ica
+o5ril
+or1in
+o1rio
+or3ity
+o3riu
+or2mi
+orn2e
+o5rof
+or3oug
+or5pe
+3orrh
+or4se
+ors5en
+orst4
+or3thi
+or3thy
+or4ty
+o5rum
+o1ry
+os3al
+os2c
+os4ce
+o3scop
+4oscopi
+o5scr
+os4i4e
+os5itiv
+os3ito
+os3ity
+osi4u
+os4l
+o2so
+os4pa
+os4po
+os2ta
+o5stati
+os5til
+os5tit
+o4tan
+otele4g
+ot3er.
+ot5ers
+o4tes
+4oth
+oth5esi
+oth3i4
+ot3ic.
+ot5ica
+o3tice
+o3tif
+o3tis
+oto5s
+ou2
+ou3bl
+ouch5i
+ou5et
+ou4l
+ounc5er
+oun2d
+ou5v
+ov4en
+over4ne
+over3s
+ov4ert
+o3vis
+oviti4
+o5v4ol
+ow3der
+ow3el
+ow5est
+ow1i
+own5i
+o4wo
+oy1a
+1pa
+pa4ca
+pa4ce
+pac4t
+p4ad
+5pagan
+p3agat
+p4ai
+pain4
+p4al
+pan4a
+pan3el
+pan4ty
+pa3ny
+pa1p
+pa4pu
+para5bl
+par5age
+par5di
+3pare
+par5el
+p4a4ri
+par4is
+pa2te
+pa5ter
+5pathic
+pa5thy
+pa4tric
+pav4
+3pay
+4p1b
+pd4
+4pe.
+3pe4a
+pear4l
+pe2c
+2p2ed
+3pede
+3pedi
+pedia4
+ped4ic
+p4ee
+pee4d
+pek4
+pe4la
+peli4e
+pe4nan
+p4enc
+pen4th
+pe5on
+p4era.
+pera5bl
+p4erag
+p4eri
+peri5st
+per4mal
+perme5
+p4ern
+per3o
+per3ti
+pe5ru
+per1v
+pe2t
+pe5ten
+pe5tiz
+4pf
+4pg
+4ph.
+phar5i
+phe3no
+ph4er
+ph4es.
+ph1ic
+5phie
+ph5ing
+5phisti
+3phiz
+ph2l
+3phob
+3phone
+5phoni
+pho4r
+4phs
+ph3t
+5phu
+1phy
+pi3a
+pian4
+pi4cie
+pi4cy
+p4id
+p5ida
+pi3de
+5pidi
+3piec
+pi3en
+pi4grap
+pi3lo
+pi2n
+p4in.
+pind4
+p4ino
+3pi1o
+pion4
+p3ith
+pi5tha
+pi2tu
+2p3k2
+1p2l2
+3plan
+plas5t
+pli3a
+pli5er
+4plig
+pli4n
+ploi4
+plu4m
+plum4b
+4p1m
+2p3n
+po4c
+5pod.
+po5em
+po3et5
+5po4g
+poin2
+5point
+poly5t
+po4ni
+po4p
+1p4or
+po4ry
+1pos
+pos1s
+p4ot
+po4ta
+5poun
+4p1p
+ppa5ra
+p2pe
+p4ped
+p5pel
+p3pen
+p3per
+p3pet
+ppo5site
+pr2
+pray4e
+5preci
+pre5co
+pre3em
+pref5ac
+pre4la
+pre3r
+p3rese
+3press
+pre5ten
+pre3v
+5pri4e
+prin4t3
+pri4s
+pris3o
+p3roca
+prof5it
+pro3l
+pros3e
+pro1t
+2p1s2
+p2se
+ps4h
+p4sib
+2p1t
+pt5a4b
+p2te
+p2th
+pti3m
+ptu4r
+p4tw
+pub3
+pue4
+puf4
+pul3c
+pu4m
+pu2n
+pur4r
+5pus
+pu2t
+5pute
+put3er
+pu3tr
+put4ted
+put4tin
+p3w
+qu2
+qua5v
+2que.
+3quer
+3quet
+2rab
+ra3bi
+rach4e
+r5acl
+raf5fi
+raf4t
+r2ai
+ra4lo
+ram3et
+r2ami
+rane5o
+ran4ge
+r4ani
+ra5no
+rap3er
+3raphy
+rar5c
+rare4
+rar5ef
+4raril
+r2as
+ration4
+rau4t
+ra5vai
+rav3el
+ra5zie
+r1b
+r4bab
+r4bag
+rbi2
+rbi4f
+r2bin
+r5bine
+rb5ing.
+rb4o
+r1c
+r2ce
+rcen4
+r3cha
+rch4er
+r4ci4b
+rc4it
+rcum3
+r4dal
+rd2i
+rdi4a
+rdi4er
+rdin4
+rd3ing
+2re.
+re1al
+re3an
+re5arr
+5reav
+re4aw
+r5ebrat
+rec5oll
+rec5ompe
+re4cre
+2r2ed
+re1de
+re3dis
+red5it
+re4fac
+re2fe
+re5fer.
+re3fi
+re4fy
+reg3is
+re5it
+re1li
+re5lu
+r4en4ta
+ren4te
+re1o
+re5pin
+re4posi
+re1pu
+r1er4
+r4eri
+rero4
+re5ru
+r4es.
+re4spi
+ress5ib
+res2t
+re5stal
+re3str
+re4ter
+re4ti4z
+re3tri
+reu2
+re5uti
+rev2
+re4val
+rev3el
+r5ev5er.
+re5vers
+re5vert
+re5vil
+rev5olu
+re4wh
+r1f
+rfu4
+r4fy
+rg2
+rg3er
+r3get
+r3gic
+rgi4n
+rg3ing
+r5gis
+r5git
+r1gl
+rgo4n
+r3gu
+rh4
+4rh.
+4rhal
+ri3a
+ria4b
+ri4ag
+r4ib
+rib3a
+ric5as
+r4ice
+4rici
+5ricid
+ri4cie
+r4ico
+rid5er
+ri3enc
+ri3ent
+ri1er
+ri5et
+rig5an
+5rigi
+ril3iz
+5riman
+rim5i
+3rimo
+rim4pe
+r2ina
+5rina.
+rin4d
+rin4e
+rin4g
+ri1o
+5riph
+riph5e
+ri2pl
+rip5lic
+r4iq
+r2is
+r4is.
+ris4c
+r3ish
+ris4p
+ri3ta3b
+r5ited.
+rit5er.
+rit5ers
+rit3ic
+ri2tu
+rit5ur
+riv5el
+riv3et
+riv3i
+r3j
+r3ket
+rk4le
+rk4lin
+r1l
+rle4
+r2led
+r4lig
+r4lis
+rl5ish
+r3lo4
+r1m
+rma5c
+r2me
+r3men
+rm5ers
+rm3ing
+r4ming.
+r4mio
+r3mit
+r4my
+r4nar
+r3nel
+r4ner
+r5net
+r3ney
+r5nic
+r1nis4
+r3nit
+r3niv
+rno4
+r4nou
+r3nu
+rob3l
+r2oc
+ro3cr
+ro4e
+ro1fe
+ro5fil
+rok2
+ro5ker
+5role.
+rom5ete
+rom4i
+rom4p
+ron4al
+ron4e
+ro5n4is
+ron4ta
+1room
+5root
+ro3pel
+rop3ic
+ror3i
+ro5ro
+ros5per
+ros4s
+ro4the
+ro4ty
+ro4va
+rov5el
+rox5
+r1p
+r4pea
+r5pent
+rp5er.
+r3pet
+rp4h4
+rp3ing
+r3po
+r1r4
+rre4c
+rre4f
+r4reo
+rre4st
+rri4o
+rri4v
+rron4
+rros4
+rrys4
+4rs2
+r1sa
+rsa5ti
+rs4c
+r2se
+r3sec
+rse4cr
+rs5er.
+rs3es
+rse5v2
+r1sh
+r5sha
+r1si
+r4si4b
+rson3
+r1sp
+r5sw
+rtach4
+r4tag
+r3teb
+rten4d
+rte5o
+r1ti
+rt5ib
+rti4d
+r4tier
+r3tig
+rtil3i
+rtil4l
+r4tily
+r4tist
+r4tiv
+r3tri
+rtroph4
+rt4sh
+ru3a
+ru3e4l
+ru3en
+ru4gl
+ru3in
+rum3pl
+ru2n
+runk5
+run4ty
+r5usc
+ruti5n
+rv4e
+rvel4i
+r3ven
+rv5er.
+r5vest
+r3vey
+r3vic
+rvi4v
+r3vo
+r1w
+ry4c
+5rynge
+ry3t
+sa2
+2s1ab
+5sack
+sac3ri
+s3act
+5sai
+salar4
+sal4m
+sa5lo
+sal4t
+3sanc
+san4de
+s1ap
+sa5ta
+5sa3tio
+sat3u
+sau4
+sa5vor
+5saw
+4s5b
+scan4t5
+sca4p
+scav5
+s4ced
+4scei
+s4ces
+sch2
+s4cho
+3s4cie
+5scin4d
+scle5
+s4cli
+scof4
+4scopy
+scour5a
+s1cu
+4s5d
+4se.
+se4a
+seas4
+sea5w
+se2c3o
+3sect
+4s4ed
+se4d4e
+s5edl
+se2g
+seg3r
+5sei
+se1le
+5self
+5selv
+4seme
+se4mol
+sen5at
+4senc
+sen4d
+s5ened
+sen5g
+s5enin
+4sentd
+4sentl
+sep3a3
+4s1er.
+s4erl
+ser4o
+4servo
+s1e4s
+se5sh
+ses5t
+5se5um
+5sev
+sev3en
+sew4i
+5sex
+4s3f
+2s3g
+s2h
+2sh.
+sh1er
+5shev
+sh1in
+sh3io
+3ship
+shiv5
+sho4
+sh5old
+shon3
+shor4
+short5
+4shw
+si1b
+s5icc
+3side.
+5sides
+5sidi
+si5diz
+4signa
+sil4e
+4sily
+2s1in
+s2ina
+5sine.
+s3ing
+1sio
+5sion
+sion5a
+si2r
+sir5a
+1sis
+3sitio
+5siu
+1siv
+5siz
+sk2
+4ske
+s3ket
+sk5ine
+sk5ing
+s1l2
+s3lat
+s2le
+slith5
+2s1m
+s3ma
+small3
+sman3
+smel4
+s5men
+5smith
+smol5d4
+s1n4
+1so
+so4ce
+soft3
+so4lab
+sol3d2
+so3lic
+5solv
+3som
+3s4on.
+sona4
+son4g
+s4op
+5sophic
+s5ophiz
+s5ophy
+sor5c
+sor5d
+4sov
+so5vi
+2spa
+5spai
+spa4n
+spen4d
+2s5peo
+2sper
+s2phe
+3spher
+spho5
+spil4
+sp5ing
+4spio
+s4ply
+s4pon
+spor4
+4spot
+squal4l
+s1r
+2ss
+s1sa
+ssas3
+s2s5c
+s3sel
+s5seng
+s4ses.
+s5set
+s1si
+s4sie
+ssi4er
+ss5ily
+s4sl
+ss4li
+s4sn
+sspend4
+ss2t
+ssur5a
+ss5w
+2st.
+s2tag
+s2tal
+stam4i
+5stand
+s4ta4p
+5stat.
+s4ted
+stern5i
+s5tero
+ste2w
+stew5a
+s3the
+st2i
+s4ti.
+s5tia
+s1tic
+5stick
+s4tie
+s3tif
+st3ing
+5stir
+s1tle
+5stock
+stom3a
+5stone
+s4top
+3store
+st4r
+s4trad
+5stratu
+s4tray
+s4trid
+4stry
+4st3w
+s2ty
+1su
+su1al
+su4b3
+su2g3
+su5is
+suit3
+s4ul
+su2m
+sum3i
+su2n
+su2r
+4sv
+sw2
+4swo
+s4y
+4syc
+3syl
+syn5o
+sy5rin
+1ta
+3ta.
+2tab
+ta5bles
+5taboliz
+4taci
+ta5do
+4taf4
+tai5lo
+ta2l
+ta5la
+tal5en
+tal3i
+4talk
+tal4lis
+ta5log
+ta5mo
+tan4de
+tanta3
+ta5per
+ta5pl
+tar4a
+4tarc
+4tare
+ta3riz
+tas4e
+ta5sy
+4tatic
+ta4tur
+taun4
+tav4
+2taw
+tax4is
+2t1b
+4tc
+t4ch
+tch5et
+4t1d
+4te.
+tead4i
+4teat
+tece4
+5tect
+2t1ed
+te5di
+1tee
+teg4
+te5ger
+te5gi
+3tel.
+teli4
+5tels
+te2ma2
+tem3at
+3tenan
+3tenc
+3tend
+4tenes
+1tent
+ten4tag
+1teo
+te4p
+te5pe
+ter3c
+5ter3d
+1teri
+ter5ies
+ter3is
+teri5za
+5ternit
+ter5v
+4tes.
+4tess
+t3ess.
+teth5e
+3teu
+3tex
+4tey
+2t1f
+4t1g
+2th.
+than4
+th2e
+4thea
+th3eas
+the5at
+the3is
+3thet
+th5ic.
+th5ica
+4thil
+5think
+4thl
+th5ode
+5thodic
+4thoo
+thor5it
+tho5riz
+2ths
+1tia
+ti4ab
+ti4ato
+2ti2b
+4tick
+t4ico
+t4ic1u
+5tidi
+3tien
+tif2
+ti5fy
+2tig
+5tigu
+till5in
+1tim
+4timp
+tim5ul
+2t1in
+t2ina
+3tine.
+3tini
+1tio
+ti5oc
+tion5ee
+5tiq
+ti3sa
+3tise
+tis4m
+ti5so
+tis4p
+5tistica
+ti3tl
+ti4u
+1tiv
+tiv4a
+1tiz
+ti3za
+ti3zen
+2tl
+t5la
+tlan4
+3tle.
+3tled
+3tles.
+t5let.
+t5lo
+4t1m
+tme4
+2t1n2
+1to
+to3b
+to5crat
+4todo
+2tof
+to2gr
+to5ic
+to2ma
+tom4b
+to3my
+ton4ali
+to3nat
+4tono
+4tony
+to2ra
+to3rie
+tor5iz
+tos2
+5tour
+4tout
+to3war
+4t1p
+1tra
+tra3b
+tra5ch
+traci4
+trac4it
+trac4te
+tras4
+tra5ven
+trav5es5
+tre5f
+tre4m
+trem5i
+5tria
+tri5ces
+5tricia
+4trics
+2trim
+tri4v
+tro5mi
+tron5i
+4trony
+tro5phe
+tro3sp
+tro3v
+tru5i
+trus4
+4t1s2
+t4sc
+tsh4
+t4sw
+4t3t2
+t4tes
+t5to
+ttu4
+1tu
+tu1a
+tu3ar
+tu4bi
+tud2
+4tue
+4tuf4
+5tu3i
+3tum
+tu4nis
+2t3up.
+3ture
+5turi
+tur3is
+tur5o
+tu5ry
+3tus
+4tv
+tw4
+4t1wa
+twis4
+4two
+1ty
+4tya
+2tyl
+type3
+ty5ph
+4tz
+tz4e
+4uab
+uac4
+ua5na
+uan4i
+uar5ant
+uar2d
+uar3i
+uar3t
+u1at
+uav4
+ub4e
+u4bel
+u3ber
+u4bero
+u1b4i
+u4b5ing
+u3ble.
+u3ca
+uci4b
+uc4it
+ucle3
+u3cr
+u3cu
+u4cy
+ud5d
+ud3er
+ud5est
+udev4
+u1dic
+ud3ied
+ud3ies
+ud5is
+u5dit
+u4don
+ud4si
+u4du
+u4ene
+uens4
+uen4te
+uer4il
+3ufa
+u3fl
+ugh3en
+ug5in
+2ui2
+uil5iz
+ui4n
+u1ing
+uir4m
+uita4
+uiv3
+uiv4er.
+u5j
+4uk
+u1la
+ula5b
+u5lati
+ulch4
+5ulche
+ul3der
+ul4e
+u1len
+ul4gi
+ul2i
+u5lia
+ul3ing
+ul5ish
+ul4lar
+ul4li4b
+ul4lis
+4ul3m
+u1l4o
+4uls
+uls5es
+ul1ti
+ultra3
+4ultu
+u3lu
+ul5ul
+ul5v
+um5ab
+um4bi
+um4bly
+u1mi
+u4m3ing
+umor5o
+um2p
+unat4
+u2ne
+un4er
+u1ni
+un4im
+u2nin
+un5ish
+uni3v
+un3s4
+un4sw
+unt3ab
+un4ter.
+un4tes
+unu4
+un5y
+un5z
+u4ors
+u5os
+u1ou
+u1pe
+uper5s
+u5pia
+up3ing
+u3pl
+up3p
+upport5
+upt5ib
+uptu4
+u1ra
+4ura.
+u4rag
+u4ras
+ur4be
+urc4
+ur1d
+ure5at
+ur4fer
+ur4fr
+u3rif
+uri4fic
+ur1in
+u3rio
+u1rit
+ur3iz
+ur2l
+url5ing.
+ur4no
+uros4
+ur4pe
+ur4pi
+urs5er
+ur5tes
+ur3the
+urti4
+ur4tie
+u3ru
+2us
+u5sad
+u5san
+us4ap
+usc2
+us3ci
+use5a
+u5sia
+u3sic
+us4lin
+us1p
+us5sl
+us5tere
+us1tr
+u2su
+usur4
+uta4b
+u3tat
+4ute.
+4utel
+4uten
+uten4i
+4u1t2i
+uti5liz
+u3tine
+ut3ing
+ution5a
+u4tis
+5u5tiz
+u4t1l
+ut5of
+uto5g
+uto5matic
+u5ton
+u4tou
+uts4
+u3u
+uu4m
+u1v2
+uxu3
+uz4e
+1va
+5va.
+2v1a4b
+vac5il
+vac3u
+vag4
+va4ge
+va5lie
+val5o
+val1u
+va5mo
+va5niz
+va5pi
+var5ied
+3vat
+4ve.
+4ved
+veg3
+v3el.
+vel3li
+ve4lo
+v4ely
+ven3om
+v5enue
+v4erd
+5vere.
+v4erel
+v3eren
+ver5enc
+v4eres
+ver3ie
+vermi4n
+3verse
+ver3th
+v4e2s
+4ves.
+ves4te
+ve4te
+vet3er
+ve4ty
+vi5ali
+5vian
+5vide.
+5vided
+4v3iden
+5vides
+5vidi
+v3if
+vi5gn
+vik4
+2vil
+5vilit
+v3i3liz
+v1in
+4vi4na
+v2inc
+vin5d
+4ving
+vio3l
+v3io4r
+vi1ou
+vi4p
+vi5ro
+vis3it
+vi3so
+vi3su
+4viti
+vit3r
+4vity
+3viv
+5vo.
+voi4
+3vok
+vo4la
+v5ole
+5volt
+3volv
+vom5i
+vor5ab
+vori4
+vo4ry
+vo4ta
+4votee
+4vv4
+v4y
+w5abl
+2wac
+wa5ger
+wag5o
+wait5
+w5al.
+wam4
+war4t
+was4t
+wa1te
+wa5ver
+w1b
+wea5rie
+weath3
+wed4n
+weet3
+wee5v
+wel4l
+w1er
+west3
+w3ev
+whi4
+wi2
+wil2
+will5in
+win4de
+win4g
+wir4
+3wise
+with3
+wiz5
+w4k
+wl4es
+wl3in
+w4no
+1wo2
+wom1
+wo5ven
+w5p
+wra4
+wri4
+writa4
+w3sh
+ws4l
+ws4pe
+w5s4t
+4wt
+wy4
+x1a
+xac5e
+x4ago
+xam3
+x4ap
+xas5
+x3c2
+x1e
+xe4cuto
+x2ed
+xer4i
+xe5ro
+x1h
+xhi2
+xhil5
+xhu4
+x3i
+xi5a
+xi5c
+xi5di
+x4ime
+xi5miz
+x3o
+x4ob
+x3p
+xpan4d
+xpecto5
+xpe3d
+x1t2
+x3ti
+x1u
+xu3a
+xx4
+y5ac
+3yar4
+y5at
+y1b
+y1c
+y2ce
+yc5er
+y3ch
+ych4e
+ycom4
+ycot4
+y1d
+y5ee
+y1er
+y4erf
+yes4
+ye4t
+y5gi
+4y3h
+y1i
+y3la
+ylla5bl
+y3lo
+y5lu
+ymbol5
+yme4
+ympa3
+yn3chr
+yn5d
+yn5g
+yn5ic
+5ynx
+y1o4
+yo5d
+y4o5g
+yom4
+yo5net
+y4ons
+y4os
+y4ped
+yper5
+yp3i
+y3po
+y4poc
+yp2ta
+y5pu
+yra5m
+yr5ia
+y3ro
+yr4r
+ys4c
+y3s2e
+ys3ica
+ys3io
+3ysis
+y4so
+yss4
+ys1t
+ys3ta
+ysur4
+y3thin
+yt3ic
+y1w
+za1
+z5a2b
+zar2
+4zb
+2ze
+ze4n
+ze4p
+z1er
+ze3ro
+zet4
+2z1i
+z4il
+z4is
+5zl
+4zm
+1zo
+zo4m
+zo5ol
+zte4
+4z1z2
+z4zy
+}
+\hyphenation{ % Do NOT make any alterations to this list! --- DEK
+as-so-ciate
+as-so-ciates
+dec-li-na-tion
+oblig-a-tory
+phil-an-thropic
+present
+presents
+project
+projects
+reci-procity
+re-cog-ni-zance
+ref-or-ma-tion
+ret-ri-bu-tion
+ta-ble
+}
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-fr.pat b/tex/context/base/lang-fr.pat index d5edc1a39..374822e74 100644 --- a/tex/context/base/lang-fr.pat +++ b/tex/context/base/lang-fr.pat @@ -1,510 +1,511 @@ -% The FPlain TeX hyphenation tables [NOT TO BE CHANGED IN ANY WAY!] -\lccode`\'= 39 -\patterns{ % just type <return> if you're not using INITEX -1ba -1be -1bi -1bo -1bu -1by -4bes. -1b2l -4ble. -4bles. -1b2r -4bre. -4bres. -1ca -1ce -1ci -1co -1cu -1cy -4ces. -1c2h -4che. -4ches. -2chb -2chg -2chm -2chn -2chp -2chs -2cht -2chw -.ch4 -ch2l -4chle. -4chles. -ch2r -4chre. -4chres. -1c2k -4cke -4ckes. -2ckb -2ckf -2ckg -2ck3h -2ckp -2cks -2ckt -1c2l -4cle -4cles -1c2r -4cre. -4cres. -1da -1de -1di -1do -1du -1dy -4des. -d1d2h -1d2r -4dre. -4dres. -1fa -1fe -1fi -1fo -1fu -1fy -4fes. -1f2l -4fle. -4fles. -1f2r -4fre. -4fres. -1ga -1ge -1gi -1go -1gu -1gy -4ges -4gue -4gues. -1g2ha -1g2he -1g2hi -1g2ho -1g2hy -1g2l -4gle. -4gles -1g2n -4gne. -4gnes. -1g2r -4gre. -4gres. -1ha -1he -1hi -1ho -1hu -1hy -4hes. -1j -2jk -4jes. -1ka -1ke -1ki -1ko -1ku -1ky -4kes. -1k2h -.kh4 -1k2r -1la -1le -1li -1lo -1lu -1ly -4les. -1ma -1me -1mi -1mo -1mu -1my -4mes. -1na -1ne -1ni -1no -1nu -1ny -4nes. -1pa -1pi -1po -1pu -1py -4pes. -1p2h -4phe. -4phes. -ph2l -4phles. -4phles.2phn -ph2r -4phre. -4phres. -2ohs -2pht -.ph4 -1p2l -4ple. -4ples. -1p2r -4pre. -4pres. -1q -4que. -4ques. -1ra -1re -1ri -1ro -1ru -1ry -4res. -1r2h -4rhe. -4rhes. -1sa -1se -1si -1so -1su -1sy -4ses. -1s2ch -4sch. -2schs -4sche. -4sches. -.sch4 -.sh4 -1s2h -2shm -2shr -2shs -4she. -4shes. -1ta -1te -1ti -1to -1tu -1ty -4tes. -1t2h -.th4 -4the. -4thes. -2thl -2thm -2thn -th2r -2ths -4tre. -4tres. -1va -1ve -1vi -1vo -1vu -1vy -4ves. -1v2r -4vre. -4vres. -1wa -1xe -1wi -1wo -1wu -4wes. -1w2r -1za -1ze -1zi -1zo -1zu -1zy -4zes. -'a4 -'e4 -'i4 -'o4 -'u4 -'y4 -2'2 -1d' -dis2 -fis2 -gis2 -tung2s3 -lis2t -mis2 -e2s3ch -i2s3chia -i2s3chio -1alcool -1algi -i1arthr -2t3heur -2r3heur -2t3houd -2s3hom -2r3hydr -o1ioni -3ph2tis -1p2neu -1p2sych -1s2caph -1s2cop -e2s3cop -di2s3cop -1s2lav -1s2lov -1s2patia -1s2perm -1s2por -1s2piel -1s2piros -1s2tandard -ois2tas -pro2s3tt -1i1s2tat -1s2tein -1s2tigm -ois2tim -1s2tock -1s2tomos -ois2tom -ois2trad -ois2tratu -ois2triction -1s2troph -a2s3tro -apo2s3tr -u2s3tr -1s2tructu -1s2tyle -.anti1a2 -.anti1e2 -.anti2enne -.anti1s2 -'anti1a2 -'anti1e2 -'anti2enne -'anti1s2 -.bi1a2c -.nbi1au -.bio1a2 -.bi1u2 -.bi2s1a2 -.ci2s1alp -co1acc -co1acqco1a2d -co1ar -co1assoc -co1assur -co1au -co1ax -co1ef -co1en -co1ex -.con4 -.cons4 -co2nurb -.co1o2 -.co2o3lie -.di1a2cid -.di1ald -.di1a2mi -.di1a2tomi -.di1e2n -.di2s3h -.dv2s1a2 -.dy2s1i2 -.dv2s1o2 -.dy2s1u2 -.dy2s3 -.en1a2 -'en1a2 -en1i2vr -.en1o2 -'en1o2 -.eu2ria2 -'eu2ria2 -extra1 -hypera2 -hypere2 -hyperi2 -hypero2 -hypers2 -hyperu2 -hype4d1 -hypo1a2 -hypo1e2 -hypo1i2 -hypo1o2 -hypo1u2 -hypo1s2 -.in1a2 -.in2a3nit -.in2augur -.in1e2 -.in2effab -.inept -.in2er -.in2exora -.in1i2 -.in2i3miti -.in2i3q -.in2i3t -.in1o2 -.in2o3cul -.in2ond -.in1s2tab -.in1u2 -.in2uit -.in2u3l -'in1a2 -'in2a3nit -'in2augur -'in1e2 -'in2effab -'in2ept -'in2ert -'in2exora -'in1i2 -'in2i3miti -'in2i3q -'in2i3t -'in1o2 -'in2o3cul -'in2ond -'in1s2tab -'in1u2 -'in2uit -'in2u3l -.intera2 -.intere2 -.interi2 -.intero2 -.interu2 -.inters2 -.inte4r3 -'intera2 -'intere2 -'interi2 -'intero2 -'interu2 -'inters2 -'inte4r3 -.ma2lia2dres -.ma2lia2dro -.ma2liap -.ma2lia2v -.ma2lien -.ma2l1int -.ma2lioc -.ma2lio2d -.mono1a2 -.mono1e2x -.mono1i2 -.mono1o2 -.mono1u2 -.mono1s2 -.no2n1obs -omni1s2 -oxy1a2 -.pa2n1a2f -.pa2n1a2ra -.pa2n1is -.pa2n1o2ph -.pa2n1opt -.para1s2 -.pa2ria2che -.per1a2 -.per1e2 -.per1i2 -.per1u2 -per3h -.pe4r -photo1s2 -poly1a2 -pol1ye2 -.pos2t3r -.postis2 -radio1a2 -.re1s2 -.re2s3cap -.re2s3cisi -.re2s3ciso -.re2s3cou -.re2s3cri -.re2s3pect -.re2s3pir -.re2s3plend -.re2s3pons -.re2s3quil -.re2s3s -.re2s3t -.re3s4tab -.re3s4tag -.re3s4tand -.re3s4tat -.re3s4tim -.re3s4tip -.re3s4toc -.re3s4top -.re3s4tr -.re4s5trein -.re4s5trict -.re4s5trin -.re3s4tu -.re3s4ty -sesqui1a2 -.su2b1a2 -sub1s2 -.sub1ur -supero2 -supers2 -supe4r1 -.su2r1a2 -.su3r2a3t -.su2r1e2 -.su3r2eau -.su2r1int -.su2r1if -.su2r1ox -thermo1s2 -tran2s1a2 -tran3s2act -tran3s2ats -tran2s3h -tran2s1o2 -tran2s3p -tran2s1u2 -.tri1a2c -.tri1a2n -.tri1a2t -po1astre -vol2tiamp -} -\hyphenation{ % Do NOT make any alterations to this list! --- DEK -} -\endinput +% The FPlain TeX hyphenation tables [NOT TO BE CHANGED IN ANY WAY!]
+\lccode`\'= 39
+\patterns{ % just type <return> if you're not using INITEX
+1ba
+1be
+1bi
+1bo
+1bu
+1by
+4bes.
+1b2l
+4ble.
+4bles.
+1b2r
+4bre.
+4bres.
+1ca
+1ce
+1ci
+1co
+1cu
+1cy
+4ces.
+1c2h
+4che.
+4ches.
+2chb
+2chg
+2chm
+2chn
+2chp
+2chs
+2cht
+2chw
+.ch4
+ch2l
+4chle.
+4chles.
+ch2r
+4chre.
+4chres.
+1c2k
+4cke
+4ckes.
+2ckb
+2ckf
+2ckg
+2ck3h
+2ckp
+2cks
+2ckt
+1c2l
+4cle
+4cles
+1c2r
+4cre.
+4cres.
+1da
+1de
+1di
+1do
+1du
+1dy
+4des.
+d1d2h
+1d2r
+4dre.
+4dres.
+1fa
+1fe
+1fi
+1fo
+1fu
+1fy
+4fes.
+1f2l
+4fle.
+4fles.
+1f2r
+4fre.
+4fres.
+1ga
+1ge
+1gi
+1go
+1gu
+1gy
+4ges
+4gue
+4gues.
+1g2ha
+1g2he
+1g2hi
+1g2ho
+1g2hy
+1g2l
+4gle.
+4gles
+1g2n
+4gne.
+4gnes.
+1g2r
+4gre.
+4gres.
+1ha
+1he
+1hi
+1ho
+1hu
+1hy
+4hes.
+1j
+2jk
+4jes.
+1ka
+1ke
+1ki
+1ko
+1ku
+1ky
+4kes.
+1k2h
+.kh4
+1k2r
+1la
+1le
+1li
+1lo
+1lu
+1ly
+4les.
+1ma
+1me
+1mi
+1mo
+1mu
+1my
+4mes.
+1na
+1ne
+1ni
+1no
+1nu
+1ny
+4nes.
+1pa
+1pi
+1po
+1pu
+1py
+4pes.
+1p2h
+4phe.
+4phes.
+ph2l
+4phles.
+4phles.2phn
+ph2r
+4phre.
+4phres.
+2ohs
+2pht
+.ph4
+1p2l
+4ple.
+4ples.
+1p2r
+4pre.
+4pres.
+1q
+4que.
+4ques.
+1ra
+1re
+1ri
+1ro
+1ru
+1ry
+4res.
+1r2h
+4rhe.
+4rhes.
+1sa
+1se
+1si
+1so
+1su
+1sy
+4ses.
+1s2ch
+4sch.
+2schs
+4sche.
+4sches.
+.sch4
+.sh4
+1s2h
+2shm
+2shr
+2shs
+4she.
+4shes.
+1ta
+1te
+1ti
+1to
+1tu
+1ty
+4tes.
+1t2h
+.th4
+4the.
+4thes.
+2thl
+2thm
+2thn
+th2r
+2ths
+4tre.
+4tres.
+1va
+1ve
+1vi
+1vo
+1vu
+1vy
+4ves.
+1v2r
+4vre.
+4vres.
+1wa
+1xe
+1wi
+1wo
+1wu
+4wes.
+1w2r
+1za
+1ze
+1zi
+1zo
+1zu
+1zy
+4zes.
+'a4
+'e4
+'i4
+'o4
+'u4
+'y4
+2'2
+1d'
+dis2
+fis2
+gis2
+tung2s3
+lis2t
+mis2
+e2s3ch
+i2s3chia
+i2s3chio
+1alcool
+1algi
+i1arthr
+2t3heur
+2r3heur
+2t3houd
+2s3hom
+2r3hydr
+o1ioni
+3ph2tis
+1p2neu
+1p2sych
+1s2caph
+1s2cop
+e2s3cop
+di2s3cop
+1s2lav
+1s2lov
+1s2patia
+1s2perm
+1s2por
+1s2piel
+1s2piros
+1s2tandard
+ois2tas
+pro2s3tt
+1i1s2tat
+1s2tein
+1s2tigm
+ois2tim
+1s2tock
+1s2tomos
+ois2tom
+ois2trad
+ois2tratu
+ois2triction
+1s2troph
+a2s3tro
+apo2s3tr
+u2s3tr
+1s2tructu
+1s2tyle
+.anti1a2
+.anti1e2
+.anti2enne
+.anti1s2
+'anti1a2
+'anti1e2
+'anti2enne
+'anti1s2
+.bi1a2c
+.nbi1au
+.bio1a2
+.bi1u2
+.bi2s1a2
+.ci2s1alp
+co1acc
+co1acqco1a2d
+co1ar
+co1assoc
+co1assur
+co1au
+co1ax
+co1ef
+co1en
+co1ex
+.con4
+.cons4
+co2nurb
+.co1o2
+.co2o3lie
+.di1a2cid
+.di1ald
+.di1a2mi
+.di1a2tomi
+.di1e2n
+.di2s3h
+.dv2s1a2
+.dy2s1i2
+.dv2s1o2
+.dy2s1u2
+.dy2s3
+.en1a2
+'en1a2
+en1i2vr
+.en1o2
+'en1o2
+.eu2ria2
+'eu2ria2
+extra1
+hypera2
+hypere2
+hyperi2
+hypero2
+hypers2
+hyperu2
+hype4d1
+hypo1a2
+hypo1e2
+hypo1i2
+hypo1o2
+hypo1u2
+hypo1s2
+.in1a2
+.in2a3nit
+.in2augur
+.in1e2
+.in2effab
+.inept
+.in2er
+.in2exora
+.in1i2
+.in2i3miti
+.in2i3q
+.in2i3t
+.in1o2
+.in2o3cul
+.in2ond
+.in1s2tab
+.in1u2
+.in2uit
+.in2u3l
+'in1a2
+'in2a3nit
+'in2augur
+'in1e2
+'in2effab
+'in2ept
+'in2ert
+'in2exora
+'in1i2
+'in2i3miti
+'in2i3q
+'in2i3t
+'in1o2
+'in2o3cul
+'in2ond
+'in1s2tab
+'in1u2
+'in2uit
+'in2u3l
+.intera2
+.intere2
+.interi2
+.intero2
+.interu2
+.inters2
+.inte4r3
+'intera2
+'intere2
+'interi2
+'intero2
+'interu2
+'inters2
+'inte4r3
+.ma2lia2dres
+.ma2lia2dro
+.ma2liap
+.ma2lia2v
+.ma2lien
+.ma2l1int
+.ma2lioc
+.ma2lio2d
+.mono1a2
+.mono1e2x
+.mono1i2
+.mono1o2
+.mono1u2
+.mono1s2
+.no2n1obs
+omni1s2
+oxy1a2
+.pa2n1a2f
+.pa2n1a2ra
+.pa2n1is
+.pa2n1o2ph
+.pa2n1opt
+.para1s2
+.pa2ria2che
+.per1a2
+.per1e2
+.per1i2
+.per1u2
+per3h
+.pe4r
+photo1s2
+poly1a2
+pol1ye2
+.pos2t3r
+.postis2
+radio1a2
+.re1s2
+.re2s3cap
+.re2s3cisi
+.re2s3ciso
+.re2s3cou
+.re2s3cri
+.re2s3pect
+.re2s3pir
+.re2s3plend
+.re2s3pons
+.re2s3quil
+.re2s3s
+.re2s3t
+.re3s4tab
+.re3s4tag
+.re3s4tand
+.re3s4tat
+.re3s4tim
+.re3s4tip
+.re3s4toc
+.re3s4top
+.re3s4tr
+.re4s5trein
+.re4s5trict
+.re4s5trin
+.re3s4tu
+.re3s4ty
+sesqui1a2
+.su2b1a2
+sub1s2
+.sub1ur
+supero2
+supers2
+supe4r1
+.su2r1a2
+.su3r2a3t
+.su2r1e2
+.su3r2eau
+.su2r1int
+.su2r1if
+.su2r1ox
+thermo1s2
+tran2s1a2
+tran3s2act
+tran3s2ats
+tran2s3h
+tran2s1o2
+tran2s3p
+tran2s1u2
+.tri1a2c
+.tri1a2n
+.tri1a2t
+po1astre
+vol2tiamp
+}
+\hyphenation{ % Do NOT make any alterations to this list! --- DEK
+}
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-ger.tex b/tex/context/base/lang-ger.tex index 1bfa56284..569807766 100644 --- a/tex/context/base/lang-ger.tex +++ b/tex/context/base/lang-ger.tex @@ -1,535 +1,536 @@ -%D \module -%D [ file=lang-ger, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Germanic Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% Danish, Faeroese, Icelandic, Norwegian, Swedish, German, Yiddish -% Afrikaans, Dutch, English, Flemush, Frisian, Plattdeutsch - -\writestatus{loading}{Germanic Languages} - -\unprotect - -\installlanguage - [\s!nl] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\lowerleftsingleninequote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\lowerleftdoubleninequote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!dag,\ ,\v!maand,\ ,\v!jaar}, - \c!default=\s!en, - \c!status=\v!stop] - -\installlanguage - [\s!en] - [\c!spatiering=\v!ruim, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, -% \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!datum={\v!maand,\ ,\v!dag,{,\ },\v!jaar}, - \c!default=\s!en, - \c!status=\v!start] % always preloaded! - -\installlanguage - [\s!de] - [\c!spatiering=\v!opelkaar, - \c!leftsentence={\hbox{--~}}, - \c!rightsentence={\hbox{~--}}, - \c!leftsubsentence={--}, - \c!rightsubsentence={--}, - \c!leftquote=\lowerleftsingleninequote, - \c!rightquote=\upperrightsinglesixquote, - \c!leftquotation=\lowerleftdoubleninequote, - \c!rightquotation=\upperrightdoublesixquote, - \c!datum={\v!dag,{.},\ ,\v!maand,\ ,\v!jaar}, - \c!default=\s!en, - \c!status=\v!stop] - -\installlanguage - [\s!da] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!default=\s!en, - \c!status=\v!stop] - -\installlanguage - [\s!sv] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!default=\s!en, - \c!status=\v!stop] - -\installlanguage - [\s!af] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!default=\s!en, - \c!status=\v!stop] - -\installlanguage - [\s!no] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!default=\s!en, - \c!status=\v!stop] - -%D Hey look, some experiment: - -\installlanguage - [nlx] - [\c!spatiering=\v!opelkaar, - \c!default=\s!nl, - \c!status=\v!stop] - -%D For compatibility reasons we also define: - -\installlanguage [du] [\s!de] - -\let\normaldoublequote=" - -\startlanguagespecifics[\s!de] - - \installcompoundcharacter "a {\moveaccent{-.1ex}\"a\midworddiscretionary} - \installcompoundcharacter "e {\moveaccent{-.1ex}\"e\midworddiscretionary} - \installcompoundcharacter "i {\moveaccent{-.1ex}\"\i\midworddiscretionary} - \installcompoundcharacter "o {\moveaccent{-.1ex}\"o\midworddiscretionary} - \installcompoundcharacter "u {\moveaccent{-.1ex}\"u\midworddiscretionary} - \installcompoundcharacter "s {\SS} - \installcompoundcharacter "z {\SS} - - \installcompoundcharacter "A {\smashaccent\"A} - \installcompoundcharacter "E {\smashaccent\"E} - \installcompoundcharacter "I {\smashaccent\"I} - \installcompoundcharacter "O {\smashaccent\"O} - \installcompoundcharacter "U {\smashaccent\"U} - \installcompoundcharacter "Z {SZ} - \installcompoundcharacter "S {SS} - -\stoplanguagespecifics - -\startlanguagespecifics[\s!de] - - \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}} - \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}} - \installcompoundcharacter "ll {\discretionary{ll-}{l}{ll}} - \installcompoundcharacter "mm {\discretionary{mm-}{m}{mm}} - \installcompoundcharacter "nn {\discretionary{nn-}{n}{nn}} - \installcompoundcharacter "pp {\discretionary{pp-}{p}{pp}} - \installcompoundcharacter "rr {\discretionary{rr-}{r}{rr}} - \installcompoundcharacter "tt {\discretionary{tt-}{t}{tt}} - - \installcompoundcharacter "CK {\discretionary {K-}{K}{CK}} - \installcompoundcharacter "FF {\discretionary{FF-}{F}{FF}} - \installcompoundcharacter "LL {\discretionary{LL-}{L}{LL}} - \installcompoundcharacter "MM {\discretionary{MM-}{M}{MM}} - \installcompoundcharacter "NN {\discretionary{NN-}{N}{NN}} - \installcompoundcharacter "PP {\discretionary{PP-}{P}{PP}} - \installcompoundcharacter "RR {\discretionary{RR-}{R}{RR}} - \installcompoundcharacter "TT {\discretionary{TT-}{T}{TT}} - -\stoplanguagespecifics - -\startlanguagespecifics[\s!de] - - \installcompoundcharacter "` {\handlequotation\c!leftquotation} - \installcompoundcharacter "' {\handlequotation\c!rightquotation} - \installcompoundcharacter ". {\kern.1em\ignorespaces} - - \def\setupDElanguage% - {\setuplanguage - [\s!de] - [\c!leftsentence=\leftguillemot, - \c!rightsentence=\rightguillemot, - \c!leftsubsentence=\leftsubguillemot, - \c!rightsubsentence=\rightsubguillemot]} - - \installcompoundcharacter "< {{\setupDElanguage|<|}} - \installcompoundcharacter "> {{\setupDElanguage|>|}} - -\stoplanguagespecifics - -\setupheadtext [\s!en] [\v!inhoud=Contents] -\setupheadtext [\s!nl] [\v!inhoud=Inhoud] -\setupheadtext [\s!de] [\v!inhoud=Inhalt] -\setupheadtext [\s!da] [\v!inhoud=Indhold] -\setupheadtext [\s!sv] [\v!inhoud=Inneh\aa l] -\setupheadtext [\s!af] [\v!inhoud=Inhoud] -\setupheadtext [\s!no] [\v!inhoud=Innhold] - -\setupheadtext [\s!en] [\v!tabellen=Tables] -\setupheadtext [\s!nl] [\v!tabellen=Tabellen] -\setupheadtext [\s!de] [\v!tabellen=Tabellen] -\setupheadtext [\s!da] [\v!tabellen=Tablen] -\setupheadtext [\s!sv] [\v!tabellen=Tabellen] -\setupheadtext [\s!af] [\v!tabellen=Tabellen] -\setupheadtext [\s!no] [\v!tabellen=Tabellen] - -\setupheadtext [\s!en] [\v!figuren=Figures] -\setupheadtext [\s!nl] [\v!figuren=Figuren] -\setupheadtext [\s!de] [\v!figuren=Abbildungen] -\setupheadtext [\s!da] [\v!figuren=Figuren] -\setupheadtext [\s!sv] [\v!figuren=Figuren] -\setupheadtext [\s!af] [\v!figuren=Afbeeldingen] -\setupheadtext [\s!no] [\v!figuren=Avbildningen] - -\setupheadtext [\s!en] [\v!grafieken=Graphics] -\setupheadtext [\s!nl] [\v!grafieken=Grafieken] -\setupheadtext [\s!de] [\v!grafieken=Graphiken] -\setupheadtext [\s!da] [\v!grafieken=Grafiken] -\setupheadtext [\s!sv] [\v!grafieken=Grafiskt] -\setupheadtext [\s!af] [\v!grafieken=Grafieken] -\setupheadtext [\s!no] [\v!grafieken=Grafikken] - -\setupheadtext [\s!en] [\v!intermezzos=Intermezzos] -\setupheadtext [\s!nl] [\v!intermezzos=Intermezzo's] -\setupheadtext [\s!de] [\v!intermezzos=Intermezzi] -\setupheadtext [\s!da] [\v!intermezzos=Intermezzos] -\setupheadtext [\s!sv] [\v!intermezzos=Intermezzot] -\setupheadtext [\s!af] [\v!intermezzos=Intermezzos] -\setupheadtext [\s!no] [\v!intermezzos=Intermezzos] - -\setupheadtext [\s!en] [\v!index=Index] -\setupheadtext [\s!nl] [\v!index=Index] -\setupheadtext [\s!de] [\v!index=Index] -\setupheadtext [\s!da] [\v!index=Indeks] -\setupheadtext [\s!sv] [\v!index=Index] -\setupheadtext [\s!af] [\v!index=Indeks] -\setupheadtext [\s!no] [\v!index=Indeks] - -\setupheadtext [\s!en] [\v!afkortingen=Abbreviations] -\setupheadtext [\s!nl] [\v!afkortingen=Afkortingen] -\setupheadtext [\s!de] [\v!afkortingen=Abk\"urzungen] -\setupheadtext [\s!da] [\v!afkortingen=Abbreviations] -\setupheadtext [\s!sv] [\v!afkortingen=F\"orkortningen] -\setupheadtext [\s!af] [\v!afkortingen=Afkortingen] -\setupheadtext [\s!no] [\v!afkortingen=Forkortelsen] - -\setupheadtext [\s!en] [\v!logos=Logos] -\setupheadtext [\s!nl] [\v!logos=Logo's] -\setupheadtext [\s!de] [\v!logos=Logos] -\setupheadtext [\s!da] [\v!logos=Logos] -\setupheadtext [\s!sv] [\v!logos=Logo] -\setupheadtext [\s!af] [\v!logos=Logos] -\setupheadtext [\s!no] [\v!logos=Logos] - -\setupheadtext [\s!en] [\v!eenheden=Units] -\setupheadtext [\s!nl] [\v!eenheden=Eenheden] -\setupheadtext [\s!de] [\v!eenheden=Einheiten] -\setupheadtext [\s!da] [\v!eenheden=Enheden] -\setupheadtext [\s!sv] [\v!eenheden=Enheten] -\setupheadtext [\s!af] [\v!eenheden=Eenheiden] -\setupheadtext [\s!no] [\v!eenheden=Enheten] - -\setuplabeltext [\s!en] [\v!tabel=Table ] -\setuplabeltext [\s!nl] [\v!tabel=Tabel ] -\setuplabeltext [\s!de] [\v!tabel=Tabelle ] -\setuplabeltext [\s!da] [\v!tabel=Tabel ] -\setuplabeltext [\s!sv] [\v!tabel=Tabell ] -\setuplabeltext [\s!af] [\v!tabel=Tabel] -\setuplabeltext [\s!no] [\v!tabel=Tabell ] - -\setuplabeltext [\s!en] [\v!figuur=Figure ] -\setuplabeltext [\s!nl] [\v!figuur=Figuur ] -\setuplabeltext [\s!de] [\v!figuur=Abbildung ] -\setuplabeltext [\s!da] [\v!figuur=Figur ] -\setuplabeltext [\s!sv] [\v!figuur=Figur ] -\setuplabeltext [\s!af] [\v!figuur=Afbeelding ] -\setuplabeltext [\s!no] [\v!figuur=Avbildning ] - -\setuplabeltext [\s!en] [\v!intermezzo=Intermezzo ] -\setuplabeltext [\s!nl] [\v!intermezzo=Intermezzo ] -\setuplabeltext [\s!de] [\v!intermezzo=Intermezzo ] -\setuplabeltext [\s!da] [\v!intermezzo=Intermezzo ] -\setuplabeltext [\s!sv] [\v!intermezzo=Intermezzo ] -\setuplabeltext [\s!af] [\v!intermezzo=Intermezzo ] -\setuplabeltext [\s!no] [\v!intermezzo=Intermezzo ] - -\setuplabeltext [\s!en] [\v!grafiek=Graphic ] -\setuplabeltext [\s!nl] [\v!grafiek=Grafiek ] -\setuplabeltext [\s!de] [\v!grafiek=Graphik ] -\setuplabeltext [\s!da] [\v!grafiek=Grafik ] -\setuplabeltext [\s!sv] [\v!grafiek=Grafisk ] -\setuplabeltext [\s!af] [\v!grafiek=Grafiek ] -\setuplabeltext [\s!no] [\v!grafiek=Grafikk ] - -\setuplabeltext [\s!en] [\v!hoofdstuk=] -\setuplabeltext [\s!nl] [\v!hoofdstuk=] -\setuplabeltext [\s!de] [\v!hoofdstuk=] -\setuplabeltext [\s!da] [\v!hoofdstuk=] -\setuplabeltext [\s!sv] [\v!hoofdstuk=] -\setuplabeltext [\s!af] [\v!hoofdstuk=] -\setuplabeltext [\s!no] [\v!hoofdstuk=] - -\setuplabeltext [\s!en] [\v!paragraaf=] -\setuplabeltext [\s!nl] [\v!paragraaf=] -\setuplabeltext [\s!de] [\v!paragraaf=] -\setuplabeltext [\s!da] [\v!paragraaf=] -\setuplabeltext [\s!sv] [\v!paragraaf=] -\setuplabeltext [\s!af] [\v!paragraaf=] -\setuplabeltext [\s!no] [\v!paragraaf=] - -\setuplabeltext [\s!en] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!nl] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!de] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!da] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!sv] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!af] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!no] [\v!sub\v!paragraaf=] - -\setuplabeltext [\s!en] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!nl] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!de] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!da] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!sv] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!af] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!no] [\v!sub\v!sub\v!paragraaf=] - -\setuplabeltext [\s!en] [\v!bijlage=] -\setuplabeltext [\s!nl] [\v!bijlage=] -\setuplabeltext [\s!de] [\v!bijlage=] -\setuplabeltext [\s!da] [\v!bijlage=] -\setuplabeltext [\s!sv] [\v!bijlage=] -\setuplabeltext [\s!af] [\v!bijlage=] -\setuplabeltext [\s!no] [\v!bijlage=] - -\setuplabeltext [\s!en] [\v!deel=Part ] -\setuplabeltext [\s!nl] [\v!deel=Deel ] -\setuplabeltext [\s!de] [\v!deel=Teil ] -\setuplabeltext [\s!da] [\v!deel=Del ] -\setuplabeltext [\s!sv] [\v!deel=Del ] -\setuplabeltext [\s!af] [\v!deel=Deel ] -\setuplabeltext [\s!no] [\v!deel=Del ] - -\setuplabeltext [\s!en] [\v!regel=line] -\setuplabeltext [\s!nl] [\v!regel=regel] -\setuplabeltext [\s!de] [\v!regel=Zeile] -\setuplabeltext [\s!da] [\v!regel=linie] -\setuplabeltext [\s!sv] [\v!regel=rad] -\setuplabeltext [\s!af] [\v!regel=re\"el] -\setuplabeltext [\s!no] [\v!regel=linje] - -\setuplabeltext [\s!en] [\v!regels=lines] -\setuplabeltext [\s!nl] [\v!regels=regels] -\setuplabeltext [\s!de] [\v!regels=Zeilen] -\setuplabeltext [\s!da] [\v!regels=linien] -\setuplabeltext [\s!sv] [\v!regels=raden] -\setuplabeltext [\s!af] [\v!regels=re\"elen] -\setuplabeltext [\s!no] [\v!regels=linjen] - -\setuplabeltext [\s!en] [\v!january=January] -\setuplabeltext [\s!en] [\v!february=February] -\setuplabeltext [\s!en] [\v!march=March] -\setuplabeltext [\s!en] [\v!april=April] -\setuplabeltext [\s!en] [\v!may=May] -\setuplabeltext [\s!en] [\v!june=June] -\setuplabeltext [\s!en] [\v!july=July] -\setuplabeltext [\s!en] [\v!august=August] -\setuplabeltext [\s!en] [\v!september=September] -\setuplabeltext [\s!en] [\v!october=October] -\setuplabeltext [\s!en] [\v!november=November] -\setuplabeltext [\s!en] [\v!december=December] - -\setuplabeltext [\s!nl] [\v!january=januari] -\setuplabeltext [\s!nl] [\v!february=februari] -\setuplabeltext [\s!nl] [\v!march=maart] -\setuplabeltext [\s!nl] [\v!april=april] -\setuplabeltext [\s!nl] [\v!may=mei] -\setuplabeltext [\s!nl] [\v!june=juni] -\setuplabeltext [\s!nl] [\v!july=juli] -\setuplabeltext [\s!nl] [\v!august=augustus] -\setuplabeltext [\s!nl] [\v!september=september] -\setuplabeltext [\s!nl] [\v!october=oktober] -\setuplabeltext [\s!nl] [\v!november=november] -\setuplabeltext [\s!nl] [\v!december=december] - -\setuplabeltext [\s!de] [\v!january=Januar] -\setuplabeltext [\s!de] [\v!february=Februar] -\setuplabeltext [\s!de] [\v!march=M\"arz] -\setuplabeltext [\s!de] [\v!april=April] -\setuplabeltext [\s!de] [\v!may=Mai] -\setuplabeltext [\s!de] [\v!june=Juni] -\setuplabeltext [\s!de] [\v!july=Juli] -\setuplabeltext [\s!de] [\v!august=August] -\setuplabeltext [\s!de] [\v!september=September] -\setuplabeltext [\s!de] [\v!october=Oktober] -\setuplabeltext [\s!de] [\v!november=November] -\setuplabeltext [\s!de] [\v!december=Dezember] - -\setuplabeltext [\s!da] [\v!january=januar] -\setuplabeltext [\s!da] [\v!february=februar] -\setuplabeltext [\s!da] [\v!march=marts] -\setuplabeltext [\s!da] [\v!april=april] -\setuplabeltext [\s!da] [\v!may=maj] -\setuplabeltext [\s!da] [\v!june=juni] -\setuplabeltext [\s!da] [\v!july=juli] -\setuplabeltext [\s!da] [\v!august=august] -\setuplabeltext [\s!da] [\v!september=september] -\setuplabeltext [\s!da] [\v!october=oktober] -\setuplabeltext [\s!da] [\v!november=november] -\setuplabeltext [\s!da] [\v!december=december] - -\setuplabeltext [\s!sv] [\v!january=januari] -\setuplabeltext [\s!sv] [\v!february=februari] -\setuplabeltext [\s!sv] [\v!march=mars] -\setuplabeltext [\s!sv] [\v!april=april] -\setuplabeltext [\s!sv] [\v!may=maj] -\setuplabeltext [\s!sv] [\v!june=juni] -\setuplabeltext [\s!sv] [\v!july=juli] -\setuplabeltext [\s!sv] [\v!august=augusti] -\setuplabeltext [\s!sv] [\v!september=september] -\setuplabeltext [\s!sv] [\v!october=oktober] -\setuplabeltext [\s!sv] [\v!november=november] -\setuplabeltext [\s!sv] [\v!december=december] - -\setuplabeltext [\s!af] [\v!january=januarie] -\setuplabeltext [\s!af] [\v!february=februarie] -\setuplabeltext [\s!af] [\v!march=maart] -\setuplabeltext [\s!af] [\v!april=april] -\setuplabeltext [\s!af] [\v!may=mei] -\setuplabeltext [\s!af] [\v!june=junie] -\setuplabeltext [\s!af] [\v!july=julie] -\setuplabeltext [\s!af] [\v!august=augustus] -\setuplabeltext [\s!af] [\v!september=september] -\setuplabeltext [\s!af] [\v!october=oktober] -\setuplabeltext [\s!af] [\v!november=november] -\setuplabeltext [\s!af] [\v!december=desember] - -\setuplabeltext [\s!no] [\v!january=januar] -\setuplabeltext [\s!no] [\v!february=februae] -\setuplabeltext [\s!no] [\v!march=mars] -\setuplabeltext [\s!no] [\v!april=april] -\setuplabeltext [\s!no] [\v!may=mai] -\setuplabeltext [\s!no] [\v!june=juni] -\setuplabeltext [\s!no] [\v!july=juli] -\setuplabeltext [\s!no] [\v!august=august] -\setuplabeltext [\s!no] [\v!september=september] -\setuplabeltext [\s!no] [\v!october=oktober] -\setuplabeltext [\s!no] [\v!november=november] -\setuplabeltext [\s!no] [\v!december=desember] - -\setuplabeltext [\s!en] [\v!sunday=Sunday] -\setuplabeltext [\s!en] [\v!monday=Monday] -\setuplabeltext [\s!en] [\v!tuesday=Tuesday] -\setuplabeltext [\s!en] [\v!wednesday=Wednesday] -\setuplabeltext [\s!en] [\v!thursday=Thursday] -\setuplabeltext [\s!en] [\v!friday=Friday] -\setuplabeltext [\s!en] [\v!saturday=Saturday] - -\setuplabeltext [\s!nl] [\v!sunday=zondag] -\setuplabeltext [\s!nl] [\v!monday=maandag] -\setuplabeltext [\s!nl] [\v!tuesday=dinsdag] -\setuplabeltext [\s!nl] [\v!wednesday=woensdag] -\setuplabeltext [\s!nl] [\v!thursday=donderdag] -\setuplabeltext [\s!nl] [\v!friday=vrijdag] -\setuplabeltext [\s!nl] [\v!saturday=zaterdag] - -\setuplabeltext [\s!de] [\v!sunday=Sonntag] -\setuplabeltext [\s!de] [\v!monday=Montag] -\setuplabeltext [\s!de] [\v!tuesday=Dienstag] -\setuplabeltext [\s!de] [\v!wednesday=Mittwoch] -\setuplabeltext [\s!de] [\v!thursday=Donnerstag] -\setuplabeltext [\s!de] [\v!friday=Freitag] -\setuplabeltext [\s!de] [\v!saturday=Samstag] - -\setuplabeltext [\s!da] [\v!sunday=s\o ndag] -\setuplabeltext [\s!da] [\v!monday=mandag] -\setuplabeltext [\s!da] [\v!tuesday=tirsdag] -\setuplabeltext [\s!da] [\v!wednesday=onsdag] -\setuplabeltext [\s!da] [\v!thursday=torsdag] -\setuplabeltext [\s!da] [\v!friday=fredag] -\setuplabeltext [\s!da] [\v!saturday=l\o rdag] - -\setuplabeltext [\s!sv] [\v!sunday=s\"ondag] -\setuplabeltext [\s!sv] [\v!monday=m\aa ndag] -\setuplabeltext [\s!sv] [\v!tuesday=tisdag] -\setuplabeltext [\s!sv] [\v!wednesday=onsdag] -\setuplabeltext [\s!sv] [\v!thursday=torsdag] -\setuplabeltext [\s!sv] [\v!friday=fredag] -\setuplabeltext [\s!sv] [\v!saturday=l\"ordag] - -\setuplabeltext [\s!af] [\v!sunday=sondag] -\setuplabeltext [\s!af] [\v!monday=maandag] -\setuplabeltext [\s!af] [\v!tuesday=dinsdag] -\setuplabeltext [\s!af] [\v!wednesday=woensdag] -\setuplabeltext [\s!af] [\v!thursday=donderdag] -\setuplabeltext [\s!af] [\v!friday=vrydag] -\setuplabeltext [\s!af] [\v!saturday=saterdag] - -\setuplabeltext [\s!no] [\v!sunday=s\o ndag] -\setuplabeltext [\s!no] [\v!monday=mandag] -\setuplabeltext [\s!no] [\v!tuesday=tirsdag] -\setuplabeltext [\s!no] [\v!wednesday=onsdag] -\setuplabeltext [\s!no] [\v!thursday=torsdag] -\setuplabeltext [\s!no] [\v!friday=fredag] -\setuplabeltext [\s!no] [\v!saturday=l\o rdag] - -%D Rather new ... - -\setuplabeltext [\s!nl] [\v!oppagina=op pagina] -\setuplabeltext [\s!nl] [\v!hierboven=hierboven] -\setuplabeltext [\s!nl] [\v!hieronder=hieronder] - -%D ... and to be completed! - -%D \ShowAllLanguageValues [\s!en] [english] engelse humor -%D \ShowAllLanguageValues [\s!nl] [dutch] nederlandse zuinigheid -%D \ShowAllLanguageValues [\s!de] [german] duitse degelijkheid -%D \ShowAllLanguageValues [\s!da] [danish] deense ... -%D \ShowAllLanguageValues [\s!sv] [swedish] zweedse ... -%D \ShowAllLanguageValues [\s!af] [afrikaans] afrikaanse ... -%D \ShowAllLanguageValues [\s!no] [norwegian] noorse ... - -\protect - -\endinput +%D \module
+%D [ file=lang-ger,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Germanic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Danish, Faeroese, Icelandic, Norwegian, Swedish, German, Yiddish
+% Afrikaans, Dutch, English, Flemush, Frisian, Plattdeutsch
+
+\writestatus{loading}{Germanic Languages}
+
+\unprotect
+
+\installlanguage
+ [\s!nl]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!dag,\ ,\v!maand,\ ,\v!jaar},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\installlanguage
+ [\s!en]
+ [\c!spatiering=\v!ruim,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+% \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!datum={\v!maand,\ ,\v!dag,{,\ },\v!jaar},
+ \c!default=\s!en,
+ \c!status=\v!start] % always preloaded!
+
+\installlanguage
+ [\s!de]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence={\hbox{--~}},
+ \c!rightsentence={\hbox{~--}},
+ \c!leftsubsentence={--},
+ \c!rightsubsentence={--},
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsinglesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!datum={\v!dag,{.},\ ,\v!maand,\ ,\v!jaar},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\installlanguage
+ [\s!da]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\installlanguage
+ [\s!sv]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\installlanguage
+ [\s!af]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\installlanguage
+ [\s!no]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+%D Hey look, some experiment:
+
+\installlanguage
+ [nlx]
+ [\c!spatiering=\v!opelkaar,
+ \c!default=\s!nl,
+ \c!status=\v!stop]
+
+%D For compatibility reasons we also define:
+
+\installlanguage [du] [\s!de]
+
+\let\normaldoublequote="
+
+\startlanguagespecifics[\s!de]
+
+ \installcompoundcharacter "a {\moveaccent{-.1ex}\"a\midworddiscretionary}
+ \installcompoundcharacter "e {\moveaccent{-.1ex}\"e\midworddiscretionary}
+ \installcompoundcharacter "i {\moveaccent{-.1ex}\"\i\midworddiscretionary}
+ \installcompoundcharacter "o {\moveaccent{-.1ex}\"o\midworddiscretionary}
+ \installcompoundcharacter "u {\moveaccent{-.1ex}\"u\midworddiscretionary}
+ \installcompoundcharacter "s {\SS}
+ \installcompoundcharacter "z {\SS}
+
+ \installcompoundcharacter "A {\smashaccent\"A}
+ \installcompoundcharacter "E {\smashaccent\"E}
+ \installcompoundcharacter "I {\smashaccent\"I}
+ \installcompoundcharacter "O {\smashaccent\"O}
+ \installcompoundcharacter "U {\smashaccent\"U}
+ \installcompoundcharacter "Z {SZ}
+ \installcompoundcharacter "S {SS}
+
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!de]
+
+ \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
+ \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
+ \installcompoundcharacter "ll {\discretionary{ll-}{l}{ll}}
+ \installcompoundcharacter "mm {\discretionary{mm-}{m}{mm}}
+ \installcompoundcharacter "nn {\discretionary{nn-}{n}{nn}}
+ \installcompoundcharacter "pp {\discretionary{pp-}{p}{pp}}
+ \installcompoundcharacter "rr {\discretionary{rr-}{r}{rr}}
+ \installcompoundcharacter "tt {\discretionary{tt-}{t}{tt}}
+
+ \installcompoundcharacter "CK {\discretionary {K-}{K}{CK}}
+ \installcompoundcharacter "FF {\discretionary{FF-}{F}{FF}}
+ \installcompoundcharacter "LL {\discretionary{LL-}{L}{LL}}
+ \installcompoundcharacter "MM {\discretionary{MM-}{M}{MM}}
+ \installcompoundcharacter "NN {\discretionary{NN-}{N}{NN}}
+ \installcompoundcharacter "PP {\discretionary{PP-}{P}{PP}}
+ \installcompoundcharacter "RR {\discretionary{RR-}{R}{RR}}
+ \installcompoundcharacter "TT {\discretionary{TT-}{T}{TT}}
+
+\stoplanguagespecifics
+
+\startlanguagespecifics[\s!de]
+
+ \installcompoundcharacter "` {\handlequotation\c!leftquotation}
+ \installcompoundcharacter "' {\handlequotation\c!rightquotation}
+ \installcompoundcharacter ". {\kern.1em\ignorespaces}
+
+ \def\setupDElanguage%
+ {\setuplanguage
+ [\s!de]
+ [\c!leftsentence=\leftguillemot,
+ \c!rightsentence=\rightguillemot,
+ \c!leftsubsentence=\leftsubguillemot,
+ \c!rightsubsentence=\rightsubguillemot]}
+
+ \installcompoundcharacter "< {{\setupDElanguage|<|}}
+ \installcompoundcharacter "> {{\setupDElanguage|>|}}
+
+\stoplanguagespecifics
+
+\setupheadtext [\s!en] [\v!inhoud=Contents]
+\setupheadtext [\s!nl] [\v!inhoud=Inhoud]
+\setupheadtext [\s!de] [\v!inhoud=Inhalt]
+\setupheadtext [\s!da] [\v!inhoud=Indhold]
+\setupheadtext [\s!sv] [\v!inhoud=Inneh\aa l]
+\setupheadtext [\s!af] [\v!inhoud=Inhoud]
+\setupheadtext [\s!no] [\v!inhoud=Innhold]
+
+\setupheadtext [\s!en] [\v!tabellen=Tables]
+\setupheadtext [\s!nl] [\v!tabellen=Tabellen]
+\setupheadtext [\s!de] [\v!tabellen=Tabellen]
+\setupheadtext [\s!da] [\v!tabellen=Tablen]
+\setupheadtext [\s!sv] [\v!tabellen=Tabellen]
+\setupheadtext [\s!af] [\v!tabellen=Tabellen]
+\setupheadtext [\s!no] [\v!tabellen=Tabellen]
+
+\setupheadtext [\s!en] [\v!figuren=Figures]
+\setupheadtext [\s!nl] [\v!figuren=Figuren]
+\setupheadtext [\s!de] [\v!figuren=Abbildungen]
+\setupheadtext [\s!da] [\v!figuren=Figuren]
+\setupheadtext [\s!sv] [\v!figuren=Figuren]
+\setupheadtext [\s!af] [\v!figuren=Afbeeldingen]
+\setupheadtext [\s!no] [\v!figuren=Avbildningen]
+
+\setupheadtext [\s!en] [\v!grafieken=Graphics]
+\setupheadtext [\s!nl] [\v!grafieken=Grafieken]
+\setupheadtext [\s!de] [\v!grafieken=Graphiken]
+\setupheadtext [\s!da] [\v!grafieken=Grafiken]
+\setupheadtext [\s!sv] [\v!grafieken=Grafiskt]
+\setupheadtext [\s!af] [\v!grafieken=Grafieken]
+\setupheadtext [\s!no] [\v!grafieken=Grafikken]
+
+\setupheadtext [\s!en] [\v!intermezzos=Intermezzos]
+\setupheadtext [\s!nl] [\v!intermezzos=Intermezzo's]
+\setupheadtext [\s!de] [\v!intermezzos=Intermezzi]
+\setupheadtext [\s!da] [\v!intermezzos=Intermezzos]
+\setupheadtext [\s!sv] [\v!intermezzos=Intermezzot]
+\setupheadtext [\s!af] [\v!intermezzos=Intermezzos]
+\setupheadtext [\s!no] [\v!intermezzos=Intermezzos]
+
+\setupheadtext [\s!en] [\v!index=Index]
+\setupheadtext [\s!nl] [\v!index=Index]
+\setupheadtext [\s!de] [\v!index=Index]
+\setupheadtext [\s!da] [\v!index=Indeks]
+\setupheadtext [\s!sv] [\v!index=Index]
+\setupheadtext [\s!af] [\v!index=Indeks]
+\setupheadtext [\s!no] [\v!index=Indeks]
+
+\setupheadtext [\s!en] [\v!afkortingen=Abbreviations]
+\setupheadtext [\s!nl] [\v!afkortingen=Afkortingen]
+\setupheadtext [\s!de] [\v!afkortingen=Abk\"urzungen]
+\setupheadtext [\s!da] [\v!afkortingen=Abbreviations]
+\setupheadtext [\s!sv] [\v!afkortingen=F\"orkortningen]
+\setupheadtext [\s!af] [\v!afkortingen=Afkortingen]
+\setupheadtext [\s!no] [\v!afkortingen=Forkortelsen]
+
+\setupheadtext [\s!en] [\v!logos=Logos]
+\setupheadtext [\s!nl] [\v!logos=Logo's]
+\setupheadtext [\s!de] [\v!logos=Logos]
+\setupheadtext [\s!da] [\v!logos=Logos]
+\setupheadtext [\s!sv] [\v!logos=Logo]
+\setupheadtext [\s!af] [\v!logos=Logos]
+\setupheadtext [\s!no] [\v!logos=Logos]
+
+\setupheadtext [\s!en] [\v!eenheden=Units]
+\setupheadtext [\s!nl] [\v!eenheden=Eenheden]
+\setupheadtext [\s!de] [\v!eenheden=Einheiten]
+\setupheadtext [\s!da] [\v!eenheden=Enheden]
+\setupheadtext [\s!sv] [\v!eenheden=Enheten]
+\setupheadtext [\s!af] [\v!eenheden=Eenheiden]
+\setupheadtext [\s!no] [\v!eenheden=Enheten]
+
+\setuplabeltext [\s!en] [\v!tabel=Table ]
+\setuplabeltext [\s!nl] [\v!tabel=Tabel ]
+\setuplabeltext [\s!de] [\v!tabel=Tabelle ]
+\setuplabeltext [\s!da] [\v!tabel=Tabel ]
+\setuplabeltext [\s!sv] [\v!tabel=Tabell ]
+\setuplabeltext [\s!af] [\v!tabel=Tabel]
+\setuplabeltext [\s!no] [\v!tabel=Tabell ]
+
+\setuplabeltext [\s!en] [\v!figuur=Figure ]
+\setuplabeltext [\s!nl] [\v!figuur=Figuur ]
+\setuplabeltext [\s!de] [\v!figuur=Abbildung ]
+\setuplabeltext [\s!da] [\v!figuur=Figur ]
+\setuplabeltext [\s!sv] [\v!figuur=Figur ]
+\setuplabeltext [\s!af] [\v!figuur=Afbeelding ]
+\setuplabeltext [\s!no] [\v!figuur=Avbildning ]
+
+\setuplabeltext [\s!en] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!nl] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!de] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!da] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!sv] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!af] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!no] [\v!intermezzo=Intermezzo ]
+
+\setuplabeltext [\s!en] [\v!grafiek=Graphic ]
+\setuplabeltext [\s!nl] [\v!grafiek=Grafiek ]
+\setuplabeltext [\s!de] [\v!grafiek=Graphik ]
+\setuplabeltext [\s!da] [\v!grafiek=Grafik ]
+\setuplabeltext [\s!sv] [\v!grafiek=Grafisk ]
+\setuplabeltext [\s!af] [\v!grafiek=Grafiek ]
+\setuplabeltext [\s!no] [\v!grafiek=Grafikk ]
+
+\setuplabeltext [\s!en] [\v!hoofdstuk=]
+\setuplabeltext [\s!nl] [\v!hoofdstuk=]
+\setuplabeltext [\s!de] [\v!hoofdstuk=]
+\setuplabeltext [\s!da] [\v!hoofdstuk=]
+\setuplabeltext [\s!sv] [\v!hoofdstuk=]
+\setuplabeltext [\s!af] [\v!hoofdstuk=]
+\setuplabeltext [\s!no] [\v!hoofdstuk=]
+
+\setuplabeltext [\s!en] [\v!paragraaf=]
+\setuplabeltext [\s!nl] [\v!paragraaf=]
+\setuplabeltext [\s!de] [\v!paragraaf=]
+\setuplabeltext [\s!da] [\v!paragraaf=]
+\setuplabeltext [\s!sv] [\v!paragraaf=]
+\setuplabeltext [\s!af] [\v!paragraaf=]
+\setuplabeltext [\s!no] [\v!paragraaf=]
+
+\setuplabeltext [\s!en] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!nl] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!de] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!da] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!sv] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!af] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!no] [\v!sub\v!paragraaf=]
+
+\setuplabeltext [\s!en] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!nl] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!de] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!da] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!sv] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!af] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!no] [\v!sub\v!sub\v!paragraaf=]
+
+\setuplabeltext [\s!en] [\v!bijlage=]
+\setuplabeltext [\s!nl] [\v!bijlage=]
+\setuplabeltext [\s!de] [\v!bijlage=]
+\setuplabeltext [\s!da] [\v!bijlage=]
+\setuplabeltext [\s!sv] [\v!bijlage=]
+\setuplabeltext [\s!af] [\v!bijlage=]
+\setuplabeltext [\s!no] [\v!bijlage=]
+
+\setuplabeltext [\s!en] [\v!deel=Part ]
+\setuplabeltext [\s!nl] [\v!deel=Deel ]
+\setuplabeltext [\s!de] [\v!deel=Teil ]
+\setuplabeltext [\s!da] [\v!deel=Del ]
+\setuplabeltext [\s!sv] [\v!deel=Del ]
+\setuplabeltext [\s!af] [\v!deel=Deel ]
+\setuplabeltext [\s!no] [\v!deel=Del ]
+
+\setuplabeltext [\s!en] [\v!regel=line]
+\setuplabeltext [\s!nl] [\v!regel=regel]
+\setuplabeltext [\s!de] [\v!regel=Zeile]
+\setuplabeltext [\s!da] [\v!regel=linie]
+\setuplabeltext [\s!sv] [\v!regel=rad]
+\setuplabeltext [\s!af] [\v!regel=re\"el]
+\setuplabeltext [\s!no] [\v!regel=linje]
+
+\setuplabeltext [\s!en] [\v!regels=lines]
+\setuplabeltext [\s!nl] [\v!regels=regels]
+\setuplabeltext [\s!de] [\v!regels=Zeilen]
+\setuplabeltext [\s!da] [\v!regels=linien]
+\setuplabeltext [\s!sv] [\v!regels=raden]
+\setuplabeltext [\s!af] [\v!regels=re\"elen]
+\setuplabeltext [\s!no] [\v!regels=linjen]
+
+\setuplabeltext [\s!en] [\v!january=January]
+\setuplabeltext [\s!en] [\v!february=February]
+\setuplabeltext [\s!en] [\v!march=March]
+\setuplabeltext [\s!en] [\v!april=April]
+\setuplabeltext [\s!en] [\v!may=May]
+\setuplabeltext [\s!en] [\v!june=June]
+\setuplabeltext [\s!en] [\v!july=July]
+\setuplabeltext [\s!en] [\v!august=August]
+\setuplabeltext [\s!en] [\v!september=September]
+\setuplabeltext [\s!en] [\v!october=October]
+\setuplabeltext [\s!en] [\v!november=November]
+\setuplabeltext [\s!en] [\v!december=December]
+
+\setuplabeltext [\s!nl] [\v!january=januari]
+\setuplabeltext [\s!nl] [\v!february=februari]
+\setuplabeltext [\s!nl] [\v!march=maart]
+\setuplabeltext [\s!nl] [\v!april=april]
+\setuplabeltext [\s!nl] [\v!may=mei]
+\setuplabeltext [\s!nl] [\v!june=juni]
+\setuplabeltext [\s!nl] [\v!july=juli]
+\setuplabeltext [\s!nl] [\v!august=augustus]
+\setuplabeltext [\s!nl] [\v!september=september]
+\setuplabeltext [\s!nl] [\v!october=oktober]
+\setuplabeltext [\s!nl] [\v!november=november]
+\setuplabeltext [\s!nl] [\v!december=december]
+
+\setuplabeltext [\s!de] [\v!january=Januar]
+\setuplabeltext [\s!de] [\v!february=Februar]
+\setuplabeltext [\s!de] [\v!march=M\"arz]
+\setuplabeltext [\s!de] [\v!april=April]
+\setuplabeltext [\s!de] [\v!may=Mai]
+\setuplabeltext [\s!de] [\v!june=Juni]
+\setuplabeltext [\s!de] [\v!july=Juli]
+\setuplabeltext [\s!de] [\v!august=August]
+\setuplabeltext [\s!de] [\v!september=September]
+\setuplabeltext [\s!de] [\v!october=Oktober]
+\setuplabeltext [\s!de] [\v!november=November]
+\setuplabeltext [\s!de] [\v!december=Dezember]
+
+\setuplabeltext [\s!da] [\v!january=januar]
+\setuplabeltext [\s!da] [\v!february=februar]
+\setuplabeltext [\s!da] [\v!march=marts]
+\setuplabeltext [\s!da] [\v!april=april]
+\setuplabeltext [\s!da] [\v!may=maj]
+\setuplabeltext [\s!da] [\v!june=juni]
+\setuplabeltext [\s!da] [\v!july=juli]
+\setuplabeltext [\s!da] [\v!august=august]
+\setuplabeltext [\s!da] [\v!september=september]
+\setuplabeltext [\s!da] [\v!october=oktober]
+\setuplabeltext [\s!da] [\v!november=november]
+\setuplabeltext [\s!da] [\v!december=december]
+
+\setuplabeltext [\s!sv] [\v!january=januari]
+\setuplabeltext [\s!sv] [\v!february=februari]
+\setuplabeltext [\s!sv] [\v!march=mars]
+\setuplabeltext [\s!sv] [\v!april=april]
+\setuplabeltext [\s!sv] [\v!may=maj]
+\setuplabeltext [\s!sv] [\v!june=juni]
+\setuplabeltext [\s!sv] [\v!july=juli]
+\setuplabeltext [\s!sv] [\v!august=augusti]
+\setuplabeltext [\s!sv] [\v!september=september]
+\setuplabeltext [\s!sv] [\v!october=oktober]
+\setuplabeltext [\s!sv] [\v!november=november]
+\setuplabeltext [\s!sv] [\v!december=december]
+
+\setuplabeltext [\s!af] [\v!january=januarie]
+\setuplabeltext [\s!af] [\v!february=februarie]
+\setuplabeltext [\s!af] [\v!march=maart]
+\setuplabeltext [\s!af] [\v!april=april]
+\setuplabeltext [\s!af] [\v!may=mei]
+\setuplabeltext [\s!af] [\v!june=junie]
+\setuplabeltext [\s!af] [\v!july=julie]
+\setuplabeltext [\s!af] [\v!august=augustus]
+\setuplabeltext [\s!af] [\v!september=september]
+\setuplabeltext [\s!af] [\v!october=oktober]
+\setuplabeltext [\s!af] [\v!november=november]
+\setuplabeltext [\s!af] [\v!december=desember]
+
+\setuplabeltext [\s!no] [\v!january=januar]
+\setuplabeltext [\s!no] [\v!february=februae]
+\setuplabeltext [\s!no] [\v!march=mars]
+\setuplabeltext [\s!no] [\v!april=april]
+\setuplabeltext [\s!no] [\v!may=mai]
+\setuplabeltext [\s!no] [\v!june=juni]
+\setuplabeltext [\s!no] [\v!july=juli]
+\setuplabeltext [\s!no] [\v!august=august]
+\setuplabeltext [\s!no] [\v!september=september]
+\setuplabeltext [\s!no] [\v!october=oktober]
+\setuplabeltext [\s!no] [\v!november=november]
+\setuplabeltext [\s!no] [\v!december=desember]
+
+\setuplabeltext [\s!en] [\v!sunday=Sunday]
+\setuplabeltext [\s!en] [\v!monday=Monday]
+\setuplabeltext [\s!en] [\v!tuesday=Tuesday]
+\setuplabeltext [\s!en] [\v!wednesday=Wednesday]
+\setuplabeltext [\s!en] [\v!thursday=Thursday]
+\setuplabeltext [\s!en] [\v!friday=Friday]
+\setuplabeltext [\s!en] [\v!saturday=Saturday]
+
+\setuplabeltext [\s!nl] [\v!sunday=zondag]
+\setuplabeltext [\s!nl] [\v!monday=maandag]
+\setuplabeltext [\s!nl] [\v!tuesday=dinsdag]
+\setuplabeltext [\s!nl] [\v!wednesday=woensdag]
+\setuplabeltext [\s!nl] [\v!thursday=donderdag]
+\setuplabeltext [\s!nl] [\v!friday=vrijdag]
+\setuplabeltext [\s!nl] [\v!saturday=zaterdag]
+
+\setuplabeltext [\s!de] [\v!sunday=Sonntag]
+\setuplabeltext [\s!de] [\v!monday=Montag]
+\setuplabeltext [\s!de] [\v!tuesday=Dienstag]
+\setuplabeltext [\s!de] [\v!wednesday=Mittwoch]
+\setuplabeltext [\s!de] [\v!thursday=Donnerstag]
+\setuplabeltext [\s!de] [\v!friday=Freitag]
+\setuplabeltext [\s!de] [\v!saturday=Samstag]
+
+\setuplabeltext [\s!da] [\v!sunday=s\o ndag]
+\setuplabeltext [\s!da] [\v!monday=mandag]
+\setuplabeltext [\s!da] [\v!tuesday=tirsdag]
+\setuplabeltext [\s!da] [\v!wednesday=onsdag]
+\setuplabeltext [\s!da] [\v!thursday=torsdag]
+\setuplabeltext [\s!da] [\v!friday=fredag]
+\setuplabeltext [\s!da] [\v!saturday=l\o rdag]
+
+\setuplabeltext [\s!sv] [\v!sunday=s\"ondag]
+\setuplabeltext [\s!sv] [\v!monday=m\aa ndag]
+\setuplabeltext [\s!sv] [\v!tuesday=tisdag]
+\setuplabeltext [\s!sv] [\v!wednesday=onsdag]
+\setuplabeltext [\s!sv] [\v!thursday=torsdag]
+\setuplabeltext [\s!sv] [\v!friday=fredag]
+\setuplabeltext [\s!sv] [\v!saturday=l\"ordag]
+
+\setuplabeltext [\s!af] [\v!sunday=sondag]
+\setuplabeltext [\s!af] [\v!monday=maandag]
+\setuplabeltext [\s!af] [\v!tuesday=dinsdag]
+\setuplabeltext [\s!af] [\v!wednesday=woensdag]
+\setuplabeltext [\s!af] [\v!thursday=donderdag]
+\setuplabeltext [\s!af] [\v!friday=vrydag]
+\setuplabeltext [\s!af] [\v!saturday=saterdag]
+
+\setuplabeltext [\s!no] [\v!sunday=s\o ndag]
+\setuplabeltext [\s!no] [\v!monday=mandag]
+\setuplabeltext [\s!no] [\v!tuesday=tirsdag]
+\setuplabeltext [\s!no] [\v!wednesday=onsdag]
+\setuplabeltext [\s!no] [\v!thursday=torsdag]
+\setuplabeltext [\s!no] [\v!friday=fredag]
+\setuplabeltext [\s!no] [\v!saturday=l\o rdag]
+
+%D Rather new ...
+
+\setuplabeltext [\s!nl] [\v!oppagina=op pagina]
+\setuplabeltext [\s!nl] [\v!hierboven=hierboven]
+\setuplabeltext [\s!nl] [\v!hieronder=hieronder]
+
+%D ... and to be completed!
+
+%D \ShowAllLanguageValues [\s!en] [english] engelse humor
+%D \ShowAllLanguageValues [\s!nl] [dutch] nederlandse zuinigheid
+%D \ShowAllLanguageValues [\s!de] [german] duitse degelijkheid
+%D \ShowAllLanguageValues [\s!da] [danish] deense ...
+%D \ShowAllLanguageValues [\s!sv] [swedish] zweedse ...
+%D \ShowAllLanguageValues [\s!af] [afrikaans] afrikaanse ...
+%D \ShowAllLanguageValues [\s!no] [norwegian] noorse ...
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-grk.tex b/tex/context/base/lang-grk.tex index 7041962a9..51590dd06 100644 --- a/tex/context/base/lang-grk.tex +++ b/tex/context/base/lang-grk.tex @@ -1,22 +1,23 @@ -%D \module -%D [ file=lang-grk, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Greek Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% Modern Greek - -\writestatus{loading}{Greek Languages} - -\unprotect - -\protect - -\endinput +%D \module
+%D [ file=lang-grk,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Greek Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Modern Greek
+
+\writestatus{loading}{Greek Languages}
+
+\unprotect
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-hnl.tex b/tex/context/base/lang-hnl.tex index 5932769c3..32317499f 100644 --- a/tex/context/base/lang-hnl.tex +++ b/tex/context/base/lang-hnl.tex @@ -1,32 +1,33 @@ -%I n=Afbreekregels -%I c=\taal,\vertaal -%I -%I Er kunnen verschillende afbreekregels worden gehanteerd. -%I Deze worden ingesteld met het commando: -%I -%I \taal[taal] -%I -%I waarbij voor taal kan worden ingevuld: -%I -%I nl nederlands -%I en engels -%I du duits -%I fa frans -%I -%I Er zijn ook verkorte commando's beschikbaar: -%I -%I \nl \en \du \fa -%P -%I Er kan automatisch van taal gewisseld worden met het -%I commando: -%I -%I \vertaal[nl=,en=,nl=,fa=,...] -%I -%I Afhankelijk van de actuele taal, wordt de toegekende tekst -%I gezet: \en this is an \vertaal[nl=voorbeeld,en=example], -%I \nl of in goed nederlands: een \vertaal. -%I -%I Als niets wordt meegegeven, dan wordt de laatst opgegeven -%I waarde gebruikt. - -\endinput +%I n=Afbreekregels
+%I c=\taal,\vertaal
+%I
+%I Er kunnen verschillende afbreekregels worden gehanteerd.
+%I Deze worden ingesteld met het commando:
+%I
+%I \taal[taal]
+%I
+%I waarbij voor taal kan worden ingevuld:
+%I
+%I nl nederlands
+%I en engels
+%I du duits
+%I fa frans
+%I
+%I Er zijn ook verkorte commando's beschikbaar:
+%I
+%I \nl \en \du \fa
+%P
+%I Er kan automatisch van taal gewisseld worden met het
+%I commando:
+%I
+%I \vertaal[nl=,en=,nl=,fa=,...]
+%I
+%I Afhankelijk van de actuele taal, wordt de toegekende tekst
+%I gezet: \en this is an \vertaal[nl=voorbeeld,en=example],
+%I \nl of in goed nederlands: een \vertaal.
+%I
+%I Als niets wordt meegegeven, dan wordt de laatst opgegeven
+%I waarde gebruikt.
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-ind.tex b/tex/context/base/lang-ind.tex index f1e50901d..29df64cae 100644 --- a/tex/context/base/lang-ind.tex +++ b/tex/context/base/lang-ind.tex @@ -1,22 +1,23 @@ -%D \module -%D [ file=lang-ind, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Indo||Iranian Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% 34 languages - -\writestatus{loading}{Indo-Iranian Languages} - -\unprotect - -\protect - -\endinput +%D \module
+%D [ file=lang-ind,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Indo||Iranian Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% 34 languages
+
+\writestatus{loading}{Indo-Iranian Languages}
+
+\unprotect
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-ini.tex b/tex/context/base/lang-ini.tex index eb81793c4..f42373a7b 100644 --- a/tex/context/base/lang-ini.tex +++ b/tex/context/base/lang-ini.tex @@ -1,508 +1,508 @@ -%D \module -%D [ file=lang-ini, -%D version=1996.01.25, -%D title=\CONTEXT\ Language 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. - -%D This module implements the (for the moment still simple) -%D multi||language support of \CONTEXT, which should not be -%D confused with the multi||lingual interface. This support -%D will be extended when needed. - -\writestatus{loading}{Context Language Macros / Initialization} - -\unprotect - -\startmessages dutch library: linguals - title: taal - 1: afbreekpatronen voor -- geladen - 2: geen afbreekpatronen voor -- - 3: afbreekdefinities voor -- geladen - 4: geen afbreekdefinities voor -- - 5: afbreekpatronen voor -- niet geladen - 6: taal -- is niet gedefinieerd - 7: taal specifieke opties [--] introduceren een skip van -- - 8: taal specifieke opties [--] naadloos toegevoegd -\stopmessages - -\startmessages english library: linguals - title: language - 1: patterns for -- loaded - 2: no patterns for -- - 3: hyphenations for -- loaded - 4: no hyphenations for -- - 5: patterns for -- not loaded - 6: language -- is undefined - 7: language specific options [--] introduce a -- skip - 8: language specific options [--] seamless appended -\stopmessages - -\startmessages german library: linguals - title: Sprache - 1: Trennmuster fuer -- geladen - 2: Keine Trennmuster fuer -- - 3: Trenndefinitionen fuer -- geladen - 4: Keine Trenndefinitionen fuer -- - 5: Trennmuster fuer -- nicht geladen - 6: Sprache -- ist undefiniert - 7: Sprachenspezifische Option [--] fuegt eine Luecke von -- ein - 8: Sprachenspezifische Option [--] nahtlos hinzugefuegt -\stopmessages - -% dutch : \lccode`\'=`\' -% english : \lccode`\'=0 -% german : \lccode`\'=`\' -% french : \lccode`\'=`\' - -%D When loading hyphenation patterns, \TEX\ assign a number to -%D each loaded table, starting with~0. Switching to a specific -%D table is done by assigning the relevant number to the -%D predefined \COUNTER\ \type{\language}. Unfortunately the -%D name of this command suits very well the name of the -%D language switching command we are to define, so let's save -%D this primitive under another name: - -\let\normallanguage = \language - -%D We keep track of the last loaded patterns by means of a -%D pseudo \COUNTER. This just one of those situations in which -%D we don't want to spent a real one. - -\newcounter\loadedlanguage - -%D \macros -%D {currentlanguage} -%D {} -%D -%D Instead of numbers,we are going to use symbolic names for -%D the languages. The current langage is saved in the macro -%D \type{\currentlanguage}. - -\let\currentlanguage = \empty - -%D \macros -%D {installlanguage} -%D {} -%D -%D Hyphenation patterns can only be loaded when the format file -%D is prepared. The next macro takes care of this loading. A -%D language is specified with -%D -%D \showsetup{\y!installlanguage} -%D -%D When \type{\c!status} equals \type{\v!start}, both patterns -%D and additional hyphenation specifications are loaded. These -%D files are seached for on the system path and are to be -%D named: -%D -%D \starttypen -%D \f!languageprefix-identifier.\f!patternsextension -%D \f!languageprefix-identifier.\f!hyhensextension -%D \stoptypen -%D -%D The \type{\c!spatiering} specifies how the spaces after -%D punctuation has to be handled. English is by tradition more -%D tolerant to inter||sentence spacing than other languages. -%D -%D This macro also defines \type{\identifier} as a shortcut -%D switch to the language. Furthermore the command defined as -%D being language specific, are executed. With -%D \type{\c!default} we can default to another language -%D (patterns) at format generation time. This default language -%D is overruled when the appropriate patterns are loaded (some -%D implementations support run time addition of patterns to a -%D preloaded format). - -\def\dodoinstalllanguage#1% - {\doifundefined{#1}{\setvalue{#1}{\language[#1]}}% - \expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}% - \doifundefined{\ascii}{\setvalue{\ascii}{\language[#1]}}} - -\def\doinstalllanguage[#1][#2]% - {\doifinstringelse{=}{#2} - {\doifdefinedelse{\??la#1\c!nummer}% - {\getparameters[\??la#1][#2]} - {\setvalue{\l!prefix!#1}{#1}% - \setevalue{\??la#1\c!nummer}{\loadedlanguage}% - \increment\loadedlanguage - \dodoinstalllanguage{#1}% - \getparameters - [\??la#1] - [\s!lefthyphenmin=2, - \s!righthyphenmin=2, - \c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!status=\v!stop, - \s!done=\v!nee, - \c!default=#1, - #2]}% - \language=\getvalue{\??la#1\c!nummer}\relax - \doifelsevalue{\??la#1\c!status}{\v!start} - {\doifelsevalue{\??la#1\s!done}{\v!nee} - {\readsysfile{\f!languageprefix#1.\f!patternsextension} - {\getparameters[\??la#1][\s!done=\v!ja,\c!default=#1]% - \showmessage{\m!linguals}{1}{#1}} - {\showmessage{\m!linguals}{2}{#1}}% - \readsysfile{\f!languageprefix#1.\f!hyphensextension} - {\showmessage{\m!linguals}{3}{#1}} - {\showmessage{\m!linguals}{4}{#1}}} - {\showmessage{\m!linguals}{1}{#1}% - \showmessage{\m!linguals}{3}{#1}}} - {\showmessage{\m!linguals}{5}{#1}}} - {\setvalue{\l!prefix!#1}{#2}% - \dodoinstalllanguage{#1}}% - }% \language[#1]} gave unwanted side effect of loading language specifics - -\def\installlanguage% - {\dodoubleargument\doinstalllanguage} - -%D When the second argument is a language identifier, a -%D synonym is created. This feature is present because we -%D used dutch mnemonics in the dutch version, but nowadays -%D conform a standard. - -%D \macros -%D {setuplanguage} -%D -%D Quick and dirty, but useful: -%D -%D \showsetup{\y!setuplanguage} - -\def\setuplanguage[#1]% - {\dodoubleargument\getparameters[\??la#1]} - -%D The values \type {\c!leftsentence} and \type -%D {\c!rightsentence} can be (and are) used to implement -%D automatic subsentence boundary glyphs, like in {\fr -%D |<|french guillemots|>|} or {\de |<|german guillemots|>|} or -%D {\nl |<|dutch dashes|>|} like situations. Furthermore \type -%D {\c!leftquotation} and \type {\c!leftquote} come into view -%D \citaat {when we quote} or \citeer {quote} something. - -%D \macros -%D {currentdatespecification} -%D -%D Just to make things easy we can ask for the current date -%D specification by saying: - -\def\currentdatespecification% - {\getvalue{\??la\currentlanguage\c!datum}} - -%D This command is not meant for users. - -%D Carefull reading of these macros shows that it's legal to -%D say -%D -%D \starttypen -%D \installlanguage [du ] [de] -%D \stoptypen - -%D \macros -%D {language,mainlanguage} -%D {} -%D -%D Switching to another language (actually another hyphenation -%D pattern) is done with: -%D -%D \starttypen -%D \language[identifier] -%D \stoptypen -%D -%D or with \type{\identifier}. Just to be compatible with -%D \PLAIN\ \TEX, we still support the original meaning, so -%D -%D \starttypen -%D \language=1 -%D \stoptypen -%D -%D is a valid operation. -%D -%D \showsetup{\y!language} -%D \showsetup{\y!mainlanguage} -%D -%D Both commands take a predefined language identifier as -%D argument. We can use \type{\mainlanguage[identifier]} for -%D setting the (indeed) main language. This is the language -%D used for translating labels like {\em figure} and {\em -%D table}. The main language defaults to the current language. -%D -%D We take care of local as well as standardized language -%D switching (fr and fa, de and du, but nl and nl). - -\def\docomplexlanguage[#1]% - {\processaction - [\getvalue{\??la#1\c!default}] - [ #1=>\normallanguage=\getvalue{\??la#1\c!nummer}, - \s!default=>\normallanguage=\getvalue{\??la#1\c!nummer}, - \s!unknown=>\expanded{\language[\getvalue{\??la#1\c!default}]}]% - \edef\currentlanguage{#1}% - \enablelanguagespecifics[#1]% - \lefthyphenmin =0\getvalue{\??la#1\s!lefthyphenmin}\relax - \righthyphenmin=0\getvalue{\??la#1\s!righthyphenmin}\relax - \processaction - [\getvalue{\??la#1\c!spatiering}] - [\v!opelkaar=>\frenchspacing, - \v!ruim=>\nonfrenchspacing, - \s!unknown=>\frenchspacing]} - -\def\complexlanguage[#1]% - {\doifdefinedelse{\l!prefix!#1} - {\expanded{\docomplexlanguage[\getvalue{\l!prefix!#1}]}} - {\showmessage{\m!linguals}{6}{#1}}} - -\def\simplelanguage% - {\normallanguage} - -\definecomplexorsimple\language - -\let\currentmainlanguage=\empty - -\def\mainlanguage[#1]% - {\edef\currentmainlanguage{#1}} % We expand indeed! - -%D \macros -%D {startlanguagespecifics,enablelanguagespecifics} -%D {} -%D -%D Each language has its own typographic pecularities. Some of -%D those can be influenced by parameters, others are handled by -%D the interface, but as soon as specific commands come into -%D view we need another mechanism. In the macro that activates -%D a language, we call \type{\enablelanguagespecifics}. This -%D macro in return calls for the setup of language specific -%D macros. Such specifics are defined as: -%D -%D \starttypen -%D \startlanguagespecifics[de] -%D \installcompoundcharacter "a {\"a} -%D \installcompoundcharacter "e {\"e} -%D \installcompoundcharacter "s {\SS} -%D \stoplanguagespecifics -%D \stoptypen -%D -%D Instead of \type{[du]} we can pass a comma separated -%D list, like \type{[du,nl]}. Next calls to this macro add the -%D specifics to the current list. -%D -%D Before we actually read the specifics, we first take some -%D precautions that will prevent spurious spaces to creep into -%D the list. - -\def\startlanguagespecifics% - {\bgroup - \catcode`\^^I=\@@ignore - \catcode`\^^M=\@@ignore - \catcode`\^^L=\@@ignore - \dostartlanguagespecifics} - -%D The main macro looks quite complicated but actually does -%D nothing special. By embedding \type{\do} we can easily -%D append to the lists and also execute them at will. Just to -%D be sure, we check on spurious spaces. - -\long\def\dostartlanguagespecifics[#1]#2\stoplanguagespecifics% - {\egroup - \long\def\docommando##1% - {\doifdefinedelse{\??la##1\??la} - {\long\def\do####1####2####3% - {\setvalue{\??la####1\??la}{\do{####1}{####2####3}}}% - \getvalue{\??la##1\??la}{#2}} - {\setvalue{\??la##1\??la}{\do{##1}{#2}}}% - \bgroup - \setbox0=\hbox{\enablelanguagespecifics[##1]}% - \ifdim\wd0>\!!zeropoint - \showmessage{\m!linguals}{7}{##1,\the\wd0\space}\wait - \else - \showmessage{\m!linguals}{8}{##1}% - \fi - \egroup}% - \processcommalist[#1]\docommando} - -%D Enabling them is rather straightforward. We only have to -%D define \type{\do} in such a way that \type{{ }} is removed -%D and the language key is gobbled. - -\def\enablelanguagespecifics[#1]% - {\long\def\do##1##2{##2}% - \getvalue{\??la#1\??la}} - -%D \macros -%D {leftguillemot,rightguillemot,leftsubguillemot,rightsubguillemot, -%D ...single...quote,...double...quote} -%D {} -%D -%D We assign logical names to all kind of quote and sentence -%D boundary characters. - -\def\lowerleftsingleninequote {\char44 } -\def\lowerleftdoubleninequote {\char44\kern-.1em\char44 } -\def\upperleftsingleninequote {\char39 } -\def\upperleftdoubleninequote {\char34\kern-.1em} -\def\upperleftsinglesixquote {\char96 } -\def\upperleftdoublesixquote {\char96\kern-.1em\char96 } - -\def\lowerrightsingleninequote {\char44 } -\def\lowerrightdoubleninequote {\char44\kern-.1em\char44 } -\def\upperrightsingleninequote {\char39 } -\def\upperrightdoubleninequote {\char34 } -\def\upperrightsinglesixquote {\char96 } -\def\upperrightdoublesixquote {\kern-.125em\char92 } - -\unexpanded\def\leftguillemot% - {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle\ll$}}} - -\unexpanded\def\rightguillemot% - {\hbox{\raise.25ex\hbox{$\scriptscriptstyle\gg$}}} - -\unexpanded\def\leftsubguillemot% - {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle<$}}} - -\unexpanded\def\rightsubguillemot% - {\hbox{\raise.25ex\hbox{$\scriptscriptstyle>$}}} - -%D Just like with subsentence boundary symbols, quotes -%D placement depends on the current language, therefore we show -%D the defaults here. -%D -%D \def\ShowLanguageValues [#1] [#2] #3 #4 -%D {\blanko -%D \startregelcorrectie -%D \vbox\bgroup -%D \language[#1]% -%D \setbox0=\hbox to \hsize{\hss\bf#2 subsentence symbol and quotes\hss} -%D \dp0=0pt -%D \box0 -%D \vskip.5em -%D \hrule -%D \vskip.5em -%D \hbox to \hsize -%D {\hfil\citaat{#3 #4}\hfil\citeer{#2}\hfil\strut|<||<|#3|>|#4|>|\hfil} -%D \vskip.5em -%D \hrule -%D \egroup -%D \stopregelcorrectie -%D \blanko} -%D -%D \ShowLanguageValues [nl] [dutch] nederlandse zuinigheid -%D \ShowLanguageValues [en] [english] engelse humor -%D \ShowLanguageValues [de] [german] duitse degelijkheid -%D \ShowLanguageValues [fr] [french] franse slag -%D \ShowLanguageValues [sp] [spanish] spaans benauwd -%D \ShowLanguageValues [it] [italian] italiaanse ... -%D \ShowLanguageValues [da] [danish] deense ... -%D \ShowLanguageValues [pt] [portuguese] portugese ... -%D \ShowLanguageValues [sv] [swedish] zweedse ... -%D \ShowLanguageValues [pl] [polish] poolse ... -%D \ShowLanguageValues [fi] [finnish] finse ... -%D \ShowLanguageValues [af] [afrikaans] afrikaanse ... -%D \ShowLanguageValues [no] [norwegian] noorse ... -%D \ShowLanguageValues [tr] [turkish] turks fruit - -%D We support a lot of languages. These are specified and -%D loaded in separate files, according to their roots. Here -%D we only take care of (postponed) setting of the current -%D language. -%D -%D \unprotect -%D \plaatstabel{The germanic languages (\type{lang-ger})} -%D \starttabel[||||] -%D \HL -%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR -%D \HL -%D \NC \s!nl \NC dutch \NC germanic \NC\FR -%D \NC \s!en \NC english \NC germanic \NC\MR -%D \NC \s!de \NC german \NC germanic \NC\MR -%D \NC \s!da \NC danish \NC germanic \NC\MR -%D \NC \s!sv \NC swedish \NC germanic \NC\MR -%D \NC \s!af \NC afrikaans \NC germanic \NC\MR -%D \NC \s!no \NC norwegian \NC germanic \NC\LR -%D \HL -%D \stoptabel -%D \protect -%D -%D \unprotect -%D \plaatstabel{The italic languages (\type{lang-ita})} -%D \starttabel[||||] -%D \HL -%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR -%D \HL -%D \NC \s!fr \NC french \NC italic \NC\FR -%D \NC \s!sp \NC spanish \NC italic \NC\MR -%D \NC \s!it \NC italian \NC italic \NC\MR -%D \NC \s!pt \NC portuguese \NC italic \NC\LR -%D \HL -%D \stoptabel -%D \protect -%D -%D \unprotect -%D \plaatstabel{The slavic languages (\type{lang-sla})} -%D \starttabel[||||] -%D \HL -%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC \bf file \NC\SR -%D \HL -%D \NC \s!pl \NC polish \NC slavic \NC lang-sla \NC\SR -%D \HL -%D \stoptabel -%D \protect -%D \unprotect -%D -%D \plaatstabel{The altaic languages (\type{lang-alt})} -%D \starttabel[||||] -%D \HL -%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR -%D \HL -%D \NC \s!tr \NC turkish \NC altaic \NC\SR -%D \HL -%D \stoptabel -%D -%D \plaatstabel{The uralic languages (\type{lang-ura})} -%D \starttabel[||||] -%D \HL -%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR -%D \HL -%D \NC \s!fi \NC finnish \NC uralic \NC\SR -%D \HL -%D \stoptabel -%D \protect - -%D We default to the language belonging to the interface. This -%D is one of the few places outside the interface modules where -%D \type{\startinterface} is used. - -% \language[\s!en] \mainlanguage[\currentlanguage] - -\startinterface dutch \appendtoks \language[\s!nl]\to \everyjob \stopinterface -\startinterface english \appendtoks \language[\s!en]\to \everyjob \stopinterface -\startinterface german \appendtoks \language[\s!de]\to \everyjob \stopinterface -\startinterface french \appendtoks \language[\s!fr]\to \everyjob \stopinterface -\startinterface spanish \appendtoks \language[\s!sp]\to \everyjob \stopinterface -\startinterface italian \appendtoks \language[\s!it]\to \everyjob \stopinterface -\startinterface danish \appendtoks \language[\s!da]\to \everyjob \stopinterface -\startinterface portuguese \appendtoks \language[\s!pt]\to \everyjob \stopinterface -\startinterface swedish \appendtoks \language[\s!sv]\to \everyjob \stopinterface -\startinterface polish \appendtoks \language[\s!pl]\to \everyjob \stopinterface -\startinterface finish \appendtoks \language[\s!fi]\to \everyjob \stopinterface -\startinterface afrikaans \appendtoks \language[\s!af]\to \everyjob \stopinterface -\startinterface norwegian \appendtoks \language[\s!no]\to \everyjob \stopinterface -\startinterface turkish \appendtoks \language[\s!tr]\to \everyjob \stopinterface - -\appendtoks \mainlanguage[\currentlanguage] \to \everyjob - -\protect - -\endinput +%D \module
+%D [ file=lang-ini,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Language 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.
+
+%D This module implements the (for the moment still simple)
+%D multi||language support of \CONTEXT, which should not be
+%D confused with the multi||lingual interface. This support
+%D will be extended when needed.
+
+\writestatus{loading}{Context Language Macros / Initialization}
+
+\unprotect
+
+\startmessages dutch library: linguals
+ title: taal
+ 1: afbreekpatronen voor -- geladen
+ 2: geen afbreekpatronen voor --
+ 3: afbreekdefinities voor -- geladen
+ 4: geen afbreekdefinities voor --
+ 5: afbreekpatronen voor -- niet geladen
+ 6: taal -- is niet gedefinieerd
+ 7: taal specifieke opties [--] introduceren een skip van --
+ 8: taal specifieke opties [--] naadloos toegevoegd
+\stopmessages
+
+\startmessages english library: linguals
+ title: language
+ 1: patterns for -- loaded
+ 2: no patterns for --
+ 3: hyphenations for -- loaded
+ 4: no hyphenations for --
+ 5: patterns for -- not loaded
+ 6: language -- is undefined
+ 7: language specific options [--] introduce a -- skip
+ 8: language specific options [--] seamless appended
+\stopmessages
+
+\startmessages german library: linguals
+ title: Sprache
+ 1: Trennmuster fuer -- geladen
+ 2: Keine Trennmuster fuer --
+ 3: Trenndefinitionen fuer -- geladen
+ 4: Keine Trenndefinitionen fuer --
+ 5: Trennmuster fuer -- nicht geladen
+ 6: Sprache -- ist undefiniert
+ 7: Sprachenspezifische Option [--] fuegt eine Luecke von -- ein
+ 8: Sprachenspezifische Option [--] nahtlos hinzugefuegt
+\stopmessages
+
+% dutch : \lccode`\'=`\'
+% english : \lccode`\'=0
+% german : \lccode`\'=`\'
+% french : \lccode`\'=`\'
+
+%D When loading hyphenation patterns, \TEX\ assign a number to
+%D each loaded table, starting with~0. Switching to a specific
+%D table is done by assigning the relevant number to the
+%D predefined \COUNTER\ \type{\language}. Unfortunately the
+%D name of this command suits very well the name of the
+%D language switching command we are to define, so let's save
+%D this primitive under another name:
+
+\let\normallanguage = \language
+
+%D We keep track of the last loaded patterns by means of a
+%D pseudo \COUNTER. This just one of those situations in which
+%D we don't want to spent a real one.
+
+\newcounter\loadedlanguage
+
+%D \macros
+%D {currentlanguage}
+%D {}
+%D
+%D Instead of numbers,we are going to use symbolic names for
+%D the languages. The current langage is saved in the macro
+%D \type{\currentlanguage}.
+
+\let\currentlanguage = \empty
+
+%D \macros
+%D {installlanguage}
+%D {}
+%D
+%D Hyphenation patterns can only be loaded when the format file
+%D is prepared. The next macro takes care of this loading. A
+%D language is specified with
+%D
+%D \showsetup{\y!installlanguage}
+%D
+%D When \type{\c!status} equals \type{\v!start}, both patterns
+%D and additional hyphenation specifications are loaded. These
+%D files are seached for on the system path and are to be
+%D named:
+%D
+%D \starttypen
+%D \f!languageprefix-identifier.\f!patternsextension
+%D \f!languageprefix-identifier.\f!hyhensextension
+%D \stoptypen
+%D
+%D The \type{\c!spatiering} specifies how the spaces after
+%D punctuation has to be handled. English is by tradition more
+%D tolerant to inter||sentence spacing than other languages.
+%D
+%D This macro also defines \type{\identifier} as a shortcut
+%D switch to the language. Furthermore the command defined as
+%D being language specific, are executed. With
+%D \type{\c!default} we can default to another language
+%D (patterns) at format generation time. This default language
+%D is overruled when the appropriate patterns are loaded (some
+%D implementations support run time addition of patterns to a
+%D preloaded format).
+
+\def\dodoinstalllanguage#1%
+ {\doifundefined{#1}{\setvalue{#1}{\language[#1]}}%
+ \expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}%
+ \doifundefined{\ascii}{\setvalue{\ascii}{\language[#1]}}}
+
+\def\doinstalllanguage[#1][#2]%
+ {\doifinstringelse{=}{#2}
+ {\doifdefinedelse{\??la#1\c!nummer}%
+ {\getparameters[\??la#1][#2]}
+ {\setvalue{\l!prefix!#1}{#1}%
+ \setevalue{\??la#1\c!nummer}{\loadedlanguage}%
+ \increment\loadedlanguage
+ \dodoinstalllanguage{#1}%
+ \getparameters
+ [\??la#1]
+ [\s!lefthyphenmin=2,
+ \s!righthyphenmin=2,
+ \c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!status=\v!stop,
+ \s!done=\v!nee,
+ \c!default=#1,
+ #2]}%
+ \language=\getvalue{\??la#1\c!nummer}\relax
+ \doifelsevalue{\??la#1\c!status}{\v!start}
+ {\doifelsevalue{\??la#1\s!done}{\v!nee}
+ {\readsysfile{\f!languageprefix#1.\f!patternsextension}
+ {\getparameters[\??la#1][\s!done=\v!ja,\c!default=#1]%
+ \showmessage{\m!linguals}{1}{#1}}
+ {\showmessage{\m!linguals}{2}{#1}}%
+ \readsysfile{\f!languageprefix#1.\f!hyphensextension}
+ {\showmessage{\m!linguals}{3}{#1}}
+ {\showmessage{\m!linguals}{4}{#1}}}
+ {\showmessage{\m!linguals}{1}{#1}%
+ \showmessage{\m!linguals}{3}{#1}}}
+ {\showmessage{\m!linguals}{5}{#1}}}
+ {\setvalue{\l!prefix!#1}{#2}%
+ \dodoinstalllanguage{#1}}%
+ }% \language[#1]} gave unwanted side effect of loading language specifics
+
+\def\installlanguage%
+ {\dodoubleargument\doinstalllanguage}
+
+%D When the second argument is a language identifier, a
+%D synonym is created. This feature is present because we
+%D used dutch mnemonics in the dutch version, but nowadays
+%D conform a standard.
+
+%D \macros
+%D {setuplanguage}
+%D
+%D Quick and dirty, but useful:
+%D
+%D \showsetup{\y!setuplanguage}
+
+\def\setuplanguage[#1]%
+ {\dodoubleargument\getparameters[\??la#1]}
+
+%D The values \type {\c!leftsentence} and \type
+%D {\c!rightsentence} can be (and are) used to implement
+%D automatic subsentence boundary glyphs, like in {\fr
+%D |<|french guillemots|>|} or {\de |<|german guillemots|>|} or
+%D {\nl |<|dutch dashes|>|} like situations. Furthermore \type
+%D {\c!leftquotation} and \type {\c!leftquote} come into view
+%D \citaat {when we quote} or \citeer {quote} something.
+
+%D \macros
+%D {currentdatespecification}
+%D
+%D Just to make things easy we can ask for the current date
+%D specification by saying:
+
+\def\currentdatespecification%
+ {\getvalue{\??la\currentlanguage\c!datum}}
+
+%D This command is not meant for users.
+
+%D Carefull reading of these macros shows that it's legal to
+%D say
+%D
+%D \starttypen
+%D \installlanguage [du ] [de]
+%D \stoptypen
+
+%D \macros
+%D {language,mainlanguage}
+%D {}
+%D
+%D Switching to another language (actually another hyphenation
+%D pattern) is done with:
+%D
+%D \starttypen
+%D \language[identifier]
+%D \stoptypen
+%D
+%D or with \type{\identifier}. Just to be compatible with
+%D \PLAIN\ \TEX, we still support the original meaning, so
+%D
+%D \starttypen
+%D \language=1
+%D \stoptypen
+%D
+%D is a valid operation.
+%D
+%D \showsetup{\y!language}
+%D \showsetup{\y!mainlanguage}
+%D
+%D Both commands take a predefined language identifier as
+%D argument. We can use \type{\mainlanguage[identifier]} for
+%D setting the (indeed) main language. This is the language
+%D used for translating labels like {\em figure} and {\em
+%D table}. The main language defaults to the current language.
+%D
+%D We take care of local as well as standardized language
+%D switching (fr and fa, de and du, but nl and nl).
+
+\def\docomplexlanguage[#1]%
+ {\processaction
+ [\getvalue{\??la#1\c!default}]
+ [ #1=>\normallanguage=\getvalue{\??la#1\c!nummer},
+ \s!default=>\normallanguage=\getvalue{\??la#1\c!nummer},
+ \s!unknown=>\expanded{\language[\getvalue{\??la#1\c!default}]}]%
+ \edef\currentlanguage{#1}%
+ \enablelanguagespecifics[#1]%
+ \lefthyphenmin =0\getvalue{\??la#1\s!lefthyphenmin}\relax
+ \righthyphenmin=0\getvalue{\??la#1\s!righthyphenmin}\relax
+ \processaction
+ [\getvalue{\??la#1\c!spatiering}]
+ [\v!opelkaar=>\frenchspacing,
+ \v!ruim=>\nonfrenchspacing,
+ \s!unknown=>\frenchspacing]}
+
+\def\complexlanguage[#1]%
+ {\doifdefinedelse{\l!prefix!#1}
+ {\expanded{\docomplexlanguage[\getvalue{\l!prefix!#1}]}}
+ {\showmessage{\m!linguals}{6}{#1}}}
+
+\def\simplelanguage%
+ {\normallanguage}
+
+\definecomplexorsimple\language
+
+\let\currentmainlanguage=\empty
+
+\def\mainlanguage[#1]%
+ {\edef\currentmainlanguage{#1}} % We expand indeed!
+
+%D \macros
+%D {startlanguagespecifics,enablelanguagespecifics}
+%D {}
+%D
+%D Each language has its own typographic pecularities. Some of
+%D those can be influenced by parameters, others are handled by
+%D the interface, but as soon as specific commands come into
+%D view we need another mechanism. In the macro that activates
+%D a language, we call \type{\enablelanguagespecifics}. This
+%D macro in return calls for the setup of language specific
+%D macros. Such specifics are defined as:
+%D
+%D \starttypen
+%D \startlanguagespecifics[de]
+%D \installcompoundcharacter "a {\"a}
+%D \installcompoundcharacter "e {\"e}
+%D \installcompoundcharacter "s {\SS}
+%D \stoplanguagespecifics
+%D \stoptypen
+%D
+%D Instead of \type{[du]} we can pass a comma separated
+%D list, like \type{[du,nl]}. Next calls to this macro add the
+%D specifics to the current list.
+%D
+%D Before we actually read the specifics, we first take some
+%D precautions that will prevent spurious spaces to creep into
+%D the list.
+
+\def\startlanguagespecifics%
+ {\bgroup
+ \catcode`\^^I=\@@ignore
+ \catcode`\^^M=\@@ignore
+ \catcode`\^^L=\@@ignore
+ \dostartlanguagespecifics}
+
+%D The main macro looks quite complicated but actually does
+%D nothing special. By embedding \type{\do} we can easily
+%D append to the lists and also execute them at will. Just to
+%D be sure, we check on spurious spaces.
+
+\long\def\dostartlanguagespecifics[#1]#2\stoplanguagespecifics%
+ {\egroup
+ \long\def\docommando##1%
+ {\doifdefinedelse{\??la##1\??la}
+ {\long\def\do####1####2####3%
+ {\setvalue{\??la####1\??la}{\do{####1}{####2####3}}}%
+ \getvalue{\??la##1\??la}{#2}}
+ {\setvalue{\??la##1\??la}{\do{##1}{#2}}}%
+ \bgroup
+ \setbox0=\hbox{\enablelanguagespecifics[##1]}%
+ \ifdim\wd0>\!!zeropoint
+ \showmessage{\m!linguals}{7}{##1,\the\wd0\space}\wait
+ \else
+ \showmessage{\m!linguals}{8}{##1}%
+ \fi
+ \egroup}%
+ \processcommalist[#1]\docommando}
+
+%D Enabling them is rather straightforward. We only have to
+%D define \type{\do} in such a way that \type{{ }} is removed
+%D and the language key is gobbled.
+
+\def\enablelanguagespecifics[#1]%
+ {\long\def\do##1##2{##2}%
+ \getvalue{\??la#1\??la}}
+
+%D \macros
+%D {leftguillemot,rightguillemot,leftsubguillemot,rightsubguillemot,
+%D ...single...quote,...double...quote}
+%D {}
+%D
+%D We assign logical names to all kind of quote and sentence
+%D boundary characters.
+
+\def\lowerleftsingleninequote {\char44 }
+\def\lowerleftdoubleninequote {\char44\kern-.1em\char44 }
+\def\upperleftsingleninequote {\char39 }
+\def\upperleftdoubleninequote {\char34\kern-.1em}
+\def\upperleftsinglesixquote {\char96 }
+\def\upperleftdoublesixquote {\char96\kern-.1em\char96 }
+
+\def\lowerrightsingleninequote {\char44 }
+\def\lowerrightdoubleninequote {\char44\kern-.1em\char44 }
+\def\upperrightsingleninequote {\char39 }
+\def\upperrightdoubleninequote {\char34 }
+\def\upperrightsinglesixquote {\char96 }
+\def\upperrightdoublesixquote {\kern-.125em\char92 }
+
+\unexpanded\def\leftguillemot%
+ {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle\ll$}}}
+
+\unexpanded\def\rightguillemot%
+ {\hbox{\raise.25ex\hbox{$\scriptscriptstyle\gg$}}}
+
+\unexpanded\def\leftsubguillemot%
+ {\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle<$}}}
+
+\unexpanded\def\rightsubguillemot%
+ {\hbox{\raise.25ex\hbox{$\scriptscriptstyle>$}}}
+
+%D Just like with subsentence boundary symbols, quotes
+%D placement depends on the current language, therefore we show
+%D the defaults here.
+%D
+%D \def\ShowLanguageValues [#1] [#2] #3 #4
+%D {\blanko
+%D \startregelcorrectie
+%D \vbox\bgroup
+%D \language[#1]%
+%D \setbox0=\hbox to \hsize{\hss\bf#2 subsentence symbol and quotes\hss}
+%D \dp0=0pt
+%D \box0
+%D \vskip.5em
+%D \hrule
+%D \vskip.5em
+%D \hbox to \hsize
+%D {\hfil\citaat{#3 #4}\hfil\citeer{#2}\hfil\strut|<||<|#3|>|#4|>|\hfil}
+%D \vskip.5em
+%D \hrule
+%D \egroup
+%D \stopregelcorrectie
+%D \blanko}
+%D
+%D \ShowLanguageValues [nl] [dutch] nederlandse zuinigheid
+%D \ShowLanguageValues [en] [english] engelse humor
+%D \ShowLanguageValues [de] [german] duitse degelijkheid
+%D \ShowLanguageValues [fr] [french] franse slag
+%D \ShowLanguageValues [sp] [spanish] spaans benauwd
+%D \ShowLanguageValues [it] [italian] italiaanse ...
+%D \ShowLanguageValues [da] [danish] deense ...
+%D \ShowLanguageValues [pt] [portuguese] portugese ...
+%D \ShowLanguageValues [sv] [swedish] zweedse ...
+%D \ShowLanguageValues [pl] [polish] poolse ...
+%D \ShowLanguageValues [fi] [finnish] finse ...
+%D \ShowLanguageValues [af] [afrikaans] afrikaanse ...
+%D \ShowLanguageValues [no] [norwegian] noorse ...
+%D \ShowLanguageValues [tr] [turkish] turks fruit
+
+%D We support a lot of languages. These are specified and
+%D loaded in separate files, according to their roots. Here
+%D we only take care of (postponed) setting of the current
+%D language.
+%D
+%D \unprotect
+%D \plaatstabel{The germanic languages (\type{lang-ger})}
+%D \starttabel[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!nl \NC dutch \NC germanic \NC\FR
+%D \NC \s!en \NC english \NC germanic \NC\MR
+%D \NC \s!de \NC german \NC germanic \NC\MR
+%D \NC \s!da \NC danish \NC germanic \NC\MR
+%D \NC \s!sv \NC swedish \NC germanic \NC\MR
+%D \NC \s!af \NC afrikaans \NC germanic \NC\MR
+%D \NC \s!no \NC norwegian \NC germanic \NC\LR
+%D \HL
+%D \stoptabel
+%D \protect
+%D
+%D \unprotect
+%D \plaatstabel{The italic languages (\type{lang-ita})}
+%D \starttabel[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!fr \NC french \NC italic \NC\FR
+%D \NC \s!sp \NC spanish \NC italic \NC\MR
+%D \NC \s!it \NC italian \NC italic \NC\MR
+%D \NC \s!pt \NC portuguese \NC italic \NC\LR
+%D \HL
+%D \stoptabel
+%D \protect
+%D
+%D \unprotect
+%D \plaatstabel{The slavic languages (\type{lang-sla})}
+%D \starttabel[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC \bf file \NC\SR
+%D \HL
+%D \NC \s!pl \NC polish \NC slavic \NC lang-sla \NC\SR
+%D \HL
+%D \stoptabel
+%D \protect
+%D \unprotect
+%D
+%D \plaatstabel{The altaic languages (\type{lang-alt})}
+%D \starttabel[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!tr \NC turkish \NC altaic \NC\SR
+%D \HL
+%D \stoptabel
+%D
+%D \plaatstabel{The uralic languages (\type{lang-ura})}
+%D \starttabel[||||]
+%D \HL
+%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
+%D \HL
+%D \NC \s!fi \NC finnish \NC uralic \NC\SR
+%D \HL
+%D \stoptabel
+%D \protect
+
+%D We default to the language belonging to the interface. This
+%D is one of the few places outside the interface modules where
+%D \type{\startinterface} is used.
+
+% \language[\s!en] \mainlanguage[\currentlanguage]
+
+\startinterface dutch \appendtoks \language[\s!nl]\to \everyjob \stopinterface
+\startinterface english \appendtoks \language[\s!en]\to \everyjob \stopinterface
+\startinterface german \appendtoks \language[\s!de]\to \everyjob \stopinterface
+\startinterface french \appendtoks \language[\s!fr]\to \everyjob \stopinterface
+\startinterface spanish \appendtoks \language[\s!sp]\to \everyjob \stopinterface
+\startinterface italian \appendtoks \language[\s!it]\to \everyjob \stopinterface
+\startinterface danish \appendtoks \language[\s!da]\to \everyjob \stopinterface
+\startinterface portuguese \appendtoks \language[\s!pt]\to \everyjob \stopinterface
+\startinterface swedish \appendtoks \language[\s!sv]\to \everyjob \stopinterface
+\startinterface polish \appendtoks \language[\s!pl]\to \everyjob \stopinterface
+\startinterface finish \appendtoks \language[\s!fi]\to \everyjob \stopinterface
+\startinterface afrikaans \appendtoks \language[\s!af]\to \everyjob \stopinterface
+\startinterface norwegian \appendtoks \language[\s!no]\to \everyjob \stopinterface
+\startinterface turkish \appendtoks \language[\s!tr]\to \everyjob \stopinterface
+
+\appendtoks \mainlanguage[\currentlanguage] \to \everyjob
+
+\protect
+
+\endinput
diff --git a/tex/context/base/lang-it.pat b/tex/context/base/lang-it.pat index 66457543a..7b0ecd599 100644 --- a/tex/context/base/lang-it.pat +++ b/tex/context/base/lang-it.pat @@ -1,519 +1,519 @@ -\endinput - -% (c) IBM Corporation 1992. -% -% This is ihyphen.tex version 1.2 as of 11 May 1992. -% -% Italian language hyphenation patterns for 8-bit character set, -% using the Extended TeX Font Encoding Scheme --- Latin. -% -% Written by: -% Salvatore Filippone -% IBM ECSEC -% Viale Oceano Pacifico 171/173 -% 00144 Roma, ITALY -% -% Internet: filippon@romvmnic.vnet.ibm.com -% -\patterns{ -2a1a ^^e01a ^^e11a -a1e ^^e01e ^^e11e -a2i ^^e01i ^^e11i -a3i2a -a3i2e -a3i2o -a2j -a1o ^^e01o ^^e11o -a2u ^^e01u ^^e11u -a2y -1ba 1b^^e0 1b^^e1 -2b1b2 -1b2c2 -2b1d2 -1be 1b^^e8 1b^^e9 -1b2f2 -1b2g2 -1b2h2 -1bi 1b^^ec 1b^^ed -1bj -1b2l2 -1b2m2 -2b1n2 -1bo 1b^^f3 1b^^f2 -1b2p2 -1b2q2 -1b2r2 -2b1s2 -1b2t2 -1bu 1b^^fa 1b^^f9 -1b2v2 -1b2w2 -1b2x2 -1by -1b2z2 -1ca 1c^^e1 1c^^e0 -1c2b2 -2c1c2 -1c2d2 -1ce 1c^^e9 1c^^e8 -1c2f2 -1c2g2 -1c2h -1ci 1c^^ec 1c^^ed -1cj -1c2l2 -2c1m -2c1n -1co 1c^^f3 1c^^f2 -1c2p2 -2c1q2 -1c2r2 -1c2s2 -2c1t -1cu 1c^^fa 1c^^f9 -1c2v2 -1c2w2 -1c2x2 -1cy -2c1z2 -1da 1d^^e1 1d^^e0 -1d2b2 -1d2c2 -2d1d -1de 1d^^e9 1d^^e8 -1d2f2 -1d2g2 -1d2h2 -1di 1d^^ec 1d^^ed -1dj -1d2l2 -2d1m -2d1n -1do 1d^^f3 1d^^f2 -1d2p2 -1d2q2 -1d2r2 -2d1s2 -1d2t2 -1du 1d^^fa 1d^^f9 -2d1v2 -1d2w2 -1d2x2 -1dy -2d1z2 -e1a ^^e91a ^^e81a -2e1e 2^^e91e2 2^^e81e2 -e2i ^^e91i ^^e81i -e3i2a -e3i2e -e3i2o -e2j -e1o ^^e91o ^^e81o -e2u ^^e91u ^^e81u -e2y -1fa 1f^^e1 1f^^e0 -1f2b2 -1f2c2 -1f2d2 -1fe 1f^^e9 1f^^e8 -2f1f2 -2f1g -1f2h2 -1fi 1f^^ec 1f^^ed -1fj -1f2l -1f2m2 -1f2n2 -1fo 1f^^f3 1f^^f2 -1f2p2 -1f2q2 -1f2r2 -2f1s -2f1t -1fu 1f^^fa 1f^^f9 -1f2v2 -1f2w2 -1f2x2 -1fy -1f2z2 -1ga 1g^^e1 1g^^e0 -2g1b -2g1c -2g1d -1ge 1g^^e9 1g^^e8 -2g1f -2g1g -1g2h2 -1gi 1g^^ec 1g^^ed -1gj -1g2l2 -2g1m -1g2n2 -1go 1g^^f3 1g^^f2 -1g2p2 -1g2q2 -1g2r2 -1g2s2 -1g2t2 -1gu 1g^^fa 1g^^f9 -1g2v2 -1g2w2 -1g2x2 -1gy -1g2z2 -i2a ^^ec1a ^^ed1a -i2e ^^ec1e ^^ed1e -2i1i 2^^ec1i2 2^^ed1i2 -i2j -i2o ^^ec1o ^^ed1o -i2u ^^ec1u ^^ed1u -i2y -j2a -j2e -j2i -2j1j2 -j2o -j2u -j2y -1ka 1k^^e1 1k^^e0 -1ke 1k^^e9 1k^^e8 -1ki 1k^^ec 1k^^ed -1kj -1ko 1k^^f3 1k^^f2 -1ku 1k^^fa 1k^^f9 -1ky -1la 1l^^e1 1l^^e0 -2l1b2 -2l1c2 -2l1d2 -1le 1l^^e9 1l^^e8 -2l1f2 -2l1g2 -l1h -1li 1l^^ec 1l^^ed -1lj -2l1l2 -2l1m2 -2l1n2 -1lo 1l^^f3 1l^^f2 -2l1p2 -2l1q2 -2l1r2 -2l1s2 -2l1t2 -1lu 1l^^fa 1l^^f9 -2l1v2 -2l1w2 -2l1x2 -1ly -2l1z2 -1ma 1m^^e1 1m^^e0 -2m1b2 -2m1c2 -2m1d2 -1me 1m^^e9 1m^^e8 -2m1f2 -2m1g2 -2m1h2 -1mi 1m^^ec 1m^^ed -1mj -m1l -2m3m2 -2m1n2 -1mo 1m^^f3 1m^^f2 -2m1p2 -2m1q2 -2m1r2 -2m1s2 -2m1t2 -1mu 1m^^fa 1m^^f9 -2m1v2 -2m1w2 -2m1x2 -1my -2m1z2 -1na 1n^^e1 1n^^e0 -2n1b2 -2n1c2 -2n1d2 -1ne 1n^^e9 1n^^e8 -2n1f2 -2n1g2 -2n1h2 -1ni 1n^^ec 1n^^ed -1nj -2n1l2 -2n1m2 -2n1n2 -1no 1n^^f3 1n^^f2 -2n1p2 -2n1q2 -2n1r2 -2n1s2 -2n1t2 -1nu 1n^^fa 1n^^f9 -2n1v2 -2n1w2 -2n1x2 -1ny -2n1z2 -o1a ^^f31a ^^f21a -o1e ^^f31e ^^f21e -o2i ^^f31i ^^f21i -o3i2a -o3i2e -o3i2i -o3i2o -o2j -2o1o 2^^f31o 2^^f21o -o2u ^^f31u ^^f21u -o2y -1pa 1p^^e1 1p^^e0 -1p2b2 -1p2c2 -2p1d2 -1pe 1p^^e9 1p^^e8 -1p2f2 -1p2g2 -1p2h2 -1pi 1p^^ec 1p^^ed -1pj -1p2l2 -2p1m -1p2n2 -1po 1p^^f3 1p^^f2 -2p1p2 -1p2q2 -1p2r2 -2p1s2 -.p2s2 -2p1t2 -1pu 1p^^fa 1p^^f9 -1p2v2 -1p2w2 -1p2x2 -1py -2p1z -1qa 1q^^e1 1q^^e0 -1q2b2 -1q2c2 -1q2d2 -1qe 1q^^e9 1q^^e8 -1q2f2 -1q2g2 -1q2h2 -1qi 1q^^ec 1q^^ed -1qj -1q2l2 -1q2m2 -1q2n2 -1qo 1q^^f3 1q^^f2 -1q2p2 -2q1q2 -1q2r2 -1q2s2 -1q2t2 -1qu 1q^^fa 1q^^f9 -1q2v2 -1q2w2 -1q2x2 -1qy -q2z -1ra 1r^^e1 1r^^e0 -2r1b2 -2r1c2 -2r1d2 -1re 1r^^e9 1r^^e8 -2r1f2 -2r1g2 -2r1h2 -1ri 1r^^ec 1r^^ed -1rj -2r1l2 -2r1m2 -2r1n2 -1ro 1r^^f3 1r^^f2 -2r1p2 -2r1q2 -2r1r2 -2r1s2 -2r1t2 -1ru 1r^^fa 1r^^f9 -2r1v2 -2r1w2 -2r1x2 -1ry -2r1z -1sa 1s^^e1 1s^^e0 -1s2b2 -1s2c2 -1s2d2 -1se 1s^^e9 1s^^e8 -1s2f2 -1s2g2 -1s2h2 -1si 1s^^ec 1s^^ed -1sj -1s2l2 -1s2m2 -1s2n2 -1so 1s^^f3 1s^^f2 -1s2p2 -1s2q2 -1s2r2 -2s1s2 -1s2t2 -s2t3m -1su 1s^^fa 1s^^f9 -1s2v2 -1s2w2 -1s2x2 -1sy -2s1z2 -1ta 1t^^e1 1t^^e0 -1t2b2 -1t2c2 -1t2d2 -1te 1t^^e9 1t^^e8 -1t2f2 -1t2g2 -1t2h2 -1ti 1t^^ec 1t^^ed -1tj -1t2l2 -1t2m2 -1t2n2 -1to 1t^^f3 1t^^f2 -1t2p2 -1t2q2 -1t2r2 -1t2s2 -2t1t2 -1tu 1t^^fa 1t^^f9 -1t2v2 -1t2w2 -1t2x2 -1ty -1t2z2 -u2a ^^fa1a ^^f91a -u2e ^^fa1e ^^f91e -u2i ^^fa1i ^^f91i -u2j -u2o ^^fa1o ^^f91o -2u1u2 2^^fa1u2 2^^f91u2 -u2y -1va 1v^^e1 1v^^e0 -1v2b2 -1v2c2 -1v2d2 -1ve 1v^^e9 1v^^e8 -1v2f2 -1v2g2 -1v2h2 -1vi 1v^^ec 1v^^ed -1vj -1v2l2 -1v2m2 -1v2n2 -1vo 1v^^f3 1v^^f2 -1v2p2 -1v2q2 -1v2r2 -1v2s2 -1v2t2 -1vu 1v^^fa 1v^^f9 -2v1v2 -1v2w2 -1v2x2 -1vy -1v2z2 -1wa 1w^^e1 1w^^e0 -1w2b2 -1w2c2 -1w2d2 -1we 1w^^e9 1w^^e8 -1w2f2 -1w2g2 -1w2h2 -1wi 1w^^ec 1w^^ed -1wj -1w2l2 -1w2m2 -1w2n2 -1wo 1w^^f3 1w^^f2 -1w2p2 -1w2q2 -1w2r2 -1w2s2 -1w2t2 -1wu 1w^^fa 1w^^f9 -w2v -2w1w2 -1w2x2 -1wy -1w2z2 -1xa 1x^^e1 1x^^e0 -1x2b2 -1x2c2 -1x2d2 -1xe 1x^^e9 1x^^e8 -1x2f2 -1x2g2 -1x2h2 -1xi 1x^^ec 1x^^ed -1xj -1x2l2 -1x2m2 -1x2n2 -1xo 1x^^f3 1x^^f2 -1x2p2 -1x2q2 -1x2r2 -1x2s2 -1x2t2 -1xu 1x^^fa 1x^^f9 -1x2v2 -1x2w2 -2x1x2 -1xy -1x2z2 -y2a -y2e -y2i -y2j -y2o -y2u -y1y -1za 1z^^e1 1z^^e0 -1z2b2 -1z2c2 -1z2d2 -1ze 1z^^e9 1z^^e8 -1z2f2 -1z2g2 -1z2h2 -1zi 1z^^ec 1z^^ed -1zj -1z2l2 -1z2m2 -1z2n2 -1zo 1z^^f3 1z^^f2 -1z2p2 -1z2q2 -1z2r2 -1z2s2 -1z2t2 -1zu 1z^^fa 1z^^f9 -1z2v2 -1z2w2 -1z2x2 -1zy -2z1z -.pre3a -.pre3i -.pre3o -.pre3u -.su2b3l -.su2b3r -} - +\endinput
+
+% (c) IBM Corporation 1992.
+%
+% This is ihyphen.tex version 1.2 as of 11 May 1992.
+%
+% Italian language hyphenation patterns for 8-bit character set,
+% using the Extended TeX Font Encoding Scheme --- Latin.
+%
+% Written by:
+% Salvatore Filippone
+% IBM ECSEC
+% Viale Oceano Pacifico 171/173
+% 00144 Roma, ITALY
+%
+% Internet: filippon@romvmnic.vnet.ibm.com
+%
+\patterns{
+2a1a ^^e01a ^^e11a
+a1e ^^e01e ^^e11e
+a2i ^^e01i ^^e11i
+a3i2a
+a3i2e
+a3i2o
+a2j
+a1o ^^e01o ^^e11o
+a2u ^^e01u ^^e11u
+a2y
+1ba 1b^^e0 1b^^e1
+2b1b2
+1b2c2
+2b1d2
+1be 1b^^e8 1b^^e9
+1b2f2
+1b2g2
+1b2h2
+1bi 1b^^ec 1b^^ed
+1bj
+1b2l2
+1b2m2
+2b1n2
+1bo 1b^^f3 1b^^f2
+1b2p2
+1b2q2
+1b2r2
+2b1s2
+1b2t2
+1bu 1b^^fa 1b^^f9
+1b2v2
+1b2w2
+1b2x2
+1by
+1b2z2
+1ca 1c^^e1 1c^^e0
+1c2b2
+2c1c2
+1c2d2
+1ce 1c^^e9 1c^^e8
+1c2f2
+1c2g2
+1c2h
+1ci 1c^^ec 1c^^ed
+1cj
+1c2l2
+2c1m
+2c1n
+1co 1c^^f3 1c^^f2
+1c2p2
+2c1q2
+1c2r2
+1c2s2
+2c1t
+1cu 1c^^fa 1c^^f9
+1c2v2
+1c2w2
+1c2x2
+1cy
+2c1z2
+1da 1d^^e1 1d^^e0
+1d2b2
+1d2c2
+2d1d
+1de 1d^^e9 1d^^e8
+1d2f2
+1d2g2
+1d2h2
+1di 1d^^ec 1d^^ed
+1dj
+1d2l2
+2d1m
+2d1n
+1do 1d^^f3 1d^^f2
+1d2p2
+1d2q2
+1d2r2
+2d1s2
+1d2t2
+1du 1d^^fa 1d^^f9
+2d1v2
+1d2w2
+1d2x2
+1dy
+2d1z2
+e1a ^^e91a ^^e81a
+2e1e 2^^e91e2 2^^e81e2
+e2i ^^e91i ^^e81i
+e3i2a
+e3i2e
+e3i2o
+e2j
+e1o ^^e91o ^^e81o
+e2u ^^e91u ^^e81u
+e2y
+1fa 1f^^e1 1f^^e0
+1f2b2
+1f2c2
+1f2d2
+1fe 1f^^e9 1f^^e8
+2f1f2
+2f1g
+1f2h2
+1fi 1f^^ec 1f^^ed
+1fj
+1f2l
+1f2m2
+1f2n2
+1fo 1f^^f3 1f^^f2
+1f2p2
+1f2q2
+1f2r2
+2f1s
+2f1t
+1fu 1f^^fa 1f^^f9
+1f2v2
+1f2w2
+1f2x2
+1fy
+1f2z2
+1ga 1g^^e1 1g^^e0
+2g1b
+2g1c
+2g1d
+1ge 1g^^e9 1g^^e8
+2g1f
+2g1g
+1g2h2
+1gi 1g^^ec 1g^^ed
+1gj
+1g2l2
+2g1m
+1g2n2
+1go 1g^^f3 1g^^f2
+1g2p2
+1g2q2
+1g2r2
+1g2s2
+1g2t2
+1gu 1g^^fa 1g^^f9
+1g2v2
+1g2w2
+1g2x2
+1gy
+1g2z2
+i2a ^^ec1a ^^ed1a
+i2e ^^ec1e ^^ed1e
+2i1i 2^^ec1i2 2^^ed1i2
+i2j
+i2o ^^ec1o ^^ed1o
+i2u ^^ec1u ^^ed1u
+i2y
+j2a
+j2e
+j2i
+2j1j2
+j2o
+j2u
+j2y
+1ka 1k^^e1 1k^^e0
+1ke 1k^^e9 1k^^e8
+1ki 1k^^ec 1k^^ed
+1kj
+1ko 1k^^f3 1k^^f2
+1ku 1k^^fa 1k^^f9
+1ky
+1la 1l^^e1 1l^^e0
+2l1b2
+2l1c2
+2l1d2
+1le 1l^^e9 1l^^e8
+2l1f2
+2l1g2
+l1h
+1li 1l^^ec 1l^^ed
+1lj
+2l1l2
+2l1m2
+2l1n2
+1lo 1l^^f3 1l^^f2
+2l1p2
+2l1q2
+2l1r2
+2l1s2
+2l1t2
+1lu 1l^^fa 1l^^f9
+2l1v2
+2l1w2
+2l1x2
+1ly
+2l1z2
+1ma 1m^^e1 1m^^e0
+2m1b2
+2m1c2
+2m1d2
+1me 1m^^e9 1m^^e8
+2m1f2
+2m1g2
+2m1h2
+1mi 1m^^ec 1m^^ed
+1mj
+m1l
+2m3m2
+2m1n2
+1mo 1m^^f3 1m^^f2
+2m1p2
+2m1q2
+2m1r2
+2m1s2
+2m1t2
+1mu 1m^^fa 1m^^f9
+2m1v2
+2m1w2
+2m1x2
+1my
+2m1z2
+1na 1n^^e1 1n^^e0
+2n1b2
+2n1c2
+2n1d2
+1ne 1n^^e9 1n^^e8
+2n1f2
+2n1g2
+2n1h2
+1ni 1n^^ec 1n^^ed
+1nj
+2n1l2
+2n1m2
+2n1n2
+1no 1n^^f3 1n^^f2
+2n1p2
+2n1q2
+2n1r2
+2n1s2
+2n1t2
+1nu 1n^^fa 1n^^f9
+2n1v2
+2n1w2
+2n1x2
+1ny
+2n1z2
+o1a ^^f31a ^^f21a
+o1e ^^f31e ^^f21e
+o2i ^^f31i ^^f21i
+o3i2a
+o3i2e
+o3i2i
+o3i2o
+o2j
+2o1o 2^^f31o 2^^f21o
+o2u ^^f31u ^^f21u
+o2y
+1pa 1p^^e1 1p^^e0
+1p2b2
+1p2c2
+2p1d2
+1pe 1p^^e9 1p^^e8
+1p2f2
+1p2g2
+1p2h2
+1pi 1p^^ec 1p^^ed
+1pj
+1p2l2
+2p1m
+1p2n2
+1po 1p^^f3 1p^^f2
+2p1p2
+1p2q2
+1p2r2
+2p1s2
+.p2s2
+2p1t2
+1pu 1p^^fa 1p^^f9
+1p2v2
+1p2w2
+1p2x2
+1py
+2p1z
+1qa 1q^^e1 1q^^e0
+1q2b2
+1q2c2
+1q2d2
+1qe 1q^^e9 1q^^e8
+1q2f2
+1q2g2
+1q2h2
+1qi 1q^^ec 1q^^ed
+1qj
+1q2l2
+1q2m2
+1q2n2
+1qo 1q^^f3 1q^^f2
+1q2p2
+2q1q2
+1q2r2
+1q2s2
+1q2t2
+1qu 1q^^fa 1q^^f9
+1q2v2
+1q2w2
+1q2x2
+1qy
+q2z
+1ra 1r^^e1 1r^^e0
+2r1b2
+2r1c2
+2r1d2
+1re 1r^^e9 1r^^e8
+2r1f2
+2r1g2
+2r1h2
+1ri 1r^^ec 1r^^ed
+1rj
+2r1l2
+2r1m2
+2r1n2
+1ro 1r^^f3 1r^^f2
+2r1p2
+2r1q2
+2r1r2
+2r1s2
+2r1t2
+1ru 1r^^fa 1r^^f9
+2r1v2
+2r1w2
+2r1x2
+1ry
+2r1z
+1sa 1s^^e1 1s^^e0
+1s2b2
+1s2c2
+1s2d2
+1se 1s^^e9 1s^^e8
+1s2f2
+1s2g2
+1s2h2
+1si 1s^^ec 1s^^ed
+1sj
+1s2l2
+1s2m2
+1s2n2
+1so 1s^^f3 1s^^f2
+1s2p2
+1s2q2
+1s2r2
+2s1s2
+1s2t2
+s2t3m
+1su 1s^^fa 1s^^f9
+1s2v2
+1s2w2
+1s2x2
+1sy
+2s1z2
+1ta 1t^^e1 1t^^e0
+1t2b2
+1t2c2
+1t2d2
+1te 1t^^e9 1t^^e8
+1t2f2
+1t2g2
+1t2h2
+1ti 1t^^ec 1t^^ed
+1tj
+1t2l2
+1t2m2
+1t2n2
+1to 1t^^f3 1t^^f2
+1t2p2
+1t2q2
+1t2r2
+1t2s2
+2t1t2
+1tu 1t^^fa 1t^^f9
+1t2v2
+1t2w2
+1t2x2
+1ty
+1t2z2
+u2a ^^fa1a ^^f91a
+u2e ^^fa1e ^^f91e
+u2i ^^fa1i ^^f91i
+u2j
+u2o ^^fa1o ^^f91o
+2u1u2 2^^fa1u2 2^^f91u2
+u2y
+1va 1v^^e1 1v^^e0
+1v2b2
+1v2c2
+1v2d2
+1ve 1v^^e9 1v^^e8
+1v2f2
+1v2g2
+1v2h2
+1vi 1v^^ec 1v^^ed
+1vj
+1v2l2
+1v2m2
+1v2n2
+1vo 1v^^f3 1v^^f2
+1v2p2
+1v2q2
+1v2r2
+1v2s2
+1v2t2
+1vu 1v^^fa 1v^^f9
+2v1v2
+1v2w2
+1v2x2
+1vy
+1v2z2
+1wa 1w^^e1 1w^^e0
+1w2b2
+1w2c2
+1w2d2
+1we 1w^^e9 1w^^e8
+1w2f2
+1w2g2
+1w2h2
+1wi 1w^^ec 1w^^ed
+1wj
+1w2l2
+1w2m2
+1w2n2
+1wo 1w^^f3 1w^^f2
+1w2p2
+1w2q2
+1w2r2
+1w2s2
+1w2t2
+1wu 1w^^fa 1w^^f9
+w2v
+2w1w2
+1w2x2
+1wy
+1w2z2
+1xa 1x^^e1 1x^^e0
+1x2b2
+1x2c2
+1x2d2
+1xe 1x^^e9 1x^^e8
+1x2f2
+1x2g2
+1x2h2
+1xi 1x^^ec 1x^^ed
+1xj
+1x2l2
+1x2m2
+1x2n2
+1xo 1x^^f3 1x^^f2
+1x2p2
+1x2q2
+1x2r2
+1x2s2
+1x2t2
+1xu 1x^^fa 1x^^f9
+1x2v2
+1x2w2
+2x1x2
+1xy
+1x2z2
+y2a
+y2e
+y2i
+y2j
+y2o
+y2u
+y1y
+1za 1z^^e1 1z^^e0
+1z2b2
+1z2c2
+1z2d2
+1ze 1z^^e9 1z^^e8
+1z2f2
+1z2g2
+1z2h2
+1zi 1z^^ec 1z^^ed
+1zj
+1z2l2
+1z2m2
+1z2n2
+1zo 1z^^f3 1z^^f2
+1z2p2
+1z2q2
+1z2r2
+1z2s2
+1z2t2
+1zu 1z^^fa 1z^^f9
+1z2v2
+1z2w2
+1z2x2
+1zy
+2z1z
+.pre3a
+.pre3i
+.pre3o
+.pre3u
+.su2b3l
+.su2b3r
+}
+
diff --git a/tex/context/base/lang-ita.tex b/tex/context/base/lang-ita.tex index 1cd71ba13..d2fc6f204 100644 --- a/tex/context/base/lang-ita.tex +++ b/tex/context/base/lang-ita.tex @@ -1,281 +1,282 @@ -%D \module -%D [ file=lang-ita, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Italic Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% Latin, Italian, Rhaeto-Romanic, Rumanian, Sardian -% Catalan, French, Ladino, Portuguese, Proven\c{c}al, Spanish - -\writestatus{loading}{Italic Languages} - -\unprotect - -\installlanguage - [\s!fr] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=\leftguillemot, - \c!rightsentence=\rightguillemot, - \c!leftsubsentence=\leftsubguillemot, - \c!rightsubsentence=\rightsubguillemot, - \c!leftquote=\leftsubguillemot, - \c!rightquote=\rightsubguillemot, - \c!leftquotation=\leftguillemot, - \c!rightquotation=\rightguillemot, - \c!datum={\v!dag,\ ,\v!maand,\ ,\v!jaar}, - \c!default=\s!en, - \c!status=\v!stop] - -\installlanguage - [\s!sp] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!dag,\ ,\v!maand,\ ,\v!jaar}, - \c!default=\s!en, - \c!status=\v!stop] - -\installlanguage - [\s!it] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\lowerrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\lowerrightdoubleninequote, - \c!datum={\v!dag,\ ,\v!maand,\ ,\v!jaar}, - \c!default=\s!en, - \c!status=\v!stop] - -\installlanguage - [\s!pt] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!default=\s!en, - \c!status=\v!stop] - -%D For compatibility reasons we also define: - -\installlanguage [fa] [\s!fr] - -\setupheadtext [\s!fr] [\v!inhoud=Table des mati\`eres] -\setupheadtext [\s!sp] [\v!inhoud=\'Indice] -\setupheadtext [\s!it] [\v!inhoud=Indice] -\setupheadtext [\s!pt] [\v!inhoud=Conte\'ud] - -\setupheadtext [\s!fr] [\v!tabellen=Tables] -\setupheadtext [\s!sp] [\v!tabellen=Tablas] -\setupheadtext [\s!it] [\v!tabellen=Tabelle] -\setupheadtext [\s!pt] [\v!tabellen=Tabelas] - -\setupheadtext [\s!fr] [\v!figuren=Figures] -\setupheadtext [\s!sp] [\v!figuren=Ilustraci\'ons] -\setupheadtext [\s!it] [\v!figuren=Illustrazioni] -\setupheadtext [\s!pt] [\v!figuren=Figuras] - -\setupheadtext [\s!fr] [\v!grafieken=Graphiques] -\setupheadtext [\s!sp] [\v!grafieken=Gr\'aficos] -\setupheadtext [\s!it] [\v!grafieken=Grafice] -\setupheadtext [\s!pt] [\v!grafieken=Gr\'aficos] - -\setupheadtext [\s!fr] [\v!intermezzos=Interm\`edes] -\setupheadtext [\s!sp] [\v!intermezzos=intermedios] -\setupheadtext [\s!it] [\v!intermezzos=Intermezzi] -\setupheadtext [\s!pt] [\v!intermezzos=Intermezzi] - -\setupheadtext [\s!fr] [\v!index=Index] -\setupheadtext [\s!sp] [\v!index=\'Indice] -\setupheadtext [\s!it] [\v!index=Indice] -\setupheadtext [\s!pt] [\v!index=\'Indice] - -\setupheadtext [\s!fr] [\v!afkortingen=Abr\'eviations] -\setupheadtext [\s!sp] [\v!afkortingen=Abreviaci\'ons] -\setupheadtext [\s!it] [\v!afkortingen=Abbreviazioni] -\setupheadtext [\s!pt] [\v!afkortingen=Abreviaturas] - -\setupheadtext [\s!fr] [\v!logos=Logos] -\setupheadtext [\s!sp] [\v!logos=Logotipos] -\setupheadtext [\s!it] [\v!logos=Logotipi] -\setupheadtext [\s!pt] [\v!logos=Logotipos] - -\setupheadtext [\s!fr] [\v!eenheden=Unit\'es] -\setupheadtext [\s!sp] [\v!eenheden=Unidads] -\setupheadtext [\s!it] [\v!eenheden=Unit\`a] -\setupheadtext [\s!pt] [\v!eenheden=Unidades] - -\setuplabeltext [\s!fr] [\v!tabel=Table ] -\setuplabeltext [\s!sp] [\v!tabel=Tablas ] -\setuplabeltext [\s!it] [\v!tabel=Tabella ] -\setuplabeltext [\s!pt] [\v!tabel=Tabela ] - -\setuplabeltext [\s!fr] [\v!figuur=Figure ] -\setuplabeltext [\s!sp] [\v!figuur=Ilustraci\'on ] -\setuplabeltext [\s!it] [\v!figuur=Illustrazione ] -\setuplabeltext [\s!pt] [\v!figuur=Figura ] - -\setuplabeltext [\s!fr] [\v!intermezzo=Interm\`ede ] -\setuplabeltext [\s!sp] [\v!intermezzo=intermedio ] -\setuplabeltext [\s!it] [\v!intermezzo=Intermezzo ] -\setuplabeltext [\s!pt] [\v!intermezzo=Intermezzo ] - -\setuplabeltext [\s!fr] [\v!grafiek=Illustration ] -\setuplabeltext [\s!sp] [\v!grafiek=Gr\'afico ] -\setuplabeltext [\s!it] [\v!grafiek=Grafica ] -\setuplabeltext [\s!pt] [\v!grafiek=Gr\'afico ] - -\setuplabeltext [\s!fr] [\v!hoofdstuk=] -\setuplabeltext [\s!sp] [\v!hoofdstuk=] -\setuplabeltext [\s!it] [\v!hoofdstuk=] -\setuplabeltext [\s!pt] [\v!hoofdstuk=] - -\setuplabeltext [\s!fr] [\v!paragraaf=] -\setuplabeltext [\s!sp] [\v!paragraaf=] -\setuplabeltext [\s!it] [\v!paragraaf=] -\setuplabeltext [\s!pt] [\v!paragraaf=] - -\setuplabeltext [\s!fr] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!sp] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!it] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!pt] [\v!sub\v!paragraaf=] - -\setuplabeltext [\s!fr] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!sp] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!it] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!pt] [\v!sub\v!sub\v!paragraaf=] - -\setuplabeltext [\s!fr] [\v!bijlage=] -\setuplabeltext [\s!sp] [\v!bijlage=] -\setuplabeltext [\s!it] [\v!bijlage=] -\setuplabeltext [\s!pt] [\v!bijlage=] - -\setuplabeltext [\s!fr] [\v!deel=Section ] -\setuplabeltext [\s!sp] [\v!deel=Parte ] -\setuplabeltext [\s!it] [\v!deel=Parte ] -\setuplabeltext [\s!pt] [\v!deel=Parte ] - -\setuplabeltext [\s!fr] [\v!regel=ligne] -\setuplabeltext [\s!sp] [\v!regel=l\'\i nea] -\setuplabeltext [\s!it] [\v!regel=riga] -\setuplabeltext [\s!pt] [\v!regel=linha] - -\setuplabeltext [\s!fr] [\v!regels=lignes] -\setuplabeltext [\s!sp] [\v!regels=l\'\i neas] -\setuplabeltext [\s!it] [\v!regels=rige] -\setuplabeltext [\s!pt] [\v!regels=linhas] - -\setuplabeltext [\s!fr] [\v!january=janvier] -\setuplabeltext [\s!fr] [\v!february=f\'evrier] -\setuplabeltext [\s!fr] [\v!march=mars] -\setuplabeltext [\s!fr] [\v!april=avril] -\setuplabeltext [\s!fr] [\v!may=mai] -\setuplabeltext [\s!fr] [\v!june=juin] -\setuplabeltext [\s!fr] [\v!july=juillet] -\setuplabeltext [\s!fr] [\v!august=ao\^ut] -\setuplabeltext [\s!fr] [\v!september=septembre] -\setuplabeltext [\s!fr] [\v!october=octobre] -\setuplabeltext [\s!fr] [\v!november=novembre] -\setuplabeltext [\s!fr] [\v!december=d\'ecembre] - -\setuplabeltext [\s!sp] [\v!january=jenero] -\setuplabeltext [\s!sp] [\v!february=febrero] -\setuplabeltext [\s!sp] [\v!march=marzo] -\setuplabeltext [\s!sp] [\v!april=abril] -\setuplabeltext [\s!sp] [\v!may=mayo] -\setuplabeltext [\s!sp] [\v!june=junio] -\setuplabeltext [\s!sp] [\v!july=julio] -\setuplabeltext [\s!sp] [\v!august=agosto] -\setuplabeltext [\s!sp] [\v!september=septimbre] -\setuplabeltext [\s!sp] [\v!october=octubre] -\setuplabeltext [\s!sp] [\v!november=noviembre] -\setuplabeltext [\s!sp] [\v!december=deciembre] - -\setuplabeltext [\s!it] [\v!january=gennaio] -\setuplabeltext [\s!it] [\v!february=febbraio] -\setuplabeltext [\s!it] [\v!march=marzo] -\setuplabeltext [\s!it] [\v!april=aprile] -\setuplabeltext [\s!it] [\v!may=maggio] -\setuplabeltext [\s!it] [\v!june=giugno] -\setuplabeltext [\s!it] [\v!july=luglio] -\setuplabeltext [\s!it] [\v!august=agosto] -\setuplabeltext [\s!it] [\v!september=settembre] -\setuplabeltext [\s!it] [\v!october=ottobre] -\setuplabeltext [\s!it] [\v!november=novembre] -\setuplabeltext [\s!it] [\v!december=dicembre] - -\setuplabeltext [\s!pt] [\v!january=janeiro] -\setuplabeltext [\s!pt] [\v!february=fevereiro] -\setuplabeltext [\s!pt] [\v!march=mar\c{c}o] -\setuplabeltext [\s!pt] [\v!april=abril] -\setuplabeltext [\s!pt] [\v!may=maio] -\setuplabeltext [\s!pt] [\v!june=junho] -\setuplabeltext [\s!pt] [\v!july=julho] -\setuplabeltext [\s!pt] [\v!august=agosto] -\setuplabeltext [\s!pt] [\v!september=setembro] -\setuplabeltext [\s!pt] [\v!october=outubro] -\setuplabeltext [\s!pt] [\v!november=novembro] -\setuplabeltext [\s!pt] [\v!december=dezembro] - -\setuplabeltext [\s!fr] [\v!sunday=dimanche] -\setuplabeltext [\s!fr] [\v!monday=lundi] -\setuplabeltext [\s!fr] [\v!tuesday=mardi] -\setuplabeltext [\s!fr] [\v!wednesday=mercredi] -\setuplabeltext [\s!fr] [\v!thursday=jeudi] -\setuplabeltext [\s!fr] [\v!friday=vendredi] -\setuplabeltext [\s!fr] [\v!saturday=samedi] - -\setuplabeltext [\s!sp] [\v!sunday=domingo] -\setuplabeltext [\s!sp] [\v!monday=lunes] -\setuplabeltext [\s!sp] [\v!tuesday=martes] -\setuplabeltext [\s!sp] [\v!wednesday=mi\'ercoles] -\setuplabeltext [\s!sp] [\v!thursday=jueves] -\setuplabeltext [\s!sp] [\v!friday=viernes] -\setuplabeltext [\s!sp] [\v!saturday=s\'abado] - -\setuplabeltext [\s!it] [\v!sunday=domenica] -\setuplabeltext [\s!it] [\v!monday=luned\`\i] -\setuplabeltext [\s!it] [\v!tuesday=marted\`\i] -\setuplabeltext [\s!it] [\v!wednesday=mercoled\`\i] -\setuplabeltext [\s!it] [\v!thursday=gioved\`\i] -\setuplabeltext [\s!it] [\v!friday=venerd\`\i] -\setuplabeltext [\s!it] [\v!saturday=sabato] - -\setuplabeltext [\s!pt] [\v!sunday=domingo] -\setuplabeltext [\s!pt] [\v!monday=segunda-feira] -\setuplabeltext [\s!pt] [\v!tuesday=ter\c{c}a-feira] -\setuplabeltext [\s!pt] [\v!wednesday=quarta-feira] -\setuplabeltext [\s!pt] [\v!thursday=quinta-feira] -\setuplabeltext [\s!pt] [\v!friday=sexta-feira] -\setuplabeltext [\s!pt] [\v!saturday=s\'abado] - -%D \ShowAllLanguageValues [\s!fr] [french] franse slag -%D \ShowAllLanguageValues [\s!sp] [spanish] spaans benauwd -%D \ShowAllLanguageValues [\s!it] [italian] italiaanse ... -%D \ShowAllLanguageValues [\s!pt] [portuguese] portugese ... - -\protect - -\endinput +%D \module
+%D [ file=lang-ita,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Italic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Latin, Italian, Rhaeto-Romanic, Rumanian, Sardian
+% Catalan, French, Ladino, Portuguese, Proven\c{c}al, Spanish
+
+\writestatus{loading}{Italic Languages}
+
+\unprotect
+
+\installlanguage
+ [\s!fr]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=\leftguillemot,
+ \c!rightsentence=\rightguillemot,
+ \c!leftsubsentence=\leftsubguillemot,
+ \c!rightsubsentence=\rightsubguillemot,
+ \c!leftquote=\leftsubguillemot,
+ \c!rightquote=\rightsubguillemot,
+ \c!leftquotation=\leftguillemot,
+ \c!rightquotation=\rightguillemot,
+ \c!datum={\v!dag,\ ,\v!maand,\ ,\v!jaar},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\installlanguage
+ [\s!sp]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!dag,\ ,\v!maand,\ ,\v!jaar},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\installlanguage
+ [\s!it]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\lowerrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\lowerrightdoubleninequote,
+ \c!datum={\v!dag,\ ,\v!maand,\ ,\v!jaar},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\installlanguage
+ [\s!pt]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+%D For compatibility reasons we also define:
+
+\installlanguage [fa] [\s!fr]
+
+\setupheadtext [\s!fr] [\v!inhoud=Table des mati\`eres]
+\setupheadtext [\s!sp] [\v!inhoud=\'Indice]
+\setupheadtext [\s!it] [\v!inhoud=Indice]
+\setupheadtext [\s!pt] [\v!inhoud=Conte\'ud]
+
+\setupheadtext [\s!fr] [\v!tabellen=Tables]
+\setupheadtext [\s!sp] [\v!tabellen=Tablas]
+\setupheadtext [\s!it] [\v!tabellen=Tabelle]
+\setupheadtext [\s!pt] [\v!tabellen=Tabelas]
+
+\setupheadtext [\s!fr] [\v!figuren=Figures]
+\setupheadtext [\s!sp] [\v!figuren=Ilustraci\'ons]
+\setupheadtext [\s!it] [\v!figuren=Illustrazioni]
+\setupheadtext [\s!pt] [\v!figuren=Figuras]
+
+\setupheadtext [\s!fr] [\v!grafieken=Graphiques]
+\setupheadtext [\s!sp] [\v!grafieken=Gr\'aficos]
+\setupheadtext [\s!it] [\v!grafieken=Grafice]
+\setupheadtext [\s!pt] [\v!grafieken=Gr\'aficos]
+
+\setupheadtext [\s!fr] [\v!intermezzos=Interm\`edes]
+\setupheadtext [\s!sp] [\v!intermezzos=intermedios]
+\setupheadtext [\s!it] [\v!intermezzos=Intermezzi]
+\setupheadtext [\s!pt] [\v!intermezzos=Intermezzi]
+
+\setupheadtext [\s!fr] [\v!index=Index]
+\setupheadtext [\s!sp] [\v!index=\'Indice]
+\setupheadtext [\s!it] [\v!index=Indice]
+\setupheadtext [\s!pt] [\v!index=\'Indice]
+
+\setupheadtext [\s!fr] [\v!afkortingen=Abr\'eviations]
+\setupheadtext [\s!sp] [\v!afkortingen=Abreviaci\'ons]
+\setupheadtext [\s!it] [\v!afkortingen=Abbreviazioni]
+\setupheadtext [\s!pt] [\v!afkortingen=Abreviaturas]
+
+\setupheadtext [\s!fr] [\v!logos=Logos]
+\setupheadtext [\s!sp] [\v!logos=Logotipos]
+\setupheadtext [\s!it] [\v!logos=Logotipi]
+\setupheadtext [\s!pt] [\v!logos=Logotipos]
+
+\setupheadtext [\s!fr] [\v!eenheden=Unit\'es]
+\setupheadtext [\s!sp] [\v!eenheden=Unidads]
+\setupheadtext [\s!it] [\v!eenheden=Unit\`a]
+\setupheadtext [\s!pt] [\v!eenheden=Unidades]
+
+\setuplabeltext [\s!fr] [\v!tabel=Table ]
+\setuplabeltext [\s!sp] [\v!tabel=Tablas ]
+\setuplabeltext [\s!it] [\v!tabel=Tabella ]
+\setuplabeltext [\s!pt] [\v!tabel=Tabela ]
+
+\setuplabeltext [\s!fr] [\v!figuur=Figure ]
+\setuplabeltext [\s!sp] [\v!figuur=Ilustraci\'on ]
+\setuplabeltext [\s!it] [\v!figuur=Illustrazione ]
+\setuplabeltext [\s!pt] [\v!figuur=Figura ]
+
+\setuplabeltext [\s!fr] [\v!intermezzo=Interm\`ede ]
+\setuplabeltext [\s!sp] [\v!intermezzo=intermedio ]
+\setuplabeltext [\s!it] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!pt] [\v!intermezzo=Intermezzo ]
+
+\setuplabeltext [\s!fr] [\v!grafiek=Illustration ]
+\setuplabeltext [\s!sp] [\v!grafiek=Gr\'afico ]
+\setuplabeltext [\s!it] [\v!grafiek=Grafica ]
+\setuplabeltext [\s!pt] [\v!grafiek=Gr\'afico ]
+
+\setuplabeltext [\s!fr] [\v!hoofdstuk=]
+\setuplabeltext [\s!sp] [\v!hoofdstuk=]
+\setuplabeltext [\s!it] [\v!hoofdstuk=]
+\setuplabeltext [\s!pt] [\v!hoofdstuk=]
+
+\setuplabeltext [\s!fr] [\v!paragraaf=]
+\setuplabeltext [\s!sp] [\v!paragraaf=]
+\setuplabeltext [\s!it] [\v!paragraaf=]
+\setuplabeltext [\s!pt] [\v!paragraaf=]
+
+\setuplabeltext [\s!fr] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!sp] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!it] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!pt] [\v!sub\v!paragraaf=]
+
+\setuplabeltext [\s!fr] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!sp] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!it] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!pt] [\v!sub\v!sub\v!paragraaf=]
+
+\setuplabeltext [\s!fr] [\v!bijlage=]
+\setuplabeltext [\s!sp] [\v!bijlage=]
+\setuplabeltext [\s!it] [\v!bijlage=]
+\setuplabeltext [\s!pt] [\v!bijlage=]
+
+\setuplabeltext [\s!fr] [\v!deel=Section ]
+\setuplabeltext [\s!sp] [\v!deel=Parte ]
+\setuplabeltext [\s!it] [\v!deel=Parte ]
+\setuplabeltext [\s!pt] [\v!deel=Parte ]
+
+\setuplabeltext [\s!fr] [\v!regel=ligne]
+\setuplabeltext [\s!sp] [\v!regel=l\'\i nea]
+\setuplabeltext [\s!it] [\v!regel=riga]
+\setuplabeltext [\s!pt] [\v!regel=linha]
+
+\setuplabeltext [\s!fr] [\v!regels=lignes]
+\setuplabeltext [\s!sp] [\v!regels=l\'\i neas]
+\setuplabeltext [\s!it] [\v!regels=rige]
+\setuplabeltext [\s!pt] [\v!regels=linhas]
+
+\setuplabeltext [\s!fr] [\v!january=janvier]
+\setuplabeltext [\s!fr] [\v!february=f\'evrier]
+\setuplabeltext [\s!fr] [\v!march=mars]
+\setuplabeltext [\s!fr] [\v!april=avril]
+\setuplabeltext [\s!fr] [\v!may=mai]
+\setuplabeltext [\s!fr] [\v!june=juin]
+\setuplabeltext [\s!fr] [\v!july=juillet]
+\setuplabeltext [\s!fr] [\v!august=ao\^ut]
+\setuplabeltext [\s!fr] [\v!september=septembre]
+\setuplabeltext [\s!fr] [\v!october=octobre]
+\setuplabeltext [\s!fr] [\v!november=novembre]
+\setuplabeltext [\s!fr] [\v!december=d\'ecembre]
+
+\setuplabeltext [\s!sp] [\v!january=jenero]
+\setuplabeltext [\s!sp] [\v!february=febrero]
+\setuplabeltext [\s!sp] [\v!march=marzo]
+\setuplabeltext [\s!sp] [\v!april=abril]
+\setuplabeltext [\s!sp] [\v!may=mayo]
+\setuplabeltext [\s!sp] [\v!june=junio]
+\setuplabeltext [\s!sp] [\v!july=julio]
+\setuplabeltext [\s!sp] [\v!august=agosto]
+\setuplabeltext [\s!sp] [\v!september=septimbre]
+\setuplabeltext [\s!sp] [\v!october=octubre]
+\setuplabeltext [\s!sp] [\v!november=noviembre]
+\setuplabeltext [\s!sp] [\v!december=deciembre]
+
+\setuplabeltext [\s!it] [\v!january=gennaio]
+\setuplabeltext [\s!it] [\v!february=febbraio]
+\setuplabeltext [\s!it] [\v!march=marzo]
+\setuplabeltext [\s!it] [\v!april=aprile]
+\setuplabeltext [\s!it] [\v!may=maggio]
+\setuplabeltext [\s!it] [\v!june=giugno]
+\setuplabeltext [\s!it] [\v!july=luglio]
+\setuplabeltext [\s!it] [\v!august=agosto]
+\setuplabeltext [\s!it] [\v!september=settembre]
+\setuplabeltext [\s!it] [\v!october=ottobre]
+\setuplabeltext [\s!it] [\v!november=novembre]
+\setuplabeltext [\s!it] [\v!december=dicembre]
+
+\setuplabeltext [\s!pt] [\v!january=janeiro]
+\setuplabeltext [\s!pt] [\v!february=fevereiro]
+\setuplabeltext [\s!pt] [\v!march=mar\c{c}o]
+\setuplabeltext [\s!pt] [\v!april=abril]
+\setuplabeltext [\s!pt] [\v!may=maio]
+\setuplabeltext [\s!pt] [\v!june=junho]
+\setuplabeltext [\s!pt] [\v!july=julho]
+\setuplabeltext [\s!pt] [\v!august=agosto]
+\setuplabeltext [\s!pt] [\v!september=setembro]
+\setuplabeltext [\s!pt] [\v!october=outubro]
+\setuplabeltext [\s!pt] [\v!november=novembro]
+\setuplabeltext [\s!pt] [\v!december=dezembro]
+
+\setuplabeltext [\s!fr] [\v!sunday=dimanche]
+\setuplabeltext [\s!fr] [\v!monday=lundi]
+\setuplabeltext [\s!fr] [\v!tuesday=mardi]
+\setuplabeltext [\s!fr] [\v!wednesday=mercredi]
+\setuplabeltext [\s!fr] [\v!thursday=jeudi]
+\setuplabeltext [\s!fr] [\v!friday=vendredi]
+\setuplabeltext [\s!fr] [\v!saturday=samedi]
+
+\setuplabeltext [\s!sp] [\v!sunday=domingo]
+\setuplabeltext [\s!sp] [\v!monday=lunes]
+\setuplabeltext [\s!sp] [\v!tuesday=martes]
+\setuplabeltext [\s!sp] [\v!wednesday=mi\'ercoles]
+\setuplabeltext [\s!sp] [\v!thursday=jueves]
+\setuplabeltext [\s!sp] [\v!friday=viernes]
+\setuplabeltext [\s!sp] [\v!saturday=s\'abado]
+
+\setuplabeltext [\s!it] [\v!sunday=domenica]
+\setuplabeltext [\s!it] [\v!monday=luned\`\i]
+\setuplabeltext [\s!it] [\v!tuesday=marted\`\i]
+\setuplabeltext [\s!it] [\v!wednesday=mercoled\`\i]
+\setuplabeltext [\s!it] [\v!thursday=gioved\`\i]
+\setuplabeltext [\s!it] [\v!friday=venerd\`\i]
+\setuplabeltext [\s!it] [\v!saturday=sabato]
+
+\setuplabeltext [\s!pt] [\v!sunday=domingo]
+\setuplabeltext [\s!pt] [\v!monday=segunda-feira]
+\setuplabeltext [\s!pt] [\v!tuesday=ter\c{c}a-feira]
+\setuplabeltext [\s!pt] [\v!wednesday=quarta-feira]
+\setuplabeltext [\s!pt] [\v!thursday=quinta-feira]
+\setuplabeltext [\s!pt] [\v!friday=sexta-feira]
+\setuplabeltext [\s!pt] [\v!saturday=s\'abado]
+
+%D \ShowAllLanguageValues [\s!fr] [french] franse slag
+%D \ShowAllLanguageValues [\s!sp] [spanish] spaans benauwd
+%D \ShowAllLanguageValues [\s!it] [italian] italiaanse ...
+%D \ShowAllLanguageValues [\s!pt] [portuguese] portugese ...
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-lab.tex b/tex/context/base/lang-lab.tex index a5c19a31b..68b796d7c 100644 --- a/tex/context/base/lang-lab.tex +++ b/tex/context/base/lang-lab.tex @@ -1,181 +1,182 @@ -%D \module -%D [ file=lang-lab, -%D version=1997.08.27, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Language Head and Label Texts, -%D author=Hans Hagen / Tobias Burnus, -%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}{Language Head and Label Texts} - -\unprotect - -%D In this module we deal with language dependant labels and -%D prefixes, like in {\em Figure~12} and {\em Chapter 1}. In -%D this file we set the default values. Users can easily -%D overrule these. -%D -%D This module is dedicated to the grandfather of Tobias -%D Burnus, who's extensive languages oriented library helped us -%D a lot in finding the right translations. All those labels -%D are collected in files that reflect their common ancestor. - -%D \macros -%D {setupheadtext, setuplabeltext} -%D -%D First we present some macros that deal with what we will -%D call head and label texts. Such texts are defines by: -%D -%D \showsetup{\y!setupheadtext} -%D \showsetup{\y!setuplabeltext} -%D -%D In a few paragraphs we'll show quite a lot of examples -%D of its use. - -\def\setupheadtext% - {\dosetupsometextprefix\v!kop} - -\def\setuplabeltext% - {\dosetupsometextprefix\c!label} - -\let\handletextprefix=\relax - -\def\dodosetupsometextprefix#1% - {\def\dododosetupsometextprefix[##1][##2]% - {\ifsecondargument - \def\docommando####1{\dodocommando[#1##1][####1]}% - \processcommalist[##2]\docommando - \else - \def\docommando####1{\dodocommando[#1\currentmainlanguage][####1]}% - \processcommalist[##1]\docommando - \fi}% - \dodoubleempty\dododosetupsometextprefix} - -\def\dosetupsometextprefix#1% - {\def\dodocommando[##1][##2=##3]% - {\setvalue{##1##2}{\handletextprefix{##3}}}% - \dodosetupsometextprefix{#1}} - -%D By setting \type{\handletextprefix} to something else than -%D \type{\relax}, like \type{\uppercase}, one can influence the -%D conversion. -%D -%D These commands accept all kind of inputs: -%D -%D \starttypen -%D \setuplabeltext [language] [label=text] -%D \setuplabeltext [language] [label=text,label=text,...] -%D \setuplabeltext [label=text] -%D \setuplabeltext [label=text,label=text,...] -%D \stoptypen -%D -%D The last two cases concern the current language. - -%D \macros -%D {headtext, labeltext, LABELTEXT} -%D -%D Once defined, head and label texts can be called upon using: -%D -%D \showsetup{\y!headtext} -%D \showsetup{\y!labeltext} -%D -%D The latter one has an upcased alternative \type{\LABELTEXT}. - -\def\labellanguage{\currentmainlanguage} -\def\headlanguage {\currentmainlanguage} - -\def\headtext% - {\dogetupsometextprefix\headlanguage\v!kop} - -\def\labeltext% - {\dogetupsometextprefix\labellanguage\c!label} - -\def\LABELTEXT#1% - {\bgroup - \let\handletextprefix=\uppercase - \the\everyuppercase - \dogetupsometextprefix\labellanguage\c!label{#1}% not \labeltext (see \MONTH) - \egroup} - -\unexpanded\def\dogetupsometextprefix#1#2#3% - {\doifdefinedelse{#2#1#3} - {\getvalue{#2#1#3}} - {\doifdefinedelse{#1#3} - {\getvalue{#2#3}} - {{\tttf[#2: #3/#1]~}}}} - -%D \macros -%D {presetheadtext,presetlabeltext} -%D -%D The next two macros enable us to automatically define -%D head and label texts without replacing predefined ones. -%D This are internal macros. - -\def\dopresetsometextprefix#1% - {\def\dodocommando[##1][##2=##3]% - {\doifundefined{##1##2} - {\setvalue{##1##2}{\handletextprefix{##3}}}}% - \dodosetupsometextprefix{#1}} - -\def\presetheadtext% - {\dopresetsometextprefix\v!kop} - -\def\presetlabeltext% - {\dopresetsometextprefix\c!label} - -%D \macros -%D {translate} -%D {} -%D -%D Sometismes macros contain language specific words that are to -%D be typeset. Such macros can be made (more) language -%D independant by using: -%D -%D \showsetup{\y!translate} -%D -%D like for instance: -%D -%D \starttypen -%D \translate[en=something,nl=iets] -%D \stoptypen -%D -%D which expands to {\em something} or {\em iets}, depending on -%D de current language. - -\def\dotranslate[#1]% - {\getparameters[\??lg][#1]% - \getvalue{\??lg\currentlanguage}} - -\unexpanded\def\translate% - {\dosingleempty\dotranslate} - -%D When used without argument, the last defined values are -%D used. This enables repetitive use like -%D -%D \starttypen -%D \en \translate\ means \nl \translate -%D \stoptypen - -%D \macros -%D {assigntranslation} -%D {} -%D -%D This macro is a system macro, and can be used to assign a -%D translation to a macro. Its form is: -%D -%D \starttypen -%D \assigntranslation[en=something,nl=iets]\to\command -%D \stoptypen - -\def\assigntranslation[#1]\to#2% - {\getparameters[\??lg][#1]% - \edef#2{\getvalue{\??lg\currentlanguage}}} - -\protect - -\endinput +%D \module
+%D [ file=lang-lab,
+%D version=1997.08.27,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Language Head and Label Texts,
+%D author=Hans Hagen / Tobias Burnus,
+%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}{Language Head and Label Texts}
+
+\unprotect
+
+%D In this module we deal with language dependant labels and
+%D prefixes, like in {\em Figure~12} and {\em Chapter 1}. In
+%D this file we set the default values. Users can easily
+%D overrule these.
+%D
+%D This module is dedicated to the grandfather of Tobias
+%D Burnus, who's extensive languages oriented library helped us
+%D a lot in finding the right translations. All those labels
+%D are collected in files that reflect their common ancestor.
+
+%D \macros
+%D {setupheadtext, setuplabeltext}
+%D
+%D First we present some macros that deal with what we will
+%D call head and label texts. Such texts are defines by:
+%D
+%D \showsetup{\y!setupheadtext}
+%D \showsetup{\y!setuplabeltext}
+%D
+%D In a few paragraphs we'll show quite a lot of examples
+%D of its use.
+
+\def\setupheadtext%
+ {\dosetupsometextprefix\v!kop}
+
+\def\setuplabeltext%
+ {\dosetupsometextprefix\c!label}
+
+\let\handletextprefix=\relax
+
+\def\dodosetupsometextprefix#1%
+ {\def\dododosetupsometextprefix[##1][##2]%
+ {\ifsecondargument
+ \def\docommando####1{\dodocommando[#1##1][####1]}%
+ \processcommalist[##2]\docommando
+ \else
+ \def\docommando####1{\dodocommando[#1\currentmainlanguage][####1]}%
+ \processcommalist[##1]\docommando
+ \fi}%
+ \dodoubleempty\dododosetupsometextprefix}
+
+\def\dosetupsometextprefix#1%
+ {\def\dodocommando[##1][##2=##3]%
+ {\setvalue{##1##2}{\handletextprefix{##3}}}%
+ \dodosetupsometextprefix{#1}}
+
+%D By setting \type{\handletextprefix} to something else than
+%D \type{\relax}, like \type{\uppercase}, one can influence the
+%D conversion.
+%D
+%D These commands accept all kind of inputs:
+%D
+%D \starttypen
+%D \setuplabeltext [language] [label=text]
+%D \setuplabeltext [language] [label=text,label=text,...]
+%D \setuplabeltext [label=text]
+%D \setuplabeltext [label=text,label=text,...]
+%D \stoptypen
+%D
+%D The last two cases concern the current language.
+
+%D \macros
+%D {headtext, labeltext, LABELTEXT}
+%D
+%D Once defined, head and label texts can be called upon using:
+%D
+%D \showsetup{\y!headtext}
+%D \showsetup{\y!labeltext}
+%D
+%D The latter one has an upcased alternative \type{\LABELTEXT}.
+
+\def\labellanguage{\currentmainlanguage}
+\def\headlanguage {\currentmainlanguage}
+
+\def\headtext%
+ {\dogetupsometextprefix\headlanguage\v!kop}
+
+\def\labeltext%
+ {\dogetupsometextprefix\labellanguage\c!label}
+
+\def\LABELTEXT#1%
+ {\bgroup
+ \let\handletextprefix=\uppercase
+ \the\everyuppercase
+ \dogetupsometextprefix\labellanguage\c!label{#1}% not \labeltext (see \MONTH)
+ \egroup}
+
+\unexpanded\def\dogetupsometextprefix#1#2#3%
+ {\doifdefinedelse{#2#1#3}
+ {\getvalue{#2#1#3}}
+ {\doifdefinedelse{#1#3}
+ {\getvalue{#2#3}}
+ {{\tttf[#2: #3/#1]~}}}}
+
+%D \macros
+%D {presetheadtext,presetlabeltext}
+%D
+%D The next two macros enable us to automatically define
+%D head and label texts without replacing predefined ones.
+%D This are internal macros.
+
+\def\dopresetsometextprefix#1%
+ {\def\dodocommando[##1][##2=##3]%
+ {\doifundefined{##1##2}
+ {\setvalue{##1##2}{\handletextprefix{##3}}}}%
+ \dodosetupsometextprefix{#1}}
+
+\def\presetheadtext%
+ {\dopresetsometextprefix\v!kop}
+
+\def\presetlabeltext%
+ {\dopresetsometextprefix\c!label}
+
+%D \macros
+%D {translate}
+%D {}
+%D
+%D Sometismes macros contain language specific words that are to
+%D be typeset. Such macros can be made (more) language
+%D independant by using:
+%D
+%D \showsetup{\y!translate}
+%D
+%D like for instance:
+%D
+%D \starttypen
+%D \translate[en=something,nl=iets]
+%D \stoptypen
+%D
+%D which expands to {\em something} or {\em iets}, depending on
+%D de current language.
+
+\def\dotranslate[#1]%
+ {\getparameters[\??lg][#1]%
+ \getvalue{\??lg\currentlanguage}}
+
+\unexpanded\def\translate%
+ {\dosingleempty\dotranslate}
+
+%D When used without argument, the last defined values are
+%D used. This enables repetitive use like
+%D
+%D \starttypen
+%D \en \translate\ means \nl \translate
+%D \stoptypen
+
+%D \macros
+%D {assigntranslation}
+%D {}
+%D
+%D This macro is a system macro, and can be used to assign a
+%D translation to a macro. Its form is:
+%D
+%D \starttypen
+%D \assigntranslation[en=something,nl=iets]\to\command
+%D \stoptypen
+
+\def\assigntranslation[#1]\to#2%
+ {\getparameters[\??lg][#1]%
+ \edef#2{\getvalue{\??lg\currentlanguage}}}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-nl.hyp b/tex/context/base/lang-nl.hyp index 1e56fb9cb..7d997255d 100644 --- a/tex/context/base/lang-nl.hyp +++ b/tex/context/base/lang-nl.hyp @@ -1,5 +1,5 @@ -% additional hyphenations - -\hyphenation{vrije-tijds-be-ste-ding} - -\endinput +% additional hyphenations
+
+\hyphenation{vrije-tijds-be-ste-ding}
+
+\endinput
diff --git a/tex/context/base/lang-nl.pat b/tex/context/base/lang-nl.pat index 4eeb65a29..9bc73109c 100644 --- a/tex/context/base/lang-nl.pat +++ b/tex/context/base/lang-nl.pat @@ -1,7946 +1,7947 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% These are TeX hyphenation patterns for Dutch generated at the -% Computer Science Department of Utrecht University. -% Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands. -% Telephone: +31-30-531454, e-mail: postmaster@cs.ruu.nl -% -% Copyright (c) 1989 by CELEX. -% CELEX, Wundtlaan 1, 6525 XD Nijmegen, The Netherlands. -% Telephone: +31-80-615751, email: celex@hnympi52.bitnet -% -% General permission for non-profit usage is granted. -% For commercial usage contact CELEX at the above address. -% Copying of this file is only permitted with inclusion of -% this copyright notice and with these same restrictions. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\patterns{% -.aan5 -.aard5a -.aard5r -.aarts5 -.ab5l -.ad3ek -.ad3eq -.ad3op -.ad3or -.ad5ren -.ad3s -.af3ra -.al3f -.aller5 -.al5m -.al4st -.am3p -.an3d4 -.an4kl -.an5od -.an3th -.ap2n -.ar3tr -.as3p -.as1t -.as5th -.as3tr -.at5j -.at4r -.ba3ta -.be3la -.be5lo -.berg5l -.bij1 -.bit5se -.bli4 -.boot5j -.bu2s -.ca4te. -.cater5 -.ce4len -.co4ler -.culot4 -.daar5 -.da4gi -.dag3r -.da4k -.de2a -.denk5r -.de3ra -.de3ro -.des5p -.de5sta -.di4s -.dom5o -.du5et -.edel5a -.ed3w -.ek3s -.ek4w -.elo3 -.en3t -.er5aa -.er4f3l -.erop3 -.ert4 -.er3ui -.es3 -.eu5t -.exi1 -.gaat3 -.ga4me. -.ge3f -.ge3la -.ge5le -.ge5lo -.ge3n4a -.ge5ne -.ge5no -.ge3r4a -.ge5r4e -.ges4 -.ge3sk -.gram5e -.haar5s -.hand5a -.handels5 -.hand5s -.he2a -.he2r -.her3i -.her3u -.ho4les -.ho4met -.honing5 -.hy4de -.ij2s -.ij4s3l -.ijs5t -.ima4ge -.in1 -.in3d4 -.in5g -.ingeni5 -.ink4 -.innes5 -.in3s4 -.in3t -.jes2 -.ka4taa -.ka4te. -.ke5na -.ke3ra -.ker4kl -.kerk5u -.kerst5r -.klok5 -.koot5 -.kort5a -.krop5a -.lak5l -.la5th -.lead5 -.le4b -.leef5 -.le4go -.le4gr -.lek5w -.le5ni -.len4s -.lente5 -.les3 -.le3th -.lip5l -.long5a -.loot5 -.los5 -.luit4 -.mede5 -.mein3 -.me5li -.melk5o -.mer4k5l -.me3so -.miet5j -.mij4n5i -.mo4s -.mos3k -.na3fl -.na1s -.negen5 -.nes5tel -.ne4t5j -.no5t -.och3 -.oe4r -.oe4s3 -.olf4 -.olie3 -.om1a -.on1 -.on3i -.on3s -.on2t -.ont5ee -.ont5eren -.ont5ra -.ont5rol -.op5at -.op5r -.over5e -.over5s -.pa2k -.pee5tj -.peri5 -.pe4te. -.piet5j -.prik3 -.puit4 -.qua5d -.quit4 -.raat4 -.ran4ch -.read3 -.record5 -.rei4s5 -.re4mol -.re5na -.re5s4cr -.res3p -.reu5t -.rie4t5a -.rijk4s -.rij5sp -.ring5s -.ro4l -.ro4q -.ro4sk -.sa4p -.sce4ne -.seig5 -.se4st -.se2t -.sha4 -.sha5ker -.sis5t -.ski3s -.slee5tj -.sli2 -.snap3 -.so4v5 -.spoor5 -.st2 -.ste4m3 -.ster5an -.sty4 -.sul3 -.taart5j -.taat4 -.tan4da -.ta3ro -.te4f -.tek2 -.te5nor -.ten4tj -.te4ra -.ter4pa -.tes5tat -.thee3 -.tic5k -.ti4me -.ti4na -.to2s -.traat4 -.tros5 -.ts4 -.tu4ne. -.ui2 -.ui3le -.uit1 -.uit4je -.vaat5j -.van3o -.veld3 -.ven5s -.ven4t5j -.ver1 -.ve5ring -.ver5sta -.vet5r -.volg5or -.vu4l3 -.was3t -.weet5 -.we2l -.wel3o -.wet4s -.work3 -.xe1 -.ya2l -.zend5a -.zes3 -.zit3 -a4a4 -aad3a -aad3o -aad3r -aaf5a -aag1 -aag3r -aags4 -aag5so -aai1 -aak1 -aak3l -aak5n -aak3r -aak3w -aal1a -2aald -aal1e -aal3k -aal1o -4aalr -aal5sc -4aalv -aam1 -aan1 -aan3a -5aandee -aan5g -5aangi -1aanj -aan5k -5aann -5aansla -aan3sp -5aanta -5aanvr -3aanwi -aanzet5 -aap1a -aar1 -5aardapp -aar4th -aart5ro -aas3e -aas3f -aas3p -aat3a -aat3h -aat3o -aat3r -a1b -abak4s3 -aba4s -abe4la -ab5err -ab5ijz -able2 -a4ble. -a4bles -3abonn -ab3ru -4ace -a2ce. -a3cee -a3cep -a4cer. -a4cers -a4ces -5aceta -2ach. -a3cha -2a1che -4a1chi -a1cho -a3chr -4achs -a1chu -2acl -2aco -2acr -4acs -acu5e -a1d -2ad. -ad2a -ad3aa -ad3ad -ada5g -ada2r3 -a4dete -ade4tj -2adi -2adl -5admini -ad3ora -2adp -3adres -a5dri -ad5rol -ad3sla -ad5uit -4ady -2ae -aege4 -aek4 -ael4 -a4fau -af3d -af1dw -4afe -af3ei -afe4la -a2f5ep -af5ex -1afg -2afi -a4fin -af3l -2afo -afon4d -af1r -af3ric -af5rie -af3ris -af3rit -af3ru -af3s -5afsl -5aftr -a4fu -3afzet -4aga -ag1ad -agas4s -age2o -a4gins -agis5t -ag3le -ag3ord -ag3reg -ag3roo -ag3sla -ag4spr -ag5ur -a4g3uu -a1h -4ah. -ahe5ri -ah3l -ah5r -ai1e -aig4 -aik4 -ails4 -ai4lu -2ais4 -ai5sa -ai3sc -ais5k -ai1so -ai4sol -ai1t -4a1j -2ak. -5akade -ak3arb -a4ked -aker4se -a2kes -a2kez -2akh -akhou4 -ak3id -a2k1l -ak3la -ak3lo -ak3na -ak3ne -a4kog -ak3ond -4akp -2aks -4aks. -5aksij -ak5spa -ak1st -4akt. -ak5uu -ak3we -a1la -a5lal -alan4st -a4lap -5album -2ald -a2lel -a4lents -al2fe -alf3l -alf2r -4alia -alie5tj -al4kank -al4kro -al4mac -5almana -al4mol -a1lo -al3omt -alo4n -al5ou -al3ph -als3j -al2sl -als5m -als3oo -al4stem -al4sti -al3tha -al4t5ro -a1lu -5amandel -4ambe -1ambt -ame4ran -3ameu -4amm -am5pe -am2pl -ampoo5 -ams5ap -am4se -am4sm -am4sn -am2sp -am3spe -an2aa -an4af -a2na2g -a5nagen -an5alge -a4n5ame -an3arc -an4ded -2andj -and4ri -a4nec -an3emi -a3nen -an3est -an4gan -an4gap -anges4 -ange5st -ang5le -an2gr -ang5ste -a3ni -ani5t -5anjelie -4ank. -an4kaa -an4kak -an4kas -anker5k -ank5ins -an4kna -an4k5of -an2kr -ank3ro -ank5wet -annet4 -an5opt -an5ort -ano3st -an3scr -an2so -an2sp -5antenn -antes4 -ant2h -an3tha -an5to -ants5ta -anu5e -an5ui -an5ur -a4nuu -anval4s -a1o -a2ob -a4op4 -4ap. -a1pa -a2pe. -a4ped -ap3j -ap3le -a1plu -a1po -apo5p -1appa -5appels -3appr -a1pr -a4p3rij -april3 -ap2sl -ap2sp -2apu -a1py -a1q -a4ques -4ar. -a1ra -ara5ce -ara5kl -a4r5app -5archief -5arctic -ar2da -ard3ac -ard3ol -ard3op -ar2dr -ar4dran -ard3ri -ard3w -a4rew -arg3l -3argum -a1ri -ari4an. -ari4ce -ariet4 -ari5ett -arkeer5 -ar3k4l -2arl -ar4map -ar4mu -ar4nes -a1ro -2aroo -ar5s2e -ar4s1l -ars3la -ars3m -ar2sn -ar5sni -ar2so -ar4spa -ar4spr -ars5tal -ar4stek -ar4str -ar4tak -ar4tap -art5een -5artike -ar2tj -ar4top -ar2tr -art4sl -arts5le -a3rus -a1ry -4asa -asal4 -as1ap -a2sc -as4ch -as4cr -a2seb -a2sec -as4ee -a2sel -a3sem -as4en -as2hi -asi4on. -asis5t -a2sl -as3lam -as3lan -as3li -aslijs4 -as3m -as3pa -as5pect. -as5pecte -as5per -as3pi -as3pl -assi3s -3assoc -5assu -as1ta -as3tan -a5stat -a4s3te -as4th -as3ti -as5tic -as3ton -ast5red -a1t -at1ac -a4talen -ata1s -a4taz -5atelier -ate4rec -ate4rek -ateri5el -ater5ijs -4atg -at2ha -a3thar -atie5s4 -a2tj -3atlas -3atmos -2atn -a2t3re -a3trek -at2sl -at4slo -ats5lot -ats5m -at5sni -at2sp -at4stak -at4sti -at4stre -at2tu -2au -4au. -au1ch -au3e -3aug -au3kr -auli4ne -aul4le -aup2 -au5ph -aur2 -au5re -4aus -au3sa -au5so -au1t4 -3auto -au1wi -4auz -a1v -ava5ne -ava5str -aven3s -ave3re -ave3ri -aver4u -a3vi -avil4l -1avo -5avond -4avot -a1w -aw5re -4ay -ay4a -a1z -aze3s -aze5tj -5azia -1ba -baar3t -babe4 -babet4 -ba4ch -ba4da -ba4des -ba4dr -bag4h -ba4ka -bal4kla -ba3na -ban4d5r -band5s -ba4ne. -ban4kl -ban4kn -ban4k3o -ban4kr -bank3w -ban4q -ba5ru -baseli4 -bassi4 -bas3t -2b1b -bbe4lag -bbe4lee -bbe4n -2b1c -2b1d -3be -be3am -be4art -be3dw -beet1 -be3g4 -beien5 -beis4 -bei4tj -be3ke -be3kl -be4lex -bel5f -bel3k -bel3sp -be1ra -be5r2e -ber4g5af -ber4g5et -bergi4 -ber4gl -ber4gr -ber5na -be1r2o -ber5oc -be4ron -bers4k -ber4sto -be5ru -be1s4 -bes5ac -bes5k -be3sm -bes5s -bes5te. -be5stij -be5stik -be1tw -beur4s -2b1f -2bg -4b3h -1b2i -bid3s4 -bi4du -bi5enn -biet5j -bi3eu -bij5a -bij3d -bij3k -bijs2 -bij3sl -bij3sm -bin4dr -bin4tj -bio3 -bis4a -bi3se -bis4tr -bi1tr -bit4se -2b1j -2b1k -1b4l -5blan -b5led -blet5j -bleus4 -3bli -blik3o -4blish -blok3 -2b1m -b1n -1bo -bo5de2 -boe4ga -boe4kn -boeren5 -boe3s4 -bo5ko -bo4les -bo2ma -bom3aa -bo4mo -bonai4 -bond4s -bon4tj -bon4to -boos4t3 -b5orig -bor4st5a -bor4sto -bor4st5r -bos3 -bo4sp -bos4ses -bo2su -bo2th -bot3j -bo4tu -bou5ta -boven3 -boy5 -1b2r2 -braat4 -b4re -breis4 -brei5st -bri4a -bri4l -bro4n -bru2l5 -2b1s2 -b3s4c -b2sla -bsou4 -2b1t2 -bt4s3 -1bu -buit4j -bus3c -bu2su -b1v -2bw -by5la -byr4 -bys4 -2b1z -1ca -ca4chem -cae3 -cag4 -ca2k -came5r -can4nes -ca3pa -ca2pe -ca5ra -cara4t -ca4re. -ca3ro -cas3t -cat2 -ca3ta -cate4r -ca3th -2c1c -cca5 -cce4s -1ce -cee2 -cei4 -3cel -celi4n -ce4lop -4cema -ce3na -2ceni -3cent -cen4t5j -4cepa -ce3ra -5cere -ce3r4o -ce2s -ce3s2a -4cesp -ce3su -ce2tj -2ch. -chaar4s -char5t -chas5 -4chav -2chc -2che. -4cheb -2cheg -2chek -che4lee -4chemu -4cheor -4chep -3cheq -che3ri -4chero -2ches -2chev -4chg -4chh -chi4k -5chlo -4chm -4chn -cho3s -2chp -3chris -5chromo -2cht -3chum -2chw -1chy5 -3ci -ci4al. -cier4s -ci1eu -ci4le. -ci4nen -ci1p -ci4so -ci3t4 -ci5ta -c3j -2c2k -cka4 -ck1en -ck3ers -c5keten -ck5etk -ck3l -ck3n -cks4 -1c2l -cle4v -c4li -cli4q -clo4ne. -clo4se. -cly4 -2cn -cno4 -1co -3co. -3coa -co5ad -3cod -5co2k -3col -co4le. -colet4 -co2lu -3com -3con -con3g -con3s -con5t4 -cop4 -3copa -co4pe. -co3pr -coquet4 -3cor -co3ro -corp2 -corps5 -cor5s -3cos -3cot -3cou -4cout -co2v -cov5erb -cov5ers -4c1q -c4ques -1c4r2 -cra4y -2crib -3cris -5crit -cros4 -cross5en -crui4 -2c1t -ct3ad -cte2n -c2th -cti4on. -cti4ons -c2tj -ctoi4 -c2ton -ct5ond -cto4rin -c2t5re -ctu4re. -1cu -cu4ad -cuk4 -3cul -cur3s -5cy -cy4th -c3z -1da -5da. -3daag -4daam -4daanb -d3aanw -4d5aap -4d5acc -d5adel -2d1af -da3fr -da2ga -da4ged -da4g5et -da4gon -dag3op -da4gor -da2gr -da2gu -5dai -5dak. -d4a5ke -5daken -2d3akk -dak3l -da2k3r -4daks -d5aksen -4dalar -4dalm -da2l5u -d2ame -dames5 -3dan -da4nas -dan4kl -dan4sm -dans3p -2d1ap -d2ape -3dapes -5dapu -da2ra -2d1arb -3dari -dar2m -darm3a -das3t -5dati4 -dat5j -2d5atl -5daue -4d3aut -da4ve. -2d1b4 -dbou4wi -2d1c -2d3d2 -dde4lev -dde2n -dde4red -dde4ree -dder5o -dde3s -1de -de1ch -deeg5 -2deen -5deen. -dee4r -deer5i -dee3t -4deff -4deg. -2dei -de4klaa -de4klag -de4kna -4deksa -de4lac -4delas -del3dr -4delec -del5eeu -4delek -4d3elem -5delen -de4leng -de4lon -del5or -de4lov -del4sl -del4str -del5t -4demai -4demm -d5emme -d4en. -de4nab -den4ac -den4du -de4nep -4d5engt -den4kof -den4kop -den4kr -de2no -den3oo -der5aan -de3rab -de3ras -de4rei -der5ein -de4rem -de4rep -de4ret -der5fr -de4rim -de4rin. -der3k -der3na -der3of -der3on -der4sa -der5th -4derts -der5tw -der1u -de2s -desis5 -de4sk -des5kr -de3sl -des4pel -de3sta -des3ti -de5stic -de3sto -de3str -det2 -de3ta -4deten -detes5 -de3tw -4d5eu4ro -de5us. -dewin4d -2dex -3dex. -2d1f2 -2d1g -d4ge. -d4ges. -d3g4l -2d1h -d3he -dher5i -dhun4 -1di -dia3s2 -dic5k -5die -die2f -dienst5r -diep5l -die5sp -die4tra -di1eu -di2ga -dig3aa -2dijz -d5ijzer -di4ko -dik5w -2dind -d5indi -2dinf -d5ingeni5 -din5gh -2dinr -2d1ins -4dinw -4dinz -dis5co -di4sin -dis5t -dit5j -2d1j -2d1k -2d3l -dlan4de -dli2n -2d1m -dmoes4 -2d3n -1do -5do. -5doc -2doef -doe2l -5doi -d4ok -dok4r -dol5f -dolk3s -do2mo -dom2s -2d5omz -5don. -2dont -3donti -dont4l -doorn5ac -2dop -do4pe. -do4pes -3dopj -d3o4pl -5doppen -3dopt -d5oree -2d1org -do3ro -dors3m -do3sk -5dovl -2d3p2 -dpren4 -d2r2 -3dra -4drand -4drap -4dras -d4re. -d3rec -d3red -5dreef -d3rege -4d3rel -d5rem. -3dremp -d5rese -d3resu -5dreve -2dric -dri5en -dries4 -drie5t -3d4rif -d3rijd -d3rijk -3drijv -3drin -3dris -d3rit -dri2v -4droei -3drog -4drok -d5roman -d3rond -d3rood -4droos -d3rov -d4roy -4d3roz -4drug -drug4s -d3ruim -3druk -4drus -4ds -ds1a -dsa4d -ds2al -dsas3 -d3sch -ds4cor -d4sed -d2see -d4sek -dse4la -d3sen -d4ses -dsex2 -d5sfeer -d2si -dsi4ga -d2sl -d3slaa -d3slac -ds5lam -d5slang -ds3lie -d3slin -d5s4mak -ds4mee -ds3na -ds3no -d3snu -ds1o -ds2oo -d4spal -d5s4pel -d4spet -d1spi -d4spon -d3spor -ds4pre -d1st -d3sta -d4staal -d4stab -d4staf -d4stal -d3ste -d4stek -d4s5tera -ds3th -d4stit -d2su -d3sur -2d3t2 -1du -du4bl -2duil -dui4t -4duitg -du1o -dus3 -dut5j -du4wee -2d1v -2d1w -d2wa -d3waar -d3wac -4dwarm -4d3wat -d3weg -d4wei -d3wek -d3wer -d3wes3 -d3wet -1dy -4dyo -dy2s3 -2d1z -d2zj -e1a -e3aa -e3ac -e4ade. -e4ades -ea2di -ea4dor -ead5s4 -ea5fr -ea2gu -e3ai -ea2k -e2akd -e4ake -e4ako -eals4 -e2am -e3amb -e5anc -e3and -e3ant -e4anu -e5ap -ea2ri -ea2s -ea5si -e4at. -e2ath -e4atm -eatri4 -eatu4 -eau4n -eau3s4t -e1b -e5bo -ebo4k -e3br -e3cha -e1che -ech5es. -e1chi -e3cho -echte5ri -ec3le -3econo -ecor2 -ec4tin -e1d -4ed. -e3dam -edenk5r -ed3ijz -e2dov -ed5ric -e3dru -edsel3 -ed1sp -ed2w -e3dwan -e2e -ee2da -eede5r -ee5do -eed5w -ee2f -eef3l -ee4gli -ee2gr -ee2k -eek5ak -eek1e -ee5ker -eek5lo -eek3n -ee3ko -ee3kri -eek5ro -eek3ur -eek3uu -ee2l -ee3led -ee3li -eel3k -eel4si -2eem -ee2n1 -eeng4 -een5ie -een3k -een3sl -eep3ac -eer1a -ee2ri -eer5ijz -eer3in -eer3k -eer3om -eer5oom -eer4ov -eers5ag -ee2s -ee3sc -ees4ch -ee4sem -ees3li -ee3smu -ee3spr -ees3te -ee2t -eet3h -eet3oo -eetra4 -ee4tw -e5ex -e4fad -ef3da -ef5do -3effec -3effek -ef4fle -e1fl -e4fom -e1f2r -ef3sm -e1g -egas4k -e4gec -ege4las -ege4lov -ege5ner -e4gos -eg3s4 -e1h -eid4sp -ei1e -eie3s -e1ij -eil5aar -eil3d -eil3m -ei2lo -e2in -ei4nap -ein4do -eind5oo -ein4dr -ein4du -ei4ned -ei5po -ei4re. -ei2s3a -ei5sla -eis4lo -eis4p -eis4ta -eis4tel -ei5stene -ei5str -eit2 -eite5s -ei1tj -ei4too -eit4s -eit3z -5eiwit -e3j2 -e3kaa -ekaart5j -e3kam -e3kas -2eke -ek4er -ek2et -e4kez -ek3ins -e5klam -e4klast -e3kled -ek3les -e5klim -e5klin -e4koli -ek3ov -ek4ru -ek1sa -3eksam -3eksem -eks1p -e1kw -e5ky -e1la -e5laag -elaats5t -el1ac -el5adj -el1af -el5appel -el3arb -e4l5arm -e4las. -el5dak -el2dr -5electr -el5eier -5elektr -e2lel -el5elp -e3len -e3lep -e4lert -e4leta -ele4t5j -e3lev -el4faa -el4fend -elf5lo -3elfta -el3gl -elie5t -e3lig -eli5kw -e4lind -e4linga -elings5t -e5lins. -eli4p -el5isw -3elix -elk3s4 -ellings5 -e1lo -e2lob -e3lok -e2lol -el3oli -e4lom -el5omt -el5ont -eloofs5 -e5loos -el3ops -el5opt -el5opv -e2lor -e5loz -els5ag -el4sj -el5smed -els2u -e1lu -eluks5 -e1m -ement5j -e5meri -emes3 -em3ins -e4mir -5emplacem -en1ac -e2nak -en3akk -e2nal -en5als -en5alt -en5amb -en3ana -e2nap -en3app -e5nari -en5ars -e2nas -en3asi -ena4sp -e2nav -e2naz -en4ce. -en3dar -ende4ra -5enderti -en5dop -en4dur -e2nec -en3ech -en3eil -ene4n3 -e4nent -en5epo -e3ner -e4nerf -3energ -e4nerv -e3nes -enes5te -e4nete -en5eter -ene4t5j -e2nex -en3ga -enge3s -engs4 -eng5ste -e4nid -enier4t -en5inga -enings5 -e4nink -e3nis -4enkl -en4kre -en5krin -e2non -enoot3 -en1op -eno4pl -e2nor -e3nor. -en3ord -en1ov -ens5k -en2sl -en2sn -en2so -ens3on -en5ste. -enst5ijv -en4stin -ent2h -en4trol -ent4sl -ent4sp -en1ui -e2nun -en3ur -e2nuu -5envelo -e1o -eoga4 -e3on -eonti4n -e3op -eop4l -eop4r -e4or4ge -eo1ro -eo3s4 -eota4 -e1p -ep2a -e4paf -ep4ap -e4peen -3epid -ep3j -e4poge -eponde5 -ep5rei -ep2s -eps3pr -ep4tr -e1q -e3ra. -e3raad -e4raap. -e5raat4 -er1ac -er3afd -e1rai -er3aks -e4rall -e5rami -e3ranc -e5rans -e5ranti -e3rape -e1rat -e2rav -erd2a -erd4i -er3do -er3d4w -e5re. -e5reb -e3rec -erecord5 -er5eers -er3eff -eregis5 -er5eier -e4reig -er5eind -er3eks -erel2 -e4r5emm -e5rena -ere5nad -e5rend -ere4neg -eren5sl -er5en5tw -ere4se. -ere4tj -e4rets -er3gl -e1ri -erie3s -erie3t -e3rif -e3rig -erig5a -e3rij. -e3rije -e4rijs -e4rijz -er5ijzer -e5rik -e4r3ind -e5ringst -er3ins -e4r3int -erip4 -e3ris -e3riz -erkeers5t -er3ma -er5mi -er3mo -e3ro. -e1rob -e4roc -e1rod -e1roe -e4roed -er5oef -er5oev -er5ogen. -e3rok -e1rol -er3oli -er5om. -e3roma -er5omh -er3omk -er1on -e3ron. -e5roni -er3oog -e5rook -er3oor -e2r1op -ero4pi -erop5r -e4r1or -e1ros -5erosie -e3rot -er1ov -er3oxy -er5ste. -ert4h -er5ti -er5to -er3tr -e1ru -e3ruim -eruit4j -eru2m -5erupt -e2r3ur -er3uu -5erwt -4es. -es4a2m5 -e3san -e3sas -e3sch -e5sec -e3sem -es5enc -esent5j -e5sfeer -es5he -e3shop -e5sid -es3ill -e3sjo -3eskad -e1s2m -e1sn -e1so -es5ob -e3sol -e1sp -es3pek -e4spen -e5spendee -es4poo -essis5 -est5ac -e3stad -es4tak -est5akt -e5stali -es5tant -e4s3te. -e5sted -es5teli -e3s4tem -es3ten -e4s5ten. -e5stene -e5steng -es3ter -e5sterre -es4teu -e2sti -e5stich -es3tig -es3tin -e3stof -e1stu -e3sy -e1ta -e3tali -et4ana -eta4p -e4tau -e3te -etek4k -etens5u -ete3ra -eter4s5l -e1th -et2ha -et3ham -etien4 -e3til -e3ting -e1tj -et2jo -e1to -e3ton -etou5c -etour5 -e1tr -e5tran -et5rec -e5trek -e4t5rin -et3rui -et3sap -et4sla -et4sli -et2sp -ets3pr -et4stek -et3s4u -e1tu -5etui. -et2w -e3twi -4eu. -eu4ce -eudo5 -eu3e -eug4dr -eug4r -2eui -e1uit -eu4ler -e3um. -eu4na -eun3s -eun3t -eu5pe -eu4rad -eu4rat -eu4rij -eur5k -5europe -eus3t -eut2h -e5uu -2eu2w1 -euws5a -e1v -eval4s -eve5naa -5evenre -evens5e -even4st -eve3ri -evoels5 -evol4ga -e1w -e5wen -ew5er. -ew5ers -ew2h -e3wi -1exam -1exem -4exi -1exp -3extr -ey2n -eys4 -e1z -4ez. -ezen4s -ezin4s -1fa -f3aar -f4ab -face4 -facet5 -2f1ach -5faci -fa4den -f4ag -fa5go -fa2ke -fal4to -4fana -fant4 -fan4t5j -fa4re. -3fase -f2av -2f1b -f1c -2fd -f2da -f4dele -fde4s3 -fdes4m -f4dh -f2din -fd5inga -f3doe -f1dr -fd4ra -fd4ru -fd2w -1fe -fe2a -fede1 -fee4l -f3een -3fees -feest5r -fei4t5j -f5elem -fe4lov -3fem -fen3t -fe3rab -fe3ran -fe4ret -fes3 -fes4p -fe4tj -feur4 -2fex -2f1f2 -ff3s4 -f3fu -4f3g2 -fge1 -fgo4v -4f1h -1fi -fiber5 -fi3ch -3fie -fie3tj -fiets5p -fijn5sp -2f1ijz -fi4le. -film3a -5fine -fi4nel -fi4no -4fint -fis5t -fisto3 -f1j -2f1k -f2l4 -2f5laa -f3laf -fla2p5 -fle2t -f5lev -4flie -4f3lij -f4lip -f4lor -f4lot -f3loz -2f3m -fma4d -f1n -1fo -2foef -2f3of -5fok -f3oms -fon3te -f3oog -2f1o2p -2f3org -3form -fo5ro -for4tj -fo1ru -fo5t -foto5f -2f3oud -foy4 -2f3p -fr2 -1fra -f5raam -fra4m -f2ras -f2raz -f3reg -fre4t -f4rez -f2ri -f3rij -fri4te -f2rod -4frol -fru3g -2f1s -f2sa -f3sch -f3sel -f4sh -fsho4 -f3s2j -f4slap -f4sled -fs2m -f2s1o -f3ste -fste4m -fs5terr -f3s4ti -f3stof -f5stok -f3stu -2f1t -f4tene -f2th -f2tj -ft3je -f5to -f5tro -ftwa4 -1fu -f2un -2fuu -f3uur -2f1v -2f1w -1fy -4f1z -1ga -gaar3t -4gabc -gabri5 -gaby4 -2g1ac -4g5afs -4gaft -4gafw -4gah -gal2a -gal5ach -ga5lav -ga4mes -gamo4 -gan3d -gangers5 -gan5gr -g5anker -gan4st -gapo4 -4g3arb -5gare -g3arm -g3arti -ga2s -ga4se -gas5o -gas3p -gas3tr -2gaut -4gavo -gazi2 -4g5azin -2g1b -2g1c -2g1d -g3de -g4dell -g4dim -g3doe -gd2s -1ge -ge3a -ge4ari -ge5au -4geb. -2g3ebb -2gebd -4gebt -ge1c -ge5d -gedan4 -gee4 -ge3ei -g3eend -gee2r -ge5ess -geest5r -gef4 -4geff -ge5g2 -ge5h -gei4la -gei4tj -gek4l -ge3k4w -gel4da -gel4du -gel3f -ge4l5oor -gel5ore -gel3sa -gel3sn -4gemb -4gemf -4gemp -ge4ned -gen5ent -g5engt -gen3k -ge4noc -gen5och -ge4nof -ge4nog -gens4f -gen5sfe -gen4su -gen4tr -ge5p4 -ge1ra -ger5aan -ger4dr -ge4reng -ge5req -ge5rij -ge1r2o -ge5roc -ger4sp -4gerts -ge3ru -geru5m -ge1s2 -ge3s4a -ge3sc -ge5se -ge3sh -ge3sj -4ges4k -ge5s4l -ge3s4m -ge3so -ges4p -ge5sper -ge3spl -ges4te -ge5stil -ge3ta -get4i -get4j -ge5tjo -ge5tsj -ge3t4w -3gev -2g5ex -2g1f2 -4g3g4 -gge4nol -2g1h -g2het -g2hum -1gi -gier4s -gi1eu -gi2f -2gij -g5ijzer -gi4mes -gi4nes -2ginf -g5ingeni5 -gis5trer -2g1j -2g1k -2gl -g3la2m -3gla4s -3glaz -g2le -g3leg -g3lei -4g5lep -g3ler -gli2d5 -glij5ko -3glik -g2lim -gli4n -g5lio -3glob -3glom -4g3lon -g1loo -g1lop -5glos -3g2ly -2g1m -2g1n -g3na -gneet3 -g4ners -gne4tj -g2no -g5nol -g3non -1go -5go. -go2a -2goc -g1och -godon4 -god4s -goed5a -2goef -goes3 -go5fr -4goh -go2k3 -go2ma -gom5ac -go4mel -4g3ong -4gont -2g3oor -2gop -gop4la -4gore -4gorg -g5orga -gor4s -gos5p -go3tr -gou4dee -gouil4 -2gov -2g1p -1g2r2 -g3rak -gra2m -g4ra2s -gra4ves -2g3red -gree4 -g5reel -2grei -g3reis -4grem -gren4s -gre4s -gres5l -griet5j -g3rijk -grijs5t -gri4mes -2griv -groeps5 -groet5j -4grok -g3roke -4grou -5groun -2g5rug -g3ruim -g3ruk -2gs -gs1a -gsas3 -g2sc -g3sch -gs5chef -g4sco -gscorres5 -g4scr -g2se -g5se. -gs1ef -gs3eig -gs3eis -gs3ek -g3sel -gs3f -gs5he -gsher5 -g2s1i -gs4ke. -gs4ken. -gs4kes -g2sl -g5slang -gs4lep -gs3lie -gs5lis -g3slu -g4sma -gs4maak -g3snoe -g2s1o -gs3p -gs4pel -g5spele -gs4pet -gs4pi -g3spie -gs5pir -gs5taal -g5staand -g5staar -gs5tab -gs5tac -g5stal -g3stam -g5stat -g1ste -g3s4te. -gs3teh -g3stel -g4stelg -g5ster. -gs5tera -g5sters -gs3th -g3stig -g5stof -g5stok -g3stu -g2su -gs1ui -gs3uu -gs5w -g3sy -2g1t -g4tap -gtui4gi -1gu -gu4al -gu2at -gu2e -2gue. -3guer -guet4 -guim4 -gui4ne. -2g3uit -gun3 -gus3 -2g1v -2g1w -3gy -2g1z -h2a -haar3t -hac5k -haf4tu -hair5s -ha4kr -hal2f3 -2hamp -han4d5o -han5dru -han3ga -hang3s -han4sl -han5so -hap5l -ha2p5r -hap4se -haps5te -ha5ren -har4t3a -har4th -hart3j -har4to -hart5sl -has3 -ha4tek -ha2t3r -hat5s -4h1b -4hc -2hd -h4e -4he. -he2ad -he2ar5 -3hech -heel3o -he4fe -heids5p -hei5k -hei4t -he4kan -he2kw -he4lan -hele4n -hel4m3a -he4lov -hel4pa -hel4pr -3hemd -hemme4 -hen4kr -2heo -he4pij -he2pl -he2p3r -hep5s -he2q -he1ra -he5raa -her3ad -he3ral -he3rau -her3c -he3rem -he2ri -her5inn -herm5eng -her4paa -herp5ac -her4pr -her3s -he3sa -he2sp -hes3t -hete1 -heut5j -4hew -4hf -h3h -4hi. -hi5d -hie4dr -hie4f -hie2r1 -hie4to -hie4tr -hilip4 -hi4ma -him4pl -him4pr -hin4tj -hi5q -2hir2 -hi4re -hirt5 -his5p -hi5tr -4h1j -2hl -h2le -2h2m -h3ma -h3me -h4mer -h5mo -4h1n -h2na -h2nit -ho5a -2hoc -5hockey -ho5dr -5hoed -hoe4ker -hoe4k5n -hoek5st -hoe4sl -ho2fa -hof5d -ho4fe -hog4 -ho2k -ho4le. -ho4me. -ho4mec -ho4mes -hon3dr -hon3ga -ho5ni4 -honig3 -hon4se -hoo4 -hoofd5r -hoorn5ac -ho4pl -ho4po -hop4sm -hop4str -ho2q -ho1ro -hor4se. -hor4tj -4ho3ru -hos5t -hot5j -hou4se -hout5a -2how -4h1p -hpi4 -2h4r -hra4b -hri2 -hris5 -hro4b -hro4k -4h1s -2ht -h4t1a -h5tans -ht3au -h4t3ec -h4ted -h2t5ee -h2tef -h4teks -h4temb -h4ten3t -hter1 -hte4rin -hte4ro -h4tesk -h2t3ev -h2tex -ht1h -ht1j -ht1o -h1ton -ht5oor -h4t3r -ht2s -ht4ser -hts1o -ht4som -hts3pl -ht5spoo -ht5spri -ht3sta -hts5teg -ht4stek -ht4sten -hts5u -ht3u -hu2ba -hug2 -huid3a -huim3a -hul4der -hulp3a -hu4me. -2hus -hu4te. -hu4tes -hut5j -huw4do -4h3v -2hw -h2wei -4hy. -3hyp -hype2 -hyper5 -h3z -i1a -i4aalt -i5aaltj -i3ac -i3ae -iaf2 -ia3g -i3ak -iak4l -i2als -ian4n -ia5no -i4ans -ias4me. -i3au -iave4 -i1b -i2bac -ibu3e -i5ca -ica4p -i3cen -i1cha -i1che -i3chi -i1cho -4ici -ick5er -ic5key -id3ach -id3ame -i3dat -idder5a -id4e -5ideolo -ider4sp -ider4st -id2g -idings5t -i2d5ir -id3ru -id2s1 -id4s5a -id4si -ids3l -ids3o -ids3p -id4stem -ids5tr -iduw4 -id3w -ie3a -ie4dac -i1ee2 -ie2fl -ie5fla -ie2f3r -ie4gal -ie4gas -ie4gu -iekes4 -ie2kl -ie2kn -ie4kond -ie4kre -ieks3p -iek3t -ie4kuu -ie4laa -ie4las -iel5do -ie3le -ielf4 -iel4le -ie4mov -i4enc -ie4nij -ien4sta -ien4st5o -ien4str -ien4stu -iep5ac -ie4plo -iep5sc -ie4pui -ie3rad -ie3rap -ier5as -ie4rat -ierk4 -ie3roo -ier4re. -ier4sl -ies4e -ie2sl -ies3li -ies3m -ie2sn -ie2so -ie2sp -ies5se -ie3sta -ie4ste -ies5te. -ie5stel -ie4taa -ie4t5ant -ie4tap -ie4tho -ie2tj -ie4tog -iet5oog -ie4trot -i5eursb -i5eurse -ieuw4a -2if -if4tang -if4tr -if4tui -ig5aard -i5gat -i4gav -i4gins -igit4 -ig3n -ig4ner. -igs4 -ig3sc -ig3sto -i5gue -i1h -i3i -i4j -2ij. -ij1a -2ij1e -ije2n3 -ij1i -ij3o -2ijt -ij5te -ij5ui -4ik -i4kak -iker5k -ikes4 -i2kij -i2kn -ik3na -ik3ni -ik3re -ik5se -ik1sp -ik1st -ik3we -2il -i1la -il3ac -ila5d -i3lak -il2da -il4din -il2dr -ild3ri -ilds4 -i3len -ile4t -ilet5j -ile3u -i2l3ez -ilie5g -i4link -ilk5s2 -illa3s -il2ma -i1lo -i3lof -il3oor -il3or -il4sti -il5te -il2th -i3lu -i5mag -ima4ges -i2me. -i2med -iment5j -i4met. -imma4g -imme4la -imon4 -im3op -imo4r -5impu -im4sm -imte3 -in1ac -i5nars -in4as -in5che -in4dene -inder5a -in5dexe -3indru -1indu -1inf -in4gaa -in4gag -in4gal -5ingang -5ingenie -in2go -in2gr -ing3ru -ing4s3e -3inhou -i2n5i4o -5initia -in2kn -ink3na -3inkom -inlever5i -inos4t -1inri -in4sa -insi4d5 -insis5 -in5spe -3insta -3in5sti -5instru -inta4 -in4tap -5interpr -in5top -int4r -inuut5 -3invlo -i3o -io1a -iog4 -io4nin -ion4s3 -io3pr -io1s4 -io3sko -iot4r -io5ui -i1pa -ip3ac -i4perw -ipe4tj -ip3j -i1pl -i3pot -i4ps -ipsi4 -ip4sle -ipu4r -i1q -4ir -i3ra -iraat4 -ir2e -i4red -ires4 -iret4 -i1ri -i1ro -ir2s -ir3ste -i1ru -i1sa -i4saa -i2sad -i4sak -i4s3ap -is1ar -i2sas -i4sau -i2sc -isci4n -i2s3ei -i4serv -ise4tj -i3sfe -isi4ne -i3sji -is4koo -i2s3l -is4laa -is4lui -i4s5m -is3n -5isola -is5oli -is3p -is5pl -is3t -is5tab -istal3 -ist5ap -is5tas -i5s4tat -is5ten. -is4th -isti4n -is5tor -is4tra -is4tre -is4ty -2it -i1ta -it1ac -it3ach -i3tan -i5te2n -iten5aa -i3ter -i4thou -i3thy -i3t2i -itie5s -i1to -i5t2ou -it5red -it1ri -it3ru -its3ei -it5sen -it3smi -it5sop -its3u -i1tu -it3w -4i1u2 -ium1 -i5u5r -i1v -iver4a -ive3re -ive3ri -ive3s -i5vi -i1w -i1z -ize5t -i4zl -izo5t -jaar5t -2jaf -jager4s -ja4ke -ja5la -j4am -ja4me -ja4ne. -jani4 -ja4no -jan4sl -3jar -jas3p -jaz2 -2j5b -jbe4li -j1c -jc5k -4j1d -j4daa -jde4ne -jden4s -jde3s -j4dog -j2dr -jd3re -jd3ri -jd5ros -jds5li -j4du -je2a -jean4n -2j1ee4 -2jei -jek4tr -j1en -je3r4o4 -je4s3 -5jesha -jes5pa -je5su -je2t -je3to -jet3r -jet3u -jeugd5e -j2f1a -j4fec -j2f3ei -j2f1en -j2fij -j4fin -jf3l -jf4la -j2f5ol -jf5r -jf2s -jfs3ec -jfs5ek -jfs5tak -jf5stan -jf3str -jft4 -j1g -jg5laa -j4gre -jg4st -4j1h -2ji -3jic -jif5 -jin3 -ji5t2 -j5j -2jk -j2kaa -jk5aard -jkaart5j -j4kag -j4kar -j4kas -j4kek -j4kerv -j2kij -jk5ins -j2kl -jk5lap -j3kle -jk3li -jk3lu -j2kn -j4kof -j4kol -j4kon -jk5ond -j2kor -j2kr -jk5raa -jk3re -jk3ru -jks3a -jk2si -jk2sl -jks3n -jk3soo -jk5stra -jk3th -j2kui -jk3waa -jk3we -jk3wi -j1la -jlijs4 -jl3k -j1lo -j2loe -2jm -jm3af -j3mi -j2n1a -j4nerw -jne3s -j4net -jn5eti -j4nex -jn3g -j4nim -j4nink -j2n1o -jn4sce -jn2si -jn2sl -jns5lac -jn2sp -jn5sti -jo4a -jo5ac -job2 -joden5 -jo4ke. -jol4e -3jon -jone4 -jo4nes -jongens5 -j4ou -jou4l -3jour -joy4 -j1p -jp3ac -jpe3s -jp3j -j2pli -j4pre -j4pri -4j1r -4js -js5a -js4e -j3sel -j2s5em -j2s1i -j2sl -js3li -j3slu -j4so -j1sp -j2spo -j1sta -js5teb -j3stel -js3ten -j5s4tend -j4s3ter -js5tin -j1str -j4stran -j1stu -j2su -2j1t -j4taar -j5te. -j2th -j3the -j4top -j2tr -jt3ra -jt4rad -j3tre -jt5ri -j3trok -ju4a -juit4 -ju2le -jumel4 -jus3 -justi4n -j1v -jve4n -jve3ri -jver4sp -j1w -j1z -jze4ro -jzer5sm -1ka -kaas5 -2k1ac -3kache -kadet5 -4kaf. -4kafs -k5agen -4kah -4kaks -4kalb -kalf4s -kal4k3a -kal4kl -4kalt -k5alta -2kamb -kam4pr -4kang -ka3n4o -kan4sl -kan4t3j -kant3r -ka3pa -ka4pl -kap3la -4kappa -kap3s -k5arbe -2karm -ka5ro -k3arti -ka4s -kas5c -k5assi -kas5tre -kas5tro -ka4tan -kat3j -ka4tog -ka4too -katte5s -ka4tui -2k3aut -2kavo -2k1b -kbe2k -kbek3w -2k1c -2k1d -1ke -2k5ec -k4ed -k5edit -keel3 -2keen -kee4pl -keer4s -k5eik -keis4 -ke5lel -ke5let -2k5emm -ke4nad -ken5ak -ke4n5an -ke4nau -ke5nei -ke4nep -keni2 -ke2no -k2ens -ken5se -kens5po -ken3t -ke3rad -ker4kn -ker4ko -ker4kr -kerk5ra -ker4ku -ker4kw -ker4n3a -4kers4ek4 -4kerts -4kerwt -k4es -ke3sta -ke4s3tr -ke4th -ke2t3j -4ketu -ke4tw -k4eu -2kex -k1ey -key3s -k3ezel -2k1f2 -2k3g -2k1h -1ki -4kied -kies4t -2k1ijz -4kindu -2kinr -2kins -3kins. -ki2p -kip3l -3kis -kis4p -kis4to -2k1j -2k1k -kke5ra -kker4s -kke3s4 -1k2l4 -3klac -4kladi -k5lake -4kland -3klank -kla2p1 -2klat -4kleer -k5leer. -5kleert -4kleg -5klem -k3len -k5ler. -4klera -3kle4u -2k3lic -k3lied -2klij -kli4me -k4lon -k5lone -3klont -k5loop -kloot5 -k3lope -5klos -2k3loz -2k3luc -4kluih -2k1m -1k2n4 -4knad -2knam -3knec -k5nek -knies5o -knie5t -knip1 -2kniv -5knol -knor5 -2knum -1ko -4koct -2koef -koe4ket -koe5p -koe5re -koe5sta -koe5tj -koets5p -ko5ko -4kokt -kole4n3 -k5olie. -4kolm -3kom -ko4m5a -5kong -kon3s -kon4t5j -4kontw -2k3oog -koorts5t -4kopb -ko5pe -2k5oph -ko4pl -kop4ri -3kopt -koren5a -2k1org -kor4ta -kort3o -4kos. -ko4so -4koss -5kot -4kov -4k5ox -2k3p2 -kpren4 -1k2r -kra2b -k3rad -3kran -3krat -2k3rec -k5rede -5kredi -kret4 -2k3ric -krijgs5 -k3rijk -krijs5t -krij4t -krijt5j -2krip -4krol. -4kroll -kron5t -kro3s -2krou -kru4l -2ks -k4sad -ks1ar -k2sav -k2see -ksem3a -k2s1in -ks3j -k3slac -k2s3li -ks4mak -ks4mee -ks3na -k1spe -k1sta -k4staf -k4star -k1ste -k5ste. -k4sted -k4stele -k3sten -ks4ti -k1sto -ks5trad -k5stue -k2sui -2k1t -kt5aan -k5te -kte2n3 -k2t1h -k2tin -k4tj -ktoet4 -kt3ond -kt2s -kt3sc -kt3se -1ku -ku3che -kui4f -2k3uit -kuk4 -5kult -3kun -2kuse -kus4tr -kut5s2 -4kuus -2k1v -k2w -k3waar -2k3wac -k3wag -3kwak -k4wal -1kwam -3kwar -2k5wed -4k3weg -k3wei -2k3wer -k4wes3 -5kwets -1kwid -kwie5t -4kwijd -k3wijz -k4wik -2kwil -4kwim -2kwin -2k3wo -4ky. -2k1z -4laand -laap3 -4laard -laar3t -3labo -2lac -3lach. -3la5che -lacht4s -l4aci -3lact -la2d3a -5ladin -2ladj -la4dok -la2dr -lad3s4 -la4du -2laf -la2fa -lafo4 -la2ga -lag3aa -l5agent -la2g3o -la2gr -la3gra -lag3s4 -lai4d -lai4n -la2k3a -la4ki -2lal -l3alb -la4mac -lam5ou -la4mov -lam4p3j -lam4p3l -lam4pol -4lana -3land -lan4da -lan4do -land5oo -lan4d3r -la4nek -lan4em -5lange. -lang3l -lan4ka -lan4k3l -lan4sl -l5antil -lan4t3j -lap5ac -3lapj -la4p3l -la4p3o -4lappa -la2p3r -2larb -las3 -la4tam -la2th -lat5ho -lat3j -la4tro -lat3s -la4tui -2lau -lau4de. -lau4m -la4vat -2lavo -la2wr -la4ze. -4lazi -2l1b -4l1c -2l1d -ldaat5 -l2d3ac -ldak4s -l4dart -ld3een -ld3ei -l3d4en -lden5k -l4dh -l2dom -l2don -l4dos -l2d3ov -l5drie -lds4a -ld3sl -ld5sn -ld1sp -ld3w -1le -le2a -lea2d -lea4s -le3at -3leb -ledes4 -lee2 -leeg3 -4leekh -leem5ac -lee4p3 -leer5ov -lee4s3 -2leeu -2leff -5leider -4leier -4leig -lei4na -2l5eks4 -le4kw -l3elem -l2en -l4en. -le4nad -3leng -l5engel -3leni -len3k -len4tr -len5tre -leper4 -3le5r4a -le1ro -le2s -les2k -le3sko -4lesm -le4sp -le3str -le5ti -le2tr -let5ro -let4sta -4letu -levens5 -4levil4 -4lexc -2lexp -3ley -4lf -l5fab -l2f1ac -l2fin -l5fles -lf3li -lf4lo -l2fo -l3foe -l3fou -lf4ree -lf4sei -lfs3m -lf4spo -l1g -l4gaf -l4gap -l3gla -l4gon -lg1s -l1h -1li -li4ce. -4lick -3lid -lie4ga -lie4gr -lieg5u -li3enn -lies4t -lieu3 -3liev -3ligg -lij4ko -lij4ma -lijm5ac -3lijn -4lijp -3lijs -lij4st -lij5ste. -2l1ijz -li4ke. -li2ko -lilia4 -lil4le. -4limp -lim4pj -2linf -4linh -lin4ka -3linn -4linr -2lins -lin4t3j -4linv -4lipj -li4pl -li5po -lis4e -5lish -4litary -li1th -lit5r -li5tu -li4ve. -l1j4 -lk5aard -l4kaf -l4kei -l4kep -l4klag -l4klev -l2kri -lk3rij -lk2s -lks5tel -l4kuu -lk3wi -4l1l -l3la -llas4 -llas5te -lle5kw -lles5p -lle3st -llinai4 -lls4 -2l1m -lm3act -l4med -l4mind -lms2 -lm3sc -lmta4 -4l1n -lni2 -lo5a -3lobd -lo4bo -lo5dr -loe4d3a -loe4d3r -loem3a -4loes -lofd2 -3lofi -lof3r -lof4s -4logig -lo3go -lo4gre -log4s3 -loi4r -3loka -lo4kar -lo2kl -lo4k5op -lo2kr -lo2k3u -lomp3j -lom4p5l -l3omv -lon4gaa -long5em -lon4go -lon4gr -lon4t3j -5look -3loopb -4loord -4loort -3loper -4loph -4l5opl -4lopn -lop4r -2lops -2lopt -4lopw -l4or. -l1org -lo1ro -lo4sp -los1t -lo4str -lo2ta -lot3ak -lo2th -lot3j -lou2p -lo4ve. -lo4wed -1loz -2l1p -l4pac -lpe4ni -lpes4 -lp2h -lp3j -lp3ond -l4ques -2l3r -lrus5 -2ls -l3sam -lschaar5 -ls4cr -l4sed -l2sef -l4sele -l4sep -ls2j -ls3ja -ls4kel -l3sla -l2sle -ls5led -l2sli -ls3lie -ls4mee -l5sni -ls5nu -l3som -l5song -ls5or -l1sp -l2spr -l5sprie -l1st -l4stal -l5stall -l4steko -l4stele -l4stev -l4stou -l2su -2l1t -ltaar5 -ltai4 -lt2h -l4thi -l2t3ho -l3tj -l4tjesk -lt5jesl -l2tov -lu4bl -lu1e -3lui. -3luid -4luit -lu2ka -luk5raa -luk2s -3lumb -4luni -lu5strato -lu5ta -lu1th -lu5wi -l1v -lva3no -lve3ri -l1w -1ly -ly5o -l1z -1ma -5ma. -3maalt -maas5 -3m4aat -5machi -machts5e -mac3k -ma4cl -ma3de -2m3adv -2maf -5mafo -ma4geb -ma4gev -mai4li -ma4ke. -makers5 -4makt -ma3la -ma5lei -ma4lent -5man. -man3ac -m3anal -man3c -man5do -3mans -man4see -man4sl -man4sn -man4so -mans3p -man4st -4mape -map4l -mar4s5t -mas4p -ma5str -ma5ta -mat3j -m2av -may5 -mazi4 -2m1b -mbi4ne. -mbi4nes -mbo4le. -2m1c -2m1d -m5do -md2s -md3so -m3dw -1me -3me1c -3medi -mee3kr -mee5kw -mee3le -mee3lo -mee3lu -mee3ri -3mees -mee3sl -mee3sp -mee5str -mee3tr -m5egg -me2i -mein4a -4melam -mel4ko -mel4k5r -mel4ku -me5lom -3m2en -men4ag -me5nas -men4gra -meng3s -me4noo -me5nor -men5ste -men4suu -men4tj -mep4j -me1ra -me4raak -me4rak -me4ram -merg4s -5merk -mer4kn -mer4kw -mer3n -mer4on -3me2s -mes4ha4 -me5spe -me3spo -me5stu -me5su -met4aa -me5te -3me3th -3meto -metrai4 -m4eu -meus4 -2m1f -mfi3t -2m3g -2m1h -mhoog5 -1mi -mi1ch -miche4 -mick4 -2mid. -3midd -midden5 -mie5st -5mig -mijl4s -4mijs -2m5ijz -mi5kn -3mil -mi4le. -mi4men -2minf -min5go -2minr -2mins -3mis -mis4la -mi3sog -mis4ses -mis4to -mis5tr -3mit -mi1tr -2m1j -2m3k2 -mkaart5j -2m3l -2m1m2 -mmel5k -2m1n -1mo -3mod -mode4l -3moed -moed4s -2moef -3moei -moe4raa -moe2s -moe5ste. -moet4s -3mo3g -3mole -m5olie. -mol4ma -4molt -4momv -mon4a -m5onder -monet4 -mo3no -mon4so -mon5ta -m3onts -3mooi -2mop -m3ope -m3oplo -5mopp -mop4sn -moquet4 -5mora -mor4e -mor5g -mo3ro -mor4sp -mos4c -mo4sl -mo3sta -mot4h -4moud -5mouw -mo4ve. -mo4ver. -mo4vers -2m1p -mp3ach -m4paf -m4pes -m3pj -mp5lie -mpon4g -m4ps -mp4se4 -2m3r -4m1s -m2sa -m5sal -m3sau -m5se. -ms2j -m3sje -m4sle -m5sleu -m3s2m -m2so -m3son -m3spl -m5spor -m5ster -ms4ti -mst5id -m4ston -m4stop -2m5t -mtes2 -1mu -mu2m3 -munt5j -5mus -mus5t -3mut -muur5 -2m1v -2m1w -3my -my3o -2m1z -1na -3na. -3naal -3n2aam -2n1aan3 -4naap -4naard -n5aardi -3naars -naar3t -n3aas. -3nabe -2nac -5naco -n5act -n4acu -n5aders -nadet4 -3nadi -4n3adm -n5adv -2n1af -naf4l -n2a1g4 -5naged -3nagel -n3agem -nage5o -na3gl -na3gr -3nai -na1ij -4naker -na3k4l -3nale -4n3alf -3nali -3n2am -n2an -2na5na -nan4e -nanes4 -3nant -nan4tj -5na1pl -n5apo -4nara -na4rap -2n1arb -nar5che -5nares -2narg -2n1arm -4nars -2n1art -na3sc -na3s4l -nas4m -na5sma -na1sp -nas5pec -na3stu -n3asy -3n4at. -3nata -nat4h -n4ati -2natl -nat4r -5naven -n5azij -2n1b -2n1c -n4cheo -nci4n -nconsis5 -2n1d -n4daas -n4dabo -n2dac -n2dar -nd3art -n2d5as -n4daz -n4d5edi -n4degg -nd1ei -nde5laa -n5den. -n4derec -nder5eg -nder5og -nd5eten -n4dh -n4dijs. -nd3ijz -ndings5 -ndi4se -n5dji -n4dof -n4doli -nd5olie -nd3ont -n4doog -n2dov -nd3ove -nd3rap -n2dre -ndrecor5 -nd3rei -nd5rek -nds4ben -nd3si -nd5smi -nd1sp -nd4spra -n4d5ure -n2duu -nd3uur -nd3w -1ne -nebe4s -n5edit -2need -3nee4m -2n1een -neer3s -nees3 -neet5o -2n3eff -3ne3g2 -nege4n -nehen4 -2nei -3neig -neil4 -n1ein -n3elem -neli4n -ne5lo -3n2em -4n5emb -4nemm -4nemp -ne2n -n4en. -n4end. -nen3g -nen5k -4nenke -nen3o -nen5slo -ne4pli -ne1ra -n2ere -n4erg -5n4eri -ne4rid -ner5kl -ner4sp -4nerts -4neru -4nesm -ne3sta -nes5teld -nes5tele -nes5telt -4nesth -ne3str -ne4t5ap -ne4ton -ne4tru -4netu -5neuros -3neuz -2n3f2 -2ng -n2g3ad -n4gak -n2gam -n4gank -n2gar -n4geen -n4gensm -nge4rap -nge4ras -ng4hi -ng3ij -n4ginr -n4g3ins -ng3lad -ng2li -n3glic -n3glu -ng3n -n2g5of -n2g1on -ng5raat -ng3rai -ng5rie -n3gro -ng2s -ng4sche -ng4s3le -ngs5lop -ngs5tor -ngs5trek -ngs5tro -ng5t -ngu4a -4n3h -nhands4 -nhand5sb -nhom4 -1n2i -ni5a -ni4ce. -n5idee -nie5kle -5nier -nier5a -ni3eus -ni3euz -3nig -ni4g5ee -nij4st -2nijz -n3ijze -nika5s -nik4s -3nim -2nin. -ni5n2a -4n3ind -2n3inf -4ninga -ningeni5 -nings5tek -nin2k3 -2n5inr -2n3ins -2n3int -4ninv -ni4pl -ni4sel -ni3str -ni3th -ni1tr -nits4 -3niv -n1j2 -2n1k -nk3aan -nk5aard -nkaart5j -n4kag -n4karb -n4kasp -nk2ey -n4knaa -nk5nab -n4kog -nk4om -nkomens5 -nkoo4 -nk3ov -n3kra -nk3rek -nk5rel -n3kru -nk1s -nk5sf -nk4so -nk5ste -n2kw -n3kwam -nk3wat -n5kwen -nk3wi -2n3l -4n3m -2n3n2 -nnee5t -nne4pol -nniks3 -1no -4nobj -5noci -4noec -2noef -4noer -noes3 -no5ic -n5olie. -3nolo -n2oma -n3omg -3nomi -3nomm -4noms -4nomw -3non. -3nonc -n3ond -2n1ont -3nood -4noof -2n1oog -4n3oorl -2nop -5n2opa -no4pas -no4poo -no4por -4n1org -5nori -2nork -3norm -3nors -2nort -no3s4a -no3sk -no3sp -3nota -no4tap -3noter -3noti -2nov -3n2ova -5n4ow -2n3p4 -npoor4 -n1q -2n3r -4n1s -n2sa -n3saal -n5sag -n3sal -ns3ang -nsas3 -ns3asp -n3sau -ns2c -n3sce -n3sch -n4sed -nsee5t -n4sef -n4seg -nsei5g -n5set -n2sev -ns3f -ns4fee -n3sjo -ns4kri -n3slaa -n2sle -ns5led -n5sliep -ns2m -ns3mar -n3sme -n5smij -ns3moe -n5smol -n4s3mu -n3sne -n3snij -n3snoe -n3soe -ns3onw -n3soor -n4spaa -n4spot -ns4ta -n4staf -n3ste -n4steh -n4s5tent -n4stenv -n5ster. -ns3the -ns4tie -n3stig -n4stij -nst5ing -n5ston. -nst5roos -n2sui -ns5uil -2n1t -n5taal -n4t5aard -n4t5akk -n4tarc -ntat4 -ntdu5iker -n3teg -n2tei -nt3eig -n3tel -nte4loo -n5tem -nt5erfd -n3tev -n2th -n3them -n5this -n3thol -ntie5kl -nti5kw -nt3ink -nt4jo -n3to -n4toli -n4top -nt3raf -n5tran -n4t3rij -nt5roof -nt5room -n5troos -n3trou -nt3rui -nt3ruk -nt3rus -nt4sa -nt4schr -n5tsj -nt4sle -nt5slu -nt3sm -nts4ma -nt1sn -nt5ste -nt5t -n3tu -n4tuit -ntu4re. -ntu4res -n5twijf -nt4wis -1nu -nu1er -2nui -4nuil -nu5kr -3num -2nur -nuts4h -n3uur -5nuut -nu2wi -2n1v -nvel4l -nvil4 -2n1w -nwa4v -nwe4tj -nx3a -1n2y -4ny4i -4nyo -2n1z -o1ag -o1al -o1an -oa4ti -o5ax -obal4 -1obj -obos4 -ob3sk -o3cha -o1che -ochet4 -o3chi -o5cho -o3chr -ocke4 -ock5i -oc5t4 -4od. -od1ac -odden5 -ode3ra -odie5t -o4dr -od3re -od3ri -od5si -ods3oo -od4sur -od3w -oe2da -oed3aa -oed3ar -5oedee -oed3ei -oede4n -oede3s -oe4don -oe2dr -oe2d3u -oed3w -oe2f3a -1oefe -oef5f -oe2fi -oe2fl -oef3le -oef5lo -oe3flu -oe2f3o -oe2f3r -oeg5ij -oei1 -oei3s4 -oe4kaa -oek5aan -oeke4n -oe2kl -oe4kna -oe2k3r -oek4sl -oe2ku -oe2kw -oel2a -oe4lap -oel3ei -oeleve4 -oelever5i -oe3li -oe4lov -oe4mac -oe4mak -oe4mo -oe2no -oen5of -2oep -oep3ac -oe2pl -oe3plo -oep3lu -oe2pr -oeps1 -oep4se -oe4pu -oe1ra -oe4ral -oeren5e -oer4sl -oer4so -oer4sp -oe3se -oe4so -oe4t5an -oe4tei -oe2t3h -oe2tj -oe4tol -oet4so -oe4tw -of3at -ofd1a -ofd3ei -of2do -ofd3on -of2d3r -of4du -ofd3w -3offic -offici5el -offie5 -of3l -of4la -of4le -of4lu -o3foo -of2r -of3ri -of4sel -of2si -of2sl -of5sm -of2sp -of4s5tr -of4su -oft2s -of4tur -of4tuu -ofy3 -o1g -og4aa -o4gal -oge4las -oge4st -1ogig -og3le -og3n -og2s -og3sc -og3spi -og3ste -o1h -2oi1 -oi4ne. -oinet4 -ois4 -oi3sc -oist4 -o1j -o5ji -o4kaas -o4kaz -ok3ef -o4kes -o2k3n -o2k5ou -o4kre -o4k3ro -ok3sa -ok5spr -ok1st -ok4str -okter4s -4ol. -o1la -ol3ac -o5lal -olber4 -ol3ein -o3len -ole4ne -ole1u4 -ol2fa -olf3l -olf5ram -ol4gor -ol4gre -ol4gri -olie3s -ol4kaa -olken5 -ol4mes -ol5mo -o1lo -olo3k -o2lop -olo5sp -ol3sj -o1lu -ol5uit -ol3umn -o4map -omen4s -om5ins -o4mint -2omm -omo5s -om4pj -ompo4t -3omro -om5sl -om5soe -om5ste -on3ac -onaf5l -o4nam -o4naz -4onc -2onca -ond3ac -4onde. -4onden -5onderw -on4dij -on4don -on2dr -ond3re -ond3sj -on4dur -o2n5ec -o2ned -4oneerb -o4neh -on4end -ong5aan -on4gap -onge4tj -ong3le -ongs5k -onie5t -4onin -onings5t -oni2q -4onk -on4k5ap -on4klo -on3kw -2onn -onne3s -2ono -on2sn -on3ta -on4taa -ont5aar -5ontbi -ont5erv -ontes3 -1ont1h -on4tre -ont5rie -on4t5rom -3ontva -3ontw -o4o2 -4oo. -oo3c -oo4d -ood1a -ood1e -ood5i -ood1o -ood3r -ood5ste -oofd3o -oof4dr -oo4g1 -oog3r -oogs4 -oog3sp -ook1 -ook5l -ook5r -ooks4m -ook3w -ool1 -ool5g -ool5k4 -oom1 -oom5p -oo4n1 -oon4sa -oon5t -oo4p -oop1a -oo5per -oop5i -oop5o -oop4sp -oo4r1 -oor4d5aa -oor3g -oor3i -oor3k -5oorlog -oor5m -oor3sm -oor5to -oos3 -oost5r -oo4t -oot3h -oot5i -oot1o -oot5r -o1pa -o4paar -op3ach -o4pad -o4paf -o4pak -opa4n -3opbre -op3een -3openi -3opera -o4perw -op5ete -op4her -opie5t -4op3j -op3l -1opn -4opn. -4opneu -o1po -op1of -op3ont -op5p -5opperv -op3r -op4ra -5oproe -ops4c -op3sj -op3sm -op1so -op3sp -ops4t -2opt -3opta -op5te -3optim -o1q -o1ra -oraat4 -o3race -o2rag -or3ana -or4ce. -or4d5am -or4das -or4d3oo -or4dor -ord3w -orea5d -orecord5 -o4reh -orever4 -4org. -or4ge. -4orgi -org3li -or5gn -o1ri -orie5tj -3orkes -ork4l -orkma4 -or4mac -or5no -o3ros -4orp -orp5ac -or5ph -orp4sc -or3sme -or3so -or4son -or4tabl -or4tak -or4t5ijl -ort5ond -or4too -or4tor -or4tred -ort5spr -ort5uit -ort3w -or1u -o3rum -or4un -o5rus -orwe4gi -o5ry -o4sab -o3sc -o4sce -o4sci -os4co -os2cr -o4scu -o3s4e -oses4t -oset3 -oset4t -osha5k -o4sj -os2k -os5ke -o2s3l -os3m -os3no -o1s2o -os1p -os3pa -os3pi -o4s3pr -o3stat -os3te -os4tem -os4teu -os4th -os3ti -os5tic -os4tij -os3tol -os4tr -ost3ri -o5strof -os3tu -os4tun -o3sty -o1ta -ot1ac -o5tag -ot4ec -ot5ede -ote4lan -o5ten -o5ter -o4tesc -o1th -o2t1ho -o5thor -otli4 -o1to -oto3a -otor5o -ot3re -ot5rij -o1tro -ot4sl -ot5sla -ot4spa -ots5tek -ot4sti -ot4str -ot4stu -o1tu -ou5a -oua5c -ou3b -ou2d1a -ou4des -ou2do -oud3r -ou1e -oue2t -ou3is -ouk4 -oun4g -ou4rar -ou4re. -ou4rem -ou4res -ou2ro -ou4sc -ous4t -ous5to -4out. -ou2ta -out1j -ou2t3o -ou2t3r -4outs -out5sp -ou1wi -o1v -2ovee -3ovens -3overg -o4ves -2o3vi -ovis4t -2ovj -o1wa -o4we. -o1wi -owie5 -ow2n -oy2en -oy4l -o5yo -oys4 -o1z -oze3s -3paal -2paan -paar3t -2pac -pa3che -3pact -5pacu -3pad. -pa2da -pad3ac -pa5do -pa4dr -pag2a -4pagg -pa3gh -4pake -4palb -3pale -pal5f -pa3na5 -pa4nad -5pand. -5panee -pa4neu -pa4nisl -4pan5k -pan4tr -pa4o -1pap -pa4pet -5papi -pa4pl -2papp -3pa3ra -pard4 -3park -par4ka -par4kl -2p3arm -1part -3parti -part3j -3partn -pa5ru -3pas3 -pas4ses -pat5j -4patl -3patr -2p3aut -pa4vl -2p1b -2p1c -2p3d2 -1pe -pe2ak5 -pe2a4r -3peb -4peci -pede4s5 -pee4n -2pef -5peg -3pei -pei4la -4p1eis -pe2kl -pek3la -pe2kn -pe4l5ak -pe4lee -pel3f -pe4link -5pelot -pe4lov -2p5emm -3p4en -pe4nam -5pend. -5pende. -pen5k -5penn -penning5s -pen4se. -pen3sl -pen3sm -pen3sp -pen3t4 -pe4nu -peper5s -4pepi -3pe1ra -3perc -5peree -pe4rek -pe4res -5perg -3peri -peri3s4 -3perk -pe3ron -3pers -pers5ag -per4sc -pers5po -per4str -pe5sta -pes3ti -pe5tr -3peut -4pex -2p1f -2p3g -pge3s -2p1h -p2heu -3p2hia -p5hoe -p5hui -1pi -pi4ce. -pie4k5u -pi1eu -pi4ga -pij3k -pij5ke -pij4li -3pijn -3pijp -pij4pa -pij4pl -pij4tj -2pijz -p5ijzer -pi4kl -pi4ko -pi4nas -pin5d -pings5 -4pinj -pin4kr -pi5no -4pinr -2pins -p5instr -pi4ot -3pis -pi4sco -pi4s5t -pi3th -pit3j -pit3r -pit4sp -2p1j -4pja -p2je -2p1k -p2l4 -3pla -4pla. -plaat5j -4plad -4plam -p5lamp -4plang -p4lant -4p3lap -1p4las -pla4tr -p4lec -p3leid -p3lep -p4lex -2plig -2plij -pli4t -3ploe -pluk5 -2p1m -2p1n -p4neum -pock1 -3pod -poda5 -poe2s -poe5tj -po4ki4 -po4kol -3pol -pol5k -3pom -4poml -pomp5j -3pone -pon4se. -pon5ta -poo4 -4poog. -poo5len -4poor. -poor4tj -poot1 -3pop -po4p3a -po4pi -pop5s -po2q -pore4n -2p1org -4pork -por4t5j -por4tra -3pos -po1sa -post5in -post5re -po4ta -3poti -pot1j -4pov -po4we -2p1p -ppe2n -ppen5i -p2r2 -p5raad -3prac -3prakt -p3rand -3prang -p5rap -p3rech -prek4s3 -3prent -pren4t5j -5p4res -pres3c -pre4t3j -pre4tr -preus4 -5pries -priet5j -3prij -3princ -4pring -pring5s -p4rio -p4riu -3prob -3p4roc -3prod -3prof -5p4rog -3proj -4prok -5prop -pro5pr -pro5sc -pro4s3t -pru4t -2ps -4ps. -ps5ag -5psalm -p3sel -pse4la -ps5lan -ps2m -ps3ma -p1sn -p2sna -p5soe -p1sp -ps4pe -p1st -p3ste. -p3stem -p5sten -p5ster. -p5sters -ps3th -ps2u -3p2sy -5psyc -4p1t -p3te -ptea4 -p2t1h -p4tj -pt2s -1p2u -pu3e -pul4le. -3pun -4pun. -punt3j -put3j -pu2t3r -2p1v -pvaart5 -2p1w -py1 -p5yw -2p1z -1qu2 -5qua -2que. -5queu -qui5no -4raalm -raam5 -2raan -raap3 -3r2aar -4r3aard -raat1 -2rac -r4ac. -raccro4 -ra2ce -rade4ra -ra3di -4radr -2rafd -rag5l -ra3gn -rag4s -rai4d -ra4kri -4ralar -ra4l5ee -4ralf -r1alg -4ralm -4ralu -4ramn -r4amp -2rana -r2anc -ran4ce -ran4daa -rand5sl -ran4ge. -ran4ges -ran4g3o -ranje5 -ran4sl -ran5so -rans3p -r4anti -ran4t3j -ran4tr -r3antw -ra4pas -5rapeu -1rapi -3rappo -ra2pr -rap5ro -4r3arb -r4are -4r1arm -4rarr -4r3art -ras3l -ra3son -5rasp. -5raspen -ra5s4tek -ra5stheni -r4ati -rat3j -2rau -ra4vel -ra3yo -2r1b -rbonne4 -r1c -r4chec -r4chen -r4chete -rchi5m -r2chl -rci2a -2r1d -r4dact -r3dag -r2d3ar -rden5s -rde5ra -rder4s -rdes4s -r2dol -rd4re -rd2s -rd3sc -rd3se -rd3sp -rd5sto -rd3str -rd2w -rdwa4r -r4d3wo -1re -3re. -3reac -rea4d -re4ade -rea4m -3reda -reda4l -3redd -5redenee -rede4s3 -ree2d1 -ree4k -2r1een -reen4e -reer4ad -4reers -4reerw -2reff -4reg. -4regd -3regel -rege4s -4regg -3regi -re3gl -4rego -4regt -4reie -4reil -4reind -3reini -rein5o -rei4sc -5reiz -re4kaa -5rekeni -re4kle -re4klu -re4kn -rekor4 -re4kro -4reks -re4kuu -reld3o -rel4d3r -re4lei -relijs4 -rel5k -rel5l -rel5s -re4lur -reme4t -remin4 -5r2en. -re2na -re4nam -re4nan -r2end -r5endert -re4nep -ren5ete -5renf -3renh -4r1eni -5renkl -re2no -ren3of -re3n4ov -5rento -4rentw -4req -4r3erf -re3r2o -2r3ert -4r3erv -2rerw -r2es -re1sa -res4e -resi3s -res4koo -res4kop -re2sl -re2sp -res3pe -res3pi -res3t -5resul -re4tem -re4tog -reu4ko -2r1ex -r4faa -r4fag -rf5da -r4feng -r1fl -r4flag -r2f3li -r4foo -r1fr -r2fre -rf4rek -rf5rol -rf2s4 -rf3sc -r4fur -4r1g -r4gab -r4gart -rge4a -r4geen -r4gei -r5gel -r4geng -r4gerep -rget4 -rg2l -r4glu -rg2ne -rg5op -rg1s -rg3so -rgs4p -r1h -rho4m -ri5aa -ri5al -ri4bl -rici4e -ric5ket. -rief5l -rie4kap -rie4lei -rien4n -rie4to -ri1eu -ri4fa -ri5fl -r4ig -ri4gaa -rig4l -rij5kag -4r5ijl. -r3ijld -3rijm -rijs4t -rij5ster -ri2kl -ri4mer. -ri4mers -rim4pr -ri5n2a -2rinf -r2ing -r5ingan -ring3l -ring3r -2rinh -rin4kl -4rinko -4rinkt -rin4ne. -2rinr -2rins -r3inv -ri4oc -r4is -ri4sam -ri3s4ko -ris4tee -rist4j -rit5j -5ritm -3rivie -rivo3l -r1j4 -rjan4 -rjas4t -r1k -rkaart5j -r4kart -r2kei -rke4n -rken4s -r4kez -r4kink -rk5lat -r2klo -r3klok -r2kne -r2kob -rkoot5 -rk5ord -r5kran -rk1s -rk4slu -rk4taa -rk2t5r -rk3waa -r4kwat -r2kwe -r1l -r3la -rle4gek -r4les5t -rlings4 -rling5sk -rlo4f3 -rlos5 -r5lu -rluit4 -r1m -rma3f4 -r4m5an4c -r4mart -r3me -r4meb -r4meg -rme4ra -rmi4ne. -rmo5sko -rmte5s -2r1n -rn4aa -rn4am -r4nap -rna4sp -rnee5t -r3nei -r4nele -r4n3ene -rnes3 -rne4tj -r2nex -r4nid -r4non -r4noor -r3nu -ro5ar -roces5 -ro1ch -2roef -roe4g3r -roe4pl -roe4rei -roer5s -roe4ta -2roev -ro3fl -5roga -roges3 -4roj -3roker -rol4a -ro5lan -role5s -rol5g -2roli -rol5k -rollo4 -r2on. -ron4da -ron4d3o -ronds4 -ron4d5u -r2one -ronge5t -r2oni -ron4ka -r2ons -ron4tj -ron4t3r -roof3 -roog3 -2r1oor -ro4pan -rop4e -rop4la -rop2o -ro4pu -4roq -2rorg -ro5sho -ro1sk -ro3sko -ro1sp -ross5t -rot4h -rot5j -ro5ton -ro3tr -5rotsen -rot4st -r1oud -3rout -rouwen5e -rove5ri -r1p -rp3j -rpool4 -rp4sto -r5q -rquet4 -2r3r2 -rre4lu -rre5sl -rre3sp -rreur3 -rrie4t -rron5k -rru2 -2r1s -r2sa -r4saan -rsail4 -r3sal -r4s1am -rs5chef -r5schi -rs2cr -r2sek -r4selz -r4serv -rseve3 -r2s5ez -rs4hal -r5s2hi -rsis5 -rs2ja -r3sjou -r3sjt -rs4kat -rs4kie -rs4koo -rs5led -r5sleu -r4sloo -r5slui -rs2m -r3smak -rs4mit -r4snaa -r2sno -r3snoe -r4sog -r4som. -rs3ong -r2sor -rs3ord -r4spad -r4spar -r5spel -rs4pen -rsper4s -r4s5pet -r4spot -r4s5put -rss4 -r4staf -rs3tas -rs4te -r5stes -rs4ti -r4stit -rstof5 -r4stun -rs4ui -rsui4t -2r1t -rtai4n -r2tar -rt3art -rtati4 -r4tau -rte4na -rte5ro -r4teve -r2th -rt3hel -r3tho -rt4ij -r4tink -r5tof -rtoi4 -rto4le -r4tom -rt5redene -r2tri -rt3rij -r2tru -rt3ruk -rt4sec -rt2sl -rts3li -rt4spr -r4tui4t -rt2wi -3rubr -ru1e -ru2g -2rui -3ruimt -r5uitr -ru2k1 -ruk5r -ru4li -r2um -2runi -ru4pi -r2u2s -rus4h5 -ru4st -rust5o -rut5j -4ruu -ru5we -r1v -rvee5t -rve3ri -rve5s4 -rvet5j -rv1ic -rvil4 -rvoch4 -rvoy2 -r1w -rwe4tj -r4wh -rw2t5j -r1x -rxis5 -3ryl -ry1o -4r1z -rzu4e -3sa. -3saag -s1aan -s5aap -4s1aar -3sab -2s1ac -3sacr -s1ad -2s1af -sa2fe -5safo -s5agent -5sah -3sai -5saj -s3akko -s1akt -1sal -s4ala -s3all -4salm -s5alma -s5aln -3salo -4salp -s3alta -s1amb -sam5p -s3ana -3sanc -sans5 -5sant -san4t5j -3sap. -s5ape -sap5l -2sar -3sar. -sa3ra -s3arb -s3arc -3sard -sa4re. -3sari -s1arm -3s4ars -s1art -5sasa -s3assi -sas3t -3s2at -4s3atl -4satm -4s3att -s5aud -5saur -3saus -s3aut -3sauz -s1av -5sax -4s3b -1sc -2sca -2sce -4scel -4scent -s2ch -4sch. -5schaa -3sche -4schec -5sched -4scheq -3s4chi -4schk -5scho -3schr -2sci -sci4ne. -sci4nes -2scl -2s2co -s4cola -3scoo -3scop -3s4core -scorre4 -2scr -scra4 -4scris -2scu -2scy -2s1d2 -sde4a -s3dw -1se -3se. -se2a -sear2 -sebal4 -sebe4s -s1ech -5sect -4secz -s5edit -2s1een -4seev -4sei. -seig4 -seis4t -3seiz -5seke -sek4sl -s2el -5sel. -se4lag -sel5el -4s3elem -3selen -4self -sel3k -se2lo -3sels -5selt -se4m3ac -s3emm -se4mo -s2en -3s4en. -se4nem -se4net -sen5ete -sen3k -se2no -sen5of -sen5on -3sen3s -sen4tj -sen3tw -3s4er -se1ra -se5r2e -4sergo -4sern -ser2s -sert5w -s5ervar -se1sa -s3e2s3p -sessi4 -se1st -s3eter -se2tr -se5tre -se4tw -5seu -se1u4m -seur4s -s3even -2sex -s1exa -2s1f2 -s2fe -s3fei -4sfi -s2fy -4s5g4 -sge3st -2s1h -s4ha. -sha2k -5shamp -sha4p -sheid4 -s4h5es -s4hip -3shir -s2hop -s5hope -s4hort -s2hot -5shot. -s5hote -3show -1si -3sia -si4dec -si4dew -5s4ie -sie3s -sie3tj -si3f -3s4ig -2s3ijz -5silo -2s5inc -2s3ind -2sinf -sin3gl -sings5 -4sini -s3inko -4sinm -2sinr -2s1ins -2s1int -4sinv -s3inz -5sio -si4ons -5sir -3si2s -si5sal -sis4t -sis5tr -3sit -si2z5 -2s1j2 -5s4ja. -s5jaa -3sjac -s3jas -s3je. -3sje4r -4s5jes -5s2jew -s4jez -s2jo -5sjof -3sjok -4sjon -2s1k -s3k2a -skaart5j -ska4te -s3ke -5skele -3s4ki. -skie5st -s3kl -s3kn -s5koe -4s5kof -s5kol -s4kopi -skorre4 -s5kov -3skrib -3skrip -s3k4w -sky3 -1s2l2 -3sla. -3slaan -s3laar -s3lad -3slag -slag3r -3s4lak -2s1lam -3slape -s3las -2s3lat -4s5lau -s4lav -s4le. -s5leder -5slee. -3sleep -4s3leer -2s3leg -2s3lei -4sleng -3slent -5sleper -4s3ler -s3les -sle4tj -3sleu -5s4leut -2s3lev -4s3lez -3slib5 -2s3lic -2slid -4s3lied -s3lief -s3lig -3slijp -slik5l -s3lini -4slinn -4s3lit -slo4b -4sloc -3sloe -3slof -2s3log -s5loon -s3loos -5sloot5 -3s4lot -slot5a -slot5o -4slou -s4low -2s3loz -4s3luc -3slui -4slui. -4sluid -sluis4t -5sluit -s3lus -4sly -2s1m -4smaat5 -s3man -s3mas -4s3mat -4smec -s2med -5smeed -4s3mei -4smelo -4smen -4smes -3smeu -3smid. -4smidd -smies3 -s2mij -s5min -smoes4t -3smok -s5mom -s5mon -3smul -s2n -4s3nac -2snam -5snavel -snee5t -sne4k -3snel -2s3nes3 -s3net -s3neus4 -4s3nie -5snijde -s4nip -4snit -4sniv -s3nog -s5nom -snot5a -5snuf -5snui -2snum -s3nut -1so1c -soci3 -1sod -1soe -4soef -5soep -soeve3 -3sofa -s1off -s3oge -3soi -1s2ol -3sold -so4le. -so4les -s5olie. -3s2om. -3somm -2s3oms -4somz -5s4on. -s1ond -2song -3sonn -3s4ons -2s1on2t -sont3e -sont4l -4sonv -2s3oog -5soon -3s4oort -2s1op -3s2op. -sop2h -so5phi -s4opo -s2opp -s5opper -so3pra -s3opto -3sor. -s2orb -2s1or5g -3sori -s3ork -3sor4s -s4ort -sos4t -s4ot -sot4h -sou3t -2s1ov -s2p2 -4sp. -4spaal -2s3pak -s4pan -3spann -4s3pap -4s5pas -3speci -3s4pee -speet3 -2spei -5speler -3spell -2spen -s5pen. -2sper -s4perm -s3pes -4spex -1spie -4spijn -spi4k -5s4pio -2s1p4l -5splee -spleet5 -s3plei -3splet -spli2 -s3plic -3splin -5split -3spoel -2spol -2spom -5spoor. -s4pore -2spos -5spraak -4sprac -3sprek -4s5prem -4spres -3spreu -s4prie -4spriem -4sprij -4sprob -5s4pron -2s3ps -2spt -3spui -2spun -s1q -squad5 -4s3r -srac5 -sregis5 -4s3s2 -s5s4a -ssa3s -s4sce -sschops5 -s4sco -ss4e -s5seb -s5see -s5sel -s5sem -ssen5t -s5ser -ssi1s -ss4k -s4sm -s5so -sson4n -sspas4 -s5str -s5su -s2t -4st. -4staanw -staat5j -2s4tac -3stad. -5staf. -4stafe -4stakk -4stale -4stali -sta4lo -3stamp -3stand -s4tap -3stape -star3o -2stas -5statio -4stau -4stavo -4stax -s4taz -4stb -2stc -2std -4stea -4stec -s5tech -3s4ted -5steek -3steen -s3teer -stee5t -4steka -4stema -5stemm -4stemo -5stenic -5stentv -4stenu -4steo -4sterm -4steros -4sterr -5sterren -4ste2s -stes4s -4steva -s4tex -s4tez -2stf -4stg -2sth -s4tha -st5hed -5sthenic -s3thet -st1hi -st1ho -s4thu -s4thy -s4tich -2stid -s4tiel -3stier -5stift -3stigm -4stijd -3stijf -3stijl -st3ijs -3stikt -5stild -s4tilu -3stimu -st3ind -4stins -4stint -sti4o -3stip -s5tis -4stite -2s4t1j -4stk -2stl -st4let -2stm -2stn -2stoc -4stoef -4stoej -3stoel -4stoer -4stoes -5stoet -4stoez -4stol. -sto4ne. -4s3tong -st3oog -stoot5j -sto4p -4st3ord -sto4re. -4stos -s4tov -2stp -4strad -s5tradi -4strap -5stratief -5stratiev -4strav -4strec -5streek -5streerb -s3tref -4streg -4strei -s4trek -3strel -s4trem -5strep -4stroe -s5troep -s5trog -s4trol. -s4troll -5stroom -4stroos -4stroz -1stru -s4trui -4st5s2 -2stt -2stub -3stud -5stuk -2stv -2s4t3w -2sty -2stz -1su -5sua -su2b1 -sub3r -3suik -s1uit -3suk -2s1un -s4us -3sus. -4s3v -svoge4 -4s1w -1s4y -sy5c -3syn -sy4nan -sy4ne -3sys -4s1z -taal1 -t3aanv -4taap -taarn5 -taart5r -4taas -taats5in -taat4s5t -5tablet -2tac -t3acad -t1ach -t4aci -t2act -5tactiek -3tacu -4tad -t1ade -5tado -tad2s -tads5p -tad4ste -tads5tr -2taf. -2tafd -3ta5fe -4taff -4t3afs -2tafw -ta4gr -ta5gra -3tai -tai2l3 -ta4ke. -takt3a -4tald -5talent -3talg -5talig -talm3a -4talt -ta4mak -ta4man -2tamb -3tamen -ta4mu -2ta5na -t3anal -tan4d3r -3tanj -t2ans -3tants -ta4pek -ta4pes -5tapi -ta5ra -t3arb -5tarctisc -4tarea -3tari -4t1arm -ta2ro -2tart -t3arti -tart3s -5tarw -tarwe3 -ta4ry. -4tas4p -t5aspe -ta3sta -ta4tem -2tatl -3tau -4t3aut -2tav -ta4ve. -4tavo -5tax -4t1b -4t1c -4t3d2 -1te -3tea -te4ad -5tea4m -tea5ri -te2as -3tec -te5che -4t5echt -tec5k -tec3t -4ted. -t3edit -te3do -tee5ke -tee2m1 -4teen3 -t5eenhe -tege4n3 -t3eind -teits3 -5tekene -5tekens -4tekk -3tekor -3teks4 -4tekse -t5ekster -tekst5i -tek3t -tel5ant -te4lap -3telef -3teleg -te5lel -te4loe -te4log -tel5oog -tel5su -te4luu -4temm -te4mor -3tempo -4temt -t2en -ten4ac -te5nak -ten3al -ten3as -te4nau -t5endert -te4ned -te4nek -te4nel -te4n3et -ten3k -te4nol -ten4se. -ten4su -ten4tis -5tento -t3entw -3tenu -3tenw -3teo -te3p2h -t2er -te5raal -ter3af -ter3ak -te3ral -te5rang -5terapi -ter5app -ter4dol -3terec -ter5eig -te4r5el -te4rem -te4r5env -te4reu -3terh -teri4m -5term. -5termen -3termi -ter3na -5terrei -ter5se -ter4spr -3tes -te5sap -tes4ko -te5staar -te5stel -te5stic -te5stra -5teti -t3euro -4teuv -te4ve. -2texe -4texp -4t1f2 -tfa4d -4t3g2 -tgaat5 -2th. -2t1ha -3t4ha. -3t2hag -4t3hal -3than. -2thc -3the. -3t2hea -t5heb -t5heden -3thee. -t5heer -2t5hei -5theo -t2her -3thera -t3here -the5ri -3therm -3thes -t5hiel -4thl -4thok -t4hom -4t1hoo -thoof5di -2t3hor -t1hou -t3houd -t3houw -2ths -t1hu -2thui -t4hun -3t2hur -5thus -2thyp -1ti -5tia -ti4aalb -tia4nu -3tib -3tica -3tice -ti4ce. -5ticu -3tie -ti4eerb -tie5kla -tie3ru -tie3s -ties4l -ties4p -tie3t -ti1eu -ti2ga -tig3aa -4tigm -ti2gu -tig5ur -5tijd -tijk5er -4tijl. -4tijld -4tijlt -3tijn -tij5t -2t1ijz -5tike -5tiku -tik4w -ti4l5aa -4tiliu -til4la. -ti5mer -ti4mes -ti4min -3timm -5timo -4timp -ti4nad -4tincu -4tind -2tinf -ting5aa -t5ingeni -tin4gi -tin4g3r -ting5stra -4tinku -4tinl -2tins -t3inst -4tinv -4tinw -ti4oneu -3tis -tis4l -ti3sli -ti5s4p -ti5sto -tis4tr -5tite -ti5th -ti3tr -3tiv -3tiz -tj2 -2t1ja -4tjesl -tje5spr -4tjeu -2t1jo -2t1ju -4t3k4 -4t1l -t3la -5t2lem -tleve4 -4t3m -tman5a -tmanag5er -tmos3 -4t3n -3toc -4tock -3tod -to3do -toe3d -toe3g -5toej -toe5k -5toe3la -3toen -toe3pl -5toe3s4 -toe3tj -3toez -4to2f -tog4n -3toil -to4kan -4tolf -tol4pr -4tolv -5tomet -t3oml -tom4n -4tomp -tomp5j -4toms -t2on -2tond -t5onder -3tonee -to4nes -tonge5t -ton4gr -5tonn -to4non -2tont -t2oo4 -toof5 -3toon -to4pas -4topb -4topd -top4let -4topm -2topn -4topr -t5opva -to4q -5tor. -tor5ag -5torens -2torg -t3orga -tor4m3a -5torr -5tors -to5r2u -5to1s4 -to3sf -to3sk -to3sl -tos5s -tot4r -tou1c -2t5oud -tove5na -4toverg -tove5ri -to5wr -4t3p2 -tpa4t -tper4sp -tpers5pec -tpe4t -4tq -t2r2 -4t3raad -4traf -tra4fo -3trai -5trakta -5traktem -5trap. -trap3l -5tratiesy -4trato -t5ratt -traw4 -5t4re. -tre4ak -2trec -4treda -tree5t -4t5reg -3trein -4t3reis -4treiz -4treke -tre4kl -tre4ku -4trel -t5rese -tre2t -3tribu -5trice -t5rief -trijs5p -3tril -4triv -tro3a -4troed -t3roer -t3roes -t3rold -t4rom -t3rond -tront5j -3tros -t5roven -5trui. -trui3t4 -2t1rus -4ts -ts4aar -tsa4le -ts3as5 -t3sch -t2s3ef -t2sei -ts5eig -ts5eind -t2sek -ts3eks -t3sen -t5sen. -t4seng -ts1ex -tsi4ga -t2sij -t4sink -ts2j -t5sjen -ts4kel -ts4kul -t5sky -t5slaat -t5slag. -ts3lam -t4slan -t5slang -t3slep -t5sloe -ts2me -t4smu -ts3nat -t3snoe -ts1or -t1sp -t3span -t5spel -t3spi -t3spor -t3spre -t5spru -t1st -t4stab -t5stale -t4star -t4s3tas -t3ste -t5ste. -t4steg -t5sten. -t4stera -ts4tes. -ts4tie -t3ston -t3stop -t3str -t3stu -tst4w -t2su -t4suit -4t1t2 -t3t4a -tta4g -t3te -tte3lo -tte2n -tten4tj -ttes5tat -t3tr -ttrai4 -tt5s -t5tw -4tual. -4tuals -5tub -tu4bel -5tuc -tu1e -5tueu -3tuin -4tuip -tuit4j -t5uitk -4tuk -tuk3sn -3tum -tu4mel -4tump -tu4nes -3tunn -tu1o -3turb -3tu4s3 -tuu4 -tu3wa -4t1v -tva4l -2t1w -4t3wa -t3we -twee5l -twee3s -twee3t -t3wie -t4wijf -4twil -t2win -t3wind -t3wo -1ty1 -ty4le. -3typ -ty5s4 -4t1z -u1a -ua4dro -uae4 -uaes5 -u4an. -ua4re. -ua4res -uat4s -4ub -ub3ac -ube4li -u5bi -u2bo -u4ce. -u4ces -u1cha -u3chen -u3chet4 -u5cheu -u3cho -uchte5ri -uchu4 -uck4e -uc5ki -ucle5 -uclea5r -uc4ta -u1d -uden4tj -udet4 -u4dez -udge4t -udi4ne -ud5oom -ud3ove -u2dr -ud4sa -ud5sme -ud4sta -ud4sto -ud3w -u1ee -u1el -ueli4 -ue4s -ues3t -u1eu -u1fl -u3f2r -4ug -ug4des -ug2do -ug3ei -uge4leg -uge4ne. -ugi4e -u4g3l -u2go -ug3on -u2g3r -ug3s4 -ug5sto -ugsto4r -u3h -u2i -ui2da -ui4deu -uid3g -ui2d1o -uid4sta -ui2d5u -ui3e -uies4 -ui2f5a -uif3l -ui2f3r -ui4fu -ui4gaa -ui2go -ui2g3r -4uik -ui2k3a -ui2k3l -ui2ko -ui2k3r -uik3w -ui2la -uil3aa -ui4lem -ui5li -uil3m -ui2lo -ui2ma -ui5me -uimes4 -ui2m5o -u4in -ui4n1a -ui4nes. -ui2no -uin5og -uin4slo -ui4pe. -ui4pes -ui4pl -ui4p5o -ui4p3r -4uis -ui2sa -ui4sl -ui4t5a -uite5s -1uitg -uit1h -uit1j -5uitker -5uitle -5ui2t1o -uit3r -uit1s -5uitslag -uit3sm -uit3sp -5uitvoe -u1j -uk4e -uke3no -u2k3l -u2k5of -u2kor -u2kr -uk5rak -uk3ri -uks4h -uks4me -uk5smi -uk4taa -uk3w -u1la -ul3ac -uliet4 -ul4kar -ul2k5n -ul2l5o -u1lo -ul4pak -ul2p3l -ul2po -ul4pr -ul4ps -ul4spa -ul4spu -ul4stel -u1lu2 -ulver5ig -u4mac -um5ele -ument5j -ummi3s -umpi4 -un2c -un3che -unch5r -un4e -une4tj -un3g -3unif -3univ -un4kr -un2s -un3sc -un3se -uns4t -unst3a -un4stei -unst3r -unst5ui -un4tag -un2tj -un4t5o -u3ol -u1or -u5os -4up -u1pa -upda4 -u2pe. -u2pek -u4pen -uper5s -u2pes -u1pl -u1po -u1pr -u1q -2ur -u1ra -ur3ac -ur2al -uras4t -u4rec -u4renv -ures4 -ure5st -ure4tj -ur2fa -ur5gi -ur3gl -u1ri -uri4c -4urie -ur5ijz -u4rind -urken5 -ur4kie -u1ro -u4ront -ur5ph -ur2sl -urs5li -ur2sn -ur4spa -ur4spr -ur4sui -u1ru -u3ry -u1san -u2sc -u3s2cr -4use -use5a -u4sep -u4sj -u4s3l -us3n -u2so -us5oli -u4s3p -us4se. -us4ses -u2st -us3te -us4tei -us3ti -ust5oor -us3tr -4ut -u1ta -ut2ad -u3tan -u4tees -u4tef -u4teks -u4tem -uter4n -ute5ro -u4tet -u2tex -uth5r -uti4oni -uti2q -u1to -uto5s -u1tr -uts4c -ut1sn -ut2sp -ut4sto -uts5tor -ut5tl -u1tu -ut5w -uu2 -uur1 -uur3a -u1v -uvan4 -uvel4s -uw1a -u4wec -u4wei -u4weko -uwen5k -uwe5s -u4wij -u4wind -uwings5 -u4wink -uw5inz -uw1o -uw3r -uw5u -uwui2 -u1z -uzen5 -uzes4 -uziek3 -vaar5tj -va4kar -va2ki -vak3l -va2ko -va4loe -val4s3p -va2n -van5ac -va5ner -var5s -va3se -va3s4o -vast5re -vast5ri -va4th -2vc -veel1 -veep4 -vee5sta -2vega4 -veis4 -ve4lap -vel4do -vel4dr -vel4d3u -ve4lis -ve2na -ve5nare -ve5net -ven3k -ve2n3o -ven2s -ven4se -vens5er -vens5lo -vens5u -venti4o -ve2r -ver1a -5verd -ver3da -verdi4 -ver5ed -ver5eri -ver5est -ver5et -ver5ijl -ver5ijs -ver5ijv -ver5ingsi -ver3k4 -ver3n -ver3p -ver3sa -ver5sla -ver3sm -ver3sp -ver5spa -ver3tw -ver1u -5verz -ve2s3 -ves4c -ves4po -ve4st -ve4tem -ve2tj -ve4to -ve2tr -2vi2c -vi3ch -vier5a -vie2s -vies3p -vie5tj -vie2w -vil4t5j -vi4ne -ving4 -4vi4ot -vi4san -vi4set -vi4sol -vi5sor -vis5ot -visper4 -vis5tr -vi1tr -vi4val -2v1j -v2l -4vlar -vlei5 -vleis4 -vle3s -vlooi4t -3vo -voel4s -voet3j -voe4tr -voet5sp -vo2le -vo2li -vol3ij -v4r2 -vrij3k -vrij5ste -vue5 -vues4 -vu2lo -vuur5 -waad1 -wa4b5 -w2ad -5wade -wa5d2j -w2ag -3wagen -wa4la -wa4les -4wana -wan4gl -wa2n3o -wan3sm -3wap -war4tan -wart3j -war4to -wart3r -wa4s5l -wa4s3p -water5a -wat5j -watt3u -2w1b -w1c -2w1d -1we -we2a -we2b3a -we2d1i -we2dr -wee5fa -wee5kla -wee3lo -wee5ri -wee3sl -wee3sp -wees4t -we2g3a -weg3eb -we4gerv -weg3ij -weg3l -we2g3o -we2g3r -we4ka -we4kr -wel3ed -wel3ee -we2lo -wel3om -we3loo -wel3s4 -we4mab -we2mi -we4mo -we2n -we5naar. -we3ne -we4nee -we4nem -wen4kas -wen3o -wer4f5 -wer4gr -w4erk -wer4k3l -wer4k3o -wer4kr -wer4k3u -wer4k3w -wer4p3a -wer4p5l -4werw -we2s -wes3p -wes5tel -w4et -5wet. -we2th -wezens5 -2w1f -w1g -w1h -wiel5a -3wijd -wijs3 -wi2k -wi5ki -3wil -wil4s -1win -win4d3r -3wink -win4kl -win2s -winst5a -win4ta -wi4sec -5wiss -1wi2t -wi3te -wit3h -wit3j -wit3o -wit3r -w1j -2w1k -2w1l -w1m -4wn -wn3ac -w3nes -w5ni -w4oe -woe3i2 -woel5a -wo2l -wol2f -wolf4s3 -woorden5 -woor4d5r -worm3a -4wot -w1p -wper4 -w2r -wri4 -wrijf5 -2w1s -w2sa -ws4k -w2sle -2w1t -w1v -wva2 -4w1w -wwa4v -w1z -xan3 -x1b -x1c -xchan4 -xel4 -xf4 -x1h -xis4 -x1k -xop4 -x1p -x5s2 -x1t -x4tak -xtie4 -xtraat4 -xtu4r -xu1 -x3v -x3w -xys4 -y1a -y5ae -y4ah -yan4c -y1b -yber4t -y1c -ycho3 -y1d -y1e -y1f -yfu4 -y1g -y3gl -ygu2 -y3h -y1i -y1j -y2k5n -yl3al -y4les -y4let -yli4n -y1lo -ylo3s -ymfe5 -ymfes4 -ym4fl -ymor4 -ym4p5j -y5nec -y3no -yn3t -5yogh -yon4n -y1p -y4pec -y4ped -y4pek -y2pem -y4pev -y4pew -ypo5 -yp5s -y1r -yr4e -y1sa -y5s4c -ys4h -ysha4 -y2s3l -y1so -ys5s -ys3t -ys4ty -y1t2 -ytop4 -y3v -yvet4 -yvon4 -y3w -ywrit5 -y1z -3za -zaf4 -za5i -za2k3a -za2k5r -za2ku -zalm5a -zan4da -zand5ac -zan4d5r -zang3s -zas4 -2zb -4zc -4zd -zee3g -zee3k -zee3le -zee3ro -zee3s4 -zeg4s5l -zelf1 -zen4da -zen5k -ze2no -ze4raa -ze3roo -zer4sl -zer4sp -ze2s -ze3sc -zes3e -ze3sl -ze3str -ze4ta -ze5tak -ze2th -ze2ti -ze4tj -ze4tr -zeve2 -zeven3 -2zg -5zi -ziek3l -zie4kr -zie4kw -ziel4s3 -zie5t -zi4ga -zij4na -zijn4s -zij5s -zings3 -zin4k5l -zin4si -zin4sl -zin4sm -zi4os -zi2t -2zk -z2l -2z5ly -2zm -zn4 -zo5dr -zoek5u -zoet3j -zoe4tr -zo3f -zon3da -zo4nek -zon2s -zon5t -zo2t -2zp -2zs -4zt -zus3 -4zv -z2w -2z1z -} -\endinput +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% These are TeX hyphenation patterns for Dutch generated at the
+% Computer Science Department of Utrecht University.
+% Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands.
+% Telephone: +31-30-531454, e-mail: postmaster@cs.ruu.nl
+%
+% Copyright (c) 1989 by CELEX.
+% CELEX, Wundtlaan 1, 6525 XD Nijmegen, The Netherlands.
+% Telephone: +31-80-615751, email: celex@hnympi52.bitnet
+%
+% General permission for non-profit usage is granted.
+% For commercial usage contact CELEX at the above address.
+% Copying of this file is only permitted with inclusion of
+% this copyright notice and with these same restrictions.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\patterns{%
+.aan5
+.aard5a
+.aard5r
+.aarts5
+.ab5l
+.ad3ek
+.ad3eq
+.ad3op
+.ad3or
+.ad5ren
+.ad3s
+.af3ra
+.al3f
+.aller5
+.al5m
+.al4st
+.am3p
+.an3d4
+.an4kl
+.an5od
+.an3th
+.ap2n
+.ar3tr
+.as3p
+.as1t
+.as5th
+.as3tr
+.at5j
+.at4r
+.ba3ta
+.be3la
+.be5lo
+.berg5l
+.bij1
+.bit5se
+.bli4
+.boot5j
+.bu2s
+.ca4te.
+.cater5
+.ce4len
+.co4ler
+.culot4
+.daar5
+.da4gi
+.dag3r
+.da4k
+.de2a
+.denk5r
+.de3ra
+.de3ro
+.des5p
+.de5sta
+.di4s
+.dom5o
+.du5et
+.edel5a
+.ed3w
+.ek3s
+.ek4w
+.elo3
+.en3t
+.er5aa
+.er4f3l
+.erop3
+.ert4
+.er3ui
+.es3
+.eu5t
+.exi1
+.gaat3
+.ga4me.
+.ge3f
+.ge3la
+.ge5le
+.ge5lo
+.ge3n4a
+.ge5ne
+.ge5no
+.ge3r4a
+.ge5r4e
+.ges4
+.ge3sk
+.gram5e
+.haar5s
+.hand5a
+.handels5
+.hand5s
+.he2a
+.he2r
+.her3i
+.her3u
+.ho4les
+.ho4met
+.honing5
+.hy4de
+.ij2s
+.ij4s3l
+.ijs5t
+.ima4ge
+.in1
+.in3d4
+.in5g
+.ingeni5
+.ink4
+.innes5
+.in3s4
+.in3t
+.jes2
+.ka4taa
+.ka4te.
+.ke5na
+.ke3ra
+.ker4kl
+.kerk5u
+.kerst5r
+.klok5
+.koot5
+.kort5a
+.krop5a
+.lak5l
+.la5th
+.lead5
+.le4b
+.leef5
+.le4go
+.le4gr
+.lek5w
+.le5ni
+.len4s
+.lente5
+.les3
+.le3th
+.lip5l
+.long5a
+.loot5
+.los5
+.luit4
+.mede5
+.mein3
+.me5li
+.melk5o
+.mer4k5l
+.me3so
+.miet5j
+.mij4n5i
+.mo4s
+.mos3k
+.na3fl
+.na1s
+.negen5
+.nes5tel
+.ne4t5j
+.no5t
+.och3
+.oe4r
+.oe4s3
+.olf4
+.olie3
+.om1a
+.on1
+.on3i
+.on3s
+.on2t
+.ont5ee
+.ont5eren
+.ont5ra
+.ont5rol
+.op5at
+.op5r
+.over5e
+.over5s
+.pa2k
+.pee5tj
+.peri5
+.pe4te.
+.piet5j
+.prik3
+.puit4
+.qua5d
+.quit4
+.raat4
+.ran4ch
+.read3
+.record5
+.rei4s5
+.re4mol
+.re5na
+.re5s4cr
+.res3p
+.reu5t
+.rie4t5a
+.rijk4s
+.rij5sp
+.ring5s
+.ro4l
+.ro4q
+.ro4sk
+.sa4p
+.sce4ne
+.seig5
+.se4st
+.se2t
+.sha4
+.sha5ker
+.sis5t
+.ski3s
+.slee5tj
+.sli2
+.snap3
+.so4v5
+.spoor5
+.st2
+.ste4m3
+.ster5an
+.sty4
+.sul3
+.taart5j
+.taat4
+.tan4da
+.ta3ro
+.te4f
+.tek2
+.te5nor
+.ten4tj
+.te4ra
+.ter4pa
+.tes5tat
+.thee3
+.tic5k
+.ti4me
+.ti4na
+.to2s
+.traat4
+.tros5
+.ts4
+.tu4ne.
+.ui2
+.ui3le
+.uit1
+.uit4je
+.vaat5j
+.van3o
+.veld3
+.ven5s
+.ven4t5j
+.ver1
+.ve5ring
+.ver5sta
+.vet5r
+.volg5or
+.vu4l3
+.was3t
+.weet5
+.we2l
+.wel3o
+.wet4s
+.work3
+.xe1
+.ya2l
+.zend5a
+.zes3
+.zit3
+a4a4
+aad3a
+aad3o
+aad3r
+aaf5a
+aag1
+aag3r
+aags4
+aag5so
+aai1
+aak1
+aak3l
+aak5n
+aak3r
+aak3w
+aal1a
+2aald
+aal1e
+aal3k
+aal1o
+4aalr
+aal5sc
+4aalv
+aam1
+aan1
+aan3a
+5aandee
+aan5g
+5aangi
+1aanj
+aan5k
+5aann
+5aansla
+aan3sp
+5aanta
+5aanvr
+3aanwi
+aanzet5
+aap1a
+aar1
+5aardapp
+aar4th
+aart5ro
+aas3e
+aas3f
+aas3p
+aat3a
+aat3h
+aat3o
+aat3r
+a1b
+abak4s3
+aba4s
+abe4la
+ab5err
+ab5ijz
+able2
+a4ble.
+a4bles
+3abonn
+ab3ru
+4ace
+a2ce.
+a3cee
+a3cep
+a4cer.
+a4cers
+a4ces
+5aceta
+2ach.
+a3cha
+2a1che
+4a1chi
+a1cho
+a3chr
+4achs
+a1chu
+2acl
+2aco
+2acr
+4acs
+acu5e
+a1d
+2ad.
+ad2a
+ad3aa
+ad3ad
+ada5g
+ada2r3
+a4dete
+ade4tj
+2adi
+2adl
+5admini
+ad3ora
+2adp
+3adres
+a5dri
+ad5rol
+ad3sla
+ad5uit
+4ady
+2ae
+aege4
+aek4
+ael4
+a4fau
+af3d
+af1dw
+4afe
+af3ei
+afe4la
+a2f5ep
+af5ex
+1afg
+2afi
+a4fin
+af3l
+2afo
+afon4d
+af1r
+af3ric
+af5rie
+af3ris
+af3rit
+af3ru
+af3s
+5afsl
+5aftr
+a4fu
+3afzet
+4aga
+ag1ad
+agas4s
+age2o
+a4gins
+agis5t
+ag3le
+ag3ord
+ag3reg
+ag3roo
+ag3sla
+ag4spr
+ag5ur
+a4g3uu
+a1h
+4ah.
+ahe5ri
+ah3l
+ah5r
+ai1e
+aig4
+aik4
+ails4
+ai4lu
+2ais4
+ai5sa
+ai3sc
+ais5k
+ai1so
+ai4sol
+ai1t
+4a1j
+2ak.
+5akade
+ak3arb
+a4ked
+aker4se
+a2kes
+a2kez
+2akh
+akhou4
+ak3id
+a2k1l
+ak3la
+ak3lo
+ak3na
+ak3ne
+a4kog
+ak3ond
+4akp
+2aks
+4aks.
+5aksij
+ak5spa
+ak1st
+4akt.
+ak5uu
+ak3we
+a1la
+a5lal
+alan4st
+a4lap
+5album
+2ald
+a2lel
+a4lents
+al2fe
+alf3l
+alf2r
+4alia
+alie5tj
+al4kank
+al4kro
+al4mac
+5almana
+al4mol
+a1lo
+al3omt
+alo4n
+al5ou
+al3ph
+als3j
+al2sl
+als5m
+als3oo
+al4stem
+al4sti
+al3tha
+al4t5ro
+a1lu
+5amandel
+4ambe
+1ambt
+ame4ran
+3ameu
+4amm
+am5pe
+am2pl
+ampoo5
+ams5ap
+am4se
+am4sm
+am4sn
+am2sp
+am3spe
+an2aa
+an4af
+a2na2g
+a5nagen
+an5alge
+a4n5ame
+an3arc
+an4ded
+2andj
+and4ri
+a4nec
+an3emi
+a3nen
+an3est
+an4gan
+an4gap
+anges4
+ange5st
+ang5le
+an2gr
+ang5ste
+a3ni
+ani5t
+5anjelie
+4ank.
+an4kaa
+an4kak
+an4kas
+anker5k
+ank5ins
+an4kna
+an4k5of
+an2kr
+ank3ro
+ank5wet
+annet4
+an5opt
+an5ort
+ano3st
+an3scr
+an2so
+an2sp
+5antenn
+antes4
+ant2h
+an3tha
+an5to
+ants5ta
+anu5e
+an5ui
+an5ur
+a4nuu
+anval4s
+a1o
+a2ob
+a4op4
+4ap.
+a1pa
+a2pe.
+a4ped
+ap3j
+ap3le
+a1plu
+a1po
+apo5p
+1appa
+5appels
+3appr
+a1pr
+a4p3rij
+april3
+ap2sl
+ap2sp
+2apu
+a1py
+a1q
+a4ques
+4ar.
+a1ra
+ara5ce
+ara5kl
+a4r5app
+5archief
+5arctic
+ar2da
+ard3ac
+ard3ol
+ard3op
+ar2dr
+ar4dran
+ard3ri
+ard3w
+a4rew
+arg3l
+3argum
+a1ri
+ari4an.
+ari4ce
+ariet4
+ari5ett
+arkeer5
+ar3k4l
+2arl
+ar4map
+ar4mu
+ar4nes
+a1ro
+2aroo
+ar5s2e
+ar4s1l
+ars3la
+ars3m
+ar2sn
+ar5sni
+ar2so
+ar4spa
+ar4spr
+ars5tal
+ar4stek
+ar4str
+ar4tak
+ar4tap
+art5een
+5artike
+ar2tj
+ar4top
+ar2tr
+art4sl
+arts5le
+a3rus
+a1ry
+4asa
+asal4
+as1ap
+a2sc
+as4ch
+as4cr
+a2seb
+a2sec
+as4ee
+a2sel
+a3sem
+as4en
+as2hi
+asi4on.
+asis5t
+a2sl
+as3lam
+as3lan
+as3li
+aslijs4
+as3m
+as3pa
+as5pect.
+as5pecte
+as5per
+as3pi
+as3pl
+assi3s
+3assoc
+5assu
+as1ta
+as3tan
+a5stat
+a4s3te
+as4th
+as3ti
+as5tic
+as3ton
+ast5red
+a1t
+at1ac
+a4talen
+ata1s
+a4taz
+5atelier
+ate4rec
+ate4rek
+ateri5el
+ater5ijs
+4atg
+at2ha
+a3thar
+atie5s4
+a2tj
+3atlas
+3atmos
+2atn
+a2t3re
+a3trek
+at2sl
+at4slo
+ats5lot
+ats5m
+at5sni
+at2sp
+at4stak
+at4sti
+at4stre
+at2tu
+2au
+4au.
+au1ch
+au3e
+3aug
+au3kr
+auli4ne
+aul4le
+aup2
+au5ph
+aur2
+au5re
+4aus
+au3sa
+au5so
+au1t4
+3auto
+au1wi
+4auz
+a1v
+ava5ne
+ava5str
+aven3s
+ave3re
+ave3ri
+aver4u
+a3vi
+avil4l
+1avo
+5avond
+4avot
+a1w
+aw5re
+4ay
+ay4a
+a1z
+aze3s
+aze5tj
+5azia
+1ba
+baar3t
+babe4
+babet4
+ba4ch
+ba4da
+ba4des
+ba4dr
+bag4h
+ba4ka
+bal4kla
+ba3na
+ban4d5r
+band5s
+ba4ne.
+ban4kl
+ban4kn
+ban4k3o
+ban4kr
+bank3w
+ban4q
+ba5ru
+baseli4
+bassi4
+bas3t
+2b1b
+bbe4lag
+bbe4lee
+bbe4n
+2b1c
+2b1d
+3be
+be3am
+be4art
+be3dw
+beet1
+be3g4
+beien5
+beis4
+bei4tj
+be3ke
+be3kl
+be4lex
+bel5f
+bel3k
+bel3sp
+be1ra
+be5r2e
+ber4g5af
+ber4g5et
+bergi4
+ber4gl
+ber4gr
+ber5na
+be1r2o
+ber5oc
+be4ron
+bers4k
+ber4sto
+be5ru
+be1s4
+bes5ac
+bes5k
+be3sm
+bes5s
+bes5te.
+be5stij
+be5stik
+be1tw
+beur4s
+2b1f
+2bg
+4b3h
+1b2i
+bid3s4
+bi4du
+bi5enn
+biet5j
+bi3eu
+bij5a
+bij3d
+bij3k
+bijs2
+bij3sl
+bij3sm
+bin4dr
+bin4tj
+bio3
+bis4a
+bi3se
+bis4tr
+bi1tr
+bit4se
+2b1j
+2b1k
+1b4l
+5blan
+b5led
+blet5j
+bleus4
+3bli
+blik3o
+4blish
+blok3
+2b1m
+b1n
+1bo
+bo5de2
+boe4ga
+boe4kn
+boeren5
+boe3s4
+bo5ko
+bo4les
+bo2ma
+bom3aa
+bo4mo
+bonai4
+bond4s
+bon4tj
+bon4to
+boos4t3
+b5orig
+bor4st5a
+bor4sto
+bor4st5r
+bos3
+bo4sp
+bos4ses
+bo2su
+bo2th
+bot3j
+bo4tu
+bou5ta
+boven3
+boy5
+1b2r2
+braat4
+b4re
+breis4
+brei5st
+bri4a
+bri4l
+bro4n
+bru2l5
+2b1s2
+b3s4c
+b2sla
+bsou4
+2b1t2
+bt4s3
+1bu
+buit4j
+bus3c
+bu2su
+b1v
+2bw
+by5la
+byr4
+bys4
+2b1z
+1ca
+ca4chem
+cae3
+cag4
+ca2k
+came5r
+can4nes
+ca3pa
+ca2pe
+ca5ra
+cara4t
+ca4re.
+ca3ro
+cas3t
+cat2
+ca3ta
+cate4r
+ca3th
+2c1c
+cca5
+cce4s
+1ce
+cee2
+cei4
+3cel
+celi4n
+ce4lop
+4cema
+ce3na
+2ceni
+3cent
+cen4t5j
+4cepa
+ce3ra
+5cere
+ce3r4o
+ce2s
+ce3s2a
+4cesp
+ce3su
+ce2tj
+2ch.
+chaar4s
+char5t
+chas5
+4chav
+2chc
+2che.
+4cheb
+2cheg
+2chek
+che4lee
+4chemu
+4cheor
+4chep
+3cheq
+che3ri
+4chero
+2ches
+2chev
+4chg
+4chh
+chi4k
+5chlo
+4chm
+4chn
+cho3s
+2chp
+3chris
+5chromo
+2cht
+3chum
+2chw
+1chy5
+3ci
+ci4al.
+cier4s
+ci1eu
+ci4le.
+ci4nen
+ci1p
+ci4so
+ci3t4
+ci5ta
+c3j
+2c2k
+cka4
+ck1en
+ck3ers
+c5keten
+ck5etk
+ck3l
+ck3n
+cks4
+1c2l
+cle4v
+c4li
+cli4q
+clo4ne.
+clo4se.
+cly4
+2cn
+cno4
+1co
+3co.
+3coa
+co5ad
+3cod
+5co2k
+3col
+co4le.
+colet4
+co2lu
+3com
+3con
+con3g
+con3s
+con5t4
+cop4
+3copa
+co4pe.
+co3pr
+coquet4
+3cor
+co3ro
+corp2
+corps5
+cor5s
+3cos
+3cot
+3cou
+4cout
+co2v
+cov5erb
+cov5ers
+4c1q
+c4ques
+1c4r2
+cra4y
+2crib
+3cris
+5crit
+cros4
+cross5en
+crui4
+2c1t
+ct3ad
+cte2n
+c2th
+cti4on.
+cti4ons
+c2tj
+ctoi4
+c2ton
+ct5ond
+cto4rin
+c2t5re
+ctu4re.
+1cu
+cu4ad
+cuk4
+3cul
+cur3s
+5cy
+cy4th
+c3z
+1da
+5da.
+3daag
+4daam
+4daanb
+d3aanw
+4d5aap
+4d5acc
+d5adel
+2d1af
+da3fr
+da2ga
+da4ged
+da4g5et
+da4gon
+dag3op
+da4gor
+da2gr
+da2gu
+5dai
+5dak.
+d4a5ke
+5daken
+2d3akk
+dak3l
+da2k3r
+4daks
+d5aksen
+4dalar
+4dalm
+da2l5u
+d2ame
+dames5
+3dan
+da4nas
+dan4kl
+dan4sm
+dans3p
+2d1ap
+d2ape
+3dapes
+5dapu
+da2ra
+2d1arb
+3dari
+dar2m
+darm3a
+das3t
+5dati4
+dat5j
+2d5atl
+5daue
+4d3aut
+da4ve.
+2d1b4
+dbou4wi
+2d1c
+2d3d2
+dde4lev
+dde2n
+dde4red
+dde4ree
+dder5o
+dde3s
+1de
+de1ch
+deeg5
+2deen
+5deen.
+dee4r
+deer5i
+dee3t
+4deff
+4deg.
+2dei
+de4klaa
+de4klag
+de4kna
+4deksa
+de4lac
+4delas
+del3dr
+4delec
+del5eeu
+4delek
+4d3elem
+5delen
+de4leng
+de4lon
+del5or
+de4lov
+del4sl
+del4str
+del5t
+4demai
+4demm
+d5emme
+d4en.
+de4nab
+den4ac
+den4du
+de4nep
+4d5engt
+den4kof
+den4kop
+den4kr
+de2no
+den3oo
+der5aan
+de3rab
+de3ras
+de4rei
+der5ein
+de4rem
+de4rep
+de4ret
+der5fr
+de4rim
+de4rin.
+der3k
+der3na
+der3of
+der3on
+der4sa
+der5th
+4derts
+der5tw
+der1u
+de2s
+desis5
+de4sk
+des5kr
+de3sl
+des4pel
+de3sta
+des3ti
+de5stic
+de3sto
+de3str
+det2
+de3ta
+4deten
+detes5
+de3tw
+4d5eu4ro
+de5us.
+dewin4d
+2dex
+3dex.
+2d1f2
+2d1g
+d4ge.
+d4ges.
+d3g4l
+2d1h
+d3he
+dher5i
+dhun4
+1di
+dia3s2
+dic5k
+5die
+die2f
+dienst5r
+diep5l
+die5sp
+die4tra
+di1eu
+di2ga
+dig3aa
+2dijz
+d5ijzer
+di4ko
+dik5w
+2dind
+d5indi
+2dinf
+d5ingeni5
+din5gh
+2dinr
+2d1ins
+4dinw
+4dinz
+dis5co
+di4sin
+dis5t
+dit5j
+2d1j
+2d1k
+2d3l
+dlan4de
+dli2n
+2d1m
+dmoes4
+2d3n
+1do
+5do.
+5doc
+2doef
+doe2l
+5doi
+d4ok
+dok4r
+dol5f
+dolk3s
+do2mo
+dom2s
+2d5omz
+5don.
+2dont
+3donti
+dont4l
+doorn5ac
+2dop
+do4pe.
+do4pes
+3dopj
+d3o4pl
+5doppen
+3dopt
+d5oree
+2d1org
+do3ro
+dors3m
+do3sk
+5dovl
+2d3p2
+dpren4
+d2r2
+3dra
+4drand
+4drap
+4dras
+d4re.
+d3rec
+d3red
+5dreef
+d3rege
+4d3rel
+d5rem.
+3dremp
+d5rese
+d3resu
+5dreve
+2dric
+dri5en
+dries4
+drie5t
+3d4rif
+d3rijd
+d3rijk
+3drijv
+3drin
+3dris
+d3rit
+dri2v
+4droei
+3drog
+4drok
+d5roman
+d3rond
+d3rood
+4droos
+d3rov
+d4roy
+4d3roz
+4drug
+drug4s
+d3ruim
+3druk
+4drus
+4ds
+ds1a
+dsa4d
+ds2al
+dsas3
+d3sch
+ds4cor
+d4sed
+d2see
+d4sek
+dse4la
+d3sen
+d4ses
+dsex2
+d5sfeer
+d2si
+dsi4ga
+d2sl
+d3slaa
+d3slac
+ds5lam
+d5slang
+ds3lie
+d3slin
+d5s4mak
+ds4mee
+ds3na
+ds3no
+d3snu
+ds1o
+ds2oo
+d4spal
+d5s4pel
+d4spet
+d1spi
+d4spon
+d3spor
+ds4pre
+d1st
+d3sta
+d4staal
+d4stab
+d4staf
+d4stal
+d3ste
+d4stek
+d4s5tera
+ds3th
+d4stit
+d2su
+d3sur
+2d3t2
+1du
+du4bl
+2duil
+dui4t
+4duitg
+du1o
+dus3
+dut5j
+du4wee
+2d1v
+2d1w
+d2wa
+d3waar
+d3wac
+4dwarm
+4d3wat
+d3weg
+d4wei
+d3wek
+d3wer
+d3wes3
+d3wet
+1dy
+4dyo
+dy2s3
+2d1z
+d2zj
+e1a
+e3aa
+e3ac
+e4ade.
+e4ades
+ea2di
+ea4dor
+ead5s4
+ea5fr
+ea2gu
+e3ai
+ea2k
+e2akd
+e4ake
+e4ako
+eals4
+e2am
+e3amb
+e5anc
+e3and
+e3ant
+e4anu
+e5ap
+ea2ri
+ea2s
+ea5si
+e4at.
+e2ath
+e4atm
+eatri4
+eatu4
+eau4n
+eau3s4t
+e1b
+e5bo
+ebo4k
+e3br
+e3cha
+e1che
+ech5es.
+e1chi
+e3cho
+echte5ri
+ec3le
+3econo
+ecor2
+ec4tin
+e1d
+4ed.
+e3dam
+edenk5r
+ed3ijz
+e2dov
+ed5ric
+e3dru
+edsel3
+ed1sp
+ed2w
+e3dwan
+e2e
+ee2da
+eede5r
+ee5do
+eed5w
+ee2f
+eef3l
+ee4gli
+ee2gr
+ee2k
+eek5ak
+eek1e
+ee5ker
+eek5lo
+eek3n
+ee3ko
+ee3kri
+eek5ro
+eek3ur
+eek3uu
+ee2l
+ee3led
+ee3li
+eel3k
+eel4si
+2eem
+ee2n1
+eeng4
+een5ie
+een3k
+een3sl
+eep3ac
+eer1a
+ee2ri
+eer5ijz
+eer3in
+eer3k
+eer3om
+eer5oom
+eer4ov
+eers5ag
+ee2s
+ee3sc
+ees4ch
+ee4sem
+ees3li
+ee3smu
+ee3spr
+ees3te
+ee2t
+eet3h
+eet3oo
+eetra4
+ee4tw
+e5ex
+e4fad
+ef3da
+ef5do
+3effec
+3effek
+ef4fle
+e1fl
+e4fom
+e1f2r
+ef3sm
+e1g
+egas4k
+e4gec
+ege4las
+ege4lov
+ege5ner
+e4gos
+eg3s4
+e1h
+eid4sp
+ei1e
+eie3s
+e1ij
+eil5aar
+eil3d
+eil3m
+ei2lo
+e2in
+ei4nap
+ein4do
+eind5oo
+ein4dr
+ein4du
+ei4ned
+ei5po
+ei4re.
+ei2s3a
+ei5sla
+eis4lo
+eis4p
+eis4ta
+eis4tel
+ei5stene
+ei5str
+eit2
+eite5s
+ei1tj
+ei4too
+eit4s
+eit3z
+5eiwit
+e3j2
+e3kaa
+ekaart5j
+e3kam
+e3kas
+2eke
+ek4er
+ek2et
+e4kez
+ek3ins
+e5klam
+e4klast
+e3kled
+ek3les
+e5klim
+e5klin
+e4koli
+ek3ov
+ek4ru
+ek1sa
+3eksam
+3eksem
+eks1p
+e1kw
+e5ky
+e1la
+e5laag
+elaats5t
+el1ac
+el5adj
+el1af
+el5appel
+el3arb
+e4l5arm
+e4las.
+el5dak
+el2dr
+5electr
+el5eier
+5elektr
+e2lel
+el5elp
+e3len
+e3lep
+e4lert
+e4leta
+ele4t5j
+e3lev
+el4faa
+el4fend
+elf5lo
+3elfta
+el3gl
+elie5t
+e3lig
+eli5kw
+e4lind
+e4linga
+elings5t
+e5lins.
+eli4p
+el5isw
+3elix
+elk3s4
+ellings5
+e1lo
+e2lob
+e3lok
+e2lol
+el3oli
+e4lom
+el5omt
+el5ont
+eloofs5
+e5loos
+el3ops
+el5opt
+el5opv
+e2lor
+e5loz
+els5ag
+el4sj
+el5smed
+els2u
+e1lu
+eluks5
+e1m
+ement5j
+e5meri
+emes3
+em3ins
+e4mir
+5emplacem
+en1ac
+e2nak
+en3akk
+e2nal
+en5als
+en5alt
+en5amb
+en3ana
+e2nap
+en3app
+e5nari
+en5ars
+e2nas
+en3asi
+ena4sp
+e2nav
+e2naz
+en4ce.
+en3dar
+ende4ra
+5enderti
+en5dop
+en4dur
+e2nec
+en3ech
+en3eil
+ene4n3
+e4nent
+en5epo
+e3ner
+e4nerf
+3energ
+e4nerv
+e3nes
+enes5te
+e4nete
+en5eter
+ene4t5j
+e2nex
+en3ga
+enge3s
+engs4
+eng5ste
+e4nid
+enier4t
+en5inga
+enings5
+e4nink
+e3nis
+4enkl
+en4kre
+en5krin
+e2non
+enoot3
+en1op
+eno4pl
+e2nor
+e3nor.
+en3ord
+en1ov
+ens5k
+en2sl
+en2sn
+en2so
+ens3on
+en5ste.
+enst5ijv
+en4stin
+ent2h
+en4trol
+ent4sl
+ent4sp
+en1ui
+e2nun
+en3ur
+e2nuu
+5envelo
+e1o
+eoga4
+e3on
+eonti4n
+e3op
+eop4l
+eop4r
+e4or4ge
+eo1ro
+eo3s4
+eota4
+e1p
+ep2a
+e4paf
+ep4ap
+e4peen
+3epid
+ep3j
+e4poge
+eponde5
+ep5rei
+ep2s
+eps3pr
+ep4tr
+e1q
+e3ra.
+e3raad
+e4raap.
+e5raat4
+er1ac
+er3afd
+e1rai
+er3aks
+e4rall
+e5rami
+e3ranc
+e5rans
+e5ranti
+e3rape
+e1rat
+e2rav
+erd2a
+erd4i
+er3do
+er3d4w
+e5re.
+e5reb
+e3rec
+erecord5
+er5eers
+er3eff
+eregis5
+er5eier
+e4reig
+er5eind
+er3eks
+erel2
+e4r5emm
+e5rena
+ere5nad
+e5rend
+ere4neg
+eren5sl
+er5en5tw
+ere4se.
+ere4tj
+e4rets
+er3gl
+e1ri
+erie3s
+erie3t
+e3rif
+e3rig
+erig5a
+e3rij.
+e3rije
+e4rijs
+e4rijz
+er5ijzer
+e5rik
+e4r3ind
+e5ringst
+er3ins
+e4r3int
+erip4
+e3ris
+e3riz
+erkeers5t
+er3ma
+er5mi
+er3mo
+e3ro.
+e1rob
+e4roc
+e1rod
+e1roe
+e4roed
+er5oef
+er5oev
+er5ogen.
+e3rok
+e1rol
+er3oli
+er5om.
+e3roma
+er5omh
+er3omk
+er1on
+e3ron.
+e5roni
+er3oog
+e5rook
+er3oor
+e2r1op
+ero4pi
+erop5r
+e4r1or
+e1ros
+5erosie
+e3rot
+er1ov
+er3oxy
+er5ste.
+ert4h
+er5ti
+er5to
+er3tr
+e1ru
+e3ruim
+eruit4j
+eru2m
+5erupt
+e2r3ur
+er3uu
+5erwt
+4es.
+es4a2m5
+e3san
+e3sas
+e3sch
+e5sec
+e3sem
+es5enc
+esent5j
+e5sfeer
+es5he
+e3shop
+e5sid
+es3ill
+e3sjo
+3eskad
+e1s2m
+e1sn
+e1so
+es5ob
+e3sol
+e1sp
+es3pek
+e4spen
+e5spendee
+es4poo
+essis5
+est5ac
+e3stad
+es4tak
+est5akt
+e5stali
+es5tant
+e4s3te.
+e5sted
+es5teli
+e3s4tem
+es3ten
+e4s5ten.
+e5stene
+e5steng
+es3ter
+e5sterre
+es4teu
+e2sti
+e5stich
+es3tig
+es3tin
+e3stof
+e1stu
+e3sy
+e1ta
+e3tali
+et4ana
+eta4p
+e4tau
+e3te
+etek4k
+etens5u
+ete3ra
+eter4s5l
+e1th
+et2ha
+et3ham
+etien4
+e3til
+e3ting
+e1tj
+et2jo
+e1to
+e3ton
+etou5c
+etour5
+e1tr
+e5tran
+et5rec
+e5trek
+e4t5rin
+et3rui
+et3sap
+et4sla
+et4sli
+et2sp
+ets3pr
+et4stek
+et3s4u
+e1tu
+5etui.
+et2w
+e3twi
+4eu.
+eu4ce
+eudo5
+eu3e
+eug4dr
+eug4r
+2eui
+e1uit
+eu4ler
+e3um.
+eu4na
+eun3s
+eun3t
+eu5pe
+eu4rad
+eu4rat
+eu4rij
+eur5k
+5europe
+eus3t
+eut2h
+e5uu
+2eu2w1
+euws5a
+e1v
+eval4s
+eve5naa
+5evenre
+evens5e
+even4st
+eve3ri
+evoels5
+evol4ga
+e1w
+e5wen
+ew5er.
+ew5ers
+ew2h
+e3wi
+1exam
+1exem
+4exi
+1exp
+3extr
+ey2n
+eys4
+e1z
+4ez.
+ezen4s
+ezin4s
+1fa
+f3aar
+f4ab
+face4
+facet5
+2f1ach
+5faci
+fa4den
+f4ag
+fa5go
+fa2ke
+fal4to
+4fana
+fant4
+fan4t5j
+fa4re.
+3fase
+f2av
+2f1b
+f1c
+2fd
+f2da
+f4dele
+fde4s3
+fdes4m
+f4dh
+f2din
+fd5inga
+f3doe
+f1dr
+fd4ra
+fd4ru
+fd2w
+1fe
+fe2a
+fede1
+fee4l
+f3een
+3fees
+feest5r
+fei4t5j
+f5elem
+fe4lov
+3fem
+fen3t
+fe3rab
+fe3ran
+fe4ret
+fes3
+fes4p
+fe4tj
+feur4
+2fex
+2f1f2
+ff3s4
+f3fu
+4f3g2
+fge1
+fgo4v
+4f1h
+1fi
+fiber5
+fi3ch
+3fie
+fie3tj
+fiets5p
+fijn5sp
+2f1ijz
+fi4le.
+film3a
+5fine
+fi4nel
+fi4no
+4fint
+fis5t
+fisto3
+f1j
+2f1k
+f2l4
+2f5laa
+f3laf
+fla2p5
+fle2t
+f5lev
+4flie
+4f3lij
+f4lip
+f4lor
+f4lot
+f3loz
+2f3m
+fma4d
+f1n
+1fo
+2foef
+2f3of
+5fok
+f3oms
+fon3te
+f3oog
+2f1o2p
+2f3org
+3form
+fo5ro
+for4tj
+fo1ru
+fo5t
+foto5f
+2f3oud
+foy4
+2f3p
+fr2
+1fra
+f5raam
+fra4m
+f2ras
+f2raz
+f3reg
+fre4t
+f4rez
+f2ri
+f3rij
+fri4te
+f2rod
+4frol
+fru3g
+2f1s
+f2sa
+f3sch
+f3sel
+f4sh
+fsho4
+f3s2j
+f4slap
+f4sled
+fs2m
+f2s1o
+f3ste
+fste4m
+fs5terr
+f3s4ti
+f3stof
+f5stok
+f3stu
+2f1t
+f4tene
+f2th
+f2tj
+ft3je
+f5to
+f5tro
+ftwa4
+1fu
+f2un
+2fuu
+f3uur
+2f1v
+2f1w
+1fy
+4f1z
+1ga
+gaar3t
+4gabc
+gabri5
+gaby4
+2g1ac
+4g5afs
+4gaft
+4gafw
+4gah
+gal2a
+gal5ach
+ga5lav
+ga4mes
+gamo4
+gan3d
+gangers5
+gan5gr
+g5anker
+gan4st
+gapo4
+4g3arb
+5gare
+g3arm
+g3arti
+ga2s
+ga4se
+gas5o
+gas3p
+gas3tr
+2gaut
+4gavo
+gazi2
+4g5azin
+2g1b
+2g1c
+2g1d
+g3de
+g4dell
+g4dim
+g3doe
+gd2s
+1ge
+ge3a
+ge4ari
+ge5au
+4geb.
+2g3ebb
+2gebd
+4gebt
+ge1c
+ge5d
+gedan4
+gee4
+ge3ei
+g3eend
+gee2r
+ge5ess
+geest5r
+gef4
+4geff
+ge5g2
+ge5h
+gei4la
+gei4tj
+gek4l
+ge3k4w
+gel4da
+gel4du
+gel3f
+ge4l5oor
+gel5ore
+gel3sa
+gel3sn
+4gemb
+4gemf
+4gemp
+ge4ned
+gen5ent
+g5engt
+gen3k
+ge4noc
+gen5och
+ge4nof
+ge4nog
+gens4f
+gen5sfe
+gen4su
+gen4tr
+ge5p4
+ge1ra
+ger5aan
+ger4dr
+ge4reng
+ge5req
+ge5rij
+ge1r2o
+ge5roc
+ger4sp
+4gerts
+ge3ru
+geru5m
+ge1s2
+ge3s4a
+ge3sc
+ge5se
+ge3sh
+ge3sj
+4ges4k
+ge5s4l
+ge3s4m
+ge3so
+ges4p
+ge5sper
+ge3spl
+ges4te
+ge5stil
+ge3ta
+get4i
+get4j
+ge5tjo
+ge5tsj
+ge3t4w
+3gev
+2g5ex
+2g1f2
+4g3g4
+gge4nol
+2g1h
+g2het
+g2hum
+1gi
+gier4s
+gi1eu
+gi2f
+2gij
+g5ijzer
+gi4mes
+gi4nes
+2ginf
+g5ingeni5
+gis5trer
+2g1j
+2g1k
+2gl
+g3la2m
+3gla4s
+3glaz
+g2le
+g3leg
+g3lei
+4g5lep
+g3ler
+gli2d5
+glij5ko
+3glik
+g2lim
+gli4n
+g5lio
+3glob
+3glom
+4g3lon
+g1loo
+g1lop
+5glos
+3g2ly
+2g1m
+2g1n
+g3na
+gneet3
+g4ners
+gne4tj
+g2no
+g5nol
+g3non
+1go
+5go.
+go2a
+2goc
+g1och
+godon4
+god4s
+goed5a
+2goef
+goes3
+go5fr
+4goh
+go2k3
+go2ma
+gom5ac
+go4mel
+4g3ong
+4gont
+2g3oor
+2gop
+gop4la
+4gore
+4gorg
+g5orga
+gor4s
+gos5p
+go3tr
+gou4dee
+gouil4
+2gov
+2g1p
+1g2r2
+g3rak
+gra2m
+g4ra2s
+gra4ves
+2g3red
+gree4
+g5reel
+2grei
+g3reis
+4grem
+gren4s
+gre4s
+gres5l
+griet5j
+g3rijk
+grijs5t
+gri4mes
+2griv
+groeps5
+groet5j
+4grok
+g3roke
+4grou
+5groun
+2g5rug
+g3ruim
+g3ruk
+2gs
+gs1a
+gsas3
+g2sc
+g3sch
+gs5chef
+g4sco
+gscorres5
+g4scr
+g2se
+g5se.
+gs1ef
+gs3eig
+gs3eis
+gs3ek
+g3sel
+gs3f
+gs5he
+gsher5
+g2s1i
+gs4ke.
+gs4ken.
+gs4kes
+g2sl
+g5slang
+gs4lep
+gs3lie
+gs5lis
+g3slu
+g4sma
+gs4maak
+g3snoe
+g2s1o
+gs3p
+gs4pel
+g5spele
+gs4pet
+gs4pi
+g3spie
+gs5pir
+gs5taal
+g5staand
+g5staar
+gs5tab
+gs5tac
+g5stal
+g3stam
+g5stat
+g1ste
+g3s4te.
+gs3teh
+g3stel
+g4stelg
+g5ster.
+gs5tera
+g5sters
+gs3th
+g3stig
+g5stof
+g5stok
+g3stu
+g2su
+gs1ui
+gs3uu
+gs5w
+g3sy
+2g1t
+g4tap
+gtui4gi
+1gu
+gu4al
+gu2at
+gu2e
+2gue.
+3guer
+guet4
+guim4
+gui4ne.
+2g3uit
+gun3
+gus3
+2g1v
+2g1w
+3gy
+2g1z
+h2a
+haar3t
+hac5k
+haf4tu
+hair5s
+ha4kr
+hal2f3
+2hamp
+han4d5o
+han5dru
+han3ga
+hang3s
+han4sl
+han5so
+hap5l
+ha2p5r
+hap4se
+haps5te
+ha5ren
+har4t3a
+har4th
+hart3j
+har4to
+hart5sl
+has3
+ha4tek
+ha2t3r
+hat5s
+4h1b
+4hc
+2hd
+h4e
+4he.
+he2ad
+he2ar5
+3hech
+heel3o
+he4fe
+heids5p
+hei5k
+hei4t
+he4kan
+he2kw
+he4lan
+hele4n
+hel4m3a
+he4lov
+hel4pa
+hel4pr
+3hemd
+hemme4
+hen4kr
+2heo
+he4pij
+he2pl
+he2p3r
+hep5s
+he2q
+he1ra
+he5raa
+her3ad
+he3ral
+he3rau
+her3c
+he3rem
+he2ri
+her5inn
+herm5eng
+her4paa
+herp5ac
+her4pr
+her3s
+he3sa
+he2sp
+hes3t
+hete1
+heut5j
+4hew
+4hf
+h3h
+4hi.
+hi5d
+hie4dr
+hie4f
+hie2r1
+hie4to
+hie4tr
+hilip4
+hi4ma
+him4pl
+him4pr
+hin4tj
+hi5q
+2hir2
+hi4re
+hirt5
+his5p
+hi5tr
+4h1j
+2hl
+h2le
+2h2m
+h3ma
+h3me
+h4mer
+h5mo
+4h1n
+h2na
+h2nit
+ho5a
+2hoc
+5hockey
+ho5dr
+5hoed
+hoe4ker
+hoe4k5n
+hoek5st
+hoe4sl
+ho2fa
+hof5d
+ho4fe
+hog4
+ho2k
+ho4le.
+ho4me.
+ho4mec
+ho4mes
+hon3dr
+hon3ga
+ho5ni4
+honig3
+hon4se
+hoo4
+hoofd5r
+hoorn5ac
+ho4pl
+ho4po
+hop4sm
+hop4str
+ho2q
+ho1ro
+hor4se.
+hor4tj
+4ho3ru
+hos5t
+hot5j
+hou4se
+hout5a
+2how
+4h1p
+hpi4
+2h4r
+hra4b
+hri2
+hris5
+hro4b
+hro4k
+4h1s
+2ht
+h4t1a
+h5tans
+ht3au
+h4t3ec
+h4ted
+h2t5ee
+h2tef
+h4teks
+h4temb
+h4ten3t
+hter1
+hte4rin
+hte4ro
+h4tesk
+h2t3ev
+h2tex
+ht1h
+ht1j
+ht1o
+h1ton
+ht5oor
+h4t3r
+ht2s
+ht4ser
+hts1o
+ht4som
+hts3pl
+ht5spoo
+ht5spri
+ht3sta
+hts5teg
+ht4stek
+ht4sten
+hts5u
+ht3u
+hu2ba
+hug2
+huid3a
+huim3a
+hul4der
+hulp3a
+hu4me.
+2hus
+hu4te.
+hu4tes
+hut5j
+huw4do
+4h3v
+2hw
+h2wei
+4hy.
+3hyp
+hype2
+hyper5
+h3z
+i1a
+i4aalt
+i5aaltj
+i3ac
+i3ae
+iaf2
+ia3g
+i3ak
+iak4l
+i2als
+ian4n
+ia5no
+i4ans
+ias4me.
+i3au
+iave4
+i1b
+i2bac
+ibu3e
+i5ca
+ica4p
+i3cen
+i1cha
+i1che
+i3chi
+i1cho
+4ici
+ick5er
+ic5key
+id3ach
+id3ame
+i3dat
+idder5a
+id4e
+5ideolo
+ider4sp
+ider4st
+id2g
+idings5t
+i2d5ir
+id3ru
+id2s1
+id4s5a
+id4si
+ids3l
+ids3o
+ids3p
+id4stem
+ids5tr
+iduw4
+id3w
+ie3a
+ie4dac
+i1ee2
+ie2fl
+ie5fla
+ie2f3r
+ie4gal
+ie4gas
+ie4gu
+iekes4
+ie2kl
+ie2kn
+ie4kond
+ie4kre
+ieks3p
+iek3t
+ie4kuu
+ie4laa
+ie4las
+iel5do
+ie3le
+ielf4
+iel4le
+ie4mov
+i4enc
+ie4nij
+ien4sta
+ien4st5o
+ien4str
+ien4stu
+iep5ac
+ie4plo
+iep5sc
+ie4pui
+ie3rad
+ie3rap
+ier5as
+ie4rat
+ierk4
+ie3roo
+ier4re.
+ier4sl
+ies4e
+ie2sl
+ies3li
+ies3m
+ie2sn
+ie2so
+ie2sp
+ies5se
+ie3sta
+ie4ste
+ies5te.
+ie5stel
+ie4taa
+ie4t5ant
+ie4tap
+ie4tho
+ie2tj
+ie4tog
+iet5oog
+ie4trot
+i5eursb
+i5eurse
+ieuw4a
+2if
+if4tang
+if4tr
+if4tui
+ig5aard
+i5gat
+i4gav
+i4gins
+igit4
+ig3n
+ig4ner.
+igs4
+ig3sc
+ig3sto
+i5gue
+i1h
+i3i
+i4j
+2ij.
+ij1a
+2ij1e
+ije2n3
+ij1i
+ij3o
+2ijt
+ij5te
+ij5ui
+4ik
+i4kak
+iker5k
+ikes4
+i2kij
+i2kn
+ik3na
+ik3ni
+ik3re
+ik5se
+ik1sp
+ik1st
+ik3we
+2il
+i1la
+il3ac
+ila5d
+i3lak
+il2da
+il4din
+il2dr
+ild3ri
+ilds4
+i3len
+ile4t
+ilet5j
+ile3u
+i2l3ez
+ilie5g
+i4link
+ilk5s2
+illa3s
+il2ma
+i1lo
+i3lof
+il3oor
+il3or
+il4sti
+il5te
+il2th
+i3lu
+i5mag
+ima4ges
+i2me.
+i2med
+iment5j
+i4met.
+imma4g
+imme4la
+imon4
+im3op
+imo4r
+5impu
+im4sm
+imte3
+in1ac
+i5nars
+in4as
+in5che
+in4dene
+inder5a
+in5dexe
+3indru
+1indu
+1inf
+in4gaa
+in4gag
+in4gal
+5ingang
+5ingenie
+in2go
+in2gr
+ing3ru
+ing4s3e
+3inhou
+i2n5i4o
+5initia
+in2kn
+ink3na
+3inkom
+inlever5i
+inos4t
+1inri
+in4sa
+insi4d5
+insis5
+in5spe
+3insta
+3in5sti
+5instru
+inta4
+in4tap
+5interpr
+in5top
+int4r
+inuut5
+3invlo
+i3o
+io1a
+iog4
+io4nin
+ion4s3
+io3pr
+io1s4
+io3sko
+iot4r
+io5ui
+i1pa
+ip3ac
+i4perw
+ipe4tj
+ip3j
+i1pl
+i3pot
+i4ps
+ipsi4
+ip4sle
+ipu4r
+i1q
+4ir
+i3ra
+iraat4
+ir2e
+i4red
+ires4
+iret4
+i1ri
+i1ro
+ir2s
+ir3ste
+i1ru
+i1sa
+i4saa
+i2sad
+i4sak
+i4s3ap
+is1ar
+i2sas
+i4sau
+i2sc
+isci4n
+i2s3ei
+i4serv
+ise4tj
+i3sfe
+isi4ne
+i3sji
+is4koo
+i2s3l
+is4laa
+is4lui
+i4s5m
+is3n
+5isola
+is5oli
+is3p
+is5pl
+is3t
+is5tab
+istal3
+ist5ap
+is5tas
+i5s4tat
+is5ten.
+is4th
+isti4n
+is5tor
+is4tra
+is4tre
+is4ty
+2it
+i1ta
+it1ac
+it3ach
+i3tan
+i5te2n
+iten5aa
+i3ter
+i4thou
+i3thy
+i3t2i
+itie5s
+i1to
+i5t2ou
+it5red
+it1ri
+it3ru
+its3ei
+it5sen
+it3smi
+it5sop
+its3u
+i1tu
+it3w
+4i1u2
+ium1
+i5u5r
+i1v
+iver4a
+ive3re
+ive3ri
+ive3s
+i5vi
+i1w
+i1z
+ize5t
+i4zl
+izo5t
+jaar5t
+2jaf
+jager4s
+ja4ke
+ja5la
+j4am
+ja4me
+ja4ne.
+jani4
+ja4no
+jan4sl
+3jar
+jas3p
+jaz2
+2j5b
+jbe4li
+j1c
+jc5k
+4j1d
+j4daa
+jde4ne
+jden4s
+jde3s
+j4dog
+j2dr
+jd3re
+jd3ri
+jd5ros
+jds5li
+j4du
+je2a
+jean4n
+2j1ee4
+2jei
+jek4tr
+j1en
+je3r4o4
+je4s3
+5jesha
+jes5pa
+je5su
+je2t
+je3to
+jet3r
+jet3u
+jeugd5e
+j2f1a
+j4fec
+j2f3ei
+j2f1en
+j2fij
+j4fin
+jf3l
+jf4la
+j2f5ol
+jf5r
+jf2s
+jfs3ec
+jfs5ek
+jfs5tak
+jf5stan
+jf3str
+jft4
+j1g
+jg5laa
+j4gre
+jg4st
+4j1h
+2ji
+3jic
+jif5
+jin3
+ji5t2
+j5j
+2jk
+j2kaa
+jk5aard
+jkaart5j
+j4kag
+j4kar
+j4kas
+j4kek
+j4kerv
+j2kij
+jk5ins
+j2kl
+jk5lap
+j3kle
+jk3li
+jk3lu
+j2kn
+j4kof
+j4kol
+j4kon
+jk5ond
+j2kor
+j2kr
+jk5raa
+jk3re
+jk3ru
+jks3a
+jk2si
+jk2sl
+jks3n
+jk3soo
+jk5stra
+jk3th
+j2kui
+jk3waa
+jk3we
+jk3wi
+j1la
+jlijs4
+jl3k
+j1lo
+j2loe
+2jm
+jm3af
+j3mi
+j2n1a
+j4nerw
+jne3s
+j4net
+jn5eti
+j4nex
+jn3g
+j4nim
+j4nink
+j2n1o
+jn4sce
+jn2si
+jn2sl
+jns5lac
+jn2sp
+jn5sti
+jo4a
+jo5ac
+job2
+joden5
+jo4ke.
+jol4e
+3jon
+jone4
+jo4nes
+jongens5
+j4ou
+jou4l
+3jour
+joy4
+j1p
+jp3ac
+jpe3s
+jp3j
+j2pli
+j4pre
+j4pri
+4j1r
+4js
+js5a
+js4e
+j3sel
+j2s5em
+j2s1i
+j2sl
+js3li
+j3slu
+j4so
+j1sp
+j2spo
+j1sta
+js5teb
+j3stel
+js3ten
+j5s4tend
+j4s3ter
+js5tin
+j1str
+j4stran
+j1stu
+j2su
+2j1t
+j4taar
+j5te.
+j2th
+j3the
+j4top
+j2tr
+jt3ra
+jt4rad
+j3tre
+jt5ri
+j3trok
+ju4a
+juit4
+ju2le
+jumel4
+jus3
+justi4n
+j1v
+jve4n
+jve3ri
+jver4sp
+j1w
+j1z
+jze4ro
+jzer5sm
+1ka
+kaas5
+2k1ac
+3kache
+kadet5
+4kaf.
+4kafs
+k5agen
+4kah
+4kaks
+4kalb
+kalf4s
+kal4k3a
+kal4kl
+4kalt
+k5alta
+2kamb
+kam4pr
+4kang
+ka3n4o
+kan4sl
+kan4t3j
+kant3r
+ka3pa
+ka4pl
+kap3la
+4kappa
+kap3s
+k5arbe
+2karm
+ka5ro
+k3arti
+ka4s
+kas5c
+k5assi
+kas5tre
+kas5tro
+ka4tan
+kat3j
+ka4tog
+ka4too
+katte5s
+ka4tui
+2k3aut
+2kavo
+2k1b
+kbe2k
+kbek3w
+2k1c
+2k1d
+1ke
+2k5ec
+k4ed
+k5edit
+keel3
+2keen
+kee4pl
+keer4s
+k5eik
+keis4
+ke5lel
+ke5let
+2k5emm
+ke4nad
+ken5ak
+ke4n5an
+ke4nau
+ke5nei
+ke4nep
+keni2
+ke2no
+k2ens
+ken5se
+kens5po
+ken3t
+ke3rad
+ker4kn
+ker4ko
+ker4kr
+kerk5ra
+ker4ku
+ker4kw
+ker4n3a
+4kers4ek4
+4kerts
+4kerwt
+k4es
+ke3sta
+ke4s3tr
+ke4th
+ke2t3j
+4ketu
+ke4tw
+k4eu
+2kex
+k1ey
+key3s
+k3ezel
+2k1f2
+2k3g
+2k1h
+1ki
+4kied
+kies4t
+2k1ijz
+4kindu
+2kinr
+2kins
+3kins.
+ki2p
+kip3l
+3kis
+kis4p
+kis4to
+2k1j
+2k1k
+kke5ra
+kker4s
+kke3s4
+1k2l4
+3klac
+4kladi
+k5lake
+4kland
+3klank
+kla2p1
+2klat
+4kleer
+k5leer.
+5kleert
+4kleg
+5klem
+k3len
+k5ler.
+4klera
+3kle4u
+2k3lic
+k3lied
+2klij
+kli4me
+k4lon
+k5lone
+3klont
+k5loop
+kloot5
+k3lope
+5klos
+2k3loz
+2k3luc
+4kluih
+2k1m
+1k2n4
+4knad
+2knam
+3knec
+k5nek
+knies5o
+knie5t
+knip1
+2kniv
+5knol
+knor5
+2knum
+1ko
+4koct
+2koef
+koe4ket
+koe5p
+koe5re
+koe5sta
+koe5tj
+koets5p
+ko5ko
+4kokt
+kole4n3
+k5olie.
+4kolm
+3kom
+ko4m5a
+5kong
+kon3s
+kon4t5j
+4kontw
+2k3oog
+koorts5t
+4kopb
+ko5pe
+2k5oph
+ko4pl
+kop4ri
+3kopt
+koren5a
+2k1org
+kor4ta
+kort3o
+4kos.
+ko4so
+4koss
+5kot
+4kov
+4k5ox
+2k3p2
+kpren4
+1k2r
+kra2b
+k3rad
+3kran
+3krat
+2k3rec
+k5rede
+5kredi
+kret4
+2k3ric
+krijgs5
+k3rijk
+krijs5t
+krij4t
+krijt5j
+2krip
+4krol.
+4kroll
+kron5t
+kro3s
+2krou
+kru4l
+2ks
+k4sad
+ks1ar
+k2sav
+k2see
+ksem3a
+k2s1in
+ks3j
+k3slac
+k2s3li
+ks4mak
+ks4mee
+ks3na
+k1spe
+k1sta
+k4staf
+k4star
+k1ste
+k5ste.
+k4sted
+k4stele
+k3sten
+ks4ti
+k1sto
+ks5trad
+k5stue
+k2sui
+2k1t
+kt5aan
+k5te
+kte2n3
+k2t1h
+k2tin
+k4tj
+ktoet4
+kt3ond
+kt2s
+kt3sc
+kt3se
+1ku
+ku3che
+kui4f
+2k3uit
+kuk4
+5kult
+3kun
+2kuse
+kus4tr
+kut5s2
+4kuus
+2k1v
+k2w
+k3waar
+2k3wac
+k3wag
+3kwak
+k4wal
+1kwam
+3kwar
+2k5wed
+4k3weg
+k3wei
+2k3wer
+k4wes3
+5kwets
+1kwid
+kwie5t
+4kwijd
+k3wijz
+k4wik
+2kwil
+4kwim
+2kwin
+2k3wo
+4ky.
+2k1z
+4laand
+laap3
+4laard
+laar3t
+3labo
+2lac
+3lach.
+3la5che
+lacht4s
+l4aci
+3lact
+la2d3a
+5ladin
+2ladj
+la4dok
+la2dr
+lad3s4
+la4du
+2laf
+la2fa
+lafo4
+la2ga
+lag3aa
+l5agent
+la2g3o
+la2gr
+la3gra
+lag3s4
+lai4d
+lai4n
+la2k3a
+la4ki
+2lal
+l3alb
+la4mac
+lam5ou
+la4mov
+lam4p3j
+lam4p3l
+lam4pol
+4lana
+3land
+lan4da
+lan4do
+land5oo
+lan4d3r
+la4nek
+lan4em
+5lange.
+lang3l
+lan4ka
+lan4k3l
+lan4sl
+l5antil
+lan4t3j
+lap5ac
+3lapj
+la4p3l
+la4p3o
+4lappa
+la2p3r
+2larb
+las3
+la4tam
+la2th
+lat5ho
+lat3j
+la4tro
+lat3s
+la4tui
+2lau
+lau4de.
+lau4m
+la4vat
+2lavo
+la2wr
+la4ze.
+4lazi
+2l1b
+4l1c
+2l1d
+ldaat5
+l2d3ac
+ldak4s
+l4dart
+ld3een
+ld3ei
+l3d4en
+lden5k
+l4dh
+l2dom
+l2don
+l4dos
+l2d3ov
+l5drie
+lds4a
+ld3sl
+ld5sn
+ld1sp
+ld3w
+1le
+le2a
+lea2d
+lea4s
+le3at
+3leb
+ledes4
+lee2
+leeg3
+4leekh
+leem5ac
+lee4p3
+leer5ov
+lee4s3
+2leeu
+2leff
+5leider
+4leier
+4leig
+lei4na
+2l5eks4
+le4kw
+l3elem
+l2en
+l4en.
+le4nad
+3leng
+l5engel
+3leni
+len3k
+len4tr
+len5tre
+leper4
+3le5r4a
+le1ro
+le2s
+les2k
+le3sko
+4lesm
+le4sp
+le3str
+le5ti
+le2tr
+let5ro
+let4sta
+4letu
+levens5
+4levil4
+4lexc
+2lexp
+3ley
+4lf
+l5fab
+l2f1ac
+l2fin
+l5fles
+lf3li
+lf4lo
+l2fo
+l3foe
+l3fou
+lf4ree
+lf4sei
+lfs3m
+lf4spo
+l1g
+l4gaf
+l4gap
+l3gla
+l4gon
+lg1s
+l1h
+1li
+li4ce.
+4lick
+3lid
+lie4ga
+lie4gr
+lieg5u
+li3enn
+lies4t
+lieu3
+3liev
+3ligg
+lij4ko
+lij4ma
+lijm5ac
+3lijn
+4lijp
+3lijs
+lij4st
+lij5ste.
+2l1ijz
+li4ke.
+li2ko
+lilia4
+lil4le.
+4limp
+lim4pj
+2linf
+4linh
+lin4ka
+3linn
+4linr
+2lins
+lin4t3j
+4linv
+4lipj
+li4pl
+li5po
+lis4e
+5lish
+4litary
+li1th
+lit5r
+li5tu
+li4ve.
+l1j4
+lk5aard
+l4kaf
+l4kei
+l4kep
+l4klag
+l4klev
+l2kri
+lk3rij
+lk2s
+lks5tel
+l4kuu
+lk3wi
+4l1l
+l3la
+llas4
+llas5te
+lle5kw
+lles5p
+lle3st
+llinai4
+lls4
+2l1m
+lm3act
+l4med
+l4mind
+lms2
+lm3sc
+lmta4
+4l1n
+lni2
+lo5a
+3lobd
+lo4bo
+lo5dr
+loe4d3a
+loe4d3r
+loem3a
+4loes
+lofd2
+3lofi
+lof3r
+lof4s
+4logig
+lo3go
+lo4gre
+log4s3
+loi4r
+3loka
+lo4kar
+lo2kl
+lo4k5op
+lo2kr
+lo2k3u
+lomp3j
+lom4p5l
+l3omv
+lon4gaa
+long5em
+lon4go
+lon4gr
+lon4t3j
+5look
+3loopb
+4loord
+4loort
+3loper
+4loph
+4l5opl
+4lopn
+lop4r
+2lops
+2lopt
+4lopw
+l4or.
+l1org
+lo1ro
+lo4sp
+los1t
+lo4str
+lo2ta
+lot3ak
+lo2th
+lot3j
+lou2p
+lo4ve.
+lo4wed
+1loz
+2l1p
+l4pac
+lpe4ni
+lpes4
+lp2h
+lp3j
+lp3ond
+l4ques
+2l3r
+lrus5
+2ls
+l3sam
+lschaar5
+ls4cr
+l4sed
+l2sef
+l4sele
+l4sep
+ls2j
+ls3ja
+ls4kel
+l3sla
+l2sle
+ls5led
+l2sli
+ls3lie
+ls4mee
+l5sni
+ls5nu
+l3som
+l5song
+ls5or
+l1sp
+l2spr
+l5sprie
+l1st
+l4stal
+l5stall
+l4steko
+l4stele
+l4stev
+l4stou
+l2su
+2l1t
+ltaar5
+ltai4
+lt2h
+l4thi
+l2t3ho
+l3tj
+l4tjesk
+lt5jesl
+l2tov
+lu4bl
+lu1e
+3lui.
+3luid
+4luit
+lu2ka
+luk5raa
+luk2s
+3lumb
+4luni
+lu5strato
+lu5ta
+lu1th
+lu5wi
+l1v
+lva3no
+lve3ri
+l1w
+1ly
+ly5o
+l1z
+1ma
+5ma.
+3maalt
+maas5
+3m4aat
+5machi
+machts5e
+mac3k
+ma4cl
+ma3de
+2m3adv
+2maf
+5mafo
+ma4geb
+ma4gev
+mai4li
+ma4ke.
+makers5
+4makt
+ma3la
+ma5lei
+ma4lent
+5man.
+man3ac
+m3anal
+man3c
+man5do
+3mans
+man4see
+man4sl
+man4sn
+man4so
+mans3p
+man4st
+4mape
+map4l
+mar4s5t
+mas4p
+ma5str
+ma5ta
+mat3j
+m2av
+may5
+mazi4
+2m1b
+mbi4ne.
+mbi4nes
+mbo4le.
+2m1c
+2m1d
+m5do
+md2s
+md3so
+m3dw
+1me
+3me1c
+3medi
+mee3kr
+mee5kw
+mee3le
+mee3lo
+mee3lu
+mee3ri
+3mees
+mee3sl
+mee3sp
+mee5str
+mee3tr
+m5egg
+me2i
+mein4a
+4melam
+mel4ko
+mel4k5r
+mel4ku
+me5lom
+3m2en
+men4ag
+me5nas
+men4gra
+meng3s
+me4noo
+me5nor
+men5ste
+men4suu
+men4tj
+mep4j
+me1ra
+me4raak
+me4rak
+me4ram
+merg4s
+5merk
+mer4kn
+mer4kw
+mer3n
+mer4on
+3me2s
+mes4ha4
+me5spe
+me3spo
+me5stu
+me5su
+met4aa
+me5te
+3me3th
+3meto
+metrai4
+m4eu
+meus4
+2m1f
+mfi3t
+2m3g
+2m1h
+mhoog5
+1mi
+mi1ch
+miche4
+mick4
+2mid.
+3midd
+midden5
+mie5st
+5mig
+mijl4s
+4mijs
+2m5ijz
+mi5kn
+3mil
+mi4le.
+mi4men
+2minf
+min5go
+2minr
+2mins
+3mis
+mis4la
+mi3sog
+mis4ses
+mis4to
+mis5tr
+3mit
+mi1tr
+2m1j
+2m3k2
+mkaart5j
+2m3l
+2m1m2
+mmel5k
+2m1n
+1mo
+3mod
+mode4l
+3moed
+moed4s
+2moef
+3moei
+moe4raa
+moe2s
+moe5ste.
+moet4s
+3mo3g
+3mole
+m5olie.
+mol4ma
+4molt
+4momv
+mon4a
+m5onder
+monet4
+mo3no
+mon4so
+mon5ta
+m3onts
+3mooi
+2mop
+m3ope
+m3oplo
+5mopp
+mop4sn
+moquet4
+5mora
+mor4e
+mor5g
+mo3ro
+mor4sp
+mos4c
+mo4sl
+mo3sta
+mot4h
+4moud
+5mouw
+mo4ve.
+mo4ver.
+mo4vers
+2m1p
+mp3ach
+m4paf
+m4pes
+m3pj
+mp5lie
+mpon4g
+m4ps
+mp4se4
+2m3r
+4m1s
+m2sa
+m5sal
+m3sau
+m5se.
+ms2j
+m3sje
+m4sle
+m5sleu
+m3s2m
+m2so
+m3son
+m3spl
+m5spor
+m5ster
+ms4ti
+mst5id
+m4ston
+m4stop
+2m5t
+mtes2
+1mu
+mu2m3
+munt5j
+5mus
+mus5t
+3mut
+muur5
+2m1v
+2m1w
+3my
+my3o
+2m1z
+1na
+3na.
+3naal
+3n2aam
+2n1aan3
+4naap
+4naard
+n5aardi
+3naars
+naar3t
+n3aas.
+3nabe
+2nac
+5naco
+n5act
+n4acu
+n5aders
+nadet4
+3nadi
+4n3adm
+n5adv
+2n1af
+naf4l
+n2a1g4
+5naged
+3nagel
+n3agem
+nage5o
+na3gl
+na3gr
+3nai
+na1ij
+4naker
+na3k4l
+3nale
+4n3alf
+3nali
+3n2am
+n2an
+2na5na
+nan4e
+nanes4
+3nant
+nan4tj
+5na1pl
+n5apo
+4nara
+na4rap
+2n1arb
+nar5che
+5nares
+2narg
+2n1arm
+4nars
+2n1art
+na3sc
+na3s4l
+nas4m
+na5sma
+na1sp
+nas5pec
+na3stu
+n3asy
+3n4at.
+3nata
+nat4h
+n4ati
+2natl
+nat4r
+5naven
+n5azij
+2n1b
+2n1c
+n4cheo
+nci4n
+nconsis5
+2n1d
+n4daas
+n4dabo
+n2dac
+n2dar
+nd3art
+n2d5as
+n4daz
+n4d5edi
+n4degg
+nd1ei
+nde5laa
+n5den.
+n4derec
+nder5eg
+nder5og
+nd5eten
+n4dh
+n4dijs.
+nd3ijz
+ndings5
+ndi4se
+n5dji
+n4dof
+n4doli
+nd5olie
+nd3ont
+n4doog
+n2dov
+nd3ove
+nd3rap
+n2dre
+ndrecor5
+nd3rei
+nd5rek
+nds4ben
+nd3si
+nd5smi
+nd1sp
+nd4spra
+n4d5ure
+n2duu
+nd3uur
+nd3w
+1ne
+nebe4s
+n5edit
+2need
+3nee4m
+2n1een
+neer3s
+nees3
+neet5o
+2n3eff
+3ne3g2
+nege4n
+nehen4
+2nei
+3neig
+neil4
+n1ein
+n3elem
+neli4n
+ne5lo
+3n2em
+4n5emb
+4nemm
+4nemp
+ne2n
+n4en.
+n4end.
+nen3g
+nen5k
+4nenke
+nen3o
+nen5slo
+ne4pli
+ne1ra
+n2ere
+n4erg
+5n4eri
+ne4rid
+ner5kl
+ner4sp
+4nerts
+4neru
+4nesm
+ne3sta
+nes5teld
+nes5tele
+nes5telt
+4nesth
+ne3str
+ne4t5ap
+ne4ton
+ne4tru
+4netu
+5neuros
+3neuz
+2n3f2
+2ng
+n2g3ad
+n4gak
+n2gam
+n4gank
+n2gar
+n4geen
+n4gensm
+nge4rap
+nge4ras
+ng4hi
+ng3ij
+n4ginr
+n4g3ins
+ng3lad
+ng2li
+n3glic
+n3glu
+ng3n
+n2g5of
+n2g1on
+ng5raat
+ng3rai
+ng5rie
+n3gro
+ng2s
+ng4sche
+ng4s3le
+ngs5lop
+ngs5tor
+ngs5trek
+ngs5tro
+ng5t
+ngu4a
+4n3h
+nhands4
+nhand5sb
+nhom4
+1n2i
+ni5a
+ni4ce.
+n5idee
+nie5kle
+5nier
+nier5a
+ni3eus
+ni3euz
+3nig
+ni4g5ee
+nij4st
+2nijz
+n3ijze
+nika5s
+nik4s
+3nim
+2nin.
+ni5n2a
+4n3ind
+2n3inf
+4ninga
+ningeni5
+nings5tek
+nin2k3
+2n5inr
+2n3ins
+2n3int
+4ninv
+ni4pl
+ni4sel
+ni3str
+ni3th
+ni1tr
+nits4
+3niv
+n1j2
+2n1k
+nk3aan
+nk5aard
+nkaart5j
+n4kag
+n4karb
+n4kasp
+nk2ey
+n4knaa
+nk5nab
+n4kog
+nk4om
+nkomens5
+nkoo4
+nk3ov
+n3kra
+nk3rek
+nk5rel
+n3kru
+nk1s
+nk5sf
+nk4so
+nk5ste
+n2kw
+n3kwam
+nk3wat
+n5kwen
+nk3wi
+2n3l
+4n3m
+2n3n2
+nnee5t
+nne4pol
+nniks3
+1no
+4nobj
+5noci
+4noec
+2noef
+4noer
+noes3
+no5ic
+n5olie.
+3nolo
+n2oma
+n3omg
+3nomi
+3nomm
+4noms
+4nomw
+3non.
+3nonc
+n3ond
+2n1ont
+3nood
+4noof
+2n1oog
+4n3oorl
+2nop
+5n2opa
+no4pas
+no4poo
+no4por
+4n1org
+5nori
+2nork
+3norm
+3nors
+2nort
+no3s4a
+no3sk
+no3sp
+3nota
+no4tap
+3noter
+3noti
+2nov
+3n2ova
+5n4ow
+2n3p4
+npoor4
+n1q
+2n3r
+4n1s
+n2sa
+n3saal
+n5sag
+n3sal
+ns3ang
+nsas3
+ns3asp
+n3sau
+ns2c
+n3sce
+n3sch
+n4sed
+nsee5t
+n4sef
+n4seg
+nsei5g
+n5set
+n2sev
+ns3f
+ns4fee
+n3sjo
+ns4kri
+n3slaa
+n2sle
+ns5led
+n5sliep
+ns2m
+ns3mar
+n3sme
+n5smij
+ns3moe
+n5smol
+n4s3mu
+n3sne
+n3snij
+n3snoe
+n3soe
+ns3onw
+n3soor
+n4spaa
+n4spot
+ns4ta
+n4staf
+n3ste
+n4steh
+n4s5tent
+n4stenv
+n5ster.
+ns3the
+ns4tie
+n3stig
+n4stij
+nst5ing
+n5ston.
+nst5roos
+n2sui
+ns5uil
+2n1t
+n5taal
+n4t5aard
+n4t5akk
+n4tarc
+ntat4
+ntdu5iker
+n3teg
+n2tei
+nt3eig
+n3tel
+nte4loo
+n5tem
+nt5erfd
+n3tev
+n2th
+n3them
+n5this
+n3thol
+ntie5kl
+nti5kw
+nt3ink
+nt4jo
+n3to
+n4toli
+n4top
+nt3raf
+n5tran
+n4t3rij
+nt5roof
+nt5room
+n5troos
+n3trou
+nt3rui
+nt3ruk
+nt3rus
+nt4sa
+nt4schr
+n5tsj
+nt4sle
+nt5slu
+nt3sm
+nts4ma
+nt1sn
+nt5ste
+nt5t
+n3tu
+n4tuit
+ntu4re.
+ntu4res
+n5twijf
+nt4wis
+1nu
+nu1er
+2nui
+4nuil
+nu5kr
+3num
+2nur
+nuts4h
+n3uur
+5nuut
+nu2wi
+2n1v
+nvel4l
+nvil4
+2n1w
+nwa4v
+nwe4tj
+nx3a
+1n2y
+4ny4i
+4nyo
+2n1z
+o1ag
+o1al
+o1an
+oa4ti
+o5ax
+obal4
+1obj
+obos4
+ob3sk
+o3cha
+o1che
+ochet4
+o3chi
+o5cho
+o3chr
+ocke4
+ock5i
+oc5t4
+4od.
+od1ac
+odden5
+ode3ra
+odie5t
+o4dr
+od3re
+od3ri
+od5si
+ods3oo
+od4sur
+od3w
+oe2da
+oed3aa
+oed3ar
+5oedee
+oed3ei
+oede4n
+oede3s
+oe4don
+oe2dr
+oe2d3u
+oed3w
+oe2f3a
+1oefe
+oef5f
+oe2fi
+oe2fl
+oef3le
+oef5lo
+oe3flu
+oe2f3o
+oe2f3r
+oeg5ij
+oei1
+oei3s4
+oe4kaa
+oek5aan
+oeke4n
+oe2kl
+oe4kna
+oe2k3r
+oek4sl
+oe2ku
+oe2kw
+oel2a
+oe4lap
+oel3ei
+oeleve4
+oelever5i
+oe3li
+oe4lov
+oe4mac
+oe4mak
+oe4mo
+oe2no
+oen5of
+2oep
+oep3ac
+oe2pl
+oe3plo
+oep3lu
+oe2pr
+oeps1
+oep4se
+oe4pu
+oe1ra
+oe4ral
+oeren5e
+oer4sl
+oer4so
+oer4sp
+oe3se
+oe4so
+oe4t5an
+oe4tei
+oe2t3h
+oe2tj
+oe4tol
+oet4so
+oe4tw
+of3at
+ofd1a
+ofd3ei
+of2do
+ofd3on
+of2d3r
+of4du
+ofd3w
+3offic
+offici5el
+offie5
+of3l
+of4la
+of4le
+of4lu
+o3foo
+of2r
+of3ri
+of4sel
+of2si
+of2sl
+of5sm
+of2sp
+of4s5tr
+of4su
+oft2s
+of4tur
+of4tuu
+ofy3
+o1g
+og4aa
+o4gal
+oge4las
+oge4st
+1ogig
+og3le
+og3n
+og2s
+og3sc
+og3spi
+og3ste
+o1h
+2oi1
+oi4ne.
+oinet4
+ois4
+oi3sc
+oist4
+o1j
+o5ji
+o4kaas
+o4kaz
+ok3ef
+o4kes
+o2k3n
+o2k5ou
+o4kre
+o4k3ro
+ok3sa
+ok5spr
+ok1st
+ok4str
+okter4s
+4ol.
+o1la
+ol3ac
+o5lal
+olber4
+ol3ein
+o3len
+ole4ne
+ole1u4
+ol2fa
+olf3l
+olf5ram
+ol4gor
+ol4gre
+ol4gri
+olie3s
+ol4kaa
+olken5
+ol4mes
+ol5mo
+o1lo
+olo3k
+o2lop
+olo5sp
+ol3sj
+o1lu
+ol5uit
+ol3umn
+o4map
+omen4s
+om5ins
+o4mint
+2omm
+omo5s
+om4pj
+ompo4t
+3omro
+om5sl
+om5soe
+om5ste
+on3ac
+onaf5l
+o4nam
+o4naz
+4onc
+2onca
+ond3ac
+4onde.
+4onden
+5onderw
+on4dij
+on4don
+on2dr
+ond3re
+ond3sj
+on4dur
+o2n5ec
+o2ned
+4oneerb
+o4neh
+on4end
+ong5aan
+on4gap
+onge4tj
+ong3le
+ongs5k
+onie5t
+4onin
+onings5t
+oni2q
+4onk
+on4k5ap
+on4klo
+on3kw
+2onn
+onne3s
+2ono
+on2sn
+on3ta
+on4taa
+ont5aar
+5ontbi
+ont5erv
+ontes3
+1ont1h
+on4tre
+ont5rie
+on4t5rom
+3ontva
+3ontw
+o4o2
+4oo.
+oo3c
+oo4d
+ood1a
+ood1e
+ood5i
+ood1o
+ood3r
+ood5ste
+oofd3o
+oof4dr
+oo4g1
+oog3r
+oogs4
+oog3sp
+ook1
+ook5l
+ook5r
+ooks4m
+ook3w
+ool1
+ool5g
+ool5k4
+oom1
+oom5p
+oo4n1
+oon4sa
+oon5t
+oo4p
+oop1a
+oo5per
+oop5i
+oop5o
+oop4sp
+oo4r1
+oor4d5aa
+oor3g
+oor3i
+oor3k
+5oorlog
+oor5m
+oor3sm
+oor5to
+oos3
+oost5r
+oo4t
+oot3h
+oot5i
+oot1o
+oot5r
+o1pa
+o4paar
+op3ach
+o4pad
+o4paf
+o4pak
+opa4n
+3opbre
+op3een
+3openi
+3opera
+o4perw
+op5ete
+op4her
+opie5t
+4op3j
+op3l
+1opn
+4opn.
+4opneu
+o1po
+op1of
+op3ont
+op5p
+5opperv
+op3r
+op4ra
+5oproe
+ops4c
+op3sj
+op3sm
+op1so
+op3sp
+ops4t
+2opt
+3opta
+op5te
+3optim
+o1q
+o1ra
+oraat4
+o3race
+o2rag
+or3ana
+or4ce.
+or4d5am
+or4das
+or4d3oo
+or4dor
+ord3w
+orea5d
+orecord5
+o4reh
+orever4
+4org.
+or4ge.
+4orgi
+org3li
+or5gn
+o1ri
+orie5tj
+3orkes
+ork4l
+orkma4
+or4mac
+or5no
+o3ros
+4orp
+orp5ac
+or5ph
+orp4sc
+or3sme
+or3so
+or4son
+or4tabl
+or4tak
+or4t5ijl
+ort5ond
+or4too
+or4tor
+or4tred
+ort5spr
+ort5uit
+ort3w
+or1u
+o3rum
+or4un
+o5rus
+orwe4gi
+o5ry
+o4sab
+o3sc
+o4sce
+o4sci
+os4co
+os2cr
+o4scu
+o3s4e
+oses4t
+oset3
+oset4t
+osha5k
+o4sj
+os2k
+os5ke
+o2s3l
+os3m
+os3no
+o1s2o
+os1p
+os3pa
+os3pi
+o4s3pr
+o3stat
+os3te
+os4tem
+os4teu
+os4th
+os3ti
+os5tic
+os4tij
+os3tol
+os4tr
+ost3ri
+o5strof
+os3tu
+os4tun
+o3sty
+o1ta
+ot1ac
+o5tag
+ot4ec
+ot5ede
+ote4lan
+o5ten
+o5ter
+o4tesc
+o1th
+o2t1ho
+o5thor
+otli4
+o1to
+oto3a
+otor5o
+ot3re
+ot5rij
+o1tro
+ot4sl
+ot5sla
+ot4spa
+ots5tek
+ot4sti
+ot4str
+ot4stu
+o1tu
+ou5a
+oua5c
+ou3b
+ou2d1a
+ou4des
+ou2do
+oud3r
+ou1e
+oue2t
+ou3is
+ouk4
+oun4g
+ou4rar
+ou4re.
+ou4rem
+ou4res
+ou2ro
+ou4sc
+ous4t
+ous5to
+4out.
+ou2ta
+out1j
+ou2t3o
+ou2t3r
+4outs
+out5sp
+ou1wi
+o1v
+2ovee
+3ovens
+3overg
+o4ves
+2o3vi
+ovis4t
+2ovj
+o1wa
+o4we.
+o1wi
+owie5
+ow2n
+oy2en
+oy4l
+o5yo
+oys4
+o1z
+oze3s
+3paal
+2paan
+paar3t
+2pac
+pa3che
+3pact
+5pacu
+3pad.
+pa2da
+pad3ac
+pa5do
+pa4dr
+pag2a
+4pagg
+pa3gh
+4pake
+4palb
+3pale
+pal5f
+pa3na5
+pa4nad
+5pand.
+5panee
+pa4neu
+pa4nisl
+4pan5k
+pan4tr
+pa4o
+1pap
+pa4pet
+5papi
+pa4pl
+2papp
+3pa3ra
+pard4
+3park
+par4ka
+par4kl
+2p3arm
+1part
+3parti
+part3j
+3partn
+pa5ru
+3pas3
+pas4ses
+pat5j
+4patl
+3patr
+2p3aut
+pa4vl
+2p1b
+2p1c
+2p3d2
+1pe
+pe2ak5
+pe2a4r
+3peb
+4peci
+pede4s5
+pee4n
+2pef
+5peg
+3pei
+pei4la
+4p1eis
+pe2kl
+pek3la
+pe2kn
+pe4l5ak
+pe4lee
+pel3f
+pe4link
+5pelot
+pe4lov
+2p5emm
+3p4en
+pe4nam
+5pend.
+5pende.
+pen5k
+5penn
+penning5s
+pen4se.
+pen3sl
+pen3sm
+pen3sp
+pen3t4
+pe4nu
+peper5s
+4pepi
+3pe1ra
+3perc
+5peree
+pe4rek
+pe4res
+5perg
+3peri
+peri3s4
+3perk
+pe3ron
+3pers
+pers5ag
+per4sc
+pers5po
+per4str
+pe5sta
+pes3ti
+pe5tr
+3peut
+4pex
+2p1f
+2p3g
+pge3s
+2p1h
+p2heu
+3p2hia
+p5hoe
+p5hui
+1pi
+pi4ce.
+pie4k5u
+pi1eu
+pi4ga
+pij3k
+pij5ke
+pij4li
+3pijn
+3pijp
+pij4pa
+pij4pl
+pij4tj
+2pijz
+p5ijzer
+pi4kl
+pi4ko
+pi4nas
+pin5d
+pings5
+4pinj
+pin4kr
+pi5no
+4pinr
+2pins
+p5instr
+pi4ot
+3pis
+pi4sco
+pi4s5t
+pi3th
+pit3j
+pit3r
+pit4sp
+2p1j
+4pja
+p2je
+2p1k
+p2l4
+3pla
+4pla.
+plaat5j
+4plad
+4plam
+p5lamp
+4plang
+p4lant
+4p3lap
+1p4las
+pla4tr
+p4lec
+p3leid
+p3lep
+p4lex
+2plig
+2plij
+pli4t
+3ploe
+pluk5
+2p1m
+2p1n
+p4neum
+pock1
+3pod
+poda5
+poe2s
+poe5tj
+po4ki4
+po4kol
+3pol
+pol5k
+3pom
+4poml
+pomp5j
+3pone
+pon4se.
+pon5ta
+poo4
+4poog.
+poo5len
+4poor.
+poor4tj
+poot1
+3pop
+po4p3a
+po4pi
+pop5s
+po2q
+pore4n
+2p1org
+4pork
+por4t5j
+por4tra
+3pos
+po1sa
+post5in
+post5re
+po4ta
+3poti
+pot1j
+4pov
+po4we
+2p1p
+ppe2n
+ppen5i
+p2r2
+p5raad
+3prac
+3prakt
+p3rand
+3prang
+p5rap
+p3rech
+prek4s3
+3prent
+pren4t5j
+5p4res
+pres3c
+pre4t3j
+pre4tr
+preus4
+5pries
+priet5j
+3prij
+3princ
+4pring
+pring5s
+p4rio
+p4riu
+3prob
+3p4roc
+3prod
+3prof
+5p4rog
+3proj
+4prok
+5prop
+pro5pr
+pro5sc
+pro4s3t
+pru4t
+2ps
+4ps.
+ps5ag
+5psalm
+p3sel
+pse4la
+ps5lan
+ps2m
+ps3ma
+p1sn
+p2sna
+p5soe
+p1sp
+ps4pe
+p1st
+p3ste.
+p3stem
+p5sten
+p5ster.
+p5sters
+ps3th
+ps2u
+3p2sy
+5psyc
+4p1t
+p3te
+ptea4
+p2t1h
+p4tj
+pt2s
+1p2u
+pu3e
+pul4le.
+3pun
+4pun.
+punt3j
+put3j
+pu2t3r
+2p1v
+pvaart5
+2p1w
+py1
+p5yw
+2p1z
+1qu2
+5qua
+2que.
+5queu
+qui5no
+4raalm
+raam5
+2raan
+raap3
+3r2aar
+4r3aard
+raat1
+2rac
+r4ac.
+raccro4
+ra2ce
+rade4ra
+ra3di
+4radr
+2rafd
+rag5l
+ra3gn
+rag4s
+rai4d
+ra4kri
+4ralar
+ra4l5ee
+4ralf
+r1alg
+4ralm
+4ralu
+4ramn
+r4amp
+2rana
+r2anc
+ran4ce
+ran4daa
+rand5sl
+ran4ge.
+ran4ges
+ran4g3o
+ranje5
+ran4sl
+ran5so
+rans3p
+r4anti
+ran4t3j
+ran4tr
+r3antw
+ra4pas
+5rapeu
+1rapi
+3rappo
+ra2pr
+rap5ro
+4r3arb
+r4are
+4r1arm
+4rarr
+4r3art
+ras3l
+ra3son
+5rasp.
+5raspen
+ra5s4tek
+ra5stheni
+r4ati
+rat3j
+2rau
+ra4vel
+ra3yo
+2r1b
+rbonne4
+r1c
+r4chec
+r4chen
+r4chete
+rchi5m
+r2chl
+rci2a
+2r1d
+r4dact
+r3dag
+r2d3ar
+rden5s
+rde5ra
+rder4s
+rdes4s
+r2dol
+rd4re
+rd2s
+rd3sc
+rd3se
+rd3sp
+rd5sto
+rd3str
+rd2w
+rdwa4r
+r4d3wo
+1re
+3re.
+3reac
+rea4d
+re4ade
+rea4m
+3reda
+reda4l
+3redd
+5redenee
+rede4s3
+ree2d1
+ree4k
+2r1een
+reen4e
+reer4ad
+4reers
+4reerw
+2reff
+4reg.
+4regd
+3regel
+rege4s
+4regg
+3regi
+re3gl
+4rego
+4regt
+4reie
+4reil
+4reind
+3reini
+rein5o
+rei4sc
+5reiz
+re4kaa
+5rekeni
+re4kle
+re4klu
+re4kn
+rekor4
+re4kro
+4reks
+re4kuu
+reld3o
+rel4d3r
+re4lei
+relijs4
+rel5k
+rel5l
+rel5s
+re4lur
+reme4t
+remin4
+5r2en.
+re2na
+re4nam
+re4nan
+r2end
+r5endert
+re4nep
+ren5ete
+5renf
+3renh
+4r1eni
+5renkl
+re2no
+ren3of
+re3n4ov
+5rento
+4rentw
+4req
+4r3erf
+re3r2o
+2r3ert
+4r3erv
+2rerw
+r2es
+re1sa
+res4e
+resi3s
+res4koo
+res4kop
+re2sl
+re2sp
+res3pe
+res3pi
+res3t
+5resul
+re4tem
+re4tog
+reu4ko
+2r1ex
+r4faa
+r4fag
+rf5da
+r4feng
+r1fl
+r4flag
+r2f3li
+r4foo
+r1fr
+r2fre
+rf4rek
+rf5rol
+rf2s4
+rf3sc
+r4fur
+4r1g
+r4gab
+r4gart
+rge4a
+r4geen
+r4gei
+r5gel
+r4geng
+r4gerep
+rget4
+rg2l
+r4glu
+rg2ne
+rg5op
+rg1s
+rg3so
+rgs4p
+r1h
+rho4m
+ri5aa
+ri5al
+ri4bl
+rici4e
+ric5ket.
+rief5l
+rie4kap
+rie4lei
+rien4n
+rie4to
+ri1eu
+ri4fa
+ri5fl
+r4ig
+ri4gaa
+rig4l
+rij5kag
+4r5ijl.
+r3ijld
+3rijm
+rijs4t
+rij5ster
+ri2kl
+ri4mer.
+ri4mers
+rim4pr
+ri5n2a
+2rinf
+r2ing
+r5ingan
+ring3l
+ring3r
+2rinh
+rin4kl
+4rinko
+4rinkt
+rin4ne.
+2rinr
+2rins
+r3inv
+ri4oc
+r4is
+ri4sam
+ri3s4ko
+ris4tee
+rist4j
+rit5j
+5ritm
+3rivie
+rivo3l
+r1j4
+rjan4
+rjas4t
+r1k
+rkaart5j
+r4kart
+r2kei
+rke4n
+rken4s
+r4kez
+r4kink
+rk5lat
+r2klo
+r3klok
+r2kne
+r2kob
+rkoot5
+rk5ord
+r5kran
+rk1s
+rk4slu
+rk4taa
+rk2t5r
+rk3waa
+r4kwat
+r2kwe
+r1l
+r3la
+rle4gek
+r4les5t
+rlings4
+rling5sk
+rlo4f3
+rlos5
+r5lu
+rluit4
+r1m
+rma3f4
+r4m5an4c
+r4mart
+r3me
+r4meb
+r4meg
+rme4ra
+rmi4ne.
+rmo5sko
+rmte5s
+2r1n
+rn4aa
+rn4am
+r4nap
+rna4sp
+rnee5t
+r3nei
+r4nele
+r4n3ene
+rnes3
+rne4tj
+r2nex
+r4nid
+r4non
+r4noor
+r3nu
+ro5ar
+roces5
+ro1ch
+2roef
+roe4g3r
+roe4pl
+roe4rei
+roer5s
+roe4ta
+2roev
+ro3fl
+5roga
+roges3
+4roj
+3roker
+rol4a
+ro5lan
+role5s
+rol5g
+2roli
+rol5k
+rollo4
+r2on.
+ron4da
+ron4d3o
+ronds4
+ron4d5u
+r2one
+ronge5t
+r2oni
+ron4ka
+r2ons
+ron4tj
+ron4t3r
+roof3
+roog3
+2r1oor
+ro4pan
+rop4e
+rop4la
+rop2o
+ro4pu
+4roq
+2rorg
+ro5sho
+ro1sk
+ro3sko
+ro1sp
+ross5t
+rot4h
+rot5j
+ro5ton
+ro3tr
+5rotsen
+rot4st
+r1oud
+3rout
+rouwen5e
+rove5ri
+r1p
+rp3j
+rpool4
+rp4sto
+r5q
+rquet4
+2r3r2
+rre4lu
+rre5sl
+rre3sp
+rreur3
+rrie4t
+rron5k
+rru2
+2r1s
+r2sa
+r4saan
+rsail4
+r3sal
+r4s1am
+rs5chef
+r5schi
+rs2cr
+r2sek
+r4selz
+r4serv
+rseve3
+r2s5ez
+rs4hal
+r5s2hi
+rsis5
+rs2ja
+r3sjou
+r3sjt
+rs4kat
+rs4kie
+rs4koo
+rs5led
+r5sleu
+r4sloo
+r5slui
+rs2m
+r3smak
+rs4mit
+r4snaa
+r2sno
+r3snoe
+r4sog
+r4som.
+rs3ong
+r2sor
+rs3ord
+r4spad
+r4spar
+r5spel
+rs4pen
+rsper4s
+r4s5pet
+r4spot
+r4s5put
+rss4
+r4staf
+rs3tas
+rs4te
+r5stes
+rs4ti
+r4stit
+rstof5
+r4stun
+rs4ui
+rsui4t
+2r1t
+rtai4n
+r2tar
+rt3art
+rtati4
+r4tau
+rte4na
+rte5ro
+r4teve
+r2th
+rt3hel
+r3tho
+rt4ij
+r4tink
+r5tof
+rtoi4
+rto4le
+r4tom
+rt5redene
+r2tri
+rt3rij
+r2tru
+rt3ruk
+rt4sec
+rt2sl
+rts3li
+rt4spr
+r4tui4t
+rt2wi
+3rubr
+ru1e
+ru2g
+2rui
+3ruimt
+r5uitr
+ru2k1
+ruk5r
+ru4li
+r2um
+2runi
+ru4pi
+r2u2s
+rus4h5
+ru4st
+rust5o
+rut5j
+4ruu
+ru5we
+r1v
+rvee5t
+rve3ri
+rve5s4
+rvet5j
+rv1ic
+rvil4
+rvoch4
+rvoy2
+r1w
+rwe4tj
+r4wh
+rw2t5j
+r1x
+rxis5
+3ryl
+ry1o
+4r1z
+rzu4e
+3sa.
+3saag
+s1aan
+s5aap
+4s1aar
+3sab
+2s1ac
+3sacr
+s1ad
+2s1af
+sa2fe
+5safo
+s5agent
+5sah
+3sai
+5saj
+s3akko
+s1akt
+1sal
+s4ala
+s3all
+4salm
+s5alma
+s5aln
+3salo
+4salp
+s3alta
+s1amb
+sam5p
+s3ana
+3sanc
+sans5
+5sant
+san4t5j
+3sap.
+s5ape
+sap5l
+2sar
+3sar.
+sa3ra
+s3arb
+s3arc
+3sard
+sa4re.
+3sari
+s1arm
+3s4ars
+s1art
+5sasa
+s3assi
+sas3t
+3s2at
+4s3atl
+4satm
+4s3att
+s5aud
+5saur
+3saus
+s3aut
+3sauz
+s1av
+5sax
+4s3b
+1sc
+2sca
+2sce
+4scel
+4scent
+s2ch
+4sch.
+5schaa
+3sche
+4schec
+5sched
+4scheq
+3s4chi
+4schk
+5scho
+3schr
+2sci
+sci4ne.
+sci4nes
+2scl
+2s2co
+s4cola
+3scoo
+3scop
+3s4core
+scorre4
+2scr
+scra4
+4scris
+2scu
+2scy
+2s1d2
+sde4a
+s3dw
+1se
+3se.
+se2a
+sear2
+sebal4
+sebe4s
+s1ech
+5sect
+4secz
+s5edit
+2s1een
+4seev
+4sei.
+seig4
+seis4t
+3seiz
+5seke
+sek4sl
+s2el
+5sel.
+se4lag
+sel5el
+4s3elem
+3selen
+4self
+sel3k
+se2lo
+3sels
+5selt
+se4m3ac
+s3emm
+se4mo
+s2en
+3s4en.
+se4nem
+se4net
+sen5ete
+sen3k
+se2no
+sen5of
+sen5on
+3sen3s
+sen4tj
+sen3tw
+3s4er
+se1ra
+se5r2e
+4sergo
+4sern
+ser2s
+sert5w
+s5ervar
+se1sa
+s3e2s3p
+sessi4
+se1st
+s3eter
+se2tr
+se5tre
+se4tw
+5seu
+se1u4m
+seur4s
+s3even
+2sex
+s1exa
+2s1f2
+s2fe
+s3fei
+4sfi
+s2fy
+4s5g4
+sge3st
+2s1h
+s4ha.
+sha2k
+5shamp
+sha4p
+sheid4
+s4h5es
+s4hip
+3shir
+s2hop
+s5hope
+s4hort
+s2hot
+5shot.
+s5hote
+3show
+1si
+3sia
+si4dec
+si4dew
+5s4ie
+sie3s
+sie3tj
+si3f
+3s4ig
+2s3ijz
+5silo
+2s5inc
+2s3ind
+2sinf
+sin3gl
+sings5
+4sini
+s3inko
+4sinm
+2sinr
+2s1ins
+2s1int
+4sinv
+s3inz
+5sio
+si4ons
+5sir
+3si2s
+si5sal
+sis4t
+sis5tr
+3sit
+si2z5
+2s1j2
+5s4ja.
+s5jaa
+3sjac
+s3jas
+s3je.
+3sje4r
+4s5jes
+5s2jew
+s4jez
+s2jo
+5sjof
+3sjok
+4sjon
+2s1k
+s3k2a
+skaart5j
+ska4te
+s3ke
+5skele
+3s4ki.
+skie5st
+s3kl
+s3kn
+s5koe
+4s5kof
+s5kol
+s4kopi
+skorre4
+s5kov
+3skrib
+3skrip
+s3k4w
+sky3
+1s2l2
+3sla.
+3slaan
+s3laar
+s3lad
+3slag
+slag3r
+3s4lak
+2s1lam
+3slape
+s3las
+2s3lat
+4s5lau
+s4lav
+s4le.
+s5leder
+5slee.
+3sleep
+4s3leer
+2s3leg
+2s3lei
+4sleng
+3slent
+5sleper
+4s3ler
+s3les
+sle4tj
+3sleu
+5s4leut
+2s3lev
+4s3lez
+3slib5
+2s3lic
+2slid
+4s3lied
+s3lief
+s3lig
+3slijp
+slik5l
+s3lini
+4slinn
+4s3lit
+slo4b
+4sloc
+3sloe
+3slof
+2s3log
+s5loon
+s3loos
+5sloot5
+3s4lot
+slot5a
+slot5o
+4slou
+s4low
+2s3loz
+4s3luc
+3slui
+4slui.
+4sluid
+sluis4t
+5sluit
+s3lus
+4sly
+2s1m
+4smaat5
+s3man
+s3mas
+4s3mat
+4smec
+s2med
+5smeed
+4s3mei
+4smelo
+4smen
+4smes
+3smeu
+3smid.
+4smidd
+smies3
+s2mij
+s5min
+smoes4t
+3smok
+s5mom
+s5mon
+3smul
+s2n
+4s3nac
+2snam
+5snavel
+snee5t
+sne4k
+3snel
+2s3nes3
+s3net
+s3neus4
+4s3nie
+5snijde
+s4nip
+4snit
+4sniv
+s3nog
+s5nom
+snot5a
+5snuf
+5snui
+2snum
+s3nut
+1so1c
+soci3
+1sod
+1soe
+4soef
+5soep
+soeve3
+3sofa
+s1off
+s3oge
+3soi
+1s2ol
+3sold
+so4le.
+so4les
+s5olie.
+3s2om.
+3somm
+2s3oms
+4somz
+5s4on.
+s1ond
+2song
+3sonn
+3s4ons
+2s1on2t
+sont3e
+sont4l
+4sonv
+2s3oog
+5soon
+3s4oort
+2s1op
+3s2op.
+sop2h
+so5phi
+s4opo
+s2opp
+s5opper
+so3pra
+s3opto
+3sor.
+s2orb
+2s1or5g
+3sori
+s3ork
+3sor4s
+s4ort
+sos4t
+s4ot
+sot4h
+sou3t
+2s1ov
+s2p2
+4sp.
+4spaal
+2s3pak
+s4pan
+3spann
+4s3pap
+4s5pas
+3speci
+3s4pee
+speet3
+2spei
+5speler
+3spell
+2spen
+s5pen.
+2sper
+s4perm
+s3pes
+4spex
+1spie
+4spijn
+spi4k
+5s4pio
+2s1p4l
+5splee
+spleet5
+s3plei
+3splet
+spli2
+s3plic
+3splin
+5split
+3spoel
+2spol
+2spom
+5spoor.
+s4pore
+2spos
+5spraak
+4sprac
+3sprek
+4s5prem
+4spres
+3spreu
+s4prie
+4spriem
+4sprij
+4sprob
+5s4pron
+2s3ps
+2spt
+3spui
+2spun
+s1q
+squad5
+4s3r
+srac5
+sregis5
+4s3s2
+s5s4a
+ssa3s
+s4sce
+sschops5
+s4sco
+ss4e
+s5seb
+s5see
+s5sel
+s5sem
+ssen5t
+s5ser
+ssi1s
+ss4k
+s4sm
+s5so
+sson4n
+sspas4
+s5str
+s5su
+s2t
+4st.
+4staanw
+staat5j
+2s4tac
+3stad.
+5staf.
+4stafe
+4stakk
+4stale
+4stali
+sta4lo
+3stamp
+3stand
+s4tap
+3stape
+star3o
+2stas
+5statio
+4stau
+4stavo
+4stax
+s4taz
+4stb
+2stc
+2std
+4stea
+4stec
+s5tech
+3s4ted
+5steek
+3steen
+s3teer
+stee5t
+4steka
+4stema
+5stemm
+4stemo
+5stenic
+5stentv
+4stenu
+4steo
+4sterm
+4steros
+4sterr
+5sterren
+4ste2s
+stes4s
+4steva
+s4tex
+s4tez
+2stf
+4stg
+2sth
+s4tha
+st5hed
+5sthenic
+s3thet
+st1hi
+st1ho
+s4thu
+s4thy
+s4tich
+2stid
+s4tiel
+3stier
+5stift
+3stigm
+4stijd
+3stijf
+3stijl
+st3ijs
+3stikt
+5stild
+s4tilu
+3stimu
+st3ind
+4stins
+4stint
+sti4o
+3stip
+s5tis
+4stite
+2s4t1j
+4stk
+2stl
+st4let
+2stm
+2stn
+2stoc
+4stoef
+4stoej
+3stoel
+4stoer
+4stoes
+5stoet
+4stoez
+4stol.
+sto4ne.
+4s3tong
+st3oog
+stoot5j
+sto4p
+4st3ord
+sto4re.
+4stos
+s4tov
+2stp
+4strad
+s5tradi
+4strap
+5stratief
+5stratiev
+4strav
+4strec
+5streek
+5streerb
+s3tref
+4streg
+4strei
+s4trek
+3strel
+s4trem
+5strep
+4stroe
+s5troep
+s5trog
+s4trol.
+s4troll
+5stroom
+4stroos
+4stroz
+1stru
+s4trui
+4st5s2
+2stt
+2stub
+3stud
+5stuk
+2stv
+2s4t3w
+2sty
+2stz
+1su
+5sua
+su2b1
+sub3r
+3suik
+s1uit
+3suk
+2s1un
+s4us
+3sus.
+4s3v
+svoge4
+4s1w
+1s4y
+sy5c
+3syn
+sy4nan
+sy4ne
+3sys
+4s1z
+taal1
+t3aanv
+4taap
+taarn5
+taart5r
+4taas
+taats5in
+taat4s5t
+5tablet
+2tac
+t3acad
+t1ach
+t4aci
+t2act
+5tactiek
+3tacu
+4tad
+t1ade
+5tado
+tad2s
+tads5p
+tad4ste
+tads5tr
+2taf.
+2tafd
+3ta5fe
+4taff
+4t3afs
+2tafw
+ta4gr
+ta5gra
+3tai
+tai2l3
+ta4ke.
+takt3a
+4tald
+5talent
+3talg
+5talig
+talm3a
+4talt
+ta4mak
+ta4man
+2tamb
+3tamen
+ta4mu
+2ta5na
+t3anal
+tan4d3r
+3tanj
+t2ans
+3tants
+ta4pek
+ta4pes
+5tapi
+ta5ra
+t3arb
+5tarctisc
+4tarea
+3tari
+4t1arm
+ta2ro
+2tart
+t3arti
+tart3s
+5tarw
+tarwe3
+ta4ry.
+4tas4p
+t5aspe
+ta3sta
+ta4tem
+2tatl
+3tau
+4t3aut
+2tav
+ta4ve.
+4tavo
+5tax
+4t1b
+4t1c
+4t3d2
+1te
+3tea
+te4ad
+5tea4m
+tea5ri
+te2as
+3tec
+te5che
+4t5echt
+tec5k
+tec3t
+4ted.
+t3edit
+te3do
+tee5ke
+tee2m1
+4teen3
+t5eenhe
+tege4n3
+t3eind
+teits3
+5tekene
+5tekens
+4tekk
+3tekor
+3teks4
+4tekse
+t5ekster
+tekst5i
+tek3t
+tel5ant
+te4lap
+3telef
+3teleg
+te5lel
+te4loe
+te4log
+tel5oog
+tel5su
+te4luu
+4temm
+te4mor
+3tempo
+4temt
+t2en
+ten4ac
+te5nak
+ten3al
+ten3as
+te4nau
+t5endert
+te4ned
+te4nek
+te4nel
+te4n3et
+ten3k
+te4nol
+ten4se.
+ten4su
+ten4tis
+5tento
+t3entw
+3tenu
+3tenw
+3teo
+te3p2h
+t2er
+te5raal
+ter3af
+ter3ak
+te3ral
+te5rang
+5terapi
+ter5app
+ter4dol
+3terec
+ter5eig
+te4r5el
+te4rem
+te4r5env
+te4reu
+3terh
+teri4m
+5term.
+5termen
+3termi
+ter3na
+5terrei
+ter5se
+ter4spr
+3tes
+te5sap
+tes4ko
+te5staar
+te5stel
+te5stic
+te5stra
+5teti
+t3euro
+4teuv
+te4ve.
+2texe
+4texp
+4t1f2
+tfa4d
+4t3g2
+tgaat5
+2th.
+2t1ha
+3t4ha.
+3t2hag
+4t3hal
+3than.
+2thc
+3the.
+3t2hea
+t5heb
+t5heden
+3thee.
+t5heer
+2t5hei
+5theo
+t2her
+3thera
+t3here
+the5ri
+3therm
+3thes
+t5hiel
+4thl
+4thok
+t4hom
+4t1hoo
+thoof5di
+2t3hor
+t1hou
+t3houd
+t3houw
+2ths
+t1hu
+2thui
+t4hun
+3t2hur
+5thus
+2thyp
+1ti
+5tia
+ti4aalb
+tia4nu
+3tib
+3tica
+3tice
+ti4ce.
+5ticu
+3tie
+ti4eerb
+tie5kla
+tie3ru
+tie3s
+ties4l
+ties4p
+tie3t
+ti1eu
+ti2ga
+tig3aa
+4tigm
+ti2gu
+tig5ur
+5tijd
+tijk5er
+4tijl.
+4tijld
+4tijlt
+3tijn
+tij5t
+2t1ijz
+5tike
+5tiku
+tik4w
+ti4l5aa
+4tiliu
+til4la.
+ti5mer
+ti4mes
+ti4min
+3timm
+5timo
+4timp
+ti4nad
+4tincu
+4tind
+2tinf
+ting5aa
+t5ingeni
+tin4gi
+tin4g3r
+ting5stra
+4tinku
+4tinl
+2tins
+t3inst
+4tinv
+4tinw
+ti4oneu
+3tis
+tis4l
+ti3sli
+ti5s4p
+ti5sto
+tis4tr
+5tite
+ti5th
+ti3tr
+3tiv
+3tiz
+tj2
+2t1ja
+4tjesl
+tje5spr
+4tjeu
+2t1jo
+2t1ju
+4t3k4
+4t1l
+t3la
+5t2lem
+tleve4
+4t3m
+tman5a
+tmanag5er
+tmos3
+4t3n
+3toc
+4tock
+3tod
+to3do
+toe3d
+toe3g
+5toej
+toe5k
+5toe3la
+3toen
+toe3pl
+5toe3s4
+toe3tj
+3toez
+4to2f
+tog4n
+3toil
+to4kan
+4tolf
+tol4pr
+4tolv
+5tomet
+t3oml
+tom4n
+4tomp
+tomp5j
+4toms
+t2on
+2tond
+t5onder
+3tonee
+to4nes
+tonge5t
+ton4gr
+5tonn
+to4non
+2tont
+t2oo4
+toof5
+3toon
+to4pas
+4topb
+4topd
+top4let
+4topm
+2topn
+4topr
+t5opva
+to4q
+5tor.
+tor5ag
+5torens
+2torg
+t3orga
+tor4m3a
+5torr
+5tors
+to5r2u
+5to1s4
+to3sf
+to3sk
+to3sl
+tos5s
+tot4r
+tou1c
+2t5oud
+tove5na
+4toverg
+tove5ri
+to5wr
+4t3p2
+tpa4t
+tper4sp
+tpers5pec
+tpe4t
+4tq
+t2r2
+4t3raad
+4traf
+tra4fo
+3trai
+5trakta
+5traktem
+5trap.
+trap3l
+5tratiesy
+4trato
+t5ratt
+traw4
+5t4re.
+tre4ak
+2trec
+4treda
+tree5t
+4t5reg
+3trein
+4t3reis
+4treiz
+4treke
+tre4kl
+tre4ku
+4trel
+t5rese
+tre2t
+3tribu
+5trice
+t5rief
+trijs5p
+3tril
+4triv
+tro3a
+4troed
+t3roer
+t3roes
+t3rold
+t4rom
+t3rond
+tront5j
+3tros
+t5roven
+5trui.
+trui3t4
+2t1rus
+4ts
+ts4aar
+tsa4le
+ts3as5
+t3sch
+t2s3ef
+t2sei
+ts5eig
+ts5eind
+t2sek
+ts3eks
+t3sen
+t5sen.
+t4seng
+ts1ex
+tsi4ga
+t2sij
+t4sink
+ts2j
+t5sjen
+ts4kel
+ts4kul
+t5sky
+t5slaat
+t5slag.
+ts3lam
+t4slan
+t5slang
+t3slep
+t5sloe
+ts2me
+t4smu
+ts3nat
+t3snoe
+ts1or
+t1sp
+t3span
+t5spel
+t3spi
+t3spor
+t3spre
+t5spru
+t1st
+t4stab
+t5stale
+t4star
+t4s3tas
+t3ste
+t5ste.
+t4steg
+t5sten.
+t4stera
+ts4tes.
+ts4tie
+t3ston
+t3stop
+t3str
+t3stu
+tst4w
+t2su
+t4suit
+4t1t2
+t3t4a
+tta4g
+t3te
+tte3lo
+tte2n
+tten4tj
+ttes5tat
+t3tr
+ttrai4
+tt5s
+t5tw
+4tual.
+4tuals
+5tub
+tu4bel
+5tuc
+tu1e
+5tueu
+3tuin
+4tuip
+tuit4j
+t5uitk
+4tuk
+tuk3sn
+3tum
+tu4mel
+4tump
+tu4nes
+3tunn
+tu1o
+3turb
+3tu4s3
+tuu4
+tu3wa
+4t1v
+tva4l
+2t1w
+4t3wa
+t3we
+twee5l
+twee3s
+twee3t
+t3wie
+t4wijf
+4twil
+t2win
+t3wind
+t3wo
+1ty1
+ty4le.
+3typ
+ty5s4
+4t1z
+u1a
+ua4dro
+uae4
+uaes5
+u4an.
+ua4re.
+ua4res
+uat4s
+4ub
+ub3ac
+ube4li
+u5bi
+u2bo
+u4ce.
+u4ces
+u1cha
+u3chen
+u3chet4
+u5cheu
+u3cho
+uchte5ri
+uchu4
+uck4e
+uc5ki
+ucle5
+uclea5r
+uc4ta
+u1d
+uden4tj
+udet4
+u4dez
+udge4t
+udi4ne
+ud5oom
+ud3ove
+u2dr
+ud4sa
+ud5sme
+ud4sta
+ud4sto
+ud3w
+u1ee
+u1el
+ueli4
+ue4s
+ues3t
+u1eu
+u1fl
+u3f2r
+4ug
+ug4des
+ug2do
+ug3ei
+uge4leg
+uge4ne.
+ugi4e
+u4g3l
+u2go
+ug3on
+u2g3r
+ug3s4
+ug5sto
+ugsto4r
+u3h
+u2i
+ui2da
+ui4deu
+uid3g
+ui2d1o
+uid4sta
+ui2d5u
+ui3e
+uies4
+ui2f5a
+uif3l
+ui2f3r
+ui4fu
+ui4gaa
+ui2go
+ui2g3r
+4uik
+ui2k3a
+ui2k3l
+ui2ko
+ui2k3r
+uik3w
+ui2la
+uil3aa
+ui4lem
+ui5li
+uil3m
+ui2lo
+ui2ma
+ui5me
+uimes4
+ui2m5o
+u4in
+ui4n1a
+ui4nes.
+ui2no
+uin5og
+uin4slo
+ui4pe.
+ui4pes
+ui4pl
+ui4p5o
+ui4p3r
+4uis
+ui2sa
+ui4sl
+ui4t5a
+uite5s
+1uitg
+uit1h
+uit1j
+5uitker
+5uitle
+5ui2t1o
+uit3r
+uit1s
+5uitslag
+uit3sm
+uit3sp
+5uitvoe
+u1j
+uk4e
+uke3no
+u2k3l
+u2k5of
+u2kor
+u2kr
+uk5rak
+uk3ri
+uks4h
+uks4me
+uk5smi
+uk4taa
+uk3w
+u1la
+ul3ac
+uliet4
+ul4kar
+ul2k5n
+ul2l5o
+u1lo
+ul4pak
+ul2p3l
+ul2po
+ul4pr
+ul4ps
+ul4spa
+ul4spu
+ul4stel
+u1lu2
+ulver5ig
+u4mac
+um5ele
+ument5j
+ummi3s
+umpi4
+un2c
+un3che
+unch5r
+un4e
+une4tj
+un3g
+3unif
+3univ
+un4kr
+un2s
+un3sc
+un3se
+uns4t
+unst3a
+un4stei
+unst3r
+unst5ui
+un4tag
+un2tj
+un4t5o
+u3ol
+u1or
+u5os
+4up
+u1pa
+upda4
+u2pe.
+u2pek
+u4pen
+uper5s
+u2pes
+u1pl
+u1po
+u1pr
+u1q
+2ur
+u1ra
+ur3ac
+ur2al
+uras4t
+u4rec
+u4renv
+ures4
+ure5st
+ure4tj
+ur2fa
+ur5gi
+ur3gl
+u1ri
+uri4c
+4urie
+ur5ijz
+u4rind
+urken5
+ur4kie
+u1ro
+u4ront
+ur5ph
+ur2sl
+urs5li
+ur2sn
+ur4spa
+ur4spr
+ur4sui
+u1ru
+u3ry
+u1san
+u2sc
+u3s2cr
+4use
+use5a
+u4sep
+u4sj
+u4s3l
+us3n
+u2so
+us5oli
+u4s3p
+us4se.
+us4ses
+u2st
+us3te
+us4tei
+us3ti
+ust5oor
+us3tr
+4ut
+u1ta
+ut2ad
+u3tan
+u4tees
+u4tef
+u4teks
+u4tem
+uter4n
+ute5ro
+u4tet
+u2tex
+uth5r
+uti4oni
+uti2q
+u1to
+uto5s
+u1tr
+uts4c
+ut1sn
+ut2sp
+ut4sto
+uts5tor
+ut5tl
+u1tu
+ut5w
+uu2
+uur1
+uur3a
+u1v
+uvan4
+uvel4s
+uw1a
+u4wec
+u4wei
+u4weko
+uwen5k
+uwe5s
+u4wij
+u4wind
+uwings5
+u4wink
+uw5inz
+uw1o
+uw3r
+uw5u
+uwui2
+u1z
+uzen5
+uzes4
+uziek3
+vaar5tj
+va4kar
+va2ki
+vak3l
+va2ko
+va4loe
+val4s3p
+va2n
+van5ac
+va5ner
+var5s
+va3se
+va3s4o
+vast5re
+vast5ri
+va4th
+2vc
+veel1
+veep4
+vee5sta
+2vega4
+veis4
+ve4lap
+vel4do
+vel4dr
+vel4d3u
+ve4lis
+ve2na
+ve5nare
+ve5net
+ven3k
+ve2n3o
+ven2s
+ven4se
+vens5er
+vens5lo
+vens5u
+venti4o
+ve2r
+ver1a
+5verd
+ver3da
+verdi4
+ver5ed
+ver5eri
+ver5est
+ver5et
+ver5ijl
+ver5ijs
+ver5ijv
+ver5ingsi
+ver3k4
+ver3n
+ver3p
+ver3sa
+ver5sla
+ver3sm
+ver3sp
+ver5spa
+ver3tw
+ver1u
+5verz
+ve2s3
+ves4c
+ves4po
+ve4st
+ve4tem
+ve2tj
+ve4to
+ve2tr
+2vi2c
+vi3ch
+vier5a
+vie2s
+vies3p
+vie5tj
+vie2w
+vil4t5j
+vi4ne
+ving4
+4vi4ot
+vi4san
+vi4set
+vi4sol
+vi5sor
+vis5ot
+visper4
+vis5tr
+vi1tr
+vi4val
+2v1j
+v2l
+4vlar
+vlei5
+vleis4
+vle3s
+vlooi4t
+3vo
+voel4s
+voet3j
+voe4tr
+voet5sp
+vo2le
+vo2li
+vol3ij
+v4r2
+vrij3k
+vrij5ste
+vue5
+vues4
+vu2lo
+vuur5
+waad1
+wa4b5
+w2ad
+5wade
+wa5d2j
+w2ag
+3wagen
+wa4la
+wa4les
+4wana
+wan4gl
+wa2n3o
+wan3sm
+3wap
+war4tan
+wart3j
+war4to
+wart3r
+wa4s5l
+wa4s3p
+water5a
+wat5j
+watt3u
+2w1b
+w1c
+2w1d
+1we
+we2a
+we2b3a
+we2d1i
+we2dr
+wee5fa
+wee5kla
+wee3lo
+wee5ri
+wee3sl
+wee3sp
+wees4t
+we2g3a
+weg3eb
+we4gerv
+weg3ij
+weg3l
+we2g3o
+we2g3r
+we4ka
+we4kr
+wel3ed
+wel3ee
+we2lo
+wel3om
+we3loo
+wel3s4
+we4mab
+we2mi
+we4mo
+we2n
+we5naar.
+we3ne
+we4nee
+we4nem
+wen4kas
+wen3o
+wer4f5
+wer4gr
+w4erk
+wer4k3l
+wer4k3o
+wer4kr
+wer4k3u
+wer4k3w
+wer4p3a
+wer4p5l
+4werw
+we2s
+wes3p
+wes5tel
+w4et
+5wet.
+we2th
+wezens5
+2w1f
+w1g
+w1h
+wiel5a
+3wijd
+wijs3
+wi2k
+wi5ki
+3wil
+wil4s
+1win
+win4d3r
+3wink
+win4kl
+win2s
+winst5a
+win4ta
+wi4sec
+5wiss
+1wi2t
+wi3te
+wit3h
+wit3j
+wit3o
+wit3r
+w1j
+2w1k
+2w1l
+w1m
+4wn
+wn3ac
+w3nes
+w5ni
+w4oe
+woe3i2
+woel5a
+wo2l
+wol2f
+wolf4s3
+woorden5
+woor4d5r
+worm3a
+4wot
+w1p
+wper4
+w2r
+wri4
+wrijf5
+2w1s
+w2sa
+ws4k
+w2sle
+2w1t
+w1v
+wva2
+4w1w
+wwa4v
+w1z
+xan3
+x1b
+x1c
+xchan4
+xel4
+xf4
+x1h
+xis4
+x1k
+xop4
+x1p
+x5s2
+x1t
+x4tak
+xtie4
+xtraat4
+xtu4r
+xu1
+x3v
+x3w
+xys4
+y1a
+y5ae
+y4ah
+yan4c
+y1b
+yber4t
+y1c
+ycho3
+y1d
+y1e
+y1f
+yfu4
+y1g
+y3gl
+ygu2
+y3h
+y1i
+y1j
+y2k5n
+yl3al
+y4les
+y4let
+yli4n
+y1lo
+ylo3s
+ymfe5
+ymfes4
+ym4fl
+ymor4
+ym4p5j
+y5nec
+y3no
+yn3t
+5yogh
+yon4n
+y1p
+y4pec
+y4ped
+y4pek
+y2pem
+y4pev
+y4pew
+ypo5
+yp5s
+y1r
+yr4e
+y1sa
+y5s4c
+ys4h
+ysha4
+y2s3l
+y1so
+ys5s
+ys3t
+ys4ty
+y1t2
+ytop4
+y3v
+yvet4
+yvon4
+y3w
+ywrit5
+y1z
+3za
+zaf4
+za5i
+za2k3a
+za2k5r
+za2ku
+zalm5a
+zan4da
+zand5ac
+zan4d5r
+zang3s
+zas4
+2zb
+4zc
+4zd
+zee3g
+zee3k
+zee3le
+zee3ro
+zee3s4
+zeg4s5l
+zelf1
+zen4da
+zen5k
+ze2no
+ze4raa
+ze3roo
+zer4sl
+zer4sp
+ze2s
+ze3sc
+zes3e
+ze3sl
+ze3str
+ze4ta
+ze5tak
+ze2th
+ze2ti
+ze4tj
+ze4tr
+zeve2
+zeven3
+2zg
+5zi
+ziek3l
+zie4kr
+zie4kw
+ziel4s3
+zie5t
+zi4ga
+zij4na
+zijn4s
+zij5s
+zings3
+zin4k5l
+zin4si
+zin4sl
+zin4sm
+zi4os
+zi2t
+2zk
+z2l
+2z5ly
+2zm
+zn4
+zo5dr
+zoek5u
+zoet3j
+zoe4tr
+zo3f
+zon3da
+zo4nek
+zon2s
+zon5t
+zo2t
+2zp
+2zs
+4zt
+zus3
+4zv
+z2w
+2z1z
+}
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-nlx.pat b/tex/context/base/lang-nlx.pat index 7b7780c1b..5e8b46062 100644 --- a/tex/context/base/lang-nlx.pat +++ b/tex/context/base/lang-nlx.pat @@ -1,8030 +1,8031 @@ -% File: GB90.8pat -% Author: Piet Tutelaers (rcpt@urc.tue.nl) -% Version: betarelease 0.9 (May 1993) -% Purpose: 8-bit hyphenation patterns for TeX -% These patterns are generated from the `Groene boekje 1990' (GB90) with -% the following goals in mind: -% - provide 8-bit patterns -% - allow hyphenation in first two and last three letters -% - inhibit hyphenation before a `trema' -% - don't hyphenate words in a changing syllable (me-nuu.tje) -% - don't hyphenate words with different hyphenations (buur.t.je) -% -% extra symbolen ä ç è é ê ë ï î ö ü -\catcode`\ä=11\uccode`\ä=`\Ä\lccode`\ä=`\ä % "a -\catcode`\ç=11\uccode`\ç=`\Ç\lccode`\ç=`\ç % c, -\catcode`\è=11\uccode`\è=`\È\lccode`\è=`\è % `e -\catcode`\é=11\uccode`\é=`\É\lccode`\é=`\é % 'e -\catcode`\ê=11\uccode`\ê=`\Ê\lccode`\ê=`\ê % ^e -\catcode`\ë=11\uccode`\ë=`\Ë\lccode`\ë=`\ë % "e -\catcode`\ï=11\uccode`\ï=`\Ï\lccode`\ï=`\ï % "i -\catcode`\î=11\uccode`\î=`\Î\lccode`\î=`\î % "i -\catcode`\ä=11\uccode`\ä=`\Ä\lccode`\ä=`\ä % "a -\catcode`\ñ=11\uccode`\ñ=`\Ñ\lccode`\ñ=`\ñ % ~n -\catcode`\ö=11\uccode`\ö=`\Ö\lccode`\ö=`\ö % "o -\catcode`\ü=11\uccode`\ü=`\Ü\lccode`\ü=`\ü % "u -\catcode`\'=12\lccode`\'=`\' -% -\patterns{ -.aan5 -.aarts5 -.a4b5l -.acht5end -.a3da -.a2f3 -.af5ra -.af5s -.agent5j -.a4l3ee -.a4l3ev -.alk4 -.al5ko -.al5m -.a2lo -.al3om -.ame3r -.am5p -.a3nac -.an5d4 -.a4nes -.ang2 -.a4nis -.an5th -.a5o -.a1p2a -.a3pl -.a1pr -.as3 -.a4s5l -.a5sti -.a4su -.ave5n -.b4 -.be3la -.be5l4u -.be5ra -.bijs4 -.bi4l -.bli4 -.boot5j -.box3 -.co5kes. -.corre5s -.d4 -.dan5ste. -.de2k -.dek3l -.des5p -.deu4r -.dis5 -.du4w -.ede4 -.edel3 -.ee4s -.eest3 -.eet3 -.ei3l -.e2kl -.e3kw -.en5th -.e3p4 -.er3a -.er2f -.e4r3in -.ert4 -.erts3 -.e4s3 -.es5c -.es5m -.e5so -.es5pr -.e3th -.eus5 -.exi5 -.f4 -.fes1 -.g4 -.gaat5 -.ge5la -.ge5le -.ge3lo -.ge5n4a -.ge5ne -.ge5no -.ge5ra -.ge5re -.ge5ro -.ge3s -.ge1t -.goes5 -.go4m -.goot5 -.hemi5 -.ho4lo -.i2 -.i3d -.ij4sp -.im5p -.in3 -.in5d -.in5g4 -.in5ktv -.in5kw -.ins4 -.int4 -.in5ta -.i3re -.is3c -.is5m -.i3t -.j2 -.jaar5 -.k4 -.kee4 -.ke3ra -.ker4k5l -.kerk5u -.koot5 -.kop5l -.kun2 -.l4 -.le4b5 -.le4g3o -.le4g3r -.lemmet5j -.le2s -.lof5 -.loot5 -.lo4s3 -.lui5tj -.m4 -.ma4len -.mar5che. -.me5no -.merk5l -.mijn5i -.moot5 -.mo4s -.n4 -.naat5 -.na5s -.ne4t3j -.noot5j -.oa5 -.oe4r -.oes5 -.ol3f -.o2m1 -.o2n -.on3a -.on5d -.onde4 -.o4n1e -.on5g -.on1o -.ons4 -.on5sp -.on4t3 -.on5to -.oor5t -.o5pak -.o4p3ar -.o4p3at -.o4pet -.o4p5l -.o2p3o -.o4p5r -.op1s -.o3ro -.or1t -.o4s3 -.p4 -.pee5tj -.pe4k3l -.per5spec -.pij5t -.poort5j -.po5te -.r4 -.raads5le -.raat5 -.rai2 -.ran4d -.rand5a -.rens4 -.re5t -.rie2 -.riet3 -.rijk5a -.ring5s4 -.roe5t4j -.s4 -.sa4p3 -.see3 -.seig5 -.se3m -.servi5c -.se4s -.ses5t -.set3 -.side3 -.si4s -.slee5tj -.smids5e. -.spoor5tj -.st4 -.t4 -.taart5j -.te2a -.te4f -.tek2 -.te5na -.tent5j -.te4ra -.ter4p5a -.te2s -.ti2n -.tri5s -.ui2 -.uit1 -.u3ra -.u3ro -.u3s -.vaat5j -.ve4r1 -.vie2 -.vrij3 -.w4 -.wee4 -.weet3 -.we4l -.wel3a -.wel5in -.wer2 -.wet4s -.win4s -.y2 -.zet3a -.zet3j -a4a4 -aad1a -aad3o -aad3r -aaf3a -4aag -aag3a -aag5e -aag3r -aak3e -aak3r -aal5a -aal1e -4aal5k -aal1o -aal5ste -aam1a -aam3o -aam5p -aan1 -3aando -3aandu -aan5g -3aanj -aan5k4 -3aann -3aans4l -aan5sp -3aanv -aap3i -aap3o -aar3a -aard5as -aar4du -aar3e -aar3i -aar5k -4aarn -aar1o -aars5te. -4aart -aar4ton -aar3u -aas5c -aas5e -aas5m -4aast -aat3a -aat5e -aat3h -aat4j -aat3o -aat1r -a2b -abak4s5 -a5be -abet3j -ab3ijz -ab5lu -3abon -a4b3ru -4ac. -4ace -ace3a -2ach. -a3cha -4a1che -4a3chi -a1cho -a1chr -2achs -a1chu -4ack -2acl -ac5le -2aco -2acr -4acs -4acu -ad2a -ad5aa -ad3ac -ad3ad -ad3ak -ad5al -3adap -ada2r3 -ade5le -ades4 -ad3ete -2adh -ad4i -a4dj -3adju -ad3oks -3adop -ad3ov -ad3ro -ad5sla -ads5tra -ad3ui -ad3un -ad1w -4ady -aege4 -ae3k4 -a3el -aes3 -ae3u -af3aa -a3f4as -af5de -af5dw -afee4 -afe4la -af3ex -3afgi -4afi -af3l -a2foe -afon4d -af3r -af5so -af5sp -aft4a -3aftr -a2f3u -ag3ad -ag3ap -agee5t -agen5a -agen4tj -ager4s -a4g3ind -a4g3ins -ag1l -ag3of -ag3ord -ag4re -ag5reg -ag5rei -ag5ret -ag3roo -ag3s2a -ag3sl -ag4sle -ag4sli -ag3spa -ag1s4t -ag3ui -ag3ur -a2g3uu -a1h -a5hi -ai5b -ai1e -ai4es -a1ij -ai5k -ai4o. -ai3s4 -ai5sc -ai4s5l -aissi5è -ai5sti -ai3tj -4aï -aïn4 -aïns5 -a1j -ak3ag -ak3am -ak3ap -a2k3ar -a3ke -ak3een -ak3etu -a4k3ez -4akh -ak3ink -3akko -a2k3l -ak3n -ak4ni -a3kof -ak3ond -ak5opl -a3kos -ak3ri -ak3ru -4aks -aks5m -ak5spe -a2k3u -ak1w -a1la -al4aa -a4l3ach -ala3d -al3afs -a3l4ag -4ald -a1le -al3eff -ales4t -ale5ste -alfs5p -al2gl -alk5ei -al4kla -alk5sa -alm4a -al4m3ac -a1lo -alo2n -alo3s -al3ou -a3loy -al3sa -als4ag -al4s5m -al2sn -als3oo -al4spr -al4stem -al5ster -al4sto -altaar5 -al3tha -4a1lu -al3uit -alus3 -4am. -a2m3ac -am3adr -1ambt -a3me -ament4 -ame5rad -ame4u -ameus5te -4amm -a5moe -a4m3ol -am3ove -am5pe -3ampè -am4pl -4ams -am2so -am4s5po -a2m3ui -a1na -a3nad -a3nap -an3arc -an3av -an4dad -an4d3ed -an4dom -an4doo -an2dr -and5rad -an5dri -an4dro -and5roo -and5sle -ands5taal -aneëi4 -a3nen -an3est -ane3us -ang5sn -angs4t -a3ni -ani4a. -aniet3 -anij4 -an3ion -a4n3isl -an3iso -4anj -4ank. -an4kaa -4anken -an2kr -ank3ri -a1no -an3or -ano3s -an2sa -an2sm -an2so -an3soo -ans3or -an4sp -an4tac -5antenn -an3th -an5to -a1nu -an3ur -an3uu -a3o -a4o. -a4o5b -a4os -aos3t -a4ou -a4oz -aoze3 -4ap. -4a3pa -ap1ac -a5pap -a5par -a4pas -ap3as. -ap3ass -ap3eks -ape5l4e -a4pet -ap5eten -a1pi -apijt5j -ap3ijz -ap1j -ap4l -ap5laa -ap5lad -ap5lak -ap5len -a5plu -a1po -ap3og -apo5sta -1appa -4appo -ap3ra -ap5rac -ap3re -a5p4ris -ap2s3l -a1pu -4ar. -a3ra -ar3amn -a4r3app -ara3s4 -ara5st -5arctis. -4ard -ar2da -ard3ac -ard3ak -ar5de -ar4d3op -ar2d1r -ar4d5re -ard3w -a1r4e -are3st -are4t -ar5eve -ar3gh -ar2gl -ar3go -a1ri -arie4t -arij3s -ar4k3aa -ar4kla -ar2m3u -4a1ro -a3rok -ar3oli -4ar2s -ar5sch -ar5se -ars3l -ar5slie -ar3sp -ar5spe -ar4spi -ar4spr -ars5tal -ar4stek -ars3tr -ars5tra -ar4t3ak -art5ank -ar4tap -ar3tar -4arte -4ar4tj -4arto -art5oge -art5ond -art5oog -ar4t3or -ar2t3r -ar3tre -a3ru -4arw -a1ry -a2s -4asa -as3aa -as3af -as3ak -as3ap -a3sau -as3av -as4cr -as4e -a4s3ec -a4s3e3t -a5sex -a4s5h -a4sin -asi4s -as5ki -as5ku -as3l -a5s4laa -a4sm -as5me -as5mi -as5mo -as4n -as5na -as3ob -as3on -as3oo -as3os -as3p -as5pec -as5per -a4st -as3ta -as5ta. -as5taal -a5stat -as3te -as5te. -as5tee -a5steni -as5ter -as4th -as5tie -as3to -ast5rem -ast3ri -a5stu -a3su -a3sy -a1ta -at1ac -at3ade -at3af. -a4t5am -at3ank -ata5s -atent5r -ate4r5ad -ate4r5ec -a1th -a5thali -at3hu -atië5r -a2t3j -at5ja -at5jo -a1to -at3oog -a1tr -at1re -at3rib -at5ru -at5sen -at2sl -ats3le -ats3lo -ats5m -at4sna -at4sp -ats5pa -at5spi -at5spl -at5spo -at3sta -at4sti -ats5tol -at4t3u -a1tu -a2t3ui -at5w -2au -au5b -au3dr -3aug -au3ko -aun3t -aure3u -aus3t -au3sto -au3t2 -auter5i -3auto -auts5 -au4wij -ava3s -aver3a -ave3re -ave3r4u -4avi -a4v5l -4avot -a1w -aze3s -3b -4b. -baar5tj -babe4 -ba2di -ba3gh -5bak -bak4sp -bal4ka -bal4t -ba3n2a -ban4kl -ban4kn -ban4kr -bank3w -bar3t -bart3j -ba3s4a -bassi4 -4bb -bba2t -bbe4l5ee -bbe4n -bben3a -bby5 -4bc -4b1d -5be. -5bed -be3d4a -bed2w -be5dwi -be5dwo -beet3 -be3fl -5be3g -bei3l -bei4tj -5bej -be5kak -bek4l -5bel -be4lex -be5l4i -be3l4o -be5m -5ben -be3ne -be3n4i -5ber -be1ra -ber4g5af -ber4gl -ber4gr -be1ro -be4ron -ber4ov -be3ru -5be1s4 -bes5ac -be2sj -bes5te. -bes5tig -5bet -be1tw -b3h -b2i -bi5bl -bid3 -bi2du -bie4t3j -bij5d -bij3k -bij1p -bij3s -bijs5ter -bij5tr -bi4k -bi5la -bin4dr -bin4t3j -bir3 -bi5sa -bis5m -bi1tr -4b1j -4bk -b4l -blad5ij -b5lap -b5leg -ble2s3 -b5lid -5blie -5blim -5blo -bloot5j -4bm -4b3n -5bo. -5boe -boe4g3a -boe4ka -boek5s -boe3st -bo3fl -5bog -5boi -5boï -5bo2k -bokje5 -5bol -bo2m3a -bo2m3o -bo3na -bonds3 -bont3j -bo3nu -5bool -boon5 -bor4sta -bor4st5r -5bos3 -bo3sko -bos5p -bo2su -5bot -bot5j -bot5sw -bo2tu -bou5ta -bouw3s -5box -br4 -braad5s -brei3s -5bri -bri4l -bro4n -bron3o -4b1s4 -b5sc -bsi3s4 -b2s5la -b2s5m -bsou4 -bs5s -4bt2 -bt4s5 -5bu -bune5t -bu5ri -bus3a -buur4tj -4b3w -5by -bys4 -4bz -4c. -3ca -caat5j -ca1ch -ca3g2 -came3r -ca3na -cant4 -ca5ou -ca3pr -cas3 -ca5se -ca5si -cas1t -ca3t -cau3 -c5c -3ce -5ced -cee4 -5ceel -5cel -ce3na -cen5s4 -ce3ra -ce3ro -5ces -ce3s4a -ce2sn -ce3s4t -ces4u -ce3ta -ce4t3j -cet3o -1cé -4ch. -3chao -3chec -3chef -5chef. -5chefs -4cheor -2chep -3cheq -che5rin -che3us -1ché -4chn -chop4s -2chp -4cht -4chw -1chy -3ci -cier4s5 -ci1eu -5cil -ci5le -ci3ne -ci5nee -cis5m -ci3t -ci5ta -c4k3l -c2k3n -c4k3r -c2ku -3c4l -cli3e -c3n -cno4 -3co -co2at -co2k4 -co3ka -co3kr -co3la -5com -con3g -co3no -con5t4 -4coo -co3p4 -5copa -corp2 -cor3s -co3ru -co3sti -co3th -4cout -c3p -1cr2 -3cre -3cris -croo3 -crus5 -csar5 -c3ste -4c1t -ct3afd -c2t3h -c2t3j -c3t4o -c4t5ond -c5tor4 -c5tr -ct3sl -c2tw -cty5 -3cu -cu5b -cus5t -c3w -3cy3 -1ç -4d. -1da -5da. -3daag -d4aal -d3aanw -daar5e -2d3acc -5daden -2d3af -da3fr -3dag -da2g1a -da4g3ed -da4g3et -da4g3l -da4gor -da2gr -da2gu -3dai -4dakk -da4k5r -4d3ala -d4ale -4dalm -d2ame -dam5pl -3dan -da4n3a -d3anke -dan4kl -danoot5 -dan4sm -dans3p -dan4st -2d1ap -4d3ape -2dar -da4ra -4d3arb -dar4mo -dar3s -4dart -3das3 -3d4at -da3ta -da2tr -5dau -2db -dboot5 -dbou4w5i -2d1c -dcorre5 -2d5d2 -dde5la -dder5al -dde3s -3de -5de. -de3c -de3d -5deda -d4eden -dee2g3 -dee4r -dee3t -de3fl -d3eg. -5dega -5dege -2d3egg -de3gl -4dei -d3ei. -d3eie -d3eig -d3eis -deï4s -de3ke -4d3ekon -de4lak -4delas -del5do -del5dr -del5eek -de5ler -de4let -de4lev -del5fr -del4sp -dels5taa -del4str -4demai -4d3emm -dem4o -de3n4ac -den3ep3 -4d3engt -de2no -den3oo -den5sm -dent5jes -5denvl -de3rab -de4rad -de3rak -de3ram -de3ran -de3r4ap -de3ras -de4ras. -5derb -der5ede -der5eed -de4r3ei -de4rem -de4r3ep -derep5e -de4ret -de5rij -de4r3im -der3og -der3on -5ders -der4s5om -4d3erts -de5se -de3sh -de4si -de2sn -de2so -de4sp -des3po -de5spr -de3sta -de3ste -de5stic -de3sto -de3t4 -4d3euro -de3us. -de3uss -deu4tj -4dexa -4dexp -3dè -2d1f -2d1g4 -d3ga -d3gi -2d1h -d3he -dheer4 -3dhi. -dhis5m -1di -dia3s4 -die4tj -di1eu -3dig -di2ga -dij4kr -2d3ijz -di2k3o -di4k3w -di5l4e -di3na -3ding. -d5ingel -d5inh -d5inr -4dins -4d3inw -2d3inz -dip4 -di4s -di5se -dis5m -dit3j -2d1j -3dji -2d1k -2d3l -2d1m -2d5n -1do -5d4o. -do5bo -3doe -4doef -doet3 -5doi -2doks -5dole -3d4om -d5oml -do2m3o -dom4s -do3no -2d3on4t -dont3e -donyx3 -door5tj -4d3opb -2d3opl -4dopv -d3opz -2d3org -dors5m -dot5j -2dov -2d3p -dpren4 -1dr2 -d3raap -3drac -d3rad. -4d3rand -4drap -d1rec -d3red -3d4ree -5dreef -5d4res -d4rev -3dreve -d3rich -5drif -dri3ga -d3rijd -d3rijk -d3rijm -d3rijs -5drijv -d4rin -5dris -d3rit -d4roe -4d5roei -d5roer -3drog -2d3rok -4drol -3d4ron -d5rond -4d3rook -4d3roz -drug4s -d3ruit -5druk -4d3rus -2ds -ds1a -dsa4d3 -d4s3ed -d4s3ee -ds3h -dsi4g -dsig5a -ds3il -ds3is -ds3j -ds4jo -d4sl -d5slag -ds4lan -ds3li -ds4lim -ds3lu -ds5mal -d3smee -ds5mo -ds3na -ds3neu -ds3noo -ds3on -ds3op -ds3or -d1sp -d5spak -d4spal -ds5par -d3s4pel -d4s3pet -d4spon -d5s4pro -ds4t -d1sta -d4s5tab -d3star -d3ste -d5ste. -d4stek -d5sten -ds5th -d3sti -d1sto -ds5trem -d2su -ds3ur -ds3uu -d3sy -2dt -d1ta -dtaart5j -d1to -d1tr -d3tu -1du -du3e -2d3uil -dui4t -5duite -d3uitg -du3o -dus5 -dut3j -2dv -dvee3 -dve5na -2dw -d3wac -3d2wei -d3wek -5dwel -d3wez -d3wig -d1wil -4d1wo -3dy3 -dys3e -dy5st -2dz -e1a -eaan5 -e5ac -ea3da -eagent5j -e2ak -e3akt -e5alf -eal3s4 -e3amb -eam5p -eang3 -e3antw -e3a5o -e5ap -e5ard -eate4 -eb3ac -e5br -3ecd -e1cha -e1che -e5chen -ech3es -e1chi -e3cho -echts5o -e3chu -e4c5le -ecorre5 -3ecz -e1d -e3d4ac -e3d4am -edans5te -e5d4as -edek4l -ede5rog -ede5spe -edie5tj -4e3do -edoet4 -edoe5tj -ed3opv -e4d3ov -e3dr -ed3rod -ed3rol -ed4so -ed5sp -ed1st -e4dw -e5dwan -ee3a -ee2d3a -ee5de -ee5do -eed3w -ee3ee -ee2f -eef3r -eeg1l -eeg3ou -ee5in -ee2k -ee3ka -ee5kaa -eek3ak -eek5all -eek1e -ee3ki -ee3kl -eek3lo -ee3kr -eek3ro -eek3ur -eek3uu -eek3w -ee2l -eel1a -eel4ee -eel3ei -eel5k -eel3og -ee3loo -ee3lop -eel5so -eel4su -ee3lu -eel3ur -eel3uu -4eem -ee5mo -ee2n -een3aa -een3ad -een3ar -een5dr -een3e -een5g4 -een5k -eep3an -ee5pe -eep3lo -eep3ru -eep4sc -eep4st -ee2r -eer3aa -eer3al -ee3ram -ee3ran -ee3re -ee4r3ee -ee5reg -ee4r3i4 -eer5k -eer2o -eer3og -eer5oom -ee3rov -eers5ag -eer3sm -ee3ru -ee2s -ee3sj -ees3lo -ee3smu -ee3sn -ee3soo -ee3sp -ees3po -ees5tek -ee3sto -ees3u -ee2t -ee3tal -eet3h -eet3og -eet3oo -eet5or -ee3tr -eet3ra -4eë -eë4ta -e3fas -ef3az -e3fe -ef3ei -ef3ij -ef3int -e3flu -e1fr -ef4ra -ef5raa -e3fran -ef2s -ef3sm -4ega -eg3all -egas2 -eg3as. -ege4las -egel5ei. -egel5ov -ege4raa -eger5on -e4g3erv -e3gi -eg3ijz -egiste4 -eg3lui -3ego. -eg3ong -e2g3os -eg3s4 -eg5sn -e4g3ur -e4g3uu -e5h -ei5b -eids5e. -eids5m -ei1e -eie3s -ei3gl -e1ij -ei5kl -ei3kn -ei5kr -eik3s -ei3la -ei2lo -e4in -ei3n4ac -ein4d5oo -ein4dr -ein5k -ein5sl -ei4s3a -eis5a. -ei3sh -ei3sla -ei3s4lo -ei4so -ei4s4p -ei5spr -ei3s4ta -eis5te. -ei5s4tel -4eit -ei5te -ei3tj -ei4too -eit4s -eive4 -4eiz -4eï -e1j4 -ek3aan -ekaart5j -ek5af. -ek3al. -ek3ang -e5kaz -eker4s -ek5eter -e4kez -ek3eze -ek5loos -ek3net -e5kni -e3ko -ekoes5 -ek3oss -ek3rol -e5kru -ek3sa -ek3ske -eks5m -ek3sn -ek3sp -ek4stel -e1kw -e1la -el1ac -e2l3af -el3akk -el3al -el3art -e3las -el3as. -e2l3au -e3laz -el5azi -el4dri -e3le -e5le. -e4l3eeu -el3eff -el5eier -e5len -el4er -e4l3ert -el3eta -el1fl -el4fr -elf5sp -e3li -e5lig -e4l3ind -el5inkt -el3ins -eli3pl -3elix -el4kon -el3kr -elk3sl -el4k3ur -e1lo -e3lob -e5loep -el3oes5 -e2l3ol -el3oms -el5ond -el3ont -el3oog -e5loos -el3opg -el3oph -el3ops -el3opv -e2lor -el3ord -el5ore -el3ove -e5loz -el3smi -el3sta -el3su -el5tje. -e1lu -el3uit -em4a -em5aar -em3ac -em5afs -3emai -e5man -4emb -e3me -eme4las -eme4tj -emf2 -emie4tj -em3ins -em4op -em5opn -em3org -em3ov -em5po -em2sl -em1st -e1na -en3aap -e4n3aas -e2n3ab -en1ac -en3ak -e2n3al -e4nante -en3ap -e5nari -e2n4as -en5asi -en1av -e2n3az -enci4 -end3ac -ender5as -5enderti -en5dro -end5sl -en4dur -e5ne. -en3ech -e3nee -en3eed -enee5t -en3eg. -en3egg -en3ei -en3eko -en3ema -e5nen. -e4n3ent -e2nep -en3epo -en3erf -e5nes -e5net. -en3ete -ene4t3j -e5nett -engs4 -enier4t -enin5gr -eni4s -enk4l -en4kre -enk5tr -en5kwe -3enneg -e1no -e4n5oc -en3of -en3oli -enoot5 -e4n1op -en5ops -en3ord -eno5s4 -e3not -en3ov -en5sch -en3s4fe -ens3le -en4sli -en4smi -en4sna -en5spe -ens5pot -en4stij -enst5ijv -ens3uu -en4t4ac -en3tei -ente5st -en1t2h -en5tl -ent4r -ent5rol -en5tru -en3tw -e1nu -en3ui -en3ur -5enveer -3envij -3enzes -3enzev -e1o -e3oli -e3olo -e5om -eo3p4r -eo5ro -eo5t -e1pa -ep3ac -ep3app -ep3asp -ep5een -e1pi -3epid -epiet3 -ep3ijs -ep3ijz -epis2 -ep1j -e1pl -ep3lod -ep3lus -e1po -e4p3og -ep3oog -ep3ork -e1pr -e3pra -ep2s -eps3j -eps3l -ep4sta -eps5taa -eps5tal -e1pu -ep3uit -e3ra. -e1raa -er5aalm -er3aan -e4raap. -e4r1ac -e5raco -e3rad -er3af. -er3afv -e3rag -e1rai -e4r3all -er3ama -er3ana -e3ranc -e5rapi -er3app -e3rare -e1rat -er3atr -e3rau -e4r1av -er3azi -er5c -er3d2a -er5de -er5di -erd4o -er3d4w -e1re -e3re. -e3rec -er5editi -er5eers -er3eet -er3eff -er3eg. -er3egd -er3egg -er3egt -er3eie -er3eig -er3eil -er5eila -er5eind -er3ekw -e3rel2 -e4r5emm -e3rend -ere4ne -eren5eg -er5enen. -eren5ta -er3eq -e3res. -er3esk -e3ress -erest5r -ere4t3j -e4r3ets -e2r3ex -erg2l -e3ri -e5rie -e5rif -e5rig -e5rij. -e5rije -er3ijl -e4rijz -e5rik -erim3a -er5inkt -er3ins -er3int -e5rio -e5ris -ermij5ni -e3ro. -e3rob -er3oc -e1rod -e1roe -eroe3t4 -er5oev -er3of -e3rok -e3rol -er3oli -er3om -er1on -er3oog -e3rook -e3roos -er1op -e2r1or -e3ros -e5rose -e3rot -er1ov -e3roz -e3rö -errie5tj -5errillat -er5tan -er5te -ert4h -er3the -er5to -erts5l -er5t4u -er1tw -e1ru -erug1 -er1ui -erui5tj -e2r3ur -er3uu -3erwt -e3ry -e2sac -es3ag -es3al -es3ar -es3av -es4ch -4ese -es5emb -e4s3et -es3ex -es5hu -e5s4id -es3il -esis4 -e3sjo -es5ken -e3sla -es3lak -es3lam -e3sle -es3lij -e3slu -e1sm -es3noo -e1so -es3ore -e1sp -e4spen -e3spl -es4poo -e5s4por -es4pr -e4sprie -espuit5j -essi4s -es4sn -e3staa -e3stap -es3tat -es3te -e4ste. -es5teer -est5ei. -es4tek -es5teli -es5temo -e4s5ten. -e5sterre -e4s5tes -e3s4tic -e4stig -e3stru -es3uu -e1sy -e1ta -e3ta. -et3aan -et3ac -et3ad -e3taf -3etag -e3tak -e3tan -et3art -e4t3au -e2tav -e3te -et3ein -4etel -et5emb -et3emm -et3emu -e5t4en -etens5u -eten5tj -ete3r4a -eter5sm -ete3s4t -et3hu -et3ins -e5tja -e1to -e5toc -et5oli -e3ton -e3top -et4or -e1tr -et5rec -et4rek -et3rim -e3tru -et3rui -et3sl -et4sla -ets5lap -et2s3n -ets3o -et4sp -et5spi -ets3pr -et4sta -ets5tan -et4stek -et5s4u -e1tu -et1we -eu5b -eu3c -eu5do -eu1e -eug4dr -eu2ka -eu4ler -eum3aa -eu2na -eun3tj -eu4rij -eu1ro -euro3p -eus4t -eu3ste -eu3tj -eu5tr -2euw -eu4w3e. -eu2w3i -eve5n4aa -3evenr -e1w -e5wa -e5wh -e5wi -ew3sk -1exam -3exeg -ex3in -1exp -ey3 -e3ya -ey5sp -4eza -4ezen -ezen4s -eze5tj -é3a -é3d -édee4 -é3h -é3r -éren4 -é3t -étee4 -è1 -ê1 -4ë -ë3c -ë1d -ëde3s -ëe4 -ëen3e -ë3h -ëi1e -ë3k -ë1l -ë3na -ënt4 -ënt5h -ën3tw -ë3p -ë1ra -ë1re -ë3ri -ë1ro -ëro3s -ë2s5 -ë1t -ëven4 -ëve5na -ë4venr -ëxis5 -2f. -1fa -f3aanb -f3aap -f4aat -2fac -face2 -f1ach -f4act -3facu -4fad -f3ang -fant2 -fan4t3j -fants3 -2f3ap -f3as. -fa5st -3fau -2fb -f1c -2f1d -fd4an -fdan5ste -fde5l -fde5sp -fd4i -f2d3in -fd5ins -fd3of -f3dra -fd3rek -fd3rol -f3dru -f3dw -fd2wo -1fe -fede3 -f3een -5fees -feest5r -fee3tj -fel5aan -fe5laar -fel5fr -5fenda -fe3ran -fe4r3et -fe3ro -fes3 -fe4t3j -2fex -3fé -1fè -4f1f -f5fe -ffs4 -ff3sh -f1g2 -fge3la -fge5n -fger4 -4f3h -1fi -3fib -fi1ch -fi4e -5fig -2f3ijz -fil2m -4fint -5fir -3fi4s -fis5m -f1j -2f1k -4f3laa -f1laf -1flau -f3lene -f3ler. -fle2t -flet3j -f3lez -2flie -4flij -f4lip -f2lit -f3lok -fluit5j -2f1m -f1n -1fo -foe5d -2f3of -f3og -3fok -2f3oms -f4ona -fonds5l -fo3no -fon3t -f1oog -f3oom -2fo2p3 -3f4or -fo5re -fort3j -fo3ru -fo3sk -5fot -2f3oud -f3ov -fox3e -2f5p4 -fr2 -f4ras -f3rek -fre4t3 -frie4t -friet5j -f4rik -f4rod -2f1s -fs3an -f3sc -f5sch -f4s3cr -fsho4 -f3sl -f4slap -f4s3led -fsleet5j -fs5mu -f3sn -f4so -fs3oe -fsoes5 -fs3on -f3s4p -f5spe -fs4t -f3sta -fst3as -f3ste -fste4m3 -f3sti -f3sto -fst3oc -f5stok -f4ston -f3stu -4ft -f1ta -ft3ac -f5tand -ft3art -ft3h -f1to -f1tr -f1tu -f5tui -f3tw -1fu -fu4ma -3f4un -fu3ro -2fv -2f1w -3fy5 -2fz -4g. -1ga -3ga. -g4aal -5gaar. -gaar5tj -g4aat -2g1ac -4g3afw -2g3ah -ga3la -ga4l3ap -ga5lo -g3alt -3gam -3gan -gan5d -gan4s3t -gans5te -gans5tr -ganti4 -g4ape -3gar. -g4are -3gars -4g3art -gar5tj -ga4s -ga5sko -ga5sla. -ga3sli -ga5slo -gas3o -gas3tr -gast5rol -3gat -3gaw -2gb -2g1c -2g1d -g5de -g4d3im -1ge -5ge. -ge3ad -ge3ak -ge5al -ge4ari -ge5aro -ge3au -4g3eb. -ge1c -ge3d2 -ge5da -ge5de -ge5dr -ge5dw -gee4 -gee5si -geest5r -geet3a -ge3f4 -4g3eff -ge5g4 -gege4s -g3eik -geit3j -ge5ka -ge5ke -ge5ki -ge5kl -gek4n -ge3kw -g4el -gel5as. -gel5ass -gel4d3a -gel5eg. -gel5egg -ge4leie -gel4o -gel5oor -gel3sl -ge3ma -ge3m4o -gems3 -3gen -5gen. -ge3n4az -ge3ne -ge4n3ed -gen5end -gen4er -4g3engt -gen5k -4gensm -gen4tr -gent5ra -ge2ol -ge5p4 -3ger -ge1ra -ger5aap. -ger4ap -ger5ape -ger5as. -ger4d3r -ge3r4e -ge5ree -ge5reg -ge5rek -ge4r5eng -ge5ri -ge1ro -ger4of -ger4on -ger5sc -ger4sp -4g3erts -ge3r2u -ge1s4 -ge5sa -ge5sc -ge5se -ge3sh -2gesk -ge5sl -ge3sn -ge5so -ge5spend -ges5te. -ge5sto -ge5sw -3get -ge5t4a -gete4s -ge5t4i -ge3tj -get4r -ge3ts -ge5t2w -ge3ui -3gev -ge3x -1gé -3gè -2g1f -2g3g -2g1h -g4her -1g2i -gi4ee -gie4r3a -giet5s -gi1eu -gi2f -2gij -4gijz -gis5m -2g1j -2g1k -g1lam -1g4la4s5 -g3lat -3g4laz -3g4le. -glee5t -g3len -2g3lep -g3les -3g2lic -g3lice -3g4lië -g2lim -3gloe -g3lof -3g4lofo -3glom -4g3lon -g3lop -g2los -g4lot -3g2ly -2g1m -gmaat5j -2g1n -g3na -gne4t3j -gnie4t5j -g2nos -1go -go2a -go5b -go2do -god4s3 -gods5t -2goef -2gof -4g3oh -4g3oli -go2ma -g3oml -2gong -4g1ont -2g3oor -2g3op -g5ops -4gore -gor2s -go3sk -gos3t -gou4d -goud5ee -2g3ov -2g3p -1gr2 -3gra -g4rad. -5graf -gra2m -g3ramp -gras5 -5grav -2g3red -gree4 -greet3 -2grem -g4ren -gren4s -gre4s3 -3greu -grie4t5j -g5rijd -g5rijk -g5rijm -g5ring -2g3rit -2g3riv -5gron -groot5j -g3rou -g3roz -2g3rug -g3ruim -g3rup -2gs -gs1a -g5sal -g4s3ar -g3sc -gs4ch -g5scha -g2sci -g4sco -g4s3cr -g4s3ed -g4s3ei -g4s3ek -gseksa4 -g4si -gs3ij -gs3in -gs3j -gs4ke. -gs4ken. -g2s4l -g3sla -g5sla. -g5slang -gs5las -gs5lec -gs5leg -gs5let -gs5leu -gs5lic -gs5lie -g3slo -g5sloe -gs5lok -g5slot -g4sma -g4sn -gs3na -gs3ne -g5s4no -g2s1o -gs3p -gs4pa -gs5pak -gs5par -g3s4pe -g5spee -g5spel -g5spet -g3s4pi -gs1pl -g3s4poo -g3s4por -g3sta -gs5taal -g4staan -gs3tab -g4st3ap -g3ste -g5stee -gs3tek -g5stel -gs4ten -gs5tend -g5ster. -gs5terr -g5sters -gs3th -gs4ti -g3stig -gs5tij -g5stof -g5stok -g4ston -g5stond -gst5ons -gs3tro -g3stu -g2s3u -gs5w -2gt -g1ta -g2t3ap -gtes4 -gte3st -g1to -g1tr -g1tu -1gu -3gu. -gu5a -gu4e -2guit -gu4lu -g3uri -gus3 -2gv -2g5w -1gy -2gz -2h. -haar4s -haar5tj -haf4t3u -ha2kr -hal2f -4halie -han5ga -han4sl -ha5o -hap5r -hap4sp -har4t3a -hart3j -har4t3o -hart5sl -ha2t3r -2hb -h3c -2hd -h2e -4hea -3hech -4hee. -hee4k3r -hee4lo -heeps5c -hee3tj -he4f -hef4fl -hei4tj -hei5tr -heï4s -he2k3a -he2kl -he2k3w -hel5aard -he4l3an -he4l3ee -hel4m3a -hel4p3a -hemi3s4 -he5ne -hen4kr -he5n4o -2heo -he2p3l -he4pr -4he3ra -her4aa -he4r3ad -he4rene -he4ri -her3ij -her3in -2herm -herm5eng -he3ron -her4p5aa -her4pr -hesis5 -he2sp -2het -h3g -h3h -4hi. -hie2r3 -hie4ri -hie4t5o -hie4tr -hiet5s -hij4s -hi2k3a -hi4m3ac -him4pl -him4pr -hin4t -hint3j -his4te. -hi3tr -h3j -2hl -h3lam -h3le -hlo3 -h3loc -h3lok -h3lu -2hm -h4mi -2h3n -ho5bo -ho3ch -hoe4ker -hoe4s -hoe3t -ho4f -hof5d -hof3e -ho3g4 -ho2ka -hon5dr -hon5g -ho1no -4hoom -hoor5tj -hoor5tr -ho2po -hop5r -hor5de -ho3ro -hort3j -4ho3ru -ho3sa -ho3sf -ho3sk -2how -2h3p -hpi4 -2hr -hra4b -hri2 -hris5 -hroot5 -4hs -h3sp -2ht -h4t3a -h4t5emb -h4t3enn -h4t3en5t -h4t3env -h4t3enz -hte2r -hter3a -hter5e. -hte4r3o -h4t3es -ht5esk -h2t5ev -ht3ex -h2t1h -h4tij -h2t1j -ht3o -h3too -ht1r -ht3ru -ht4si -hts3id -hts3in -hts3le -ht4sli -hts5m -ht4sna -ht4so -ht4spe -hts5taal -ht4s5tek -ht4sti -ht3u -ht5w -huin4s -huit5j -3huiz -hul4der -4hus -hut3j -h3w -hyl3 -i3a -ia3f4 -ia3g2 -ia3k4l -ian3u -i5a5p -ia3t2h -i5av -i4b -i5ba -i5be -i5bi -i5bo -i5br -ica4p -i1cha -i1che -ichee4 -i1chi -i1cho -i3chr -i5co -idde4r5a -id4e -ider4s -id2g -i3di -idie5t -id4o -i3dok -id3oo -id5op -id3re -id3ru -id2s -ids3e. -id4si -ids3l -ids3o -ids3p -ids5pa -ids5taa -ids5tek -id4sti -ids5tor -ids5tr -id3ui -idu3w4 -id1w -ie3a -ie4d5ac -ied3w -i1ee4 -i5eer -ie3fle -ie4g3al -ie4g3an -ie4gas -ie2gr -ie4k3ap -ie3ke -ieke3s -ie4kl -iek3li -ie5klu -ie4kn -iek5ond -iek4s5n -iek4sp -ie2k3u -ie4l3ei -ie5ler -iel5f -i3enc -iend5r -ien5sp -ien4sta -ien4st5o -ie4pap -ie4plo -iep5str -ie4pui -ier3al -ie3ram -ier3as -ie4rat -ier5enta -ie1ro -ier4sl -ie4sl -ie5sla -ie5slu -ie2sm -ies5me -ie2sn -ie2so -ies3oo -ie4spi -ie4spl -ie4s3po -ie3s4ta -ie5stel -ie4taa -ie4t3ak -ie5te -ie3th -ie4t3og -ie4t3oo -ie5troe -ie3twi -i3ety -ie3ui -i1eur -i1eus -ieus5te -i1euz -ieze4l5a -i4é -i5ét -i3è -i5èm -4ië -ië4ri -2if -if3aa -if3ad -if4r -if3ra -if4tan -ift5ang -if4tar -if3ui -i2g3aa -ig5aard -i4g5av -ig3een -igen5er -ige2s -ig3esk -ig3le -ig3lo -i4gn -i5gom -ig3ond -i5g4ro -igs4 -ig3sk -ig3sl -ig5sm -ig3sp -ig3sto -i1h -i3i -4ij. -i2j5a -4ijd. -4ijdt -4ij5e -ije2n3 -4ijf -ij3i -4ijli -4ijn -ij3o -i3jou -4ijsu -i4ju -ij3ui -ik3aar -ike3s4 -i3ki -i4kl -ik4la -ik5lap -i5kli -ik3lo -ik3lu -i4k3n -i5k4ne -ik3og -i5kol -ik3ope -ik3ord -i4kr -ik4ri -ik3ro -ik3sj -iks5m -ik3s4p -ik5spa -ik4s5pi -ik1st -ik3wa -i4k1we -i3kwi -ik3win -i1la -il3aan -il3ac -i3lak -il3al -il3au -il2da -il2d3r -i3le -il3een -i4l3em -ile2t -ile3u -i4l3ez -i3li -il3ink -ilk4 -il3kr -il5kw -illu3 -i1lo -il3ond -i5loon -il3oor -il3oph -i2l3or -il3s2h -il5so -il5te -i1lu -im5alu -ima4s -imie4 -im3op -im5pa -3impo -im4pri -im3so -i1na -in3aap -i4n3aar -in1ac -in5aker -in3ape -i3nas -i5nas. -in3ass -in5dac -ind5sp -1indu -in3ede -in3edi -in3eed -in3ert -3inf -in2ga -ing3aa -ing5aal -ing3ag -ing3al -5ingeni -ing3l -in4gr -ing3re -ing3ru -ing4s -ings5e -ing5ske -ings5n -i3ni -ini4è -i4n3i4o -inis2 -ini3sh -in4kaa -in2kn -inkt3r -inne3s -4i1no -i3noc -in3og -i2non -ino3st -1inri -in5sc -in5se -in3s4l -in3smi -ins4n -in3so -in5spo -in5ste -in5swi -in4t3ap -in5te -intes3 -in5ti -in5t4r -i1nu -3inva -i4ny -i3o -io3a -io5b -ioen4s -ioes5 -i5o3f4 -i5o3g4 -i5ol -i5om -io3no -ion4s5 -io3pe -io3pr -io3ra -io3s -iot5j -io3tr -io3u -i1pa -ip3ac -ip3af -i4perw -ipe4t3j -i1pi -ip3j -i1pl -i1po -ip3og -ip3oo -ipper4s -i1pr -i4ps -ip4sle -i3pu -i3ra -i1r2e -ires4 -ire3st -i3ri -i3ro -ir2s -ir4sc -ir3sp -irt4h -i3ru -i2s -i3sa -is3aa -is3af -is3ag -i5sal -is3ap -is1ar -i5sat -is3av -i4sc -i5scha -is3cr -is3ed -i4s3ei -is3ell -is3eng -is3ete -iset3j -i3s2fe -is3hi -is3id -i4sij -is3ja -i3sji -is3l -is5lag -is4lan -is4lot -is4lui -i4sm -is5ma -is5mi -is5mo -is5mu -i4s5n -i3so -i5soe -i4soo -is4oor -is3op -is3ott -is3p -is5par -is5pas -is5pl -is3t -is1ta -ist3ap -is5tas -is5ten. -is5tes -is4th -i4sti -is1to -isto3p -i3s4tr -is5tri -i3su -i5sy -4it -i1ta -itaat5 -it1ac -itee4 -it3een -i5ten -iten5tj -i3ter -ites4 -ite3st -it1hu -it2i -i2tj -it3ja -it2je -it5jesg -i1to -it5oef -it3oog -it3red -it1ri -it1ru -it3sje -it3sle -it1sm -it1st -it5ste -i1tu -it5w -i1u -iu2m -ium3e -ive5ran -ive3re -i5w -ix3o -i3z -ize3s -ize5t -î3 -ï3a -ï1c -ï1d -ïen4 -ïe5ne -ïllu3 -ï3n3a -ïns5m -ï3nu -ï3o -ï3ro -ï5sche -ïs5m -ïs3t -ï1t -ïze3 -4j. -jaar4s -jaars5t -1jag -jagers5 -ja5mi -ja2n3o -jan4s3l -ja3pl -5jar -jart3j -5jas -j2d3aa -j4d3ee -jde4n3e -jden4s5 -jdes4 -jde5sp -j3di -j2d3o -j4dr -j5dra -jd3re -jd3ro -jd3ru -jd5s4l -jd4so -jd1st -j4d3u -jd3w -j3d4wa -5jeba -2j1ee -jeen3 -j1en -je2n3a -je3ro -je4s3 -5jesaa -5jesha -5jesho -3jeskl -3jeskn -jes5m -5jespe -je3spr -3jesr -3jess -jes5t -5jesv -5jesw -je2t3 -je3to -5jeu -5jeva -j2f1a -j2f3ei -j2f3en -j4f3ij -j4f3in -jf3l -jf4la -jf5lap -j3flat -j4f3o -jf3r -jf4sc -jf4s3l -jf2sm -jg3laa -j4g3re -jg2s3 -jg4se -jgs5l -jgs5m -jg5sn -jg4st -jg5s4te -j3h -3jic -jif5 -j3ig -jis5m -j3j -4jk -j2k3aa -jke5ro -j2kij -j2k4l -jk5lak -jk5lap -jk5las -j3kle -j3klo -jk5lu -j2kna -j2k3of -j4k3ol -j2kr -jk3raa -jk3re -jk4si -jk2sl -jks5le -jks5m -jks5n -jk3so -jks3pr -j2k3ui -jk3w -j1la -j1le -jl3ink -j1lo -j2loe -jm3af -j5m4ar -jm3op -jn1a -j4naa -j3nag -jn5ak -jn4am -j3n4an -jne3s -jn3g4 -j4n3im -jn3ink -jn1o -jn4s3am -jn2s3l -jn4sp -jn5spi -jnt4 -jn5tr -job2 -jol4e -jo5li -j3om -3j4on -jone2 -5jonge -jonge4t -joor5t -jo3ra -j4ou -joy5 -j3pa -j4p3ac -j2p3em -jpe3s4 -j3pi -j4p3ij -jp3j -j3pl -jp3lam -j3po -j4p3or -jp3re -jp3ri -j3pro -j3r -js3a -j5se -j4si -j2s4l -j3sla -js5las -j3sle -j3sme -js5mi -j2s3n -j3sni -js3o -j1sp -j4spo -js3poo -jspoort5j -j5spor -j1sta -jst5aar -js3te -j3stei -j3s4tel -j4s5tem -js5tep -j4ster -js4tij -j3sto -j4stoo -js3tou -j4stra -jst5ran -jst5s -j2su -j3taal -jt3aar -jt1ac -j3tag -j3tak -j3tan -j3te -j4t1h -jt3jes -j3to -j3tr -j4t3ra -jt4rad -jt3rot -j1tu -jt3w -1ju -juit2 -juits3 -juli3 -5jur -jus3 -juve5 -jve2n -jve3ra -jver4s -jve3t4 -j1w -jze4r5o -2k. -1ka -3ka. -k4aat -2k1ac -3kace -5kad4 -kade4t5 -4k4af. -2kafr -k3agen -k4ake -4kakt -4kalb -5kalf -kalf4s -kal4k3a -5kalv -2kamb -kamen4 -kam4pr -kan5d -2kang -5kani -5k4a3no -kan4t3j -5kap. -ka3pr -kap3s -kas4pe -kas3tr -kast5ra -kas5tro -ka4t3aa -ka4t5ale -ka4tan -kat1j -k3atl -ka4t3og -ka4too -ka5t4r -kat3s -4k3aut -2k3avo -5kay -2kb -2k1c -2k3d -1ke -4keen -keep3l -keers5to -kee3tj -k4ei. -k4eie -kei3s4 -3ken. -ken5as -ke3ne -ke4nep -ke2n3o -5kens -kens5po -kepie5t4 -5ker. -ke5rij -ker4kn -ker4kr -kerk5ra -ker4ku -ker4kw -ker4n3a -ke4r3o -5kers -ker4sla -ker4sm -4k3erts -ke2st -ke3sta -ke5s4tel -kes3tr -3k2et -5ketel -ke2t3j -ket5sp -4ketu -3k2eu -4kex -2k1f -2k1g -2k3h -1ki -4kied -4kiep -kies4t -kie4t3j -k3ijs -2k1ijz -ki5kl -ki3na -4kindu -kin3en -ki4n3es -5king -2kinr -2k3ins -kio4 -ki2p -kip3l -4k5j -2k5k -kker4s -kkers5te -kke3s4 -1k2l4 -5klac -kla2p -5klass -k3last -4klat -3k4lau -5k4led -4kleer -4k5leg -k3lek -klemme5t -k3len -4klera -k3les -5k4leu -4k3lic -k3lij -kli4me -k4lis -4klod -k3loka -k3lone -k3lood -5kloof -k3lope -5klos -2k1loz -4kluih -k3lus -2k1m -1k2n -kna4l -knas5 -2k3nem -kni2 -5knol -k3noot -k3note -2knum -1ko -2k3oct -ko4e -koe4ket -koers5p -koe3tj -k4offi -koge4 -5kogr -kol2e2 -kolen3 -2kolm -ko5lo -3kom -ko4m3a -komitee5 -3kon -kon4t3r -2k3oog -koon5 -koor5tj -k4o4pl -3kopt -2k1org -2k3ork -korres5 -kort3o -ko3ru -ko4s -4k3os. -4koss -k4ost -kot5j -4k3ov -4kox -2k1p -kpren4 -1kr4 -3kra -k3raad -kra4b -4k3rad -k3rand -4krat -2k1rec -kree4 -kreet3 -kre2p -k3rijk -2krol -kron5t -2k3rou -3k4ru -kru4l -2ks -ks3ad -ks3af -k5sap -k4s1ar -ks3as -k5s4er -k4s3in -k3sla -k4slan -ks4le -ks5leg -ks3li -ks5mo -k2s3n -ks4no -k4snu -kso4 -ks3on -k4s1op -k4s3pa -k1spe -k3spi -ks3po -ks3pru -k3spu -ks4t -k1sta -k3ste -k4st3ed -k4stele -ks5tent -kste4r -k3sti -k3sto -k4ston -k4s5tre -ks5tri -k3stue -k2su -2kt -k1ta -ktaat5 -kte2n3 -kter4sp -ktes4 -kte3st -kt1h -k4t3in -k2t3j -3ktl -k3to -4ktpa -4k1tr -k1tu -3ktv -4ktvi -1ku -kui2f -3kul -k3up -3kus -kut3j -2kv -k1wag -5k2wam -3k4was -2kwed -kwee3s -2k5weg -k1wei -2k1wer -5kwes1 -k3wijz -k4wik -2kwim -2kwin -2k1wo -3ky5 -2kz -4l. -4laaf -4laand -laars5tek -laar5tj -laats5tr -2lac -3lach. -3lache -l4aci -3lact -la2d3a -la4det -2ladj -2la2dr -la2du -3l4ae -laes4 -la2fa -la3fl -lafo2 -4lafs -la2ga -la2g3o -la2gr -lag3ri -la4ki -la3kl -l3akti -2lal -3lald -la5lo -la4mo -lam4p3j -lamp3l -2l3ana -3land -lan4da -land5aa -lan4dr -land5ra -land5re -laneet5 -la4n3ek -5lange. -lan4gr -lan4ka -lan4k3l -lank3w -lan4sl -lan4t3j -la4pa -3lapj -lap1l -lap5r -la2p3u -2l3arb -4lart -l4as -las3a -la4si -la3te -la4t3he -la4t3ro -la3un -l4auw -lava5s -l4az -4lazi -lber4 -lbert3 -l1c -4ld -ldaat5 -ld3ac -ldak4 -l3dar -ld3ari -ld3art -ld3ei -l4dom -l2d3os -ld3ov -ld3ram -l2d3re -ld3s4a -ld5sl -ld3sm -l2d3uu -ld1w -l4e. -le2a -le3ad -le3an -le3at -lee4 -4leekh -leem5ac -3leen -4leep -lee5ro -lees3p -lees5tr -lee3tj -le3fl -legas5 -le4g3ek -4leig -lei5sc -le5ke -2leks -le4kw -le4lim -lemme4t -l4en -5len. -len3ad -le4n5ak -len5as -3leni -len5sl -len4s3p -len4tr -len5tre -le5pe -3le5r4a -ler4e -le5rei -ler5g4 -le3ro -lers4 -l5erts -l5erv -les3ta -les3ur -le3t2h -le5t4i -le4t3ro -4l3etu -leu3ko -5leun -leu5ste -5leuz -leven4s5 -4l3exc -lexis5 -3lé -lf3ac -l3fag -l4f3an -lfbe5 -l2f3ei -l2f3el -l4fend -lf5ende -l4fin -lf3lak -l3flo -l4fo -l5foe -lf3ol -lf3on -lf3op -l5for -l5fou -lf4r -lf5raa -lf5ram -l3fran -l3fre -lf5rij -lf5ro -l5fru -lf2sa -lfs5ei -lf2sm -lf4spo -l2fu -l3fui -lf3uu -l1g -l5gaar -l2g3af -l3gla -lg3on -lg3re -l3gru -l1h -1li -3li. -3lid. -li3da -3lied -lie4gr -li3enn -lies3p -lie3st -lie5ta -3li4è -li3g4a -lij4k3o -lij4m3a -5lijn -4lijp -3lijs -lij4st -4lijt -4l3ijz -li2ko -li5kr -lim4p3j -5lin. -lin4da -li5ne -l4ing -lin5gr -link3a -lin5ke -4linkt -4linr -4lins -lin4t3j -li2p -4lipj -li5sa -li5se -lis5m -l3isw -li1th -3liv -l1j2 -lk3af -lk3alb -lk3ank -lk3een -l4kei -l2k3em -l4k3ep -lk3laa -lk3lag -l4k3lev -lk3ont -l2k4ri -lk5rij -l2k3ro -lk2s -lk4sa -lk4se -lks5m -lks5ta -lks5tel -l4k3uu -l4kw -lk3wi -2l1l -l3la -lla5t4 -l3le -lle5k -lle4sp -l5li -lli4a. -llo3s -ll3ov -2l1m -lm3art -lm3ed -l4m3ind -lm3oli -lm4op -lm5opn -l3n -lni4 -loe4da -loed3r -4loefe -2loes -3loë -lof5d2 -lof2s -lo3go -5logr -lo4gre -log4s -lo4kar -lo2kl -lo2ko -3lol. -3lold -lom4p3l -4loms -4l3omt -l3omv -3lon. -lo4na -lon4gr -lont3j -3look -3loo4n -2loor -l4opa -2loph -2l3opn -4lops -4l3opw -l4or. -4l3org -lo3ru -lo4sc -lo4sp -lo5spe -lost4 -los5tr -lo2t3h -lot5j -2love -lox3e -lo3ys -3loz -4l1p -l3pa -lpe4ni -lper5sp -lpe3s4 -lp3of -lp3on -l3pot -lp5ram -4l3r -lrus5 -2ls -l4s3aa -l4s3ad -ls3ag -l3sak -l3sal -ls3an -l4s3ep -ls2j -ls3ja -ls4ky -l4s3laa -l2s3le -l2s3li -ls4lin -l3smee -ls5mo -l4so -l5soe -ls3of -l5sol -l5som -ls3on -ls3or -l1sp -l5spe -lspee4 -ls3pol -l5spor -l2s3pu -ls4t -l1sta -l1ste -l5ste. -l4stele -l5sten -l4s5term -l3sti -l1sto -ls5tou -l5straa -ls5trak -l5strat -l2su -4lt -l1ta -lt1ac -l4tam -l5tame -lt3h -lt4han -lt4he -l3thu -l3tj -l1to -lt5oli -l2t3ov -l5tr -lt3sl -l1tu -lt3w -lu1e -3lui. -3luid -5luih -lui5ste. -4luit -lu3ka -5lu3na -lu1o -lu3sta -lut3j -lve3s4 -lvi4s -l1w -1ly -ly5st -2m. -1ma -5m4a. -5m4aat -ma4cl -mae3 -2maf -m5afl -5m4ag -5maj -ma3ka -ma5l4a -mal5ent -3man -man3ac -man4se -man4sn -man4so -mans3p -man4st -mans5ta -man5ste -mant4r -ma3pl -5marc -mariet5 -5mark -mar3s4h -mar4s5t -mart3j -3mas -ma3s4p -ma5str -ma5ta -m3atom -m3atoo -mazig5er -2mb -mbos4 -mbo3st -m1c -2md -mdis5 -md3so -1m2e -3me. -me5d -m4ede -mede5l -mede5s -mee5re -mee5r4i -5mees -meest5a -mee5str -3mega -5mei -mei2n -3mel -mel5as. -5melk -mel4kr -5melo -3men -me3na -men5k -men3sm -men4t3j -men4tu -men4t5w -me3p4j -me4r5aak -me4rad -mer3ak -mer4am -me3ran -me5re -merg4s5 -meris4 -5merk -mer4ka -mer4kl -mer4kw -me3roo -me2s -2me3s2h -mes5m -me3so -me3sta -mest3r -me5te -5me3t4h -me5tr -me3us. -3mé -3mè -3mê -2m1f -mfe4r -mfi3 -mfoor5 -2m1g -mgaat5 -mgang4 -mger4 -2m1h -3m2i -miaat5 -5midd -mie5kl -mies4 -mie3st -mi4è -5mig -mij4ni -4m3ijs -4m3ijz -mi3lo -4m3inr -4mins -4mint -5misd -mis5m -mi4so -mi4st -mi5sto -mis5tr -mi1tr -2m3j -2m3k2 -mkaart5j -2m3l -2m1m -mmi3sl -m1n -1mo -5moe. -5moed -moed4s -5moeë -2moef -5moeh -moe2s -moe5ste. -moets5 -5mog -5mole -moli5è -mol4m3a -4m3omv -mo3n2a -mond3r -mo3no -mon4so -5mooi -moor5tj -2mop -m5ope -mo3ra -mo5r4e -mo3ro -mor4s3p -5mos3 -mo3s4ta -mo3th -mot5j -4m3oud -5mouw -4m1p -mp3ach -m4p3af -m3pl -mp3leg -mp3lei -mp3ler -mp3lu -m4pol -mp3oli -mpo2t -mp3rec -mp3red -mp3rin -m3p4se4 -mp3sh -2m3r -2ms -m3sam -ms3ap -ms3ar -ms2j -m3sje -m5sla -ms3len -m5slo -ms5nee -ms3oo -ms3or -m3s4p -ms5pot -ms4t -m3sta -m1ste -m1sti -m1sto -2mt -m1ta -m3th -m1to -m1tr -m1tu -1mu -5mun -5mur -5mus -mus5t -5mut -5muu -5muz -2mv -mvan4 -2m1w -3my -2mz -mze2t -4n. -3na. -1naal -5n4aam -2n1aan -2naap -4n3aard -5naars -naar5tj -5naat -2nac -nacee5t -3naco -nad4 -n4aden -5nae -na3er -2n1af -n4a3g4 -5nai -5naï -n4a5ke -4naker -na3k4l -3n4ale -4n3alf -3n4ali -nal5k -3nam -n4ami -na3na -na3ne -3n4ani -n5anj -n3ank -5nant. -nan4t3j -2nap -na4pa -na1pl -na3pr -nap3s -4n3ara -2n1arb -2narc -5nares -narie5t -n3ark -2n1arm -2n3art -na3s4 -3na1sa -na1sp -nas5te -5nat. -2n3atl -nat2r -na3us -2naut -2nav -2nb -nboot5 -n1c -ncen5 -nch3tr -2nd -n3da -n5daal -nd3aas -n4dac -nd5adel -n5dale -nd3alm -n4dap -nd3art -n4d3as -n4d3az -nd3edi -n4deg -nd1ei -n5del -nde5lev -n5den. -nd4er -nder5aal -nder5al -n4d5erec -nder5in. -ndes4 -n4d3ete -ndiet5j -n4d3ijs -nd3ins -nd2ji -n2d3of -nd5olie -nd5omd -nd3oog -nd5oorl -n3dov -n3dr -nd3rap -nd3rat -n4d3re -nd4ren -ndre3u -n5drev -nd3rot -nd5slo -nds5ma -nd3sme -nd3soo -nd3sp -nd4s5tal -nd3uri -nd1w -ndy5 -1ne -nebe4s -2nech -ne5dw -nee4 -4need -4n1een -nees3 -nee3tj -neg2 -nege4n -ne1gl -ne5g4r -2nei -n4ei. -n4eie -n4eig -4neis -ne4kr -4n3ela -3n4eme -2n3emm -3n4en. -4n3enc -n4end. -nen5k -n3enke -ne2n3o -ne4p3ol -5ner. -ne1ra -5n2ere -4nerf -ne4r3id -ne3ro -ner2s -3nes -ne3sta -nes4tei -ne5stek -4neter -5netj -net5sp -4neum -ne3um. -ne3ume -ne3ums -neu5ste -3né -4n3f2 -2ng -ng3ad -ng3ak -n4gap -n2g3ar -nga5sl -n5ger -nge4rap -nge4ras -nger5sp -ng3ij -n4g3ins -ng3le -n3glis -ng3of -n2g3on -ng3ore -n3gr -ng3rad -ng3ram -n4g3ras -ng3rat -ng4re -n2g4ri -ng5rie -ng3rij -ng3rok -ng3roo -ng2s -ngs3e. -ngs5le -ng4slo -ngs5loop -ngs5m -ngs1p -ngs5pa -ngs3tr -ng3uit -2n1h -1n2i -nie5k4a -nie5kl -nie4tr -3nieu -ni4gee -ni4g3r -nij3k -4n3ijz -nika3 -3nim -2n3in. -4n3ind -3ning -5ning. -ning3r -ning5re -nin2k -n3inkt -2n3inr -2n3ins -4nion -5nise -ni4sel -nis5m -ni3th -ni1t4r -ni5ts -5nitz -5niv -n1j4 -nje5sc -nje3t4 -4n1k -nk3aan -nk5aard -nkaart5j -nk4ab -n2k3af -n4k3ak -nk3ana -n4k3asp -nker5ku -n4kerw -nk3lad -nk3ler -nk3lod -n2k3na -n3kne -nk3not -n2k3of -n4kog -nk3oge -nkoot5 -nk3red -nk3rek -nk3roe -nk3rol -nk3sn -nk4s5o -nk3s4p -nk1st -nk4tr -n4kw -nk3waa -nk3wez -nk1wi -2n3l -2n5m -nmazi4 -n3n4 -nnee5t -3no. -4n3oec -2noef -noes5te -noet3j -noet5s -n4of -2n5ofe -1nog -no4gal -4n3oge -no3ia -1nom -4n3om. -3noma -3nomi -2n3omw -2n3ond -2n1ont -4n3onz -4noof -2n1oog -n4oot -2nop -n4opa -n1opg -n3opn -no4por -n3opv -n4ora -2nord -n4ore -2norg -no3sf -no3sp -n4ot -not5j -4n3ou -2nov -2n3p -npoort5 -n5r -4ns -n3saal -ns3ad -ns3af -n3sag -ns5ak -n3sal -ns3alp -n3sam -ns3an -n3sapp -n3sar -n3sas -ns3av -n3s4c -n5sca -n5sci -n4s5co -n4s5cu -n4sed -ns3edi -nsee5t -n4s3eg -nsei5 -n5sen -ns4fee -ns3ja -n3sjo -n5slag -ns3lak -n5slap -ns3lat -n4sle -ns3led -ns3lie -n5s4liep -ns3lop -ns5mac -n3sme -n5smij -ns5mis -ns5moe -n3smol -ns5mu -ns3nod -ns3noo -n1so -ns3of -n4sog -n5sol -n4som -n5som. -n2son -n3sp -n4s3paa -ns3pad -n4spl -ns3por -n4spot -ns4t -n1sta -n4staak -n3ste -n4st3ei -n5sten. -ns5tent -n3sti -n1sto -nst5oef -nst5oor -n5stru -nst5uit -n4sui -ns3uil -n4suu -n5sy -4nt -n3ta -n5taal -n4t5aard -ntaar5tj -n5tab -nt3ach -nt3ad -nt3aga -n5tal -n4t3art -n5tat -n5teg -n2tei -n5tel -nte4lo -n5tem -n5t4en -nte5re -nte4st -nte5ste -n5tev -nt3ex -n3tè -nt3ha -n4tho -n5thol -nt1hu -nt4i -nt5ijz -nt5inw -nt4jo -n1t4o -n5toe -nt5oge -n5toï -nt5oli -nt5oms -nt5oog -ntoor5 -nt5opn -n3tr -nt3rec -n5tref -nt3rei -n5trem -n4t5rij -n5troos -nt3ru -n5tsj -nt1sm -nts5pre -nts5tan -nt5ste -nt5sto -nts5tro -n1tu -nt5uit -nt3w -nt2wi -nt4wis -3nu. -nu3a -nu3en -nu3et -2nui -4n3uil -nu2lo -n3ult -3num -4n3uni -2nur -5n4uri -nu4s -nus3o -nut3sh -2n3uur -nu4wi -nu5wing -2nv -nval4s -4n1w -nx3 -nx4e -3ny -n3yi -4nz -nzet5s -3ñ -o1a -o2as -oas3t -o3av -o4b -o5ba -obalt3 -o5bi -3obj -o5bl -ob3oor -ob3or -obos4 -ob5ov -o5br -o3cha -o1che -o1chi -o1cho -o3chr -o3chu -ocos4 -oc5t4 -4od. -oda3g -ode4m5o -o5d4e2n -ode5sp -od3on -o5doo -od3op. -od3re -od5slan -od5sli -od5slo -ods5m -ods3o -od4spr -od1w -oe4d3aa -oed3ar -oe4d3on -oe4dr -oed3ri -oed3ro -oe2d3u -oed3w -oe4f3a -1oefe -oe2fi -oef3la -oef3le -oe4f5o -oe2f3r -oege3l -oei5s4 -oek5erk -oe2k3l -oe2k3w -oe3l2a -oe4lac -oel4ak -oe4l3ap -oe4l3ei -oe4m5ac -oeme5tj -oe5n4e -oe2n5o -o3eo -4oep -oe4plu -oe2p3r -oe2p3u -oe3ra -oe4r3aa -oe4r3al -oe4rau -oer5ei. -oer3o -oer5om -oer4sl -oer4sn -oer4sp -oes3a -oes3li -oe4s3o -oes4t -oe3sta -oes5ter -oes5tig -oes5tin -oe3sto -oe4taa -oe4t3an -oe4tei -oet3h -oe2tj -oe4tra -oets3p -oet3w -4oë -4ofa -of3ar -of4d1a -ofd3ei -of2do -ofd3on -of2dr -ofd3re -of4d1w -o3fe -o3fi -of3l -of4la -o3f4lu -of3om -o3fon -o3foo -of1r -of2sa -of4si -of4s3l -of4sp -ofs5pl -ofs5tr -oft2s -of4tu -oft3ur -oft3uu -og3al. -og3ap -4ogee -ogel5ei -ogen5t -1ogig -4og1l -4og3n -o4g5ne -og4op -ogs5e. -og4s5l -ogs5m -og3sp -ogs4pr -ogs4t -og5ste -og3sto -og4st3r -o1h -2oi -oi4a -oi2a. -oi1e -oile4 -o3ing -oi3s4 -oi5sc -ois5m -oist4 -ois5tj -oi3tj -o1j4 -oj5k -o3kaa -o4k3aas -okaat5 -ok3ab -ok3ag -o3kal -ok3an -ok3ar -o4k3az -ok3een -oki2n -o3kla -ok3let -o2k3li -ok3lo -ok3lu -o2k3n -ok3ol -o2k3op -o2k3ou -o2k3r -o5k4ra -ok3sa -ok3sp -ok4spo -ok1st4 -okter4s -ok3uu -ok3w -4ol. -o1la -ol3ac -ol3ap -4old -o1le -o3le. -ol1ei -ol3eks -o3len -o3ler -ole1u2 -olf3l -olf4s -olf5sl -ol2gl -ol2g3o -ol2gr -olg3ri -o5ling -o3lit -ol4k3aa -ol5kaf -ol5ke -ol2kr -olks1 -ol5kw -ollie4 -ol3mo -o1lo -o5loc -olo3k4 -ol4om -o2l3op -olos3 -ol3ove -ol4p5ra -ol1sj -ol3sk -ol3sl -o1lu -ol3ui -ol3un -ol3ur -4oma -om3ac -om3af -om3eg -om3ela -o5men. -omer5k -o3me4s -ome5sp -om3ez -om3ins -om3int -4omm -om3op -om3pa -om4p3la -om3ui -4omy -o1na -on1ac -o3nag -o3nal -on3am -o3nat -on3au -2ond. -ond3ac -on4ded -ond5eng -onde5ras -onde5st -on4dij -ond5om. -on4dr -on5dra -ond5re -ond3ro -4onds -o2n3ec -on5ei -on3ekl -on3eng -one5ste -on3ga -on4gaa -ong5aap -ong5ap -4ongen -on4gri -ongs5k -o3ni -on4in -2onk -on4k3ap -on3k4i -on5kw -onne5st -on1ov -on3sm -on2s3n -on4spe -on1st -on5su -3ont1h -on5ti -on4tj -on4tog -on4too -on2tr -on5tu -on1ui -o4o2 -oo3c -oo4d -ood1a -ood1e -ood1r -ood5sl -ood5ste -4oof -oo4g -oog3a -oog1e -oog1r -ook5s -ool1a -ool3e -ool5f -oo4l3i -ool5k -ool3o -ool3u -oo4m -oom1a -oom3o -4oon -oon3a -oon5tj -oop1a -oop5e -oor3a -oor4daa -oor1e -oor5i -oor5m -oor1o -oor3sm -oor5to -oo4t -oot1a -oo3te -oot1h -oot5o -oot3r -oot4sl -o1pa -op3aar -op3ac -o4p3ak -o4p3an -o2p3as -op3at. -op3atl -5opdr -o2p3ee -op5een -op5eet -o2p3ei -op3ete -op4her -o1pi -o2p3id -opie5t -op3ijz -op1j -op3l -o1po -o3poe -op3of -o4p3oo -op3ord -op3ore -op3ov -op3r -op5rak -3o4pru -ops4l -op3sme -op3sn -op5sto -4opt. -o1pu -o4py -o1ra -or3ac -or1af -or2do -or4doo -or4d3or -ord3w -o1re -or4en -oren3a -or2g3l -or3g2n -o1ri -or3ins -or4m3ac -or4n3ac -or3no -or5oe -oroes5 -or1on -or1oo -or1op -or4p3ac -orp4sc -or5se -or4s5k -or4t3ak -orte5n4a -or4tev -or4tj -or4t3oo -or4tor -ort5sp -ort1w -or1u -or3ur -o3ry -os3aa -os3ap -o3sar -o3s4c -o5sch -o5sco -o5s4e -ose5st -os2f -o3s4fee -os2ko -o2s3l -os5m -o2s3n -o1s4o -os5ol -os3p -os4pe -o5spect. -o5specte -os5pek -os5per -os4po -o2st -os3taa -os5taal -os5taar -ost3ag -os3tal -o5s4tas -os4tat -os3te -os5te. -o3stè -os3to -ost3ov -ost3re -ost3ri -o3stro -os5tru -os3tu -o3sy -o1ta -ot3aar -ot3ac -o2t3ak -o5tam -o4t3ap -ot3as -o5teb -ot3ed -o5tee -o5tem -o5ter -ote5ri -ote4s5ta -o1th -o3t4hi -o2tho -ot3hu -o4t4j -ot5jo -o1to -o2t5ol -oto3p -ot3ri4 -o3tro -ots3a -ot5si -ot2s3l -ot5so -ot4s5pa -ot4str -o1tu -ot3ui -o3tul -ot1w -ou3a -ou5b -ou1c -ou4d1a -ouden5t -ou1e2 -ou3k4 -ou4re. -ou4res -ou2ta -out1j -ou2t3o -out3r -out3sp -ouw5do -4ova -o5ve -3overg -2ovi -ovi5so -o1wa -o3we -o3wi -own3 -o3wo -ow3r -o4x -1oxy -oys4 -o3z -oze3s4 -ö3l -4p. -3paal -4paan -paar5du -paar5tj -2pac -pacht5s -p2aci -5pad. -pa2d3r -3pag -pag4a -pa3gh -pa2k -5pak. -pak3a -p4ake -3pakk -3pale -paling5s -pal5kl -palli5a -palm5a -pal4mo -pa3na -pa4n3ad -4pank -pan3o -pan5sp -pan4t3r -3pap -5papi -pap5l -pa3pr -4par. -3para -par3d4 -4parr -par3th -3parti -part3j -pa5ru -pas3 -pa3sa -pa4sc -pa3so -4pat. -pa5te -2patl -3pau -4p3aut -1pav -2pb -p1c -2p3d -1pe -pe3au -3peb -4peci -5pectu -5ped -pe5de4 -pede5r -pedes3 -p4ee -pee4l -2peen -3pees -peet3 -peet4j -3peë -3peg -pe3gl -3peh -p4eil -pek3ee -pek3la -pe2k3n -3pekti -pe4lak -pe4l3ee -pel4i -pe3lo -2p3emm -3pen -5pen. -pe4nam -pe5nan -pen5k -5pens -pen5sm -pent4 -pe4nu -3pep -4pepi -pep3s -3pe1ra -5peri -per5ijz -peri3s -pe3ron -5pers -per4sp -pers5pa -per5sti -4perwt -5pes -pe5sa -pe5se -pe3sta -pe3sto -3pet. -5peter -pe3um -3pex -3pez -1pé -3pê -2p1f2 -2p1g -pgaat5 -pgei4 -2p1h -3p4his -pie4tj -pi2ga -pi3gl -5pij. -pij4li -3pijn -3pijp -pij4p3a -pij4p3l -4pijs -pij4tj -2pijz -pik3l -pi4ko -pi4nas -4p3inj -pin4k3r -pin4t -pi3sko -pis5m -pis5ta -pit3j -pit4sp -p1ja -p3ji -p1jo -2p1k -pkaart5j -p2l2 -4p3la. -plaat5j -pla3di -pla4kl -4plam -p5land -4p3lang -3plant -p5lap -3p4las -pla4tr -plee5tj -2p5lep -p3les -p4lex -2p3lig -2plij -p5lood -p5lop -2p1m -2p1n -p3no -p4oe -3poei -3poe2s -poe4s5t -poe3tj -3poez -3poë -2pof -po2k3i -po4ko -pol5ka -3pom -pome3 -4p3oml -3ponds -3pone -pon4sm -4poog -p4ool -poo3li -4poor. -poor5s -poot5 -3pop -po3pe -po3pl -4pori -2pork -po3ro -5portef -por4t5ra -3p4os -po3sf -po3sk -pos4taa -po4ta -po4tes -3poth -3poti -pot5j -4pov -2p5p -ppe5li -ppe4n -ppen5e -pr4 -p4ra -3pra. -praat5 -p5rad -3prakt -4pram -3prao -p5rap -3prent -prent5a -pren4t5j -3p4ret -preu5s -p3riek -3pries -4priet -pri5m -5prins -3p4rio -5prob -3proef -3proev -5p4rof -p4rog -5prop -pro5pa -pros5t -3prov -pruit5j -pru2t -prut3o -2ps -p2sa -ps3af -ps3as -ps3at -ps3au -p3sc -p5schi -p4sco -ps3le -ps5ma -ps5mi -p2s3na -p1so -ps3of -ps3on -p3sop -p1sp -ps4pe -p1s4t -p3sta -p5stat -p3ste -p5ster. -ps5term -p5sters -ps5tor -3psy -4pt -p1ta -p5ti -p4t3j -p1to -p1tr -p1tu -pu5b -pu3c -puil3o -pul4st -3pun -4pun. -5punt -punt3j -put3j -put3r -4pv -2p1w -1py -py5l -5pyleen -4pz -pzet5 -1q -qu4 -qui3d -4r. -r4a. -r2aa -2raan -3raar -5raar. -4r3aard -5raars -raar5tj -raat5jes -2rac -5rac. -r4aci -4ra5da -3radb -rade4r5a -ra3di -4r3adr -3rads -ra3fa -2r3afd -ra4f3on -ra3fra -ra3gn -ra3io -raï4 -ra3k4l -ra4kr -ra5kru -4r3ala -ra4l3ee -4r3alf -2r3alm -r3alt -r5ameu -4ramn -4rana -r2anc -rand5sl -ran4g3o -ran4g5r -rank3w -rans3p -3r4anti -r3antw -ra5o. -ra4pl -rap3r -2r3arb -r2are -2r1arm -r3arr -4r3art -ra4sk -ras5m -ra3sth -ra5stheni -ra5str -rat5sp -r1c -r4che. -r4ches -r4chet -r5co -r1d -r4d3act -rd3ama -rdan5ste -rd3ar -r4das. -rd5elas -r4denv -rd5enve -rde5ra -rder4s -rde5sp -r3do -r4dol -rd3oli -rd5olie -r4dont -rd3oos -rd2ro -rd3rod -rd3rol -r3droo -rd5sla -rds3le -rd3so -rd3su -rd1we -rd5wo -re2am -3reda -3redd -rede4s3 -4rediti -3redu -r4eed -ree4k -4r1een -ree3n4e -4reers -ree3tj -re3fa -5re1fl -4reg. -4regd -rege4s -4regg -5regi -3re1gl -4rego -4regt -reid5sta -4reie -4reil -4reind -reis4t -5reiz -re4ka -re2k3l -re4kn -re4k3ur -re4k3uu -2rek4w -4rekwi -reld3o -rel4dr -rel5ei. -re5lui -re4lur -remie5tj -2remm -5r4en. -re4naa -re4n3ar -3renb -r5endert -ren5dr -re5nek -r5e5nend -5renenk -ren3ep -renep5e -ren5erv -2r1eni -ren3ko -re3n4o -re4n5of -re4n5oo -3renti -r3entw -re5pa -4req -4r1erf -re3r2o -2r3ert -4r3erv -2rerw -re3sa -resi3 -re3s4ko -re2sl -5re4s3p -re5spoo -re2st -res5tor -res3tr -re5tak -re5t4i -re4t3og -re4tri -reuk5s -5revo -4rey -3ré -r4f3aa -r2f3ag -rf3al -r3fe -r4f3eng -r3fi -r4f3lag -rf3lat -r1fle -r4fli -r3flu -rf3op -rf4ov -r1fr -r2f3re -rf2s -rf3sm -r4f3ur -r4f3uu -r1g -rg4al -r3ge -rge2a -r4g3een -r4g3ei -rg4eis -rge4l5aa -r4g5erep -r5gew -rg3ij -r4g3lu -rg4ov -r5grij -rg4ro -rg1s4 -rg2s5m -r3h -ridde4 -r4ie -rie5kl -rie5pl -ri1eu -ri3fl -ri3fr -4rijl -rijs5l -rij5ster -rij4tr -rik4o -rik5r -ril3m -ri4maa -rim2s5 -r4ing -4r3inh -rin4kl -r3inko -4rinkt -ri3no -4rinr -4rins -4rint -ri3sc -ri5sco -ris5m -ri5so -ris5ten -rist4j -ri4s5to -ri3tr -r1j -rkaart5j -rk3ang -rk3art -r3ke -r4k3ei -rke4n -rken4s -r4k3eze -rk3iep -r4k3ink -rk3lat -rk5leer -rk3let -rk3olm -rkoot5 -rk3oss -rk3rat -r5kri -rk5roos -r5kru -rk1s -rks4f -rk4s3l -rks4p -rk2t3r -r1kw -rk3waa -r4kwat -rk3wet -rk3win -r3l -rlos3 -r5lu -r1m -r3ma -rma3f -r4m3ap -r2m3eb -r2m3eg -rmer3a -r5mi -r5moe -rm3ont -rm3op -rm3s4a -rm4sl -2r1n -r3na -rn4aa -rn5aan -r5n4am -r4n3ap -rnee5t -r4n3ene -rne4t -rne5ta -rnet3j -rn5oof -rn3ops -rns4 -rn5sp -rn5tj -r3nu -ro5be -r4och -ro3d4o -r4oe -4roeg -roe4g3r -roe4p3l -roe4rei -roes5te -roet3j -3roë -roge4s -3rogy -1roï -r4ok -3rol. -ro2l3a -rol3g4 -4roli -r4ome -r4on. -ro2na -ron3ad -ron4d3o -ron4d3u -r2one -ron4ka -r2onn -r4o1no -r2ons -4ront -ron4ta -ront3j -ron4t3r -ro3nu -3roof -2r1oor -4rop. -ro4paa -ro3pe -rop4la -ro5po -rop5ra -rop3s -r2opt -ro3ro -ro3sf -ro3sn -ro4sp -ro3ta -ro5te -ro3t2h -rot5j -r1oud -3rout -4roxy -r1p -r3pa -rp3ank -r3pe -r3pi -r4p3j -rp4lo -rpoort5j -rp3rec -r3psa -rp2st -2r5r -rre4lei -rre4l3u -rre3s4p -rri3er -rrie4t -rron5k -rroot5 -2rs -r1saa -rs3ad -rs4ag -r3saks -r3sal -rs3alm -rs5am -rs3ap -rs3ar -rs3ass -rs3av -rsboot5 -r3sc -r4sco -r4sec -r4s3ek -rs1ex -r4s3ez -r1sja -r3skat -r3s4kie -rs5ku -r5slag -rs3lat -rs3leg -r5slep -r5sleu -r3s4lie -rs5loep -r5slui -r5smaak -rs5maal -r3sme -r3smi -r4smid -rs3nac -r5sni -rs4no -rs5noo -rs5not -r1so -r2s3op -r1sp -rs3pad -r5span -r5spel -rs3pet -r5spit -r4s4pl -r5spli -r5spog -rs3pol -r1s4t -rstaat4 -rst5akk -rs5tas -r4stav -r3ste -r5stend -rs5term -r3sti -r4stit -r3sto -r4store -r5stran -r3stre -rs5trei -rst5roz -r3stu -rs2ui -r1ta -rt3ac -rt1ad -rt3af. -r4tank -rt3ape -r2t3ar -r2tav -r2t3ec -rte5la -rte4na -rt5eve -rt5ha -rt3he -rt3hi -r5t4i -r3tj -rt3ja -rt3jo -r1to -r5tof -rtoi2 -r5tol -r4tom -rt3om. -rt5onr -rt3ord -r5tori -r1tr -rt4rek -r2t3ri -rt4rit -rt3ru -rt4sek -rt4s3l -rt3sle -rts5m -rt4s5n -rt4spr -rts5tan -r1tu -r4t3ui4t -rt3we -ru3a -ru5ba -rude3r -ru1e -ru2g -2rui -ru2k -ruk3i -ru2l -rul3a -ru4li -r2um -ru4m3i -r2un -runet5j -r4us -rut3j -4ruu -ru4wi -ru5wig -rvaat5 -rvee3t -rvi4c -rvil4 -rvloot5 -r1w -r5wa -r5we -rwe3st -r3x -4rz -rzet3j -4s. -5s4a. -2s1aan5 -s3aap -3saat -3sab -4s1ac -5sacr -3sae -4saf -sa3g4 -3sah -3sai -3saj -3saka -3sake -s1akt -s2ala -1sali -4salm -5s4alo -4salp -4samb -samen5t -5samm -s3ank -1sant -san4t3j -5sap. -s3ape -s3apo -sa3pr -4s3arb -s4ari -4s1art -sart5se -sa3sc -s4ase -sa3s4p -1sat -s3atl -2s3att -1sau -4s3aut -4sav -4s5b -sboot5je. -1s2c -4sca -2sce -3sch -4sch. -4schao -5schap -5sche. -4schef -5schen -5schep -5scher -5scho -5schr -5schu -4sci -sci4n -4scl -2sco -s4cola -5scoo -3s4cop -5scope -5scopi -scorres5 -3scout -2scu -4s1d -s3da -s5de -sdis5 -s5dr -s3dw -3se -5s4e. -se4al -se4ar -s5ech -5sedo -s3eed -4seen -see4t -see5ts -4seev -4s3ei. -seig4 -s4ein -5sein. -5seine -5seiz -se4l3ag -sel5eig -s3elek -sel5k -se3lo -se2ma -sem5ac -4s5emm -5sen. -se4n3em -se4net -5senh -se2n5o -sens4 -sen5sl -sep3en -se1r4a -se4r5au -se5r2e -4serg -se3ro -ser4s3p -s4es -se5sa -se3s4t -ses5ten -s4et. -s4eta -4sete -set3h -5se2tj -set5w -se3um -4sex -3sé -3sè -s1f -s3fa -4sfi -s3fl -s3fo -4s5g -sgaat5 -2s1h -s4ha. -sheids5 -s4h3es -3s4hi -s5hie -s2hot -s3hote -3si -5si. -5s4i4e -sie5kl -sies4 -si4è -si3f -5sig -si3g4a -si5ge -si5go -s3ijv -4s1ijz -4s3inc -4s3ind -sin3g4l -s3inko -4s3inm -si3no -4sinr -4s1ins -4s3inz -s4io -sis3an -si4se -si4s3i -sis5te. -sis5tr -si3tr -sj2 -3s4ja. -2sjas -s1je -s5je. -s3jeb -3sjee -1sje4r -sjer3i -s5jes -3s4jez -sj3k -3sjok -4s5jon -1sjou -2s1k4 -4sk. -s3ka -skaart5j -skie3s -skiet4 -s3koc -4skou -s4kul -1s2l4 -s4la. -s3lad -3s4lag -s5lamp. -s5lampe -4s5land -s3las -2slat -s4lav -5slee. -5sleeë -s3leef -5sleep -4s5leer -2sleg -s5lei -s3leng -5slent -4s3ler -s3les -3slet -sle4t3j -3s4leu -s5leug -5sleur -4s5lev -s3lez -5slib -2s3lic -4slid -4s5lied -s5lif -s5lig -5slijp -s5lijs -5s4lik -5sling -s5lini -2sliv -slob3 -2s3loc -3s4loe -s3log -s5loon -sloor5 -s3loos -5sloot5 -s3los -4s3lou -2sloz -2s5luc -3slui -4s5lui. -4sluid -sluis4t -5sluit -2s3lus -s4m -4smaat -2s5man -smans3 -s5mas -4s5mat -3smed -4smei -4smelo -s5men -4s5mes -smeu5ste -5smid. -s5min -4smis -5smit -1smok -s5mon -1s2n4 -2snam -3s4nav -5s4ned -s4nee -snee5t -sne2k -3s4nel -2snes -2sneu -s3neuz -s4ni -s5nie -s5nim -s3nit -4sniv -4snod -s3nog -2snoo -3snuf -s3nut -3s4oc -5sod -1soe -3soep -s3off -s3og -so3gl -3soi -so2k3 -3sol -so3lo -3s2om -s4om. -s3oml -5somm -4s3oms -s3omz -s4on. -3sona -4s3ond -2s3ong -so3no -s4ons -4s1on2t3 -4s3onv -s3onz -4s5oog -s3ook -s3oor. -s3oord -5soort -3s4op. -2s3opg -s3opn -3sopp -so3pr -2s3opv -4s3ord -2s1org -so3ro -sor4s -3s2ort -so3s4 -so5st -3s4ot -so3tr -4sott -sou3t -2s1ov -s2p -4sp. -4spaal -5spaan -5spaat -4spad -4spak -2spap -5spar. -5sparr -4s3pas -4spau -5spectie. -5specties -5spectiv -5specto -speet5 -2speg -s5pei -spe2k -2spen -s4pene -4spers -spers5p -spes4 -spe3st -2spet -4spex -4spez -s4ph -spie5tj -4spijn -4spijp -5spil -5spio -2s3p4l -s5pla -spli4 -4s5plu -2spol -4spom -s4pore -sport5r -2spos -4spoth -s5pred -3sprie -sp5riem -5spriet -4s3prij -5spron -4s3ps -4spt -4spun -5spur -2s3r -4s3s4 -s5sa -s5sc -s5se -ssei3s -s5si -ssis4 -ssi3st -s5sm -s5snu -s5so -ss5pas -s5su -s2t -4st. -5staan. -4staanw -staart5j -4s4t3a2c -3stad -2staf -3staf. -4stakk -st3akt -s4tap -4stas -s4tav -5stave -2stb -2std -4s5tech -3s4ted -3steek -3steem -3steen -4steka -s3teks -st5elem -3s4tem -4stema -4stemo -st4en -s4tene -s4teni -4s5tenta -s4tep -ster5ijz -ster5og -4steva -s4t3ex -s4t3ez -2stf -2stg -2st1h -st2he -st3hed -st5heer -s5them -5sthenic -5sthenis -s3ther -s4tho -s4thy -2stia -4sticu -4stie. -4stief -5stiefe -4sties -4stiev -5stigm -4stijd -5s4tijl -4st3ijs -3stils -s5tis -4stiv -4s4t1j -2stk -2stl -2stm -2stn -4stoc -4stoef -4stoej -5stoel -5stoep -4stoer -4stoes -5stoet -4stoez -3stof -st3oge -3s4tok -4stone -4stong -st3oog -3stoot -stoot5j -4st3ord -3stot -s4tov -2stp -1str -st4ra -straat5j -5straf -4strap -st3rec -s4tred -4streg -4strei -s5trein -s4trek -5stren -st3rif -st4rol -st4rom -st4roo -4stroos -st5roos. -4strou -4stroz -2st1s4 -st5sc -st5se -2stt -1stu -4stub -5stuk -s4tun -st3uni -2stv -2s4t5w -3s4ty5 -1styl -2stz -1su -3su3a -sub1 -3suc -3sue -5suik -5suis -s1uit -5suk -3sul -2s1un -5surp -5surv -s4us -4s5v -svaat5 -svoge4 -4s1w -s4y -3sy. -sy4n3e -sys5 -4s5z -4t. -t3aang -t3aanw -t3aanz -4t3aap -taar5st -4t3aas -3tabl -2tac -3tace -t4aci -t4act -4tad -t3ader -tad4s3 -2taf. -2tafd -5tafe -4t3afs -ta2g3r -tai4l -ta3kl -ta4kle -5talent -talm5a -4talt -ta4mak -4tamb -t3amba -3tame -tament5j -4tamp -tan4dol -tan4d3r -tan4dw -tan4gr -5t4ans -3tant -5tapi -ta3pl -t4are -t4ari -t1arm -ta2r3o -3tarw -3tas -5tasj -5tass -ta5str -4tata -2t3atl -3tatr -3tau -4taut -4t1avo -2t3az -4tb -4t1c -4t5d -1te -te3a. -te2ad -te3ak -tee2 -4teek -tee4k3l -teem5a -4teen -tee3ro -tee3t -tee5tjes -2t3eff -te3fl -t4e3g4 -tege4n5 -3teh -4t3eier -4teig -t3eind -teit2 -4tek. -5teka -5tekeni -5tekens -teks2 -4t3ekse -t4el -te4lap -5telef -5teleg -5telev -tel5k -te3lo -te4l3og -4telse -te4l3uu -5tema -te4mor -5temper -5tempo -4temu -3t2en -5tenbo -5tene. -te4nek -te4net -tenier5tj -5tenij -ten5k -te4nol -ten4su -t4enta -t5entac -ten4tj -3teo -t2er -teraads5 -te4r5aak -ter3ab -ter3ag -te3ral -te3ran -te5rat -ter4du -te3re -te4rei -te4rem -te4r5env -ter5ge -teri4ci -5terig -te4r5in. -3term -5term. -ter5oc -te3rog -ter5om -5te3ron -te4ros -4terren -ter5sc -3t4es -5tesa -te3sap -tes4l -5tesm -test5ri -te3th -4t3euv -t4ev -5tevaa -t5evan -2tex -texi5 -t4ext -1té -t1f -4t3g2 -tgaat5 -tge3la -2t1ha -4t3ham -3thea -t3heb -5thee. -5theen -4t5hei -t3hel -t4hen -5thene -5theo -1ther -t3here -5therm -3thes -3thet -this5m -t3hoe -t3hok -t1hoo -thoof5di -t1hou -t3houd -3thr -2thu -t4hur -3thy -3ti -5ti. -5tia -5tica -5ticu -5tie. -5tief. -5tiefs -5tiek. -tie5kla -tie4kon -5tien -5ties -tie5sl -ti1eu -5tiev -ti4è -ti3fe -ti3fr -ti2ga -4tigm -ti2gu -tig3ur -5tijd -5tijn -4t1ijz -ti5kle -ti5kr -ti3kw -t4il -ti4laa -4tils -ti4m3in -5timm -tin5ade -4t3ind -4tinf -tin4g3i -ting5r -tini5è -4t3inl -t3inq -4tins -5tint -4tinv -4tinw -tis4l -tis5la -ti3sli -tis5m -ti3s4p -5tite -ti3th -ti1tr -t3ivo -1tj2 -4tja -t3jen -tjes5c -t3jesd -tje5spr -4tjeu -4tjo -5tjoe -5tjok -2tju -4t3k2 -4t3l -t4lem -4t3m -tmo4s5 -4t3n -5t4o. -3toc -3tod4 -to3do -t4oe -toe5d -5toej -toe3k -4toel -toe5la -toel4tj -toemaat5 -5toen -5toeri -5toe1s -toe3tj -toe5tr -5toez -to2f -4tof. -to4f5l -tof3th -to3g4n -3toj -to4ka -t4ol -2t3oli -5tolo -to2lu -3toma -tomaat5 -tom4p3j -2t3oms -t4on -5ton. -5tone -5tong -5tonn -to3no -4tonr -to3nu -toom3e -5toon -toor5tj -4topd -to3pe -to3phe -to3p4le -2topn -to4por -4t3o4pr -t3opsl -t3opto -5tor. -5torens -4t3org -tor4ma -to3ro -5torr -3tors -5to3s4 -to5sa -to4st -tos5te -to3tr -2t3oud -tou4re -tove5na -4toverg -tozo5a -4t5p4 -tpe4t3 -3tra. -4traf -5trag -3trakt -4trand -5trap. -5trapp -t3rasp -3tre. -4trec -4treda -t5redes -t4ref -2t1reg -3trein -4t3reis -4treiz -trest5r -tre2t3 -3t4reu -t3rib. -tri3g2 -5tril -3t4rio -3t4ris4 -4tro. -4t3roed -t3roes -5trog. -5trogg -t4roï -4trol. -t2rom -3tromm -3tron. -5trone -3tronn -3trons -t5rood -5troon -t4roos -5troost -tro5sp -5t4rou -4tru -5truc. -5truf -5truie -trui3t -t4rum -4ts -ts3ad -ts3af -ts3ak -ts3al -t3sap -ts3as -t4scr -ts4cu -ts3een -t4s3ei -ts5eind -ts3eko -t5sel -ts4en -t4s3eng -ts3erg -ts4hel -tsi4ga -t4sij -t4sink -t4s3int -ts2j -ts3ja -5tsji -t5slag. -ts3lam -t2sle -ts3led -t5s4lep -ts5ma -t2s5mu -ts3neu -ts5nik -t3s4no -t4s3om -ts3on -ts1or -t1sp -ts3pad -ts4par -t5spel -ts3pet -ts1pl -ts4pli -ts3pol -t5s4por -ts4t -t1sta -t4staal -t5stap -t1ste -t5stee -ts5teks -t5sten -t4s5term -ts5th -t3sti -t5stil -t1sto -ts5toc -t4s3tol -t4s5tore -t4sty -t4su -ts3ur -ts3uu -t3sy -4t3t -t5ta -t5te -ttent5j -tte5ras -tting5ste -t5tr -tt3uu -tu1a -5tu5b -tu5d -3tue -5tuig -5tuin -4tuip -t3uitg -tui3tj -3t4us -tu3wa -4tv -tvaat5 -4t1wa -4twe -5t4wijf -4t3wil -t4win -t5wind -t1wo -t1wr -1ty3 -5typ -4tz -4ua -u3a. -u3ac -uae2 -u1al -u1an -uar5t -u1ati -u4b -ubal5 -u5be -ubes5 -u5bi -4uc -u3che -u3cho -uch5ten -uch4to -uc4t3a -ud3ei -u5den -uden4tj -ud3ess -u4d3ez -u4do -ud3oo -ud3ov -u2d3r -ud5ro -ud5sla -ud4sm -ud5sme -ud5smi -ud1w -4ue -u1ee -u1el -u3er -ue4s -uet3j -uet5sp -u1eu -u3ez -u3ée -u3è -u3fa -u3fl -u3fr -uf2s -u3ga -u4g3ad -uge4leg -ug3ij -ug3l -ugmar5c -u2g1r -ug1s4 -ug3sl -u3h -u4i -4ui. -2uid -ui2d3a -ui4d5eu -ui2do -uid5oo -ui2dr -uids5e. -uids4p -uid5spr -uids3t -ui4du -ui3e -uie3s -ui2fa -uif1l -uif5r -ui2fu -4uig -ui4go -4uik -uik3l -uik5r -2uil -uil3aa -ui4l3og -ui4loo -2uim -ui4m3a -uime3s -ui4n1a -uin5g -ui2no -uins5lo -ui2p3l -4uis -ui4sa -ui4sh -ui4sl -ui5slu -uis5m -ui4so -ui4st -ui5stene -ui2t1a -uit1h -uit3j -uit4je -3uit1r -4uï -u3j -uk3al -uk3as -u3ke -uke3no -u2k3l -u2k3n -u2k3o -uko5p -u4k1r -uk3sm -uk3sn -uks3p -uk4s3te -uk1w -u1la -ul3ac -u3l4an -ul5and -uld5erk -u3le -ul3fl -ul5fo -ul3fu -ul3ij -ul3k2a -ul2lo -u1lo -u2loe -ul3op -ul2p3l -ul2po -ul4p3r -ul3sa -uls5tel -u3lu -ul3ui -um3ac -3umc -umel4 -um5po -3umz -u1na -un3ac -un3ak -un2c -un3che -unch3r -une4tj -un3g4 -u5ni -unst3r -4unt -un4tag -unt5een -un2tj -unt5o -u3nu -uo3i -u3on -u3oo -uo3r -u3os -u3oz -u3pa -u2pek -u3p2h -u1pi -up3j -u1pl -u1po -u3pr -u1pu -2ur -u1ra -u4r3ar -urari4 -ura3st -ur3au -ur2c -urd4o -u1re -u2r3ec -uree3s -ure5lu -ur3env -ure4t3 -ur2f -ur3fl -urf3s -u1ri -ur3ijz -u4r3ind -urken5 -urmar4 -ur2no -ur5open -ur5pr -urs5ag -ur3s4f -ur2s3l -ur2s5n -ur4sti -urs5tik -ur3ta -4urv -u3ry5 -us3ar -u4sc -us3ch -u5scr -use3tj -u4s5l -us5m -u2s5n -us3on -us3op -us3os -us3p -u2st -us4ta -us5tag -ust3al -u4s3te -us4t3ei -ust5on -ust3oo -us3tor -us5tru -ust3u -u1ta -ut3aan -utaar5 -ut3ac -u3tan -u4t3ees -u2t3ek -u2t3em -ut5ex -u2tj -u1to -ut3oog -uto5s -ut3ri -ut3saa -ut3sc -uts5eng -ut3sku -ut3so -ut2s3p -ut5su -u1tu -ut5w -uu2 -uur3a -uur5k -uur1o -uw1a -u3wag -uw3au -u1we -uw3een -u2w3ei -uw3eko -u5wen -uwen5k -uwe3s4 -u1wi -uw3ij -u3win -uw3n -uw1o -u3woe -uw1r -u3xi -u3ya -uzes4 -uze5t -3v4 -4v. -5va -vaar5tj -vag4 -va2ko -va4kon -va2l3a -va3laa -val5m -val4s3p -vals5tek -va2n -van4ch -van4g5r -va3no -va5p -vast3r -va2t3h -vee4l -veel5e -vee3p4 -vee5sta -vei3s4 -vel4d3o -vel4du -vel4s3n -ve4na -ve5nare -ven5dr -ven5k -ve2n3o -ven4se -ven4sl -vens5lo -ven4s3u -vent4s -ve2r -ver1a -ver5aas -ve4rad -ver5do -ver3ed -ve3rei -ver3er -ver3et -ver5ijl -ve5ring -verk4 -ver1o -ve3rom -vers4a -ver3sp -ver5sto -ver3u -ve2s3 -ve3sa -ve3s4c -ve3su -ve2t3j -ve2t3o -ve3tor -ve4t3r -ve5t4ro -vet5sta -vie4r3a -vies3n -vil4t3j -vi4sa -vis3an -vis5m -vis5ot -vi3t2r -4v5j -4v5lar -vlei3s4 -vlie4s3 -voe4t3r -voet5sp -vo2le -vol4g3a -vo2li -vol3ij -volk4s3 -voorn4 -voor5na -vo3ra -vot5j -vr2 -vrij3k -vrijs4 -vuet4 -vui2 -vy5 -2w. -waar5e -wa4b3 -w2ad -w2ag -wa5ge -wagen5t -wal3a -4wam -wam5pl -4wana -waneëi5 -wan4gl -wang5sl -wa2no -wan3s -wan5sp -3wap -3warm -wart3j -war4to -wa4si -was5m -3wat -2wb -2wd -w4doo -wd3oom -we2at -we4ba -3wed -wede4 -we2d3i -we4d3r -wee5kla -week3r -wee4r -weer3o -wees4t -wee5ste -wee5str -wee3tj -we2g3a -weg1l -we2go -we2g3r -3weid -wei5s -we2k3a -4weko -we4k3r -wel3ed -wel3ee -wel3sm -we4mi -we2n -we3naa -wen3ad -we3ne -we4nem -wen4ka -wen3o -wer2g -wer4g3r -wer4k3l -werk3u -wer4s -2w3erw -we2s3 -3wet. -we4t3h -we2t3j -wezens5 -wezen5t4 -2w3f -w1g -4w1h -w4hi -wie4t -w3igd -w3igi -w3igt -3wijd -wij4ka -wij4s -wijs5m -wi2k -wik5l -3will -3wim -w4in -win4d3r -wing5st -2w5inr -winst5a -wis5m -wi4t3h -wit3j -w1j -2w1k -2w1l -w1m -2wn -wn4i -w3no -w2oe -woei2 -woe3ie -woel3a -woe4s -woest5a -woes5te -wo2l -wol3a -wolf2 -wolfs5 -woor4d5r -wor4ge -worg5eng -4wot -w1p -wper2 -wpers3 -w3ru -2ws -ws3a -ws4k -ws5ke -w3s4p -w4spe -w5spel -ws4t -w1sta -w3ste -w3sto -2wt -wte5ri -w3to -w3tr -w1w -2x -x3ad -xamen5t -xan3 -xan5t -x1c -xe3a -xe3ro -x3f -x1h -4xiet. -x3ing -xi4s4 -xis5m -xi3st -xi5sta -x3l -xo3s -x1p -x1t -x2t3ak -xtie4 -x3w -xy5 -y1 -y2a. -y4ah -y3au -yber4 -ybert3 -yce3 -yd4r -ydro3 -y4in -yis5m -y4l -ylar3 -y5lee -yl3et -y5li -y5lo -y5lu -y2m -y3me -ym2fl -y3mo -ym5pa -y3mu -y2n -y3na -y4n3an -yn3er -y3ni -y3no -yn3t -ynx5 -y5oo -y4pew -y3ph -y5r4e -y5ri -y5ro -y4s2 -y5sa -y5se -y5sf -y5sh -y5si -ys5m -y5so -ys3t -ys4to -y5sy -yto3 -1z -2z. -zaar5t -za2k3a -zan4d3a -zan4dr -zar5t -za5s4 -2zb -3ze -zee5le -zee3n -zee3s4 -zee3tj -zeg4sl -zel5dr -ze3mo -zen4d3a -zene4 -zen5k -ze4nol -zen4t3j -ze4r3a -ze3ro -zer4sl -zer4sp -ze4s3e -ze2s5m -zes5tal -ze3ste -ze4tan -ze4ti -ze4tj -ze2t3r -ze3tre -zeun3 -zeve2 -zeven3 -3z2i -ziek3l -ziel4s -zi2ga -zij5s4 -zin4k3l -zin4sl -zin4sm -zis5m -zit3j -zi2t3u -4zk -2zm -zo4a. -zoet3j -zo3f2 -zoï4s -zome4 -zo4nek -zon3sf -zo3s -zo2t -zot3h -4z3r -2zs -zus3 -2zv -z4w -zwe2m -zwenk5a -4zz -} -% Exception list for GB90 -\hyphenation{ -aan-pers-te -acht-en-der -acht-en-ders -acht-en-der-tig -acht-en-der-tig-ste -ant-arc-tis -be-scherm-en-gel -be-scherm-en-ge-len -don-der-aal -drie-ster -gast-rol-len -ge-laats-trek-ken -han-dels-taal -ket-ting-ste-ken -lands-taal -lui-ste -mi-nis-ters-por-te-feuil-le -mi-nis-ters-por-te-feuil-les -moet-je -pa-ling-ste-ken -schel-linkje -spie-gel-ei -ti-chel-aar-de -vier-en-der-tig -vier-en-der-tig-ste -} -\endinput +% File: GB90.8pat
+% Author: Piet Tutelaers (rcpt@urc.tue.nl)
+% Version: betarelease 0.9 (May 1993)
+% Purpose: 8-bit hyphenation patterns for TeX
+% These patterns are generated from the `Groene boekje 1990' (GB90) with
+% the following goals in mind:
+% - provide 8-bit patterns
+% - allow hyphenation in first two and last three letters
+% - inhibit hyphenation before a `trema'
+% - don't hyphenate words in a changing syllable (me-nuu.tje)
+% - don't hyphenate words with different hyphenations (buur.t.je)
+%
+% extra symbolen ä ç è é ê ë ï î ö ü
+\catcode`\ä=11\uccode`\ä=`\Ä\lccode`\ä=`\ä % "a
+\catcode`\ç=11\uccode`\ç=`\Ç\lccode`\ç=`\ç % c,
+\catcode`\è=11\uccode`\è=`\È\lccode`\è=`\è % `e
+\catcode`\é=11\uccode`\é=`\É\lccode`\é=`\é % 'e
+\catcode`\ê=11\uccode`\ê=`\Ê\lccode`\ê=`\ê % ^e
+\catcode`\ë=11\uccode`\ë=`\Ë\lccode`\ë=`\ë % "e
+\catcode`\ï=11\uccode`\ï=`\Ï\lccode`\ï=`\ï % "i
+\catcode`\î=11\uccode`\î=`\Î\lccode`\î=`\î % "i
+\catcode`\ä=11\uccode`\ä=`\Ä\lccode`\ä=`\ä % "a
+\catcode`\ñ=11\uccode`\ñ=`\Ñ\lccode`\ñ=`\ñ % ~n
+\catcode`\ö=11\uccode`\ö=`\Ö\lccode`\ö=`\ö % "o
+\catcode`\ü=11\uccode`\ü=`\Ü\lccode`\ü=`\ü % "u
+\catcode`\'=12\lccode`\'=`\'
+%
+\patterns{
+.aan5
+.aarts5
+.a4b5l
+.acht5end
+.a3da
+.a2f3
+.af5ra
+.af5s
+.agent5j
+.a4l3ee
+.a4l3ev
+.alk4
+.al5ko
+.al5m
+.a2lo
+.al3om
+.ame3r
+.am5p
+.a3nac
+.an5d4
+.a4nes
+.ang2
+.a4nis
+.an5th
+.a5o
+.a1p2a
+.a3pl
+.a1pr
+.as3
+.a4s5l
+.a5sti
+.a4su
+.ave5n
+.b4
+.be3la
+.be5l4u
+.be5ra
+.bijs4
+.bi4l
+.bli4
+.boot5j
+.box3
+.co5kes.
+.corre5s
+.d4
+.dan5ste.
+.de2k
+.dek3l
+.des5p
+.deu4r
+.dis5
+.du4w
+.ede4
+.edel3
+.ee4s
+.eest3
+.eet3
+.ei3l
+.e2kl
+.e3kw
+.en5th
+.e3p4
+.er3a
+.er2f
+.e4r3in
+.ert4
+.erts3
+.e4s3
+.es5c
+.es5m
+.e5so
+.es5pr
+.e3th
+.eus5
+.exi5
+.f4
+.fes1
+.g4
+.gaat5
+.ge5la
+.ge5le
+.ge3lo
+.ge5n4a
+.ge5ne
+.ge5no
+.ge5ra
+.ge5re
+.ge5ro
+.ge3s
+.ge1t
+.goes5
+.go4m
+.goot5
+.hemi5
+.ho4lo
+.i2
+.i3d
+.ij4sp
+.im5p
+.in3
+.in5d
+.in5g4
+.in5ktv
+.in5kw
+.ins4
+.int4
+.in5ta
+.i3re
+.is3c
+.is5m
+.i3t
+.j2
+.jaar5
+.k4
+.kee4
+.ke3ra
+.ker4k5l
+.kerk5u
+.koot5
+.kop5l
+.kun2
+.l4
+.le4b5
+.le4g3o
+.le4g3r
+.lemmet5j
+.le2s
+.lof5
+.loot5
+.lo4s3
+.lui5tj
+.m4
+.ma4len
+.mar5che.
+.me5no
+.merk5l
+.mijn5i
+.moot5
+.mo4s
+.n4
+.naat5
+.na5s
+.ne4t3j
+.noot5j
+.oa5
+.oe4r
+.oes5
+.ol3f
+.o2m1
+.o2n
+.on3a
+.on5d
+.onde4
+.o4n1e
+.on5g
+.on1o
+.ons4
+.on5sp
+.on4t3
+.on5to
+.oor5t
+.o5pak
+.o4p3ar
+.o4p3at
+.o4pet
+.o4p5l
+.o2p3o
+.o4p5r
+.op1s
+.o3ro
+.or1t
+.o4s3
+.p4
+.pee5tj
+.pe4k3l
+.per5spec
+.pij5t
+.poort5j
+.po5te
+.r4
+.raads5le
+.raat5
+.rai2
+.ran4d
+.rand5a
+.rens4
+.re5t
+.rie2
+.riet3
+.rijk5a
+.ring5s4
+.roe5t4j
+.s4
+.sa4p3
+.see3
+.seig5
+.se3m
+.servi5c
+.se4s
+.ses5t
+.set3
+.side3
+.si4s
+.slee5tj
+.smids5e.
+.spoor5tj
+.st4
+.t4
+.taart5j
+.te2a
+.te4f
+.tek2
+.te5na
+.tent5j
+.te4ra
+.ter4p5a
+.te2s
+.ti2n
+.tri5s
+.ui2
+.uit1
+.u3ra
+.u3ro
+.u3s
+.vaat5j
+.ve4r1
+.vie2
+.vrij3
+.w4
+.wee4
+.weet3
+.we4l
+.wel3a
+.wel5in
+.wer2
+.wet4s
+.win4s
+.y2
+.zet3a
+.zet3j
+a4a4
+aad1a
+aad3o
+aad3r
+aaf3a
+4aag
+aag3a
+aag5e
+aag3r
+aak3e
+aak3r
+aal5a
+aal1e
+4aal5k
+aal1o
+aal5ste
+aam1a
+aam3o
+aam5p
+aan1
+3aando
+3aandu
+aan5g
+3aanj
+aan5k4
+3aann
+3aans4l
+aan5sp
+3aanv
+aap3i
+aap3o
+aar3a
+aard5as
+aar4du
+aar3e
+aar3i
+aar5k
+4aarn
+aar1o
+aars5te.
+4aart
+aar4ton
+aar3u
+aas5c
+aas5e
+aas5m
+4aast
+aat3a
+aat5e
+aat3h
+aat4j
+aat3o
+aat1r
+a2b
+abak4s5
+a5be
+abet3j
+ab3ijz
+ab5lu
+3abon
+a4b3ru
+4ac.
+4ace
+ace3a
+2ach.
+a3cha
+4a1che
+4a3chi
+a1cho
+a1chr
+2achs
+a1chu
+4ack
+2acl
+ac5le
+2aco
+2acr
+4acs
+4acu
+ad2a
+ad5aa
+ad3ac
+ad3ad
+ad3ak
+ad5al
+3adap
+ada2r3
+ade5le
+ades4
+ad3ete
+2adh
+ad4i
+a4dj
+3adju
+ad3oks
+3adop
+ad3ov
+ad3ro
+ad5sla
+ads5tra
+ad3ui
+ad3un
+ad1w
+4ady
+aege4
+ae3k4
+a3el
+aes3
+ae3u
+af3aa
+a3f4as
+af5de
+af5dw
+afee4
+afe4la
+af3ex
+3afgi
+4afi
+af3l
+a2foe
+afon4d
+af3r
+af5so
+af5sp
+aft4a
+3aftr
+a2f3u
+ag3ad
+ag3ap
+agee5t
+agen5a
+agen4tj
+ager4s
+a4g3ind
+a4g3ins
+ag1l
+ag3of
+ag3ord
+ag4re
+ag5reg
+ag5rei
+ag5ret
+ag3roo
+ag3s2a
+ag3sl
+ag4sle
+ag4sli
+ag3spa
+ag1s4t
+ag3ui
+ag3ur
+a2g3uu
+a1h
+a5hi
+ai5b
+ai1e
+ai4es
+a1ij
+ai5k
+ai4o.
+ai3s4
+ai5sc
+ai4s5l
+aissi5è
+ai5sti
+ai3tj
+4aï
+aïn4
+aïns5
+a1j
+ak3ag
+ak3am
+ak3ap
+a2k3ar
+a3ke
+ak3een
+ak3etu
+a4k3ez
+4akh
+ak3ink
+3akko
+a2k3l
+ak3n
+ak4ni
+a3kof
+ak3ond
+ak5opl
+a3kos
+ak3ri
+ak3ru
+4aks
+aks5m
+ak5spe
+a2k3u
+ak1w
+a1la
+al4aa
+a4l3ach
+ala3d
+al3afs
+a3l4ag
+4ald
+a1le
+al3eff
+ales4t
+ale5ste
+alfs5p
+al2gl
+alk5ei
+al4kla
+alk5sa
+alm4a
+al4m3ac
+a1lo
+alo2n
+alo3s
+al3ou
+a3loy
+al3sa
+als4ag
+al4s5m
+al2sn
+als3oo
+al4spr
+al4stem
+al5ster
+al4sto
+altaar5
+al3tha
+4a1lu
+al3uit
+alus3
+4am.
+a2m3ac
+am3adr
+1ambt
+a3me
+ament4
+ame5rad
+ame4u
+ameus5te
+4amm
+a5moe
+a4m3ol
+am3ove
+am5pe
+3ampè
+am4pl
+4ams
+am2so
+am4s5po
+a2m3ui
+a1na
+a3nad
+a3nap
+an3arc
+an3av
+an4dad
+an4d3ed
+an4dom
+an4doo
+an2dr
+and5rad
+an5dri
+an4dro
+and5roo
+and5sle
+ands5taal
+aneëi4
+a3nen
+an3est
+ane3us
+ang5sn
+angs4t
+a3ni
+ani4a.
+aniet3
+anij4
+an3ion
+a4n3isl
+an3iso
+4anj
+4ank.
+an4kaa
+4anken
+an2kr
+ank3ri
+a1no
+an3or
+ano3s
+an2sa
+an2sm
+an2so
+an3soo
+ans3or
+an4sp
+an4tac
+5antenn
+an3th
+an5to
+a1nu
+an3ur
+an3uu
+a3o
+a4o.
+a4o5b
+a4os
+aos3t
+a4ou
+a4oz
+aoze3
+4ap.
+4a3pa
+ap1ac
+a5pap
+a5par
+a4pas
+ap3as.
+ap3ass
+ap3eks
+ape5l4e
+a4pet
+ap5eten
+a1pi
+apijt5j
+ap3ijz
+ap1j
+ap4l
+ap5laa
+ap5lad
+ap5lak
+ap5len
+a5plu
+a1po
+ap3og
+apo5sta
+1appa
+4appo
+ap3ra
+ap5rac
+ap3re
+a5p4ris
+ap2s3l
+a1pu
+4ar.
+a3ra
+ar3amn
+a4r3app
+ara3s4
+ara5st
+5arctis.
+4ard
+ar2da
+ard3ac
+ard3ak
+ar5de
+ar4d3op
+ar2d1r
+ar4d5re
+ard3w
+a1r4e
+are3st
+are4t
+ar5eve
+ar3gh
+ar2gl
+ar3go
+a1ri
+arie4t
+arij3s
+ar4k3aa
+ar4kla
+ar2m3u
+4a1ro
+a3rok
+ar3oli
+4ar2s
+ar5sch
+ar5se
+ars3l
+ar5slie
+ar3sp
+ar5spe
+ar4spi
+ar4spr
+ars5tal
+ar4stek
+ars3tr
+ars5tra
+ar4t3ak
+art5ank
+ar4tap
+ar3tar
+4arte
+4ar4tj
+4arto
+art5oge
+art5ond
+art5oog
+ar4t3or
+ar2t3r
+ar3tre
+a3ru
+4arw
+a1ry
+a2s
+4asa
+as3aa
+as3af
+as3ak
+as3ap
+a3sau
+as3av
+as4cr
+as4e
+a4s3ec
+a4s3e3t
+a5sex
+a4s5h
+a4sin
+asi4s
+as5ki
+as5ku
+as3l
+a5s4laa
+a4sm
+as5me
+as5mi
+as5mo
+as4n
+as5na
+as3ob
+as3on
+as3oo
+as3os
+as3p
+as5pec
+as5per
+a4st
+as3ta
+as5ta.
+as5taal
+a5stat
+as3te
+as5te.
+as5tee
+a5steni
+as5ter
+as4th
+as5tie
+as3to
+ast5rem
+ast3ri
+a5stu
+a3su
+a3sy
+a1ta
+at1ac
+at3ade
+at3af.
+a4t5am
+at3ank
+ata5s
+atent5r
+ate4r5ad
+ate4r5ec
+a1th
+a5thali
+at3hu
+atië5r
+a2t3j
+at5ja
+at5jo
+a1to
+at3oog
+a1tr
+at1re
+at3rib
+at5ru
+at5sen
+at2sl
+ats3le
+ats3lo
+ats5m
+at4sna
+at4sp
+ats5pa
+at5spi
+at5spl
+at5spo
+at3sta
+at4sti
+ats5tol
+at4t3u
+a1tu
+a2t3ui
+at5w
+2au
+au5b
+au3dr
+3aug
+au3ko
+aun3t
+aure3u
+aus3t
+au3sto
+au3t2
+auter5i
+3auto
+auts5
+au4wij
+ava3s
+aver3a
+ave3re
+ave3r4u
+4avi
+a4v5l
+4avot
+a1w
+aze3s
+3b
+4b.
+baar5tj
+babe4
+ba2di
+ba3gh
+5bak
+bak4sp
+bal4ka
+bal4t
+ba3n2a
+ban4kl
+ban4kn
+ban4kr
+bank3w
+bar3t
+bart3j
+ba3s4a
+bassi4
+4bb
+bba2t
+bbe4l5ee
+bbe4n
+bben3a
+bby5
+4bc
+4b1d
+5be.
+5bed
+be3d4a
+bed2w
+be5dwi
+be5dwo
+beet3
+be3fl
+5be3g
+bei3l
+bei4tj
+5bej
+be5kak
+bek4l
+5bel
+be4lex
+be5l4i
+be3l4o
+be5m
+5ben
+be3ne
+be3n4i
+5ber
+be1ra
+ber4g5af
+ber4gl
+ber4gr
+be1ro
+be4ron
+ber4ov
+be3ru
+5be1s4
+bes5ac
+be2sj
+bes5te.
+bes5tig
+5bet
+be1tw
+b3h
+b2i
+bi5bl
+bid3
+bi2du
+bie4t3j
+bij5d
+bij3k
+bij1p
+bij3s
+bijs5ter
+bij5tr
+bi4k
+bi5la
+bin4dr
+bin4t3j
+bir3
+bi5sa
+bis5m
+bi1tr
+4b1j
+4bk
+b4l
+blad5ij
+b5lap
+b5leg
+ble2s3
+b5lid
+5blie
+5blim
+5blo
+bloot5j
+4bm
+4b3n
+5bo.
+5boe
+boe4g3a
+boe4ka
+boek5s
+boe3st
+bo3fl
+5bog
+5boi
+5boï
+5bo2k
+bokje5
+5bol
+bo2m3a
+bo2m3o
+bo3na
+bonds3
+bont3j
+bo3nu
+5bool
+boon5
+bor4sta
+bor4st5r
+5bos3
+bo3sko
+bos5p
+bo2su
+5bot
+bot5j
+bot5sw
+bo2tu
+bou5ta
+bouw3s
+5box
+br4
+braad5s
+brei3s
+5bri
+bri4l
+bro4n
+bron3o
+4b1s4
+b5sc
+bsi3s4
+b2s5la
+b2s5m
+bsou4
+bs5s
+4bt2
+bt4s5
+5bu
+bune5t
+bu5ri
+bus3a
+buur4tj
+4b3w
+5by
+bys4
+4bz
+4c.
+3ca
+caat5j
+ca1ch
+ca3g2
+came3r
+ca3na
+cant4
+ca5ou
+ca3pr
+cas3
+ca5se
+ca5si
+cas1t
+ca3t
+cau3
+c5c
+3ce
+5ced
+cee4
+5ceel
+5cel
+ce3na
+cen5s4
+ce3ra
+ce3ro
+5ces
+ce3s4a
+ce2sn
+ce3s4t
+ces4u
+ce3ta
+ce4t3j
+cet3o
+1cé
+4ch.
+3chao
+3chec
+3chef
+5chef.
+5chefs
+4cheor
+2chep
+3cheq
+che5rin
+che3us
+1ché
+4chn
+chop4s
+2chp
+4cht
+4chw
+1chy
+3ci
+cier4s5
+ci1eu
+5cil
+ci5le
+ci3ne
+ci5nee
+cis5m
+ci3t
+ci5ta
+c4k3l
+c2k3n
+c4k3r
+c2ku
+3c4l
+cli3e
+c3n
+cno4
+3co
+co2at
+co2k4
+co3ka
+co3kr
+co3la
+5com
+con3g
+co3no
+con5t4
+4coo
+co3p4
+5copa
+corp2
+cor3s
+co3ru
+co3sti
+co3th
+4cout
+c3p
+1cr2
+3cre
+3cris
+croo3
+crus5
+csar5
+c3ste
+4c1t
+ct3afd
+c2t3h
+c2t3j
+c3t4o
+c4t5ond
+c5tor4
+c5tr
+ct3sl
+c2tw
+cty5
+3cu
+cu5b
+cus5t
+c3w
+3cy3
+1ç
+4d.
+1da
+5da.
+3daag
+d4aal
+d3aanw
+daar5e
+2d3acc
+5daden
+2d3af
+da3fr
+3dag
+da2g1a
+da4g3ed
+da4g3et
+da4g3l
+da4gor
+da2gr
+da2gu
+3dai
+4dakk
+da4k5r
+4d3ala
+d4ale
+4dalm
+d2ame
+dam5pl
+3dan
+da4n3a
+d3anke
+dan4kl
+danoot5
+dan4sm
+dans3p
+dan4st
+2d1ap
+4d3ape
+2dar
+da4ra
+4d3arb
+dar4mo
+dar3s
+4dart
+3das3
+3d4at
+da3ta
+da2tr
+5dau
+2db
+dboot5
+dbou4w5i
+2d1c
+dcorre5
+2d5d2
+dde5la
+dder5al
+dde3s
+3de
+5de.
+de3c
+de3d
+5deda
+d4eden
+dee2g3
+dee4r
+dee3t
+de3fl
+d3eg.
+5dega
+5dege
+2d3egg
+de3gl
+4dei
+d3ei.
+d3eie
+d3eig
+d3eis
+deï4s
+de3ke
+4d3ekon
+de4lak
+4delas
+del5do
+del5dr
+del5eek
+de5ler
+de4let
+de4lev
+del5fr
+del4sp
+dels5taa
+del4str
+4demai
+4d3emm
+dem4o
+de3n4ac
+den3ep3
+4d3engt
+de2no
+den3oo
+den5sm
+dent5jes
+5denvl
+de3rab
+de4rad
+de3rak
+de3ram
+de3ran
+de3r4ap
+de3ras
+de4ras.
+5derb
+der5ede
+der5eed
+de4r3ei
+de4rem
+de4r3ep
+derep5e
+de4ret
+de5rij
+de4r3im
+der3og
+der3on
+5ders
+der4s5om
+4d3erts
+de5se
+de3sh
+de4si
+de2sn
+de2so
+de4sp
+des3po
+de5spr
+de3sta
+de3ste
+de5stic
+de3sto
+de3t4
+4d3euro
+de3us.
+de3uss
+deu4tj
+4dexa
+4dexp
+3dè
+2d1f
+2d1g4
+d3ga
+d3gi
+2d1h
+d3he
+dheer4
+3dhi.
+dhis5m
+1di
+dia3s4
+die4tj
+di1eu
+3dig
+di2ga
+dij4kr
+2d3ijz
+di2k3o
+di4k3w
+di5l4e
+di3na
+3ding.
+d5ingel
+d5inh
+d5inr
+4dins
+4d3inw
+2d3inz
+dip4
+di4s
+di5se
+dis5m
+dit3j
+2d1j
+3dji
+2d1k
+2d3l
+2d1m
+2d5n
+1do
+5d4o.
+do5bo
+3doe
+4doef
+doet3
+5doi
+2doks
+5dole
+3d4om
+d5oml
+do2m3o
+dom4s
+do3no
+2d3on4t
+dont3e
+donyx3
+door5tj
+4d3opb
+2d3opl
+4dopv
+d3opz
+2d3org
+dors5m
+dot5j
+2dov
+2d3p
+dpren4
+1dr2
+d3raap
+3drac
+d3rad.
+4d3rand
+4drap
+d1rec
+d3red
+3d4ree
+5dreef
+5d4res
+d4rev
+3dreve
+d3rich
+5drif
+dri3ga
+d3rijd
+d3rijk
+d3rijm
+d3rijs
+5drijv
+d4rin
+5dris
+d3rit
+d4roe
+4d5roei
+d5roer
+3drog
+2d3rok
+4drol
+3d4ron
+d5rond
+4d3rook
+4d3roz
+drug4s
+d3ruit
+5druk
+4d3rus
+2ds
+ds1a
+dsa4d3
+d4s3ed
+d4s3ee
+ds3h
+dsi4g
+dsig5a
+ds3il
+ds3is
+ds3j
+ds4jo
+d4sl
+d5slag
+ds4lan
+ds3li
+ds4lim
+ds3lu
+ds5mal
+d3smee
+ds5mo
+ds3na
+ds3neu
+ds3noo
+ds3on
+ds3op
+ds3or
+d1sp
+d5spak
+d4spal
+ds5par
+d3s4pel
+d4s3pet
+d4spon
+d5s4pro
+ds4t
+d1sta
+d4s5tab
+d3star
+d3ste
+d5ste.
+d4stek
+d5sten
+ds5th
+d3sti
+d1sto
+ds5trem
+d2su
+ds3ur
+ds3uu
+d3sy
+2dt
+d1ta
+dtaart5j
+d1to
+d1tr
+d3tu
+1du
+du3e
+2d3uil
+dui4t
+5duite
+d3uitg
+du3o
+dus5
+dut3j
+2dv
+dvee3
+dve5na
+2dw
+d3wac
+3d2wei
+d3wek
+5dwel
+d3wez
+d3wig
+d1wil
+4d1wo
+3dy3
+dys3e
+dy5st
+2dz
+e1a
+eaan5
+e5ac
+ea3da
+eagent5j
+e2ak
+e3akt
+e5alf
+eal3s4
+e3amb
+eam5p
+eang3
+e3antw
+e3a5o
+e5ap
+e5ard
+eate4
+eb3ac
+e5br
+3ecd
+e1cha
+e1che
+e5chen
+ech3es
+e1chi
+e3cho
+echts5o
+e3chu
+e4c5le
+ecorre5
+3ecz
+e1d
+e3d4ac
+e3d4am
+edans5te
+e5d4as
+edek4l
+ede5rog
+ede5spe
+edie5tj
+4e3do
+edoet4
+edoe5tj
+ed3opv
+e4d3ov
+e3dr
+ed3rod
+ed3rol
+ed4so
+ed5sp
+ed1st
+e4dw
+e5dwan
+ee3a
+ee2d3a
+ee5de
+ee5do
+eed3w
+ee3ee
+ee2f
+eef3r
+eeg1l
+eeg3ou
+ee5in
+ee2k
+ee3ka
+ee5kaa
+eek3ak
+eek5all
+eek1e
+ee3ki
+ee3kl
+eek3lo
+ee3kr
+eek3ro
+eek3ur
+eek3uu
+eek3w
+ee2l
+eel1a
+eel4ee
+eel3ei
+eel5k
+eel3og
+ee3loo
+ee3lop
+eel5so
+eel4su
+ee3lu
+eel3ur
+eel3uu
+4eem
+ee5mo
+ee2n
+een3aa
+een3ad
+een3ar
+een5dr
+een3e
+een5g4
+een5k
+eep3an
+ee5pe
+eep3lo
+eep3ru
+eep4sc
+eep4st
+ee2r
+eer3aa
+eer3al
+ee3ram
+ee3ran
+ee3re
+ee4r3ee
+ee5reg
+ee4r3i4
+eer5k
+eer2o
+eer3og
+eer5oom
+ee3rov
+eers5ag
+eer3sm
+ee3ru
+ee2s
+ee3sj
+ees3lo
+ee3smu
+ee3sn
+ee3soo
+ee3sp
+ees3po
+ees5tek
+ee3sto
+ees3u
+ee2t
+ee3tal
+eet3h
+eet3og
+eet3oo
+eet5or
+ee3tr
+eet3ra
+4eë
+eë4ta
+e3fas
+ef3az
+e3fe
+ef3ei
+ef3ij
+ef3int
+e3flu
+e1fr
+ef4ra
+ef5raa
+e3fran
+ef2s
+ef3sm
+4ega
+eg3all
+egas2
+eg3as.
+ege4las
+egel5ei.
+egel5ov
+ege4raa
+eger5on
+e4g3erv
+e3gi
+eg3ijz
+egiste4
+eg3lui
+3ego.
+eg3ong
+e2g3os
+eg3s4
+eg5sn
+e4g3ur
+e4g3uu
+e5h
+ei5b
+eids5e.
+eids5m
+ei1e
+eie3s
+ei3gl
+e1ij
+ei5kl
+ei3kn
+ei5kr
+eik3s
+ei3la
+ei2lo
+e4in
+ei3n4ac
+ein4d5oo
+ein4dr
+ein5k
+ein5sl
+ei4s3a
+eis5a.
+ei3sh
+ei3sla
+ei3s4lo
+ei4so
+ei4s4p
+ei5spr
+ei3s4ta
+eis5te.
+ei5s4tel
+4eit
+ei5te
+ei3tj
+ei4too
+eit4s
+eive4
+4eiz
+4eï
+e1j4
+ek3aan
+ekaart5j
+ek5af.
+ek3al.
+ek3ang
+e5kaz
+eker4s
+ek5eter
+e4kez
+ek3eze
+ek5loos
+ek3net
+e5kni
+e3ko
+ekoes5
+ek3oss
+ek3rol
+e5kru
+ek3sa
+ek3ske
+eks5m
+ek3sn
+ek3sp
+ek4stel
+e1kw
+e1la
+el1ac
+e2l3af
+el3akk
+el3al
+el3art
+e3las
+el3as.
+e2l3au
+e3laz
+el5azi
+el4dri
+e3le
+e5le.
+e4l3eeu
+el3eff
+el5eier
+e5len
+el4er
+e4l3ert
+el3eta
+el1fl
+el4fr
+elf5sp
+e3li
+e5lig
+e4l3ind
+el5inkt
+el3ins
+eli3pl
+3elix
+el4kon
+el3kr
+elk3sl
+el4k3ur
+e1lo
+e3lob
+e5loep
+el3oes5
+e2l3ol
+el3oms
+el5ond
+el3ont
+el3oog
+e5loos
+el3opg
+el3oph
+el3ops
+el3opv
+e2lor
+el3ord
+el5ore
+el3ove
+e5loz
+el3smi
+el3sta
+el3su
+el5tje.
+e1lu
+el3uit
+em4a
+em5aar
+em3ac
+em5afs
+3emai
+e5man
+4emb
+e3me
+eme4las
+eme4tj
+emf2
+emie4tj
+em3ins
+em4op
+em5opn
+em3org
+em3ov
+em5po
+em2sl
+em1st
+e1na
+en3aap
+e4n3aas
+e2n3ab
+en1ac
+en3ak
+e2n3al
+e4nante
+en3ap
+e5nari
+e2n4as
+en5asi
+en1av
+e2n3az
+enci4
+end3ac
+ender5as
+5enderti
+en5dro
+end5sl
+en4dur
+e5ne.
+en3ech
+e3nee
+en3eed
+enee5t
+en3eg.
+en3egg
+en3ei
+en3eko
+en3ema
+e5nen.
+e4n3ent
+e2nep
+en3epo
+en3erf
+e5nes
+e5net.
+en3ete
+ene4t3j
+e5nett
+engs4
+enier4t
+enin5gr
+eni4s
+enk4l
+en4kre
+enk5tr
+en5kwe
+3enneg
+e1no
+e4n5oc
+en3of
+en3oli
+enoot5
+e4n1op
+en5ops
+en3ord
+eno5s4
+e3not
+en3ov
+en5sch
+en3s4fe
+ens3le
+en4sli
+en4smi
+en4sna
+en5spe
+ens5pot
+en4stij
+enst5ijv
+ens3uu
+en4t4ac
+en3tei
+ente5st
+en1t2h
+en5tl
+ent4r
+ent5rol
+en5tru
+en3tw
+e1nu
+en3ui
+en3ur
+5enveer
+3envij
+3enzes
+3enzev
+e1o
+e3oli
+e3olo
+e5om
+eo3p4r
+eo5ro
+eo5t
+e1pa
+ep3ac
+ep3app
+ep3asp
+ep5een
+e1pi
+3epid
+epiet3
+ep3ijs
+ep3ijz
+epis2
+ep1j
+e1pl
+ep3lod
+ep3lus
+e1po
+e4p3og
+ep3oog
+ep3ork
+e1pr
+e3pra
+ep2s
+eps3j
+eps3l
+ep4sta
+eps5taa
+eps5tal
+e1pu
+ep3uit
+e3ra.
+e1raa
+er5aalm
+er3aan
+e4raap.
+e4r1ac
+e5raco
+e3rad
+er3af.
+er3afv
+e3rag
+e1rai
+e4r3all
+er3ama
+er3ana
+e3ranc
+e5rapi
+er3app
+e3rare
+e1rat
+er3atr
+e3rau
+e4r1av
+er3azi
+er5c
+er3d2a
+er5de
+er5di
+erd4o
+er3d4w
+e1re
+e3re.
+e3rec
+er5editi
+er5eers
+er3eet
+er3eff
+er3eg.
+er3egd
+er3egg
+er3egt
+er3eie
+er3eig
+er3eil
+er5eila
+er5eind
+er3ekw
+e3rel2
+e4r5emm
+e3rend
+ere4ne
+eren5eg
+er5enen.
+eren5ta
+er3eq
+e3res.
+er3esk
+e3ress
+erest5r
+ere4t3j
+e4r3ets
+e2r3ex
+erg2l
+e3ri
+e5rie
+e5rif
+e5rig
+e5rij.
+e5rije
+er3ijl
+e4rijz
+e5rik
+erim3a
+er5inkt
+er3ins
+er3int
+e5rio
+e5ris
+ermij5ni
+e3ro.
+e3rob
+er3oc
+e1rod
+e1roe
+eroe3t4
+er5oev
+er3of
+e3rok
+e3rol
+er3oli
+er3om
+er1on
+er3oog
+e3rook
+e3roos
+er1op
+e2r1or
+e3ros
+e5rose
+e3rot
+er1ov
+e3roz
+e3rö
+errie5tj
+5errillat
+er5tan
+er5te
+ert4h
+er3the
+er5to
+erts5l
+er5t4u
+er1tw
+e1ru
+erug1
+er1ui
+erui5tj
+e2r3ur
+er3uu
+3erwt
+e3ry
+e2sac
+es3ag
+es3al
+es3ar
+es3av
+es4ch
+4ese
+es5emb
+e4s3et
+es3ex
+es5hu
+e5s4id
+es3il
+esis4
+e3sjo
+es5ken
+e3sla
+es3lak
+es3lam
+e3sle
+es3lij
+e3slu
+e1sm
+es3noo
+e1so
+es3ore
+e1sp
+e4spen
+e3spl
+es4poo
+e5s4por
+es4pr
+e4sprie
+espuit5j
+essi4s
+es4sn
+e3staa
+e3stap
+es3tat
+es3te
+e4ste.
+es5teer
+est5ei.
+es4tek
+es5teli
+es5temo
+e4s5ten.
+e5sterre
+e4s5tes
+e3s4tic
+e4stig
+e3stru
+es3uu
+e1sy
+e1ta
+e3ta.
+et3aan
+et3ac
+et3ad
+e3taf
+3etag
+e3tak
+e3tan
+et3art
+e4t3au
+e2tav
+e3te
+et3ein
+4etel
+et5emb
+et3emm
+et3emu
+e5t4en
+etens5u
+eten5tj
+ete3r4a
+eter5sm
+ete3s4t
+et3hu
+et3ins
+e5tja
+e1to
+e5toc
+et5oli
+e3ton
+e3top
+et4or
+e1tr
+et5rec
+et4rek
+et3rim
+e3tru
+et3rui
+et3sl
+et4sla
+ets5lap
+et2s3n
+ets3o
+et4sp
+et5spi
+ets3pr
+et4sta
+ets5tan
+et4stek
+et5s4u
+e1tu
+et1we
+eu5b
+eu3c
+eu5do
+eu1e
+eug4dr
+eu2ka
+eu4ler
+eum3aa
+eu2na
+eun3tj
+eu4rij
+eu1ro
+euro3p
+eus4t
+eu3ste
+eu3tj
+eu5tr
+2euw
+eu4w3e.
+eu2w3i
+eve5n4aa
+3evenr
+e1w
+e5wa
+e5wh
+e5wi
+ew3sk
+1exam
+3exeg
+ex3in
+1exp
+ey3
+e3ya
+ey5sp
+4eza
+4ezen
+ezen4s
+eze5tj
+é3a
+é3d
+édee4
+é3h
+é3r
+éren4
+é3t
+étee4
+è1
+ê1
+4ë
+ë3c
+ë1d
+ëde3s
+ëe4
+ëen3e
+ë3h
+ëi1e
+ë3k
+ë1l
+ë3na
+ënt4
+ënt5h
+ën3tw
+ë3p
+ë1ra
+ë1re
+ë3ri
+ë1ro
+ëro3s
+ë2s5
+ë1t
+ëven4
+ëve5na
+ë4venr
+ëxis5
+2f.
+1fa
+f3aanb
+f3aap
+f4aat
+2fac
+face2
+f1ach
+f4act
+3facu
+4fad
+f3ang
+fant2
+fan4t3j
+fants3
+2f3ap
+f3as.
+fa5st
+3fau
+2fb
+f1c
+2f1d
+fd4an
+fdan5ste
+fde5l
+fde5sp
+fd4i
+f2d3in
+fd5ins
+fd3of
+f3dra
+fd3rek
+fd3rol
+f3dru
+f3dw
+fd2wo
+1fe
+fede3
+f3een
+5fees
+feest5r
+fee3tj
+fel5aan
+fe5laar
+fel5fr
+5fenda
+fe3ran
+fe4r3et
+fe3ro
+fes3
+fe4t3j
+2fex
+3fé
+1fè
+4f1f
+f5fe
+ffs4
+ff3sh
+f1g2
+fge3la
+fge5n
+fger4
+4f3h
+1fi
+3fib
+fi1ch
+fi4e
+5fig
+2f3ijz
+fil2m
+4fint
+5fir
+3fi4s
+fis5m
+f1j
+2f1k
+4f3laa
+f1laf
+1flau
+f3lene
+f3ler.
+fle2t
+flet3j
+f3lez
+2flie
+4flij
+f4lip
+f2lit
+f3lok
+fluit5j
+2f1m
+f1n
+1fo
+foe5d
+2f3of
+f3og
+3fok
+2f3oms
+f4ona
+fonds5l
+fo3no
+fon3t
+f1oog
+f3oom
+2fo2p3
+3f4or
+fo5re
+fort3j
+fo3ru
+fo3sk
+5fot
+2f3oud
+f3ov
+fox3e
+2f5p4
+fr2
+f4ras
+f3rek
+fre4t3
+frie4t
+friet5j
+f4rik
+f4rod
+2f1s
+fs3an
+f3sc
+f5sch
+f4s3cr
+fsho4
+f3sl
+f4slap
+f4s3led
+fsleet5j
+fs5mu
+f3sn
+f4so
+fs3oe
+fsoes5
+fs3on
+f3s4p
+f5spe
+fs4t
+f3sta
+fst3as
+f3ste
+fste4m3
+f3sti
+f3sto
+fst3oc
+f5stok
+f4ston
+f3stu
+4ft
+f1ta
+ft3ac
+f5tand
+ft3art
+ft3h
+f1to
+f1tr
+f1tu
+f5tui
+f3tw
+1fu
+fu4ma
+3f4un
+fu3ro
+2fv
+2f1w
+3fy5
+2fz
+4g.
+1ga
+3ga.
+g4aal
+5gaar.
+gaar5tj
+g4aat
+2g1ac
+4g3afw
+2g3ah
+ga3la
+ga4l3ap
+ga5lo
+g3alt
+3gam
+3gan
+gan5d
+gan4s3t
+gans5te
+gans5tr
+ganti4
+g4ape
+3gar.
+g4are
+3gars
+4g3art
+gar5tj
+ga4s
+ga5sko
+ga5sla.
+ga3sli
+ga5slo
+gas3o
+gas3tr
+gast5rol
+3gat
+3gaw
+2gb
+2g1c
+2g1d
+g5de
+g4d3im
+1ge
+5ge.
+ge3ad
+ge3ak
+ge5al
+ge4ari
+ge5aro
+ge3au
+4g3eb.
+ge1c
+ge3d2
+ge5da
+ge5de
+ge5dr
+ge5dw
+gee4
+gee5si
+geest5r
+geet3a
+ge3f4
+4g3eff
+ge5g4
+gege4s
+g3eik
+geit3j
+ge5ka
+ge5ke
+ge5ki
+ge5kl
+gek4n
+ge3kw
+g4el
+gel5as.
+gel5ass
+gel4d3a
+gel5eg.
+gel5egg
+ge4leie
+gel4o
+gel5oor
+gel3sl
+ge3ma
+ge3m4o
+gems3
+3gen
+5gen.
+ge3n4az
+ge3ne
+ge4n3ed
+gen5end
+gen4er
+4g3engt
+gen5k
+4gensm
+gen4tr
+gent5ra
+ge2ol
+ge5p4
+3ger
+ge1ra
+ger5aap.
+ger4ap
+ger5ape
+ger5as.
+ger4d3r
+ge3r4e
+ge5ree
+ge5reg
+ge5rek
+ge4r5eng
+ge5ri
+ge1ro
+ger4of
+ger4on
+ger5sc
+ger4sp
+4g3erts
+ge3r2u
+ge1s4
+ge5sa
+ge5sc
+ge5se
+ge3sh
+2gesk
+ge5sl
+ge3sn
+ge5so
+ge5spend
+ges5te.
+ge5sto
+ge5sw
+3get
+ge5t4a
+gete4s
+ge5t4i
+ge3tj
+get4r
+ge3ts
+ge5t2w
+ge3ui
+3gev
+ge3x
+1gé
+3gè
+2g1f
+2g3g
+2g1h
+g4her
+1g2i
+gi4ee
+gie4r3a
+giet5s
+gi1eu
+gi2f
+2gij
+4gijz
+gis5m
+2g1j
+2g1k
+g1lam
+1g4la4s5
+g3lat
+3g4laz
+3g4le.
+glee5t
+g3len
+2g3lep
+g3les
+3g2lic
+g3lice
+3g4lië
+g2lim
+3gloe
+g3lof
+3g4lofo
+3glom
+4g3lon
+g3lop
+g2los
+g4lot
+3g2ly
+2g1m
+gmaat5j
+2g1n
+g3na
+gne4t3j
+gnie4t5j
+g2nos
+1go
+go2a
+go5b
+go2do
+god4s3
+gods5t
+2goef
+2gof
+4g3oh
+4g3oli
+go2ma
+g3oml
+2gong
+4g1ont
+2g3oor
+2g3op
+g5ops
+4gore
+gor2s
+go3sk
+gos3t
+gou4d
+goud5ee
+2g3ov
+2g3p
+1gr2
+3gra
+g4rad.
+5graf
+gra2m
+g3ramp
+gras5
+5grav
+2g3red
+gree4
+greet3
+2grem
+g4ren
+gren4s
+gre4s3
+3greu
+grie4t5j
+g5rijd
+g5rijk
+g5rijm
+g5ring
+2g3rit
+2g3riv
+5gron
+groot5j
+g3rou
+g3roz
+2g3rug
+g3ruim
+g3rup
+2gs
+gs1a
+g5sal
+g4s3ar
+g3sc
+gs4ch
+g5scha
+g2sci
+g4sco
+g4s3cr
+g4s3ed
+g4s3ei
+g4s3ek
+gseksa4
+g4si
+gs3ij
+gs3in
+gs3j
+gs4ke.
+gs4ken.
+g2s4l
+g3sla
+g5sla.
+g5slang
+gs5las
+gs5lec
+gs5leg
+gs5let
+gs5leu
+gs5lic
+gs5lie
+g3slo
+g5sloe
+gs5lok
+g5slot
+g4sma
+g4sn
+gs3na
+gs3ne
+g5s4no
+g2s1o
+gs3p
+gs4pa
+gs5pak
+gs5par
+g3s4pe
+g5spee
+g5spel
+g5spet
+g3s4pi
+gs1pl
+g3s4poo
+g3s4por
+g3sta
+gs5taal
+g4staan
+gs3tab
+g4st3ap
+g3ste
+g5stee
+gs3tek
+g5stel
+gs4ten
+gs5tend
+g5ster.
+gs5terr
+g5sters
+gs3th
+gs4ti
+g3stig
+gs5tij
+g5stof
+g5stok
+g4ston
+g5stond
+gst5ons
+gs3tro
+g3stu
+g2s3u
+gs5w
+2gt
+g1ta
+g2t3ap
+gtes4
+gte3st
+g1to
+g1tr
+g1tu
+1gu
+3gu.
+gu5a
+gu4e
+2guit
+gu4lu
+g3uri
+gus3
+2gv
+2g5w
+1gy
+2gz
+2h.
+haar4s
+haar5tj
+haf4t3u
+ha2kr
+hal2f
+4halie
+han5ga
+han4sl
+ha5o
+hap5r
+hap4sp
+har4t3a
+hart3j
+har4t3o
+hart5sl
+ha2t3r
+2hb
+h3c
+2hd
+h2e
+4hea
+3hech
+4hee.
+hee4k3r
+hee4lo
+heeps5c
+hee3tj
+he4f
+hef4fl
+hei4tj
+hei5tr
+heï4s
+he2k3a
+he2kl
+he2k3w
+hel5aard
+he4l3an
+he4l3ee
+hel4m3a
+hel4p3a
+hemi3s4
+he5ne
+hen4kr
+he5n4o
+2heo
+he2p3l
+he4pr
+4he3ra
+her4aa
+he4r3ad
+he4rene
+he4ri
+her3ij
+her3in
+2herm
+herm5eng
+he3ron
+her4p5aa
+her4pr
+hesis5
+he2sp
+2het
+h3g
+h3h
+4hi.
+hie2r3
+hie4ri
+hie4t5o
+hie4tr
+hiet5s
+hij4s
+hi2k3a
+hi4m3ac
+him4pl
+him4pr
+hin4t
+hint3j
+his4te.
+hi3tr
+h3j
+2hl
+h3lam
+h3le
+hlo3
+h3loc
+h3lok
+h3lu
+2hm
+h4mi
+2h3n
+ho5bo
+ho3ch
+hoe4ker
+hoe4s
+hoe3t
+ho4f
+hof5d
+hof3e
+ho3g4
+ho2ka
+hon5dr
+hon5g
+ho1no
+4hoom
+hoor5tj
+hoor5tr
+ho2po
+hop5r
+hor5de
+ho3ro
+hort3j
+4ho3ru
+ho3sa
+ho3sf
+ho3sk
+2how
+2h3p
+hpi4
+2hr
+hra4b
+hri2
+hris5
+hroot5
+4hs
+h3sp
+2ht
+h4t3a
+h4t5emb
+h4t3enn
+h4t3en5t
+h4t3env
+h4t3enz
+hte2r
+hter3a
+hter5e.
+hte4r3o
+h4t3es
+ht5esk
+h2t5ev
+ht3ex
+h2t1h
+h4tij
+h2t1j
+ht3o
+h3too
+ht1r
+ht3ru
+ht4si
+hts3id
+hts3in
+hts3le
+ht4sli
+hts5m
+ht4sna
+ht4so
+ht4spe
+hts5taal
+ht4s5tek
+ht4sti
+ht3u
+ht5w
+huin4s
+huit5j
+3huiz
+hul4der
+4hus
+hut3j
+h3w
+hyl3
+i3a
+ia3f4
+ia3g2
+ia3k4l
+ian3u
+i5a5p
+ia3t2h
+i5av
+i4b
+i5ba
+i5be
+i5bi
+i5bo
+i5br
+ica4p
+i1cha
+i1che
+ichee4
+i1chi
+i1cho
+i3chr
+i5co
+idde4r5a
+id4e
+ider4s
+id2g
+i3di
+idie5t
+id4o
+i3dok
+id3oo
+id5op
+id3re
+id3ru
+id2s
+ids3e.
+id4si
+ids3l
+ids3o
+ids3p
+ids5pa
+ids5taa
+ids5tek
+id4sti
+ids5tor
+ids5tr
+id3ui
+idu3w4
+id1w
+ie3a
+ie4d5ac
+ied3w
+i1ee4
+i5eer
+ie3fle
+ie4g3al
+ie4g3an
+ie4gas
+ie2gr
+ie4k3ap
+ie3ke
+ieke3s
+ie4kl
+iek3li
+ie5klu
+ie4kn
+iek5ond
+iek4s5n
+iek4sp
+ie2k3u
+ie4l3ei
+ie5ler
+iel5f
+i3enc
+iend5r
+ien5sp
+ien4sta
+ien4st5o
+ie4pap
+ie4plo
+iep5str
+ie4pui
+ier3al
+ie3ram
+ier3as
+ie4rat
+ier5enta
+ie1ro
+ier4sl
+ie4sl
+ie5sla
+ie5slu
+ie2sm
+ies5me
+ie2sn
+ie2so
+ies3oo
+ie4spi
+ie4spl
+ie4s3po
+ie3s4ta
+ie5stel
+ie4taa
+ie4t3ak
+ie5te
+ie3th
+ie4t3og
+ie4t3oo
+ie5troe
+ie3twi
+i3ety
+ie3ui
+i1eur
+i1eus
+ieus5te
+i1euz
+ieze4l5a
+i4é
+i5ét
+i3è
+i5èm
+4ië
+ië4ri
+2if
+if3aa
+if3ad
+if4r
+if3ra
+if4tan
+ift5ang
+if4tar
+if3ui
+i2g3aa
+ig5aard
+i4g5av
+ig3een
+igen5er
+ige2s
+ig3esk
+ig3le
+ig3lo
+i4gn
+i5gom
+ig3ond
+i5g4ro
+igs4
+ig3sk
+ig3sl
+ig5sm
+ig3sp
+ig3sto
+i1h
+i3i
+4ij.
+i2j5a
+4ijd.
+4ijdt
+4ij5e
+ije2n3
+4ijf
+ij3i
+4ijli
+4ijn
+ij3o
+i3jou
+4ijsu
+i4ju
+ij3ui
+ik3aar
+ike3s4
+i3ki
+i4kl
+ik4la
+ik5lap
+i5kli
+ik3lo
+ik3lu
+i4k3n
+i5k4ne
+ik3og
+i5kol
+ik3ope
+ik3ord
+i4kr
+ik4ri
+ik3ro
+ik3sj
+iks5m
+ik3s4p
+ik5spa
+ik4s5pi
+ik1st
+ik3wa
+i4k1we
+i3kwi
+ik3win
+i1la
+il3aan
+il3ac
+i3lak
+il3al
+il3au
+il2da
+il2d3r
+i3le
+il3een
+i4l3em
+ile2t
+ile3u
+i4l3ez
+i3li
+il3ink
+ilk4
+il3kr
+il5kw
+illu3
+i1lo
+il3ond
+i5loon
+il3oor
+il3oph
+i2l3or
+il3s2h
+il5so
+il5te
+i1lu
+im5alu
+ima4s
+imie4
+im3op
+im5pa
+3impo
+im4pri
+im3so
+i1na
+in3aap
+i4n3aar
+in1ac
+in5aker
+in3ape
+i3nas
+i5nas.
+in3ass
+in5dac
+ind5sp
+1indu
+in3ede
+in3edi
+in3eed
+in3ert
+3inf
+in2ga
+ing3aa
+ing5aal
+ing3ag
+ing3al
+5ingeni
+ing3l
+in4gr
+ing3re
+ing3ru
+ing4s
+ings5e
+ing5ske
+ings5n
+i3ni
+ini4è
+i4n3i4o
+inis2
+ini3sh
+in4kaa
+in2kn
+inkt3r
+inne3s
+4i1no
+i3noc
+in3og
+i2non
+ino3st
+1inri
+in5sc
+in5se
+in3s4l
+in3smi
+ins4n
+in3so
+in5spo
+in5ste
+in5swi
+in4t3ap
+in5te
+intes3
+in5ti
+in5t4r
+i1nu
+3inva
+i4ny
+i3o
+io3a
+io5b
+ioen4s
+ioes5
+i5o3f4
+i5o3g4
+i5ol
+i5om
+io3no
+ion4s5
+io3pe
+io3pr
+io3ra
+io3s
+iot5j
+io3tr
+io3u
+i1pa
+ip3ac
+ip3af
+i4perw
+ipe4t3j
+i1pi
+ip3j
+i1pl
+i1po
+ip3og
+ip3oo
+ipper4s
+i1pr
+i4ps
+ip4sle
+i3pu
+i3ra
+i1r2e
+ires4
+ire3st
+i3ri
+i3ro
+ir2s
+ir4sc
+ir3sp
+irt4h
+i3ru
+i2s
+i3sa
+is3aa
+is3af
+is3ag
+i5sal
+is3ap
+is1ar
+i5sat
+is3av
+i4sc
+i5scha
+is3cr
+is3ed
+i4s3ei
+is3ell
+is3eng
+is3ete
+iset3j
+i3s2fe
+is3hi
+is3id
+i4sij
+is3ja
+i3sji
+is3l
+is5lag
+is4lan
+is4lot
+is4lui
+i4sm
+is5ma
+is5mi
+is5mo
+is5mu
+i4s5n
+i3so
+i5soe
+i4soo
+is4oor
+is3op
+is3ott
+is3p
+is5par
+is5pas
+is5pl
+is3t
+is1ta
+ist3ap
+is5tas
+is5ten.
+is5tes
+is4th
+i4sti
+is1to
+isto3p
+i3s4tr
+is5tri
+i3su
+i5sy
+4it
+i1ta
+itaat5
+it1ac
+itee4
+it3een
+i5ten
+iten5tj
+i3ter
+ites4
+ite3st
+it1hu
+it2i
+i2tj
+it3ja
+it2je
+it5jesg
+i1to
+it5oef
+it3oog
+it3red
+it1ri
+it1ru
+it3sje
+it3sle
+it1sm
+it1st
+it5ste
+i1tu
+it5w
+i1u
+iu2m
+ium3e
+ive5ran
+ive3re
+i5w
+ix3o
+i3z
+ize3s
+ize5t
+î3
+ï3a
+ï1c
+ï1d
+ïen4
+ïe5ne
+ïllu3
+ï3n3a
+ïns5m
+ï3nu
+ï3o
+ï3ro
+ï5sche
+ïs5m
+ïs3t
+ï1t
+ïze3
+4j.
+jaar4s
+jaars5t
+1jag
+jagers5
+ja5mi
+ja2n3o
+jan4s3l
+ja3pl
+5jar
+jart3j
+5jas
+j2d3aa
+j4d3ee
+jde4n3e
+jden4s5
+jdes4
+jde5sp
+j3di
+j2d3o
+j4dr
+j5dra
+jd3re
+jd3ro
+jd3ru
+jd5s4l
+jd4so
+jd1st
+j4d3u
+jd3w
+j3d4wa
+5jeba
+2j1ee
+jeen3
+j1en
+je2n3a
+je3ro
+je4s3
+5jesaa
+5jesha
+5jesho
+3jeskl
+3jeskn
+jes5m
+5jespe
+je3spr
+3jesr
+3jess
+jes5t
+5jesv
+5jesw
+je2t3
+je3to
+5jeu
+5jeva
+j2f1a
+j2f3ei
+j2f3en
+j4f3ij
+j4f3in
+jf3l
+jf4la
+jf5lap
+j3flat
+j4f3o
+jf3r
+jf4sc
+jf4s3l
+jf2sm
+jg3laa
+j4g3re
+jg2s3
+jg4se
+jgs5l
+jgs5m
+jg5sn
+jg4st
+jg5s4te
+j3h
+3jic
+jif5
+j3ig
+jis5m
+j3j
+4jk
+j2k3aa
+jke5ro
+j2kij
+j2k4l
+jk5lak
+jk5lap
+jk5las
+j3kle
+j3klo
+jk5lu
+j2kna
+j2k3of
+j4k3ol
+j2kr
+jk3raa
+jk3re
+jk4si
+jk2sl
+jks5le
+jks5m
+jks5n
+jk3so
+jks3pr
+j2k3ui
+jk3w
+j1la
+j1le
+jl3ink
+j1lo
+j2loe
+jm3af
+j5m4ar
+jm3op
+jn1a
+j4naa
+j3nag
+jn5ak
+jn4am
+j3n4an
+jne3s
+jn3g4
+j4n3im
+jn3ink
+jn1o
+jn4s3am
+jn2s3l
+jn4sp
+jn5spi
+jnt4
+jn5tr
+job2
+jol4e
+jo5li
+j3om
+3j4on
+jone2
+5jonge
+jonge4t
+joor5t
+jo3ra
+j4ou
+joy5
+j3pa
+j4p3ac
+j2p3em
+jpe3s4
+j3pi
+j4p3ij
+jp3j
+j3pl
+jp3lam
+j3po
+j4p3or
+jp3re
+jp3ri
+j3pro
+j3r
+js3a
+j5se
+j4si
+j2s4l
+j3sla
+js5las
+j3sle
+j3sme
+js5mi
+j2s3n
+j3sni
+js3o
+j1sp
+j4spo
+js3poo
+jspoort5j
+j5spor
+j1sta
+jst5aar
+js3te
+j3stei
+j3s4tel
+j4s5tem
+js5tep
+j4ster
+js4tij
+j3sto
+j4stoo
+js3tou
+j4stra
+jst5ran
+jst5s
+j2su
+j3taal
+jt3aar
+jt1ac
+j3tag
+j3tak
+j3tan
+j3te
+j4t1h
+jt3jes
+j3to
+j3tr
+j4t3ra
+jt4rad
+jt3rot
+j1tu
+jt3w
+1ju
+juit2
+juits3
+juli3
+5jur
+jus3
+juve5
+jve2n
+jve3ra
+jver4s
+jve3t4
+j1w
+jze4r5o
+2k.
+1ka
+3ka.
+k4aat
+2k1ac
+3kace
+5kad4
+kade4t5
+4k4af.
+2kafr
+k3agen
+k4ake
+4kakt
+4kalb
+5kalf
+kalf4s
+kal4k3a
+5kalv
+2kamb
+kamen4
+kam4pr
+kan5d
+2kang
+5kani
+5k4a3no
+kan4t3j
+5kap.
+ka3pr
+kap3s
+kas4pe
+kas3tr
+kast5ra
+kas5tro
+ka4t3aa
+ka4t5ale
+ka4tan
+kat1j
+k3atl
+ka4t3og
+ka4too
+ka5t4r
+kat3s
+4k3aut
+2k3avo
+5kay
+2kb
+2k1c
+2k3d
+1ke
+4keen
+keep3l
+keers5to
+kee3tj
+k4ei.
+k4eie
+kei3s4
+3ken.
+ken5as
+ke3ne
+ke4nep
+ke2n3o
+5kens
+kens5po
+kepie5t4
+5ker.
+ke5rij
+ker4kn
+ker4kr
+kerk5ra
+ker4ku
+ker4kw
+ker4n3a
+ke4r3o
+5kers
+ker4sla
+ker4sm
+4k3erts
+ke2st
+ke3sta
+ke5s4tel
+kes3tr
+3k2et
+5ketel
+ke2t3j
+ket5sp
+4ketu
+3k2eu
+4kex
+2k1f
+2k1g
+2k3h
+1ki
+4kied
+4kiep
+kies4t
+kie4t3j
+k3ijs
+2k1ijz
+ki5kl
+ki3na
+4kindu
+kin3en
+ki4n3es
+5king
+2kinr
+2k3ins
+kio4
+ki2p
+kip3l
+4k5j
+2k5k
+kker4s
+kkers5te
+kke3s4
+1k2l4
+5klac
+kla2p
+5klass
+k3last
+4klat
+3k4lau
+5k4led
+4kleer
+4k5leg
+k3lek
+klemme5t
+k3len
+4klera
+k3les
+5k4leu
+4k3lic
+k3lij
+kli4me
+k4lis
+4klod
+k3loka
+k3lone
+k3lood
+5kloof
+k3lope
+5klos
+2k1loz
+4kluih
+k3lus
+2k1m
+1k2n
+kna4l
+knas5
+2k3nem
+kni2
+5knol
+k3noot
+k3note
+2knum
+1ko
+2k3oct
+ko4e
+koe4ket
+koers5p
+koe3tj
+k4offi
+koge4
+5kogr
+kol2e2
+kolen3
+2kolm
+ko5lo
+3kom
+ko4m3a
+komitee5
+3kon
+kon4t3r
+2k3oog
+koon5
+koor5tj
+k4o4pl
+3kopt
+2k1org
+2k3ork
+korres5
+kort3o
+ko3ru
+ko4s
+4k3os.
+4koss
+k4ost
+kot5j
+4k3ov
+4kox
+2k1p
+kpren4
+1kr4
+3kra
+k3raad
+kra4b
+4k3rad
+k3rand
+4krat
+2k1rec
+kree4
+kreet3
+kre2p
+k3rijk
+2krol
+kron5t
+2k3rou
+3k4ru
+kru4l
+2ks
+ks3ad
+ks3af
+k5sap
+k4s1ar
+ks3as
+k5s4er
+k4s3in
+k3sla
+k4slan
+ks4le
+ks5leg
+ks3li
+ks5mo
+k2s3n
+ks4no
+k4snu
+kso4
+ks3on
+k4s1op
+k4s3pa
+k1spe
+k3spi
+ks3po
+ks3pru
+k3spu
+ks4t
+k1sta
+k3ste
+k4st3ed
+k4stele
+ks5tent
+kste4r
+k3sti
+k3sto
+k4ston
+k4s5tre
+ks5tri
+k3stue
+k2su
+2kt
+k1ta
+ktaat5
+kte2n3
+kter4sp
+ktes4
+kte3st
+kt1h
+k4t3in
+k2t3j
+3ktl
+k3to
+4ktpa
+4k1tr
+k1tu
+3ktv
+4ktvi
+1ku
+kui2f
+3kul
+k3up
+3kus
+kut3j
+2kv
+k1wag
+5k2wam
+3k4was
+2kwed
+kwee3s
+2k5weg
+k1wei
+2k1wer
+5kwes1
+k3wijz
+k4wik
+2kwim
+2kwin
+2k1wo
+3ky5
+2kz
+4l.
+4laaf
+4laand
+laars5tek
+laar5tj
+laats5tr
+2lac
+3lach.
+3lache
+l4aci
+3lact
+la2d3a
+la4det
+2ladj
+2la2dr
+la2du
+3l4ae
+laes4
+la2fa
+la3fl
+lafo2
+4lafs
+la2ga
+la2g3o
+la2gr
+lag3ri
+la4ki
+la3kl
+l3akti
+2lal
+3lald
+la5lo
+la4mo
+lam4p3j
+lamp3l
+2l3ana
+3land
+lan4da
+land5aa
+lan4dr
+land5ra
+land5re
+laneet5
+la4n3ek
+5lange.
+lan4gr
+lan4ka
+lan4k3l
+lank3w
+lan4sl
+lan4t3j
+la4pa
+3lapj
+lap1l
+lap5r
+la2p3u
+2l3arb
+4lart
+l4as
+las3a
+la4si
+la3te
+la4t3he
+la4t3ro
+la3un
+l4auw
+lava5s
+l4az
+4lazi
+lber4
+lbert3
+l1c
+4ld
+ldaat5
+ld3ac
+ldak4
+l3dar
+ld3ari
+ld3art
+ld3ei
+l4dom
+l2d3os
+ld3ov
+ld3ram
+l2d3re
+ld3s4a
+ld5sl
+ld3sm
+l2d3uu
+ld1w
+l4e.
+le2a
+le3ad
+le3an
+le3at
+lee4
+4leekh
+leem5ac
+3leen
+4leep
+lee5ro
+lees3p
+lees5tr
+lee3tj
+le3fl
+legas5
+le4g3ek
+4leig
+lei5sc
+le5ke
+2leks
+le4kw
+le4lim
+lemme4t
+l4en
+5len.
+len3ad
+le4n5ak
+len5as
+3leni
+len5sl
+len4s3p
+len4tr
+len5tre
+le5pe
+3le5r4a
+ler4e
+le5rei
+ler5g4
+le3ro
+lers4
+l5erts
+l5erv
+les3ta
+les3ur
+le3t2h
+le5t4i
+le4t3ro
+4l3etu
+leu3ko
+5leun
+leu5ste
+5leuz
+leven4s5
+4l3exc
+lexis5
+3lé
+lf3ac
+l3fag
+l4f3an
+lfbe5
+l2f3ei
+l2f3el
+l4fend
+lf5ende
+l4fin
+lf3lak
+l3flo
+l4fo
+l5foe
+lf3ol
+lf3on
+lf3op
+l5for
+l5fou
+lf4r
+lf5raa
+lf5ram
+l3fran
+l3fre
+lf5rij
+lf5ro
+l5fru
+lf2sa
+lfs5ei
+lf2sm
+lf4spo
+l2fu
+l3fui
+lf3uu
+l1g
+l5gaar
+l2g3af
+l3gla
+lg3on
+lg3re
+l3gru
+l1h
+1li
+3li.
+3lid.
+li3da
+3lied
+lie4gr
+li3enn
+lies3p
+lie3st
+lie5ta
+3li4è
+li3g4a
+lij4k3o
+lij4m3a
+5lijn
+4lijp
+3lijs
+lij4st
+4lijt
+4l3ijz
+li2ko
+li5kr
+lim4p3j
+5lin.
+lin4da
+li5ne
+l4ing
+lin5gr
+link3a
+lin5ke
+4linkt
+4linr
+4lins
+lin4t3j
+li2p
+4lipj
+li5sa
+li5se
+lis5m
+l3isw
+li1th
+3liv
+l1j2
+lk3af
+lk3alb
+lk3ank
+lk3een
+l4kei
+l2k3em
+l4k3ep
+lk3laa
+lk3lag
+l4k3lev
+lk3ont
+l2k4ri
+lk5rij
+l2k3ro
+lk2s
+lk4sa
+lk4se
+lks5m
+lks5ta
+lks5tel
+l4k3uu
+l4kw
+lk3wi
+2l1l
+l3la
+lla5t4
+l3le
+lle5k
+lle4sp
+l5li
+lli4a.
+llo3s
+ll3ov
+2l1m
+lm3art
+lm3ed
+l4m3ind
+lm3oli
+lm4op
+lm5opn
+l3n
+lni4
+loe4da
+loed3r
+4loefe
+2loes
+3loë
+lof5d2
+lof2s
+lo3go
+5logr
+lo4gre
+log4s
+lo4kar
+lo2kl
+lo2ko
+3lol.
+3lold
+lom4p3l
+4loms
+4l3omt
+l3omv
+3lon.
+lo4na
+lon4gr
+lont3j
+3look
+3loo4n
+2loor
+l4opa
+2loph
+2l3opn
+4lops
+4l3opw
+l4or.
+4l3org
+lo3ru
+lo4sc
+lo4sp
+lo5spe
+lost4
+los5tr
+lo2t3h
+lot5j
+2love
+lox3e
+lo3ys
+3loz
+4l1p
+l3pa
+lpe4ni
+lper5sp
+lpe3s4
+lp3of
+lp3on
+l3pot
+lp5ram
+4l3r
+lrus5
+2ls
+l4s3aa
+l4s3ad
+ls3ag
+l3sak
+l3sal
+ls3an
+l4s3ep
+ls2j
+ls3ja
+ls4ky
+l4s3laa
+l2s3le
+l2s3li
+ls4lin
+l3smee
+ls5mo
+l4so
+l5soe
+ls3of
+l5sol
+l5som
+ls3on
+ls3or
+l1sp
+l5spe
+lspee4
+ls3pol
+l5spor
+l2s3pu
+ls4t
+l1sta
+l1ste
+l5ste.
+l4stele
+l5sten
+l4s5term
+l3sti
+l1sto
+ls5tou
+l5straa
+ls5trak
+l5strat
+l2su
+4lt
+l1ta
+lt1ac
+l4tam
+l5tame
+lt3h
+lt4han
+lt4he
+l3thu
+l3tj
+l1to
+lt5oli
+l2t3ov
+l5tr
+lt3sl
+l1tu
+lt3w
+lu1e
+3lui.
+3luid
+5luih
+lui5ste.
+4luit
+lu3ka
+5lu3na
+lu1o
+lu3sta
+lut3j
+lve3s4
+lvi4s
+l1w
+1ly
+ly5st
+2m.
+1ma
+5m4a.
+5m4aat
+ma4cl
+mae3
+2maf
+m5afl
+5m4ag
+5maj
+ma3ka
+ma5l4a
+mal5ent
+3man
+man3ac
+man4se
+man4sn
+man4so
+mans3p
+man4st
+mans5ta
+man5ste
+mant4r
+ma3pl
+5marc
+mariet5
+5mark
+mar3s4h
+mar4s5t
+mart3j
+3mas
+ma3s4p
+ma5str
+ma5ta
+m3atom
+m3atoo
+mazig5er
+2mb
+mbos4
+mbo3st
+m1c
+2md
+mdis5
+md3so
+1m2e
+3me.
+me5d
+m4ede
+mede5l
+mede5s
+mee5re
+mee5r4i
+5mees
+meest5a
+mee5str
+3mega
+5mei
+mei2n
+3mel
+mel5as.
+5melk
+mel4kr
+5melo
+3men
+me3na
+men5k
+men3sm
+men4t3j
+men4tu
+men4t5w
+me3p4j
+me4r5aak
+me4rad
+mer3ak
+mer4am
+me3ran
+me5re
+merg4s5
+meris4
+5merk
+mer4ka
+mer4kl
+mer4kw
+me3roo
+me2s
+2me3s2h
+mes5m
+me3so
+me3sta
+mest3r
+me5te
+5me3t4h
+me5tr
+me3us.
+3mé
+3mè
+3mê
+2m1f
+mfe4r
+mfi3
+mfoor5
+2m1g
+mgaat5
+mgang4
+mger4
+2m1h
+3m2i
+miaat5
+5midd
+mie5kl
+mies4
+mie3st
+mi4è
+5mig
+mij4ni
+4m3ijs
+4m3ijz
+mi3lo
+4m3inr
+4mins
+4mint
+5misd
+mis5m
+mi4so
+mi4st
+mi5sto
+mis5tr
+mi1tr
+2m3j
+2m3k2
+mkaart5j
+2m3l
+2m1m
+mmi3sl
+m1n
+1mo
+5moe.
+5moed
+moed4s
+5moeë
+2moef
+5moeh
+moe2s
+moe5ste.
+moets5
+5mog
+5mole
+moli5è
+mol4m3a
+4m3omv
+mo3n2a
+mond3r
+mo3no
+mon4so
+5mooi
+moor5tj
+2mop
+m5ope
+mo3ra
+mo5r4e
+mo3ro
+mor4s3p
+5mos3
+mo3s4ta
+mo3th
+mot5j
+4m3oud
+5mouw
+4m1p
+mp3ach
+m4p3af
+m3pl
+mp3leg
+mp3lei
+mp3ler
+mp3lu
+m4pol
+mp3oli
+mpo2t
+mp3rec
+mp3red
+mp3rin
+m3p4se4
+mp3sh
+2m3r
+2ms
+m3sam
+ms3ap
+ms3ar
+ms2j
+m3sje
+m5sla
+ms3len
+m5slo
+ms5nee
+ms3oo
+ms3or
+m3s4p
+ms5pot
+ms4t
+m3sta
+m1ste
+m1sti
+m1sto
+2mt
+m1ta
+m3th
+m1to
+m1tr
+m1tu
+1mu
+5mun
+5mur
+5mus
+mus5t
+5mut
+5muu
+5muz
+2mv
+mvan4
+2m1w
+3my
+2mz
+mze2t
+4n.
+3na.
+1naal
+5n4aam
+2n1aan
+2naap
+4n3aard
+5naars
+naar5tj
+5naat
+2nac
+nacee5t
+3naco
+nad4
+n4aden
+5nae
+na3er
+2n1af
+n4a3g4
+5nai
+5naï
+n4a5ke
+4naker
+na3k4l
+3n4ale
+4n3alf
+3n4ali
+nal5k
+3nam
+n4ami
+na3na
+na3ne
+3n4ani
+n5anj
+n3ank
+5nant.
+nan4t3j
+2nap
+na4pa
+na1pl
+na3pr
+nap3s
+4n3ara
+2n1arb
+2narc
+5nares
+narie5t
+n3ark
+2n1arm
+2n3art
+na3s4
+3na1sa
+na1sp
+nas5te
+5nat.
+2n3atl
+nat2r
+na3us
+2naut
+2nav
+2nb
+nboot5
+n1c
+ncen5
+nch3tr
+2nd
+n3da
+n5daal
+nd3aas
+n4dac
+nd5adel
+n5dale
+nd3alm
+n4dap
+nd3art
+n4d3as
+n4d3az
+nd3edi
+n4deg
+nd1ei
+n5del
+nde5lev
+n5den.
+nd4er
+nder5aal
+nder5al
+n4d5erec
+nder5in.
+ndes4
+n4d3ete
+ndiet5j
+n4d3ijs
+nd3ins
+nd2ji
+n2d3of
+nd5olie
+nd5omd
+nd3oog
+nd5oorl
+n3dov
+n3dr
+nd3rap
+nd3rat
+n4d3re
+nd4ren
+ndre3u
+n5drev
+nd3rot
+nd5slo
+nds5ma
+nd3sme
+nd3soo
+nd3sp
+nd4s5tal
+nd3uri
+nd1w
+ndy5
+1ne
+nebe4s
+2nech
+ne5dw
+nee4
+4need
+4n1een
+nees3
+nee3tj
+neg2
+nege4n
+ne1gl
+ne5g4r
+2nei
+n4ei.
+n4eie
+n4eig
+4neis
+ne4kr
+4n3ela
+3n4eme
+2n3emm
+3n4en.
+4n3enc
+n4end.
+nen5k
+n3enke
+ne2n3o
+ne4p3ol
+5ner.
+ne1ra
+5n2ere
+4nerf
+ne4r3id
+ne3ro
+ner2s
+3nes
+ne3sta
+nes4tei
+ne5stek
+4neter
+5netj
+net5sp
+4neum
+ne3um.
+ne3ume
+ne3ums
+neu5ste
+3né
+4n3f2
+2ng
+ng3ad
+ng3ak
+n4gap
+n2g3ar
+nga5sl
+n5ger
+nge4rap
+nge4ras
+nger5sp
+ng3ij
+n4g3ins
+ng3le
+n3glis
+ng3of
+n2g3on
+ng3ore
+n3gr
+ng3rad
+ng3ram
+n4g3ras
+ng3rat
+ng4re
+n2g4ri
+ng5rie
+ng3rij
+ng3rok
+ng3roo
+ng2s
+ngs3e.
+ngs5le
+ng4slo
+ngs5loop
+ngs5m
+ngs1p
+ngs5pa
+ngs3tr
+ng3uit
+2n1h
+1n2i
+nie5k4a
+nie5kl
+nie4tr
+3nieu
+ni4gee
+ni4g3r
+nij3k
+4n3ijz
+nika3
+3nim
+2n3in.
+4n3ind
+3ning
+5ning.
+ning3r
+ning5re
+nin2k
+n3inkt
+2n3inr
+2n3ins
+4nion
+5nise
+ni4sel
+nis5m
+ni3th
+ni1t4r
+ni5ts
+5nitz
+5niv
+n1j4
+nje5sc
+nje3t4
+4n1k
+nk3aan
+nk5aard
+nkaart5j
+nk4ab
+n2k3af
+n4k3ak
+nk3ana
+n4k3asp
+nker5ku
+n4kerw
+nk3lad
+nk3ler
+nk3lod
+n2k3na
+n3kne
+nk3not
+n2k3of
+n4kog
+nk3oge
+nkoot5
+nk3red
+nk3rek
+nk3roe
+nk3rol
+nk3sn
+nk4s5o
+nk3s4p
+nk1st
+nk4tr
+n4kw
+nk3waa
+nk3wez
+nk1wi
+2n3l
+2n5m
+nmazi4
+n3n4
+nnee5t
+3no.
+4n3oec
+2noef
+noes5te
+noet3j
+noet5s
+n4of
+2n5ofe
+1nog
+no4gal
+4n3oge
+no3ia
+1nom
+4n3om.
+3noma
+3nomi
+2n3omw
+2n3ond
+2n1ont
+4n3onz
+4noof
+2n1oog
+n4oot
+2nop
+n4opa
+n1opg
+n3opn
+no4por
+n3opv
+n4ora
+2nord
+n4ore
+2norg
+no3sf
+no3sp
+n4ot
+not5j
+4n3ou
+2nov
+2n3p
+npoort5
+n5r
+4ns
+n3saal
+ns3ad
+ns3af
+n3sag
+ns5ak
+n3sal
+ns3alp
+n3sam
+ns3an
+n3sapp
+n3sar
+n3sas
+ns3av
+n3s4c
+n5sca
+n5sci
+n4s5co
+n4s5cu
+n4sed
+ns3edi
+nsee5t
+n4s3eg
+nsei5
+n5sen
+ns4fee
+ns3ja
+n3sjo
+n5slag
+ns3lak
+n5slap
+ns3lat
+n4sle
+ns3led
+ns3lie
+n5s4liep
+ns3lop
+ns5mac
+n3sme
+n5smij
+ns5mis
+ns5moe
+n3smol
+ns5mu
+ns3nod
+ns3noo
+n1so
+ns3of
+n4sog
+n5sol
+n4som
+n5som.
+n2son
+n3sp
+n4s3paa
+ns3pad
+n4spl
+ns3por
+n4spot
+ns4t
+n1sta
+n4staak
+n3ste
+n4st3ei
+n5sten.
+ns5tent
+n3sti
+n1sto
+nst5oef
+nst5oor
+n5stru
+nst5uit
+n4sui
+ns3uil
+n4suu
+n5sy
+4nt
+n3ta
+n5taal
+n4t5aard
+ntaar5tj
+n5tab
+nt3ach
+nt3ad
+nt3aga
+n5tal
+n4t3art
+n5tat
+n5teg
+n2tei
+n5tel
+nte4lo
+n5tem
+n5t4en
+nte5re
+nte4st
+nte5ste
+n5tev
+nt3ex
+n3tè
+nt3ha
+n4tho
+n5thol
+nt1hu
+nt4i
+nt5ijz
+nt5inw
+nt4jo
+n1t4o
+n5toe
+nt5oge
+n5toï
+nt5oli
+nt5oms
+nt5oog
+ntoor5
+nt5opn
+n3tr
+nt3rec
+n5tref
+nt3rei
+n5trem
+n4t5rij
+n5troos
+nt3ru
+n5tsj
+nt1sm
+nts5pre
+nts5tan
+nt5ste
+nt5sto
+nts5tro
+n1tu
+nt5uit
+nt3w
+nt2wi
+nt4wis
+3nu.
+nu3a
+nu3en
+nu3et
+2nui
+4n3uil
+nu2lo
+n3ult
+3num
+4n3uni
+2nur
+5n4uri
+nu4s
+nus3o
+nut3sh
+2n3uur
+nu4wi
+nu5wing
+2nv
+nval4s
+4n1w
+nx3
+nx4e
+3ny
+n3yi
+4nz
+nzet5s
+3ñ
+o1a
+o2as
+oas3t
+o3av
+o4b
+o5ba
+obalt3
+o5bi
+3obj
+o5bl
+ob3oor
+ob3or
+obos4
+ob5ov
+o5br
+o3cha
+o1che
+o1chi
+o1cho
+o3chr
+o3chu
+ocos4
+oc5t4
+4od.
+oda3g
+ode4m5o
+o5d4e2n
+ode5sp
+od3on
+o5doo
+od3op.
+od3re
+od5slan
+od5sli
+od5slo
+ods5m
+ods3o
+od4spr
+od1w
+oe4d3aa
+oed3ar
+oe4d3on
+oe4dr
+oed3ri
+oed3ro
+oe2d3u
+oed3w
+oe4f3a
+1oefe
+oe2fi
+oef3la
+oef3le
+oe4f5o
+oe2f3r
+oege3l
+oei5s4
+oek5erk
+oe2k3l
+oe2k3w
+oe3l2a
+oe4lac
+oel4ak
+oe4l3ap
+oe4l3ei
+oe4m5ac
+oeme5tj
+oe5n4e
+oe2n5o
+o3eo
+4oep
+oe4plu
+oe2p3r
+oe2p3u
+oe3ra
+oe4r3aa
+oe4r3al
+oe4rau
+oer5ei.
+oer3o
+oer5om
+oer4sl
+oer4sn
+oer4sp
+oes3a
+oes3li
+oe4s3o
+oes4t
+oe3sta
+oes5ter
+oes5tig
+oes5tin
+oe3sto
+oe4taa
+oe4t3an
+oe4tei
+oet3h
+oe2tj
+oe4tra
+oets3p
+oet3w
+4oë
+4ofa
+of3ar
+of4d1a
+ofd3ei
+of2do
+ofd3on
+of2dr
+ofd3re
+of4d1w
+o3fe
+o3fi
+of3l
+of4la
+o3f4lu
+of3om
+o3fon
+o3foo
+of1r
+of2sa
+of4si
+of4s3l
+of4sp
+ofs5pl
+ofs5tr
+oft2s
+of4tu
+oft3ur
+oft3uu
+og3al.
+og3ap
+4ogee
+ogel5ei
+ogen5t
+1ogig
+4og1l
+4og3n
+o4g5ne
+og4op
+ogs5e.
+og4s5l
+ogs5m
+og3sp
+ogs4pr
+ogs4t
+og5ste
+og3sto
+og4st3r
+o1h
+2oi
+oi4a
+oi2a.
+oi1e
+oile4
+o3ing
+oi3s4
+oi5sc
+ois5m
+oist4
+ois5tj
+oi3tj
+o1j4
+oj5k
+o3kaa
+o4k3aas
+okaat5
+ok3ab
+ok3ag
+o3kal
+ok3an
+ok3ar
+o4k3az
+ok3een
+oki2n
+o3kla
+ok3let
+o2k3li
+ok3lo
+ok3lu
+o2k3n
+ok3ol
+o2k3op
+o2k3ou
+o2k3r
+o5k4ra
+ok3sa
+ok3sp
+ok4spo
+ok1st4
+okter4s
+ok3uu
+ok3w
+4ol.
+o1la
+ol3ac
+ol3ap
+4old
+o1le
+o3le.
+ol1ei
+ol3eks
+o3len
+o3ler
+ole1u2
+olf3l
+olf4s
+olf5sl
+ol2gl
+ol2g3o
+ol2gr
+olg3ri
+o5ling
+o3lit
+ol4k3aa
+ol5kaf
+ol5ke
+ol2kr
+olks1
+ol5kw
+ollie4
+ol3mo
+o1lo
+o5loc
+olo3k4
+ol4om
+o2l3op
+olos3
+ol3ove
+ol4p5ra
+ol1sj
+ol3sk
+ol3sl
+o1lu
+ol3ui
+ol3un
+ol3ur
+4oma
+om3ac
+om3af
+om3eg
+om3ela
+o5men.
+omer5k
+o3me4s
+ome5sp
+om3ez
+om3ins
+om3int
+4omm
+om3op
+om3pa
+om4p3la
+om3ui
+4omy
+o1na
+on1ac
+o3nag
+o3nal
+on3am
+o3nat
+on3au
+2ond.
+ond3ac
+on4ded
+ond5eng
+onde5ras
+onde5st
+on4dij
+ond5om.
+on4dr
+on5dra
+ond5re
+ond3ro
+4onds
+o2n3ec
+on5ei
+on3ekl
+on3eng
+one5ste
+on3ga
+on4gaa
+ong5aap
+ong5ap
+4ongen
+on4gri
+ongs5k
+o3ni
+on4in
+2onk
+on4k3ap
+on3k4i
+on5kw
+onne5st
+on1ov
+on3sm
+on2s3n
+on4spe
+on1st
+on5su
+3ont1h
+on5ti
+on4tj
+on4tog
+on4too
+on2tr
+on5tu
+on1ui
+o4o2
+oo3c
+oo4d
+ood1a
+ood1e
+ood1r
+ood5sl
+ood5ste
+4oof
+oo4g
+oog3a
+oog1e
+oog1r
+ook5s
+ool1a
+ool3e
+ool5f
+oo4l3i
+ool5k
+ool3o
+ool3u
+oo4m
+oom1a
+oom3o
+4oon
+oon3a
+oon5tj
+oop1a
+oop5e
+oor3a
+oor4daa
+oor1e
+oor5i
+oor5m
+oor1o
+oor3sm
+oor5to
+oo4t
+oot1a
+oo3te
+oot1h
+oot5o
+oot3r
+oot4sl
+o1pa
+op3aar
+op3ac
+o4p3ak
+o4p3an
+o2p3as
+op3at.
+op3atl
+5opdr
+o2p3ee
+op5een
+op5eet
+o2p3ei
+op3ete
+op4her
+o1pi
+o2p3id
+opie5t
+op3ijz
+op1j
+op3l
+o1po
+o3poe
+op3of
+o4p3oo
+op3ord
+op3ore
+op3ov
+op3r
+op5rak
+3o4pru
+ops4l
+op3sme
+op3sn
+op5sto
+4opt.
+o1pu
+o4py
+o1ra
+or3ac
+or1af
+or2do
+or4doo
+or4d3or
+ord3w
+o1re
+or4en
+oren3a
+or2g3l
+or3g2n
+o1ri
+or3ins
+or4m3ac
+or4n3ac
+or3no
+or5oe
+oroes5
+or1on
+or1oo
+or1op
+or4p3ac
+orp4sc
+or5se
+or4s5k
+or4t3ak
+orte5n4a
+or4tev
+or4tj
+or4t3oo
+or4tor
+ort5sp
+ort1w
+or1u
+or3ur
+o3ry
+os3aa
+os3ap
+o3sar
+o3s4c
+o5sch
+o5sco
+o5s4e
+ose5st
+os2f
+o3s4fee
+os2ko
+o2s3l
+os5m
+o2s3n
+o1s4o
+os5ol
+os3p
+os4pe
+o5spect.
+o5specte
+os5pek
+os5per
+os4po
+o2st
+os3taa
+os5taal
+os5taar
+ost3ag
+os3tal
+o5s4tas
+os4tat
+os3te
+os5te.
+o3stè
+os3to
+ost3ov
+ost3re
+ost3ri
+o3stro
+os5tru
+os3tu
+o3sy
+o1ta
+ot3aar
+ot3ac
+o2t3ak
+o5tam
+o4t3ap
+ot3as
+o5teb
+ot3ed
+o5tee
+o5tem
+o5ter
+ote5ri
+ote4s5ta
+o1th
+o3t4hi
+o2tho
+ot3hu
+o4t4j
+ot5jo
+o1to
+o2t5ol
+oto3p
+ot3ri4
+o3tro
+ots3a
+ot5si
+ot2s3l
+ot5so
+ot4s5pa
+ot4str
+o1tu
+ot3ui
+o3tul
+ot1w
+ou3a
+ou5b
+ou1c
+ou4d1a
+ouden5t
+ou1e2
+ou3k4
+ou4re.
+ou4res
+ou2ta
+out1j
+ou2t3o
+out3r
+out3sp
+ouw5do
+4ova
+o5ve
+3overg
+2ovi
+ovi5so
+o1wa
+o3we
+o3wi
+own3
+o3wo
+ow3r
+o4x
+1oxy
+oys4
+o3z
+oze3s4
+ö3l
+4p.
+3paal
+4paan
+paar5du
+paar5tj
+2pac
+pacht5s
+p2aci
+5pad.
+pa2d3r
+3pag
+pag4a
+pa3gh
+pa2k
+5pak.
+pak3a
+p4ake
+3pakk
+3pale
+paling5s
+pal5kl
+palli5a
+palm5a
+pal4mo
+pa3na
+pa4n3ad
+4pank
+pan3o
+pan5sp
+pan4t3r
+3pap
+5papi
+pap5l
+pa3pr
+4par.
+3para
+par3d4
+4parr
+par3th
+3parti
+part3j
+pa5ru
+pas3
+pa3sa
+pa4sc
+pa3so
+4pat.
+pa5te
+2patl
+3pau
+4p3aut
+1pav
+2pb
+p1c
+2p3d
+1pe
+pe3au
+3peb
+4peci
+5pectu
+5ped
+pe5de4
+pede5r
+pedes3
+p4ee
+pee4l
+2peen
+3pees
+peet3
+peet4j
+3peë
+3peg
+pe3gl
+3peh
+p4eil
+pek3ee
+pek3la
+pe2k3n
+3pekti
+pe4lak
+pe4l3ee
+pel4i
+pe3lo
+2p3emm
+3pen
+5pen.
+pe4nam
+pe5nan
+pen5k
+5pens
+pen5sm
+pent4
+pe4nu
+3pep
+4pepi
+pep3s
+3pe1ra
+5peri
+per5ijz
+peri3s
+pe3ron
+5pers
+per4sp
+pers5pa
+per5sti
+4perwt
+5pes
+pe5sa
+pe5se
+pe3sta
+pe3sto
+3pet.
+5peter
+pe3um
+3pex
+3pez
+1pé
+3pê
+2p1f2
+2p1g
+pgaat5
+pgei4
+2p1h
+3p4his
+pie4tj
+pi2ga
+pi3gl
+5pij.
+pij4li
+3pijn
+3pijp
+pij4p3a
+pij4p3l
+4pijs
+pij4tj
+2pijz
+pik3l
+pi4ko
+pi4nas
+4p3inj
+pin4k3r
+pin4t
+pi3sko
+pis5m
+pis5ta
+pit3j
+pit4sp
+p1ja
+p3ji
+p1jo
+2p1k
+pkaart5j
+p2l2
+4p3la.
+plaat5j
+pla3di
+pla4kl
+4plam
+p5land
+4p3lang
+3plant
+p5lap
+3p4las
+pla4tr
+plee5tj
+2p5lep
+p3les
+p4lex
+2p3lig
+2plij
+p5lood
+p5lop
+2p1m
+2p1n
+p3no
+p4oe
+3poei
+3poe2s
+poe4s5t
+poe3tj
+3poez
+3poë
+2pof
+po2k3i
+po4ko
+pol5ka
+3pom
+pome3
+4p3oml
+3ponds
+3pone
+pon4sm
+4poog
+p4ool
+poo3li
+4poor.
+poor5s
+poot5
+3pop
+po3pe
+po3pl
+4pori
+2pork
+po3ro
+5portef
+por4t5ra
+3p4os
+po3sf
+po3sk
+pos4taa
+po4ta
+po4tes
+3poth
+3poti
+pot5j
+4pov
+2p5p
+ppe5li
+ppe4n
+ppen5e
+pr4
+p4ra
+3pra.
+praat5
+p5rad
+3prakt
+4pram
+3prao
+p5rap
+3prent
+prent5a
+pren4t5j
+3p4ret
+preu5s
+p3riek
+3pries
+4priet
+pri5m
+5prins
+3p4rio
+5prob
+3proef
+3proev
+5p4rof
+p4rog
+5prop
+pro5pa
+pros5t
+3prov
+pruit5j
+pru2t
+prut3o
+2ps
+p2sa
+ps3af
+ps3as
+ps3at
+ps3au
+p3sc
+p5schi
+p4sco
+ps3le
+ps5ma
+ps5mi
+p2s3na
+p1so
+ps3of
+ps3on
+p3sop
+p1sp
+ps4pe
+p1s4t
+p3sta
+p5stat
+p3ste
+p5ster.
+ps5term
+p5sters
+ps5tor
+3psy
+4pt
+p1ta
+p5ti
+p4t3j
+p1to
+p1tr
+p1tu
+pu5b
+pu3c
+puil3o
+pul4st
+3pun
+4pun.
+5punt
+punt3j
+put3j
+put3r
+4pv
+2p1w
+1py
+py5l
+5pyleen
+4pz
+pzet5
+1q
+qu4
+qui3d
+4r.
+r4a.
+r2aa
+2raan
+3raar
+5raar.
+4r3aard
+5raars
+raar5tj
+raat5jes
+2rac
+5rac.
+r4aci
+4ra5da
+3radb
+rade4r5a
+ra3di
+4r3adr
+3rads
+ra3fa
+2r3afd
+ra4f3on
+ra3fra
+ra3gn
+ra3io
+raï4
+ra3k4l
+ra4kr
+ra5kru
+4r3ala
+ra4l3ee
+4r3alf
+2r3alm
+r3alt
+r5ameu
+4ramn
+4rana
+r2anc
+rand5sl
+ran4g3o
+ran4g5r
+rank3w
+rans3p
+3r4anti
+r3antw
+ra5o.
+ra4pl
+rap3r
+2r3arb
+r2are
+2r1arm
+r3arr
+4r3art
+ra4sk
+ras5m
+ra3sth
+ra5stheni
+ra5str
+rat5sp
+r1c
+r4che.
+r4ches
+r4chet
+r5co
+r1d
+r4d3act
+rd3ama
+rdan5ste
+rd3ar
+r4das.
+rd5elas
+r4denv
+rd5enve
+rde5ra
+rder4s
+rde5sp
+r3do
+r4dol
+rd3oli
+rd5olie
+r4dont
+rd3oos
+rd2ro
+rd3rod
+rd3rol
+r3droo
+rd5sla
+rds3le
+rd3so
+rd3su
+rd1we
+rd5wo
+re2am
+3reda
+3redd
+rede4s3
+4rediti
+3redu
+r4eed
+ree4k
+4r1een
+ree3n4e
+4reers
+ree3tj
+re3fa
+5re1fl
+4reg.
+4regd
+rege4s
+4regg
+5regi
+3re1gl
+4rego
+4regt
+reid5sta
+4reie
+4reil
+4reind
+reis4t
+5reiz
+re4ka
+re2k3l
+re4kn
+re4k3ur
+re4k3uu
+2rek4w
+4rekwi
+reld3o
+rel4dr
+rel5ei.
+re5lui
+re4lur
+remie5tj
+2remm
+5r4en.
+re4naa
+re4n3ar
+3renb
+r5endert
+ren5dr
+re5nek
+r5e5nend
+5renenk
+ren3ep
+renep5e
+ren5erv
+2r1eni
+ren3ko
+re3n4o
+re4n5of
+re4n5oo
+3renti
+r3entw
+re5pa
+4req
+4r1erf
+re3r2o
+2r3ert
+4r3erv
+2rerw
+re3sa
+resi3
+re3s4ko
+re2sl
+5re4s3p
+re5spoo
+re2st
+res5tor
+res3tr
+re5tak
+re5t4i
+re4t3og
+re4tri
+reuk5s
+5revo
+4rey
+3ré
+r4f3aa
+r2f3ag
+rf3al
+r3fe
+r4f3eng
+r3fi
+r4f3lag
+rf3lat
+r1fle
+r4fli
+r3flu
+rf3op
+rf4ov
+r1fr
+r2f3re
+rf2s
+rf3sm
+r4f3ur
+r4f3uu
+r1g
+rg4al
+r3ge
+rge2a
+r4g3een
+r4g3ei
+rg4eis
+rge4l5aa
+r4g5erep
+r5gew
+rg3ij
+r4g3lu
+rg4ov
+r5grij
+rg4ro
+rg1s4
+rg2s5m
+r3h
+ridde4
+r4ie
+rie5kl
+rie5pl
+ri1eu
+ri3fl
+ri3fr
+4rijl
+rijs5l
+rij5ster
+rij4tr
+rik4o
+rik5r
+ril3m
+ri4maa
+rim2s5
+r4ing
+4r3inh
+rin4kl
+r3inko
+4rinkt
+ri3no
+4rinr
+4rins
+4rint
+ri3sc
+ri5sco
+ris5m
+ri5so
+ris5ten
+rist4j
+ri4s5to
+ri3tr
+r1j
+rkaart5j
+rk3ang
+rk3art
+r3ke
+r4k3ei
+rke4n
+rken4s
+r4k3eze
+rk3iep
+r4k3ink
+rk3lat
+rk5leer
+rk3let
+rk3olm
+rkoot5
+rk3oss
+rk3rat
+r5kri
+rk5roos
+r5kru
+rk1s
+rks4f
+rk4s3l
+rks4p
+rk2t3r
+r1kw
+rk3waa
+r4kwat
+rk3wet
+rk3win
+r3l
+rlos3
+r5lu
+r1m
+r3ma
+rma3f
+r4m3ap
+r2m3eb
+r2m3eg
+rmer3a
+r5mi
+r5moe
+rm3ont
+rm3op
+rm3s4a
+rm4sl
+2r1n
+r3na
+rn4aa
+rn5aan
+r5n4am
+r4n3ap
+rnee5t
+r4n3ene
+rne4t
+rne5ta
+rnet3j
+rn5oof
+rn3ops
+rns4
+rn5sp
+rn5tj
+r3nu
+ro5be
+r4och
+ro3d4o
+r4oe
+4roeg
+roe4g3r
+roe4p3l
+roe4rei
+roes5te
+roet3j
+3roë
+roge4s
+3rogy
+1roï
+r4ok
+3rol.
+ro2l3a
+rol3g4
+4roli
+r4ome
+r4on.
+ro2na
+ron3ad
+ron4d3o
+ron4d3u
+r2one
+ron4ka
+r2onn
+r4o1no
+r2ons
+4ront
+ron4ta
+ront3j
+ron4t3r
+ro3nu
+3roof
+2r1oor
+4rop.
+ro4paa
+ro3pe
+rop4la
+ro5po
+rop5ra
+rop3s
+r2opt
+ro3ro
+ro3sf
+ro3sn
+ro4sp
+ro3ta
+ro5te
+ro3t2h
+rot5j
+r1oud
+3rout
+4roxy
+r1p
+r3pa
+rp3ank
+r3pe
+r3pi
+r4p3j
+rp4lo
+rpoort5j
+rp3rec
+r3psa
+rp2st
+2r5r
+rre4lei
+rre4l3u
+rre3s4p
+rri3er
+rrie4t
+rron5k
+rroot5
+2rs
+r1saa
+rs3ad
+rs4ag
+r3saks
+r3sal
+rs3alm
+rs5am
+rs3ap
+rs3ar
+rs3ass
+rs3av
+rsboot5
+r3sc
+r4sco
+r4sec
+r4s3ek
+rs1ex
+r4s3ez
+r1sja
+r3skat
+r3s4kie
+rs5ku
+r5slag
+rs3lat
+rs3leg
+r5slep
+r5sleu
+r3s4lie
+rs5loep
+r5slui
+r5smaak
+rs5maal
+r3sme
+r3smi
+r4smid
+rs3nac
+r5sni
+rs4no
+rs5noo
+rs5not
+r1so
+r2s3op
+r1sp
+rs3pad
+r5span
+r5spel
+rs3pet
+r5spit
+r4s4pl
+r5spli
+r5spog
+rs3pol
+r1s4t
+rstaat4
+rst5akk
+rs5tas
+r4stav
+r3ste
+r5stend
+rs5term
+r3sti
+r4stit
+r3sto
+r4store
+r5stran
+r3stre
+rs5trei
+rst5roz
+r3stu
+rs2ui
+r1ta
+rt3ac
+rt1ad
+rt3af.
+r4tank
+rt3ape
+r2t3ar
+r2tav
+r2t3ec
+rte5la
+rte4na
+rt5eve
+rt5ha
+rt3he
+rt3hi
+r5t4i
+r3tj
+rt3ja
+rt3jo
+r1to
+r5tof
+rtoi2
+r5tol
+r4tom
+rt3om.
+rt5onr
+rt3ord
+r5tori
+r1tr
+rt4rek
+r2t3ri
+rt4rit
+rt3ru
+rt4sek
+rt4s3l
+rt3sle
+rts5m
+rt4s5n
+rt4spr
+rts5tan
+r1tu
+r4t3ui4t
+rt3we
+ru3a
+ru5ba
+rude3r
+ru1e
+ru2g
+2rui
+ru2k
+ruk3i
+ru2l
+rul3a
+ru4li
+r2um
+ru4m3i
+r2un
+runet5j
+r4us
+rut3j
+4ruu
+ru4wi
+ru5wig
+rvaat5
+rvee3t
+rvi4c
+rvil4
+rvloot5
+r1w
+r5wa
+r5we
+rwe3st
+r3x
+4rz
+rzet3j
+4s.
+5s4a.
+2s1aan5
+s3aap
+3saat
+3sab
+4s1ac
+5sacr
+3sae
+4saf
+sa3g4
+3sah
+3sai
+3saj
+3saka
+3sake
+s1akt
+s2ala
+1sali
+4salm
+5s4alo
+4salp
+4samb
+samen5t
+5samm
+s3ank
+1sant
+san4t3j
+5sap.
+s3ape
+s3apo
+sa3pr
+4s3arb
+s4ari
+4s1art
+sart5se
+sa3sc
+s4ase
+sa3s4p
+1sat
+s3atl
+2s3att
+1sau
+4s3aut
+4sav
+4s5b
+sboot5je.
+1s2c
+4sca
+2sce
+3sch
+4sch.
+4schao
+5schap
+5sche.
+4schef
+5schen
+5schep
+5scher
+5scho
+5schr
+5schu
+4sci
+sci4n
+4scl
+2sco
+s4cola
+5scoo
+3s4cop
+5scope
+5scopi
+scorres5
+3scout
+2scu
+4s1d
+s3da
+s5de
+sdis5
+s5dr
+s3dw
+3se
+5s4e.
+se4al
+se4ar
+s5ech
+5sedo
+s3eed
+4seen
+see4t
+see5ts
+4seev
+4s3ei.
+seig4
+s4ein
+5sein.
+5seine
+5seiz
+se4l3ag
+sel5eig
+s3elek
+sel5k
+se3lo
+se2ma
+sem5ac
+4s5emm
+5sen.
+se4n3em
+se4net
+5senh
+se2n5o
+sens4
+sen5sl
+sep3en
+se1r4a
+se4r5au
+se5r2e
+4serg
+se3ro
+ser4s3p
+s4es
+se5sa
+se3s4t
+ses5ten
+s4et.
+s4eta
+4sete
+set3h
+5se2tj
+set5w
+se3um
+4sex
+3sé
+3sè
+s1f
+s3fa
+4sfi
+s3fl
+s3fo
+4s5g
+sgaat5
+2s1h
+s4ha.
+sheids5
+s4h3es
+3s4hi
+s5hie
+s2hot
+s3hote
+3si
+5si.
+5s4i4e
+sie5kl
+sies4
+si4è
+si3f
+5sig
+si3g4a
+si5ge
+si5go
+s3ijv
+4s1ijz
+4s3inc
+4s3ind
+sin3g4l
+s3inko
+4s3inm
+si3no
+4sinr
+4s1ins
+4s3inz
+s4io
+sis3an
+si4se
+si4s3i
+sis5te.
+sis5tr
+si3tr
+sj2
+3s4ja.
+2sjas
+s1je
+s5je.
+s3jeb
+3sjee
+1sje4r
+sjer3i
+s5jes
+3s4jez
+sj3k
+3sjok
+4s5jon
+1sjou
+2s1k4
+4sk.
+s3ka
+skaart5j
+skie3s
+skiet4
+s3koc
+4skou
+s4kul
+1s2l4
+s4la.
+s3lad
+3s4lag
+s5lamp.
+s5lampe
+4s5land
+s3las
+2slat
+s4lav
+5slee.
+5sleeë
+s3leef
+5sleep
+4s5leer
+2sleg
+s5lei
+s3leng
+5slent
+4s3ler
+s3les
+3slet
+sle4t3j
+3s4leu
+s5leug
+5sleur
+4s5lev
+s3lez
+5slib
+2s3lic
+4slid
+4s5lied
+s5lif
+s5lig
+5slijp
+s5lijs
+5s4lik
+5sling
+s5lini
+2sliv
+slob3
+2s3loc
+3s4loe
+s3log
+s5loon
+sloor5
+s3loos
+5sloot5
+s3los
+4s3lou
+2sloz
+2s5luc
+3slui
+4s5lui.
+4sluid
+sluis4t
+5sluit
+2s3lus
+s4m
+4smaat
+2s5man
+smans3
+s5mas
+4s5mat
+3smed
+4smei
+4smelo
+s5men
+4s5mes
+smeu5ste
+5smid.
+s5min
+4smis
+5smit
+1smok
+s5mon
+1s2n4
+2snam
+3s4nav
+5s4ned
+s4nee
+snee5t
+sne2k
+3s4nel
+2snes
+2sneu
+s3neuz
+s4ni
+s5nie
+s5nim
+s3nit
+4sniv
+4snod
+s3nog
+2snoo
+3snuf
+s3nut
+3s4oc
+5sod
+1soe
+3soep
+s3off
+s3og
+so3gl
+3soi
+so2k3
+3sol
+so3lo
+3s2om
+s4om.
+s3oml
+5somm
+4s3oms
+s3omz
+s4on.
+3sona
+4s3ond
+2s3ong
+so3no
+s4ons
+4s1on2t3
+4s3onv
+s3onz
+4s5oog
+s3ook
+s3oor.
+s3oord
+5soort
+3s4op.
+2s3opg
+s3opn
+3sopp
+so3pr
+2s3opv
+4s3ord
+2s1org
+so3ro
+sor4s
+3s2ort
+so3s4
+so5st
+3s4ot
+so3tr
+4sott
+sou3t
+2s1ov
+s2p
+4sp.
+4spaal
+5spaan
+5spaat
+4spad
+4spak
+2spap
+5spar.
+5sparr
+4s3pas
+4spau
+5spectie.
+5specties
+5spectiv
+5specto
+speet5
+2speg
+s5pei
+spe2k
+2spen
+s4pene
+4spers
+spers5p
+spes4
+spe3st
+2spet
+4spex
+4spez
+s4ph
+spie5tj
+4spijn
+4spijp
+5spil
+5spio
+2s3p4l
+s5pla
+spli4
+4s5plu
+2spol
+4spom
+s4pore
+sport5r
+2spos
+4spoth
+s5pred
+3sprie
+sp5riem
+5spriet
+4s3prij
+5spron
+4s3ps
+4spt
+4spun
+5spur
+2s3r
+4s3s4
+s5sa
+s5sc
+s5se
+ssei3s
+s5si
+ssis4
+ssi3st
+s5sm
+s5snu
+s5so
+ss5pas
+s5su
+s2t
+4st.
+5staan.
+4staanw
+staart5j
+4s4t3a2c
+3stad
+2staf
+3staf.
+4stakk
+st3akt
+s4tap
+4stas
+s4tav
+5stave
+2stb
+2std
+4s5tech
+3s4ted
+3steek
+3steem
+3steen
+4steka
+s3teks
+st5elem
+3s4tem
+4stema
+4stemo
+st4en
+s4tene
+s4teni
+4s5tenta
+s4tep
+ster5ijz
+ster5og
+4steva
+s4t3ex
+s4t3ez
+2stf
+2stg
+2st1h
+st2he
+st3hed
+st5heer
+s5them
+5sthenic
+5sthenis
+s3ther
+s4tho
+s4thy
+2stia
+4sticu
+4stie.
+4stief
+5stiefe
+4sties
+4stiev
+5stigm
+4stijd
+5s4tijl
+4st3ijs
+3stils
+s5tis
+4stiv
+4s4t1j
+2stk
+2stl
+2stm
+2stn
+4stoc
+4stoef
+4stoej
+5stoel
+5stoep
+4stoer
+4stoes
+5stoet
+4stoez
+3stof
+st3oge
+3s4tok
+4stone
+4stong
+st3oog
+3stoot
+stoot5j
+4st3ord
+3stot
+s4tov
+2stp
+1str
+st4ra
+straat5j
+5straf
+4strap
+st3rec
+s4tred
+4streg
+4strei
+s5trein
+s4trek
+5stren
+st3rif
+st4rol
+st4rom
+st4roo
+4stroos
+st5roos.
+4strou
+4stroz
+2st1s4
+st5sc
+st5se
+2stt
+1stu
+4stub
+5stuk
+s4tun
+st3uni
+2stv
+2s4t5w
+3s4ty5
+1styl
+2stz
+1su
+3su3a
+sub1
+3suc
+3sue
+5suik
+5suis
+s1uit
+5suk
+3sul
+2s1un
+5surp
+5surv
+s4us
+4s5v
+svaat5
+svoge4
+4s1w
+s4y
+3sy.
+sy4n3e
+sys5
+4s5z
+4t.
+t3aang
+t3aanw
+t3aanz
+4t3aap
+taar5st
+4t3aas
+3tabl
+2tac
+3tace
+t4aci
+t4act
+4tad
+t3ader
+tad4s3
+2taf.
+2tafd
+5tafe
+4t3afs
+ta2g3r
+tai4l
+ta3kl
+ta4kle
+5talent
+talm5a
+4talt
+ta4mak
+4tamb
+t3amba
+3tame
+tament5j
+4tamp
+tan4dol
+tan4d3r
+tan4dw
+tan4gr
+5t4ans
+3tant
+5tapi
+ta3pl
+t4are
+t4ari
+t1arm
+ta2r3o
+3tarw
+3tas
+5tasj
+5tass
+ta5str
+4tata
+2t3atl
+3tatr
+3tau
+4taut
+4t1avo
+2t3az
+4tb
+4t1c
+4t5d
+1te
+te3a.
+te2ad
+te3ak
+tee2
+4teek
+tee4k3l
+teem5a
+4teen
+tee3ro
+tee3t
+tee5tjes
+2t3eff
+te3fl
+t4e3g4
+tege4n5
+3teh
+4t3eier
+4teig
+t3eind
+teit2
+4tek.
+5teka
+5tekeni
+5tekens
+teks2
+4t3ekse
+t4el
+te4lap
+5telef
+5teleg
+5telev
+tel5k
+te3lo
+te4l3og
+4telse
+te4l3uu
+5tema
+te4mor
+5temper
+5tempo
+4temu
+3t2en
+5tenbo
+5tene.
+te4nek
+te4net
+tenier5tj
+5tenij
+ten5k
+te4nol
+ten4su
+t4enta
+t5entac
+ten4tj
+3teo
+t2er
+teraads5
+te4r5aak
+ter3ab
+ter3ag
+te3ral
+te3ran
+te5rat
+ter4du
+te3re
+te4rei
+te4rem
+te4r5env
+ter5ge
+teri4ci
+5terig
+te4r5in.
+3term
+5term.
+ter5oc
+te3rog
+ter5om
+5te3ron
+te4ros
+4terren
+ter5sc
+3t4es
+5tesa
+te3sap
+tes4l
+5tesm
+test5ri
+te3th
+4t3euv
+t4ev
+5tevaa
+t5evan
+2tex
+texi5
+t4ext
+1té
+t1f
+4t3g2
+tgaat5
+tge3la
+2t1ha
+4t3ham
+3thea
+t3heb
+5thee.
+5theen
+4t5hei
+t3hel
+t4hen
+5thene
+5theo
+1ther
+t3here
+5therm
+3thes
+3thet
+this5m
+t3hoe
+t3hok
+t1hoo
+thoof5di
+t1hou
+t3houd
+3thr
+2thu
+t4hur
+3thy
+3ti
+5ti.
+5tia
+5tica
+5ticu
+5tie.
+5tief.
+5tiefs
+5tiek.
+tie5kla
+tie4kon
+5tien
+5ties
+tie5sl
+ti1eu
+5tiev
+ti4è
+ti3fe
+ti3fr
+ti2ga
+4tigm
+ti2gu
+tig3ur
+5tijd
+5tijn
+4t1ijz
+ti5kle
+ti5kr
+ti3kw
+t4il
+ti4laa
+4tils
+ti4m3in
+5timm
+tin5ade
+4t3ind
+4tinf
+tin4g3i
+ting5r
+tini5è
+4t3inl
+t3inq
+4tins
+5tint
+4tinv
+4tinw
+tis4l
+tis5la
+ti3sli
+tis5m
+ti3s4p
+5tite
+ti3th
+ti1tr
+t3ivo
+1tj2
+4tja
+t3jen
+tjes5c
+t3jesd
+tje5spr
+4tjeu
+4tjo
+5tjoe
+5tjok
+2tju
+4t3k2
+4t3l
+t4lem
+4t3m
+tmo4s5
+4t3n
+5t4o.
+3toc
+3tod4
+to3do
+t4oe
+toe5d
+5toej
+toe3k
+4toel
+toe5la
+toel4tj
+toemaat5
+5toen
+5toeri
+5toe1s
+toe3tj
+toe5tr
+5toez
+to2f
+4tof.
+to4f5l
+tof3th
+to3g4n
+3toj
+to4ka
+t4ol
+2t3oli
+5tolo
+to2lu
+3toma
+tomaat5
+tom4p3j
+2t3oms
+t4on
+5ton.
+5tone
+5tong
+5tonn
+to3no
+4tonr
+to3nu
+toom3e
+5toon
+toor5tj
+4topd
+to3pe
+to3phe
+to3p4le
+2topn
+to4por
+4t3o4pr
+t3opsl
+t3opto
+5tor.
+5torens
+4t3org
+tor4ma
+to3ro
+5torr
+3tors
+5to3s4
+to5sa
+to4st
+tos5te
+to3tr
+2t3oud
+tou4re
+tove5na
+4toverg
+tozo5a
+4t5p4
+tpe4t3
+3tra.
+4traf
+5trag
+3trakt
+4trand
+5trap.
+5trapp
+t3rasp
+3tre.
+4trec
+4treda
+t5redes
+t4ref
+2t1reg
+3trein
+4t3reis
+4treiz
+trest5r
+tre2t3
+3t4reu
+t3rib.
+tri3g2
+5tril
+3t4rio
+3t4ris4
+4tro.
+4t3roed
+t3roes
+5trog.
+5trogg
+t4roï
+4trol.
+t2rom
+3tromm
+3tron.
+5trone
+3tronn
+3trons
+t5rood
+5troon
+t4roos
+5troost
+tro5sp
+5t4rou
+4tru
+5truc.
+5truf
+5truie
+trui3t
+t4rum
+4ts
+ts3ad
+ts3af
+ts3ak
+ts3al
+t3sap
+ts3as
+t4scr
+ts4cu
+ts3een
+t4s3ei
+ts5eind
+ts3eko
+t5sel
+ts4en
+t4s3eng
+ts3erg
+ts4hel
+tsi4ga
+t4sij
+t4sink
+t4s3int
+ts2j
+ts3ja
+5tsji
+t5slag.
+ts3lam
+t2sle
+ts3led
+t5s4lep
+ts5ma
+t2s5mu
+ts3neu
+ts5nik
+t3s4no
+t4s3om
+ts3on
+ts1or
+t1sp
+ts3pad
+ts4par
+t5spel
+ts3pet
+ts1pl
+ts4pli
+ts3pol
+t5s4por
+ts4t
+t1sta
+t4staal
+t5stap
+t1ste
+t5stee
+ts5teks
+t5sten
+t4s5term
+ts5th
+t3sti
+t5stil
+t1sto
+ts5toc
+t4s3tol
+t4s5tore
+t4sty
+t4su
+ts3ur
+ts3uu
+t3sy
+4t3t
+t5ta
+t5te
+ttent5j
+tte5ras
+tting5ste
+t5tr
+tt3uu
+tu1a
+5tu5b
+tu5d
+3tue
+5tuig
+5tuin
+4tuip
+t3uitg
+tui3tj
+3t4us
+tu3wa
+4tv
+tvaat5
+4t1wa
+4twe
+5t4wijf
+4t3wil
+t4win
+t5wind
+t1wo
+t1wr
+1ty3
+5typ
+4tz
+4ua
+u3a.
+u3ac
+uae2
+u1al
+u1an
+uar5t
+u1ati
+u4b
+ubal5
+u5be
+ubes5
+u5bi
+4uc
+u3che
+u3cho
+uch5ten
+uch4to
+uc4t3a
+ud3ei
+u5den
+uden4tj
+ud3ess
+u4d3ez
+u4do
+ud3oo
+ud3ov
+u2d3r
+ud5ro
+ud5sla
+ud4sm
+ud5sme
+ud5smi
+ud1w
+4ue
+u1ee
+u1el
+u3er
+ue4s
+uet3j
+uet5sp
+u1eu
+u3ez
+u3ée
+u3è
+u3fa
+u3fl
+u3fr
+uf2s
+u3ga
+u4g3ad
+uge4leg
+ug3ij
+ug3l
+ugmar5c
+u2g1r
+ug1s4
+ug3sl
+u3h
+u4i
+4ui.
+2uid
+ui2d3a
+ui4d5eu
+ui2do
+uid5oo
+ui2dr
+uids5e.
+uids4p
+uid5spr
+uids3t
+ui4du
+ui3e
+uie3s
+ui2fa
+uif1l
+uif5r
+ui2fu
+4uig
+ui4go
+4uik
+uik3l
+uik5r
+2uil
+uil3aa
+ui4l3og
+ui4loo
+2uim
+ui4m3a
+uime3s
+ui4n1a
+uin5g
+ui2no
+uins5lo
+ui2p3l
+4uis
+ui4sa
+ui4sh
+ui4sl
+ui5slu
+uis5m
+ui4so
+ui4st
+ui5stene
+ui2t1a
+uit1h
+uit3j
+uit4je
+3uit1r
+4uï
+u3j
+uk3al
+uk3as
+u3ke
+uke3no
+u2k3l
+u2k3n
+u2k3o
+uko5p
+u4k1r
+uk3sm
+uk3sn
+uks3p
+uk4s3te
+uk1w
+u1la
+ul3ac
+u3l4an
+ul5and
+uld5erk
+u3le
+ul3fl
+ul5fo
+ul3fu
+ul3ij
+ul3k2a
+ul2lo
+u1lo
+u2loe
+ul3op
+ul2p3l
+ul2po
+ul4p3r
+ul3sa
+uls5tel
+u3lu
+ul3ui
+um3ac
+3umc
+umel4
+um5po
+3umz
+u1na
+un3ac
+un3ak
+un2c
+un3che
+unch3r
+une4tj
+un3g4
+u5ni
+unst3r
+4unt
+un4tag
+unt5een
+un2tj
+unt5o
+u3nu
+uo3i
+u3on
+u3oo
+uo3r
+u3os
+u3oz
+u3pa
+u2pek
+u3p2h
+u1pi
+up3j
+u1pl
+u1po
+u3pr
+u1pu
+2ur
+u1ra
+u4r3ar
+urari4
+ura3st
+ur3au
+ur2c
+urd4o
+u1re
+u2r3ec
+uree3s
+ure5lu
+ur3env
+ure4t3
+ur2f
+ur3fl
+urf3s
+u1ri
+ur3ijz
+u4r3ind
+urken5
+urmar4
+ur2no
+ur5open
+ur5pr
+urs5ag
+ur3s4f
+ur2s3l
+ur2s5n
+ur4sti
+urs5tik
+ur3ta
+4urv
+u3ry5
+us3ar
+u4sc
+us3ch
+u5scr
+use3tj
+u4s5l
+us5m
+u2s5n
+us3on
+us3op
+us3os
+us3p
+u2st
+us4ta
+us5tag
+ust3al
+u4s3te
+us4t3ei
+ust5on
+ust3oo
+us3tor
+us5tru
+ust3u
+u1ta
+ut3aan
+utaar5
+ut3ac
+u3tan
+u4t3ees
+u2t3ek
+u2t3em
+ut5ex
+u2tj
+u1to
+ut3oog
+uto5s
+ut3ri
+ut3saa
+ut3sc
+uts5eng
+ut3sku
+ut3so
+ut2s3p
+ut5su
+u1tu
+ut5w
+uu2
+uur3a
+uur5k
+uur1o
+uw1a
+u3wag
+uw3au
+u1we
+uw3een
+u2w3ei
+uw3eko
+u5wen
+uwen5k
+uwe3s4
+u1wi
+uw3ij
+u3win
+uw3n
+uw1o
+u3woe
+uw1r
+u3xi
+u3ya
+uzes4
+uze5t
+3v4
+4v.
+5va
+vaar5tj
+vag4
+va2ko
+va4kon
+va2l3a
+va3laa
+val5m
+val4s3p
+vals5tek
+va2n
+van4ch
+van4g5r
+va3no
+va5p
+vast3r
+va2t3h
+vee4l
+veel5e
+vee3p4
+vee5sta
+vei3s4
+vel4d3o
+vel4du
+vel4s3n
+ve4na
+ve5nare
+ven5dr
+ven5k
+ve2n3o
+ven4se
+ven4sl
+vens5lo
+ven4s3u
+vent4s
+ve2r
+ver1a
+ver5aas
+ve4rad
+ver5do
+ver3ed
+ve3rei
+ver3er
+ver3et
+ver5ijl
+ve5ring
+verk4
+ver1o
+ve3rom
+vers4a
+ver3sp
+ver5sto
+ver3u
+ve2s3
+ve3sa
+ve3s4c
+ve3su
+ve2t3j
+ve2t3o
+ve3tor
+ve4t3r
+ve5t4ro
+vet5sta
+vie4r3a
+vies3n
+vil4t3j
+vi4sa
+vis3an
+vis5m
+vis5ot
+vi3t2r
+4v5j
+4v5lar
+vlei3s4
+vlie4s3
+voe4t3r
+voet5sp
+vo2le
+vol4g3a
+vo2li
+vol3ij
+volk4s3
+voorn4
+voor5na
+vo3ra
+vot5j
+vr2
+vrij3k
+vrijs4
+vuet4
+vui2
+vy5
+2w.
+waar5e
+wa4b3
+w2ad
+w2ag
+wa5ge
+wagen5t
+wal3a
+4wam
+wam5pl
+4wana
+waneëi5
+wan4gl
+wang5sl
+wa2no
+wan3s
+wan5sp
+3wap
+3warm
+wart3j
+war4to
+wa4si
+was5m
+3wat
+2wb
+2wd
+w4doo
+wd3oom
+we2at
+we4ba
+3wed
+wede4
+we2d3i
+we4d3r
+wee5kla
+week3r
+wee4r
+weer3o
+wees4t
+wee5ste
+wee5str
+wee3tj
+we2g3a
+weg1l
+we2go
+we2g3r
+3weid
+wei5s
+we2k3a
+4weko
+we4k3r
+wel3ed
+wel3ee
+wel3sm
+we4mi
+we2n
+we3naa
+wen3ad
+we3ne
+we4nem
+wen4ka
+wen3o
+wer2g
+wer4g3r
+wer4k3l
+werk3u
+wer4s
+2w3erw
+we2s3
+3wet.
+we4t3h
+we2t3j
+wezens5
+wezen5t4
+2w3f
+w1g
+4w1h
+w4hi
+wie4t
+w3igd
+w3igi
+w3igt
+3wijd
+wij4ka
+wij4s
+wijs5m
+wi2k
+wik5l
+3will
+3wim
+w4in
+win4d3r
+wing5st
+2w5inr
+winst5a
+wis5m
+wi4t3h
+wit3j
+w1j
+2w1k
+2w1l
+w1m
+2wn
+wn4i
+w3no
+w2oe
+woei2
+woe3ie
+woel3a
+woe4s
+woest5a
+woes5te
+wo2l
+wol3a
+wolf2
+wolfs5
+woor4d5r
+wor4ge
+worg5eng
+4wot
+w1p
+wper2
+wpers3
+w3ru
+2ws
+ws3a
+ws4k
+ws5ke
+w3s4p
+w4spe
+w5spel
+ws4t
+w1sta
+w3ste
+w3sto
+2wt
+wte5ri
+w3to
+w3tr
+w1w
+2x
+x3ad
+xamen5t
+xan3
+xan5t
+x1c
+xe3a
+xe3ro
+x3f
+x1h
+4xiet.
+x3ing
+xi4s4
+xis5m
+xi3st
+xi5sta
+x3l
+xo3s
+x1p
+x1t
+x2t3ak
+xtie4
+x3w
+xy5
+y1
+y2a.
+y4ah
+y3au
+yber4
+ybert3
+yce3
+yd4r
+ydro3
+y4in
+yis5m
+y4l
+ylar3
+y5lee
+yl3et
+y5li
+y5lo
+y5lu
+y2m
+y3me
+ym2fl
+y3mo
+ym5pa
+y3mu
+y2n
+y3na
+y4n3an
+yn3er
+y3ni
+y3no
+yn3t
+ynx5
+y5oo
+y4pew
+y3ph
+y5r4e
+y5ri
+y5ro
+y4s2
+y5sa
+y5se
+y5sf
+y5sh
+y5si
+ys5m
+y5so
+ys3t
+ys4to
+y5sy
+yto3
+1z
+2z.
+zaar5t
+za2k3a
+zan4d3a
+zan4dr
+zar5t
+za5s4
+2zb
+3ze
+zee5le
+zee3n
+zee3s4
+zee3tj
+zeg4sl
+zel5dr
+ze3mo
+zen4d3a
+zene4
+zen5k
+ze4nol
+zen4t3j
+ze4r3a
+ze3ro
+zer4sl
+zer4sp
+ze4s3e
+ze2s5m
+zes5tal
+ze3ste
+ze4tan
+ze4ti
+ze4tj
+ze2t3r
+ze3tre
+zeun3
+zeve2
+zeven3
+3z2i
+ziek3l
+ziel4s
+zi2ga
+zij5s4
+zin4k3l
+zin4sl
+zin4sm
+zis5m
+zit3j
+zi2t3u
+4zk
+2zm
+zo4a.
+zoet3j
+zo3f2
+zoï4s
+zome4
+zo4nek
+zon3sf
+zo3s
+zo2t
+zot3h
+4z3r
+2zs
+zus3
+2zv
+z4w
+zwe2m
+zwenk5a
+4zz
+}
+% Exception list for GB90
+\hyphenation{
+aan-pers-te
+acht-en-der
+acht-en-ders
+acht-en-der-tig
+acht-en-der-tig-ste
+ant-arc-tis
+be-scherm-en-gel
+be-scherm-en-ge-len
+don-der-aal
+drie-ster
+gast-rol-len
+ge-laats-trek-ken
+han-dels-taal
+ket-ting-ste-ken
+lands-taal
+lui-ste
+mi-nis-ters-por-te-feuil-le
+mi-nis-ters-por-te-feuil-les
+moet-je
+pa-ling-ste-ken
+schel-linkje
+spie-gel-ei
+ti-chel-aar-de
+vier-en-der-tig
+vier-en-der-tig-ste
+}
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-sla.tex b/tex/context/base/lang-sla.tex index c61455e19..c7e8dcc29 100644 --- a/tex/context/base/lang-sla.tex +++ b/tex/context/base/lang-sla.tex @@ -1,86 +1,87 @@ -%D \module -%D [ file=lang-sla, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Slavic Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% Belarussian, Russian, Ukrainian, Bulgarian, Macedonian, -% Serbo-Croatian, Slovenian, Czech, Kushubian, -% Lusatian/Sorbian/Wendish, Polish, Slovak, Albanian, -% Illyrian, Armenian - -\writestatus{loading}{Slavic Languages} - -\unprotect - -\installlanguage - [\s!pl] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!default=\s!en, - \c!status=\v!start] - -\setupheadtext [\s!pl] [\v!inhoud=Spis rzeczy] -\setupheadtext [\s!pl] [\v!tabellen=Tabele] -\setupheadtext [\s!pl] [\v!figuren=Ilustracje] -\setupheadtext [\s!pl] [\v!grafieken=Grafika] -\setupheadtext [\s!pl] [\v!intermezzos=Intermezzi] -\setupheadtext [\s!pl] [\v!index=Indeks] -\setupheadtext [\s!pl] [\v!afkortingen=Skr\'ocenie] -\setupheadtext [\s!pl] [\v!logos=Snaki] -\setupheadtext [\s!pl] [\v!eenheden=Jednostki] - -\setuplabeltext [\s!pl] [\v!tabel=Tabela ] -\setuplabeltext [\s!pl] [\v!figuur=Ilustracja ] -\setuplabeltext [\s!pl] [\v!intermezzo=Intermezzo ] -\setuplabeltext [\s!pl] [\v!grafiek=Grafika ] -\setuplabeltext [\s!pl] [\v!hoofdstuk=] -\setuplabeltext [\s!pl] [\v!paragraaf=] -\setuplabeltext [\s!pl] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!pl] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!pl] [\v!bijlage=] -\setuplabeltext [\s!pl] [\v!deel=Ust\c{e}p] %%% NOTE: Below the e should be something which looks rather like |_ than like _| (\c{c}edile), suggestions? -\setuplabeltext [\s!pl] [\v!regel=wiersz] -\setuplabeltext [\s!pl] [\v!regels=wiersze] - -\setuplabeltext [\s!pl] [\v!january=stycze\'n] -\setuplabeltext [\s!pl] [\v!february=luty] -\setuplabeltext [\s!pl] [\v!march=marzec] -\setuplabeltext [\s!pl] [\v!april=kwiecie\'n] -\setuplabeltext [\s!pl] [\v!may=maj] -\setuplabeltext [\s!pl] [\v!june=czerwcowy] -\setuplabeltext [\s!pl] [\v!july=lipiec] -\setuplabeltext [\s!pl] [\v!august=sierpie\'n] -\setuplabeltext [\s!pl] [\v!september=wrzesie\'n] -\setuplabeltext [\s!pl] [\v!october=pa\'zdziernik] -\setuplabeltext [\s!pl] [\v!november=listopad] -\setuplabeltext [\s!pl] [\v!december=grudzie\'n] - -\setuplabeltext [\s!pl] [\v!sunday=niedziela] -\setuplabeltext [\s!pl] [\v!monday=poniedzia\l ek] -\setuplabeltext [\s!pl] [\v!tuesday=wtorek] -\setuplabeltext [\s!pl] [\v!wednesday=\'sroda] -\setuplabeltext [\s!pl] [\v!thursday=czwartek] -\setuplabeltext [\s!pl] [\v!friday=pi\c{a}tek] %%% NOTE: Below the a should be something which looks rather like |_ than like _| (\c{c}edile), suggestions? -\setuplabeltext [\s!pl] [\v!saturday=sobota] - -%D \ShowAllLanguageValues [\s!pl] [polish] poolse ... - -\protect - -\endinput +%D \module
+%D [ file=lang-sla,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Slavic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Belarussian, Russian, Ukrainian, Bulgarian, Macedonian,
+% Serbo-Croatian, Slovenian, Czech, Kushubian,
+% Lusatian/Sorbian/Wendish, Polish, Slovak, Albanian,
+% Illyrian, Armenian
+
+\writestatus{loading}{Slavic Languages}
+
+\unprotect
+
+\installlanguage
+ [\s!pl]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!default=\s!en,
+ \c!status=\v!start]
+
+\setupheadtext [\s!pl] [\v!inhoud=Spis rzeczy]
+\setupheadtext [\s!pl] [\v!tabellen=Tabele]
+\setupheadtext [\s!pl] [\v!figuren=Ilustracje]
+\setupheadtext [\s!pl] [\v!grafieken=Grafika]
+\setupheadtext [\s!pl] [\v!intermezzos=Intermezzi]
+\setupheadtext [\s!pl] [\v!index=Indeks]
+\setupheadtext [\s!pl] [\v!afkortingen=Skr\'ocenie]
+\setupheadtext [\s!pl] [\v!logos=Snaki]
+\setupheadtext [\s!pl] [\v!eenheden=Jednostki]
+
+\setuplabeltext [\s!pl] [\v!tabel=Tabela ]
+\setuplabeltext [\s!pl] [\v!figuur=Ilustracja ]
+\setuplabeltext [\s!pl] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!pl] [\v!grafiek=Grafika ]
+\setuplabeltext [\s!pl] [\v!hoofdstuk=]
+\setuplabeltext [\s!pl] [\v!paragraaf=]
+\setuplabeltext [\s!pl] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!pl] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!pl] [\v!bijlage=]
+\setuplabeltext [\s!pl] [\v!deel=Ust\c{e}p] %%% NOTE: Below the e should be something which looks rather like |_ than like _| (\c{c}edile), suggestions?
+\setuplabeltext [\s!pl] [\v!regel=wiersz]
+\setuplabeltext [\s!pl] [\v!regels=wiersze]
+
+\setuplabeltext [\s!pl] [\v!january=stycze\'n]
+\setuplabeltext [\s!pl] [\v!february=luty]
+\setuplabeltext [\s!pl] [\v!march=marzec]
+\setuplabeltext [\s!pl] [\v!april=kwiecie\'n]
+\setuplabeltext [\s!pl] [\v!may=maj]
+\setuplabeltext [\s!pl] [\v!june=czerwcowy]
+\setuplabeltext [\s!pl] [\v!july=lipiec]
+\setuplabeltext [\s!pl] [\v!august=sierpie\'n]
+\setuplabeltext [\s!pl] [\v!september=wrzesie\'n]
+\setuplabeltext [\s!pl] [\v!october=pa\'zdziernik]
+\setuplabeltext [\s!pl] [\v!november=listopad]
+\setuplabeltext [\s!pl] [\v!december=grudzie\'n]
+
+\setuplabeltext [\s!pl] [\v!sunday=niedziela]
+\setuplabeltext [\s!pl] [\v!monday=poniedzia\l ek]
+\setuplabeltext [\s!pl] [\v!tuesday=wtorek]
+\setuplabeltext [\s!pl] [\v!wednesday=\'sroda]
+\setuplabeltext [\s!pl] [\v!thursday=czwartek]
+\setuplabeltext [\s!pl] [\v!friday=pi\c{a}tek] %%% NOTE: Below the a should be something which looks rather like |_ than like _| (\c{c}edile), suggestions?
+\setuplabeltext [\s!pl] [\v!saturday=sobota]
+
+%D \ShowAllLanguageValues [\s!pl] [polish] poolse ...
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-sp.pat b/tex/context/base/lang-sp.pat index f3b0e56e8..72c2e6095 100644 --- a/tex/context/base/lang-sp.pat +++ b/tex/context/base/lang-sp.pat @@ -1,150 +1,151 @@ -% Hyphenation patterns for Spanish. -% Compiled by Julio Sanchez (jsanchez@gmv.es) on September 1991. -% -% These patterns have been derived from "On Word Division in Spanish", -% Jos'e A. Ma~nas, Communications of the ACM, and implemented in his -% package ftc. You can get ftc and a draft of the abovementioned -% paper from goya.dit.upm.es in src/text.proc/ftc.Z. FTP access may -% be available. Otherwise, send help to info@goya.dit.upm.es for -% details on use of the mail server. -% -% Rules mentioned below are those described in that paper. After -% several unsatisfactory attempts to pretend I knew better, these -% patterns closely follow that paper. Pattern 'tl' is not considered. -% It is conflictive and ftc does not use it either. -% -% These patterns have been generated by shyphen.sh version 1.2, -% shyphen.sh is a sh script that allows a number of choices. -% Full benefit from some of these options can only be -% obtained if appropriate fonts are available. -% -% Follows a copyright notice. This is not in the public domain, -% but the copyright is essentially a hold-harmless clause. That -% is, use it at will, but don't sue me if you don't like it. -% -% COPYRIGHT NOTICE -% -% These patterns and the generating sh script are Copyright (c) GMV 1991 -% These patterns were developed for internal GMV use and are made -% public in the hope that they will benefit others. Also, spreading -% these patterns throughout the Spanish-language TeX community is -% expected to provide back-benefits to GMV in that it can help keeping -% GMV in the mainstream of spanish users. However, this is given -% for free and WITHOUT ANY WARRANTY. Under no circumstances can Julio -% Sanchez, GMV, Jos'e A. Ma~nas or any agents or representatives thereof -% be held responsible for any errors in this software nor for any damages -% derived from its use, even in case any of the above has been notified -% of the possibility of such damages. If any such situation arises, you -% responsible for repair. Use of this software is an explicit -% acceptance of these conditions. -% -% You can use this software for any purpose. You cannot delete this -% copyright notice. If you change this software, you must include -% comments explaining who, when and why. You are kindly requested to -% send any changes to tex@gmv.es. If you change the generating -% script, you must include code in it such that any output is clearly -% labeled as generated by a modified script. -% -% Despite the lack of warranty, we would like to hear about any -% problem you find. Please report problems to tex@gmv.es. -% -% END OF COPYRIGHT NOTICE -% -% Options included in this set: basic isolatin1 ugly -% Open vowels: a e o ^^e1 ^^e9 ^^ed ^^f3 ^^fa -% Closed vowels: i u ^^fc -% Consonants: b c d f g j k l m n p q r s t v w x y z ^^f1 -% -% Some of the patterns below represent combinations that never -% happen in Spanish. Would they happen, they would be hyphenated -% according to the rules. - -% This keeps {cat|lc}code changes, if any, local. Nice to users of -% multilingual versions. These are the minimum changes needed to process -% the patterns. These and other changes will have to be re-enacted when -% Spanish be established as the current language. See the babel docs if -% you don't understand this. -\begingroup -\catcode`\^^e1=11 \lccode`\^^e1=`\^^e1 % 'a -\catcode`\^^e9=11 \lccode`\^^e9=`\^^e9 % 'e -\catcode`\^^ed=11 \lccode`\^^ed=`\^^ed % 'i -\catcode`\^^f1=11 \lccode`\^^f1=`\^^f1 % 'o -\catcode`\^^f3=11 \lccode`\^^f3=`\^^f3 % ~n -\catcode`\^^fa=11 \lccode`\^^fa=`\^^fa % 'u -\catcode`\^^fc=11 \lccode`\^^fc=`\^^fc % "u -\patterns{ -% Rule SR1 -% Vowels are kept together by the defaults -% Rule SR2 -% Attach vowel groups to left consonant -1ba 1be 1bo 1b^^e1 1b^^e9 1b^^ed 1b^^f3 1b^^fa 1bi 1bu 1b^^fc -1ca 1ce 1co 1c^^e1 1c^^e9 1c^^ed 1c^^f3 1c^^fa 1ci 1cu 1c^^fc -1da 1de 1do 1d^^e1 1d^^e9 1d^^ed 1d^^f3 1d^^fa 1di 1du 1d^^fc -1fa 1fe 1fo 1f^^e1 1f^^e9 1f^^ed 1f^^f3 1f^^fa 1fi 1fu 1f^^fc -1ga 1ge 1go 1g^^e1 1g^^e9 1g^^ed 1g^^f3 1g^^fa 1gi 1gu 1g^^fc -1ja 1je 1jo 1j^^e1 1j^^e9 1j^^ed 1j^^f3 1j^^fa 1ji 1ju 1j^^fc -1ka 1ke 1ko 1k^^e1 1k^^e9 1k^^ed 1k^^f3 1k^^fa 1ki 1ku 1k^^fc -1la 1le 1lo 1l^^e1 1l^^e9 1l^^ed 1l^^f3 1l^^fa 1li 1lu 1l^^fc -1ma 1me 1mo 1m^^e1 1m^^e9 1m^^ed 1m^^f3 1m^^fa 1mi 1mu 1m^^fc -1na 1ne 1no 1n^^e1 1n^^e9 1n^^ed 1n^^f3 1n^^fa 1ni 1nu 1n^^fc -1pa 1pe 1po 1p^^e1 1p^^e9 1p^^ed 1p^^f3 1p^^fa 1pi 1pu 1p^^fc -1qa 1qe 1qo 1q^^e1 1q^^e9 1q^^ed 1q^^f3 1q^^fa 1qi 1qu 1q^^fc -1ra 1re 1ro 1r^^e1 1r^^e9 1r^^ed 1r^^f3 1r^^fa 1ri 1ru 1r^^fc -1sa 1se 1so 1s^^e1 1s^^e9 1s^^ed 1s^^f3 1s^^fa 1si 1su 1s^^fc -1ta 1te 1to 1t^^e1 1t^^e9 1t^^ed 1t^^f3 1t^^fa 1ti 1tu 1t^^fc -1va 1ve 1vo 1v^^e1 1v^^e9 1v^^ed 1v^^f3 1v^^fa 1vi 1vu 1v^^fc -1wa 1we 1wo 1w^^e1 1w^^e9 1w^^ed 1w^^f3 1w^^fa 1wi 1wu 1w^^fc -1xa 1xe 1xo 1x^^e1 1x^^e9 1x^^ed 1x^^f3 1x^^fa 1xi 1xu 1x^^fc -1ya 1ye 1yo 1y^^e1 1y^^e9 1y^^ed 1y^^f3 1y^^fa 1yi 1yu 1y^^fc -1za 1ze 1zo 1z^^e1 1z^^e9 1z^^ed 1z^^f3 1z^^fa 1zi 1zu 1z^^fc -1^^f1a 1^^f1e 1^^f1o 1^^f1^^e1 1^^f1^^e9 1^^f1^^ed 1^^f1^^f3 1^^f1^^fa 1^^f1i 1^^f1u 1^^f1^^fc -% Rule SR3 -% Build legal consonant groups, leave other consonants bound to -% the previous group. This overrides part of the SR2 pattern -% group. -1c2ha 1c2he 1c2ho 1c2h^^e1 1c2h^^e9 1c2h^^ed 1c2h^^f3 1c2h^^fa 1c2hi 1c2hu 1c2h^^fc -1l2la 1l2le 1l2lo 1l2l^^e1 1l2l^^e9 1l2l^^ed 1l2l^^f3 1l2l^^fa 1l2li 1l2lu 1l2l^^fc -1r2ra 1r2re 1r2ro 1r2r^^e1 1r2r^^e9 1r2r^^ed 1r2r^^f3 1r2r^^fa 1r2ri 1r2ru 1r2r^^fc -1b2la 1b2le 1b2lo 1b2l^^e1 1b2l^^e9 1b2l^^ed 1b2l^^f3 1b2l^^fa 1b2li 1b2lu 1b2l^^fc -1b2ra 1b2re 1b2ro 1b2r^^e1 1b2r^^e9 1b2r^^ed 1b2r^^f3 1b2r^^fa 1b2ri 1b2ru 1b2r^^fc -1c2la 1c2le 1c2lo 1c2l^^e1 1c2l^^e9 1c2l^^ed 1c2l^^f3 1c2l^^fa 1c2li 1c2lu 1c2l^^fc -1c2ra 1c2re 1c2ro 1c2r^^e1 1c2r^^e9 1c2r^^ed 1c2r^^f3 1c2r^^fa 1c2ri 1c2ru 1c2r^^fc -1d2ra 1d2re 1d2ro 1d2r^^e1 1d2r^^e9 1d2r^^ed 1d2r^^f3 1d2r^^fa 1d2ri 1d2ru 1d2r^^fc -1f2la 1f2le 1f2lo 1f2l^^e1 1f2l^^e9 1f2l^^ed 1f2l^^f3 1f2l^^fa 1f2li 1f2lu 1f2l^^fc -1f2ra 1f2re 1f2ro 1f2r^^e1 1f2r^^e9 1f2r^^ed 1f2r^^f3 1f2r^^fa 1f2ri 1f2ru 1f2r^^fc -1g2la 1g2le 1g2lo 1g2l^^e1 1g2l^^e9 1g2l^^ed 1g2l^^f3 1g2l^^fa 1g2li 1g2lu 1g2l^^fc -1g2ra 1g2re 1g2ro 1g2r^^e1 1g2r^^e9 1g2r^^ed 1g2r^^f3 1g2r^^fa 1g2ri 1g2ru 1g2r^^fc -1k2la 1k2le 1k2lo 1k2l^^e1 1k2l^^e9 1k2l^^ed 1k2l^^f3 1k2l^^fa 1k2li 1k2lu 1k2l^^fc -1k2ra 1k2re 1k2ro 1k2r^^e1 1k2r^^e9 1k2r^^ed 1k2r^^f3 1k2r^^fa 1k2ri 1k2ru 1k2r^^fc -1p2la 1p2le 1p2lo 1p2l^^e1 1p2l^^e9 1p2l^^ed 1p2l^^f3 1p2l^^fa 1p2li 1p2lu 1p2l^^fc -1p2ra 1p2re 1p2ro 1p2r^^e1 1p2r^^e9 1p2r^^ed 1p2r^^f3 1p2r^^fa 1p2ri 1p2ru 1p2r^^fc -1t2ra 1t2re 1t2ro 1t2r^^e1 1t2r^^e9 1t2r^^ed 1t2r^^f3 1t2r^^fa 1t2ri 1t2ru 1t2r^^fc -% Rule SR4 is implicitly implemented by the default values -% Rule HE1 is implemented by TeX parameters \lefthyphenmin and -% \righthyphenmin. Help yourself. The correct values for -% Spanish are 2 and 2. If you set them below these values, -% incorrect breaks will happen. -% Rule HE2 -% Break between a consonant and an h -b1h d1h f1h g1h j1h k1h l1h m1h n1h p1h q1h r1h s1h t1h v1h w1h x1h y1h z1h ^^f11h -% We now avoid some problematic breaks. -su2b2r su2b2l -% These are included here to avoid ugly, though legal, breaks -% They were taken from the sphyphen.tex (silaba.tex) produced -% by Aurion Tecnologia and other sources. -2caca. 2cacas. -2caga. 2cagas. -2cago. 2cerdo -2cola. 2colas. -2culo. 2culos. -2cular. -2loco. 2locos. 2loca. 2locas. -2moco. 2mocos. -2mula. 2mulas. -2pedo. 2pedos. 2peda. 2pedas. -2pito. 2pitos. -2puto. 2putos. 2puta. 2putas. -.caca2 -} -\endgroup -\endinput +% Hyphenation patterns for Spanish.
+% Compiled by Julio Sanchez (jsanchez@gmv.es) on September 1991.
+%
+% These patterns have been derived from "On Word Division in Spanish",
+% Jos'e A. Ma~nas, Communications of the ACM, and implemented in his
+% package ftc. You can get ftc and a draft of the abovementioned
+% paper from goya.dit.upm.es in src/text.proc/ftc.Z. FTP access may
+% be available. Otherwise, send help to info@goya.dit.upm.es for
+% details on use of the mail server.
+%
+% Rules mentioned below are those described in that paper. After
+% several unsatisfactory attempts to pretend I knew better, these
+% patterns closely follow that paper. Pattern 'tl' is not considered.
+% It is conflictive and ftc does not use it either.
+%
+% These patterns have been generated by shyphen.sh version 1.2,
+% shyphen.sh is a sh script that allows a number of choices.
+% Full benefit from some of these options can only be
+% obtained if appropriate fonts are available.
+%
+% Follows a copyright notice. This is not in the public domain,
+% but the copyright is essentially a hold-harmless clause. That
+% is, use it at will, but don't sue me if you don't like it.
+%
+% COPYRIGHT NOTICE
+%
+% These patterns and the generating sh script are Copyright (c) GMV 1991
+% These patterns were developed for internal GMV use and are made
+% public in the hope that they will benefit others. Also, spreading
+% these patterns throughout the Spanish-language TeX community is
+% expected to provide back-benefits to GMV in that it can help keeping
+% GMV in the mainstream of spanish users. However, this is given
+% for free and WITHOUT ANY WARRANTY. Under no circumstances can Julio
+% Sanchez, GMV, Jos'e A. Ma~nas or any agents or representatives thereof
+% be held responsible for any errors in this software nor for any damages
+% derived from its use, even in case any of the above has been notified
+% of the possibility of such damages. If any such situation arises, you
+% responsible for repair. Use of this software is an explicit
+% acceptance of these conditions.
+%
+% You can use this software for any purpose. You cannot delete this
+% copyright notice. If you change this software, you must include
+% comments explaining who, when and why. You are kindly requested to
+% send any changes to tex@gmv.es. If you change the generating
+% script, you must include code in it such that any output is clearly
+% labeled as generated by a modified script.
+%
+% Despite the lack of warranty, we would like to hear about any
+% problem you find. Please report problems to tex@gmv.es.
+%
+% END OF COPYRIGHT NOTICE
+%
+% Options included in this set: basic isolatin1 ugly
+% Open vowels: a e o ^^e1 ^^e9 ^^ed ^^f3 ^^fa
+% Closed vowels: i u ^^fc
+% Consonants: b c d f g j k l m n p q r s t v w x y z ^^f1
+%
+% Some of the patterns below represent combinations that never
+% happen in Spanish. Would they happen, they would be hyphenated
+% according to the rules.
+
+% This keeps {cat|lc}code changes, if any, local. Nice to users of
+% multilingual versions. These are the minimum changes needed to process
+% the patterns. These and other changes will have to be re-enacted when
+% Spanish be established as the current language. See the babel docs if
+% you don't understand this.
+\begingroup
+\catcode`\^^e1=11 \lccode`\^^e1=`\^^e1 % 'a
+\catcode`\^^e9=11 \lccode`\^^e9=`\^^e9 % 'e
+\catcode`\^^ed=11 \lccode`\^^ed=`\^^ed % 'i
+\catcode`\^^f1=11 \lccode`\^^f1=`\^^f1 % 'o
+\catcode`\^^f3=11 \lccode`\^^f3=`\^^f3 % ~n
+\catcode`\^^fa=11 \lccode`\^^fa=`\^^fa % 'u
+\catcode`\^^fc=11 \lccode`\^^fc=`\^^fc % "u
+\patterns{
+% Rule SR1
+% Vowels are kept together by the defaults
+% Rule SR2
+% Attach vowel groups to left consonant
+1ba 1be 1bo 1b^^e1 1b^^e9 1b^^ed 1b^^f3 1b^^fa 1bi 1bu 1b^^fc
+1ca 1ce 1co 1c^^e1 1c^^e9 1c^^ed 1c^^f3 1c^^fa 1ci 1cu 1c^^fc
+1da 1de 1do 1d^^e1 1d^^e9 1d^^ed 1d^^f3 1d^^fa 1di 1du 1d^^fc
+1fa 1fe 1fo 1f^^e1 1f^^e9 1f^^ed 1f^^f3 1f^^fa 1fi 1fu 1f^^fc
+1ga 1ge 1go 1g^^e1 1g^^e9 1g^^ed 1g^^f3 1g^^fa 1gi 1gu 1g^^fc
+1ja 1je 1jo 1j^^e1 1j^^e9 1j^^ed 1j^^f3 1j^^fa 1ji 1ju 1j^^fc
+1ka 1ke 1ko 1k^^e1 1k^^e9 1k^^ed 1k^^f3 1k^^fa 1ki 1ku 1k^^fc
+1la 1le 1lo 1l^^e1 1l^^e9 1l^^ed 1l^^f3 1l^^fa 1li 1lu 1l^^fc
+1ma 1me 1mo 1m^^e1 1m^^e9 1m^^ed 1m^^f3 1m^^fa 1mi 1mu 1m^^fc
+1na 1ne 1no 1n^^e1 1n^^e9 1n^^ed 1n^^f3 1n^^fa 1ni 1nu 1n^^fc
+1pa 1pe 1po 1p^^e1 1p^^e9 1p^^ed 1p^^f3 1p^^fa 1pi 1pu 1p^^fc
+1qa 1qe 1qo 1q^^e1 1q^^e9 1q^^ed 1q^^f3 1q^^fa 1qi 1qu 1q^^fc
+1ra 1re 1ro 1r^^e1 1r^^e9 1r^^ed 1r^^f3 1r^^fa 1ri 1ru 1r^^fc
+1sa 1se 1so 1s^^e1 1s^^e9 1s^^ed 1s^^f3 1s^^fa 1si 1su 1s^^fc
+1ta 1te 1to 1t^^e1 1t^^e9 1t^^ed 1t^^f3 1t^^fa 1ti 1tu 1t^^fc
+1va 1ve 1vo 1v^^e1 1v^^e9 1v^^ed 1v^^f3 1v^^fa 1vi 1vu 1v^^fc
+1wa 1we 1wo 1w^^e1 1w^^e9 1w^^ed 1w^^f3 1w^^fa 1wi 1wu 1w^^fc
+1xa 1xe 1xo 1x^^e1 1x^^e9 1x^^ed 1x^^f3 1x^^fa 1xi 1xu 1x^^fc
+1ya 1ye 1yo 1y^^e1 1y^^e9 1y^^ed 1y^^f3 1y^^fa 1yi 1yu 1y^^fc
+1za 1ze 1zo 1z^^e1 1z^^e9 1z^^ed 1z^^f3 1z^^fa 1zi 1zu 1z^^fc
+1^^f1a 1^^f1e 1^^f1o 1^^f1^^e1 1^^f1^^e9 1^^f1^^ed 1^^f1^^f3 1^^f1^^fa 1^^f1i 1^^f1u 1^^f1^^fc
+% Rule SR3
+% Build legal consonant groups, leave other consonants bound to
+% the previous group. This overrides part of the SR2 pattern
+% group.
+1c2ha 1c2he 1c2ho 1c2h^^e1 1c2h^^e9 1c2h^^ed 1c2h^^f3 1c2h^^fa 1c2hi 1c2hu 1c2h^^fc
+1l2la 1l2le 1l2lo 1l2l^^e1 1l2l^^e9 1l2l^^ed 1l2l^^f3 1l2l^^fa 1l2li 1l2lu 1l2l^^fc
+1r2ra 1r2re 1r2ro 1r2r^^e1 1r2r^^e9 1r2r^^ed 1r2r^^f3 1r2r^^fa 1r2ri 1r2ru 1r2r^^fc
+1b2la 1b2le 1b2lo 1b2l^^e1 1b2l^^e9 1b2l^^ed 1b2l^^f3 1b2l^^fa 1b2li 1b2lu 1b2l^^fc
+1b2ra 1b2re 1b2ro 1b2r^^e1 1b2r^^e9 1b2r^^ed 1b2r^^f3 1b2r^^fa 1b2ri 1b2ru 1b2r^^fc
+1c2la 1c2le 1c2lo 1c2l^^e1 1c2l^^e9 1c2l^^ed 1c2l^^f3 1c2l^^fa 1c2li 1c2lu 1c2l^^fc
+1c2ra 1c2re 1c2ro 1c2r^^e1 1c2r^^e9 1c2r^^ed 1c2r^^f3 1c2r^^fa 1c2ri 1c2ru 1c2r^^fc
+1d2ra 1d2re 1d2ro 1d2r^^e1 1d2r^^e9 1d2r^^ed 1d2r^^f3 1d2r^^fa 1d2ri 1d2ru 1d2r^^fc
+1f2la 1f2le 1f2lo 1f2l^^e1 1f2l^^e9 1f2l^^ed 1f2l^^f3 1f2l^^fa 1f2li 1f2lu 1f2l^^fc
+1f2ra 1f2re 1f2ro 1f2r^^e1 1f2r^^e9 1f2r^^ed 1f2r^^f3 1f2r^^fa 1f2ri 1f2ru 1f2r^^fc
+1g2la 1g2le 1g2lo 1g2l^^e1 1g2l^^e9 1g2l^^ed 1g2l^^f3 1g2l^^fa 1g2li 1g2lu 1g2l^^fc
+1g2ra 1g2re 1g2ro 1g2r^^e1 1g2r^^e9 1g2r^^ed 1g2r^^f3 1g2r^^fa 1g2ri 1g2ru 1g2r^^fc
+1k2la 1k2le 1k2lo 1k2l^^e1 1k2l^^e9 1k2l^^ed 1k2l^^f3 1k2l^^fa 1k2li 1k2lu 1k2l^^fc
+1k2ra 1k2re 1k2ro 1k2r^^e1 1k2r^^e9 1k2r^^ed 1k2r^^f3 1k2r^^fa 1k2ri 1k2ru 1k2r^^fc
+1p2la 1p2le 1p2lo 1p2l^^e1 1p2l^^e9 1p2l^^ed 1p2l^^f3 1p2l^^fa 1p2li 1p2lu 1p2l^^fc
+1p2ra 1p2re 1p2ro 1p2r^^e1 1p2r^^e9 1p2r^^ed 1p2r^^f3 1p2r^^fa 1p2ri 1p2ru 1p2r^^fc
+1t2ra 1t2re 1t2ro 1t2r^^e1 1t2r^^e9 1t2r^^ed 1t2r^^f3 1t2r^^fa 1t2ri 1t2ru 1t2r^^fc
+% Rule SR4 is implicitly implemented by the default values
+% Rule HE1 is implemented by TeX parameters \lefthyphenmin and
+% \righthyphenmin. Help yourself. The correct values for
+% Spanish are 2 and 2. If you set them below these values,
+% incorrect breaks will happen.
+% Rule HE2
+% Break between a consonant and an h
+b1h d1h f1h g1h j1h k1h l1h m1h n1h p1h q1h r1h s1h t1h v1h w1h x1h y1h z1h ^^f11h
+% We now avoid some problematic breaks.
+su2b2r su2b2l
+% These are included here to avoid ugly, though legal, breaks
+% They were taken from the sphyphen.tex (silaba.tex) produced
+% by Aurion Tecnologia and other sources.
+2caca. 2cacas.
+2caga. 2cagas.
+2cago. 2cerdo
+2cola. 2colas.
+2culo. 2culos.
+2cular.
+2loco. 2locos. 2loca. 2locas.
+2moco. 2mocos.
+2mula. 2mulas.
+2pedo. 2pedos. 2peda. 2pedas.
+2pito. 2pitos.
+2puto. 2putos. 2puta. 2putas.
+.caca2
+}
+\endgroup
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/lang-ura.tex b/tex/context/base/lang-ura.tex index 5036167c6..d84a0017d 100644 --- a/tex/context/base/lang-ura.tex +++ b/tex/context/base/lang-ura.tex @@ -1,84 +1,85 @@ -%D \module -%D [ file=lang-sla, -%D version=1997.09.03, -%D title=\CONTEXT\ Language Macros, -%D subtitle=Uralic Languages, -%D author=Hans Hagen / Tobias Burnus, -%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. - -% Cheremiss, Estonian, Finnish, Karelian, Laap, Mordvinian, -% Permian tongues, Hungarianm Ostyak, Vogul, Samoyed - -\writestatus{loading}{Uralic Languages} - -\unprotect - -\installlanguage - [\s!fi] - [\c!spatiering=\v!opelkaar, - \c!leftsentence=---, - \c!rightsentence=---, - \c!leftsubsentence=---, - \c!rightsubsentence=---, - \c!leftquote=\upperleftsinglesixquote, - \c!rightquote=\upperrightsingleninequote, - \c!leftquotation=\upperleftdoublesixquote, - \c!rightquotation=\upperrightdoubleninequote, - \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag}, - \c!default=\s!en, - \c!status=\v!stop] - -\setupheadtext [\s!fi] [\v!inhoud=Sis\"allys] -\setupheadtext [\s!fi] [\v!tabellen=Taulukkoj] -\setupheadtext [\s!fi] [\v!figuren=Kuvi] -\setupheadtext [\s!fi] [\v!grafieken=Grafiikkaoi] -\setupheadtext [\s!fi] [\v!intermezzos=Intermezzos] -\setupheadtext [\s!fi] [\v!index=Indeksiluku] -\setupheadtext [\s!fi] [\v!afkortingen=Lyhennyksi] -\setupheadtext [\s!fi] [\v!logos=Vertauskuva] -\setupheadtext [\s!fi] [\v!eenheden=Yksik\"ot] - -\setuplabeltext [\s!fi] [\v!tabel=Taulukko ] -\setuplabeltext [\s!fi] [\v!figuur=Kuva ] -\setuplabeltext [\s!fi] [\v!intermezzo=Intermezzo ] -\setuplabeltext [\s!fi] [\v!grafiek=Grafiikka ] -\setuplabeltext [\s!fi] [\v!hoofdstuk=] -\setuplabeltext [\s!fi] [\v!paragraaf=] -\setuplabeltext [\s!fi] [\v!sub\v!paragraaf=] -\setuplabeltext [\s!fi] [\v!sub\v!sub\v!paragraaf=] -\setuplabeltext [\s!fi] [\v!bijlage=] -\setuplabeltext [\s!fi] [\v!deel=Osa ] -\setuplabeltext [\s!fi] [\v!regel=rivi] -\setuplabeltext [\s!fi] [\v!regels=rivie] - -\setuplabeltext [\s!fi] [\v!january=tammikuu] -\setuplabeltext [\s!fi] [\v!february=helmikuu] -\setuplabeltext [\s!fi] [\v!march=maaliskuu] -\setuplabeltext [\s!fi] [\v!april=huhtikuu] -\setuplabeltext [\s!fi] [\v!may=toukokuu] -\setuplabeltext [\s!fi] [\v!june=kes\"akuu] -\setuplabeltext [\s!fi] [\v!july=hein\"akuu] -\setuplabeltext [\s!fi] [\v!august=elokuu] -\setuplabeltext [\s!fi] [\v!september=syyskuu] -\setuplabeltext [\s!fi] [\v!october=lokakuu] -\setuplabeltext [\s!fi] [\v!november=marraskuu] -\setuplabeltext [\s!fi] [\v!december=joulukuu] - -\setuplabeltext [\s!fi] [\v!sunday=sunnuntai] -\setuplabeltext [\s!fi] [\v!monday=maanantai] -\setuplabeltext [\s!fi] [\v!tuesday=tiistai] -\setuplabeltext [\s!fi] [\v!wednesday=keskiviikko] -\setuplabeltext [\s!fi] [\v!thursday=torstai] -\setuplabeltext [\s!fi] [\v!friday=perjantai] -\setuplabeltext [\s!fi] [\v!saturday=lauantai] - -%D \ShowAllLanguageValues [\s!fi] [finnish] finse ... - -\protect - -\endinput +%D \module
+%D [ file=lang-sla,
+%D version=1997.09.03,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Uralic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%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.
+
+% Cheremiss, Estonian, Finnish, Karelian, Laap, Mordvinian,
+% Permian tongues, Hungarianm Ostyak, Vogul, Samoyed
+
+\writestatus{loading}{Uralic Languages}
+
+\unprotect
+
+\installlanguage
+ [\s!fi]
+ [\c!spatiering=\v!opelkaar,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
+ \c!default=\s!en,
+ \c!status=\v!stop]
+
+\setupheadtext [\s!fi] [\v!inhoud=Sis\"allys]
+\setupheadtext [\s!fi] [\v!tabellen=Taulukkoj]
+\setupheadtext [\s!fi] [\v!figuren=Kuvi]
+\setupheadtext [\s!fi] [\v!grafieken=Grafiikkaoi]
+\setupheadtext [\s!fi] [\v!intermezzos=Intermezzos]
+\setupheadtext [\s!fi] [\v!index=Indeksiluku]
+\setupheadtext [\s!fi] [\v!afkortingen=Lyhennyksi]
+\setupheadtext [\s!fi] [\v!logos=Vertauskuva]
+\setupheadtext [\s!fi] [\v!eenheden=Yksik\"ot]
+
+\setuplabeltext [\s!fi] [\v!tabel=Taulukko ]
+\setuplabeltext [\s!fi] [\v!figuur=Kuva ]
+\setuplabeltext [\s!fi] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!fi] [\v!grafiek=Grafiikka ]
+\setuplabeltext [\s!fi] [\v!hoofdstuk=]
+\setuplabeltext [\s!fi] [\v!paragraaf=]
+\setuplabeltext [\s!fi] [\v!sub\v!paragraaf=]
+\setuplabeltext [\s!fi] [\v!sub\v!sub\v!paragraaf=]
+\setuplabeltext [\s!fi] [\v!bijlage=]
+\setuplabeltext [\s!fi] [\v!deel=Osa ]
+\setuplabeltext [\s!fi] [\v!regel=rivi]
+\setuplabeltext [\s!fi] [\v!regels=rivie]
+
+\setuplabeltext [\s!fi] [\v!january=tammikuu]
+\setuplabeltext [\s!fi] [\v!february=helmikuu]
+\setuplabeltext [\s!fi] [\v!march=maaliskuu]
+\setuplabeltext [\s!fi] [\v!april=huhtikuu]
+\setuplabeltext [\s!fi] [\v!may=toukokuu]
+\setuplabeltext [\s!fi] [\v!june=kes\"akuu]
+\setuplabeltext [\s!fi] [\v!july=hein\"akuu]
+\setuplabeltext [\s!fi] [\v!august=elokuu]
+\setuplabeltext [\s!fi] [\v!september=syyskuu]
+\setuplabeltext [\s!fi] [\v!october=lokakuu]
+\setuplabeltext [\s!fi] [\v!november=marraskuu]
+\setuplabeltext [\s!fi] [\v!december=joulukuu]
+
+\setuplabeltext [\s!fi] [\v!sunday=sunnuntai]
+\setuplabeltext [\s!fi] [\v!monday=maanantai]
+\setuplabeltext [\s!fi] [\v!tuesday=tiistai]
+\setuplabeltext [\s!fi] [\v!wednesday=keskiviikko]
+\setuplabeltext [\s!fi] [\v!thursday=torstai]
+\setuplabeltext [\s!fi] [\v!friday=perjantai]
+\setuplabeltext [\s!fi] [\v!saturday=lauantai]
+
+%D \ShowAllLanguageValues [\s!fi] [finnish] finse ...
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/list-ini.tex b/tex/context/base/list-ini.tex index 20031b53f..d019d2182 100644 --- a/tex/context/base/list-ini.tex +++ b/tex/context/base/list-ini.tex @@ -1,39 +1,40 @@ -%D \module -%D [ file=list-ini, -%D versie=1995.10.10, -%D naam=\CONTEXT\ List Macros, -%D auteur=J. Hagen, -%D datum=\currentdate, -%D copyright=J. Hagen] - -\writestatus{loading}{Context List Macros} - -\unprotect - -%I n=Overzichten -%I c=\startoverzicht -%I -%I Ten behoeve van veel voorkomende soorten overzichten -%I zijn speciale commando's beschikbaar. Bij dergelijke -%I overzichten worden in plaats van de gebruikelijke -%I commando's \starttekst..\stoptekst de onderstaande -%I commando's gebruikt: -%I -%I \startoverzicht[soort overzicht] -%I \stopoverzicht -%I -%I Overzichten staan in files met de naam list-xxx, waarbij -%I xxx de eerste drie letters van het soort overzicht zijn. -%I -%I Vooralsnog zijn alleen overzichten van 'figuren' en -%I 'kontakten' beschikbaar. - -\definieerfilegroep - [overzicht] - [file=list, - voor=, - na=] - -\protect - -\endinput +%D \module
+%D [ file=list-ini,
+%D versie=1995.10.10,
+%D naam=\CONTEXT\ List Macros,
+%D auteur=J. Hagen,
+%D datum=\currentdate,
+%D copyright=J. Hagen]
+
+\writestatus{loading}{Context List Macros}
+
+\unprotect
+
+%I n=Overzichten
+%I c=\startoverzicht
+%I
+%I Ten behoeve van veel voorkomende soorten overzichten
+%I zijn speciale commando's beschikbaar. Bij dergelijke
+%I overzichten worden in plaats van de gebruikelijke
+%I commando's \starttekst..\stoptekst de onderstaande
+%I commando's gebruikt:
+%I
+%I \startoverzicht[soort overzicht]
+%I \stopoverzicht
+%I
+%I Overzichten staan in files met de naam list-xxx, waarbij
+%I xxx de eerste drie letters van het soort overzicht zijn.
+%I
+%I Vooralsnog zijn alleen overzichten van 'figuren' en
+%I 'kontakten' beschikbaar.
+
+\definieerfilegroep
+ [overzicht]
+ [file=list,
+ voor=,
+ na=]
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/mult-com.tex b/tex/context/base/mult-com.tex index 757e3f3e3..ec6d3a006 100644 --- a/tex/context/base/mult-com.tex +++ b/tex/context/base/mult-com.tex @@ -1,1223 +1,1224 @@ -%D \module -%D [ file=mult-com, -%D version=1996.06.01, -%D title=\CONTEXT\ Multilingual Macros, -%D subtitle=Commands, -%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. - -%D In this module we define the commands. A more than quick -%D glance at this list leans that it's incomplete. This is due -%D to the fact that the system generated a lot of commands by -%D means of the elements specified somewhere else. -%D -%D {\em Because the original interface to \CONTEXT\ is dutch, -%D the words left of the \type{:} are in dutch. In the near -%D future english will be the core language.} - -\writestatus{loading}{Context Multilingual Macros / Commands} - -%D The commands are grouped according to their functionality. -%D Although the \type{\stop} counterpart of the -%D \type{\start}||commands could be generated automatically, -%D we've chosen do define it explicitly. -%D -%D One complication of the english commands, is that we don't -%D want them to overrule or conflict with Plain \TEX. The -%D names therefore are not always optimal. - -%D \startcompressdefinitions - -\startcommands dutch english - german - - language: taal language - sprache - mainlanguage: hoofdtaal mainlanguage - hauptsprache - translate: vertaal translate - uebersetzten - installlanguage: installeertaal installlanguage - installieresprache - setuplanguage: steltaalin setuplanguage - stellespracheein - - showmakeup: toonopmaak showmakeup - zeigeumbruch - - usespecials: gebruikspecials usespecials - benutzespezielles - -% system redefineaccent: herdefinieeraccent redefineaccent -% redefiniereakzent -% system redefinecharacter: herdefinieerkarakter redefinecharacter -% redefinierezeichen -% system redefinecommand: herdefinieercommando redefinecommand -% redefinierbefehl - defineaccent: definieeraccent defineaccent - definiereakzent - definecharacter: definieerkarakter definecharacter - definierezeichen - definecommand: definieercommando definecommand - definierebefehl - startcoding: startcodering startcoding - startkodierung - stopcoding: stopcodering stopcoding - stopkodierung - definebodyfontenvironment: definieerkorpsomgeving definebodyfontenvironment - definierefliesstextumgebung - definebodyfont: definieerkorps definebodyfont - definierefliesstext - - setuptype: steltypein setuptype - stelletipein - type: type type - tippen - typ: typ typ - tip - arg: arg arg - arg - tex: tex tex - tex - definetyping: definieertypen definetyping - definieretippen - setuptyping: steltypenin setuptyping - stelletippenein -% generated starttyping: starttypen starttyping -% starttippen -% generated stoptyping: stoptypen stoptyping -% stoptippen - typefile: typefile typefile - tippedatei - - setupfootnotes: stelvoetnotenin setupfootnotes - stellefussnotenein - setupfootnotedefinition: stelvoetnootdefinitiein setupfootnotedefinition - stellefussnotendefinitioneein % TOBIAS - note: noot note - notiz - footnote: voetnoot footnote - fussnote - startlocalfootnotes: startlokalevoetnoten startlocalfootnotes - startlokalefussnoten - stoplocalfootnotes: stoplokalevoetnoten stoplocalfootnotes - stoplokalefussnoten - placelocalfootnotes: plaatslokalevoetnoten placelocalfootnotes - platzierelokalefussnoten - placefootnotes: plaatsvoetnoten placefootnotes - platzierefussnoten - - currentdate: huidigedatum currentdate - heutigesdatum - weekday: weekdag weekday - wochentag - WEEKDAY: WEEKDAG WEEKDAY - WOCHENTAG - month: maand month - monat - MONTH: MAAND MONTH - MONAT - - Numbers: Cijfers Numbers - Ziffern - numbers: cijfers numbers - ziffern - romannumerals: romeins romannummerals - roemischezahlen - Romannumerals: Romeins Romannummerals - Roemischezahlen - character: letter character - buchstabe - Character: Letter Character - Buchstabe - characters: letters characters - buchstaben - Characters: Letters Characters - Buchstaben - - definesymbol: definieersymbool definesymbol - definieresymbol - symbol: symbool symbol - symbol - defineconversion: definieerconversie defineconversion - definierekonversion - convertnumber: converteernummer convertnumber - konvertierezahl - - kap: kap kap - kap - KAP: KAP KAP - KAP - nokap: nokap nokap - nokap - Kap: Kap Kap - Kap - Kaps: Kaps Kaps - Kaps - WORD: WOORD WORD - WORT - WORDS: WOORDEN WORDS - WOERTER - Word: Woord Word - Wort - Words: Woorden Words - Woerter - stretched: opgerekt stretched - gestreckt - overstrike: doorstreep overstrike - durchgestrichen - overstrikes: doorstrepen overstrikes - durchstreichen - underbar: onderstreep underbar - unterstrichen - underbars: onderstrepen underbars - unterstreichen - setupunderbar: stelonderstrepenin setupunderbar - stelleunterstreichenein - - setupbodyfont: stelkorpsin setupbodyfont - stellefliesstextein - switchtobodyfont: switchnaarkorps switchtobodyfont - wechselezumfliesstext - showbodyfont: toonkorps showbodyfont - zeigefliesstext - showbodyfontenvironment: toonkorpsomgeving showbodyfontenvironment - zeigefliesstextumgebung - - headtext: koptekst headtext - ueberschrift - labeltext: labeltekst labeltext - labeltext - LABELTEXT: LABELTEKST LABELTEXT - LABELTEXT - setupheadtext: stelkoptekstin setupheadtext - stelleueberschriftein - setuplabeltext: stellabeltekstin setuplabeltext - stellelabeltextein - - marginrule: kantlijn marginrule - marginallinie - startmarginrule: startkantlijn startmarginrule - startmarginallinie - stopmarginrule: stopkantlijn stopmarginrule - stopmarginallinie - setupmarginrules: stelkantlijnin setupmarginrules - stellemarginallinieein - - blackrule: blokje blackrule - rechteck - blackrules: blokjes blackrules - rechtecke - setupblackrules: stelblokjesin setupblackrules - stellerechteckein - - setupscreens: stelrastersin setupscreens - stellerasterein - - framed: omlijnd framed - umrahmt - inframed: inlijnd inframed - imumriss - setupframed: stelomlijndin setupframed - stelleumrahmtein -% setuprules: stellijnenin setuprules -% stelleumrissein - setuplinewidth: stellijndiktein setuplinewidth - stellelinienbreiteein - - setupthinrules: steldunnelijnenin setupthinrules - stelleduennerumrissein - thinrule: dunnelijn thinrule - duennelinie - thinrules: dunnelijnen thinrules - duennerumriss - hairline: haarlijn hairline - haarlinie - - vl: vl vl - vl - hl: hl hl - hl - - defineframedtext: definieerkadertekst defineframedtext - definiereumrahmtertext -% startframedtext: startkadertekst startframedtext -% startumrahmtertext -% stopframedtext: stopkadertekst stopframedtext -% stopumrahmtertext - setupframedtexts: stelkadertekstenin setupframedtexts - stelleumrahmtetexteein - - defineoverlay: definieeroverlay defineoverlay - definiereoverlay - - background: achtergrond background - hintergrund - startbackground: startachtergrond startbackground - starthintergrund - stopbackground: stopachtergrond stopbackground - stophintergrund - setupbackground: stelachtergrondin setupbackground - stellehintergrundein - - fillinrules: invullijnen fillinrules - gefuelltesrechteck - setupfillinrules: stelinvullijnenin setupfillinrules - stellegefuelltesrechteckein - fillintext: invulltekst fillintext - ausfuelltext - - setupfillinlines: stelinvulregelsin setupfillinlines - stellegefuelltezeileein - fillinline: invulregel fillinline - gefuelltezeile - - setuptextrules: steltekstlijnenin setuptextrules - stelletextumrissein - textrule: tekstlijn textrule - textlinie - starttextrule: starttekstlijn starttextrule - starttextlinie - stoptextrule: stoptekstlijn stoptextrule - stoptextlinie - - usemodule: gebruikmodule usemodule - verwendemodul - usemodules: gebruikmodules usemodules - verwendemodule - - starttekst: starttekst starttext - starttext - stoptekst: stoptekst stoptext - stoptext - - margetitel: margetitel margintitle - marginaltitel - margewoord: margewoord marginword - marginalwort - - % dit wordt: - - margetekst: margetekst margintext - marginaltext - - inlinker: inlinker inleft - imlinken - inmarge: inmarge inmargin - inmarginalie - inanderemarge: inanderemarge inothermargin - inanderermarginale - inrechter: inrechter inright - imrechten - startmargeblok: startmargeblok startmarginblock - startmarginalblock - stopmargeblok: stopmargeblok stopmarginblock - stopmarginalblock - stelinmargein: stelinmargein setupinmargin - stelleinmarginalieein - stelmargeblokkenin: stelmargeblokkenin setupmarginblocks - stellemarginalblockein - - inleftside: inlinkerrand inleftside - imlinkenrand - inleftmargin: inlinkermarge inleftmargin - inlinkermarginale - inrightmargin: inrechtermarge inrightmargin - inrechtermarginale - inrightside: inrechterrand inrightside - imrechtenrand - - woordrechts: woordrechts wordright - wortrechts - - blanko: blanko blank - blanko - stelblankoin: stelblankoin setupblank - stelleblankoein - corrigeerwitruimte: corrigeerwitruimte correctwhitespace - korrigierezwischenraum - fixedspaces: vastespaties fixedspaces - festesspatium - nospace: geenspatie nospace - keinspatium - space: spatie space - spatium - geenwitruimte: geenwitruimte nowhitespace - keinzwischenraum - opelkaar: opelkaar packed - kleinerdurchschuss - startopelkaar: startopelkaar startpacked - startkleinerdurchschuss - stopopelkaar: stopopelkaar stoppacked - stopkleinerdurchschuss - startvanelkaar: startvanelkaar startunpacked - startgrosserdurchschuss - stopvanelkaar: stopvanelkaar stopunpacked - stopkleinerdurchschuss - startregelcorrectie: startregelcorrectie startlinecorrection - startzeilenkorrektur - stopregelcorrectie: stopregelcorrectie stoplinecorrection - stopzeilenkorrektur - omlaag: omlaag godown - nachunten - witruimte: witruimte whitespace - zwischenraum - - nietinspringen: nietinspringen noindenting - nichteinziehen - inspringen: inspringen indenting - einziehen - stelinspringenin: stelinspringenin setupindenting - stelleeinziehenein - - startuitlijnen: startuitlijnen startalignment - startausrichtung - stopuitlijnen: stopuitlijnen stopalignment - stopausrichtung - - startregels: startregels startlines - startzeilen - stopregels: stopregels stoplines - stopzeilen - stelregelnummerenin: stelregelnummerenin setuplinenumbering - stellezeilennummerierungein - startregelnummeren: startregelnummeren startlinenumbering - startzeilennummerierung - stopregelnummeren: stopregelnummeren stoplinenumbering - stopzeilennummerierung - startregel: startregel startline - startzeile - stopregel: stopregel stopline - stopzeile - eenregel: eenregel someline - einezeile - inregel: inregel inline - inzeile - crlf: crlf crlf - crlf - stelregelsin: stelregelsin setuplines - stellezeilenein - - startsmaller: startsmaller startnarrower - startenger - stopsmaller: stopsmaller stopnarrower - stopenger - stelsmallerin: stelsmallerin setupnarrower - stelleengerein - - starttabel: starttabel starttable - starttabelle - stoptabel: stoptabel stoptable - stoptabelle - starttabellen: starttabellen starttables - starttabellen - stoptabellen: stoptabellen stoptables - stoptabellen - steltabellenin: steltabellenin setuptables - stelletabellenein - - pagina: pagina page - seite - koppelpagina: koppelpagina couplepage - doppelseite - soortpagina: soortpagina pagetype - seitentyp - verwerkpagina: verwerkpagina processpage - bearbeiteseite - koppelpapier: koppelpapier couplepaper - doppelseitigespapier - selecteerpapier: selecteerpapier selectpaper - waehlepapieraus - scherm: scherm screen - bildschirm - - definieersectie: definieersectie definesection - definiereabschnitt - definieersectieblok: definieersectieblok definesectionblock - definiereabschnittsblock - stelsectieblokin: stelsectieblokin setupsectionblock - stelleabschnittsblockein - stelsectiein: stelsectiein setupsection - stelleabschnittein - - geenbovenenonderregels: geenbovenenonderregels notopandbottomlines - keinzeilenobenundunten - geenhoofdenvoetregels: geenhoofdenvoetregels noheaderandfooterlines - keinekopfundfusszeilen - stelbovenin: stelbovenin setuptop - stellenobenein - stelboventekstenin: stelboventekstenin setuptoptexts - stelletextobenein - stelhoofdin: stelhoofdin setupheader - stellekopfzeileein - stelhoofdtekstenin: stelhoofdtekstenin setupheadertexts - stellekopfzeilentextein - stelnummeringin: stelnummeringin setuppagenumbering - stelleseitennummeriernungein - stelonderin: stelonderin setupbottom - stelleuntenein - stelondertekstenin: stelondertekstenin setupbottomtexts - stelletextuntenein - stelvoetin: stelvoetin setupfooter - stellefusszeileein - stelvoettekstenin: stelvoettekstenin setupfootertexts - stellefusszeilentextein - stelpaginanummerin: stelpaginanummerin setuppagenumber - stelleseitennummerein - stelsubpaginanummerin: stelsubpaginanummerin setupsubpagenumber - stelleunterseitennummerein - steltekstin: steltekstin setuptext - stelletextein - stelteksttekstenin: stelteksttekstenin setuptexttexts - stelletexttexteein - - pagenumber: paginanummer pagenumber - seitenummer - - items: items items - posten - stelitemsin: stelitemsin setupitems - stellepostenein - - regellinks: regellinks leftaligned - zeilelinks % better: linksbuendig - regelmidden: regelmidden midaligned - zeilemitte % better: zentriert - regelrechts: regelrechts rightaligned - zeilerechts % better: rechtsbuendig - - startkolommen: startkolommen startcolumns - startspalten - stopkolommen: stopkolommen stopcolumns - stopspalten - stelkolommenin: stelkolommenin setupcolumns - stellespaltenein - kolom: kolom column - spalte - - kop: kop head - kopf - but: but but - but - som: som item - pos - nop: nop nop - nop - mar: mar mar - mar - sym: sym sym - sym - its: its its - its - startopsomming: startopsomming startitemize - startaufzaehlung - stelopsommingin: stelopsommingin setupitemize - stelleaufzaehlungein - stopopsomming: stopopsomming stopitemize - stopaufzaehlung - - definieerkop: definieerkop definehead - definierekopf - stelkopin: stelkopin setuphead - stellekopfein - stelkoppenin: stelkoppenin setupheads - stellekoepfeein - stelkopnummerin: stelkopnummerin setupheadnumber - stellekopfzahlein - kopnummer: kopnummer headnumber - kopfnummer - - resetmarkering: resetmarkering resetmarking - ruecksetztenbeschriftung - stelmarkeringin: stelmarkeringin setupmarking - stellebeschriftungein - definieermarkering: definieermarkering definemarking - definierebeschriftung - geenmarkering: geenmarkering nomarking - keinebeschriftung - markeer: markeer marking - beschriftung - ontkoppelmarkering: ontkoppelmarkering decouplemarking - entknuepfebeschriftung - koppelmarkering: koppelmarkering couplemarking - verknuepfebeschriftung - haalmarkering: haalmarkering getmarking - holebeschriftung - - stellayoutin: stellayoutin setuplayout - stellelayoutein - paslayoutaan: paslayoutaan adaptlayout - passelayoutan - steloffsetin: steloffsetin setupoffset - stelleoffsetein - plaatsopgrid: plaatsopgrid snaptogrid - snaptogrid % TOBIAS - verplaatsopgrid: verplaatsopgrid resnaptogrid - resnaptogrid % TOBIAS - - tooninstellingen: tooninstellingen showsetups - zeigeeinstellungen - toonkader: toonkader showframe - zeigerahmen - toongrid: toongrid showgrid - zeigegrid - toonopbouw: toonopbouw showbuildup - zeigeaufbau - toonlayout: toonlayout showlayout - zeigelayout - toonprint: toonprint showprint - zeigeabdruck % - TOBIAS - toonstruts: toonstruts showstruts - zeigestruts - - definieerpapierformaat: definieerpapierformaat definepapersize - definierepapierformat - stelpapierformaatin: stelpapierformaatin setuppapersize - stellepapierformatin - stelarrangerenin: stelarrangerenin setuparranging - stelarrangierenein % - TOBIAS - - versie: versie version - version - - stelachtergrondenin: stelachtergrondenin setupbackgrounds - stellehintergruendeein - - steluitlijnenin: steluitlijnenin setupalign - stelleausrichtungein - stelwitruimtein: stelwitruimtein setupwhitespace - stellezwischenraumein - - stelinteractiein: stelinteractiein setupinteraction - stelleinteraktionein - stelinteractiemenuin: stelinteractiemenuin setupinteractionmenu - stelleinteraktionsmenueein - definieerinteractiemenu: definieerinteractiemenu defineinteractionmenu - definiereinteraktionsmenue - startinteractiemenu: startinteractiemenu startinteractionmenu - startinteraktionsmenue - blokkeerinteractiemenu: blokkeerinteractiemenu disableinteractionmenu - inaktiviereinteraktionsmenue - interactiebuttons: interactiebuttons interactionbuttons - interaktionsknopfe - interactiebalk: interactiebalk interactionbar - interaktionsbalken - stelinteractiebalkin: stelinteractiebalkin setupinteractionbar - stelleinteraktionsbalkenein - stelinteractieschermin: stelinteractieschermin setupinteractionscreen - stelleinteraktionsbildschirmein - - placebookmarks: plaatsbookmarks placebookmarks - platzierebookmarks - bookmark: bookmark bookmark - bookmark - - definieerbeeldmerk: definieerbeeldmerk definelogo - definierelogo - plaatsbeeldmerken: plaatsbeeldmerken placelogos - platzierelogo - - definecolor: definieerkleur definecolor - definierefarbe - definecolorgroup: definieerkleurgroep definecolorgroup - definierefarbengruppe - definepalet: definieerpalet definepalet - definierepalette - gray: grijs gray - grau - color: kleur color - farbe - startcolor: startkleur startcolor - startfarbe - stopcolor: stopkleur stopcolor - stopfarbe - setupcolors: stelkleurenin setupcolors - stellefarbenein - setupcolor: stelkleurin setupcolor - stellefarbeein - setuppalet: stelpaletin setuppalet - stellepaletteein - showcolor: toonkleur showcolor - zeigefarbe - showcolorgroup: toonkleurgroep showcolorgroup - zeigefarbengruppe - showpalet: toonpalet showpalet - zeigepalette - comparecolorgroup: vergelijkkleurgroep comparecolorgroup - vergleichefarbengruppe - comparepalet: vergelijkpalet comparepalet - vergleichepalette - colorvalue: kleurwaarde colorvalue - farbewert - grayvalue: grijswaarde grayvalue - grauwert - - startraster: startraster startraster - startraster - stopraster: stopraster stopraster - stopraster - - definieerblok: definieerblok defineblock - definiereblock - gebruikblokken: gebruikblokken useblocks - verwendeblock - geenblokkenmeer: geenblokkenmeer nomoreblocks - keinebloeckemehr - handhaafblokken: handhaafblokken keepblocks - behaltebloecke - selecteerblokken: selecteerblokken selectblocks - waehlebloeckeaus - stelblokin: stelblokin setupblock - stelleblockein - verbergblokken: verbergblokken hideblocks - verbergebloecke - - definieerlijst: definieerlijst definelist - definiereliste - definieersamengesteldelijst: definieersamengesteldelijst definecombinedlist - definierezusammengestellteliste - plaatslijst: plaatslijst placelist - platziereliste - schrijfnaarlijst: schrijfnaarlijst writetolist - schreibezurliste - schrijftussenlijst: schrijftussenlijst writebetweenlist - schreibezwischenliste - stellijstin: stellijstin setuplist - stellelisteein - stelsamengesteldelijstin: stelsamengesteldelijstin setupcombinedlist - stellezusammengestelltelisteein - - bepaallijstkenmerken: bepaallijstkenmerken determinelistcharacteristics - determinelistcharacteristics % TOBIAS - - definieerreferentielijst: definieerreferentielijst definereferencelist - definierereferenzliste - plaatsreferentielijst: plaatsreferentielijst placereferencelist - platzierereferenzliste - schrijfnaarreferentielijst: schrijfnaarreferentielijst writetoreferencelist - schreibezurreferenzliste - stelreferentielijstin: stelreferentielijstin setupreferencelist - stellereferenzlisteein - - definieerplaatsblok: definieerplaatsblok definefloat - definieregleitobjekt - stelplaatsblokin: stelplaatsblokin setupfloat - stellegleitobjektein - stelplaatsblokkenin: stelplaatsblokkenin setupfloats - stellegleitobjekteein - splitsplaatsblok: splitsplaatsblok splitfloat - teilegleitobjekt - stelplaatsblokkensplitsenin: stelplaatsblokkensplitsenin setupfloatsplitting - stelleplatziegeteiltegleitobjekteein - startcombinatie: startcombinatie startcombination - startkombination - stopcombinatie: stopcombinatie stopcombination - stopkombination - plaatsnaastelkaar: plaatsnaastelkaar placesidebyside - platzierenebeneinander - plaatsonderelkaar: plaatsonderelkaar placeontopofeachother - platziereuntereinander - - stelblokkopjein: stelblokkopjein setupcaption - stellebildunterschriftein - stelblokkopjesin: stelblokkopjesin setupcaptions - stellebilderunterschriftein - stelcombinatiesin: stelcombinatiesin setupcombinations - stellekombinationein - - startoverlay: startoverlay startoverlay - startoverlay - stopoverlay: stopoverlay stopoverlay - stopoverlay - - definieerregister: definieerregister defineregister - definiereregister - koppelregister: koppelregister coupleregister - verknuepfregister - stelregisterin: stelregisterin setupregister - stelleregisterein - schrijfnaarregister: schrijfnaarregister writetoregister - schreibezumregister - plaatsregister: plaatsregister placeregister - platziereregister - - bepaalregisterkenmerken: bepaalregisterkenmerken determineregistercharacteristics - determineregistercharacteristics % TOBIAS - - definieersorteren: definieersorteren definesorting - definieresortieren - definieersynoniemen: definieersynoniemen definesynonyms - definieresynonyme - stelsorterenin: stelsorterenin setupsorting - stellesortierenein - stelsynoniemin: stelsynoniemin setupsynonym - stellesynonymein - - startsynchronisatie: startsynchronisatie startsynchronization - startsynchronisation - stopsynchronisatie: stopsynchronisatie stopsynchronization - stopsynchronisation - stelsynchronisatiebalkin: stelsynchronisatiebalkin setupsynchronizationbar - stellesynchronisationsbalkenein - stelsynchronisatiein: stelsynchronisatiein setupsynchronization - stellesynchronisationein - synchronisatiebalk: synchronisatiebalk synchronizationbar - synchronisationsbalken - synchroniseer: synchroniseer synchronize - synchronisieren - - gebruikexterndocument: gebruikexterndocument useexternaldocument - verwendeexteresdokument - gebruikURL: gebruikURL useURL - verwendeURL - - stelprogrammasin: stelprogrammasin setupprograms - stelleprogrammein - definieerprogramma: definieerprogramma defineprogram - definiereprogramme - programma: programma program - programm - - stelpaginaovergangenin: stelpaginaovergangenin setuppagetransitions - stelleseitenuebergangein - - definieerprofiel: definieerprofiel defineprofile - definiereprofil - definieerversie: definieerversie defineversion - definiereversion - markeerversie: markeerversie markversion - beschrifteversion - selecteerversie: selecteerversie selectversion - waehleversionaus - startprofiel: startprofiel startprofile - startprofil - startversie: startversie startversion - startversion - stelprofielenin: stelprofielenin setupprofiles - stelleprofilein - stelversiesin: stelversiesin setupversions - stelleversionein - stopprofiel: stopprofiel stopprofile - stopprofil - stopversie: stopversie stopversion - stopversion - volgprofiel: volgprofiel followprofile - folgeprofil - volgprofielversie: volgprofielversie followprofileversion - folgeprofilversion - volgversie: volgversie followversion - folgeversion - - doordefinieren: doordefinieren definedescription - definierebeschreibung - doorlabelen: doorlabelen definelabel - definierelabel - doornummeren: doornummeren defineenumeration - definierenummerierung - doorspringen: doorspringen defineindenting - definiereeinzug - steldoordefinierenin: steldoordefinierenin setupdescriptions - definierebeschreibungen - steldoornummerenin: steldoornummerenin setupenumerations - stellebeschreibungein - steldoorspringenin: steldoorspringenin setupindentations - stelleeinzuegein - - steltabin: steltabin setuptab - stelletabein - tab: tab tab - tab - - stelexternefigurenin: stelexternefigurenin setupexternalfigures - stelleexterneabbildungenein - toonexternefiguren: toonexternefiguren showexternalfigures - zeigeexterneabbildungen - externalfigure: externfiguur externalfigure - externeabbildung - toonexternfiguur: toonexternfiguur showexternalfigure - zeigeexterneabbildung - gebruikexternfiguur: gebruikexternfiguur useexternalfigure - verwendeexterneabbildung - - startfiguur: startfiguur startfigure - startabbildung - stopfiguur: stopfiguur stopfigure - stopabbildung - refereer: refereer referring - referieren - markeer: markeer marking - beschriftung - - rooster: rooster grid - gitter - - button: button button - knopf - menubutton: menubutton menubutton - menueknopf - stelbuttonsin: stelbuttonsin setupbuttons - stelleknopfein - - usereferences: gebruikreferenties usereferences - verwendereferenzen - reflijst: reflijst reflist - refliste - stelreferentielijstin: stelreferentielijstin setupreferencelist - stellereferenzlisteein - setupreferencing: stelrefererenin setupreferencing - stellereferenzierenein - - textreference: tekstreferentie textreference - textreferenz - pagereference: paginareferentie pagereference - seitenreferenz - reference: referentie reference - referenz - - uit: uit from - von - in: in in - in - op: op at - bei - naar: naar goto - zu - naarbox: naarbox gotobox - zurbox - naarpagina: naarpagina gotopage - zurseite % - old but forgotten - - startformule: startformule startformula - startformel - stopformule: stopformule stopformula - stopformel - plaatsformule: plaatsformule placeformula - platziereformel - plaatssubformule: plaatssubformule placesubformula - platziereunterformel - stelformulesin: stelformulesin setupformulae - stelleformelnein - startgegeven: startgegeven startfact - startgegeben - stopgegeven: stopgegeven stopfact - stopgegeben - startlegenda: startlegenda startlegend - startlegende - stoplegenda: stoplegenda stoplegend - stoplegende -leg: leg leg leg -geg: geg fact geg - mathematics: wiskunde mathematics - mathematik - dimension: dimensie dimension - dimension - nodimension: geendimensie nodimension - keindimension - - startomgeving: startomgeving startenvironment - startumgebung - stopomgeving: stopomgeving stopenvironment - stopumgebung - startdeelomgeving: startdeelomgeving startlocalenvironment - startlokaleumgebung - startonderdeel: startonderdeel startcomponent - startkomponente - stoponderdeel: stoponderdeel stopcomponent - stopkomponente - startprodukt: startprodukt startproduct - startprodukt - stopprodukt: stopprodukt stopproduct - stopprodukt - startproject: startproject startproject - startprojekt - stopproject: stopproject stopproject - stopprojekt - - setups: instellingen setups - setups % -- - - project: project project - projekt - onderdeel: onderdeel component - komponente - produkt: produkt product - produkt - omgeving: omgeving environment - umgebung - geenfilesmeer: geenfilesmeer nomorefiles - keinedateienmehr - - haalbuffer: haalbuffer getbuffer - holebuffer - startbuffer: startbuffer startbuffer - startbuffer - stopbuffer: stopbuffer stopbuffer - stopbuffer - stelbufferin: stelbufferin setupbuffer - stellebufferein - typebuffer: typebuffer typebuffer - tippebuffer - - betekenis: betekenis united - bedeutung - voluit: voluit infull - volleswort - - citaat: citaat quotation - zitat - citeer: citeer quote - zitieren - startcitaat: startcitaat startquotation - startzitat - stopcitaat: stopcitaat stopquotation - stopzitat - stelciterenin: stelciterenin setupquote - stellezitierenein - - definieer: definieer define - definieren - herhaal: herhaal redo - wiederholen - gebruikcommandos: gebruikcommandos usecommands - verwendebefehl - definieerstartstop: definieerstartstop definestartstop - definierestartstop - startlocal: startlokaal startlocal - startlokal - stoplocal: stoplokaal stoplocal - stoplokal - startglobal: startglobaal startglobal - startglobal - stopglobal: stopglobaal stopglobal - stopglobal - naam: naam name - name - - definieeropmaak: definieeropmaak definemakeup - definiereumbruch - stelopmaakin: stelopmaakin setupmakeup - stelleumbruchein - startopmaak: startopmaak startmakeup - startumbruch - stopopmaak: stopopmaak stopmakeup - stopumbruch - - gebruikexternefile: gebruikexternefile useexternalfile - verwendeexternedatei - gebruikexternefiles: gebruikexternefiles useexternalfiles - verwendeexternedateien - - kenmerk: kenmerk referral - verweis - kenmerkdatum: kenmerkdatum referraldate - verweisdatum - - hoog: hoog high - hoch - laho: laho lohi - hoti - laag: laag low - tief - -% startuitstellen: startuitstellen startpostponing -% startverschieben -% stopuitstellen: stopuitstellen stoppostponing -% stopverschieben -% startverbergen: startverbergen starthiding -% startverbergen -% stopverbergen: stopverbergen stophiding -% stopverbergen - - breuk: breuk fraction - bruch - chem: chem chem - chem - - startnaast: startnaast startopposite - startgegenueber - - stopnaast: stopnaast stopopposite - stopgegenueber - stelnaastplaatsenin: stelnaastplaatsenin setupoppositeplacing - stellegegenueberplatzierenein - - startpositioneren: startpositioneren startpositioning - startpositionieren - stoppositioneren: stoppositioneren stoppositioning - stoppositionieren - positioneer: positioneer position - position - stelpositionerenin: stelpositionerenin setuppositioning - stellepositionierenein - - roteer: roteer rotate - drehen - stelroterenin: stelroterenin setuprotate - stelledrehenein - - spiegel: spiegel mirror - mirror % TOBIAS CHECK! - schaal: schaal scale - scale % TOBIAS CHECK! - - stelnummerenin: stelnummerenin setupnumbering - stellenummerierungein - reset: reset reset - ruecksetzten - - stelpublicatiesin: stelpublicatiesin setuppublications - stellepublikationein - publicatie: publicatie publication - publikation - - definieerhbox: definieerhbox definehbox - definierehbox - - toelichting: toelichting remark - bemerkung - - toevoegen: toevoegen adding - zusatz - - punten: punten periods - punkt - - stelkoppeltekenin: stelkoppeltekenin setuphyphenmark - stellebindestrichein - stelinterliniein: stelinterliniein setupinterlinespace - stellezeilenabstandein - stelspatieringin: stelspatieringin setupspacing - stellespatiumein - steltolerantiein: steltolerantiein setuptolerance - stelletoleranzein - stelsysteemin: stelsysteemin setupsystem - stellesystemein - - definieeralineas: definieeralineas defineparagraphs - definiereabsaetze - stelalineasin: stelalineasin setupparagraphs - stelleabsaetzeein - - geentest: geentest donttest - keintest - -\stopcommands - -%D \stopcompressdefinitions - -%D There are a lot of variables that users can use in setups -%D and dedicated macros. ({\em I still have to check the -%D english names.}) - -%D \startcompressdefinitions - -\startcommands dutch english - german - - - bovenhoogte: bovenhoogte topheight - hoeheoben - bovenafstand: bovenafstand topdistance - abstandoben - hoofdhoogte: hoofdhoogte headerheight - kopfzeilenhoehe - hoofdafstand: hoofdafstand headerdistance - kopfzeilenabstand - teksthoogte: teksthoogte textheight - texthoehe - voetafstand: voetafstand footerdistance - fusszeileabstand - voethoogte: voethoogte footerheight - fusszeilenhoehe - onderafstand: onderafstand bottomdistance - abstandunten - onderhoogte: onderhoogte bottomheight - hoeheunten - margebreedte: margebreedte marginwidth - marginalbreite - linkermargebreedte: linkermargebreedte leftmarginwidth - linkemarginalbreite - rechtermargebreedte: rechtermargebreedte rightmarginwidth - rechtemarginalbreite - margeafstand: margeafstand margindistance - marginalafstand - randbreedte: randbreedte edgewidth - randbreite - linkerrandbreedte: linkerrandbreedte leftedgewidth - breitelinkerrand - rechterrandbreedte: rechterrandbreedte rightedgewidth - breiterechterrand - randafstand: randafstand edgedistance - randabstand - tekstbreedte: tekstbreedte textwidth - textbreite - zetbreedte: zetbreedte makeupwidth - satzbreite - zethoogte: zethoogte makeupheight - satzhoehe - kopwit: kopwit topspace - kopfweite - rugwit: rugwit backspace - rumpfweite - - papierbreedte: papierbreedte paperwidth - papierbreite - papierhoogte: papierhoogte paperheight - papierhoehe - - kopniveau: kopniveau headlevel - kopfniveau - - linewidth: lijndikte linethickness - liniendicke - -\stopcommands - -%D \stopcompressdefinitions - -%D At \PRAGMA\ we use an extended version of \CONTEXT. The -%D commands below are part of this. Beware of conflicts when -%D defining your own. - -%D \startcompressdefinitions - -\startcommands dutch english - german - - startdocument: startdocument startdocument - startdokument - stopdocument: stopdocument stopdocument - stopdokument - startoverzicht: startoverzicht startoverview - startueberblick - stopoverzicht: stopoverzicht stopoverview - stopueberblick - stelbrievenin: stelbrievenin setupcorrespondence - stellekorrespondenzein - brieven: brieven letters - briefe - brief: brief letter - brief - label: label label - label - sheet: sheet sheet - blatt - stelstickersin: stelstickersin setupstickers - stellestickerein - stelsheetsin: stelsheetsin setupsheets - stelleblattein - labels: labels labels - labels - woonplaats: woonplaats domicile - wohnort - -\stopcommands - -%D \stopcompressdefinitions - -\endinput +%D \module
+%D [ file=mult-com,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Commands,
+%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.
+
+%D In this module we define the commands. A more than quick
+%D glance at this list leans that it's incomplete. This is due
+%D to the fact that the system generated a lot of commands by
+%D means of the elements specified somewhere else.
+%D
+%D {\em Because the original interface to \CONTEXT\ is dutch,
+%D the words left of the \type{:} are in dutch. In the near
+%D future english will be the core language.}
+
+\writestatus{loading}{Context Multilingual Macros / Commands}
+
+%D The commands are grouped according to their functionality.
+%D Although the \type{\stop} counterpart of the
+%D \type{\start}||commands could be generated automatically,
+%D we've chosen do define it explicitly.
+%D
+%D One complication of the english commands, is that we don't
+%D want them to overrule or conflict with Plain \TEX. The
+%D names therefore are not always optimal.
+
+%D \startcompressdefinitions
+
+\startcommands dutch english
+ german
+
+ language: taal language
+ sprache
+ mainlanguage: hoofdtaal mainlanguage
+ hauptsprache
+ translate: vertaal translate
+ uebersetzten
+ installlanguage: installeertaal installlanguage
+ installieresprache
+ setuplanguage: steltaalin setuplanguage
+ stellespracheein
+
+ showmakeup: toonopmaak showmakeup
+ zeigeumbruch
+
+ usespecials: gebruikspecials usespecials
+ benutzespezielles
+
+% system redefineaccent: herdefinieeraccent redefineaccent
+% redefiniereakzent
+% system redefinecharacter: herdefinieerkarakter redefinecharacter
+% redefinierezeichen
+% system redefinecommand: herdefinieercommando redefinecommand
+% redefinierbefehl
+ defineaccent: definieeraccent defineaccent
+ definiereakzent
+ definecharacter: definieerkarakter definecharacter
+ definierezeichen
+ definecommand: definieercommando definecommand
+ definierebefehl
+ startcoding: startcodering startcoding
+ startkodierung
+ stopcoding: stopcodering stopcoding
+ stopkodierung
+ definebodyfontenvironment: definieerkorpsomgeving definebodyfontenvironment
+ definierefliesstextumgebung
+ definebodyfont: definieerkorps definebodyfont
+ definierefliesstext
+
+ setuptype: steltypein setuptype
+ stelletipein
+ type: type type
+ tippen
+ typ: typ typ
+ tip
+ arg: arg arg
+ arg
+ tex: tex tex
+ tex
+ definetyping: definieertypen definetyping
+ definieretippen
+ setuptyping: steltypenin setuptyping
+ stelletippenein
+% generated starttyping: starttypen starttyping
+% starttippen
+% generated stoptyping: stoptypen stoptyping
+% stoptippen
+ typefile: typefile typefile
+ tippedatei
+
+ setupfootnotes: stelvoetnotenin setupfootnotes
+ stellefussnotenein
+ setupfootnotedefinition: stelvoetnootdefinitiein setupfootnotedefinition
+ stellefussnotendefinitioneein % TOBIAS
+ note: noot note
+ notiz
+ footnote: voetnoot footnote
+ fussnote
+ startlocalfootnotes: startlokalevoetnoten startlocalfootnotes
+ startlokalefussnoten
+ stoplocalfootnotes: stoplokalevoetnoten stoplocalfootnotes
+ stoplokalefussnoten
+ placelocalfootnotes: plaatslokalevoetnoten placelocalfootnotes
+ platzierelokalefussnoten
+ placefootnotes: plaatsvoetnoten placefootnotes
+ platzierefussnoten
+
+ currentdate: huidigedatum currentdate
+ heutigesdatum
+ weekday: weekdag weekday
+ wochentag
+ WEEKDAY: WEEKDAG WEEKDAY
+ WOCHENTAG
+ month: maand month
+ monat
+ MONTH: MAAND MONTH
+ MONAT
+
+ Numbers: Cijfers Numbers
+ Ziffern
+ numbers: cijfers numbers
+ ziffern
+ romannumerals: romeins romannummerals
+ roemischezahlen
+ Romannumerals: Romeins Romannummerals
+ Roemischezahlen
+ character: letter character
+ buchstabe
+ Character: Letter Character
+ Buchstabe
+ characters: letters characters
+ buchstaben
+ Characters: Letters Characters
+ Buchstaben
+
+ definesymbol: definieersymbool definesymbol
+ definieresymbol
+ symbol: symbool symbol
+ symbol
+ defineconversion: definieerconversie defineconversion
+ definierekonversion
+ convertnumber: converteernummer convertnumber
+ konvertierezahl
+
+ kap: kap kap
+ kap
+ KAP: KAP KAP
+ KAP
+ nokap: nokap nokap
+ nokap
+ Kap: Kap Kap
+ Kap
+ Kaps: Kaps Kaps
+ Kaps
+ WORD: WOORD WORD
+ WORT
+ WORDS: WOORDEN WORDS
+ WOERTER
+ Word: Woord Word
+ Wort
+ Words: Woorden Words
+ Woerter
+ stretched: opgerekt stretched
+ gestreckt
+ overstrike: doorstreep overstrike
+ durchgestrichen
+ overstrikes: doorstrepen overstrikes
+ durchstreichen
+ underbar: onderstreep underbar
+ unterstrichen
+ underbars: onderstrepen underbars
+ unterstreichen
+ setupunderbar: stelonderstrepenin setupunderbar
+ stelleunterstreichenein
+
+ setupbodyfont: stelkorpsin setupbodyfont
+ stellefliesstextein
+ switchtobodyfont: switchnaarkorps switchtobodyfont
+ wechselezumfliesstext
+ showbodyfont: toonkorps showbodyfont
+ zeigefliesstext
+ showbodyfontenvironment: toonkorpsomgeving showbodyfontenvironment
+ zeigefliesstextumgebung
+
+ headtext: koptekst headtext
+ ueberschrift
+ labeltext: labeltekst labeltext
+ labeltext
+ LABELTEXT: LABELTEKST LABELTEXT
+ LABELTEXT
+ setupheadtext: stelkoptekstin setupheadtext
+ stelleueberschriftein
+ setuplabeltext: stellabeltekstin setuplabeltext
+ stellelabeltextein
+
+ marginrule: kantlijn marginrule
+ marginallinie
+ startmarginrule: startkantlijn startmarginrule
+ startmarginallinie
+ stopmarginrule: stopkantlijn stopmarginrule
+ stopmarginallinie
+ setupmarginrules: stelkantlijnin setupmarginrules
+ stellemarginallinieein
+
+ blackrule: blokje blackrule
+ rechteck
+ blackrules: blokjes blackrules
+ rechtecke
+ setupblackrules: stelblokjesin setupblackrules
+ stellerechteckein
+
+ setupscreens: stelrastersin setupscreens
+ stellerasterein
+
+ framed: omlijnd framed
+ umrahmt
+ inframed: inlijnd inframed
+ imumriss
+ setupframed: stelomlijndin setupframed
+ stelleumrahmtein
+% setuprules: stellijnenin setuprules
+% stelleumrissein
+ setuplinewidth: stellijndiktein setuplinewidth
+ stellelinienbreiteein
+
+ setupthinrules: steldunnelijnenin setupthinrules
+ stelleduennerumrissein
+ thinrule: dunnelijn thinrule
+ duennelinie
+ thinrules: dunnelijnen thinrules
+ duennerumriss
+ hairline: haarlijn hairline
+ haarlinie
+
+ vl: vl vl
+ vl
+ hl: hl hl
+ hl
+
+ defineframedtext: definieerkadertekst defineframedtext
+ definiereumrahmtertext
+% startframedtext: startkadertekst startframedtext
+% startumrahmtertext
+% stopframedtext: stopkadertekst stopframedtext
+% stopumrahmtertext
+ setupframedtexts: stelkadertekstenin setupframedtexts
+ stelleumrahmtetexteein
+
+ defineoverlay: definieeroverlay defineoverlay
+ definiereoverlay
+
+ background: achtergrond background
+ hintergrund
+ startbackground: startachtergrond startbackground
+ starthintergrund
+ stopbackground: stopachtergrond stopbackground
+ stophintergrund
+ setupbackground: stelachtergrondin setupbackground
+ stellehintergrundein
+
+ fillinrules: invullijnen fillinrules
+ gefuelltesrechteck
+ setupfillinrules: stelinvullijnenin setupfillinrules
+ stellegefuelltesrechteckein
+ fillintext: invulltekst fillintext
+ ausfuelltext
+
+ setupfillinlines: stelinvulregelsin setupfillinlines
+ stellegefuelltezeileein
+ fillinline: invulregel fillinline
+ gefuelltezeile
+
+ setuptextrules: steltekstlijnenin setuptextrules
+ stelletextumrissein
+ textrule: tekstlijn textrule
+ textlinie
+ starttextrule: starttekstlijn starttextrule
+ starttextlinie
+ stoptextrule: stoptekstlijn stoptextrule
+ stoptextlinie
+
+ usemodule: gebruikmodule usemodule
+ verwendemodul
+ usemodules: gebruikmodules usemodules
+ verwendemodule
+
+ starttekst: starttekst starttext
+ starttext
+ stoptekst: stoptekst stoptext
+ stoptext
+
+ margetitel: margetitel margintitle
+ marginaltitel
+ margewoord: margewoord marginword
+ marginalwort
+
+ % dit wordt:
+
+ margetekst: margetekst margintext
+ marginaltext
+
+ inlinker: inlinker inleft
+ imlinken
+ inmarge: inmarge inmargin
+ inmarginalie
+ inanderemarge: inanderemarge inothermargin
+ inanderermarginale
+ inrechter: inrechter inright
+ imrechten
+ startmargeblok: startmargeblok startmarginblock
+ startmarginalblock
+ stopmargeblok: stopmargeblok stopmarginblock
+ stopmarginalblock
+ stelinmargein: stelinmargein setupinmargin
+ stelleinmarginalieein
+ stelmargeblokkenin: stelmargeblokkenin setupmarginblocks
+ stellemarginalblockein
+
+ inleftside: inlinkerrand inleftside
+ imlinkenrand
+ inleftmargin: inlinkermarge inleftmargin
+ inlinkermarginale
+ inrightmargin: inrechtermarge inrightmargin
+ inrechtermarginale
+ inrightside: inrechterrand inrightside
+ imrechtenrand
+
+ woordrechts: woordrechts wordright
+ wortrechts
+
+ blanko: blanko blank
+ blanko
+ stelblankoin: stelblankoin setupblank
+ stelleblankoein
+ corrigeerwitruimte: corrigeerwitruimte correctwhitespace
+ korrigierezwischenraum
+ fixedspaces: vastespaties fixedspaces
+ festesspatium
+ nospace: geenspatie nospace
+ keinspatium
+ space: spatie space
+ spatium
+ geenwitruimte: geenwitruimte nowhitespace
+ keinzwischenraum
+ opelkaar: opelkaar packed
+ kleinerdurchschuss
+ startopelkaar: startopelkaar startpacked
+ startkleinerdurchschuss
+ stopopelkaar: stopopelkaar stoppacked
+ stopkleinerdurchschuss
+ startvanelkaar: startvanelkaar startunpacked
+ startgrosserdurchschuss
+ stopvanelkaar: stopvanelkaar stopunpacked
+ stopkleinerdurchschuss
+ startregelcorrectie: startregelcorrectie startlinecorrection
+ startzeilenkorrektur
+ stopregelcorrectie: stopregelcorrectie stoplinecorrection
+ stopzeilenkorrektur
+ omlaag: omlaag godown
+ nachunten
+ witruimte: witruimte whitespace
+ zwischenraum
+
+ nietinspringen: nietinspringen noindenting
+ nichteinziehen
+ inspringen: inspringen indenting
+ einziehen
+ stelinspringenin: stelinspringenin setupindenting
+ stelleeinziehenein
+
+ startuitlijnen: startuitlijnen startalignment
+ startausrichtung
+ stopuitlijnen: stopuitlijnen stopalignment
+ stopausrichtung
+
+ startregels: startregels startlines
+ startzeilen
+ stopregels: stopregels stoplines
+ stopzeilen
+ stelregelnummerenin: stelregelnummerenin setuplinenumbering
+ stellezeilennummerierungein
+ startregelnummeren: startregelnummeren startlinenumbering
+ startzeilennummerierung
+ stopregelnummeren: stopregelnummeren stoplinenumbering
+ stopzeilennummerierung
+ startregel: startregel startline
+ startzeile
+ stopregel: stopregel stopline
+ stopzeile
+ eenregel: eenregel someline
+ einezeile
+ inregel: inregel inline
+ inzeile
+ crlf: crlf crlf
+ crlf
+ stelregelsin: stelregelsin setuplines
+ stellezeilenein
+
+ startsmaller: startsmaller startnarrower
+ startenger
+ stopsmaller: stopsmaller stopnarrower
+ stopenger
+ stelsmallerin: stelsmallerin setupnarrower
+ stelleengerein
+
+ starttabel: starttabel starttable
+ starttabelle
+ stoptabel: stoptabel stoptable
+ stoptabelle
+ starttabellen: starttabellen starttables
+ starttabellen
+ stoptabellen: stoptabellen stoptables
+ stoptabellen
+ steltabellenin: steltabellenin setuptables
+ stelletabellenein
+
+ pagina: pagina page
+ seite
+ koppelpagina: koppelpagina couplepage
+ doppelseite
+ soortpagina: soortpagina pagetype
+ seitentyp
+ verwerkpagina: verwerkpagina processpage
+ bearbeiteseite
+ koppelpapier: koppelpapier couplepaper
+ doppelseitigespapier
+ selecteerpapier: selecteerpapier selectpaper
+ waehlepapieraus
+ scherm: scherm screen
+ bildschirm
+
+ definieersectie: definieersectie definesection
+ definiereabschnitt
+ definieersectieblok: definieersectieblok definesectionblock
+ definiereabschnittsblock
+ stelsectieblokin: stelsectieblokin setupsectionblock
+ stelleabschnittsblockein
+ stelsectiein: stelsectiein setupsection
+ stelleabschnittein
+
+ geenbovenenonderregels: geenbovenenonderregels notopandbottomlines
+ keinzeilenobenundunten
+ geenhoofdenvoetregels: geenhoofdenvoetregels noheaderandfooterlines
+ keinekopfundfusszeilen
+ stelbovenin: stelbovenin setuptop
+ stellenobenein
+ stelboventekstenin: stelboventekstenin setuptoptexts
+ stelletextobenein
+ stelhoofdin: stelhoofdin setupheader
+ stellekopfzeileein
+ stelhoofdtekstenin: stelhoofdtekstenin setupheadertexts
+ stellekopfzeilentextein
+ stelnummeringin: stelnummeringin setuppagenumbering
+ stelleseitennummeriernungein
+ stelonderin: stelonderin setupbottom
+ stelleuntenein
+ stelondertekstenin: stelondertekstenin setupbottomtexts
+ stelletextuntenein
+ stelvoetin: stelvoetin setupfooter
+ stellefusszeileein
+ stelvoettekstenin: stelvoettekstenin setupfootertexts
+ stellefusszeilentextein
+ stelpaginanummerin: stelpaginanummerin setuppagenumber
+ stelleseitennummerein
+ stelsubpaginanummerin: stelsubpaginanummerin setupsubpagenumber
+ stelleunterseitennummerein
+ steltekstin: steltekstin setuptext
+ stelletextein
+ stelteksttekstenin: stelteksttekstenin setuptexttexts
+ stelletexttexteein
+
+ pagenumber: paginanummer pagenumber
+ seitenummer
+
+ items: items items
+ posten
+ stelitemsin: stelitemsin setupitems
+ stellepostenein
+
+ regellinks: regellinks leftaligned
+ zeilelinks % better: linksbuendig
+ regelmidden: regelmidden midaligned
+ zeilemitte % better: zentriert
+ regelrechts: regelrechts rightaligned
+ zeilerechts % better: rechtsbuendig
+
+ startkolommen: startkolommen startcolumns
+ startspalten
+ stopkolommen: stopkolommen stopcolumns
+ stopspalten
+ stelkolommenin: stelkolommenin setupcolumns
+ stellespaltenein
+ kolom: kolom column
+ spalte
+
+ kop: kop head
+ kopf
+ but: but but
+ but
+ som: som item
+ pos
+ nop: nop nop
+ nop
+ mar: mar mar
+ mar
+ sym: sym sym
+ sym
+ its: its its
+ its
+ startopsomming: startopsomming startitemize
+ startaufzaehlung
+ stelopsommingin: stelopsommingin setupitemize
+ stelleaufzaehlungein
+ stopopsomming: stopopsomming stopitemize
+ stopaufzaehlung
+
+ definieerkop: definieerkop definehead
+ definierekopf
+ stelkopin: stelkopin setuphead
+ stellekopfein
+ stelkoppenin: stelkoppenin setupheads
+ stellekoepfeein
+ stelkopnummerin: stelkopnummerin setupheadnumber
+ stellekopfzahlein
+ kopnummer: kopnummer headnumber
+ kopfnummer
+
+ resetmarkering: resetmarkering resetmarking
+ ruecksetztenbeschriftung
+ stelmarkeringin: stelmarkeringin setupmarking
+ stellebeschriftungein
+ definieermarkering: definieermarkering definemarking
+ definierebeschriftung
+ geenmarkering: geenmarkering nomarking
+ keinebeschriftung
+ markeer: markeer marking
+ beschriftung
+ ontkoppelmarkering: ontkoppelmarkering decouplemarking
+ entknuepfebeschriftung
+ koppelmarkering: koppelmarkering couplemarking
+ verknuepfebeschriftung
+ haalmarkering: haalmarkering getmarking
+ holebeschriftung
+
+ stellayoutin: stellayoutin setuplayout
+ stellelayoutein
+ paslayoutaan: paslayoutaan adaptlayout
+ passelayoutan
+ steloffsetin: steloffsetin setupoffset
+ stelleoffsetein
+ plaatsopgrid: plaatsopgrid snaptogrid
+ snaptogrid % TOBIAS
+ verplaatsopgrid: verplaatsopgrid resnaptogrid
+ resnaptogrid % TOBIAS
+
+ tooninstellingen: tooninstellingen showsetups
+ zeigeeinstellungen
+ toonkader: toonkader showframe
+ zeigerahmen
+ toongrid: toongrid showgrid
+ zeigegrid
+ toonopbouw: toonopbouw showbuildup
+ zeigeaufbau
+ toonlayout: toonlayout showlayout
+ zeigelayout
+ toonprint: toonprint showprint
+ zeigeabdruck % - TOBIAS
+ toonstruts: toonstruts showstruts
+ zeigestruts
+
+ definieerpapierformaat: definieerpapierformaat definepapersize
+ definierepapierformat
+ stelpapierformaatin: stelpapierformaatin setuppapersize
+ stellepapierformatin
+ stelarrangerenin: stelarrangerenin setuparranging
+ stelarrangierenein % - TOBIAS
+
+ versie: versie version
+ version
+
+ stelachtergrondenin: stelachtergrondenin setupbackgrounds
+ stellehintergruendeein
+
+ steluitlijnenin: steluitlijnenin setupalign
+ stelleausrichtungein
+ stelwitruimtein: stelwitruimtein setupwhitespace
+ stellezwischenraumein
+
+ stelinteractiein: stelinteractiein setupinteraction
+ stelleinteraktionein
+ stelinteractiemenuin: stelinteractiemenuin setupinteractionmenu
+ stelleinteraktionsmenueein
+ definieerinteractiemenu: definieerinteractiemenu defineinteractionmenu
+ definiereinteraktionsmenue
+ startinteractiemenu: startinteractiemenu startinteractionmenu
+ startinteraktionsmenue
+ blokkeerinteractiemenu: blokkeerinteractiemenu disableinteractionmenu
+ inaktiviereinteraktionsmenue
+ interactiebuttons: interactiebuttons interactionbuttons
+ interaktionsknopfe
+ interactiebalk: interactiebalk interactionbar
+ interaktionsbalken
+ stelinteractiebalkin: stelinteractiebalkin setupinteractionbar
+ stelleinteraktionsbalkenein
+ stelinteractieschermin: stelinteractieschermin setupinteractionscreen
+ stelleinteraktionsbildschirmein
+
+ placebookmarks: plaatsbookmarks placebookmarks
+ platzierebookmarks
+ bookmark: bookmark bookmark
+ bookmark
+
+ definieerbeeldmerk: definieerbeeldmerk definelogo
+ definierelogo
+ plaatsbeeldmerken: plaatsbeeldmerken placelogos
+ platzierelogo
+
+ definecolor: definieerkleur definecolor
+ definierefarbe
+ definecolorgroup: definieerkleurgroep definecolorgroup
+ definierefarbengruppe
+ definepalet: definieerpalet definepalet
+ definierepalette
+ gray: grijs gray
+ grau
+ color: kleur color
+ farbe
+ startcolor: startkleur startcolor
+ startfarbe
+ stopcolor: stopkleur stopcolor
+ stopfarbe
+ setupcolors: stelkleurenin setupcolors
+ stellefarbenein
+ setupcolor: stelkleurin setupcolor
+ stellefarbeein
+ setuppalet: stelpaletin setuppalet
+ stellepaletteein
+ showcolor: toonkleur showcolor
+ zeigefarbe
+ showcolorgroup: toonkleurgroep showcolorgroup
+ zeigefarbengruppe
+ showpalet: toonpalet showpalet
+ zeigepalette
+ comparecolorgroup: vergelijkkleurgroep comparecolorgroup
+ vergleichefarbengruppe
+ comparepalet: vergelijkpalet comparepalet
+ vergleichepalette
+ colorvalue: kleurwaarde colorvalue
+ farbewert
+ grayvalue: grijswaarde grayvalue
+ grauwert
+
+ startraster: startraster startraster
+ startraster
+ stopraster: stopraster stopraster
+ stopraster
+
+ definieerblok: definieerblok defineblock
+ definiereblock
+ gebruikblokken: gebruikblokken useblocks
+ verwendeblock
+ geenblokkenmeer: geenblokkenmeer nomoreblocks
+ keinebloeckemehr
+ handhaafblokken: handhaafblokken keepblocks
+ behaltebloecke
+ selecteerblokken: selecteerblokken selectblocks
+ waehlebloeckeaus
+ stelblokin: stelblokin setupblock
+ stelleblockein
+ verbergblokken: verbergblokken hideblocks
+ verbergebloecke
+
+ definieerlijst: definieerlijst definelist
+ definiereliste
+ definieersamengesteldelijst: definieersamengesteldelijst definecombinedlist
+ definierezusammengestellteliste
+ plaatslijst: plaatslijst placelist
+ platziereliste
+ schrijfnaarlijst: schrijfnaarlijst writetolist
+ schreibezurliste
+ schrijftussenlijst: schrijftussenlijst writebetweenlist
+ schreibezwischenliste
+ stellijstin: stellijstin setuplist
+ stellelisteein
+ stelsamengesteldelijstin: stelsamengesteldelijstin setupcombinedlist
+ stellezusammengestelltelisteein
+
+ bepaallijstkenmerken: bepaallijstkenmerken determinelistcharacteristics
+ determinelistcharacteristics % TOBIAS
+
+ definieerreferentielijst: definieerreferentielijst definereferencelist
+ definierereferenzliste
+ plaatsreferentielijst: plaatsreferentielijst placereferencelist
+ platzierereferenzliste
+ schrijfnaarreferentielijst: schrijfnaarreferentielijst writetoreferencelist
+ schreibezurreferenzliste
+ stelreferentielijstin: stelreferentielijstin setupreferencelist
+ stellereferenzlisteein
+
+ definieerplaatsblok: definieerplaatsblok definefloat
+ definieregleitobjekt
+ stelplaatsblokin: stelplaatsblokin setupfloat
+ stellegleitobjektein
+ stelplaatsblokkenin: stelplaatsblokkenin setupfloats
+ stellegleitobjekteein
+ splitsplaatsblok: splitsplaatsblok splitfloat
+ teilegleitobjekt
+ stelplaatsblokkensplitsenin: stelplaatsblokkensplitsenin setupfloatsplitting
+ stelleplatziegeteiltegleitobjekteein
+ startcombinatie: startcombinatie startcombination
+ startkombination
+ stopcombinatie: stopcombinatie stopcombination
+ stopkombination
+ plaatsnaastelkaar: plaatsnaastelkaar placesidebyside
+ platzierenebeneinander
+ plaatsonderelkaar: plaatsonderelkaar placeontopofeachother
+ platziereuntereinander
+
+ stelblokkopjein: stelblokkopjein setupcaption
+ stellebildunterschriftein
+ stelblokkopjesin: stelblokkopjesin setupcaptions
+ stellebilderunterschriftein
+ stelcombinatiesin: stelcombinatiesin setupcombinations
+ stellekombinationein
+
+ startoverlay: startoverlay startoverlay
+ startoverlay
+ stopoverlay: stopoverlay stopoverlay
+ stopoverlay
+
+ definieerregister: definieerregister defineregister
+ definiereregister
+ koppelregister: koppelregister coupleregister
+ verknuepfregister
+ stelregisterin: stelregisterin setupregister
+ stelleregisterein
+ schrijfnaarregister: schrijfnaarregister writetoregister
+ schreibezumregister
+ plaatsregister: plaatsregister placeregister
+ platziereregister
+
+ bepaalregisterkenmerken: bepaalregisterkenmerken determineregistercharacteristics
+ determineregistercharacteristics % TOBIAS
+
+ definieersorteren: definieersorteren definesorting
+ definieresortieren
+ definieersynoniemen: definieersynoniemen definesynonyms
+ definieresynonyme
+ stelsorterenin: stelsorterenin setupsorting
+ stellesortierenein
+ stelsynoniemin: stelsynoniemin setupsynonym
+ stellesynonymein
+
+ startsynchronisatie: startsynchronisatie startsynchronization
+ startsynchronisation
+ stopsynchronisatie: stopsynchronisatie stopsynchronization
+ stopsynchronisation
+ stelsynchronisatiebalkin: stelsynchronisatiebalkin setupsynchronizationbar
+ stellesynchronisationsbalkenein
+ stelsynchronisatiein: stelsynchronisatiein setupsynchronization
+ stellesynchronisationein
+ synchronisatiebalk: synchronisatiebalk synchronizationbar
+ synchronisationsbalken
+ synchroniseer: synchroniseer synchronize
+ synchronisieren
+
+ gebruikexterndocument: gebruikexterndocument useexternaldocument
+ verwendeexteresdokument
+ gebruikURL: gebruikURL useURL
+ verwendeURL
+
+ stelprogrammasin: stelprogrammasin setupprograms
+ stelleprogrammein
+ definieerprogramma: definieerprogramma defineprogram
+ definiereprogramme
+ programma: programma program
+ programm
+
+ stelpaginaovergangenin: stelpaginaovergangenin setuppagetransitions
+ stelleseitenuebergangein
+
+ definieerprofiel: definieerprofiel defineprofile
+ definiereprofil
+ definieerversie: definieerversie defineversion
+ definiereversion
+ markeerversie: markeerversie markversion
+ beschrifteversion
+ selecteerversie: selecteerversie selectversion
+ waehleversionaus
+ startprofiel: startprofiel startprofile
+ startprofil
+ startversie: startversie startversion
+ startversion
+ stelprofielenin: stelprofielenin setupprofiles
+ stelleprofilein
+ stelversiesin: stelversiesin setupversions
+ stelleversionein
+ stopprofiel: stopprofiel stopprofile
+ stopprofil
+ stopversie: stopversie stopversion
+ stopversion
+ volgprofiel: volgprofiel followprofile
+ folgeprofil
+ volgprofielversie: volgprofielversie followprofileversion
+ folgeprofilversion
+ volgversie: volgversie followversion
+ folgeversion
+
+ doordefinieren: doordefinieren definedescription
+ definierebeschreibung
+ doorlabelen: doorlabelen definelabel
+ definierelabel
+ doornummeren: doornummeren defineenumeration
+ definierenummerierung
+ doorspringen: doorspringen defineindenting
+ definiereeinzug
+ steldoordefinierenin: steldoordefinierenin setupdescriptions
+ definierebeschreibungen
+ steldoornummerenin: steldoornummerenin setupenumerations
+ stellebeschreibungein
+ steldoorspringenin: steldoorspringenin setupindentations
+ stelleeinzuegein
+
+ steltabin: steltabin setuptab
+ stelletabein
+ tab: tab tab
+ tab
+
+ stelexternefigurenin: stelexternefigurenin setupexternalfigures
+ stelleexterneabbildungenein
+ toonexternefiguren: toonexternefiguren showexternalfigures
+ zeigeexterneabbildungen
+ externalfigure: externfiguur externalfigure
+ externeabbildung
+ toonexternfiguur: toonexternfiguur showexternalfigure
+ zeigeexterneabbildung
+ gebruikexternfiguur: gebruikexternfiguur useexternalfigure
+ verwendeexterneabbildung
+
+ startfiguur: startfiguur startfigure
+ startabbildung
+ stopfiguur: stopfiguur stopfigure
+ stopabbildung
+ refereer: refereer referring
+ referieren
+ markeer: markeer marking
+ beschriftung
+
+ rooster: rooster grid
+ gitter
+
+ button: button button
+ knopf
+ menubutton: menubutton menubutton
+ menueknopf
+ stelbuttonsin: stelbuttonsin setupbuttons
+ stelleknopfein
+
+ usereferences: gebruikreferenties usereferences
+ verwendereferenzen
+ reflijst: reflijst reflist
+ refliste
+ stelreferentielijstin: stelreferentielijstin setupreferencelist
+ stellereferenzlisteein
+ setupreferencing: stelrefererenin setupreferencing
+ stellereferenzierenein
+
+ textreference: tekstreferentie textreference
+ textreferenz
+ pagereference: paginareferentie pagereference
+ seitenreferenz
+ reference: referentie reference
+ referenz
+
+ uit: uit from
+ von
+ in: in in
+ in
+ op: op at
+ bei
+ naar: naar goto
+ zu
+ naarbox: naarbox gotobox
+ zurbox
+ naarpagina: naarpagina gotopage
+ zurseite % - old but forgotten
+
+ startformule: startformule startformula
+ startformel
+ stopformule: stopformule stopformula
+ stopformel
+ plaatsformule: plaatsformule placeformula
+ platziereformel
+ plaatssubformule: plaatssubformule placesubformula
+ platziereunterformel
+ stelformulesin: stelformulesin setupformulae
+ stelleformelnein
+ startgegeven: startgegeven startfact
+ startgegeben
+ stopgegeven: stopgegeven stopfact
+ stopgegeben
+ startlegenda: startlegenda startlegend
+ startlegende
+ stoplegenda: stoplegenda stoplegend
+ stoplegende
+leg: leg leg leg
+geg: geg fact geg
+ mathematics: wiskunde mathematics
+ mathematik
+ dimension: dimensie dimension
+ dimension
+ nodimension: geendimensie nodimension
+ keindimension
+
+ startomgeving: startomgeving startenvironment
+ startumgebung
+ stopomgeving: stopomgeving stopenvironment
+ stopumgebung
+ startdeelomgeving: startdeelomgeving startlocalenvironment
+ startlokaleumgebung
+ startonderdeel: startonderdeel startcomponent
+ startkomponente
+ stoponderdeel: stoponderdeel stopcomponent
+ stopkomponente
+ startprodukt: startprodukt startproduct
+ startprodukt
+ stopprodukt: stopprodukt stopproduct
+ stopprodukt
+ startproject: startproject startproject
+ startprojekt
+ stopproject: stopproject stopproject
+ stopprojekt
+
+ setups: instellingen setups
+ setups % --
+
+ project: project project
+ projekt
+ onderdeel: onderdeel component
+ komponente
+ produkt: produkt product
+ produkt
+ omgeving: omgeving environment
+ umgebung
+ geenfilesmeer: geenfilesmeer nomorefiles
+ keinedateienmehr
+
+ haalbuffer: haalbuffer getbuffer
+ holebuffer
+ startbuffer: startbuffer startbuffer
+ startbuffer
+ stopbuffer: stopbuffer stopbuffer
+ stopbuffer
+ stelbufferin: stelbufferin setupbuffer
+ stellebufferein
+ typebuffer: typebuffer typebuffer
+ tippebuffer
+
+ betekenis: betekenis united
+ bedeutung
+ voluit: voluit infull
+ volleswort
+
+ citaat: citaat quotation
+ zitat
+ citeer: citeer quote
+ zitieren
+ startcitaat: startcitaat startquotation
+ startzitat
+ stopcitaat: stopcitaat stopquotation
+ stopzitat
+ stelciterenin: stelciterenin setupquote
+ stellezitierenein
+
+ definieer: definieer define
+ definieren
+ herhaal: herhaal redo
+ wiederholen
+ gebruikcommandos: gebruikcommandos usecommands
+ verwendebefehl
+ definieerstartstop: definieerstartstop definestartstop
+ definierestartstop
+ startlocal: startlokaal startlocal
+ startlokal
+ stoplocal: stoplokaal stoplocal
+ stoplokal
+ startglobal: startglobaal startglobal
+ startglobal
+ stopglobal: stopglobaal stopglobal
+ stopglobal
+ naam: naam name
+ name
+
+ definieeropmaak: definieeropmaak definemakeup
+ definiereumbruch
+ stelopmaakin: stelopmaakin setupmakeup
+ stelleumbruchein
+ startopmaak: startopmaak startmakeup
+ startumbruch
+ stopopmaak: stopopmaak stopmakeup
+ stopumbruch
+
+ gebruikexternefile: gebruikexternefile useexternalfile
+ verwendeexternedatei
+ gebruikexternefiles: gebruikexternefiles useexternalfiles
+ verwendeexternedateien
+
+ kenmerk: kenmerk referral
+ verweis
+ kenmerkdatum: kenmerkdatum referraldate
+ verweisdatum
+
+ hoog: hoog high
+ hoch
+ laho: laho lohi
+ hoti
+ laag: laag low
+ tief
+
+% startuitstellen: startuitstellen startpostponing
+% startverschieben
+% stopuitstellen: stopuitstellen stoppostponing
+% stopverschieben
+% startverbergen: startverbergen starthiding
+% startverbergen
+% stopverbergen: stopverbergen stophiding
+% stopverbergen
+
+ breuk: breuk fraction
+ bruch
+ chem: chem chem
+ chem
+
+ startnaast: startnaast startopposite
+ startgegenueber
+
+ stopnaast: stopnaast stopopposite
+ stopgegenueber
+ stelnaastplaatsenin: stelnaastplaatsenin setupoppositeplacing
+ stellegegenueberplatzierenein
+
+ startpositioneren: startpositioneren startpositioning
+ startpositionieren
+ stoppositioneren: stoppositioneren stoppositioning
+ stoppositionieren
+ positioneer: positioneer position
+ position
+ stelpositionerenin: stelpositionerenin setuppositioning
+ stellepositionierenein
+
+ roteer: roteer rotate
+ drehen
+ stelroterenin: stelroterenin setuprotate
+ stelledrehenein
+
+ spiegel: spiegel mirror
+ mirror % TOBIAS CHECK!
+ schaal: schaal scale
+ scale % TOBIAS CHECK!
+
+ stelnummerenin: stelnummerenin setupnumbering
+ stellenummerierungein
+ reset: reset reset
+ ruecksetzten
+
+ stelpublicatiesin: stelpublicatiesin setuppublications
+ stellepublikationein
+ publicatie: publicatie publication
+ publikation
+
+ definieerhbox: definieerhbox definehbox
+ definierehbox
+
+ toelichting: toelichting remark
+ bemerkung
+
+ toevoegen: toevoegen adding
+ zusatz
+
+ punten: punten periods
+ punkt
+
+ stelkoppeltekenin: stelkoppeltekenin setuphyphenmark
+ stellebindestrichein
+ stelinterliniein: stelinterliniein setupinterlinespace
+ stellezeilenabstandein
+ stelspatieringin: stelspatieringin setupspacing
+ stellespatiumein
+ steltolerantiein: steltolerantiein setuptolerance
+ stelletoleranzein
+ stelsysteemin: stelsysteemin setupsystem
+ stellesystemein
+
+ definieeralineas: definieeralineas defineparagraphs
+ definiereabsaetze
+ stelalineasin: stelalineasin setupparagraphs
+ stelleabsaetzeein
+
+ geentest: geentest donttest
+ keintest
+
+\stopcommands
+
+%D \stopcompressdefinitions
+
+%D There are a lot of variables that users can use in setups
+%D and dedicated macros. ({\em I still have to check the
+%D english names.})
+
+%D \startcompressdefinitions
+
+\startcommands dutch english
+ german
+
+
+ bovenhoogte: bovenhoogte topheight
+ hoeheoben
+ bovenafstand: bovenafstand topdistance
+ abstandoben
+ hoofdhoogte: hoofdhoogte headerheight
+ kopfzeilenhoehe
+ hoofdafstand: hoofdafstand headerdistance
+ kopfzeilenabstand
+ teksthoogte: teksthoogte textheight
+ texthoehe
+ voetafstand: voetafstand footerdistance
+ fusszeileabstand
+ voethoogte: voethoogte footerheight
+ fusszeilenhoehe
+ onderafstand: onderafstand bottomdistance
+ abstandunten
+ onderhoogte: onderhoogte bottomheight
+ hoeheunten
+ margebreedte: margebreedte marginwidth
+ marginalbreite
+ linkermargebreedte: linkermargebreedte leftmarginwidth
+ linkemarginalbreite
+ rechtermargebreedte: rechtermargebreedte rightmarginwidth
+ rechtemarginalbreite
+ margeafstand: margeafstand margindistance
+ marginalafstand
+ randbreedte: randbreedte edgewidth
+ randbreite
+ linkerrandbreedte: linkerrandbreedte leftedgewidth
+ breitelinkerrand
+ rechterrandbreedte: rechterrandbreedte rightedgewidth
+ breiterechterrand
+ randafstand: randafstand edgedistance
+ randabstand
+ tekstbreedte: tekstbreedte textwidth
+ textbreite
+ zetbreedte: zetbreedte makeupwidth
+ satzbreite
+ zethoogte: zethoogte makeupheight
+ satzhoehe
+ kopwit: kopwit topspace
+ kopfweite
+ rugwit: rugwit backspace
+ rumpfweite
+
+ papierbreedte: papierbreedte paperwidth
+ papierbreite
+ papierhoogte: papierhoogte paperheight
+ papierhoehe
+
+ kopniveau: kopniveau headlevel
+ kopfniveau
+
+ linewidth: lijndikte linethickness
+ liniendicke
+
+\stopcommands
+
+%D \stopcompressdefinitions
+
+%D At \PRAGMA\ we use an extended version of \CONTEXT. The
+%D commands below are part of this. Beware of conflicts when
+%D defining your own.
+
+%D \startcompressdefinitions
+
+\startcommands dutch english
+ german
+
+ startdocument: startdocument startdocument
+ startdokument
+ stopdocument: stopdocument stopdocument
+ stopdokument
+ startoverzicht: startoverzicht startoverview
+ startueberblick
+ stopoverzicht: stopoverzicht stopoverview
+ stopueberblick
+ stelbrievenin: stelbrievenin setupcorrespondence
+ stellekorrespondenzein
+ brieven: brieven letters
+ briefe
+ brief: brief letter
+ brief
+ label: label label
+ label
+ sheet: sheet sheet
+ blatt
+ stelstickersin: stelstickersin setupstickers
+ stellestickerein
+ stelsheetsin: stelsheetsin setupsheets
+ stelleblattein
+ labels: labels labels
+ labels
+ woonplaats: woonplaats domicile
+ wohnort
+
+\stopcommands
+
+%D \stopcompressdefinitions
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/mult-con.tex b/tex/context/base/mult-con.tex index ff897c8f3..0219cdfca 100644 --- a/tex/context/base/mult-con.tex +++ b/tex/context/base/mult-con.tex @@ -1,825 +1,835 @@ -%D \module -%D [ file=mult-con, -%D version=1996.06.01, -%D title=\CONTEXT\ Multilingual Macros, -%D subtitle=Constants, -%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. - -%D In this rather large definition file we are going to tell -%D \CONTEXT\ which constants, variables and elements we use. - -\writestatus{loading}{Context Multilingual Macros / Constants} - -%D First come some variables. These are used as keywords and -%D therefore need a different treatment. - -%D \startcompressdefinitions - -\startvariables dutch english german - - een: een one eins - twee: twee two zwei - drie: drie three drei - vier: vier four vier - vijf: vijf five fuenf - -\stopvariables - -%D \stopcompressdefinitions - -%D Of course we need the names of the months. - -%D \startcompressdefinitions - -\startvariables dutch english german - - sunday: zondag sunday sonntag - monday: maandag monday montag - tuesday: dinsdag tuesday dienstag - wednesday: woensdag wednesday mittwoch - thursday: donderdag thursday donnerstag - friday: vrijdag friday freitag - saturday: zaterdag saturday samstag - -\stopvariables - -\startvariables dutch english german - - january: januari January Januar - february: februari February Februar - march: maart March Maerz - april: april April April - may: mei May Mai - june: juni June Juni - july: juli July Juli - august: augustus August August - september: september September September - october: oktober October Oktober - november: november November November - december: december December Dezember - -\stopvariables - -%D Next we introduce some general label bound variables: - -\startvariables dutch english german - - oppagina: oppagina atpage oppagina % TOBIAS/SEBASTIAN - hierboven: hierboven hencefore hierboven % TOBIAS/SEBASTIAN - hieronder: hieronder hereafter hieronder % TOBIAS/SEBASTIAN - -\stopvariables - -%D \stopcompressdefinitions - -%D User defined commands are language specific, so we have to -%D use variable when defining them. First we define some -%D general structuring variables: - -%D \startcompressdefinitions - -\startvariables dutch english german - - sectie: sectie section abschnitt - - deel: deel part teil - hoofdstuk: hoofdstuk chapter kapitel - onderwerp: onderwerp subject thema - paragraaf: paragraaf section absatz - titel: titel title titel - - inhoud: inhoud content inhalt - inhouden: inhouden contents inhalte - - bijlage: bijlage appendix anhang - bijlagen: bijlagen appendices anhaenge - hoofdtekst: hoofdtekst bodypart haupttext - hoofdteksten: hoofdteksten bodymatter haupttexte - inleiding: inleiding frontpart einleitung - inleidingen: inleidingen frontmatter einleitungen - uitleiding: uitleiding backpart epilog - uitleidingen: uitleidingen backmatter epiloge - - voetnoot: voetnoot footnote fussnote - - systeem: systeem system systeme - -\stopvariables - -\startvariables dutch english german - - typen: typen typing tippen - file: file file datei - -\stopvariables - -%D \stopcompressdefinitions - -%D As we can see below, there are some more variables needed, -%D for instance for the definition of macro's for handling -%D floating bodies. - -%D \startcompressdefinitions - -\startvariables dutch english german - - formule: formule formula formel - formules: formules formulae formeln - - figuur: figuur figure abbildung - figuren: figuren figures abbildungen - tabel: tabel table tabelle - tabellen: tabellen tables tabellen - grafiek: grafiek graphic grafik - grafieken: grafieken graphics grafiken - intermezzo: intermezzo intermezzo intermezzo - intermezzos: intermezzos intermezzi intermezzi - - index: index index index - indices: indices indices indizies - - afkorting: afkorting abbreviation abkuerzung - afkortingen: afkortingen abbreviations abkuerzungen - logo: logo logo logo - logos: logos logos logos - eenheid: eenheid unit einheit - eenheden: eenheden units einheiten - - regel: regel line zeile - regels: regels lines zeilen - - framedtext: kadertekst framedtext umrahmtertext - -\stopvariables - -%D \stopcompressdefinitions - -%D The setup commands can take a lot of different arguments, -%D often in the form \type{variable=value}. Here we define the -%D variable part. Keep in mind that for the system, user defined -%D variables have a constant character. - -%D \startcompressdefinitions - -\startconstants dutch english german - - leftquotation: linkercitaat leftquotation linkerzitat - rightquotation: rechtercitaat rightquotation rechterzitat - leftquote: linkerciteer leftquote linkerzitieren - rightquote: rechterciteer rightquote rechterzitieren - leftsentence: linkerzin leftsentence linkersatz - rightsentence: rechterzin rightsentence rechtersatz - leftsubsentence: linkersubzin leftsubsentence linkersubsatz - rightsubsentence: rechtersubzin rightsubsentence rechtersubsatz - - datum: datum date datum - - aan: aan to zu - aanduiding: aanduiding indicator indikator - achtergrond: achtergrond background hintergrund - achtergrondkleur: achtergrondkleur backgroundcolor hintergrundfarbe - achtergrondoffset: achtergrondoffset backgroundoffset hintergrundoffset - achtergrondhoek: achtergrondhoek backgroundcorner hintergrundwinkel - achtergrondstraal: achtergrondstraal backgroundradius hintergrundradius - achtergronddiepte: achtergronddiepte backgrounddepth hintergrundtiefe - achtergrondraster: achtergrondraster backgroundscreen hintergrundraster - adres: adres address adresse - afmeting: afmeting size abmessung - afsluiter: afsluiter stopper abschnitttrenner - afstand: afstand distance abstand - assenstelsel: assenstelsel axis achsen - auteur: auteur author autor - balanceren: balanceren balance ausgleichen - bfactor: bfactor wfactor bfaktor - binnen: binnen inner innen - bladzijde: bladzijde page seite - blanko: blanko blank blanko - blokkade: blokkade obstruction gesperrt - blokwijze: blokwijze blockway blockauf - boven: boven top oben - bovenafstand: bovenafstand topdistance obenabstand - bovenkader: bovenkader topframe obenrahmen - bovenoffset: bovenoffset topoffset obenoffset - bovenstatus: bovenstatus topstatus statusoben - breedte: breedte width breite - bron: bron source quelle - commando: commando command befehl - commandos: commandos commands befehle - contrastkleur: contrastkleur contrastcolor kontrastfarbe - conversie: conversie conversion konversion - criterium: criterium criterium kriterium - datum: datum date datum - default: default default norm - diepte: diepte depth tiefe - dieptecorrectie: dieptecorrectie depthcorrection tiefekorrektur - dikte: dikte thickness dicke - doorgaan: doorgaan continue fortsetzen - dubbelzijdig: dubbelzijdig doublesided doppelseitig - dummy: dummy dummy dummy - eenheid: eenheid unit einheit - eigennummer: eigennummer ownnumber eigenenummer - expansie: expansie expansion expansion - factor: factor factor faktor - file: file file datei - formaat: formaat size groesse - gebied: gebied directory verzeichnis - grid: grid grid grid % TOBIAS - groot: groot big gross - haal: haal get hole - hang: hang hang haengend - hfactor: hfactor hfactor hfaktor - hoek: hoek corner winkel - hoffset: hoffset hoffset hoffset - hokjes: hokjes frames umrahmen - hoofd: hoofd header kopfzeile - hoofdafstand: hoofdafstand headerdistance kopfzeilenabstand - hoofdstatus: hoofdstatus headerstatus kopfzeilenstatus - hoogte: hoogte height hoehe - huidige: huidige current aktuell - in: in in in - interactie: interactie interaction interaktion - inspringen: inspringen indenting einziehen - items: items items posten - kader: kader frame rahmen - kaderkleur: kaderkleur framecolor rahmenfarbe - kaderoffset: kaderoffset frameoffset rahmenoffset - kaderdiepte: kaderdiepte framedepth rahmentiefe - kaderhoek: kaderhoek framecorner rahmenwinkel - kaderstraal: kaderstraal frameradius rahmenradius - kantlijn: kantlijn marginedge marginal - kantlijntekst: kantlijntekst marginedgetext marginaltext - klein: klein small klein - kleur: kleur color farbe - kolom: kolom column spalte - kolomafstand: kolom columndistance spaltenabstand - kopkleur: kopkleur headcolor kopffarbe - kopletter: kopletter headstyle kopfschrift - kopna: kopna afterhead nachkopf - kopoffset: kopoffset topoffset kopfoffset - koppeling: koppeling coupling verknuepfung - kopvoor: kopvoor beforehead vorkopf - kopwit: kopwit topspace kopfspatium - korps: korps bodyfont fliesstext - label: label label label - leeg: leeg empty leer - letter: letter style schrift - lijn: lijn line linie - lijndikte: lijndikte linethickness liniendicke - lijnkleur: lijnkleur linecolor linienfarbe - lijst: lijst list liste - linker: linker left linker - linkerbreedte: linkerbreedte leftwidth linkerbreite - linkerkader: linkerkader leftframe linkerrahmen - linkerkleur: linkerkleur leftcolor linkerfarbe - linkerletter: linkerletter leftstyle linkerschrift - linkermarge: linkermarge leftmargin linkerrand - linkermargeafstand: linkermargeafstand leftmargindistance linkerrandabstand - linkeroffset: linkeroffset leftoffset linkeroffset - linkerrand: linkerrand leftedge linkekante - linkerrandafstand: linkerrandafstand leftedgedistance linkerkantenabstand - linkertekst: linkertekst lefttext linkertext - links: links left links - logo: logo logo logo - logos: logos logos logos - lokaal: lokaal local lokal - lokale: lokale local lokal - lokatie: lokatie location position - marge: marge margin marginalie - margeafstand: margeafstand margindistance marginalabstand - margetekst: margetekst margintext marginaltext - markering: markering marking beschriftung - markleur: markleur marcolor beschrfarbe - marletter: marletter marstyle beschrschrift - menu: menu menu menue - methode: methode method methode - midden: midden middle mittig - middentekst: middentekst middletext mittigertext - min: min min min - monster: monster sample muster - na: na after nach - naam: naam name name - nacommando: nacommando commandafter zumbefehl - nboven: nboven ntop noben - niveau: niveau level niveau - niveaus: niveaus levels niveaus - nonder: nonder nbottom nunten - norm: norm norm norm - nregels: nregels nlines zzeile - nummer: nummer number nummer - nummercommando: nummercommando numbercommand nummerbefehl - nummeren: nummeren numbering nummerierung - nummerkleur: nummerkleur numbercolor nummernfarbe - nummerletter: nummerletter numberstyle nummernschrift - nummerscheider: nummerscheider numberseparator nummernseperator - offset: offset offset offset - omvang: omvang size umfang -onbekendeverwijzing: verwijzing unknownreference unbekantereferenz - onder: onder bottom unten - onderafstand: onderafstand bottomdistance abstandunten - onderkader: onderkader bottomframe untenrahmen - onderoffset: onderoffset bottomoffset untenoffset - onderstatus: onderstatus bottomstatus untenstatus - op: op at bei - optie: optie option option - pagina: pagina page seite - paginacommando: paginacommando pagecommand seitenbefehl - paginakleur: paginakleur pagecolor seitenfarbe - paginaletter: paginaletter pagestyle seitenschrift - paginanummer: paginanummer pagenumber seitennummer - paginaovergangen: paginaovergangen pageboundaries seitenbegrenzung - palet: palet palet palette - papier: papier paper papier - plaats: plaats location platz - plaatsafsluiter: plaatsafsluiter placestopper setzetrenner - plaatsen: plaatsen place platziere - plaatskop: plaatskop placehead setzekopf - prefix: prefix prefix prefix - preset: preset preset voreinstellung - preview: preview preview preview - punt: punt period punkt - rand: rand edge kante - randafstand: randafstand edgedistance kantenabstand - raster: raster screen raster - rechter: rechter right rechter - rechterbreedte: rechterbreedte rightwidth rechterbreite - rechterkader: rechterkader rightframe rechterrahmen - rechterkleur: rechterkleur rightcolor rechterfarbe - rechterletter: rechterletter rightstyle rechterschrift - rechtermarge: rechtermarge rightmargin rechterrand -rechtermargeafstand: rechtermargeafstand rightmargindistance rechterrandabstand - rechteroffset: rechteroffset rightoffset rechterabstand - rechterrand: rechterrand rightedge rechtekante - rechterrandafstand: rechterrandafstand rightedgedistance rechterkantenabstand - rechtertekst: rechtertekst righttext rechtertext - rechts: rechts right rechts - reductie: reductie reduction reduktion % -- - refereren: refereren referencing referieren - regel: regel line zeile - regelcorrectie: regelcorrectie linecorrection zeilekorrektur - regels: regels lines zeilen - resolutie: resolutie resolution aufloesung - rotatie: rotatie rotation rotation - rugoffset: rugoffset backoffset rumpfabstand - rugwit: rugwit backspace rumpfspatium - schaal: schaal scale format - scheider: scheider separator seperator - scope: scope scope bereich - sectie: sectie section abschnitt - sectienummer: sectienummer sectionnumber abschnittsnummer - soort: soort family familie - spatie: spatie space spatium - spatiering: spatiering spacing spatiumausgleich - stap: stap step schritt - start: start start start - status: status state status - stop: stop stop stop - straal: straal radius radius - sub: sub sub unter - symbool: symbool symbol symbol - symkleur: symkleur symcolor symfarbe - symletter: symletter symstyle symschrift - synoniem: synoniem synonym synonym - synoniemkleur: synoniemkleur synonymcolor synonymfarbe - synoniemletter: synoniemletter synonymstyle synonymschrift - tab: tab tab tab - teken: teken sign zeichen - tekst: tekst text text - tekstcommando: tekstcommando textcommand textbefehl - tekstformaat: tekstformaat textsize textgroesse - tekstkleur: tekstkleur textcolor textfarbe - tekstletter: tekstletter textstyle textschrift - tekstscheider: tekstscheider textseparator textseparator - tekststatus: tekststatus textstatus textstatus - subtitel: subtitel subtitle untertitel - titel: titel title titel - titeluitlijnen: titeluitlijnen aligntitle titelausrichten - tolerantie: tolerantie tolerance toleranz - tussen: tussen inbetween zwischen - type: type type typ - uitlijnen: uitlijnen align ausrichtung - van: van from von - variant: variant alternative alternative - verhoog: verhoog increment erhoehen - verhoognummer: verhoognummer incrementnumber nummererhoehen - verwijzing: verwijzing reference referenz - voet: voet footer fusszeile - voetafstand: voetafstand footerdistance fusszeilenabstand - voetstatus: voetstatus footerstatus fusszeilenstatus - voffset: voffset voffset voffset - volgende: volgende next folgende - voor: voor before vor - voorcommando: voorcommando commandbefore vorigerbefehl - vorige: vorige previous vorige - vorigenummer: vorigenummer previousnumber vorigenummer - wijze: wijze way art - wit: wit white weiss - xmax: xmax xmax xmax - xschaal: xschaal xscale xformat - xoffset: xoffset xoffset xoffset - xstap: xstap xstep xschritt - xfactor: xfactor xfactor xfaktor - ymax: ymax ymax ymax - yschaal: yschaal yscale yformat - yoffset: yoffset yoffset yoffset - ystap: ystap ystep yschritt - yfactor: yfactor yfactor yfaktor - zij: zij side objektabstand - zelfdepagina: zelfdepagina samepage selbeseite - -\stopconstants - -%D \stopcompressdefinitions - -%D The keywords of values are very language specific and -%D therefore variables for the systems. This list shows soem -%D overlap with the previous one. - -%D \startcompressdefinitions - -\startvariables dutch english german - - aan: aan on an - aanelkaar: aanelkaar serried kleinerabstand - aansluitend: aansluitend joinedup keinabstand - absoluut: absoluut absolute absolut - achteruit: achteruit backward backward % TOBIAS - actie: actie action aktion % TOBIAS - afsluiter: afsluiter stopper trenner - achtergrond: achtergrond background hintergrund - alles: alles all alles - altijd: altijd always immer - beide: beide both beide - binnen: binnen inner innen - blanko: blanko blank blanko - blokkeer: blokkeer disable sperren - boven: boven top oben - breed: breed wide breit - breedte: breedte width breite - buiten: buiten outer aussen - Cijfers: Cijfers Numbers Ziffern - cijfers: cijfers numbers ziffern - commandos: commandos commands befehle - commando: commando command befehl - concept: concept concept konzept - dag: dag day tag - datum: datum date datum - diepte: diepte depth tiefe - definitief: definitief final endfassung - dubbelzijdig: dubbelzijdig doublesided doppelseitig - eerste: eerste first erste - elk: elk each jede - enkelzijdig: enkelzijdig singlesided einzelseitig - even: even even gerade - extern: extern external extern - file: file file datei - flexibel: flexibel flexible flexibel - forceer: forceer force zwinge - gebruikt: gebruikt used verwende - geen: geen none kein - geenmarkering: geenmarkering nomarking keinebeschriftung - geenwit: geenwit nowhite keinweiss - globaal: globaal global global - grid: grid grid grid % TOBIAS - groot: groot big gross - grotevoorkeur: grotevoorkeur bigpreference grosszuegig - handhaaf: handhaaf keep behalte - herstel: herstel fix stellewiederher - herhaal: herhaal repeat wiederholen - hier: hier here hier - hoofd: hoofd header kopfzeile - hoog: hoog high hoch - hoogte: hoogte height hoehe - horizontaal: horizontaal horizontal horizontal - inlinker: inlinker inleft imlinken - inmarge: inmarge inmargin imrand - inrechter: inrechter inright imrechten - intekst: intekst intext imtext - autointro: autointro autointro autointro - intro: intro intro intro - ja: ja yes ja - jaar: jaar year jahr - kader: kader frame rahmen - kantlijn: kantlijn marginedge marginal - kap: kap cap kap - kapitaal: kapitaal capital grossbuchstabe - kenmerk: kenmerk referral merkmal - klein: klein small klein - kleinnormaal: kleinnormaal smallnormal kleinnormal - kleinschuin: kleinschuin smallslanted kleingeneigt - kleinschuinvet: kleinschuinvet smallslantedbold kleingeneigtfett - kleintype: kleintype smalltype kleintippen - kleinvet: kleinvet smallbold kleinfett - kleinvetschuin: kleinvetschuin smallboldslanted kleinfettgeneigt - kleur: kleur color farbe - kolommen: kolommen columns spalten - kop: kop head kopf - label: label label label - laag: laag low tief - laatste: laatste last letzte - lang: lang tall lang - leeg: leeg empty leer - Letter: Letter Character Buchstabe - letter: letter character buchstabe - Letters: Letters Characters Buchstaben - letters: letters characters buchstaben - liggend: liggend landscape landscape % - TOBIAS - lijn: lijn line linie - linker: linker left linker - linkermarge: linkermarge leftmargin linkerrand - linkerrand: linkerrand leftedge linkekante - linkerpagina: linkerpagina leftpage linkerseite - links: links left links - lokaal: lokaal local lokal - maand: maand month monat - MAAND: MAAND MONTH MONAT - mar: mar mar mar - marge: marge margin marginalie - max: max max max - mediaeval: mediaeval mediaeval mittelalterlich - middel: middel medium mittel - midden: midden middle mittig - naam: naam name name - naast: naast opposite gegenueber - nee: nee no nein - negatief: negatief negative negativ % - TOBIAS - niet: niet not nicht - nooit: nooit never nie - normaal: normaal normal normal - nummer: nummer number nummer - offset: offset offset offset - onbekend: onbekend unknown unbekannt - onder: onder bottom unten - oneven: oneven odd ungerade - opelkaar: opelkaar packed kleinerdurchschuss - opmaak: opmaak markup umbruch - opmarge: opmarge atmargin amrand - overlay: overlay overlay overlay - pagina: pagina page seite - paginanummer: paginanummer pagenumber seitennummer - papier: papier paper papier % - TOBIAS - passend: passend fit passend - per: per by pro - postscript: postscript postscript postscript - programma: programma program programm - punt: punt dot punkt - rand: rand edge kante - raster: raster screen raster - recht: recht right rechts - rechter: rechter right rechter - rechtermarge: rechtermarge rightmargin rechterrand - rechterrand: rechterrand rechterrand rechterkante - rechterpagina: rechterpagina rightpage rechterseite - rechts: rechts right rechts - regel: regel line zeile - relatief: relatief relative relativ - reset: reset reset zuruecksetzten - willekeurig: willekeurig random random % - TOBIAS - Romeins: Romeins Romannumerals Roemischezahlen - romeins: romeins romannumerals roemischezahlen - rond: rond round rund - roteer: roteer rotate drehe - ruim: ruim broad breit - scherm: papier screen bildschirm % - TOBIAS - schuin: schuin slanted geneigt - schuinvet: schuinvet slantedbold geneigtfett - sectienummer: sectienummer sectionnumber abschnittsnummer - smal: smal tall schmall - soepel: soepel tolerant tolerant - gespiegeld: gespiegeld mirrored mirrored % - TOBIAS - geroteerd: geroteerd rotated rotated % - TOBIAS - standaard: standaard standard standard - start: start start start - stop: stop stop stop - streng: streng strict streng - sub: sub sub sub - sym: sym sym sym - its: its its its - symbool: symbool symbol symbol - tekst: tekst text text - terug: terug backward rueckwaerts - test: test test test - type: type type tippen - uit: uit off aus - URL: URL URL URL - vast: vast fixed fest - verder: verder continue fortsetzten - vertikaal: vertikaal vertical vertikal - vet: vet bold fett - vetschuin: vetschuin boldslanted fettgeneigt - viertal: viertal quadruple viertel - voet: voet footer fusszeile - volgende: volgende next folgende - vooruit: vooruit forward forward % TOBIAS - voorkeur: voorkeur preference einstellung - voorlopig: voorlopig temporary temporaer - vorige: vorige previous vorig - week: week week woche - weekdag: weekdag weekday wochentag - WEEKDAG: WEEKDAG WEEKDAY WOCHENTAG - waarde: waarde value wert - wit: wit white weiss - zeer: zeer very sehr - zeersoepel: zeersoepel verytolerant sehrtolerant - zeerstreng: zeerstreng verystrict sehrstreng - -\stopvariables - -%D \stopcompressdefinitions - -%D The next setup shows the use of the keyword \type{all}. -%D These constants are the same for all languages. - -%D \startcompressdefinitions - -\startconstants all - - dx: dx - dy: dy - nx: nx - ny: ny - sx: sx - sy: sy - n: n - vfil: vfil - hfil: hfil - strut: strut - reset: reset - set: set - - escape: escape - - apa: apa - -\stopconstants - -%D \stopcompressdefinitions - -%D We need some font family switching names both as constant -%D and as variable. - -%D \startcompressdefinitions - -\startconstants dutch english german - - calligrafie: calligrafie calligraphic kalligraphie - handschrift: handschrift handwritten handschrift - schreefloos: schreefloos sansserif grotesk - romaan: romaan roman antiqua - teletype: teletype teletype fernschreiber - type: type type tippen - -\stopconstants - -\startvariables dutch english german - - calligrafie: calligrafie calligraphic kalligraphie - handschrift: handschrift handwritten handschrift - schreefloos: schreefloos sansserif grotesk - romaan: romaan roman antiqua - teletype: teletype teletype fernschreiber - type: type type tippen - -\stopvariables - -%D \stopcompressdefinitions - -%D All relevent commands of \CONTEXT\ are specified in a -%D structured way that enables the generation of reference -%D cards. This specification is setup in a language independant -%D way. The next category of variables is only used in this -%D context. - -%D \startcompressdefinitions - -\startsetupvariables dutch english german - - doornummering: doornummering enumeration nummerierung - doordefinitie: doordefinitie description beschreibung - doorsprong: doorsprong indentation einzug - doorlabel: doorlabel labeling beschriften - samengesteldelijst: samengesteldelijst combinedlist kombiniereliste - sectie: sectie section abschnitt - register: register register register - synoniem: synoniem synonym synonym - synoniemen: synoniemen synonyms synonyme - sorteer: sorteer sort sortiere - sorteren: sorteren sorts sortieren - naam: naam name name - blok: blok block block - blokken: blokken blocks bloecke - alinea: alinea paragraphs absaetze - framedtext: kadertekst framedtext umrahmtertext - -\stopsetupvariables - -%D \stopcompressdefinitions - -%D The number of elements used for composing user defined -%D commands is rather small. We use a \type{-} for empty -%D elements. - -%D \startcompressdefinitions - -\startelements dutch english german - - beginvan: beginvan begin anfang - eindvan: eindvan end ende - - gekoppelde: gekoppelde coupled verknuepft - in: in - ein - instellingen: instellingen setups setups % - - leeg: leeg empty leer - lege: lege empty leer - laad: laad load laden - lijst: lijst list auflisten - lijstmet: lijstmet listof auflistenvon - opmaak: opmaak makeup umbruch - plaats: plaats place platziere - reserveer: reserveer reserve reservieren - start: start start start - stel: stel setup stelle - stop: stop stop stop - tekst: tekst text text - verhoog: verhoog increment erhoehen - volgende: volgende next folgende - volledige: volledige complete vollende - vorige: vorige previous vorige - zie: zie see sieh - tabelkop: tabelkop tablehead tabellenueberschrift - tabelstaart: tabelstaart tabletail tabellenende - formule: formule formula formel - - uitstellen: uitstellen postponing verschieben - verbergen: verbergen hiding verbergen - -\stopelements - -%D \stopcompressdefinitions - -%D The next set of definitions is used when accessing viewer -%D capabilities. Their foreign nature is reflected by using -%D Capitals. - -%D \startcompressdefinitions - -\startvariables dutch english german - - FirstPage: EerstePagina FirstPage ErsteSeite - PreviousPage: VorigePagina PreviousPage VorigeSeite - NextPage: VolgendePagina NextPage FolgendeSeite - LastPage: LaatstePagina LastPage LetzteSeite - PreviousJump: VorigeSprong PreviousJump VorigerSprung - NextJump: VolgendeSprong NextJump NaechsterSprung - SwapViewer: WisselViewer SwapViewer WechseleViewer - ExitViewer: VerlaatViewer ExitViewer BeendeViewer - CloseDocument: SluitDocument CloseDocument SchliesseDokument - SaveDocument: BewaarDocument SaveDocument SaveDocument % TOBIAS - ViewerHelp: ViewerHelp ViewerHelp ViewerHilfe - PrintDocument: PrintDocument PrintDocument DruckeDokument - SearchDocument: DoorzoekDocument SearchDocument DokumentDurchsuchen - SearchAgain: HerhaalZoeken SearchAgain WeiterSuchen - - StartMovie: StartFilm StartMovie StartMovie - StopMovie: StopFilm StopMovie StopMovie - PauseMovie: PauzeerFilm PauseMovie PauseMovie - ResumeMovie: HervatFilm ResumeMovie ResumeMovie - - ResetForm: ResetFormulier ResetForm ResetForm % TOBIAS - SubmitForm: VerzendFormulier SubmitForm SubmitForm % TOBIAS - -\stopvariables - -%D \stopcompressdefinitions - -%D Last we define some constants and variables that are used -%D in the \PRAGMA\ extensions of \CONTEXT. - -%D \startcompressdefinitions - -\startconstants all - bet: bet - dat: dat - ken: ken - ref: ref -\stopconstants - -\startvariables all - formeel: formeel - informeel: informeel - rekening: rekening - sticker: sticker - sheet: sheet - brief: brief - ls: ls - avery: avery -\stopvariables - -%D \stopcompressdefinitions - -\endinput +
+%D \module
+%D [ file=mult-con,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Constants,
+%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.
+
+%D In this rather large definition file we are going to tell
+%D \CONTEXT\ which constants, variables and elements we use.
+
+\writestatus{loading}{Context Multilingual Macros / Constants}
+
+%D First come some variables. These are used as keywords and
+%D therefore need a different treatment.
+
+%D \startcompressdefinitions
+
+\startvariables dutch english german
+
+ een: een one eins
+ twee: twee two zwei
+ drie: drie three drei
+ vier: vier four vier
+ vijf: vijf five fuenf
+
+\stopvariables
+
+%D \stopcompressdefinitions
+
+%D Of course we need the names of the months.
+
+%D \startcompressdefinitions
+
+\startvariables dutch english german
+
+ sunday: zondag sunday sonntag
+ monday: maandag monday montag
+ tuesday: dinsdag tuesday dienstag
+ wednesday: woensdag wednesday mittwoch
+ thursday: donderdag thursday donnerstag
+ friday: vrijdag friday freitag
+ saturday: zaterdag saturday samstag
+
+\stopvariables
+
+\startvariables dutch english german
+
+ january: januari January Januar
+ february: februari February Februar
+ march: maart March Maerz
+ april: april April April
+ may: mei May Mai
+ june: juni June Juni
+ july: juli July Juli
+ august: augustus August August
+ september: september September September
+ october: oktober October Oktober
+ november: november November November
+ december: december December Dezember
+
+\stopvariables
+
+%D Next we introduce some general label bound variables:
+
+\startvariables dutch english german
+
+ oppagina: oppagina atpage oppagina % TOBIAS/SEBASTIAN
+ hierboven: hierboven hencefore hierboven % TOBIAS/SEBASTIAN
+ hieronder: hieronder hereafter hieronder % TOBIAS/SEBASTIAN
+
+\stopvariables
+
+%D \stopcompressdefinitions
+
+%D User defined commands are language specific, so we have to
+%D use variable when defining them. First we define some
+%D general structuring variables:
+
+%D \startcompressdefinitions
+
+\startvariables dutch english german
+
+ sectie: sectie section abschnitt
+
+ deel: deel part teil
+ hoofdstuk: hoofdstuk chapter kapitel
+ onderwerp: onderwerp subject thema
+ paragraaf: paragraaf section absatz
+ titel: titel title titel
+
+ inhoud: inhoud content inhalt
+ inhouden: inhouden contents inhalte
+
+ bijlage: bijlage appendix anhang
+ bijlagen: bijlagen appendices anhaenge
+ hoofdtekst: hoofdtekst bodypart haupttext
+ hoofdteksten: hoofdteksten bodymatter haupttexte
+ inleiding: inleiding frontpart einleitung
+ inleidingen: inleidingen frontmatter einleitungen
+ uitleiding: uitleiding backpart epilog
+ uitleidingen: uitleidingen backmatter epiloge
+
+ voetnoot: voetnoot footnote fussnote
+
+ systeem: systeem system systeme
+
+\stopvariables
+
+\startvariables dutch english german
+
+ typen: typen typing tippen
+ file: file file datei
+
+\stopvariables
+
+%D \stopcompressdefinitions
+
+%D As we can see below, there are some more variables needed,
+%D for instance for the definition of macro's for handling
+%D floating bodies.
+
+%D \startcompressdefinitions
+
+\startvariables dutch english german
+
+ formule: formule formula formel
+ formules: formules formulae formeln
+
+ figuur: figuur figure abbildung
+ figuren: figuren figures abbildungen
+ tabel: tabel table tabelle
+ tabellen: tabellen tables tabellen
+ grafiek: grafiek graphic grafik
+ grafieken: grafieken graphics grafiken
+ intermezzo: intermezzo intermezzo intermezzo
+ intermezzos: intermezzos intermezzi intermezzi
+
+ index: index index index
+ indices: indices indices indizies
+
+ afkorting: afkorting abbreviation abkuerzung
+ afkortingen: afkortingen abbreviations abkuerzungen
+ logo: logo logo logo
+ logos: logos logos logos
+ eenheid: eenheid unit einheit
+ eenheden: eenheden units einheiten
+
+ regel: regel line zeile
+ regels: regels lines zeilen
+
+ framedtext: kadertekst framedtext umrahmtertext
+
+\stopvariables
+
+%D \stopcompressdefinitions
+
+%D The setup commands can take a lot of different arguments,
+%D often in the form \type{variable=value}. Here we define the
+%D variable part. Keep in mind that for the system, user defined
+%D variables have a constant character.
+
+%D \startcompressdefinitions
+
+\startconstants dutch english german
+
+ leftquotation: linkercitaat leftquotation linkerzitat
+ rightquotation: rechtercitaat rightquotation rechterzitat
+ leftquote: linkerciteer leftquote linkerzitieren
+ rightquote: rechterciteer rightquote rechterzitieren
+ leftsentence: linkerzin leftsentence linkersatz
+ rightsentence: rechterzin rightsentence rechtersatz
+ leftsubsentence: linkersubzin leftsubsentence linkersubsatz
+ rightsubsentence: rechtersubzin rightsubsentence rechtersubsatz
+
+ datum: datum date datum
+
+ aan: aan to zu
+ aanduiding: aanduiding indicator indikator
+ achtergrond: achtergrond background hintergrund
+ achtergronddiepte: achtergronddiepte backgrounddepth hintergrundtiefe
+ achtergrondhoek: achtergrondhoek backgroundcorner hintergrundwinkel
+ achtergrondkleur: achtergrondkleur backgroundcolor hintergrundfarbe
+ achtergrondoffset: achtergrondoffset backgroundoffset hintergrundoffset
+ achtergrondraster: achtergrondraster backgroundscreen hintergrundraster
+ achtergrondstraal: achtergrondstraal backgroundradius hintergrundradius
+ adres: adres address adresse
+ afmeting: afmeting size abmessung
+ afsluiter: afsluiter stopper abschnitttrenner
+ afstand: afstand distance abstand
+ assenstelsel: assenstelsel axis achsen
+ auteur: auteur author autor
+ balanceren: balanceren balance ausgleichen
+ bfactor: bfactor wfactor bfaktor
+ binnen: binnen inner innen
+ bladzijde: bladzijde page seite
+ blanko: blanko blank blanko
+ blokkade: blokkade obstruction gesperrt
+ blokwijze: blokwijze blockway blockauf
+ boven: boven top oben
+ bovenafstand: bovenafstand topdistance obenabstand
+ bovenkader: bovenkader topframe obenrahmen
+ bovenoffset: bovenoffset topoffset obenoffset
+ bovenstatus: bovenstatus topstatus statusoben
+ breedte: breedte width breite
+ bron: bron source quelle
+ commando: commando command befehl
+ commandos: commandos commands befehle
+ contrastkleur: contrastkleur contrastcolor kontrastfarbe
+ conversie: conversie conversion konversion
+ criterium: criterium criterium kriterium
+ datum: datum date datum
+ default: default default norm
+ diepte: diepte depth tiefe
+ dieptecorrectie: dieptecorrectie depthcorrection tiefekorrektur
+ dikte: dikte thickness dicke
+ doorgaan: doorgaan continue fortsetzen
+ dubbelzijdig: dubbelzijdig doublesided doppelseitig
+ dummy: dummy dummy dummy
+ eenheid: eenheid unit einheit
+ eigennummer: eigennummer ownnumber eigenenummer
+ evenmarge: evenmarge evenmargin geraderand
+ expansie: expansie expansion expansion
+ factor: factor factor faktor
+ file: file file datei
+ formaat: formaat size groesse
+ gebied: gebied directory verzeichnis
+ grid: grid grid grid % TOBIAS
+ groot: groot big gross
+ haal: haal get hole
+ hang: hang hang haengend
+ hfactor: hfactor hfactor hfaktor
+ hoek: hoek corner winkel
+ hoffset: hoffset hoffset hoffset
+ hokjes: hokjes frames umrahmen
+ hoofd: hoofd header kopfzeile
+ hoofdafstand: hoofdafstand headerdistance kopfzeilenabstand
+ hoofdstatus: hoofdstatus headerstatus kopfzeilenstatus
+ hoogte: hoogte height hoehe
+ huidige: huidige current aktuell
+ in: in in in
+ inspringen: inspringen indenting einziehen
+ interactie: interactie interaction interaktion
+ interlinie: interlinie interlinespace zeilenabstande
+ items: items items posten
+ kader: kader frame rahmen
+ kaderdiepte: kaderdiepte framedepth rahmentiefe
+ kaderhoek: kaderhoek framecorner rahmenwinkel
+ kaderkleur: kaderkleur framecolor rahmenfarbe
+ kaderoffset: kaderoffset frameoffset rahmenoffset
+ kaderstraal: kaderstraal frameradius rahmenradius
+ kantlijn: kantlijn marginedge marginal
+ kantlijntekst: kantlijntekst marginedgetext marginaltext
+ klein: klein small klein
+ kleur: kleur color farbe
+ kolom: kolom column spalte
+ kolomafstand: kolom columndistance spaltenabstand
+ kopkleur: kopkleur headcolor kopffarbe
+ kopletter: kopletter headstyle kopfschrift
+ kopna: kopna afterhead nachkopf
+ kopoffset: kopoffset topoffset kopfoffset
+ koppeling: koppeling coupling verknuepfung
+ kopvoor: kopvoor beforehead vorkopf
+ kopwit: kopwit topspace kopfspatium
+ korps: korps bodyfont fliesstext
+ label: label label label
+ leeg: leeg empty leer
+ letter: letter style schrift
+ lijn: lijn line linie
+ lijndikte: lijndikte linethickness liniendicke
+ lijnkleur: lijnkleur linecolor linienfarbe
+ lijst: lijst list liste
+ linker: linker left linker
+ linkerbreedte: linkerbreedte leftwidth linkerbreite
+ linkerkader: linkerkader leftframe linkerrahmen
+ linkerkleur: linkerkleur leftcolor linkerfarbe
+ linkerletter: linkerletter leftstyle linkerschrift
+ linkermarge: linkermarge leftmargin linkerrand
+ linkermargeafstand: linkermargeafstand leftmargindistance linkerrandabstand
+ linkeroffset: linkeroffset leftoffset linkeroffset
+ linkerrand: linkerrand leftedge linkekante
+ linkerrandafstand: linkerrandafstand leftedgedistance linkerkantenabstand
+ linkertekst: linkertekst lefttext linkertext
+ links: links left links
+ logo: logo logo logo
+ logos: logos logos logos
+ lokaal: lokaal local lokal
+ lokale: lokale local lokal
+ lokatie: lokatie location position
+ marge: marge margin marginalie
+ margeafstand: margeafstand margindistance marginalabstand
+ margetekst: margetekst margintext marginaltext
+ markering: markering marking beschriftung
+ markleur: markleur marcolor beschrfarbe
+ marletter: marletter marstyle beschrschrift
+ menu: menu menu menue
+ methode: methode method methode
+ midden: midden middle mittig
+ middentekst: middentekst middletext mittigertext
+ min: min min min
+ monster: monster sample muster
+ na: na after nach
+ naam: naam name name
+ nacommando: nacommando commandafter zumbefehl
+ nboven: nboven ntop noben
+ niveau: niveau level niveau
+ niveaus: niveaus levels niveaus
+ nonder: nonder nbottom nunten
+ norm: norm norm norm
+ nregels: nregels nlines zzeile
+ nummer: nummer number nummer
+ nummercommando: nummercommando numbercommand nummerbefehl
+ nummeren: nummeren numbering nummerierung
+ nummerkleur: nummerkleur numbercolor nummernfarbe
+ nummerletter: nummerletter numberstyle nummernschrift
+ nummerscheider: nummerscheider numberseparator nummernseperator
+ offset: offset offset offset
+ omvang: omvang size umfang
+ onder: onder bottom unten
+ onderafstand: onderafstand bottomdistance abstandunten
+ onderkader: onderkader bottomframe untenrahmen
+ onderoffset: onderoffset bottomoffset untenoffset
+ onderstatus: onderstatus bottomstatus untenstatus
+ onevenmarge: onevenmarge oddmargin ungeraderand
+ op: op at bei
+ optie: optie option option
+ pagina: pagina page seite
+ paginacommando: paginacommando pagecommand seitenbefehl
+ paginakleur: paginakleur pagecolor seitenfarbe
+ paginaletter: paginaletter pagestyle seitenschrift
+ paginanummer: paginanummer pagenumber seitennummer
+ paginaovergangen: paginaovergangen pageboundaries seitenbegrenzung
+ palet: palet palet palette
+ papier: papier paper papier
+ plaats: plaats location platz
+ plaatsafsluiter: plaatsafsluiter placestopper setzetrenner
+ plaatsen: plaatsen place platziere
+ plaatskop: plaatskop placehead setzekopf
+ prefix: prefix prefix prefix
+ preset: preset preset voreinstellung
+ preview: preview preview preview
+ punt: punt period punkt
+ rand: rand edge kante
+ randafstand: randafstand edgedistance kantenabstand
+ raster: raster screen raster
+ rechter: rechter right rechter
+ rechterbreedte: rechterbreedte rightwidth rechterbreite
+ rechterkader: rechterkader rightframe rechterrahmen
+ rechterkleur: rechterkleur rightcolor rechterfarbe
+ rechterletter: rechterletter rightstyle rechterschrift
+ rechtermarge: rechtermarge rightmargin rechterrand
+rechtermargeafstand: rechtermargeafstand rightmargindistance rechterrandabstand
+ rechteroffset: rechteroffset rightoffset rechterabstand
+ rechterrand: rechterrand rightedge rechtekante
+ rechterrandafstand: rechterrandafstand rightedgedistance rechterkantenabstand
+ rechtertekst: rechtertekst righttext rechtertext
+ rechts: rechts right rechts
+ reductie: reductie reduction reduktion % --
+ refereren: refereren referencing referieren
+ regel: regel line zeile
+ regelcorrectie: regelcorrectie linecorrection zeilekorrektur
+ regels: regels lines zeilen
+ resolutie: resolutie resolution aufloesung
+ rotatie: rotatie rotation rotation
+ rugoffset: rugoffset backoffset rumpfabstand
+ rugwit: rugwit backspace rumpfspatium
+ schaal: schaal scale format
+ scheider: scheider separator seperator
+ scope: scope scope bereich
+ sectie: sectie section abschnitt
+ sectienummer: sectienummer sectionnumber abschnittsnummer
+ soort: soort family familie
+ spatie: spatie space spatium
+ spatiering: spatiering spacing spatiumausgleich
+ springvolgendein: springvolgendein indentnext ziehefolgendeein % TOBIAS
+ stap: stap step schritt
+ start: start start start
+ status: status state status
+ stop: stop stop stop
+ straal: straal radius radius
+ sub: sub sub unter
+ subtitel: subtitel subtitle untertitel
+ symbool: symbool symbol symbol
+ symkleur: symkleur symcolor symfarbe
+ symletter: symletter symstyle symschrift
+ synoniem: synoniem synonym synonym
+ synoniemkleur: synoniemkleur synonymcolor synonymfarbe
+ synoniemletter: synoniemletter synonymstyle synonymschrift
+ tab: tab tab tab
+ teken: teken sign zeichen
+ tekst: tekst text text
+ tekstcommando: tekstcommando textcommand textbefehl
+ tekstformaat: tekstformaat textsize textgroesse
+ tekstkleur: tekstkleur textcolor textfarbe
+ tekstletter: tekstletter textstyle textschrift
+ tekstscheider: tekstscheider textseparator textseparator
+ tekststatus: tekststatus textstatus textstatus
+ titel: titel title titel
+ titeluitlijnen: titeluitlijnen aligntitle titelausrichten
+ tolerantie: tolerantie tolerance toleranz
+ tussen: tussen inbetween zwischen
+ type: type type typ
+ uitlijnen: uitlijnen align ausrichtung
+ van: van from von
+ variant: variant alternative alternative
+ verhoog: verhoog increment erhoehen
+ verhoognummer: verhoognummer incrementnumber nummererhoehen
+ verwijzing: verwijzing reference referenz
+onbekendeverwijzing: verwijzing unknownreference unbekantereferenz
+ voet: voet footer fusszeile
+ voetafstand: voetafstand footerdistance fusszeilenabstand
+ voetstatus: voetstatus footerstatus fusszeilenstatus
+ voffset: voffset voffset voffset
+ volgende: volgende next folgende
+ voor: voor before vor
+ voorcommando: voorcommando commandbefore vorigerbefehl
+ vorige: vorige previous vorige
+ vorigenummer: vorigenummer previousnumber vorigenummer
+ wijze: wijze way art
+ wit: wit white weiss
+ xfactor: xfactor xfactor xfaktor
+ xmax: xmax xmax xmax
+ xoffset: xoffset xoffset xoffset
+ xschaal: xschaal xscale xformat
+ xstap: xstap xstep xschritt
+ yfactor: yfactor yfactor yfaktor
+ ymax: ymax ymax ymax
+ yoffset: yoffset yoffset yoffset
+ yschaal: yschaal yscale yformat
+ ystap: ystap ystep yschritt
+ zelfdepagina: zelfdepagina samepage selbeseite
+ zij: zij side objektabstand
+
+\stopconstants
+
+%D \stopcompressdefinitions
+
+%D The keywords of values are very language specific and
+%D therefore variables for the systems. This list shows soem
+%D overlap with the previous one.
+
+%D \startcompressdefinitions
+
+\startvariables dutch english german
+
+ aan: aan on an
+ aanelkaar: aanelkaar serried kleinerabstand
+ aansluitend: aansluitend joinedup keinabstand
+ absoluut: absoluut absolute absolut
+ achtergrond: achtergrond background hintergrund
+ achteruit: achteruit backward backward % TOBIAS
+ actie: actie action aktion % TOBIAS
+ afsluiter: afsluiter stopper trenner
+ alles: alles all alles
+ altijd: altijd always immer
+ autointro: autointro autointro autointro
+ beide: beide both beide
+ binnen: binnen inner innen
+ blanko: blanko blank blanko
+ blokkeer: blokkeer disable sperren
+ boven: boven top oben
+ breed: breed wide breit
+ breedte: breedte width breite
+ buiten: buiten outer aussen
+ cijfers: cijfers numbers ziffern
+ Cijfers: Cijfers Numbers Ziffern
+ commando: commando command befehl
+ commandos: commandos commands befehle
+ concept: concept concept konzept
+ dag: dag day tag
+ datum: datum date datum
+ definitief: definitief final endfassung
+ diepte: diepte depth tiefe
+ dubbelzijdig: dubbelzijdig doublesided doppelseitig
+ eerste: eerste first erste
+ elk: elk each jede
+ enkelzijdig: enkelzijdig singlesided einzelseitig
+ even: even even gerade
+ extern: extern external extern
+ file: file file datei
+ flexibel: flexibel flexible flexibel
+ forceer: forceer force zwinge
+ gebruikt: gebruikt used verwende
+ geen: geen none kein
+ geenmarkering: geenmarkering nomarking keinebeschriftung
+ geenwit: geenwit nowhite keinweiss
+ geroteerd: geroteerd rotated rotated % - TOBIAS
+ gespiegeld: gespiegeld mirrored mirrored % - TOBIAS
+ globaal: globaal global global
+ grid: grid grid grid % TOBIAS
+ groot: groot big gross
+ grotevoorkeur: grotevoorkeur bigpreference grosszuegig
+ halveregel: halveregel halfline halbezeile % TOBIAS
+ handhaaf: handhaaf keep behalte
+ hangend: hangend hanging haengend
+ herhaal: herhaal repeat wiederholen
+ herstel: herstel fix stellewiederher
+ hier: hier here hier
+ hoofd: hoofd header kopfzeile
+ hoog: hoog high hoch
+ hoogte: hoogte height hoehe
+ horizontaal: horizontaal horizontal horizontal
+ huidige: huidige current aktuell
+ inlinker: inlinker inleft imlinken
+ inmarge: inmarge inmargin imrand
+ inrechter: inrechter inright imrechten
+ intekst: intekst intext imtext
+ intro: intro intro intro
+ its: its its its
+ ja: ja yes ja
+ jaar: jaar year jahr
+ kader: kader frame rahmen
+ kantlijn: kantlijn marginedge marginal
+ kap: kap cap kap
+ kapitaal: kapitaal capital grossbuchstabe
+ kenmerk: kenmerk referral merkmal
+ klein: klein small klein
+ kleinnormaal: kleinnormaal smallnormal kleinnormal
+ kleinschuin: kleinschuin smallslanted kleingeneigt
+ kleinschuinvet: kleinschuinvet smallslantedbold kleingeneigtfett
+ kleintype: kleintype smalltype kleintippen
+ kleinvet: kleinvet smallbold kleinfett
+ kleinvetschuin: kleinvetschuin smallboldslanted kleinfettgeneigt
+ kleur: kleur color farbe
+ kolommen: kolommen columns spalten
+ kop: kop head kopf
+ laag: laag low tief
+ laatste: laatste last letzte
+ label: label label label
+ lang: lang tall lang
+ leeg: leeg empty leer
+ letter: letter character buchstabe
+ Letter: Letter Character Buchstabe
+ Letters: Letters Characters Buchstaben
+ letters: letters characters buchstaben
+ liggend: liggend landscape landscape % - TOBIAS
+ lijn: lijn line linie
+ linker: linker left linker
+ linkermarge: linkermarge leftmargin linkerrand
+ linkerpagina: linkerpagina leftpage linkerseite
+ linkerrand: linkerrand leftedge linkekante
+ links: links left links
+ lokaal: lokaal local lokal
+ lokale: lokale local lokal
+ MAAND: MAAND MONTH MONAT
+ maand: maand month monat
+ mar: mar mar mar
+ marge: marge margin marginalie
+ max: max max max
+ mediaeval: mediaeval mediaeval mittelalterlich
+ middel: middel medium mittel
+ midden: midden middle mittig
+ naam: naam name name
+ naast: naast opposite gegenueber
+ nee: nee no nein
+ negatief: negatief negative negativ % - TOBIAS
+ niet: niet not nicht
+ nooit: nooit never nie
+ normaal: normaal normal normal
+ nummer: nummer number nummer
+ offset: offset offset offset
+ onbekend: onbekend unknown unbekannt
+ onder: onder bottom unten
+ oneven: oneven odd ungerade
+ opelkaar: opelkaar packed kleinerdurchschuss
+ opmaak: opmaak markup umbruch
+ opmarge: opmarge atmargin amrand
+ overlay: overlay overlay overlay
+ pagina: pagina page seite
+ paginanummer: paginanummer pagenumber seitennummer
+ papier: papier paper papier % - TOBIAS
+ scherm: papier screen bildschirm % - TOBIAS
+ passend: passend fit passend
+ per: per by pro
+ postscript: postscript postscript postscript
+ programma: programma program programm
+ punt: punt dot punkt
+ rand: rand edge kante
+ raster: raster screen raster
+ recht: recht right rechts
+ rechter: rechter right rechter
+ rechtermarge: rechtermarge rightmargin rechterrand
+ rechterpagina: rechterpagina rightpage rechterseite
+ rechterrand: rechterrand rechterrand rechterkante
+ rechts: rechts right rechts
+ regel: regel line zeile
+ relatief: relatief relative relativ
+ reset: reset reset zuruecksetzten
+ Romeins: Romeins Romannumerals Roemischezahlen
+ romeins: romeins romannumerals roemischezahlen
+ rond: rond round rund
+ roteer: roteer rotate drehe
+ ruim: ruim broad breit
+ schuin: schuin slanted geneigt
+ schuinvet: schuinvet slantedbold geneigtfett
+ sectienummer: sectienummer sectionnumber abschnittsnummer
+ smal: smal tall schmall
+ soepel: soepel tolerant tolerant
+ standaard: standaard standard standard
+ start: start start start
+ stop: stop stop stop
+ streng: streng strict streng
+ sub: sub sub sub
+ sym: sym sym sym
+ symbool: symbool symbol symbol
+ tekst: tekst text text
+ terug: terug backward rueckwaerts
+ test: test test test
+ type: type type tippen
+ uit: uit off aus
+ URL: URL URL URL
+ vast: vast fixed fest
+ verder: verder continue fortsetzten
+ vertikaal: vertikaal vertical vertikal
+ vet: vet bold fett
+ vetschuin: vetschuin boldslanted fettgeneigt
+ viertal: viertal quadruple viertel
+ voet: voet footer fusszeile
+ volgende: volgende next folgende
+ voorkeur: voorkeur preference einstellung
+ voorlopig: voorlopig temporary temporaer
+ vooruit: vooruit forward forward % TOBIAS
+ vorige: vorige previous vorig
+ waarde: waarde value wert
+ week: week week woche
+ WEEKDAG: WEEKDAG WEEKDAY WOCHENTAG
+ weekdag: weekdag weekday wochentag
+ willekeurig: willekeurig random random % - TOBIAS
+ wit: wit white weiss
+ zeer: zeer very sehr
+ zeersoepel: zeersoepel verytolerant sehrtolerant
+ zeerstreng: zeerstreng verystrict sehrstreng
+
+\stopvariables
+
+%D \stopcompressdefinitions
+
+%D The next setup shows the use of the keyword \type{all}.
+%D These constants are the same for all languages.
+
+%D \startcompressdefinitions
+
+\startconstants all
+
+ dx: dx
+ dy: dy
+ nx: nx
+ ny: ny
+ sx: sx
+ sy: sy
+ n: n
+ vfil: vfil
+ hfil: hfil
+ strut: strut
+ reset: reset
+ set: set
+
+ escape: escape
+
+ apa: apa
+
+\stopconstants
+
+%D \stopcompressdefinitions
+
+%D We need some font family switching names both as constant
+%D and as variable.
+
+%D \startcompressdefinitions
+
+\startconstants dutch english german
+
+ calligrafie: calligrafie calligraphic kalligraphie
+ handschrift: handschrift handwritten handschrift
+ schreefloos: schreefloos sansserif grotesk
+ romaan: romaan roman antiqua
+ teletype: teletype teletype fernschreiber
+ type: type type tippen
+
+\stopconstants
+
+\startvariables dutch english german
+
+ calligrafie: calligrafie calligraphic kalligraphie
+ handschrift: handschrift handwritten handschrift
+ schreefloos: schreefloos sansserif grotesk
+ romaan: romaan roman antiqua
+ teletype: teletype teletype fernschreiber
+ type: type type tippen
+
+\stopvariables
+
+%D \stopcompressdefinitions
+
+%D All relevent commands of \CONTEXT\ are specified in a
+%D structured way that enables the generation of reference
+%D cards. This specification is setup in a language independant
+%D way. The next category of variables is only used in this
+%D context.
+
+%D \startcompressdefinitions
+
+\startsetupvariables dutch english german
+
+ doornummering: doornummering enumeration nummerierung
+ doordefinitie: doordefinitie description beschreibung
+ doorsprong: doorsprong indentation einzug
+ doorlabel: doorlabel labeling beschriften
+ samengesteldelijst: samengesteldelijst combinedlist kombiniereliste
+ sectie: sectie section abschnitt
+ register: register register register
+ synoniem: synoniem synonym synonym
+ synoniemen: synoniemen synonyms synonyme
+ sorteer: sorteer sort sortiere
+ sorteren: sorteren sorts sortieren
+ naam: naam name name
+ blok: blok block block
+ blokken: blokken blocks bloecke
+ alinea: alinea paragraphs absaetze
+ framedtext: kadertekst framedtext umrahmtertext
+
+\stopsetupvariables
+
+%D \stopcompressdefinitions
+
+%D The number of elements used for composing user defined
+%D commands is rather small. We use a \type{-} for empty
+%D elements.
+
+%D \startcompressdefinitions
+
+\startelements dutch english german
+
+ beginvan: beginvan begin anfang
+ eindvan: eindvan end ende
+
+ gekoppelde: gekoppelde coupled verknuepft
+ in: in - ein
+ instellingen: instellingen setups setups % -
+ leeg: leeg empty leer
+ lege: lege empty leer
+ laad: laad load laden
+ lijst: lijst list auflisten
+ lijstmet: lijstmet listof auflistenvon
+ opmaak: opmaak makeup umbruch
+ plaats: plaats place platziere
+ reserveer: reserveer reserve reservieren
+ start: start start start
+ stel: stel setup stelle
+ stop: stop stop stop
+ tekst: tekst text text
+ verhoog: verhoog increment erhoehen
+ volgende: volgende next folgende
+ volledige: volledige complete vollende
+ vorige: vorige previous vorige
+ zie: zie see sieh
+ tabelkop: tabelkop tablehead tabellenueberschrift
+ tabelstaart: tabelstaart tabletail tabellenende
+ formule: formule formula formel
+
+ uitstellen: uitstellen postponing verschieben
+ verbergen: verbergen hiding verbergen
+
+\stopelements
+
+%D \stopcompressdefinitions
+
+%D The next set of definitions is used when accessing viewer
+%D capabilities. Their foreign nature is reflected by using
+%D Capitals.
+
+%D \startcompressdefinitions
+
+\startvariables dutch english german
+
+ FirstPage: EerstePagina FirstPage ErsteSeite
+ PreviousPage: VorigePagina PreviousPage VorigeSeite
+ NextPage: VolgendePagina NextPage FolgendeSeite
+ LastPage: LaatstePagina LastPage LetzteSeite
+ PreviousJump: VorigeSprong PreviousJump VorigerSprung
+ NextJump: VolgendeSprong NextJump NaechsterSprung
+ SwapViewer: WisselViewer SwapViewer WechseleViewer
+ ExitViewer: VerlaatViewer ExitViewer BeendeViewer
+ CloseDocument: SluitDocument CloseDocument SchliesseDokument
+ SaveDocument: BewaarDocument SaveDocument SaveDocument % TOBIAS
+ ViewerHelp: ViewerHelp ViewerHelp ViewerHilfe
+ PrintDocument: PrintDocument PrintDocument DruckeDokument
+ SearchDocument: DoorzoekDocument SearchDocument DokumentDurchsuchen
+ SearchAgain: HerhaalZoeken SearchAgain WeiterSuchen
+
+ StartMovie: StartFilm StartMovie StartMovie
+ StopMovie: StopFilm StopMovie StopMovie
+ PauseMovie: PauzeerFilm PauseMovie PauseMovie
+ ResumeMovie: HervatFilm ResumeMovie ResumeMovie
+
+ ResetForm: ResetFormulier ResetForm ResetForm % TOBIAS
+ SubmitForm: VerzendFormulier SubmitForm SubmitForm % TOBIAS
+
+\stopvariables
+
+%D \stopcompressdefinitions
+
+%D Last we define some constants and variables that are used
+%D in the \PRAGMA\ extensions of \CONTEXT.
+
+%D \startcompressdefinitions
+
+\startconstants all
+ bet: bet
+ dat: dat
+ ken: ken
+ ref: ref
+\stopconstants
+
+\startvariables all
+ formeel: formeel
+ informeel: informeel
+ rekening: rekening
+ sticker: sticker
+ sheet: sheet
+ brief: brief
+ ls: ls
+ avery: avery
+\stopvariables
+
+%D \stopcompressdefinitions
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/mult-ini.tex b/tex/context/base/mult-ini.tex index 511af6b0b..2519fb092 100644 --- a/tex/context/base/mult-ini.tex +++ b/tex/context/base/mult-ini.tex @@ -1,1148 +1,1149 @@ -%D \module -%D [ file=mult-ini, -%D version=1996.06.01, -%D title=\CONTEXT\ Multilingual 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. - -%D This module implements the multi||lingual interface to -%D \CONTEXT. These capabilities concern messages, commands and -%D parameters. - -\writestatus{loading}{Context Multilingual Macros / Initialization} - -\unprotect - -%D \macros -%D [constanten,variabelen,commandos] -%D {v!,c!,s!,e!,m!,l!,r!,f!,p!,x!,y!} -%D {} -%D -%D In the system modules we introduced some prefixed constants, -%D variables (both macros) and registers. Apart from a -%D tremendous saving in terms of memory and a gain in speed we -%D use from now on prefixes when possible for just another -%D reason: consistency and multi||linguality. Systematically -%D using prefixed macros enables us to implement a -%D multi||lingual user interface. Redefining these next set of -%D prefixes therefore can have desastrous results. -%D -%D \startregelcorrectie -%D \starttabel[|c|c|c|] -%D \HL -%D \NC \bf prefix \NC \bf meaning \NC \bf application \NC\SR -%D \HL -%D \NC \type{\v!prefix!} \NC v! \NC variable \NC\FR -%D \NC \type{\c!prefix!} \NC c! \NC constant \NC\MR -%D \NC \type{\s!prefix!} \NC s! \NC system \NC\MR -%D \NC \type{\e!prefix!} \NC e! \NC element \NC\MR -%D \NC \type{\m!prefix!} \NC m! \NC message \NC\MR -%D \NC \type{\l!prefix!} \NC l! \NC language \NC\MR -%D \NC \type{\r!prefix!} \NC r! \NC reference \NC\MR -%D \NC \type{\f!prefix!} \NC f! \NC file \NC\MR -%D \NC \type{\p!prefix!} \NC p! \NC procedure \NC\MR -%D \NC \type{\x!prefix!} \NC x! \NC setup constant \NC\MR -%D \NC \type{\y!prefix!} \NC y! \NC setup variable \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D In the single||lingual version we used \type{!}, \type{!!}, -%D \type{!!!} and \type{!!!!}. - -\def\v!prefix!{v!} \def\c!prefix!{c!} \def\s!prefix!{s!} -\def\e!prefix!{e!} \def\m!prefix!{m!} \def\r!prefix!{r!} -\def\f!prefix!{f!} \def\p!prefix!{p!} \def\x!prefix!{x!} -\def\y!prefix!{y!} \def\l!prefix!{l!} - -%D \macros -%D [constants,variables,commands] -%D {@@,??} -%D {} -%D -%D Variables generated by the system can be recognized on their -%D prefix \type{@@}. They are composed of a command (class) -%D specific tag, which can be recognized on \type{??}, and a -%D system constant, which has the prefix \type{c!}. We'll se -%D some more of this. - -\def\??prefix {??} -\def\@@prefix {@@} - -%D Just to be complete we repeat some of the already defined -%D system constants here. Maybe their prefix \type{\s!} now -%D falls into place. - -\def\s!next {next} \def\s!default {default} -\def\s!dummy {dummy} \def\s!unknown {unknown} - -\def\s!do {do} \def\s!dodo {dodo} - -\def\s!complex {complex} \def\s!start {start} -\def\s!simple {simple} \def\s!stop {stop} - -\def\!!width {width} \def\!!plus {plus} -\def\!!height {height} \def\!!minus {minus} -\def\!!depth {depth} - -%D \macros -%D {defineinterfaceconstant, -%D defineinterfacevariable, -%D defineinterfaceelement, -%D definesystemvariable, -%D definesystemconstant, -%D definemessageconstant, -%D definereferenceconstant, -%D definefileconstant} -%D {} -%D -%D The first part of this module is dedicated to dealing with -%D multi||lingual constants and variables. When \CONTEXT\ grew -%D bigger and bigger in terms of bytes and used string space, -%D we switched to predefined constants. At the cost of more -%D hash table entries, the macros not only becase more compact, -%D they became much faster too. Maybe an even bigger advantage -%D was that mispelling could no longer lead to problems. Even a -%D multi||lingual interface became possible. -%D -%D Constants --- we'll introduce the concept of variables later -%D on --- are preceded by a type specific prefix, followed by a -%D \type{!}. To force consistency, we provide a few commands -%D for defining such constants. -%D -%D \starttypen -%D \defineinterfaceconstant {name} {meaning} -%D \defineinterfacevariable {name} {meaning} -%D \defineinterfaceelement {name} {meaning} -%D \stoptypen -%D -%D Which is the same as: -%D -%D \starttypen -%D \def\c!name{meaning} -%D \def\v!name{meaning} -%D \def\e!name{meaning} -%D \stoptypen - -\def\defineinterfaceconstant #1#2{\setvalue{\c!prefix!#1}{#2}} -\def\defineinterfacevariable #1#2{\setvalue{\v!prefix!#1}{#2}} -\def\defineinterfaceelement #1#2{\setvalue{\e!prefix!#1}{#2}} - -%D Next come some interface independant constants: -%D -%D \starttypen -%D \definereferenceconstant {name} {meaning} -%D \definefileconstant {name} {meaning} -%D \stoptypen - -\def\definereferenceconstant #1#2{\setvalue{\r!prefix!#1}{#2}} -\def\definefileconstant #1#2{\setvalue{\f!prefix!#1}{#2}} - -%D And finaly we have the one argument, space saving constants -%D -%D \starttypen -%D \definesystemconstant {name} -%D \definemessageconstant {name} -%D \stoptypen - -\def\definesystemconstant #1{\setvalue{\s!prefix!#1}{#1}} -\def\definemessageconstant #1{\setvalue{\m!prefix!#1}{#1}} - -%D In a parameter driven system, some parameters are shared -%D by more system components. In \CONTEXT\ we can distinguish -%D parameters by a unique prefix. Such a prefix is defined -%D with: -%D -%D \starttypen -%D \definesystemvariable {name} -%D \stoptypen - -\def\definesystemvariable #1{\setevalue{\??prefix#1}{\@@prefix#1}} - -%D \macros -%D {selectinterface, -%D defaultinterface, currentinterface, currentresponses} -%D {} -%D -%D With \type{\selectinterface} we specify the language we are -%D going to use. The system asks for the language wanted, and -%D defaults to \type{\currentinterface} when we just give -%D \type{enter}. By default the message system uses the -%D current interface language, but \type{\currentresponses} -%D can specify another language too. -%D -%D Because we want to generate formats directly too, we do -%D not ask for interface specifications when these are already -%D defined (like in cont-nl.tex and alike). - -\ifx\defaultinterface\undefined - - \def\defaultinterface{dutch} - - \def\selectinterface% - {\def\docommando##1##2% - {\bgroup - \endlinechar=-1 - \global\read16 to ##1 - \egroup - \doif{\currentinterface}{}{\let##1=##2}% - \doifundefined{\s!prefix!##1}{\let##1=##2}}% - \docommando\currentinterface\defaultinterface - \writestatus{interface}{defining \currentinterface\space interface}% - \writeline - \docommando\currentresponses\currentinterface - \writestatus{interface}{using \currentresponses\space messages}% - \writeline} - -\else - - \def\selectinterface% - {\writestatus{interface}{defining \currentinterface\space interface}% - \writeline - \writestatus{interface}{using \currentresponses\space messages}% - \writeline} - -\fi - -\ifx\currentinterface\undefined \let\currentinterface=\defaultinterface \fi -\ifx\currentresponses\undefined \let\currentresponses=\defaultinterface \fi - -%D \macros -%D {startinterface} -%D {} -%D -%D Sometimes we want to define things only for specific -%D interface languages. This can be done by means of the -%D selector: -%D -%D \starttypen -%D \startinterface language -%D -%D language specific definitions & commands -%D -%D \stopinterface -%D \stoptypen - -%\long\def\startinterface #1 #2\stopinterface% -% {\doifelse{#1}{\currentinterface} -% {\long\def\next{#2}} -% {\let\next=\relax}% -% \next} - -\def\startinterface #1 - {\doifelse{#1}{\currentinterface} - {\let\next=\relax} - {\long\def\next##1\stopinterface{}}% - \next} - -\let\stopinterface=\relax - -%D \macros -%D {startmessages, -%D getmessage, -%D showmessage, -%D makemessage} -%D {} -%D -%D A package as large as \CONTEXT\ can hardly function without -%D a decent message mechanism. Due to its multi||lingual -%D interface, the message subsystem has to be multi||lingual -%D too. A major drawback of this feature is that we have to -%D code messages. As a result, the source becomes less self -%D documented. On the other hand, consistency will improve. -%D -%D Because the overhead in terms of entries in the (already -%D exhausted) hash table has to be minimal, messages are packed -%D in libraries. We can extract a message from such a library -%D in three ways: -%D -%D \starttypen -%D \getmessage {library} {tag} -%D \showmessage {library} {tag} {data} -%D \makemessage {library} {tag} {data} -%D \stoptypen -%D -%D The first command gets the message \type{tag} from the -%D \type{library} specified. The other commands take an extra -%D argument: a list of items to be inserted in the message -%D text. While \type{\showmessage} shows the message at the -%D terminal, the other commands generate the message as text. -%D Before we explain the \type{data} argument, we give an -%D example of a library. -%D -%D \starttypen -%D \startmessages english library: alfa -%D title: something -%D 1: first message -%D 2: second (--) message -- -%D \stopmessages -%D \stoptypen -%D -%D The first message is a simple one and can be shown with: -%D -%D \starttypen -%D \showmessage {alfa} {1} {} -%D \stoptypen -%D -%D The second message on the other hand needs some extra data: -%D -%D \starttypen -%D \showmessage {alfa} {2} {and last,to you} -%D \stoptypen -%D -%D This message is shown as: -%D -%D \starttypen -%D something : second (and last) message to you -%D \stoptypen -%D -%D As we can see, the title entry is shown with the message. -%D The data fields are comma separated and are specified in the -%D message text by \type{--}. -%D -%D It is not required to define all messages in a library at -%D once. We can add messages to a library in the following way: -%D -%D \starttypen -%D \startmessages english library: alfa -%D 10: tenth message -%D \stopmessages -%D \stoptypen -%D -%D Because such definitions can take place in different -%D modules, the system gives a warning when a tag occurs more -%D than once. The first occurrence takes preference over later -%D ones, so we had better use a save offset, as shown in the -%D example. As we can see, the title field is specified only -%D the first time! -%D -%D Because we want to check for duplicate tags, the macros -%D are a bit more complicated than neccessary. The \NEWLINE\ -%D token is used as message separator. - -\def\findinterfacemessage#1#2% - {\def#2{}% - \def\dofindinterfacemessage##1 #1: ##2\relax##3\end% - {\def#2{##2}}% - \edef\!!stringa{\getvalue{@@ms\currentmessagelibrary} #1: \relax}% - \expandafter\dofindinterfacemessage\!!stringa\end} - -\def\composemessagetext#1--#2--#3--#4--#5--#6\\% - {\def\docomposemessagetext##1,##2,##3,##4,##5,##6\\% - {\edef\currentmessagetext{#1##1#2##2#3##3#4##4#5##5}}% - \docomposemessagetext} - -\unexpanded\def\getmessage#1#2% - {\def\currentmessagelibrary{#1}% - \findinterfacemessage{#2}\currentmessagetext - \currentmessagetext} - -\unexpanded\def\makemessage#1#2#3% - {\def\currentmessagelibrary{#1}% - \findinterfacemessage{#2}\currentmessagetext - \@EA\composemessagetext\currentmessagetext----------\\#3,,,,,\\% - \currentmessagetext} - -\def\showmessage#1#2#3% - {\def\currentmessagelibrary{#1}% - \findinterfacemessage{#2}\currentmessagetext - \findinterfacemessage{title}\currentmessagetitle - \doifelse{\currentmessagetext}{} - {\def\currentmessagetext{<unknown message #2>}} - {\@EA\composemessagetext\currentmessagetext----------\\#3,,,,,\\}% - \@EA\writestatus\@EA{\currentmessagetitle}{\currentmessagetext}} - -\def\doaddinterfacemessage#1#2% - {\findinterfacemessage{#1}\currentmessagetext - \doifelse{\currentmessagetext}{} - {\setxvalue{@@ms\currentmessagelibrary}% - {\getvalue{@@ms\currentmessagelibrary} #1: #2\relax}} - {\debuggerinfotrue % we consider this an important error - \debuggerinfo - {message} - {duplicate tag #1 - in library \currentmessagelibrary\space - of interface \currentresponses}}% - \futurelet\next\getinterfacemessage} - -\bgroup -\obeylines -\gdef\addinterfacemessage#1: #2 - {\doaddinterfacemessage{#1}{#2}}% -\egroup - -\def\getinterfacemessage% - {\ifx\next\stopmessages - \def\next##1{\egroup}% - \else - \let\next=\addinterfacemessage - \fi - \next} - -\gdef\startmessages #1 library: #2 - {\bgroup - \obeylines - \doifinsetelse{#1}{\currentresponses,all} - {\def\next% - {\def\currentmessagelibrary{#2}% - \doifundefined{@@ms\currentmessagelibrary} - {\setgvalue{@@ms\currentmessagelibrary}{}}% - \futurelet\next\getinterfacemessage}} - {\long\def\next##1\stopmessages{\egroup}}% - \next} - -%D \macros -%D {ifshowwarnings, ifshowmessages} -%D -%D Sometimes displaying message can slow down processing -%D considerably. We therefore introduce warnings. Users can -%D turn of warnings and messages by saying: -%D -%D \starttypen -%D \showwarningstrue -%D \showmessagestrue -%D \stoptypen -%D -%D Turning off messages also turns off warnings, which is -%D quote logical because they are less important. - -\newif\ifshowwarnings \showwarningstrue -\newif\ifshowmessages \showmessagestrue - -\let\normalshowmessage=\showmessage - -\def\showwarning% - {\ifshowwarnings - \expandafter\showmessage - \else - \expandafter\gobblethreearguments - \fi} - -\def\showmessage% - {\ifshowmessages - \expandafter\normalshowmessage - \else - \expandafter\gobblethreearguments - \fi} - -%D \macros -%D {dosetvalue,dosetevalue,docopyvalue,doresetvalue, -%D dogetvalue} -%D {} -%D -%D We already defined these auxiliary macros in the system -%D modules. Starting with this module however, we have to take -%D multi||linguality a bit more serious. -%D -%D First we show a well||defined alternative: -%D -%D \starttypen -%D \def\dosetvalue#1#2#3% -%D {\doifdefinedelse{\c!prefix!#2} -%D {\setvalue{#1\getvalue{\c!prefix!#2}}{#3}} -%D {\setvalue{#1#2}{#3}}} -%D -%D \def\docopyvalue#1#2#3% -%D {\doifdefinedelse{\c!prefix!#3} -%D {\setvalue{#1\getvalue{\c!prefix!#3}}% -%D {\getvalue{#2\getvalue{\c!prefix!#3}}}} -%D {\setvalue{#1#3}% -%D {\getvalue{#2#3}}}} -%D -%D \def\dogetvalue#1#2% -%D {\getvalue{#1\getvalue{\c!prefix!#2}}} -%D \stoptypen -%D -%D These macros are called upon quite often and so we optimized -%D them a bit. - -\def\dosetvalue#1#2#3% - {\p!doifundefined{\c!prefix!#2}% - \let\donottest=\doprocesstest - \@EA\def\csname#1#2\endcsname{#3}% - \else - \let\donottest=\doprocesstest - \@EA\def\csname#1\csname\c!prefix!#2\endcsname\endcsname{#3}% - \fi} - -\def\dosetevalue#1#2#3% - {\p!doifundefined{\c!prefix!#2}% - \let\donottest=\doprocesstest - \@EA\edef\csname#1#2\endcsname{#3}% - \else - \let\donottest=\doprocesstest - \@EA\edef\csname#1\csname\c!prefix!#2\endcsname\endcsname{#3}% - \fi} - -\def\docopyvalue#1#2#3% - {\p!doifundefined{\c!prefix!#3}% - \let\donottest=\doprocesstest - \@EA\def\csname#1#3\endcsname% - {\csname#2#3\endcsname}% - \else - \let\donottest=\doprocesstest - \@EA\def\csname#1\csname\c!prefix!#3\endcsname\endcsname% - {\csname#2\csname\c!prefix!#3\endcsname\endcsname}% - \fi} - -\def\doresetvalue#1#2% - {\dosetvalue{#1}{#2}{}} - -\def\dogetvalue#1#2% - {\csname#1\csname\c!prefix!#2\endcsname\endcsname} - -%D Although maybe bot clearly visible, there is a -%D considerable profit in further optimalization. By expanding -%D the embedded \type{\csname} we can reduce the format file -%D by about 5\% (60~KB out of 1.9~MB). - -\def\docopyvalue#1#2#3% - {\p!doifundefined{\c!prefix!#3}% - \let\donottest=\doprocesstest - \@EA\@EA\@EA\def\@EA\csname\@EA#1\@EA#3\@EA\endcsname - \@EA{\csname#2#3\endcsname}% - \else - \let\donottest=\doprocesstest - \@EA\@EA\@EA\def\@EA - \csname - \@EA#1\@EA\csname\@EA\c!prefix!\@EA#3\@EA\endcsname\@EA - \endcsname - \@EA{\csname#2\csname\c!prefix!#3\endcsname\endcsname}% - \fi} - -%D We take this opportunity of redefining to adapt an -%D assignment macro. The change has to do with the fact that the -%D generated error message must be multi||lingual. We can not -%D define the message yet, because we still have to select the -%D interface language. - -%\def\p!doassign#1[#2][#3=#4=#5]% -% {\let\donottest=\dontprocesstest -% \edef\!!stringa{#5}% -% \edef\!!stringb{\relax}% -% \let\donottest=\doprocesstest -% \ifx\!!stringa\!!stringb -% \showmessage{check}{1}{#3,\the\inputlineno}% -% \else -% #1{#2}{#3}{#4}% -% \fi} - -\def\p!doassign#1[#2][#3=#4=#5]% - {\ifx\empty#3\else % and definitely not \ifx#3\empty - \ifx\relax#5% - \showmessage{check}{1}{#3,\the\inputlineno}% - \else - #1{#2}{#3}{#4}% - \fi - \fi} - -\def\dogetargument#1#2#3#4% - {\doifnextcharelse{#1} - {\let\expectedarguments=\noexpectedarguments - #3\dodogetargument} - {\ifnum\expectedarguments>\noexpectedarguments - \showmessage{check}{2}{\the\expectedarguments,\the\inputlineno}% - \fi - \let\expectedarguments=\noexpectedarguments - #4\dodogetargument#1#2}} - -\def\dogetgroupargument#1#2% - {\def\nextnextargument% - {\ifx\nextargument\bgroup - \let\expectedarguments=\noexpectedarguments - \def\nextargument{#1\dodogetargument}% - %\else\ifx\nextargument\lineending % this can be an option - % \def\nextargument{\bgroup\def\\ {\egroup\dogetgroupargument#1#2}\\}% - %\else\ifx\nextargument\blankspace % but may never be default - % \def\nextargument{\bgroup\def\\ {\egroup\dogetgroupargument#1#2}\\}% - \else - \ifnum\expectedarguments>\noexpectedarguments - \showmessage{check}{2}{\the\expectedarguments,\the\inputlineno}% - \fi - \let\expectedarguments=\noexpectedarguments - \def\nextargument{#2\dodogetargument{}}% - \fi%\fi\fi % so let's get rid of it - \nextargument}% - \futurelet\nextargument\nextnextargument} - -\def\checkdefined#1#2#3% - {\doifdefined{#3} - {\showmessage{check}{3}{#2,#3}}} - -%D \CONTEXT\ is a parameter driven package. This means that -%D users instruct the system by means of variables, values and -%D keywords. These instructions take the form: -%D -%D \starttypen -%D \setupsomething[some variable=some value, another one=a keyword] -%D \stoptypen -%D -%D or by keyword only: -%D -%D \starttypen -%D \dosomething[this way, that way, no way] -%D \stoptypen -%D -%D Because the same variables can occur in more than one setup -%D command, we have to be able to distinguish them. This is -%D achieved by assigning them a unique prefix. -%D -%D Imagine a setup command for boxed text, that enables us to -%D specify the height and width of the box. Behide the scenes -%D the command -%D -%D \starttypen -%D \setupbox [width=12cm, height=3cm] -%D \stoptypen -%D -%D results in something like -%D -%D \starttypen -%D \<box><width> {12cm} -%D \<box><height> {3cm} -%D \stoptypen -%D -%D while a similar command for specifying the page dimensions -%D of an \kap{A4} page results in: -%D -%D \starttypen -%D \<page><width> {21.0cm} -%D \<page><height> {27.9cm} -%D \stoptypen -%D -%D The prefixes \type{<box>} and \type{<page>} are hidden from -%D users and can therefore be language independant. Variables -%D on the other hand, differ for each language: -%D -%D \starttypen -%D \<box><color> {<blue>} -%D \<box><kleur> {<blauw>} -%D \<box><couleur> {<blue>} -%D \stoptypen -%D -%D In this example we can see that the assigned values or -%D keywords are language dependant too. This will be a -%D complication when defining multi||lingual setup files. -%D -%D A third phenomena is that variables and values can have a -%D similar meaning. -%D -%D \starttypen -%D \<pagenumber><location> {<left>} -%D \<skip><left> {12cm} -%D \stoptypen -%D -%D A (minor) complication is that where in english we use -%D \type{<left>}, in dutch we find both \type{<links>} and -%D \type{<linker>}. This means that when we use some sort of -%D translation table, we have to distinguish between the -%D variables at the left side and the fixed values at the -%D right. -%D -%D The same goes for commands that are composed of different -%D user supplied and/or language specific elements. In english -%D we can use: -%D -%D \starttypen -%D \<empty><figure> -%D \<empty><intermezzo> -%D \stoptypen -%D -%D But in dutch we have the following: -%D -%D \starttypen -%D \<lege><figuur> -%D \<leeg><intermezzo> -%D \stoptypen -%D -%D These subtle differences automatically lead to a solution -%D where variables, values, elements and other components have -%D a similar logical name (used in macro's) but a different -%D meaning (supplied by the user). -%D -%D Our solution is one in which the whole system is programmed -%D in terms of identifiers with language specific meanings. In -%D such an implementation, each fixed variable is available as: -%D -%D \starttypen -%D \<prefix><variable> -%D \stoptypen -%D -%D This means that for instance: -%D -%D \starttypen -%D \setupbox[width=12cm] -%D \stoptypen -%D -%D expands to something like: -%D -%D \starttypen -%D \def\boxwidth{12cm} -%D \stoptypen -%D -%D because we don't want to recode the source, a setup command -%D in another language has to expand to this variable, so: -%D -%D \starttypen -%D \stelblokin[breedte=12cm] -%D \stoptypen -%D -%D has to result in the definition of \type{\boxwidth} too. -%D This method enables us to build compact, fast and readable -%D code. -%D -%D An alternative method, which we considered using, uses a -%D more indirect way. In this case, both calls generate a -%D different variable: -%D -%D \starttypen -%D \def\boxwidth {12cm} -%D \def\boxbreedte {12cm} -%D \stoptypen -%D -%D And because we don't want to recode those megabytes of -%D already developed code, this variable has to be called with -%D something like: -%D -%D \starttypen -%D \valueof\box\width -%D \stoptypen -%D -%D where \type{\valueof} takes care of the translation of -%D \type{width} or \type{breedte} to \type{width} and -%D combining this with \type{box} to \type{\boxwidth}. -%D -%D One advantage of this other scheme is that, within certain -%D limits, we can implement an interface that can be switched -%D to another language at will, while the current approach -%D fixes the interface at startup. There are, by the way, -%D other reasons too for not choosing this scheme. Switching -%D user generated commands is for instance impossible and a -%D dual interface would therefore give a strange mix of -%D languages. -%D -%D Now let's work out the first scheme. Although the left hand -%D of the assignment is a variable from the users point of -%D view, it is a constant in terms of the system. Both -%D \type{width} and \type{breedte} expand to \type{width} -%D because in the source we only encounter \type{width}. Such -%D system constants are presented as -%D -%D \starttypen -%D \c!width -%D \stoptypen -%D -%D This constant is always equivalent to \type{width}. As we -%D can see, we use \type{c!} to mark this one as constant. Its -%D dutch counterpart is: -%D -%D \starttypen -%D \c!breedte -%D \stoptypen -%D -%D When we interpret a setup command each variable is -%D translated to it's \type{c!} counterpart. This means that -%D \type{breedte} and \type{width} expand to \type{\c!breedte} -%D and \type{\c!width} which both expand to \type{width}. That -%D way user variables become system constants. -%D -%D The interpretation is done by means of a general setup -%D command \type{\getparameters} that we introduced in the -%D system module. Let us define some simple setup command: -%D -%D \starttypen -%D \def\setupbox[#1]% -%D {\getparameters[\??bx][#1]} -%D \stoptypen -%D -%D This command can be used as: -%D -%D \starttypen -%D \setupbox [width=3cm, height=1cm] -%D \stoptypen -%D -%D Afterwards we have two variables \type{\@@bxwidth} and -%D \type{\@@bxheight} which have the values \type{3cm} and -%D \type{1cm} assigned. These variables are a combinatiom of -%D the setup prefix \type{\??bx}, which expands to \type{@@bx} -%D and the translated user supplied variables \type{width} and -%D \type{height} or \type{breedte} and \type{hoogte}, -%D depending on the actual language. In dutch we just say: -%D -%D \starttypen -%D \stelblokin [breedte=3cm, hoogte=1cm] -%D \stoptypen -%D -%D and get ourselves \type{\@@bxwidth} and \type{\@@bxheight} -%D too. In the source of \CONTEXT, we can recognize constants -%D and variables on their leading \type{c!}, \type{v!} etc., -%D prefixes on \type{??} and composed variables on \type{@@}. -%D -%D We already saw that user supplied keywords need some -%D special treatment too. This time we don't translate the -%D keyword, but instead use in the source a variable which -%D meaning depends on the interface language. -%D -%D \starttypen -%D \v!left -%D \stoptypen -%D -%D Which can be used in macro's like: -%D -%D \starttypen -%D \processaction -%D [\@@bxlocation] -%D [ \v!left=>\dosomethingontheleft, -%D \v!middle=>\dosomthinginthemiddle, -%D \v!right=>\dosomethingontheright] -%D \stoptypen -%D -%D Because variables like \type{\@@bxlocation} can have a lot -%D of meanings, including tricky expandable tokens, we cannot -%D translate this meaning when we compare. This means that -%D \type{\@@bxlocation} can be \type{left} of \type{links} of -%D whatever meaning suits the language. But because -%D \type{\v!left} also has a meaning that suits the language, -%D we are able to compare. -%D -%D Although we know it sounds confusing we want to state two -%D important characteristics of the interface as described: -%D -%D \startsmaller \em -%D user variables become system constants -%D \stopsmaller -%D -%D and -%D -%D \startsmaller \em -%D user constants (keywords) become system variables -%D \stopsmaller -%D - -%D \macros -%D {startconstants,startvariables} -%D {} -%D -%D It's time to introduce the macro's that are responsible for -%D this translations process, but first we show how constants -%D and variables are defined. We only show two languages and -%D a few words. -%D -%D \starttypen -%D \startconstants english dutch -%D -%D width: width breedte -%D height: height hoogte -%D -%D \stopconstants -%D \stoptypen -%D -%D Keep in mind that what users see as variables, are constants -%D for the system. -%D -%D \starttypen -%D \startvariables english dutch -%D -%D location: left links -%D text: text tekst -%D -%D \stopvariables -%D \stoptypen -%D -%D The macro's responsible for interpreting these setups are -%D shared. They take care of empty lines and permit a more or -%D less free format. All setups accept the keyword \type{all} -%D which equals every language. - -\def\nointerfaceobject{-} - -\def\startinterfaceobjects#1#2% - {\!!counta=1 - \let\dogetinterfaceobject=\dogetinterfacetemplate - \let\dowithinterfaceelement=#1% - \def\dodogetinterfaceobjects% - {\ifx\next#2% - \def\next####1% - {}% - \else\ifx\next\par - \long\def\next####1% - {\dogetinterfaceobjects}% - \else\ifx\next\empty - \def\next####1% - {\dogetinterfaceobjects}% - \else - \def\next####1 % - {\dogetinterfaceobject[####1:\relax]% - \dogetinterfaceobjects}% - \fi\fi\fi - \next}% - \def\dogetinterfaceobjects% - {\futurelet\next\dodogetinterfaceobjects}% - \dogetinterfaceobjects} - -\def\dogetinterfacetemplate[#1:#2]% - {\doifinsetelse{#1}{\currentinterface,all} - {\let\dogetinterfaceobject=\doskipinterfaceobject} - {\advance\!!counta by 1\relax}} - -\def\doskipinterfaceobject[#1:#2#3]% - {\if#2:% - \let\dogetinterfaceobject=\dogetinterfaceelement - \dogetinterfaceobject[#1:#2#3]% - \fi} - -\def\dogetinterfaceelement[#1:#2#3]% - {\ifx#2:% - \!!countb=0 - \def\!!stringa{#1}% - \else - \advance\!!countb by 1 - \ifnum\!!countb=\!!counta - \@EA\dowithinterfaceelement\@EA{\!!stringa}{#1}% - \let\dogetinterfaceobject=\doskipinterfaceobject - \fi - \fi} - -%D The constants and variables are defined as described. When -%D \type{\interfacetranslation} is \type{true}, we also -%D generate a reverse translation. Because we don't want to put -%D too big a burden on \TEX's hash table, this is no default -%D behavior. Reverse translation is used in the commands that -%D generate the quick reference cards. We are going to define -%D the real \CONTEXT\ commands in an abstract way and generate -%D those reference cards for each language without further -%D interference. - -\def\setinterfaceconstant#1#2% - {\setvalue{\c!prefix!#1}{#1}% - \doifelse{#2}{\nointerfaceobject} - {\debuggerinfo{constant}{#1 defined as #1 by default}} - {\debuggerinfo{constant}{#1 defined as #2}% - \ifinterfacetranslation - \setvalue{\x!prefix!#1}{#2}% - \fi - \setvalue{\c!prefix!#2}{#1}}} - -\def\setinterfacevariable#1#2% - {\doifelse{#2}{\nointerfaceobject} - {\debuggerinfo{variable}{#1 defined as #1 by default}% - \setvalue{\v!prefix!#1}{#1}} - {\debuggerinfo{variable}{#1 defined as #2}% - \setvalue{\v!prefix!#1}{#2}}} - -\def\startvariables% - {\startinterfaceobjects\setinterfacevariable\stopvariables} - -\def\startconstants% - {\startinterfaceobjects\setinterfaceconstant\stopconstants} - -%D \macros -%D {defineinterfaceconstant} -%D -%D Next we redefine a previously defined macro to take care of -%D interface translation too. It's a bit redundant, because -%D in thise situations we could use the c||version, but for -%D documentation purposes the x||alternative comes in handy. - -\def\defineinterfaceconstant#1#2% - {\setvalue{\c!prefix!#1}{#2}% - \ifinterfacetranslation - \setvalue{\x!prefix!#1}{#2}% - \fi} - -%D \macros -%D {startinterfacesetupconstant} -%D {} -%D -%D The next command, \type{\startinterfacesetupconstant}, which -%D behavior also depends on the boolean, is used for constants -%D that are only needed in these quick reference macro's. The -%D following, more efficient approach does not work here, -%D because it sometimes generates spaces. -%D -%D \starttypen -%D \def\setinterfacesetupconstant% -%D {\ifinterfacetranslation -%D \expandafter\setinterfaceconstant -%D \fi} -%D \stoptypen -%D -%D We therefore use the more redundant but robust method: - -\def\setinterfacesetupvariable#1#2% - {\ifinterfacetranslation - \doifelse{#2}{\nointerfaceobject} - {\setvalue{\y!prefix!#1}{#1}} - {\setvalue{\y!prefix!#1}{#2}}% - \fi} - -\def\startsetupvariables% - {\startinterfaceobjects\setinterfacesetupvariable\stopsetupvariables} - -%D \macros -%D {startelements} -%D {} -%D -%D Due to the object oriented nature of \CONTEXT, we also need -%D to define the elements that are used to build commands: -%D -%D \starttypen -%D \startelements english dutch -%D -%D beginvan: begin beginvan -%D eindvan: end eindvan -%D start: start start -%D stop: stop stop -%D -%D \stopelements -%D \stoptypen -%D -%D Such elements sometimes are the same in diferent -%D languages, but mostly they differ. Things can get even -%D confusing when we look at for instance the setup commands. -%D In english we say \type{\setup<something>}, but in dutch we -%D have: \type{\stel<iets>in}. Such split elements are no -%D problem, because we just define two elements. When no second -%D part is needed, we use a \type{-}: -%D -%D \starttypen -%D \startelements english dutch -%D -%D setupa: setup stel -%D setupb: - in -%D -%D \stopelements -%D \stoptypen -%D -%D Element translation is realized by means of: - -\def\setinterfaceelement#1#2% - {\doifelse{#2}{\nointerfaceobject} - {\debuggerinfo{element}{#1 defined as <empty>}% - \setvalue{\e!prefix!#1}{}} - {\doifdefinedelse{\e!prefix!#1} - {\doifnot{\getvalue{\e!prefix!#1}}{#2} - {\debuggerinfo{element}{#1 redefined as #2}% - \setvalue{\e!prefix!#1}{#2}}} - {\debuggerinfo{element}{#1 defined as #2}% - \setvalue{\e!prefix!#1}{#2}}}} - -\def\startelements% - {\startinterfaceobjects\setinterfaceelement\stopelements} - -%D \macros -%D {startcommands} -%D {} -%D -%D The last setup has to do with the commands themselve. -%D Commands are defined as: -%D -%D \starttypen -%D \startcommands english dutch -%D -%D starttekst: starttext starttekst -%D stoptekst: stoptext stoptekst -%D omlijnd: framed omlijnd -%D margewoord: marginword margewoord -%D -%D \stopcommands -%D \stoptypen -%D -%D Here we also have to take care of the optional translation -%D needed for reference cards. - -\def\setinterfacecommand#1#2% - {\doifelse{#2}{\nointerfaceobject} - {\debuggerinfo{command}{no link to #1}% - \setinterfacesetupvariable{#1}{#1}} - {\doifelse{#1}{#2} - {\debuggerinfo{command}{#1 remains #1}} - {\doifdefinedelse{#2} - {\debuggerinfo{command}{core command #2 redefined as #1}}% - {\debuggerinfo{command}{#2 defined as #1}}% - \@EA\@EA\@EA\def\@EA\csname\@EA#2\@EA\endcsname - \@EA{\csname#1\endcsname}}% - \setinterfacesetupvariable{#1}{#2}}} - -\def\startcommands% - {\startinterfaceobjects\setinterfacecommand\stopcommands} - -%D \macros -%D {getinterfaceconstant, getinterfacevariable} -%D {} -%D -%D Generating the interface translation macro's that are used -%D in the reference lists, is enabled by setting the boolean: -%D -%D \starttypen -%D \interfacetranslationtrue -%D \stoptypen -%D -%D Keep in mind that enabling interfacetranslation costs a -%D bit of hash space. - -\newif\ifinterfacetranslation - -\def\getinterfaceconstant#1% - {\ifinterfacetranslation - \doifdefinedelse{\x!prefix!#1} - {\getvalue{\x!prefix!#1}} - {#1}% - \else - #1% - \fi} - -\def\getinterfacevariable#1% - {\ifinterfacetranslation - \doifdefinedelse{\y!prefix!#1} - {\getvalue{\y!prefix!#1}} - {#1}% - \else - #1% - \fi} - -%D When a reference list is generated, one does not need to -%D generate a new format. Just reloading the relevant -%D definition files suits: -%D -%D \starttypen -%D \interfacetranslationtrue -%D \input mult-con -%D \input mult-com -%D \stoptypen - -%D \macros -%D {interfaced} -%D {} -%D -%D The setup commands translate the constants automatically. -%D When we want to translate 'by hand' we can use the simple -%D but effective command: -%D -%D \starttypen -%D \interfaced {something} -%D \stoptypen -%D -%D Giving \type{\interfaced{breedte}} results in \type{width} -%D or, when not defined, in \type{breedte} itself. - -\def\interfaced#1% - {\expandafter\ifx\csname\c!prefix!#1\endcsname\relax - #1% - \else - \csname\c!prefix!#1\endcsname - \fi} - -%D So much for the basic multi||lingual interface commands. The -%D macro's can be enhanced with more testing facilities, but -%D for the moment they suffice. - -\protect - -\endinput +%D \module
+%D [ file=mult-ini,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Multilingual 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.
+
+%D This module implements the multi||lingual interface to
+%D \CONTEXT. These capabilities concern messages, commands and
+%D parameters.
+
+\writestatus{loading}{Context Multilingual Macros / Initialization}
+
+\unprotect
+
+%D \macros
+%D [constanten,variabelen,commandos]
+%D {v!,c!,s!,e!,m!,l!,r!,f!,p!,x!,y!}
+%D {}
+%D
+%D In the system modules we introduced some prefixed constants,
+%D variables (both macros) and registers. Apart from a
+%D tremendous saving in terms of memory and a gain in speed we
+%D use from now on prefixes when possible for just another
+%D reason: consistency and multi||linguality. Systematically
+%D using prefixed macros enables us to implement a
+%D multi||lingual user interface. Redefining these next set of
+%D prefixes therefore can have desastrous results.
+%D
+%D \startregelcorrectie
+%D \starttabel[|c|c|c|]
+%D \HL
+%D \NC \bf prefix \NC \bf meaning \NC \bf application \NC\SR
+%D \HL
+%D \NC \type{\v!prefix!} \NC v! \NC variable \NC\FR
+%D \NC \type{\c!prefix!} \NC c! \NC constant \NC\MR
+%D \NC \type{\s!prefix!} \NC s! \NC system \NC\MR
+%D \NC \type{\e!prefix!} \NC e! \NC element \NC\MR
+%D \NC \type{\m!prefix!} \NC m! \NC message \NC\MR
+%D \NC \type{\l!prefix!} \NC l! \NC language \NC\MR
+%D \NC \type{\r!prefix!} \NC r! \NC reference \NC\MR
+%D \NC \type{\f!prefix!} \NC f! \NC file \NC\MR
+%D \NC \type{\p!prefix!} \NC p! \NC procedure \NC\MR
+%D \NC \type{\x!prefix!} \NC x! \NC setup constant \NC\MR
+%D \NC \type{\y!prefix!} \NC y! \NC setup variable \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D In the single||lingual version we used \type{!}, \type{!!},
+%D \type{!!!} and \type{!!!!}.
+
+\def\v!prefix!{v!} \def\c!prefix!{c!} \def\s!prefix!{s!}
+\def\e!prefix!{e!} \def\m!prefix!{m!} \def\r!prefix!{r!}
+\def\f!prefix!{f!} \def\p!prefix!{p!} \def\x!prefix!{x!}
+\def\y!prefix!{y!} \def\l!prefix!{l!}
+
+%D \macros
+%D [constants,variables,commands]
+%D {@@,??}
+%D {}
+%D
+%D Variables generated by the system can be recognized on their
+%D prefix \type{@@}. They are composed of a command (class)
+%D specific tag, which can be recognized on \type{??}, and a
+%D system constant, which has the prefix \type{c!}. We'll se
+%D some more of this.
+
+\def\??prefix {??}
+\def\@@prefix {@@}
+
+%D Just to be complete we repeat some of the already defined
+%D system constants here. Maybe their prefix \type{\s!} now
+%D falls into place.
+
+\def\s!next {next} \def\s!default {default}
+\def\s!dummy {dummy} \def\s!unknown {unknown}
+
+\def\s!do {do} \def\s!dodo {dodo}
+
+\def\s!complex {complex} \def\s!start {start}
+\def\s!simple {simple} \def\s!stop {stop}
+
+\def\!!width {width} \def\!!plus {plus}
+\def\!!height {height} \def\!!minus {minus}
+\def\!!depth {depth}
+
+%D \macros
+%D {defineinterfaceconstant,
+%D defineinterfacevariable,
+%D defineinterfaceelement,
+%D definesystemvariable,
+%D definesystemconstant,
+%D definemessageconstant,
+%D definereferenceconstant,
+%D definefileconstant}
+%D {}
+%D
+%D The first part of this module is dedicated to dealing with
+%D multi||lingual constants and variables. When \CONTEXT\ grew
+%D bigger and bigger in terms of bytes and used string space,
+%D we switched to predefined constants. At the cost of more
+%D hash table entries, the macros not only becase more compact,
+%D they became much faster too. Maybe an even bigger advantage
+%D was that mispelling could no longer lead to problems. Even a
+%D multi||lingual interface became possible.
+%D
+%D Constants --- we'll introduce the concept of variables later
+%D on --- are preceded by a type specific prefix, followed by a
+%D \type{!}. To force consistency, we provide a few commands
+%D for defining such constants.
+%D
+%D \starttypen
+%D \defineinterfaceconstant {name} {meaning}
+%D \defineinterfacevariable {name} {meaning}
+%D \defineinterfaceelement {name} {meaning}
+%D \stoptypen
+%D
+%D Which is the same as:
+%D
+%D \starttypen
+%D \def\c!name{meaning}
+%D \def\v!name{meaning}
+%D \def\e!name{meaning}
+%D \stoptypen
+
+\def\defineinterfaceconstant #1#2{\setvalue{\c!prefix!#1}{#2}}
+\def\defineinterfacevariable #1#2{\setvalue{\v!prefix!#1}{#2}}
+\def\defineinterfaceelement #1#2{\setvalue{\e!prefix!#1}{#2}}
+
+%D Next come some interface independant constants:
+%D
+%D \starttypen
+%D \definereferenceconstant {name} {meaning}
+%D \definefileconstant {name} {meaning}
+%D \stoptypen
+
+\def\definereferenceconstant #1#2{\setvalue{\r!prefix!#1}{#2}}
+\def\definefileconstant #1#2{\setvalue{\f!prefix!#1}{#2}}
+
+%D And finaly we have the one argument, space saving constants
+%D
+%D \starttypen
+%D \definesystemconstant {name}
+%D \definemessageconstant {name}
+%D \stoptypen
+
+\def\definesystemconstant #1{\setvalue{\s!prefix!#1}{#1}}
+\def\definemessageconstant #1{\setvalue{\m!prefix!#1}{#1}}
+
+%D In a parameter driven system, some parameters are shared
+%D by more system components. In \CONTEXT\ we can distinguish
+%D parameters by a unique prefix. Such a prefix is defined
+%D with:
+%D
+%D \starttypen
+%D \definesystemvariable {name}
+%D \stoptypen
+
+\def\definesystemvariable #1{\setevalue{\??prefix#1}{\@@prefix#1}}
+
+%D \macros
+%D {selectinterface,
+%D defaultinterface, currentinterface, currentresponses}
+%D {}
+%D
+%D With \type{\selectinterface} we specify the language we are
+%D going to use. The system asks for the language wanted, and
+%D defaults to \type{\currentinterface} when we just give
+%D \type{enter}. By default the message system uses the
+%D current interface language, but \type{\currentresponses}
+%D can specify another language too.
+%D
+%D Because we want to generate formats directly too, we do
+%D not ask for interface specifications when these are already
+%D defined (like in cont-nl.tex and alike).
+
+\ifx\defaultinterface\undefined
+
+ \def\defaultinterface{dutch}
+
+ \def\selectinterface%
+ {\def\docommando##1##2%
+ {\bgroup
+ \endlinechar=-1
+ \global\read16 to ##1
+ \egroup
+ \doif{\currentinterface}{}{\let##1=##2}%
+ \doifundefined{\s!prefix!##1}{\let##1=##2}}%
+ \docommando\currentinterface\defaultinterface
+ \writestatus{interface}{defining \currentinterface\space interface}%
+ \writeline
+ \docommando\currentresponses\currentinterface
+ \writestatus{interface}{using \currentresponses\space messages}%
+ \writeline}
+
+\else
+
+ \def\selectinterface%
+ {\writestatus{interface}{defining \currentinterface\space interface}%
+ \writeline
+ \writestatus{interface}{using \currentresponses\space messages}%
+ \writeline}
+
+\fi
+
+\ifx\currentinterface\undefined \let\currentinterface=\defaultinterface \fi
+\ifx\currentresponses\undefined \let\currentresponses=\defaultinterface \fi
+
+%D \macros
+%D {startinterface}
+%D {}
+%D
+%D Sometimes we want to define things only for specific
+%D interface languages. This can be done by means of the
+%D selector:
+%D
+%D \starttypen
+%D \startinterface language
+%D
+%D language specific definitions & commands
+%D
+%D \stopinterface
+%D \stoptypen
+
+%\long\def\startinterface #1 #2\stopinterface%
+% {\doifelse{#1}{\currentinterface}
+% {\long\def\next{#2}}
+% {\let\next=\relax}%
+% \next}
+
+\def\startinterface #1
+ {\doifelse{#1}{\currentinterface}
+ {\let\next\relax}
+ {\long\def\next##1\stopinterface{}}%
+ \next}
+
+\let\stopinterface=\relax
+
+%D \macros
+%D {startmessages,
+%D getmessage,
+%D showmessage,
+%D makemessage}
+%D {}
+%D
+%D A package as large as \CONTEXT\ can hardly function without
+%D a decent message mechanism. Due to its multi||lingual
+%D interface, the message subsystem has to be multi||lingual
+%D too. A major drawback of this feature is that we have to
+%D code messages. As a result, the source becomes less self
+%D documented. On the other hand, consistency will improve.
+%D
+%D Because the overhead in terms of entries in the (already
+%D exhausted) hash table has to be minimal, messages are packed
+%D in libraries. We can extract a message from such a library
+%D in three ways:
+%D
+%D \starttypen
+%D \getmessage {library} {tag}
+%D \showmessage {library} {tag} {data}
+%D \makemessage {library} {tag} {data}
+%D \stoptypen
+%D
+%D The first command gets the message \type{tag} from the
+%D \type{library} specified. The other commands take an extra
+%D argument: a list of items to be inserted in the message
+%D text. While \type{\showmessage} shows the message at the
+%D terminal, the other commands generate the message as text.
+%D Before we explain the \type{data} argument, we give an
+%D example of a library.
+%D
+%D \starttypen
+%D \startmessages english library: alfa
+%D title: something
+%D 1: first message
+%D 2: second (--) message --
+%D \stopmessages
+%D \stoptypen
+%D
+%D The first message is a simple one and can be shown with:
+%D
+%D \starttypen
+%D \showmessage {alfa} {1} {}
+%D \stoptypen
+%D
+%D The second message on the other hand needs some extra data:
+%D
+%D \starttypen
+%D \showmessage {alfa} {2} {and last,to you}
+%D \stoptypen
+%D
+%D This message is shown as:
+%D
+%D \starttypen
+%D something : second (and last) message to you
+%D \stoptypen
+%D
+%D As we can see, the title entry is shown with the message.
+%D The data fields are comma separated and are specified in the
+%D message text by \type{--}.
+%D
+%D It is not required to define all messages in a library at
+%D once. We can add messages to a library in the following way:
+%D
+%D \starttypen
+%D \startmessages english library: alfa
+%D 10: tenth message
+%D \stopmessages
+%D \stoptypen
+%D
+%D Because such definitions can take place in different
+%D modules, the system gives a warning when a tag occurs more
+%D than once. The first occurrence takes preference over later
+%D ones, so we had better use a save offset, as shown in the
+%D example. As we can see, the title field is specified only
+%D the first time!
+%D
+%D Because we want to check for duplicate tags, the macros
+%D are a bit more complicated than neccessary. The \NEWLINE\
+%D token is used as message separator.
+
+\def\findinterfacemessage#1#2%
+ {\let#2\empty
+ \def\dofindinterfacemessage##1 #1: ##2\relax##3\end%
+ {\def#2{##2}}%
+ \edef\!!stringa{\getvalue{@@ms\currentmessagelibrary} #1: \relax}%
+ \expandafter\dofindinterfacemessage\!!stringa\end}
+
+\def\composemessagetext#1--#2--#3--#4--#5--#6\\%
+ {\def\docomposemessagetext##1,##2,##3,##4,##5,##6\\%
+ {\edef\currentmessagetext{#1##1#2##2#3##3#4##4#5##5}}%
+ \docomposemessagetext}
+
+\unexpanded\def\getmessage#1#2%
+ {\def\currentmessagelibrary{#1}%
+ \findinterfacemessage{#2}\currentmessagetext
+ \currentmessagetext}
+
+\unexpanded\def\makemessage#1#2#3%
+ {\def\currentmessagelibrary{#1}%
+ \findinterfacemessage{#2}\currentmessagetext
+ \@EA\composemessagetext\currentmessagetext----------\\#3,,,,,\\%
+ \currentmessagetext}
+
+\def\showmessage#1#2#3%
+ {\def\currentmessagelibrary{#1}%
+ \findinterfacemessage{#2}\currentmessagetext
+ \findinterfacemessage{title}\currentmessagetitle
+ \doifelse{\currentmessagetext}{}
+ {\def\currentmessagetext{<unknown message #2>}}
+ {\@EA\composemessagetext\currentmessagetext----------\\#3,,,,,\\}%
+ \@EA\writestatus\@EA{\currentmessagetitle}{\currentmessagetext}}
+
+\def\doaddinterfacemessage#1#2%
+ {\findinterfacemessage{#1}\currentmessagetext
+ \doifelse{\currentmessagetext}{}
+ {\setxvalue{@@ms\currentmessagelibrary}%
+ {\getvalue{@@ms\currentmessagelibrary} #1: #2\relax}}
+ {\debuggerinfotrue % we consider this an important error
+ \debuggerinfo
+ {message}
+ {duplicate tag #1
+ in library \currentmessagelibrary\space
+ of interface \currentresponses}}%
+ \futurelet\next\getinterfacemessage}
+
+\bgroup
+\obeylines
+\gdef\addinterfacemessage#1: #2
+ {\doaddinterfacemessage{#1}{#2}}%
+\egroup
+
+\def\getinterfacemessage%
+ {\ifx\next\stopmessages
+ \def\next##1{\egroup}%
+ \else
+ \let\next\addinterfacemessage
+ \fi
+ \next}
+
+\gdef\startmessages #1 library: #2
+ {\bgroup
+ \obeylines
+ \doifinsetelse{#1}{\currentresponses,all}
+ {\def\next%
+ {\def\currentmessagelibrary{#2}%
+ \doifundefined{@@ms\currentmessagelibrary}
+ {\setgvalue{@@ms\currentmessagelibrary}{}}%
+ \futurelet\next\getinterfacemessage}}
+ {\long\def\next##1\stopmessages{\egroup}}%
+ \next}
+
+%D \macros
+%D {ifshowwarnings, ifshowmessages}
+%D
+%D Sometimes displaying message can slow down processing
+%D considerably. We therefore introduce warnings. Users can
+%D turn of warnings and messages by saying:
+%D
+%D \starttypen
+%D \showwarningstrue
+%D \showmessagestrue
+%D \stoptypen
+%D
+%D Turning off messages also turns off warnings, which is
+%D quote logical because they are less important.
+
+\newif\ifshowwarnings \showwarningstrue
+\newif\ifshowmessages \showmessagestrue
+
+\let\normalshowmessage=\showmessage
+
+\def\showwarning%
+ {\ifshowwarnings
+ \expandafter\showmessage
+ \else
+ \expandafter\gobblethreearguments
+ \fi}
+
+\def\showmessage%
+ {\ifshowmessages
+ \expandafter\normalshowmessage
+ \else
+ \expandafter\gobblethreearguments
+ \fi}
+
+%D \macros
+%D {dosetvalue,dosetevalue,docopyvalue,doresetvalue,
+%D dogetvalue}
+%D {}
+%D
+%D We already defined these auxiliary macros in the system
+%D modules. Starting with this module however, we have to take
+%D multi||linguality a bit more serious.
+%D
+%D First we show a well||defined alternative:
+%D
+%D \starttypen
+%D \def\dosetvalue#1#2#3%
+%D {\doifdefinedelse{\c!prefix!#2}
+%D {\setvalue{#1\getvalue{\c!prefix!#2}}{#3}}
+%D {\setvalue{#1#2}{#3}}}
+%D
+%D \def\docopyvalue#1#2#3%
+%D {\doifdefinedelse{\c!prefix!#3}
+%D {\setvalue{#1\getvalue{\c!prefix!#3}}%
+%D {\getvalue{#2\getvalue{\c!prefix!#3}}}}
+%D {\setvalue{#1#3}%
+%D {\getvalue{#2#3}}}}
+%D
+%D \def\dogetvalue#1#2%
+%D {\getvalue{#1\getvalue{\c!prefix!#2}}}
+%D \stoptypen
+%D
+%D These macros are called upon quite often and so we optimized
+%D them a bit.
+
+\def\dosetvalue#1#2#3%
+ {\p!doifundefined{\c!prefix!#2}%
+ \let\donottest\doprocesstest
+ \@EA\def\csname#1#2\endcsname{#3}%
+ \else
+ \let\donottest\doprocesstest
+ \@EA\def\csname#1\csname\c!prefix!#2\endcsname\endcsname{#3}%
+ \fi}
+
+\def\dosetevalue#1#2#3%
+ {\p!doifundefined{\c!prefix!#2}%
+ \let\donottest\doprocesstest
+ \@EA\edef\csname#1#2\endcsname{#3}%
+ \else
+ \let\donottest\doprocesstest
+ \@EA\edef\csname#1\csname\c!prefix!#2\endcsname\endcsname{#3}%
+ \fi}
+
+\def\docopyvalue#1#2#3%
+ {\p!doifundefined{\c!prefix!#3}%
+ \let\donottest\doprocesstest
+ \@EA\def\csname#1#3\endcsname%
+ {\csname#2#3\endcsname}%
+ \else
+ \let\donottest\doprocesstest
+ \@EA\def\csname#1\csname\c!prefix!#3\endcsname\endcsname%
+ {\csname#2\csname\c!prefix!#3\endcsname\endcsname}%
+ \fi}
+
+\def\doresetvalue#1#2%
+ {\dosetvalue{#1}{#2}{}}
+
+\def\dogetvalue#1#2%
+ {\csname#1\csname\c!prefix!#2\endcsname\endcsname}
+
+%D Although maybe bot clearly visible, there is a
+%D considerable profit in further optimalization. By expanding
+%D the embedded \type{\csname} we can reduce the format file
+%D by about 5\% (60~KB out of 1.9~MB).
+
+\def\docopyvalue#1#2#3%
+ {\p!doifundefined{\c!prefix!#3}%
+ \let\donottest\doprocesstest
+ \@EA\@EA\@EA\def\@EA\csname\@EA#1\@EA#3\@EA\endcsname
+ \@EA{\csname#2#3\endcsname}%
+ \else
+ \let\donottest\doprocesstest
+ \@EA\@EA\@EA\def\@EA
+ \csname
+ \@EA#1\@EA\csname\@EA\c!prefix!\@EA#3\@EA\endcsname\@EA
+ \endcsname
+ \@EA{\csname#2\csname\c!prefix!#3\endcsname\endcsname}%
+ \fi}
+
+%D We take this opportunity of redefining to adapt an
+%D assignment macro. The change has to do with the fact that the
+%D generated error message must be multi||lingual. We can not
+%D define the message yet, because we still have to select the
+%D interface language.
+
+%\def\p!doassign#1[#2][#3=#4=#5]%
+% {\let\donottest=\dontprocesstest
+% \edef\!!stringa{#5}%
+% \edef\!!stringb{\relax}%
+% \let\donottest=\doprocesstest
+% \ifx\!!stringa\!!stringb
+% \showmessage{check}{1}{#3,\the\inputlineno}%
+% \else
+% #1{#2}{#3}{#4}%
+% \fi}
+
+\def\p!doassign#1[#2][#3=#4=#5]%
+ {\ifx\empty#3\else % and definitely not \ifx#3\empty
+ \ifx\relax#5%
+ \showmessage{check}{1}{#3,\the\inputlineno}%
+ \else
+ #1{#2}{#3}{#4}%
+ \fi
+ \fi}
+
+\def\dogetargument#1#2#3#4%
+ {\doifnextcharelse{#1}
+ {\let\expectedarguments\noexpectedarguments
+ #3\dodogetargument}
+ {\ifnum\expectedarguments>\noexpectedarguments
+ \showmessage{check}{2}{\the\expectedarguments,\the\inputlineno}%
+ \fi
+ \let\expectedarguments\noexpectedarguments
+ #4\dodogetargument#1#2}}
+
+\def\dogetgroupargument#1#2%
+ {\def\nextnextargument%
+ {\ifx\nextargument\bgroup
+ \let\expectedarguments\noexpectedarguments
+ \def\nextargument{#1\dodogetargument}%
+ %\else\ifx\nextargument\lineending % this can be an option
+ % \def\nextargument{\bgroup\def\\ {\egroup\dogetgroupargument#1#2}\\}%
+ %\else\ifx\nextargument\blankspace % but may never be default
+ % \def\nextargument{\bgroup\def\\ {\egroup\dogetgroupargument#1#2}\\}%
+ \else
+ \ifnum\expectedarguments>\noexpectedarguments
+ \showmessage{check}{2}{\the\expectedarguments,\the\inputlineno}%
+ \fi
+ \let\expectedarguments\noexpectedarguments
+ \def\nextargument{#2\dodogetargument{}}%
+ \fi%\fi\fi % so let's get rid of it
+ \nextargument}%
+ \futurelet\nextargument\nextnextargument}
+
+\def\checkdefined#1#2#3%
+ {\doifdefined{#3}
+ {\showmessage{check}{3}{#2,#3}}}
+
+%D \CONTEXT\ is a parameter driven package. This means that
+%D users instruct the system by means of variables, values and
+%D keywords. These instructions take the form:
+%D
+%D \starttypen
+%D \setupsomething[some variable=some value, another one=a keyword]
+%D \stoptypen
+%D
+%D or by keyword only:
+%D
+%D \starttypen
+%D \dosomething[this way, that way, no way]
+%D \stoptypen
+%D
+%D Because the same variables can occur in more than one setup
+%D command, we have to be able to distinguish them. This is
+%D achieved by assigning them a unique prefix.
+%D
+%D Imagine a setup command for boxed text, that enables us to
+%D specify the height and width of the box. Behide the scenes
+%D the command
+%D
+%D \starttypen
+%D \setupbox [width=12cm, height=3cm]
+%D \stoptypen
+%D
+%D results in something like
+%D
+%D \starttypen
+%D \<box><width> {12cm}
+%D \<box><height> {3cm}
+%D \stoptypen
+%D
+%D while a similar command for specifying the page dimensions
+%D of an \kap{A4} page results in:
+%D
+%D \starttypen
+%D \<page><width> {21.0cm}
+%D \<page><height> {27.9cm}
+%D \stoptypen
+%D
+%D The prefixes \type{<box>} and \type{<page>} are hidden from
+%D users and can therefore be language independant. Variables
+%D on the other hand, differ for each language:
+%D
+%D \starttypen
+%D \<box><color> {<blue>}
+%D \<box><kleur> {<blauw>}
+%D \<box><couleur> {<blue>}
+%D \stoptypen
+%D
+%D In this example we can see that the assigned values or
+%D keywords are language dependant too. This will be a
+%D complication when defining multi||lingual setup files.
+%D
+%D A third phenomena is that variables and values can have a
+%D similar meaning.
+%D
+%D \starttypen
+%D \<pagenumber><location> {<left>}
+%D \<skip><left> {12cm}
+%D \stoptypen
+%D
+%D A (minor) complication is that where in english we use
+%D \type{<left>}, in dutch we find both \type{<links>} and
+%D \type{<linker>}. This means that when we use some sort of
+%D translation table, we have to distinguish between the
+%D variables at the left side and the fixed values at the
+%D right.
+%D
+%D The same goes for commands that are composed of different
+%D user supplied and/or language specific elements. In english
+%D we can use:
+%D
+%D \starttypen
+%D \<empty><figure>
+%D \<empty><intermezzo>
+%D \stoptypen
+%D
+%D But in dutch we have the following:
+%D
+%D \starttypen
+%D \<lege><figuur>
+%D \<leeg><intermezzo>
+%D \stoptypen
+%D
+%D These subtle differences automatically lead to a solution
+%D where variables, values, elements and other components have
+%D a similar logical name (used in macro's) but a different
+%D meaning (supplied by the user).
+%D
+%D Our solution is one in which the whole system is programmed
+%D in terms of identifiers with language specific meanings. In
+%D such an implementation, each fixed variable is available as:
+%D
+%D \starttypen
+%D \<prefix><variable>
+%D \stoptypen
+%D
+%D This means that for instance:
+%D
+%D \starttypen
+%D \setupbox[width=12cm]
+%D \stoptypen
+%D
+%D expands to something like:
+%D
+%D \starttypen
+%D \def\boxwidth{12cm}
+%D \stoptypen
+%D
+%D because we don't want to recode the source, a setup command
+%D in another language has to expand to this variable, so:
+%D
+%D \starttypen
+%D \stelblokin[breedte=12cm]
+%D \stoptypen
+%D
+%D has to result in the definition of \type{\boxwidth} too.
+%D This method enables us to build compact, fast and readable
+%D code.
+%D
+%D An alternative method, which we considered using, uses a
+%D more indirect way. In this case, both calls generate a
+%D different variable:
+%D
+%D \starttypen
+%D \def\boxwidth {12cm}
+%D \def\boxbreedte {12cm}
+%D \stoptypen
+%D
+%D And because we don't want to recode those megabytes of
+%D already developed code, this variable has to be called with
+%D something like:
+%D
+%D \starttypen
+%D \valueof\box\width
+%D \stoptypen
+%D
+%D where \type{\valueof} takes care of the translation of
+%D \type{width} or \type{breedte} to \type{width} and
+%D combining this with \type{box} to \type{\boxwidth}.
+%D
+%D One advantage of this other scheme is that, within certain
+%D limits, we can implement an interface that can be switched
+%D to another language at will, while the current approach
+%D fixes the interface at startup. There are, by the way,
+%D other reasons too for not choosing this scheme. Switching
+%D user generated commands is for instance impossible and a
+%D dual interface would therefore give a strange mix of
+%D languages.
+%D
+%D Now let's work out the first scheme. Although the left hand
+%D of the assignment is a variable from the users point of
+%D view, it is a constant in terms of the system. Both
+%D \type{width} and \type{breedte} expand to \type{width}
+%D because in the source we only encounter \type{width}. Such
+%D system constants are presented as
+%D
+%D \starttypen
+%D \c!width
+%D \stoptypen
+%D
+%D This constant is always equivalent to \type{width}. As we
+%D can see, we use \type{c!} to mark this one as constant. Its
+%D dutch counterpart is:
+%D
+%D \starttypen
+%D \c!breedte
+%D \stoptypen
+%D
+%D When we interpret a setup command each variable is
+%D translated to it's \type{c!} counterpart. This means that
+%D \type{breedte} and \type{width} expand to \type{\c!breedte}
+%D and \type{\c!width} which both expand to \type{width}. That
+%D way user variables become system constants.
+%D
+%D The interpretation is done by means of a general setup
+%D command \type{\getparameters} that we introduced in the
+%D system module. Let us define some simple setup command:
+%D
+%D \starttypen
+%D \def\setupbox[#1]%
+%D {\getparameters[\??bx][#1]}
+%D \stoptypen
+%D
+%D This command can be used as:
+%D
+%D \starttypen
+%D \setupbox [width=3cm, height=1cm]
+%D \stoptypen
+%D
+%D Afterwards we have two variables \type{\@@bxwidth} and
+%D \type{\@@bxheight} which have the values \type{3cm} and
+%D \type{1cm} assigned. These variables are a combinatiom of
+%D the setup prefix \type{\??bx}, which expands to \type{@@bx}
+%D and the translated user supplied variables \type{width} and
+%D \type{height} or \type{breedte} and \type{hoogte},
+%D depending on the actual language. In dutch we just say:
+%D
+%D \starttypen
+%D \stelblokin [breedte=3cm, hoogte=1cm]
+%D \stoptypen
+%D
+%D and get ourselves \type{\@@bxwidth} and \type{\@@bxheight}
+%D too. In the source of \CONTEXT, we can recognize constants
+%D and variables on their leading \type{c!}, \type{v!} etc.,
+%D prefixes on \type{??} and composed variables on \type{@@}.
+%D
+%D We already saw that user supplied keywords need some
+%D special treatment too. This time we don't translate the
+%D keyword, but instead use in the source a variable which
+%D meaning depends on the interface language.
+%D
+%D \starttypen
+%D \v!left
+%D \stoptypen
+%D
+%D Which can be used in macro's like:
+%D
+%D \starttypen
+%D \processaction
+%D [\@@bxlocation]
+%D [ \v!left=>\dosomethingontheleft,
+%D \v!middle=>\dosomthinginthemiddle,
+%D \v!right=>\dosomethingontheright]
+%D \stoptypen
+%D
+%D Because variables like \type{\@@bxlocation} can have a lot
+%D of meanings, including tricky expandable tokens, we cannot
+%D translate this meaning when we compare. This means that
+%D \type{\@@bxlocation} can be \type{left} of \type{links} of
+%D whatever meaning suits the language. But because
+%D \type{\v!left} also has a meaning that suits the language,
+%D we are able to compare.
+%D
+%D Although we know it sounds confusing we want to state two
+%D important characteristics of the interface as described:
+%D
+%D \startsmaller \em
+%D user variables become system constants
+%D \stopsmaller
+%D
+%D and
+%D
+%D \startsmaller \em
+%D user constants (keywords) become system variables
+%D \stopsmaller
+%D
+
+%D \macros
+%D {startconstants,startvariables}
+%D {}
+%D
+%D It's time to introduce the macro's that are responsible for
+%D this translations process, but first we show how constants
+%D and variables are defined. We only show two languages and
+%D a few words.
+%D
+%D \starttypen
+%D \startconstants english dutch
+%D
+%D width: width breedte
+%D height: height hoogte
+%D
+%D \stopconstants
+%D \stoptypen
+%D
+%D Keep in mind that what users see as variables, are constants
+%D for the system.
+%D
+%D \starttypen
+%D \startvariables english dutch
+%D
+%D location: left links
+%D text: text tekst
+%D
+%D \stopvariables
+%D \stoptypen
+%D
+%D The macro's responsible for interpreting these setups are
+%D shared. They take care of empty lines and permit a more or
+%D less free format. All setups accept the keyword \type{all}
+%D which equals every language.
+
+\def\nointerfaceobject{-}
+
+\def\startinterfaceobjects#1#2%
+ {\!!counta=1
+ \let\dogetinterfaceobject\dogetinterfacetemplate
+ \let\dowithinterfaceelement#1%
+ \def\dodogetinterfaceobjects%
+ {\ifx\next#2%
+ \def\next####1%
+ {}%
+ \else\ifx\next\par
+ \long\def\next####1%
+ {\dogetinterfaceobjects}%
+ \else\ifx\next\empty
+ \def\next####1%
+ {\dogetinterfaceobjects}%
+ \else
+ \def\next####1 %
+ {\dogetinterfaceobject[####1:\relax]%
+ \dogetinterfaceobjects}%
+ \fi\fi\fi
+ \next}%
+ \def\dogetinterfaceobjects%
+ {\futurelet\next\dodogetinterfaceobjects}%
+ \dogetinterfaceobjects}
+
+\def\dogetinterfacetemplate[#1:#2]%
+ {\doifinsetelse{#1}{\currentinterface,all}
+ {\let\dogetinterfaceobject\doskipinterfaceobject}
+ {\advance\!!counta by 1\relax}}
+
+\def\doskipinterfaceobject[#1:#2#3]%
+ {\if#2:%
+ \let\dogetinterfaceobject\dogetinterfaceelement
+ \dogetinterfaceobject[#1:#2#3]%
+ \fi}
+
+\def\dogetinterfaceelement[#1:#2#3]%
+ {\ifx#2:%
+ \!!countb=0
+ \def\!!stringa{#1}%
+ \else
+ \advance\!!countb by 1
+ \ifnum\!!countb=\!!counta
+ \@EA\dowithinterfaceelement\@EA{\!!stringa}{#1}%
+ \let\dogetinterfaceobject\doskipinterfaceobject
+ \fi
+ \fi}
+
+%D The constants and variables are defined as described. When
+%D \type{\interfacetranslation} is \type{true}, we also
+%D generate a reverse translation. Because we don't want to put
+%D too big a burden on \TEX's hash table, this is no default
+%D behavior. Reverse translation is used in the commands that
+%D generate the quick reference cards. We are going to define
+%D the real \CONTEXT\ commands in an abstract way and generate
+%D those reference cards for each language without further
+%D interference.
+
+\def\setinterfaceconstant#1#2%
+ {\setvalue{\c!prefix!#1}{#1}%
+ \doifelse{#2}{\nointerfaceobject}
+ {\debuggerinfo{constant}{#1 defined as #1 by default}}
+ {\debuggerinfo{constant}{#1 defined as #2}%
+ \ifinterfacetranslation
+ \setvalue{\x!prefix!#1}{#2}%
+ \fi
+ \setvalue{\c!prefix!#2}{#1}}}
+
+\def\setinterfacevariable#1#2%
+ {\doifelse{#2}{\nointerfaceobject}
+ {\debuggerinfo{variable}{#1 defined as #1 by default}%
+ \setvalue{\v!prefix!#1}{#1}}
+ {\debuggerinfo{variable}{#1 defined as #2}%
+ \setvalue{\v!prefix!#1}{#2}}}
+
+\def\startvariables%
+ {\startinterfaceobjects\setinterfacevariable\stopvariables}
+
+\def\startconstants%
+ {\startinterfaceobjects\setinterfaceconstant\stopconstants}
+
+%D \macros
+%D {defineinterfaceconstant}
+%D
+%D Next we redefine a previously defined macro to take care of
+%D interface translation too. It's a bit redundant, because
+%D in thise situations we could use the c||version, but for
+%D documentation purposes the x||alternative comes in handy.
+
+\def\defineinterfaceconstant#1#2%
+ {\setvalue{\c!prefix!#1}{#2}%
+ \ifinterfacetranslation
+ \setvalue{\x!prefix!#1}{#2}%
+ \fi}
+
+%D \macros
+%D {startinterfacesetupconstant}
+%D {}
+%D
+%D The next command, \type{\startinterfacesetupconstant}, which
+%D behavior also depends on the boolean, is used for constants
+%D that are only needed in these quick reference macro's. The
+%D following, more efficient approach does not work here,
+%D because it sometimes generates spaces.
+%D
+%D \starttypen
+%D \def\setinterfacesetupconstant%
+%D {\ifinterfacetranslation
+%D \expandafter\setinterfaceconstant
+%D \fi}
+%D \stoptypen
+%D
+%D We therefore use the more redundant but robust method:
+
+\def\setinterfacesetupvariable#1#2%
+ {\ifinterfacetranslation
+ \doifelse{#2}{\nointerfaceobject}
+ {\setvalue{\y!prefix!#1}{#1}}
+ {\setvalue{\y!prefix!#1}{#2}}%
+ \fi}
+
+\def\startsetupvariables%
+ {\startinterfaceobjects\setinterfacesetupvariable\stopsetupvariables}
+
+%D \macros
+%D {startelements}
+%D {}
+%D
+%D Due to the object oriented nature of \CONTEXT, we also need
+%D to define the elements that are used to build commands:
+%D
+%D \starttypen
+%D \startelements english dutch
+%D
+%D beginvan: begin beginvan
+%D eindvan: end eindvan
+%D start: start start
+%D stop: stop stop
+%D
+%D \stopelements
+%D \stoptypen
+%D
+%D Such elements sometimes are the same in diferent
+%D languages, but mostly they differ. Things can get even
+%D confusing when we look at for instance the setup commands.
+%D In english we say \type{\setup<something>}, but in dutch we
+%D have: \type{\stel<iets>in}. Such split elements are no
+%D problem, because we just define two elements. When no second
+%D part is needed, we use a \type{-}:
+%D
+%D \starttypen
+%D \startelements english dutch
+%D
+%D setupa: setup stel
+%D setupb: - in
+%D
+%D \stopelements
+%D \stoptypen
+%D
+%D Element translation is realized by means of:
+
+\def\setinterfaceelement#1#2%
+ {\doifelse{#2}{\nointerfaceobject}
+ {\debuggerinfo{element}{#1 defined as <empty>}%
+ \resetvalue{\e!prefix!#1}}
+ {\doifdefinedelse{\e!prefix!#1}
+ {\doifnot{\getvalue{\e!prefix!#1}}{#2}
+ {\debuggerinfo{element}{#1 redefined as #2}%
+ \setvalue{\e!prefix!#1}{#2}}}
+ {\debuggerinfo{element}{#1 defined as #2}%
+ \setvalue{\e!prefix!#1}{#2}}}}
+
+\def\startelements%
+ {\startinterfaceobjects\setinterfaceelement\stopelements}
+
+%D \macros
+%D {startcommands}
+%D {}
+%D
+%D The last setup has to do with the commands themselve.
+%D Commands are defined as:
+%D
+%D \starttypen
+%D \startcommands english dutch
+%D
+%D starttekst: starttext starttekst
+%D stoptekst: stoptext stoptekst
+%D omlijnd: framed omlijnd
+%D margewoord: marginword margewoord
+%D
+%D \stopcommands
+%D \stoptypen
+%D
+%D Here we also have to take care of the optional translation
+%D needed for reference cards.
+
+\def\setinterfacecommand#1#2%
+ {\doifelse{#2}{\nointerfaceobject}
+ {\debuggerinfo{command}{no link to #1}%
+ \setinterfacesetupvariable{#1}{#1}}
+ {\doifelse{#1}{#2}
+ {\debuggerinfo{command}{#1 remains #1}}
+ {\doifdefinedelse{#2}
+ {\debuggerinfo{command}{core command #2 redefined as #1}}%
+ {\debuggerinfo{command}{#2 defined as #1}}%
+ \@EA\@EA\@EA\def\@EA\csname\@EA#2\@EA\endcsname
+ \@EA{\csname#1\endcsname}}%
+ \setinterfacesetupvariable{#1}{#2}}}
+
+\def\startcommands%
+ {\startinterfaceobjects\setinterfacecommand\stopcommands}
+
+%D \macros
+%D {getinterfaceconstant, getinterfacevariable}
+%D {}
+%D
+%D Generating the interface translation macro's that are used
+%D in the reference lists, is enabled by setting the boolean:
+%D
+%D \starttypen
+%D \interfacetranslationtrue
+%D \stoptypen
+%D
+%D Keep in mind that enabling interfacetranslation costs a
+%D bit of hash space.
+
+\newif\ifinterfacetranslation
+
+\def\getinterfaceconstant#1%
+ {\ifinterfacetranslation
+ \doifdefinedelse{\x!prefix!#1}
+ {\getvalue{\x!prefix!#1}}
+ {#1}%
+ \else
+ #1%
+ \fi}
+
+\def\getinterfacevariable#1%
+ {\ifinterfacetranslation
+ \doifdefinedelse{\y!prefix!#1}
+ {\getvalue{\y!prefix!#1}}
+ {#1}%
+ \else
+ #1%
+ \fi}
+
+%D When a reference list is generated, one does not need to
+%D generate a new format. Just reloading the relevant
+%D definition files suits:
+%D
+%D \starttypen
+%D \interfacetranslationtrue
+%D \input mult-con
+%D \input mult-com
+%D \stoptypen
+
+%D \macros
+%D {interfaced}
+%D {}
+%D
+%D The setup commands translate the constants automatically.
+%D When we want to translate 'by hand' we can use the simple
+%D but effective command:
+%D
+%D \starttypen
+%D \interfaced {something}
+%D \stoptypen
+%D
+%D Giving \type{\interfaced{breedte}} results in \type{width}
+%D or, when not defined, in \type{breedte} itself.
+
+\def\interfaced#1%
+ {\expandafter\ifx\csname\c!prefix!#1\endcsname\relax
+ #1%
+ \else
+ \csname\c!prefix!#1\endcsname
+ \fi}
+
+%D So much for the basic multi||lingual interface commands. The
+%D macro's can be enhanced with more testing facilities, but
+%D for the moment they suffice.
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex index fa45914a8..62bb7f858 100644 --- a/tex/context/base/mult-sys.tex +++ b/tex/context/base/mult-sys.tex @@ -1,574 +1,576 @@ -%D \module -%D [ file=mult-sys, -%D version=1996.06.01, -%D title=\CONTEXT\ Multilingual Macros, -%D subtitle=System, -%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. - -%D In boring module we define a lot of obscure but useful -%D system constants. By doing so we save lots of memory while -%D at the same time we prevent ourself from typing errors. - -\writestatus{loading}{Context Multilingual Macros / System} - -\unprotect - -%D The constants are grouped in such a way that there is a -%D minimal change of conflicts. -%D -%D \starttypen -%D \definesystemconstants {word} -%D \definemessageconstant {word} -%D \stoptypen -%D -%D This commands generate \type{\s!word} and \type{\m!word}. - -%D First we define some system constants used for both the -%D multi||lingual interface and multi||linguag typesetting. - -\definesystemconstant {dutch} \definesystemconstant {nl} -\definesystemconstant {english} \definesystemconstant {en} -\definesystemconstant {french} \definesystemconstant {fr} -\definesystemconstant {german} \definesystemconstant {de} -\definesystemconstant {spanish} \definesystemconstant {sp} -\definesystemconstant {italian} \definesystemconstant {it} -\definesystemconstant {danish} \definesystemconstant {da} -\definesystemconstant {portuguese} \definesystemconstant {pt} -\definesystemconstant {swedish} \definesystemconstant {sv} -\definesystemconstant {polish} \definesystemconstant {pl} -\definesystemconstant {finish} \definesystemconstant {fi} -\definesystemconstant {afrikaans} \definesystemconstant {af} -\definesystemconstant {norwegian} \definesystemconstant {no} -\definesystemconstant {turkish} \definesystemconstant {tr} - -%D As the name of their define command states, the next set of -%D constants is used in the message macro's. - -\definemessageconstant {colors} -\definemessageconstant {columns} -\definemessageconstant {figures} -\definemessageconstant {floatblocks} -\definemessageconstant {fonts} -\definemessageconstant {interactions} -\definemessageconstant {layouts} -\definemessageconstant {linguals} -\definemessageconstant {references} -\definemessageconstant {specials} -\definemessageconstant {structures} -\definemessageconstant {systems} -\definemessageconstant {textblocks} -\definemessageconstant {versions} - -%D The word \type{height} takes 6~token memory cells. The -%D control sequence \type{\height} on the other hand uses only -%D one. Knowing this, we can improve the performance of \TEX, -%D both is terms of speed and memory usage, by using control -%D sequences instead of the words written in full. -%D -%D Where in the \ASCII\ file the second lines takes nine extra -%D characters, \TEX\ saves us 13~tokens. -%D -%D \starttypen -%D \hrule width 10pt height 2pt depth 1pt -%D \hrule \!!width 10pt \!!height 2pt \!!depth 1pt -%D \stoptypen -%D -%D One condition is that we have defined \type{\!!height}, -%D \type{\!!width} and \type{\!!depth} as respectively -%D \type{height}, \type{width} and \type{depth}. Using this -%D scheme therefore only makes sense when a token sequence is -%D used more than once. Savings like this should of course be -%D implemented in english, just because \TEX\ is english. - -\def\!!width {width} -\def\!!height {height} -\def\!!depth {depth} - -\def\!!plus {plus} -\def\!!minus {minus} - -\def\!!fill {fill} - -%D The same goes for some \CONTEXT\ constants, used in the -%D definition of private commands: - -\definesystemconstant {next} -\definesystemconstant {pickup} - -\definesystemconstant {default} -\definesystemconstant {unknown} - -\definesystemconstant {action} -\definesystemconstant {compare} - -\definesystemconstant {do} -\definesystemconstant {dodo} - -\definesystemconstant {complex} -\definesystemconstant {simple} - -\definesystemconstant {start} -\definesystemconstant {stop} - -\definesystemconstant {dummy} - -\definesystemconstant {local} -\definesystemconstant {global} - -\definesystemconstant {done} - -%D A more experienced \TEX\ user will recognize the next four -%D constants. We need these because font-definitions are -%D partially english. - -\definesystemconstant {fam} -\definesystemconstant {text} -\definesystemconstant {script} -\definesystemconstant {scriptscript} - -\definesystemconstant {lefthyphenmin} -\definesystemconstant {righthyphenmin} - -\definesystemconstant {skewchar} -\definesystemconstant {hyphenchar} - -%D Just to be complete we define the standard \TEX\ units. - -\definesystemconstant {cm} -\definesystemconstant {em} -\definesystemconstant {ex} -\definesystemconstant {mm} -\definesystemconstant {pt} -\definesystemconstant {sp} -\definesystemconstant {in} - -%D These constants are used for internal and utility -%D commands. - -\definesystemconstant {check} -\definesystemconstant {reset} -\definesystemconstant {set} - -\definesystemconstant {entrya} -\definesystemconstant {entryb} -\definesystemconstant {entryc} -\definesystemconstant {entry} -\definesystemconstant {see} -\definesystemconstant {page} -\definesystemconstant {line} - -\definesystemconstant {synonym} - -\definesystemconstant {reference} -\definesystemconstant {main} - -\definesystemconstant {list} - -\definesystemconstant {item} -\definesystemconstant {itemcount} - -\definesystemconstant {number} -\definesystemconstant {references} -\definesystemconstant {between} -\definesystemconstant {format} -\definesystemconstant {old} - -\definesystemconstant {thisisblock} -\definesystemconstant {thiswasblock} - -\definesystemconstant {figurepreset} - -%D Some \CONTEXT\ commands take a two||pass aproach to -%D optimize the typesetting. Each two||pass object has its -%D own tag. - -\definesystemconstant {pass} - -\definesystemconstant {float} -\definesystemconstant {list} -\definesystemconstant {page} -\definesystemconstant {subpage} -\definesystemconstant {margin} -\definesystemconstant {profile} -\definesystemconstant {versionbegin} -\definesystemconstant {versionend} -\definesystemconstant {cross} -\definesystemconstant {paragraph} - -%D A lot of macros use tags to distinguish between different -%D objects, e.g. lists and registers. - -\definesystemconstant {prt} % part (deel) -\definesystemconstant {chp} % chapter (hoofdstuk) -\definesystemconstant {sec} % section (paragraaf) -\definesystemconstant {tit} % title (titel) -\definesystemconstant {sub} % subject (onderwerp) -\definesystemconstant {mar} % margin (marge) -\definesystemconstant {num} % number (doornummeren) -\definesystemconstant {def} % definition (doordefinieren) -\definesystemconstant {for} % formula (formule) -\definesystemconstant {fnt} % footnote (voetnoot) -\definesystemconstant {ind} % index (register) -\definesystemconstant {lin} % linked index -\definesystemconstant {lst} % list (opsomming) -\definesystemconstant {flt} % float (plaatsblok) -\definesystemconstant {pag} % page (pagina) -\definesystemconstant {txt} % text (tekst) -\definesystemconstant {ref} % reference (verwijzing) -\definesystemconstant {lab} % label (label) -\definesystemconstant {aut} % automatic (inhoud, index) -\definesystemconstant {vwa} % automatic (illustrations) -\definesystemconstant {vwb} % automatic (illustrations) - -\definesystemconstant {kop} % kop % still dutch - -%D Reference labels can be tagged by users, for instance by -%D means of \type{tag:}. The reference mechanism itself uses -%D some tags too. These are definitely not to be used by users. -%D Here they are: - -\definereferenceconstant {cross} {:c:} % cross reference -\definereferenceconstant {view} {:v:} % view reference -\definereferenceconstant {viewa} {:a:} % view reference test a -\definereferenceconstant {viewb} {:b:} % view reference test b -\definereferenceconstant {page} {:p:} % page referece -\definereferenceconstant {list} {:l:} % list reference -\definereferenceconstant {exec} {:e:} % execution reference -\definereferenceconstant {form} {:m:} % form reference -\definereferenceconstant {syst} {:s:} % system reference - -\definereferenceconstant {from} {:f:} % from list reference -\definereferenceconstant {to} {:t:} % to list reference - -\definereferenceconstant {object} {:o:} % tex objects -\definereferenceconstant {driver} {:d:} % driver objects - -\definereferenceconstant {java} {:j:} % java scripts - -%D When we use numbers and dimensions the same applies as -%D with the keywords like \type{width} and \type{plus} -%D mentioned earlier. - -\def\!!ten {10} -\def\!!twelve {12} -\def\!!hundred {100} -\def\!!thousand {1000} -\def\!!tenthousand {10000} -\def\!!maxcard {65536} -\def\!!medcard {32768} - -\def\!!zeropoint {0pt} -\def\!!onepoint {1pt} -\def\!!twopoint {2pt} -\def\!!threepoint {3pt} -\def\!!fourpoint {4pt} -\def\!!fivepoint {5pt} -\def\!!sixpoint {6pt} -\def\!!sevenpoint {7pt} -\def\!!eightpoint {8pt} -\def\!!ninepoint {9pt} -\def\!!tenpoint {10pt} -\def\!!elevenpoint {11pt} -\def\!!twelvepoint {12pt} -\def\!!fourteenpointfour {14.4pt} - -%D Variables are composed of a command specific tag and a user -%D supplied variable (system constant). The first tag \type{ag} -%D for instance is available as \type{\??ag} and expands to -%D \type{@@ag} in composed variables. - -% vervallen : hd hr hm vt vr vm tr tn te br bm bo on om or - -\definesystemvariable {ag} % AchterGrond -\definesystemvariable {al} % ALinea's -\definesystemvariable {am} % interActieMenu -\definesystemvariable {ba} % synchronisatieBAlk -\definesystemvariable {be} % startstop (BeginEnd) -\definesystemvariable {bj} % BlokJe -\definesystemvariable {bk} % Blokken (floats) -\definesystemvariable {bl} % BLanko -\definesystemvariable {bs} % SelecteerBlokken -\definesystemvariable {bt} % BuTton -\definesystemvariable {bu} % BUffer -\definesystemvariable {bv} % Brieven -\definesystemvariable {by} % Per -\definesystemvariable {ci} % CItaat -\definesystemvariable {cl} % kleur (CoLor setup) -\definesystemvariable {co} % COmbinaties -\definesystemvariable {cr} % kleur (ColoR) -\definesystemvariable {cv} % ConVersie -\definesystemvariable {dd} % DoorDefinieren -\definesystemvariable {de} % DEel -\definesystemvariable {dl} % DunneLijnen -\definesystemvariable {dn} % DoorNummeren -\definesystemvariable {do} % DefinieerOpmaak -\definesystemvariable {ds} % DoorSpringen -\definesystemvariable {ef} % ExternFiguur -\definesystemvariable {ep} % ExternfiguurPreset -\definesystemvariable {ex} % ExterneFiguren -\definesystemvariable {fg} % FiGuurmaten -\definesystemvariable {fi} % FIle -\definesystemvariable {fl} % Floats -\definesystemvariable {fm} % ForMules -\definesystemvariable {ft} % FonTs -\definesystemvariable {fp} % FilegroeP -\definesystemvariable {fs} % FileSynonym -\definesystemvariable {ia} % Interactie -\definesystemvariable {ib} % InteractieBalk -\definesystemvariable {id} % Index -\definesystemvariable {ih} % InHoudsopgave -\definesystemvariable {ii} % stelIndexIn -\definesystemvariable {il} % stelInvulRegelsin -\definesystemvariable {im} % InMarge -\definesystemvariable {in} % INspringen -\definesystemvariable {is} % Items -\definesystemvariable {it} % stelInTerliniein -\definesystemvariable {iv} % stelInvulLijnenin -\definesystemvariable {ka} % KAntlijn -\definesystemvariable {kd} % KaDerteksten -\definesystemvariable {kj} % KopJes (floats) -\definesystemvariable {kl} % KoLommen -\definesystemvariable {km} % KenMerk -\definesystemvariable {ko} % KOp(pen) -\definesystemvariable {kp} % KopPelteken -\definesystemvariable {kr} % KoRps -\definesystemvariable {kt} % KonTakten -\definesystemvariable {kw} % KontaktWaarde -\definesystemvariable {la} % LAnguage -\definesystemvariable {lg} % taal (LanGuage) -\definesystemvariable {li} % LIjst -\definesystemvariable {ln} % LijNen -\definesystemvariable {lo} % LOgos -\definesystemvariable {lt} % LiTeratuur -\definesystemvariable {ly} % LaYout -\definesystemvariable {ma} % MargeAchtergrond -\definesystemvariable {mb} % MargeBlokken -\definesystemvariable {mk} % MarKering -\definesystemvariable {nm} % Nummering -\definesystemvariable {np} % NaastPlaatsen -\definesystemvariable {nr} % Nummeren -\definesystemvariable {oi} % OmlijndInstellingen -\definesystemvariable {ol} % OmLijnd -\definesystemvariable {on} % ONderstreep -\definesystemvariable {oo} % OpsOmmingen -\definesystemvariable {op} % OPsomming -\definesystemvariable {op} % OPsomming -\definesystemvariable {os} % OffSet -\definesystemvariable {pa} % PAlet -\definesystemvariable {pb} % PuBlicatie -\definesystemvariable {pf} % ProFiel -\definesystemvariable {pg} % KoppelPagina -\definesystemvariable {pl} % PLaats -\definesystemvariable {pn} % PaginaNummer -\definesystemvariable {pp} % PaPier -\definesystemvariable {pr} % PRogrammas -\definesystemvariable {ps} % PoSitioneren -\definesystemvariable {rf} % ReFereren -\definesystemvariable {rg} % ReGel -\definesystemvariable {rl} % ReferentieLijst -\definesystemvariable {rn} % RegelNummer -\definesystemvariable {ro} % ROteren -\definesystemvariable {rs} % RaSters -\definesystemvariable {rt} % RoosTers -\definesystemvariable {rv} % ReserVeerfiguur -\definesystemvariable {sa} % ScAle -\definesystemvariable {sb} % SectieBlok -\definesystemvariable {sc} % SCherm -\definesystemvariable {se} % SEctie -\definesystemvariable {si} % SplIt -\definesystemvariable {sk} % SectieKop -\definesystemvariable {sl} % SmalLer -\definesystemvariable {sm} % SynonieMen -\definesystemvariable {sn} % SubNummer -\definesystemvariable {so} % SOrteren -\definesystemvariable {sp} % SelecteerPapier -\definesystemvariable {ss} % Symbool -\definesystemvariable {st} % STickers -\definesystemvariable {su} % SetUp -\definesystemvariable {sv} % SysteemVariabelen -\definesystemvariable {sy} % SYnchronisatie -\definesystemvariable {ta} % TAb -\definesystemvariable {tb} % TekstBlokken -\definesystemvariable {ti} % TabelInstellingen -\definesystemvariable {tk} % Teksten -\definesystemvariable {tl} % TekstLijnen -\definesystemvariable {tp} % TyPen -\definesystemvariable {tu} % TabUlatie -\definesystemvariable {ty} % TYpe -\definesystemvariable {ve} % VErsie -\definesystemvariable {vn} % VoetNoten -\definesystemvariable {wr} % WitRuimte -\definesystemvariable {xy} % schaal -\definesystemvariable {za} % ZetspiegelAanpassing - -%D Next we define some language independant one letter -%D variables and keywords. - -\defineinterfaceconstant {x} {x} % x offset -\defineinterfaceconstant {y} {y} % y offset -\defineinterfaceconstant {w} {w} % width -\defineinterfaceconstant {h} {h} % height -\defineinterfaceconstant {s} {s} % size -\defineinterfaceconstant {t} {t} % title -\defineinterfaceconstant {c} {c} % creator -\defineinterfaceconstant {e} {e} % extension -\defineinterfaceconstant {f} {f} % file - -\defineinterfaceconstant {a} {a} % kunnen weg -\defineinterfaceconstant {b} {b} % kunnen weg -\defineinterfaceconstant {c} {c} % kunnen weg -\defineinterfaceconstant {d} {d} % kunnen weg -\defineinterfaceconstant {e} {e} % kunnen weg - -\defineinterfaceconstant {r} {r} -\defineinterfaceconstant {g} {g} -\defineinterfaceconstant {b} {b} -\defineinterfaceconstant {c} {c} -\defineinterfaceconstant {m} {m} -\defineinterfaceconstant {y} {y} -\defineinterfaceconstant {k} {k} -\defineinterfaceconstant {s} {s} - -\defineinterfaceconstant {t} {t} -\defineinterfaceconstant {h} {h} -\defineinterfaceconstant {b} {b} - -\defineinterfaceconstant {rgb} {rgb} -\defineinterfaceconstant {cmyk} {cmyk} - -\defineinterfacevariable {rgb} {rgb} -\defineinterfacevariable {cmyk} {cmyk} -\defineinterfacevariable {gray} {k} - -%D The names of files and their extensions are fixed. -%D \CONTEXT\ uses as less files as possible. Utility files can -%D be recognized by the first two characters of the extension: -%D \type{tu}. - -\definefileconstant {utilityfilename} {texutil} - -\definefileconstant {blockextension} {tub} -\definefileconstant {figureextension} {tuf} -\definefileconstant {inputextension} {tui} -\definefileconstant {outputextension} {tuo} -\definefileconstant {temporaryextension} {tmp} -\definefileconstant {patternsextension} {pat} -\definefileconstant {hyphensextension} {hyp} - -%D These files are loaded at start||up. They may contain system -%D specific setups (or calls to other files), old macro's, to -%D garantee compatibility and new macro's noy yet present in -%D the format. - -\definefileconstant {sysfilename} {cont-sys} -\definefileconstant {oldfilename} {cont-old} -\definefileconstant {newfilename} {cont-new} -\definefileconstant {filfilename} {cont-fil} -\definefileconstant {optfilename} {cont-opt} - -%D The setup files for the language, font, color and special -%D subsystems have a common prefix. This means that we have at -%D most three characters for unique filenames. - -\definefileconstant {languageprefix} {lang-} -\definefileconstant {fontprefix} {font-} -\definefileconstant {colorprefix} {colo-} -\definefileconstant {specialprefix} {spec-} -\definefileconstant {moduleprefix} {m-} - -%D \CONTEXT\ follows different strategies for finding files. -%D The macros that are responsible for this 'clever' searching -%D make use of two (very important) path specifiers. - -\definefileconstant {currentpath} {.} -\definefileconstant {parentpath} {..} - -%D The way fonts are defined and called upon is language -%D independant. We follow the scheme laid down by Knuth in -%D Plain \TEX. We'll explain their meaning later. - -\defineinterfaceconstant {tf} {tf} -\defineinterfaceconstant {bf} {bf} -\defineinterfaceconstant {bs} {bs} -\defineinterfaceconstant {bi} {bi} -\defineinterfaceconstant {sl} {sl} -\defineinterfaceconstant {it} {it} -\defineinterfaceconstant {sc} {sc} -\defineinterfaceconstant {rm} {rm} -\defineinterfaceconstant {ss} {ss} -\defineinterfaceconstant {tt} {tt} -\defineinterfaceconstant {hw} {hw} -\defineinterfaceconstant {cg} {cg} -\defineinterfaceconstant {os} {os} -\defineinterfaceconstant {mm} {mm} -\defineinterfaceconstant {i} {i} -\defineinterfaceconstant {nn} {nn} - -\defineinterfaceconstant {x} {x} -\defineinterfaceconstant {xx} {xx} - -\defineinterfaceconstant {mi} {mi} -\defineinterfaceconstant {sy} {sy} -\defineinterfaceconstant {ex} {ex} -\defineinterfaceconstant {mr} {mr} - -\defineinterfaceconstant {ma} {ma} -\defineinterfaceconstant {mb} {mb} -\defineinterfaceconstant {mc} {mc} - -%D Finally we need: - -\defineinterfaceconstant {tif} {tif} -\defineinterfaceconstant {eps} {eps} - -%D A careful reader will have noticed that in the module -%D \type{mult-ini} we defined \type{\selectinterface}. We were -%D not yet able to actually select an interface, because we -%D still had to define the constants and variables. Now we've -%D done so, selection is permitted. - -\selectinterface - -%D And only after this selection is done, we can define -%D messages, otherwise the default language is in use. - -\ifinterfacetranslation \else - -\startmessages dutch library: check - title: controle - 1: '=' ontbreekt na '--' in regel -- - 2: -- argument(en) verwacht in regel -- - 3: -- -- vervangt een macro, gebruik HOOFDLETTERS! -\stopmessages - -\startmessages english library: check - title: check - 1: missing '=' after '--' in line -- - 2: -- argument(s) expected in line -- - 3: -- -- replaces a macro, use CAPITALS! -\stopmessages - -\startmessages german library: check - title: check - 1: Fehlendes '=' nach '--' in Zeile -- - 2: -- Argument(e) in Zeile -- erwartet - 3: -- -- ersetzt ein Makro, verwende VERSALIEN! -\stopmessages - -\fi - -%D Ok, here are some more, because we've got ouselves some -%D extensions to \CONTEXT. - -\definemessageconstant {addresses} -\definemessageconstant {documents} - -\protect - -\endinput +%D \module
+%D [ file=mult-sys,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=System,
+%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.
+
+%D In boring module we define a lot of obscure but useful
+%D system constants. By doing so we save lots of memory while
+%D at the same time we prevent ourself from typing errors.
+
+\writestatus{loading}{Context Multilingual Macros / System}
+
+\unprotect
+
+%D The constants are grouped in such a way that there is a
+%D minimal change of conflicts.
+%D
+%D \starttypen
+%D \definesystemconstants {word}
+%D \definemessageconstant {word}
+%D \stoptypen
+%D
+%D This commands generate \type{\s!word} and \type{\m!word}.
+
+%D First we define some system constants used for both the
+%D multi||lingual interface and multi||linguag typesetting.
+
+\definesystemconstant {dutch} \definesystemconstant {nl}
+\definesystemconstant {english} \definesystemconstant {en}
+\definesystemconstant {french} \definesystemconstant {fr}
+\definesystemconstant {german} \definesystemconstant {de}
+\definesystemconstant {spanish} \definesystemconstant {sp}
+\definesystemconstant {italian} \definesystemconstant {it}
+\definesystemconstant {danish} \definesystemconstant {da}
+\definesystemconstant {portuguese} \definesystemconstant {pt}
+\definesystemconstant {swedish} \definesystemconstant {sv}
+\definesystemconstant {polish} \definesystemconstant {pl}
+\definesystemconstant {finish} \definesystemconstant {fi}
+\definesystemconstant {afrikaans} \definesystemconstant {af}
+\definesystemconstant {norwegian} \definesystemconstant {no}
+\definesystemconstant {turkish} \definesystemconstant {tr}
+
+%D As the name of their define command states, the next set of
+%D constants is used in the message macro's.
+
+\definemessageconstant {colors}
+\definemessageconstant {columns}
+\definemessageconstant {figures}
+\definemessageconstant {floatblocks}
+\definemessageconstant {fonts}
+\definemessageconstant {interactions}
+\definemessageconstant {layouts}
+\definemessageconstant {linguals}
+\definemessageconstant {references}
+\definemessageconstant {specials}
+\definemessageconstant {structures}
+\definemessageconstant {systems}
+\definemessageconstant {textblocks}
+\definemessageconstant {versions}
+
+%D The word \type{height} takes 6~token memory cells. The
+%D control sequence \type{\height} on the other hand uses only
+%D one. Knowing this, we can improve the performance of \TEX,
+%D both is terms of speed and memory usage, by using control
+%D sequences instead of the words written in full.
+%D
+%D Where in the \ASCII\ file the second lines takes nine extra
+%D characters, \TEX\ saves us 13~tokens.
+%D
+%D \starttypen
+%D \hrule width 10pt height 2pt depth 1pt
+%D \hrule \!!width 10pt \!!height 2pt \!!depth 1pt
+%D \stoptypen
+%D
+%D One condition is that we have defined \type{\!!height},
+%D \type{\!!width} and \type{\!!depth} as respectively
+%D \type{height}, \type{width} and \type{depth}. Using this
+%D scheme therefore only makes sense when a token sequence is
+%D used more than once. Savings like this should of course be
+%D implemented in english, just because \TEX\ is english.
+
+\def\!!width {width}
+\def\!!height {height}
+\def\!!depth {depth}
+
+\def\!!plus {plus}
+\def\!!minus {minus}
+
+\def\!!fill {fill}
+
+%D The same goes for some \CONTEXT\ constants, used in the
+%D definition of private commands:
+
+\definesystemconstant {next}
+\definesystemconstant {pickup}
+
+\definesystemconstant {default}
+\definesystemconstant {unknown}
+
+\definesystemconstant {action}
+\definesystemconstant {compare}
+
+\definesystemconstant {do}
+\definesystemconstant {dodo}
+
+\definesystemconstant {complex}
+\definesystemconstant {simple}
+
+\definesystemconstant {start}
+\definesystemconstant {stop}
+
+\definesystemconstant {dummy}
+
+\definesystemconstant {local}
+\definesystemconstant {global}
+
+\definesystemconstant {done}
+
+%D A more experienced \TEX\ user will recognize the next four
+%D constants. We need these because font-definitions are
+%D partially english.
+
+\definesystemconstant {fam}
+\definesystemconstant {text}
+\definesystemconstant {script}
+\definesystemconstant {scriptscript}
+
+\definesystemconstant {lefthyphenmin}
+\definesystemconstant {righthyphenmin}
+
+\definesystemconstant {skewchar}
+\definesystemconstant {hyphenchar}
+
+%D Just to be complete we define the standard \TEX\ units.
+
+\definesystemconstant {cm}
+\definesystemconstant {em}
+\definesystemconstant {ex}
+\definesystemconstant {mm}
+\definesystemconstant {pt}
+\definesystemconstant {sp}
+\definesystemconstant {in}
+
+%D These constants are used for internal and utility
+%D commands.
+
+\definesystemconstant {check}
+\definesystemconstant {reset}
+\definesystemconstant {set}
+
+\definesystemconstant {entrya}
+\definesystemconstant {entryb}
+\definesystemconstant {entryc}
+\definesystemconstant {entry}
+\definesystemconstant {see}
+\definesystemconstant {page}
+\definesystemconstant {line}
+
+\definesystemconstant {synonym}
+
+\definesystemconstant {reference}
+\definesystemconstant {main}
+
+\definesystemconstant {list}
+
+\definesystemconstant {item}
+\definesystemconstant {itemcount}
+
+\definesystemconstant {number}
+\definesystemconstant {references}
+\definesystemconstant {between}
+\definesystemconstant {format}
+\definesystemconstant {old}
+
+\definesystemconstant {thisisblock}
+\definesystemconstant {thiswasblock}
+
+\definesystemconstant {figurepreset}
+
+%D Some \CONTEXT\ commands take a two||pass aproach to
+%D optimize the typesetting. Each two||pass object has its
+%D own tag.
+
+\definesystemconstant {pass}
+
+\definesystemconstant {float}
+\definesystemconstant {list}
+\definesystemconstant {page}
+\definesystemconstant {subpage}
+\definesystemconstant {margin}
+\definesystemconstant {profile}
+\definesystemconstant {versionbegin}
+\definesystemconstant {versionend}
+\definesystemconstant {cross}
+\definesystemconstant {paragraph}
+
+%D A lot of macros use tags to distinguish between different
+%D objects, e.g. lists and registers.
+
+\definesystemconstant {prt} % part (deel)
+\definesystemconstant {chp} % chapter (hoofdstuk)
+\definesystemconstant {sec} % section (paragraaf)
+\definesystemconstant {tit} % title (titel)
+\definesystemconstant {sub} % subject (onderwerp)
+\definesystemconstant {mar} % margin (marge)
+\definesystemconstant {num} % number (doornummeren)
+\definesystemconstant {def} % definition (doordefinieren)
+\definesystemconstant {for} % formula (formule)
+\definesystemconstant {fnt} % footnote (voetnoot)
+\definesystemconstant {ind} % index (register)
+\definesystemconstant {lin} % linked index
+\definesystemconstant {lst} % list (opsomming)
+\definesystemconstant {flt} % float (plaatsblok)
+\definesystemconstant {pag} % page (pagina)
+\definesystemconstant {txt} % text (tekst)
+\definesystemconstant {ref} % reference (verwijzing)
+\definesystemconstant {lab} % label (label)
+\definesystemconstant {aut} % automatic (inhoud, index)
+\definesystemconstant {vwa} % automatic (illustrations)
+\definesystemconstant {vwb} % automatic (illustrations)
+
+\definesystemconstant {kop} % kop % still dutch
+
+%D Reference labels can be tagged by users, for instance by
+%D means of \type{tag:}. The reference mechanism itself uses
+%D some tags too. These are definitely not to be used by users.
+%D Here they are:
+
+\definereferenceconstant {cross} {:c:} % cross reference
+\definereferenceconstant {view} {:v:} % view reference
+\definereferenceconstant {viewa} {:a:} % view reference test a
+\definereferenceconstant {viewb} {:b:} % view reference test b
+\definereferenceconstant {page} {:p:} % page referece
+\definereferenceconstant {list} {:l:} % list reference
+\definereferenceconstant {exec} {:e:} % execution reference
+\definereferenceconstant {form} {:m:} % form reference
+\definereferenceconstant {syst} {:s:} % system reference
+
+\definereferenceconstant {from} {:f:} % from list reference
+\definereferenceconstant {to} {:t:} % to list reference
+
+\definereferenceconstant {object} {:o:} % tex objects
+\definereferenceconstant {driver} {:d:} % driver objects
+
+\definereferenceconstant {java} {:j:} % java scripts
+
+%D When we use numbers and dimensions the same applies as
+%D with the keywords like \type{width} and \type{plus}
+%D mentioned earlier.
+
+\def\!!ten {10}
+\def\!!twelve {12}
+\def\!!hundred {100}
+\def\!!thousand {1000}
+\def\!!tenthousand {10000}
+\def\!!maxcard {65536}
+\def\!!medcard {32768}
+
+\def\!!zeropoint {0pt}
+\def\!!onepoint {1pt}
+\def\!!twopoint {2pt}
+\def\!!threepoint {3pt}
+\def\!!fourpoint {4pt}
+\def\!!fivepoint {5pt}
+\def\!!sixpoint {6pt}
+\def\!!sevenpoint {7pt}
+\def\!!eightpoint {8pt}
+\def\!!ninepoint {9pt}
+\def\!!tenpoint {10pt}
+\def\!!elevenpoint {11pt}
+\def\!!twelvepoint {12pt}
+\def\!!fourteenpointfour {14.4pt}
+
+%D Variables are composed of a command specific tag and a user
+%D supplied variable (system constant). The first tag \type{ag}
+%D for instance is available as \type{\??ag} and expands to
+%D \type{@@ag} in composed variables.
+
+% vervallen : hd hr hm vt vr vm tr tn te br bm bo on om or
+
+\definesystemvariable {ag} % AchterGrond
+\definesystemvariable {al} % ALinea's
+\definesystemvariable {am} % interActieMenu
+\definesystemvariable {ba} % synchronisatieBAlk
+\definesystemvariable {be} % startstop (BeginEnd)
+\definesystemvariable {bj} % BlokJe
+\definesystemvariable {bk} % Blokken (floats)
+\definesystemvariable {bl} % BLanko
+\definesystemvariable {bs} % SelecteerBlokken
+\definesystemvariable {bt} % BuTton
+\definesystemvariable {bu} % BUffer
+\definesystemvariable {bv} % Brieven
+\definesystemvariable {by} % Per
+\definesystemvariable {ci} % CItaat
+\definesystemvariable {cl} % kleur (CoLor setup)
+\definesystemvariable {co} % COmbinaties
+\definesystemvariable {cr} % kleur (ColoR)
+\definesystemvariable {cv} % ConVersie
+\definesystemvariable {dd} % DoorDefinieren
+\definesystemvariable {de} % DEel
+\definesystemvariable {dl} % DunneLijnen
+\definesystemvariable {dn} % DoorNummeren
+\definesystemvariable {do} % DefinieerOpmaak
+\definesystemvariable {ds} % DoorSpringen
+\definesystemvariable {ef} % ExternFiguur
+\definesystemvariable {ep} % ExternfiguurPreset
+\definesystemvariable {ex} % ExterneFiguren
+\definesystemvariable {fg} % FiGuurmaten
+\definesystemvariable {fi} % FIle
+\definesystemvariable {fl} % Floats
+\definesystemvariable {fm} % ForMules
+\definesystemvariable {ft} % FonTs
+\definesystemvariable {fp} % FilegroeP
+\definesystemvariable {fs} % FileSynonym
+\definesystemvariable {ia} % Interactie
+\definesystemvariable {ib} % InteractieBalk
+\definesystemvariable {id} % Index
+\definesystemvariable {ih} % InHoudsopgave
+\definesystemvariable {ii} % stelIndexIn
+\definesystemvariable {il} % stelInvulRegelsin
+\definesystemvariable {im} % InMarge
+\definesystemvariable {in} % INspringen
+\definesystemvariable {is} % Items
+\definesystemvariable {it} % stelInTerliniein
+\definesystemvariable {iv} % stelInvulLijnenin
+\definesystemvariable {ka} % KAntlijn
+\definesystemvariable {kd} % KaDerteksten
+\definesystemvariable {kj} % KopJes (floats)
+\definesystemvariable {kl} % KoLommen
+\definesystemvariable {km} % KenMerk
+\definesystemvariable {ko} % KOp(pen)
+\definesystemvariable {kp} % KopPelteken
+\definesystemvariable {kr} % KoRps
+\definesystemvariable {kt} % KonTakten
+\definesystemvariable {kw} % KontaktWaarde
+\definesystemvariable {la} % LAnguage
+\definesystemvariable {lg} % taal (LanGuage)
+\definesystemvariable {li} % LIjst
+\definesystemvariable {ln} % LijNen
+\definesystemvariable {lo} % LOgos
+\definesystemvariable {lt} % LiTeratuur
+\definesystemvariable {ly} % LaYout
+\definesystemvariable {ma} % MargeAchtergrond
+\definesystemvariable {mb} % MargeBlokken
+\definesystemvariable {mk} % MarKering
+\definesystemvariable {nm} % Nummering
+\definesystemvariable {np} % NaastPlaatsen
+\definesystemvariable {nr} % Nummeren
+\definesystemvariable {oi} % OmlijndInstellingen
+\definesystemvariable {ol} % OmLijnd
+\definesystemvariable {on} % ONderstreep
+\definesystemvariable {oo} % OpsOmmingen
+\definesystemvariable {op} % OPsomming
+\definesystemvariable {op} % OPsomming
+\definesystemvariable {os} % OffSet
+\definesystemvariable {pa} % PAlet
+\definesystemvariable {pb} % PuBlicatie
+\definesystemvariable {pf} % ProFiel
+\definesystemvariable {pg} % KoppelPagina
+\definesystemvariable {pl} % PLaats
+\definesystemvariable {pn} % PaginaNummer
+\definesystemvariable {pp} % PaPier
+\definesystemvariable {pr} % PRogrammas
+\definesystemvariable {ps} % PoSitioneren
+\definesystemvariable {rf} % ReFereren
+\definesystemvariable {rg} % ReGel
+\definesystemvariable {rl} % ReferentieLijst
+\definesystemvariable {rn} % RegelNummer
+\definesystemvariable {ro} % ROteren
+\definesystemvariable {rs} % RaSters
+\definesystemvariable {rt} % RoosTers
+\definesystemvariable {rv} % ReserVeerfiguur
+\definesystemvariable {sa} % ScAle
+\definesystemvariable {sb} % SectieBlok
+\definesystemvariable {sc} % SCherm
+\definesystemvariable {se} % SEctie
+\definesystemvariable {si} % SplIt
+\definesystemvariable {sk} % SectieKop
+\definesystemvariable {sl} % SmalLer
+\definesystemvariable {sm} % SynonieMen
+\definesystemvariable {sn} % SubNummer
+\definesystemvariable {so} % SOrteren
+\definesystemvariable {sp} % SelecteerPapier
+\definesystemvariable {ss} % Symbool
+\definesystemvariable {st} % STickers
+\definesystemvariable {su} % SetUp
+\definesystemvariable {sv} % SysteemVariabelen
+\definesystemvariable {sy} % SYnchronisatie
+\definesystemvariable {ta} % TAb
+\definesystemvariable {tb} % TekstBlokken
+\definesystemvariable {ti} % TabelInstellingen
+\definesystemvariable {tk} % Teksten
+\definesystemvariable {tl} % TekstLijnen
+\definesystemvariable {tp} % TyPen
+\definesystemvariable {tu} % TabUlatie
+\definesystemvariable {ty} % TYpe
+\definesystemvariable {ve} % VErsie
+\definesystemvariable {vn} % VoetNoten
+\definesystemvariable {wr} % WitRuimte
+\definesystemvariable {xy} % schaal
+\definesystemvariable {za} % ZetspiegelAanpassing
+
+%D Next we define some language independant one letter
+%D variables and keywords.
+
+\defineinterfaceconstant {x} {x} % x offset
+\defineinterfaceconstant {y} {y} % y offset
+\defineinterfaceconstant {w} {w} % width
+\defineinterfaceconstant {h} {h} % height
+\defineinterfaceconstant {s} {s} % size
+\defineinterfaceconstant {t} {t} % title
+\defineinterfaceconstant {c} {c} % creator
+\defineinterfaceconstant {e} {e} % extension
+\defineinterfaceconstant {f} {f} % file
+
+\defineinterfaceconstant {a} {a} % kunnen weg
+\defineinterfaceconstant {b} {b} % kunnen weg
+\defineinterfaceconstant {c} {c} % kunnen weg
+\defineinterfaceconstant {d} {d} % kunnen weg
+\defineinterfaceconstant {e} {e} % kunnen weg
+
+\defineinterfaceconstant {r} {r}
+\defineinterfaceconstant {g} {g}
+\defineinterfaceconstant {b} {b}
+\defineinterfaceconstant {c} {c}
+\defineinterfaceconstant {m} {m}
+\defineinterfaceconstant {y} {y}
+\defineinterfaceconstant {k} {k}
+\defineinterfaceconstant {s} {s}
+
+\defineinterfaceconstant {t} {t}
+\defineinterfaceconstant {h} {h}
+\defineinterfaceconstant {b} {b}
+
+\defineinterfaceconstant {rgb} {rgb}
+\defineinterfaceconstant {cmyk} {cmyk}
+
+\defineinterfacevariable {rgb} {rgb}
+\defineinterfacevariable {cmyk} {cmyk}
+\defineinterfacevariable {gray} {k}
+
+%D The names of files and their extensions are fixed.
+%D \CONTEXT\ uses as less files as possible. Utility files can
+%D be recognized by the first two characters of the extension:
+%D \type{tu}.
+
+\definefileconstant {utilityfilename} {texutil}
+
+\definefileconstant {blockextension} {tub}
+\definefileconstant {figureextension} {tuf}
+\definefileconstant {inputextension} {tui}
+\definefileconstant {outputextension} {tuo}
+\definefileconstant {temporaryextension} {tmp}
+\definefileconstant {patternsextension} {pat}
+\definefileconstant {hyphensextension} {hyp}
+
+%D These files are loaded at start||up. They may contain system
+%D specific setups (or calls to other files), old macro's, to
+%D garantee compatibility and new macro's noy yet present in
+%D the format.
+
+\definefileconstant {sysfilename} {cont-sys}
+\definefileconstant {oldfilename} {cont-old}
+\definefileconstant {newfilename} {cont-new}
+\definefileconstant {filfilename} {cont-fil}
+\definefileconstant {optfilename} {cont-opt}
+
+%D The setup files for the language, font, color and special
+%D subsystems have a common prefix. This means that we have at
+%D most three characters for unique filenames.
+
+\definefileconstant {languageprefix} {lang-}
+\definefileconstant {fontprefix} {font-}
+\definefileconstant {colorprefix} {colo-}
+\definefileconstant {specialprefix} {spec-}
+\definefileconstant {moduleprefix} {m-}
+\definefileconstant {styleprefix} {s-}
+
+%D \CONTEXT\ follows different strategies for finding files.
+%D The macros that are responsible for this 'clever' searching
+%D make use of two (very important) path specifiers.
+
+\definefileconstant {currentpath} {.}
+\definefileconstant {parentpath} {..}
+
+%D The way fonts are defined and called upon is language
+%D independant. We follow the scheme laid down by Knuth in
+%D Plain \TEX. We'll explain their meaning later.
+
+\defineinterfaceconstant {tf} {tf}
+\defineinterfaceconstant {bf} {bf}
+\defineinterfaceconstant {bs} {bs}
+\defineinterfaceconstant {bi} {bi}
+\defineinterfaceconstant {sl} {sl}
+\defineinterfaceconstant {it} {it}
+\defineinterfaceconstant {sc} {sc}
+\defineinterfaceconstant {rm} {rm}
+\defineinterfaceconstant {ss} {ss}
+\defineinterfaceconstant {tt} {tt}
+\defineinterfaceconstant {hw} {hw}
+\defineinterfaceconstant {cg} {cg}
+\defineinterfaceconstant {os} {os}
+\defineinterfaceconstant {mm} {mm}
+\defineinterfaceconstant {i} {i}
+\defineinterfaceconstant {nn} {nn}
+
+\defineinterfaceconstant {x} {x}
+\defineinterfaceconstant {xx} {xx}
+
+\defineinterfaceconstant {mi} {mi}
+\defineinterfaceconstant {sy} {sy}
+\defineinterfaceconstant {ex} {ex}
+\defineinterfaceconstant {mr} {mr}
+
+\defineinterfaceconstant {ma} {ma}
+\defineinterfaceconstant {mb} {mb}
+\defineinterfaceconstant {mc} {mc}
+
+%D Finally we need:
+
+\defineinterfaceconstant {tif} {tif}
+\defineinterfaceconstant {eps} {eps}
+
+%D A careful reader will have noticed that in the module
+%D \type{mult-ini} we defined \type{\selectinterface}. We were
+%D not yet able to actually select an interface, because we
+%D still had to define the constants and variables. Now we've
+%D done so, selection is permitted.
+
+\selectinterface
+
+%D And only after this selection is done, we can define
+%D messages, otherwise the default language is in use.
+
+\ifinterfacetranslation \else
+
+\startmessages dutch library: check
+ title: controle
+ 1: '=' ontbreekt na '--' in regel --
+ 2: -- argument(en) verwacht in regel --
+ 3: -- -- vervangt een macro, gebruik HOOFDLETTERS!
+\stopmessages
+
+\startmessages english library: check
+ title: check
+ 1: missing '=' after '--' in line --
+ 2: -- argument(s) expected in line --
+ 3: -- -- replaces a macro, use CAPITALS!
+\stopmessages
+
+\startmessages german library: check
+ title: check
+ 1: Fehlendes '=' nach '--' in Zeile --
+ 2: -- Argument(e) in Zeile -- erwartet
+ 3: -- -- ersetzt ein Makro, verwende VERSALIEN!
+\stopmessages
+
+\fi
+
+%D Ok, here are some more, because we've got ouselves some
+%D extensions to \CONTEXT.
+
+\definemessageconstant {addresses}
+\definemessageconstant {documents}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/plain.tex b/tex/context/base/plain.tex new file mode 100644 index 000000000..6a1e5acbc --- /dev/null +++ b/tex/context/base/plain.tex @@ -0,0 +1,1236 @@ +% This is the plain TeX format that's described in The TeXbook.
+% N.B.: A version number is defined at the very end of this file;
+% please change that number whenever the file is modified!
+% And don't modify the file under any circumstances.
+
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\$=3 % dollar sign is math shift
+\catcode`\&=4 % ampersand is alignment tab
+\catcode`\#=6 % hash mark is macro parameter character
+\catcode`\^=7 \catcode`\^^K=7 % circumflex and uparrow are for superscripts
+\catcode`\_=8 \catcode`\^^A=8 % underline and downarrow are for subscripts
+\catcode`\^^I=10 % ascii tab is a blank space
+\chardef\active=13 \catcode`\~=\active % tilde is active
+\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par"
+
+\message{Preloading the plain format: codes,}
+
+% We had to define the \catcodes right away, before the message line,
+% since \message uses the { and } characters.
+% When INITEX (the TeX initializer) starts up,
+% it has defined the following \catcode values:
+% \catcode`\^^@=9 % ascii null is ignored
+% \catcode`\^^M=5 % ascii return is end-line
+% \catcode`\\=0 % backslash is TeX escape character
+% \catcode`\%=14 % percent sign is comment character
+% \catcode`\ =10 % ascii space is blank space
+% \catcode`\^^?=15 % ascii delete is invalid
+% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters
+% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters
+% all others are type 12 (other)
+
+% Here is a list of the characters that have been specially catcoded:
+\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+% (not counting ascii null, tab, linefeed, formfeed, return, delete)
+% Each symbol in the list is preceded by \do, which can be defined
+% if you want to do something to every item in the list.
+
+% We make @ signs act like letters, temporarily, to avoid conflict
+% between user names and internal control sequences of plain format.
+\catcode`@=11
+
+% INITEX sets up \mathcode x=x, for x=0..255, except that
+% \mathcode x=x+"7100, for x = `A to `Z and `a to `z;
+% \mathcode x=x+"7000, for x = `0 to `9.
+% The following changes define internal codes as recommended
+% in Appendix C of The TeXbook:
+\mathcode`\^^@="2201 % \cdot
+\mathcode`\^^A="3223 % \downarrow
+\mathcode`\^^B="010B % \alpha
+\mathcode`\^^C="010C % \beta
+\mathcode`\^^D="225E % \land
+\mathcode`\^^E="023A % \lnot
+\mathcode`\^^F="3232 % \in
+\mathcode`\^^G="0119 % \pi
+\mathcode`\^^H="0115 % \lambda
+\mathcode`\^^I="010D % \gamma
+\mathcode`\^^J="010E % \delta
+\mathcode`\^^K="3222 % \uparrow
+\mathcode`\^^L="2206 % \pm
+\mathcode`\^^M="2208 % \oplus
+\mathcode`\^^N="0231 % \infty
+\mathcode`\^^O="0140 % \partial
+\mathcode`\^^P="321A % \subset
+\mathcode`\^^Q="321B % \supset
+\mathcode`\^^R="225C % \cap
+\mathcode`\^^S="225B % \cup
+\mathcode`\^^T="0238 % \forall
+\mathcode`\^^U="0239 % \exists
+\mathcode`\^^V="220A % \otimes
+\mathcode`\^^W="3224 % \leftrightarrow
+\mathcode`\^^X="3220 % \leftarrow
+\mathcode`\^^Y="3221 % \rightarrow
+\mathcode`\^^Z="8000 % \ne
+\mathcode`\^^[="2205 % \diamond
+\mathcode`\^^\="3214 % \le
+\mathcode`\^^]="3215 % \ge
+\mathcode`\^^^="3211 % \equiv
+\mathcode`\^^_="225F % \lor
+\mathcode`\ ="8000 % \space
+\mathcode`\!="5021
+\mathcode`\'="8000 % ^\prime
+\mathcode`\(="4028
+\mathcode`\)="5029
+\mathcode`\*="2203 % \ast
+\mathcode`\+="202B
+\mathcode`\,="613B
+\mathcode`\-="2200
+\mathcode`\.="013A
+\mathcode`\/="013D
+\mathcode`\:="303A
+\mathcode`\;="603B
+\mathcode`\<="313C
+\mathcode`\=="303D
+\mathcode`\>="313E
+\mathcode`\?="503F
+\mathcode`\[="405B
+\mathcode`\\="026E % \backslash
+\mathcode`\]="505D
+\mathcode`\_="8000 % \_
+\mathcode`\{="4266
+\mathcode`\|="026A
+\mathcode`\}="5267
+\mathcode`\^^?="1273 % \smallint
+
+% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x,
+% and \lccode`x=`x, \lccode`X=`x; all other values are zero.
+% No changes to those tables are needed in plain TeX format.
+
+% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999
+% for uppercase letters. The following changes are needed:
+\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0
+% The \nonfrenchspacing macro will make further changes to \sfcode values.
+
+% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0
+\delcode`\(="028300
+\delcode`\)="029301
+\delcode`\[="05B302
+\delcode`\]="05D303
+\delcode`\<="26830A
+\delcode`\>="26930B
+\delcode`\/="02F30E
+\delcode`\|="26A30C
+\delcode`\\="26E30F
+% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails!
+
+% To make the plain macros more efficient in time and space,
+% several constant values are declared here as control sequences.
+% If they were changed, anything could happen; so they are private symbols.
+\chardef\@ne=1
+\chardef\tw@=2
+\chardef\thr@@=3
+\chardef\sixt@@n=16
+\chardef\@cclv=255
+\mathchardef\@cclvi=256
+\mathchardef\@m=1000
+\mathchardef\@M=10000
+\mathchardef\@MM=20000
+
+% Allocation of registers
+
+% Here are macros for the automatic allocation of \count, \box, \dimen,
+% \skip, \muskip, and \toks registers, as well as \read and \write
+% stream numbers, \fam codes, \language codes, and \insert numbers.
+
+\message{registers,}
+
+% When a register is used only temporarily, it need not be allocated;
+% grouping can be used, making the value previously in the register return
+% after the close of the group. The main use of these macros is for
+% registers that are defined by one macro and used by others, possibly at
+% different nesting levels. All such registers should be defined through
+% these macros; otherwise conflicts may occur, especially when two or more
+% more macro packages are being used at once.
+
+% The following counters are reserved:
+% 0 to 9 page numbering
+% 10 count allocation
+% 11 dimen allocation
+% 12 skip allocation
+% 13 muskip allocation
+% 14 box allocation
+% 15 toks allocation
+% 16 read file allocation
+% 17 write file allocation
+% 18 math family allocation
+% 19 language allocation
+% 20 insert allocation
+% 21 the most recently allocated number
+% 22 constant -1
+% New counters are allocated starting with 23, 24, etc. Other registers are
+% allocated starting with 10. This leaves 0 through 9 for the user to play
+% with safely, except that counts 0 to 9 are considered to be the page and
+% subpage numbers (since they are displayed during output). In this scheme,
+% \count 10 always contains the number of the highest-numbered counter that
+% has been allocated, \count 14 the highest-numbered box, etc.
+% Inserts are given numbers 254, 253, etc., since they require a \count,
+% \dimen, \skip, and \box all with the same number; \count 20 contains the
+% lowest-numbered insert that has been allocated. Of course, \box255 is
+% reserved for \output; \count255, \dimen255, and \skip255 can be used freely.
+
+% It is recommended that macro designers always use
+% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and
+% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255.
+% This will prevent ``save stack buildup'' that might otherwise occur.
+
+\count10=22 % allocates \count registers 23, 24, ...
+\count11=9 % allocates \dimen registers 10, 11, ...
+\count12=9 % allocates \skip registers 10, 11, ...
+\count13=9 % allocates \muskip registers 10, 11, ...
+\count14=9 % allocates \box registers 10, 11, ...
+\count15=9 % allocates \toks registers 10, 11, ...
+\count16=-1 % allocates input streams 0, 1, ...
+\count17=-1 % allocates output streams 0, 1, ...
+\count18=3 % allocates math families 4, 5, ...
+\count19=0 % allocates \language codes 1, 2, ...
+\count20=255 % allocates insertions 254, 253, ...
+\countdef\insc@unt=20 % the insertion counter
+\countdef\allocationnumber=21 % the most recent allocation
+\countdef\m@ne=22 \m@ne=-1 % a handy constant
+\def\wlog{\immediate\write\m@ne} % write on log file (only)
+
+% Here are abbreviations for the names of scratch registers
+% that don't need to be allocated.
+
+\countdef\count@=255
+\dimendef\dimen@=0
+\dimendef\dimen@i=1 % global only
+\dimendef\dimen@ii=2
+\skipdef\skip@=0
+\toksdef\toks@=0
+
+% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo
+% and \foo will be defined (with \countdef) to be the next counter.
+% To find out which counter \foo is, you can look at \allocationnumber.
+% Since there's no \boxdef command, \chardef is used to define a \newbox,
+% \newinsert, \newfam, and so on.
+
+\outer\def\newcount{\alloc@0\count\countdef\insc@unt}
+\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
+\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt}
+\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi}
+\outer\def\newbox{\alloc@4\box\chardef\insc@unt}
+\let\newtoks=\relax % we do this to allow plain.tex to be read in twice
+\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
+\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
+\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n}
+\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi}
+\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
+ \ch@ck#1#4#2% make sure there's still room
+ \allocationnumber=\count1#1%
+ \global#3#5=\allocationnumber
+ \wlog{\string#5=\string#2\the\allocationnumber}}
+\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne
+ \ch@ck0\insc@unt\count
+ \ch@ck1\insc@unt\dimen
+ \ch@ck2\insc@unt\skip
+ \ch@ck4\insc@unt\box
+ \allocationnumber=\insc@unt
+ \global\chardef#1=\allocationnumber
+ \wlog{\string#1=\string\insert\the\allocationnumber}}
+\def\ch@ck#1#2#3{\ifnum\count1#1<#2%
+ \else\errmessage{No room for a new #3}\fi}
+
+% Here are some examples of allocation.
+\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen>
+\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow
+\newskip\centering \centering=0pt plus 1000pt minus 1000pt
+\newdimen\p@ \p@=1pt % this saves macro space and time
+\newdimen\z@ \z@=0pt % can be used both for 0pt and 0
+\newskip\z@skip \z@skip=0pt plus0pt minus0pt
+\newbox\voidb@x % permanently void box register
+
+% And here's a different sort of allocation:
+% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo.
+\outer\def\newif#1{\count@\escapechar \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}%
+ \@if#1{false}\escapechar\count@} % the condition starts out false
+\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
+{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required
+
+% Assign initial values to TeX's parameters
+
+\message{parameters,}
+
+% All of TeX's numeric parameters are listed here,
+% but the code is commented out if no special value needs to be set.
+% INITEX makes all parameters zero except where noted.
+
+\pretolerance=100
+\tolerance=200 % INITEX sets this to 10000
+\hbadness=1000
+\vbadness=1000
+\linepenalty=10
+\hyphenpenalty=50
+\exhyphenpenalty=50
+\binoppenalty=700
+\relpenalty=500
+\clubpenalty=150
+\widowpenalty=150
+\displaywidowpenalty=50
+\brokenpenalty=100
+\predisplaypenalty=10000
+% \postdisplaypenalty=0
+% \interlinepenalty=0
+% \floatingpenalty=0, set during \insert
+% \outputpenalty=0, set before TeX enters \output
+\doublehyphendemerits=10000
+\finalhyphendemerits=5000
+\adjdemerits=10000
+% \looseness=0, cleared by TeX after each paragraph
+% \pausing=0
+% \holdinginserts=0
+% \tracingonline=0
+% \tracingmacros=0
+% \tracingstats=0
+% \tracingparagraphs=0
+% \tracingpages=0
+% \tracingoutput=0
+\tracinglostchars=1
+% \tracingcommands=0
+% \tracingrestores=0
+% \language=0
+\uchyph=1
+% \lefthyphenmin=2 \righthyphenmin=3 set below
+% \globaldefs=0
+% \maxdeadcycles=25 % INITEX does this
+% \hangafter=1 % INITEX does this, also TeX after each paragraph
+% \fam=0
+% \mag=1000 % INITEX does this
+% \escapechar=`\\ % INITEX does this
+\defaulthyphenchar=`\-
+\defaultskewchar=-1
+% \endlinechar=`\^^M % INITEX does this
+\newlinechar=-1
+\delimiterfactor=901
+% \time=now % TeX does this at beginning of job
+% \day=now % TeX does this at beginning of job
+% \month=now % TeX does this at beginning of job
+% \year=now % TeX does this at beginning of job
+\showboxbreadth=5
+\showboxdepth=3
+\errorcontextlines=5
+
+\hfuzz=0.1pt
+\vfuzz=0.1pt
+\overfullrule=5pt
+\hsize=6.5in
+\vsize=8.9in
+\maxdepth=4pt
+\splitmaxdepth=\maxdimen
+\boxmaxdepth=\maxdimen
+% \lineskiplimit=0pt, changed by \normalbaselines
+\delimitershortfall=5pt
+\nulldelimiterspace=1.2pt
+\scriptspace=0.5pt
+% \mathsurround=0pt
+% \predisplaysize=0pt, set before TeX enters $$
+% \displaywidth=0pt, set before TeX enters $$
+% \displayindent=0pt, set before TeX enters $$
+\parindent=20pt
+% \hangindent=0pt, zeroed by TeX after each paragraph
+% \hoffset=0pt
+% \voffset=0pt
+
+% \baselineskip=0pt, changed by \normalbaselines
+% \lineskip=0pt, changed by \normalbaselines
+\parskip=0pt plus 1pt
+\abovedisplayskip=12pt plus 3pt minus 9pt
+\abovedisplayshortskip=0pt plus 3pt
+\belowdisplayskip=12pt plus 3pt minus 9pt
+\belowdisplayshortskip=7pt plus 3pt minus 4pt
+% \leftskip=0pt
+% \rightskip=0pt
+\topskip=10pt
+\splittopskip=10pt
+% \tabskip=0pt
+% \spaceskip=0pt
+% \xspaceskip=0pt
+\parfillskip=0pt plus 1fil
+
+\thinmuskip=3mu
+\medmuskip=4mu plus 2mu minus 4mu
+\thickmuskip=5mu plus 5mu
+
+% We also define special registers that function like parameters:
+\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt
+\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt
+\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt
+\newskip\normalbaselineskip \normalbaselineskip=12pt
+\newskip\normallineskip \normallineskip=1pt
+\newdimen\normallineskiplimit \normallineskiplimit=0pt
+\newdimen\jot \jot=3pt
+\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100
+\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100
+
+% Definitions for preloaded fonts
+
+\def\magstephalf{1095 }
+\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax}
+
+% Fonts assigned to \preloaded are not part of "plain TeX",
+% but they are preloaded so that other format packages can use them.
+% For example, if another set of macros says "\font\ninerm=cmr9",
+% TeX will not have to reload the font metric information for cmr9.
+
+\message{fonts,}
+
+\font\tenrm=cmr10 % roman text
+\font\preloaded=cmr9
+\font\preloaded=cmr8
+\font\sevenrm=cmr7
+\font\preloaded=cmr6
+\font\fiverm=cmr5
+
+\font\teni=cmmi10 % math italic
+\font\preloaded=cmmi9
+\font\preloaded=cmmi8
+\font\seveni=cmmi7
+\font\preloaded=cmmi6
+\font\fivei=cmmi5
+
+\font\tensy=cmsy10 % math symbols
+\font\preloaded=cmsy9
+\font\preloaded=cmsy8
+\font\sevensy=cmsy7
+\font\preloaded=cmsy6
+\font\fivesy=cmsy5
+
+\font\tenex=cmex10 % math extension
+
+\font\preloaded=cmss10 % sans serif
+\font\preloaded=cmssq8
+
+\font\preloaded=cmssi10 % sans serif italic
+\font\preloaded=cmssqi8
+
+\font\tenbf=cmbx10 % boldface extended
+\font\preloaded=cmbx9
+\font\preloaded=cmbx8
+\font\sevenbf=cmbx7
+\font\preloaded=cmbx6
+\font\fivebf=cmbx5
+
+\font\tentt=cmtt10 % typewriter
+\font\preloaded=cmtt9
+\font\preloaded=cmtt8
+
+\font\preloaded=cmsltt10 % slanted typewriter
+
+\font\tensl=cmsl10 % slanted roman
+\font\preloaded=cmsl9
+\font\preloaded=cmsl8
+
+\font\tenit=cmti10 % text italic
+\font\preloaded=cmti9
+\font\preloaded=cmti8
+\font\preloaded=cmti7
+
+\message{more fonts,}
+\font\preloaded=cmu10 % unslanted text italic
+
+\font\preloaded=cmmib10 % bold math italic
+\font\preloaded=cmbsy10 % bold math symbols
+
+\font\preloaded=cmcsc10 % caps and small caps
+
+\font\preloaded=cmssbx10 % sans serif bold extended
+
+\font\preloaded=cmdunh10 % Dunhill style
+
+\font\preloaded=cmr7 scaled \magstep4 % for titles
+\font\preloaded=cmtt10 scaled \magstep2
+\font\preloaded=cmssbx10 scaled \magstep2
+
+\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols
+
+% Additional \preloaded fonts can be specified here.
+% (And those that were \preloaded above can be eliminated.)
+
+\let\preloaded=\undefined % preloaded fonts must be declared anew later.
+
+\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177
+\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60
+
+\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
+\def\rm{\fam\z@\tenrm}
+\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
+\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni}
+\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
+\def\cal{\fam\tw@}
+\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
+\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4
+\textfont\itfam=\tenit
+\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5
+\textfont\slfam=\tensl
+\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6
+\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
+\scriptscriptfont\bffam=\fivebf
+\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7
+\textfont\ttfam=\tentt
+
+% Macros for setting ordinary text
+\message{macros,}
+
+\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m
+ \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
+\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000%
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 }
+
+\def\normalbaselines{\lineskip\normallineskip
+ \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit}
+
+\def\^^M{\ } % control <return> = control <space>
+\def\^^I{\ } % same for <tab>
+
+\def\lq{`} \def\rq{'}
+\def\lbrack{[} \def\rbrack{]}
+
+\let\endgraf=\par \let\endline=\cr
+
+\def\space{ }
+\def\empty{}
+\def\null{\hbox{}}
+
+\let\bgroup={ \let\egroup=}
+
+% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}'
+% since this allows, for example, `\let\par=\cr \obeylines \halign{...'
+{\catcode`\^^M=\active % these lines must end with %
+ \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
+ \global\let^^M\par} % this is in case ^^M appears in a \write
+\def\obeyspaces{\catcode`\ \active}
+{\obeyspaces\global\let =\space}
+
+\def\loop#1\repeat{\def\body{#1}\iterate}
+\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
+\let\repeat=\fi % this makes \loop...\if...\repeat skippable
+
+\def\thinspace{\kern .16667em }
+\def\negthinspace{\kern-.16667em }
+\def\enspace{\kern.5em }
+
+\def\enskip{\hskip.5em\relax}
+\def\quad{\hskip1em\relax}
+\def\qquad{\hskip2em\relax}
+
+\def\smallskip{\vskip\smallskipamount}
+\def\medskip{\vskip\medskipamount}
+\def\bigskip{\vskip\bigskipamount}
+
+\def\nointerlineskip{\prevdepth-1000\p@}
+\def\offinterlineskip{\baselineskip-1000\p@
+ \lineskip\z@ \lineskiplimit\maxdimen}
+
+\def\topglue{\nointerlineskip\vglue-\topskip\vglue} % for top of page
+\def\vglue{\afterassignment\vgl@\skip@=}
+\def\vgl@{\par \dimen@\prevdepth \hrule height\z@
+ \nobreak\vskip\skip@ \prevdepth\dimen@}
+\def\hglue{\afterassignment\hgl@\skip@=}
+\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@
+ \nobreak\hskip\skip@ \spacefactor\count@}
+
+\def~{\penalty\@M \ } % tie
+\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-'
+
+\def\break{\penalty-\@M}
+\def\nobreak{\penalty \@M}
+\def\allowbreak{\penalty \z@}
+
+\def\filbreak{\par\vfil\penalty-200\vfilneg}
+\def\goodbreak{\par\penalty-500 }
+\def\eject{\par\break}
+\def\supereject{\par\penalty-\@MM}
+
+\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi}
+\def\smallbreak{\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi}
+\def\medbreak{\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi}
+\def\bigbreak{\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi}
+
+\def\line{\hbox to\hsize}
+\def\leftline#1{\line{#1\hss}}
+\def\rightline#1{\line{\hss#1}}
+\def\centerline#1{\line{\hss#1\hss}}
+
+\def\rlap#1{\hbox to\z@{#1\hss}}
+\def\llap#1{\hbox to\z@{\hss#1}}
+
+\def\m@th{\mathsurround\z@}
+\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@
+ \m@th \underline{\box\z@}$}
+
+\newbox\strutbox
+\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}
+\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+
+\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out
+\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign
+\newcount\mscount
+\def\multispan#1{\omit \mscount#1\relax
+ \loop\ifnum\mscount>\@ne \sp@n\repeat}
+\def\sp@n{\span\omit\advance\mscount\m@ne}
+
+\newif\ifus@ \newif\if@cr
+\newbox\tabs \newbox\tabsyet \newbox\tabsdone
+
+\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null}
+\def\settabs{\setbox\tabs\null \futurelet\next\sett@b}
+\let\+=\relax % in case this file is being read in twice
+\def\sett@b{\ifx\next\+\def\nxt{\afterassignment\s@tt@b\let\nxt}%
+ \else\let\nxt\s@tcols\fi \let\next\relax \nxt}
+\def\s@tt@b{\let\nxt\relax \us@false\m@ketabbox}
+\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+
+\outer\def\+{\tabalign}
+\def\s@tcols#1\columns{\count@#1\dimen@\hsize
+ \loop\ifnum\count@>\z@ \@nother \repeat}
+\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@
+ \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}%
+ \advance\dimen@-\dimen@ii \advance\count@\m@ne}
+
+\def\m@ketabbox{\begingroup
+ \global\setbox\tabsyet\copy\tabs
+ \global\setbox\tabsdone\null
+ \def\cr{\@crtrue\crcr\egroup\egroup
+ \ifus@\unvbox\z@\lastbox\fi\endgroup
+ \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}%
+ \setbox\z@\vbox\bgroup\@crfalse
+ \ialign\bgroup&\t@bbox##\t@bb@x\crcr}
+
+\def\t@bbox{\setbox\z@\hbox\bgroup}
+\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column
+ \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet
+ \global\setbox\@ne\lastbox}% now \box\@ne holds its size
+ \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}%
+ \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi
+ \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi
+ \box\z@}
+
+\def\hang{\hangindent\parindent}
+\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces}
+\def\item{\par\hang\textindent}
+\def\itemitem{\par\indent \hangindent2\parindent \textindent}
+\def\narrower{\advance\leftskip\parindent
+ \advance\rightskip\parindent}
+
+\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250
+ \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip
+ \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent}
+\outer\def\proclaim #1. #2\par{\medbreak
+ \noindent{\bf#1.\enspace}{\sl#2\par}%
+ \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi}
+
+\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}
+\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only
+
+\chardef\%=`\%
+\chardef\&=`\&
+\chardef\#=`\#
+\chardef\$=`\$
+\chardef\ss="19
+\chardef\ae="1A
+\chardef\oe="1B
+\chardef\o="1C
+\chardef\AE="1D
+\chardef\OE="1E
+\chardef\O="1F
+\chardef\i="10 \chardef\j="11 % dotless letters
+\def\aa{\accent23a}
+\def\l{\char32l}
+\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}}
+
+\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary
+\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+\def\AA{\leavevmode\setbox0\hbox{h}\dimen@\ht0\advance\dimen@-1ex%
+ \rlap{\raise.67\dimen@\hbox{\char'27}}A}
+
+\def\mathhexbox#1#2#3{\leavevmode
+ \hbox{$\m@th \mathchar"#1#2#3$}}
+\def\dag{\mathhexbox279}
+\def\ddag{\mathhexbox27A}
+\def\S{\mathhexbox278}
+\def\P{\mathhexbox27B}
+
+\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex%
+ \ialign{##\crcr#1\crcr}}} \def\o@lign{\lineskiplimit\z@ \oalign}
+\def\ooalign{\lineskiplimit-\maxdimen \oalign} % chars over each other
+\def\sh@ft#1{\dimen\z@.00#1ex\multiply\dimen\z@\fontdimen1\font
+ \kern-.0156\dimen\z@} % compensate for slant in lowered accents
+\def\d#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{10}.\hidewidth}}}
+\def\b#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{29}%
+ \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}}}
+\def\c#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1%
+ \else{\ooalign{\unhbox\z@\crcr\hidewidth\char24\hidewidth}}\fi}
+\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}}
+
+\def\dots{\relax\ifmmode\ldots\else$\m@th\ldots\,$\fi}
+\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX}
+
+\def\`#1{{\accent18 #1}}
+\def\'#1{{\accent19 #1}}
+\def\v#1{{\accent20 #1}} \let\^^_=\v
+\def\u#1{{\accent21 #1}} \let\^^S=\u
+\def\=#1{{\accent22 #1}}
+\def\^#1{{\accent94 #1}} \let\^^D=\^
+\def\.#1{{\accent95 #1}}
+\def\H#1{{\accent"7D #1}}
+\def\~#1{{\accent"7E #1}}
+\def\"#1{{\accent"7F #1}}
+\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}}
+
+\def\hrulefill{\leaders\hrule\hfill}
+\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill}
+\def\rightarrowfill{$\m@th\smash-\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-6mu\mathord\rightarrow$}
+\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-6mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-6mu\smash-$}
+\mathchardef\braceld="37A \mathchardef\bracerd="37B
+\mathchardef\bracelu="37C \mathchardef\braceru="37D
+\def\downbracefill{$\m@th \setbox\z@\hbox{$\braceld$}%
+ \braceld\leaders\vrule height\ht\z@ depth\z@\hfill\braceru
+ \bracelu\leaders\vrule height\ht\z@ depth\z@\hfill\bracerd$}
+\def\upbracefill{$\m@th \setbox\z@\hbox{$\braceld$}%
+ \bracelu\leaders\vrule height\ht\z@ depth\z@\hfill\bracerd
+ \braceld\leaders\vrule height\ht\z@ depth\z@\hfill\braceru$}
+
+\outer\def\bye{\par\vfill\supereject\end}
+
+% Macros for math setting
+\message{math definitions,}
+
+\let\sp=^ \let\sb=_
+\def\,{\mskip\thinmuskip}
+\def\>{\mskip\medmuskip}
+\def\;{\mskip\thickmuskip}
+\def\!{\mskip-\thinmuskip}
+\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}
+{\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+\def\prim@s{\prime\futurelet\next\pr@m@s}
+\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t
+ \else\let\nxt\egroup\fi\fi \nxt}
+\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup}
+{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math
+
+{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
+
+\mathchardef\alpha="010B
+\mathchardef\beta="010C
+\mathchardef\gamma="010D
+\mathchardef\delta="010E
+\mathchardef\epsilon="010F
+\mathchardef\zeta="0110
+\mathchardef\eta="0111
+\mathchardef\theta="0112
+\mathchardef\iota="0113
+\mathchardef\kappa="0114
+\mathchardef\lambda="0115
+\mathchardef\mu="0116
+\mathchardef\nu="0117
+\mathchardef\xi="0118
+\mathchardef\pi="0119
+\mathchardef\rho="011A
+\mathchardef\sigma="011B
+\mathchardef\tau="011C
+\mathchardef\upsilon="011D
+\mathchardef\phi="011E
+\mathchardef\chi="011F
+\mathchardef\psi="0120
+\mathchardef\omega="0121
+\mathchardef\varepsilon="0122
+\mathchardef\vartheta="0123
+\mathchardef\varpi="0124
+\mathchardef\varrho="0125
+\mathchardef\varsigma="0126
+\mathchardef\varphi="0127
+\mathchardef\Gamma="7000
+\mathchardef\Delta="7001
+\mathchardef\Theta="7002
+\mathchardef\Lambda="7003
+\mathchardef\Xi="7004
+\mathchardef\Pi="7005
+\mathchardef\Sigma="7006
+\mathchardef\Upsilon="7007
+\mathchardef\Phi="7008
+\mathchardef\Psi="7009
+\mathchardef\Omega="700A
+
+\mathchardef\aleph="0240
+\def\hbar{{\mathchar'26\mkern-9muh}}
+\mathchardef\imath="017B
+\mathchardef\jmath="017C
+\mathchardef\ell="0160
+\mathchardef\wp="017D
+\mathchardef\Re="023C
+\mathchardef\Im="023D
+\mathchardef\partial="0140
+\mathchardef\infty="0231
+\mathchardef\prime="0230
+\mathchardef\emptyset="023B
+\mathchardef\nabla="0272
+\def\surd{{\mathchar"1270}}
+\mathchardef\top="023E
+\mathchardef\bot="023F
+\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr
+ \not\mathrel{\mkern14mu}\crcr
+ \noalign{\nointerlineskip}
+ \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}
+\mathchardef\triangle="0234
+\mathchardef\forall="0238
+\mathchardef\exists="0239
+\mathchardef\neg="023A \let\lnot=\neg
+\mathchardef\flat="015B
+\mathchardef\natural="015C
+\mathchardef\sharp="015D
+\mathchardef\clubsuit="027C
+\mathchardef\diamondsuit="027D
+\mathchardef\heartsuit="027E
+\mathchardef\spadesuit="027F
+
+\mathchardef\coprod="1360
+\mathchardef\bigvee="1357
+\mathchardef\bigwedge="1356
+\mathchardef\biguplus="1355
+\mathchardef\bigcap="1354
+\mathchardef\bigcup="1353
+\mathchardef\intop="1352 \def\int{\intop\nolimits}
+\mathchardef\prod="1351
+\mathchardef\sum="1350
+\mathchardef\bigotimes="134E
+\mathchardef\bigoplus="134C
+\mathchardef\bigodot="134A
+\mathchardef\ointop="1348 \def\oint{\ointop\nolimits}
+\mathchardef\bigsqcup="1346
+\mathchardef\smallint="1273
+
+\mathchardef\triangleleft="212F
+\mathchardef\triangleright="212E
+\mathchardef\bigtriangleup="2234
+\mathchardef\bigtriangledown="2235
+\mathchardef\wedge="225E \let\land=\wedge
+\mathchardef\vee="225F \let\lor=\vee
+\mathchardef\cap="225C
+\mathchardef\cup="225B
+\mathchardef\ddagger="227A
+\mathchardef\dagger="2279
+\mathchardef\sqcap="2275
+\mathchardef\sqcup="2274
+\mathchardef\uplus="225D
+\mathchardef\amalg="2271
+\mathchardef\diamond="2205
+\mathchardef\bullet="220F
+\mathchardef\wr="226F
+\mathchardef\div="2204
+\mathchardef\odot="220C
+\mathchardef\oslash="220B
+\mathchardef\otimes="220A
+\mathchardef\ominus="2209
+\mathchardef\oplus="2208
+\mathchardef\mp="2207
+\mathchardef\pm="2206
+\mathchardef\circ="220E
+\mathchardef\bigcirc="220D
+\mathchardef\setminus="226E % for set difference A\setminus B
+\mathchardef\cdot="2201
+\mathchardef\ast="2203
+\mathchardef\times="2202
+\mathchardef\star="213F
+
+\mathchardef\propto="322F
+\mathchardef\sqsubseteq="3276
+\mathchardef\sqsupseteq="3277
+\mathchardef\parallel="326B
+\mathchardef\mid="326A
+\mathchardef\dashv="3261
+\mathchardef\vdash="3260
+\mathchardef\nearrow="3225
+\mathchardef\searrow="3226
+\mathchardef\nwarrow="322D
+\mathchardef\swarrow="322E
+\mathchardef\Leftrightarrow="322C
+\mathchardef\Leftarrow="3228
+\mathchardef\Rightarrow="3229
+\def\neq{\not=} \let\ne=\neq
+\mathchardef\leq="3214 \let\le=\leq
+\mathchardef\geq="3215 \let\ge=\geq
+\mathchardef\succ="321F
+\mathchardef\prec="321E
+\mathchardef\approx="3219
+\mathchardef\succeq="3217
+\mathchardef\preceq="3216
+\mathchardef\supset="321B
+\mathchardef\subset="321A
+\mathchardef\supseteq="3213
+\mathchardef\subseteq="3212
+\mathchardef\in="3232
+\mathchardef\ni="3233 \let\owns=\ni
+\mathchardef\gg="321D
+\mathchardef\ll="321C
+\mathchardef\not="3236
+\mathchardef\leftrightarrow="3224
+\mathchardef\leftarrow="3220 \let\gets=\leftarrow
+\mathchardef\rightarrow="3221 \let\to=\rightarrow
+\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow}
+\mathchardef\sim="3218
+\mathchardef\simeq="3227
+\mathchardef\perp="323F
+\mathchardef\equiv="3211
+\mathchardef\asymp="3210
+\mathchardef\smile="315E
+\mathchardef\frown="315F
+\mathchardef\leftharpoonup="3128
+\mathchardef\leftharpoondown="3129
+\mathchardef\rightharpoonup="312A
+\mathchardef\rightharpoondown="312B
+
+\def\joinrel{\mathrel{\mkern-3mu}}
+\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as +
+\def\Relbar{\mathrel=}
+\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow}
+\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook}
+\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft}
+\def\models{\mathrel|\joinrel=}
+\def\Longrightarrow{\Relbar\joinrel\Rightarrow}
+\def\longrightarrow{\relbar\joinrel\rightarrow}
+\def\longleftarrow{\leftarrow\joinrel\relbar}
+\def\Longleftarrow{\Leftarrow\joinrel\Relbar}
+\def\longmapsto{\mapstochar\longrightarrow}
+\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
+\def\iff{\;\Longleftrightarrow\;}
+
+\mathchardef\ldotp="613A % ldot as a punctuation mark
+\mathchardef\cdotp="6201 % cdot as a punctuation mark
+\mathchardef\colon="603A % colon as a punctuation mark
+\def\ldots{\mathinner{\ldotp\ldotp\ldotp}}
+\def\cdots{\mathinner{\cdotp\cdotp\cdotp}}
+\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@
+ \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
+\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu
+ \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}}
+
+\def\acute{\mathaccent"7013 }
+\def\grave{\mathaccent"7012 }
+\def\ddot{\mathaccent"707F }
+\def\tilde{\mathaccent"707E }
+\def\bar{\mathaccent"7016 }
+\def\breve{\mathaccent"7015 }
+\def\check{\mathaccent"7014 }
+\def\hat{\mathaccent"705E }
+\def\vec{\mathaccent"017E }
+\def\dot{\mathaccent"705F }
+\def\widetilde{\mathaccent"0365 }
+\def\widehat{\mathaccent"0362 }
+\def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overleftarrow#1{\vbox{\m@th\ialign{##\crcr
+ \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3\p@}
+ \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits}
+\def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr
+ $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip}
+ \upbracefill\crcr\noalign{\kern3\p@}}}}\limits}
+\def\skew#1#2#3{{\muskip\z@#1mu\divide\muskip\z@\tw@ \mkern\muskip\z@
+ #2{\mkern-\muskip\z@{#3}\mkern\muskip\z@}\mkern-\muskip\z@}{}}
+
+\def\lmoustache{\delimiter"437A340 } % top from (, bottom from )
+\def\rmoustache{\delimiter"537B341 } % top from ), bottom from (
+\def\lgroup{\delimiter"462833A } % extensible ( with sharper tips
+\def\rgroup{\delimiter"562933B } % extensible ) with sharper tips
+\def\arrowvert{\delimiter"26A33C } % arrow without arrowheads
+\def\Arrowvert{\delimiter"26B33D } % double arrow without arrowheads
+\def\bracevert{\delimiter"77C33E } % the vertical bar that extends braces
+\def\Vert{\delimiter"26B30D } \let\|=\Vert
+\def\vert{\delimiter"26A30C }
+\def\uparrow{\delimiter"3222378 }
+\def\downarrow{\delimiter"3223379 }
+\def\updownarrow{\delimiter"326C33F }
+\def\Uparrow{\delimiter"322A37E }
+\def\Downarrow{\delimiter"322B37F }
+\def\Updownarrow{\delimiter"326D377 }
+\def\backslash{\delimiter"26E30F } % for double coset G\backslash H
+\def\rangle{\delimiter"526930B }
+\def\langle{\delimiter"426830A }
+\def\rbrace{\delimiter"5267309 } \let\}=\rbrace
+\def\lbrace{\delimiter"4266308 } \let\{=\lbrace
+\def\rceil{\delimiter"5265307 }
+\def\lceil{\delimiter"4264306 }
+\def\rfloor{\delimiter"5263305 }
+\def\lfloor{\delimiter"4262304 }
+
+\def\bigl{\mathopen\big}
+\def\bigm{\mathrel\big}
+\def\bigr{\mathclose\big}
+\def\Bigl{\mathopen\Big}
+\def\Bigm{\mathrel\Big}
+\def\Bigr{\mathclose\Big}
+\def\biggl{\mathopen\bigg}
+\def\biggm{\mathrel\bigg}
+\def\biggr{\mathclose\bigg}
+\def\Biggl{\mathopen\Bigg}
+\def\Biggm{\mathrel\Bigg}
+\def\Biggr{\mathclose\Bigg}
+\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}}
+\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}}
+\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}}
+\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}}
+\def\n@space{\nulldelimiterspace\z@ \m@th}
+
+\def\choose{\atopwithdelims()}
+\def\brack{\atopwithdelims[]}
+\def\brace{\atopwithdelims\{\}}
+
+\def\sqrt{\radical"270370 }
+
+\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}%
+ {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}}
+\newbox\rootbox
+\def\root#1\of{\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$}
+ \mathpalette\r@@t}
+\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$}
+ \dimen@\ht\z@ \advance\dimen@-\dp\z@
+ \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu \box\z@}
+\newif\ifv@ \newif\ifh@
+\def\vphantom{\v@true\h@false\ph@nt}
+\def\hphantom{\v@false\h@true\ph@nt}
+\def\phantom{\v@true\h@true\ph@nt}
+\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}%
+ \else\let\next\makeph@nt\fi\next}
+\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt}
+\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt}
+\def\finph@nt{\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi
+ \ifh@ \wd\tw@\wd\z@\fi \box\tw@}
+\def\mathstrut{\vphantom(}
+\def\smash{\relax % \relax, in case this comes first in \halign
+ \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh
+ \fi\next}
+\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh}
+\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh}
+\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}
+
+\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign
+\def\@vereq#1#2{\lower.5\p@\vbox{\lineskiplimit\maxdimen\lineskip-.5\p@
+ \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+\def\notin{\mathrel{\mathpalette\c@ncel\in}}
+\def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}}
+\def\rlh@#1{\vcenter{\m@th\hbox{\ooalign{\raise2pt
+ \hbox{$#1\rightharpoonup$}\crcr
+ $#1\leftharpoondown$}}}}
+\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}}
+\def\doteq{\buildrel\textstyle.\over=}
+
+\def\log{\mathop{\rm log}\nolimits}
+\def\lg{\mathop{\rm lg}\nolimits}
+\def\ln{\mathop{\rm ln}\nolimits}
+\def\lim{\mathop{\rm lim}}
+\def\limsup{\mathop{\rm lim\,sup}}
+\def\liminf{\mathop{\rm lim\,inf}}
+\def\sin{\mathop{\rm sin}\nolimits}
+\def\arcsin{\mathop{\rm arcsin}\nolimits}
+\def\sinh{\mathop{\rm sinh}\nolimits}
+\def\cos{\mathop{\rm cos}\nolimits}
+\def\arccos{\mathop{\rm arccos}\nolimits}
+\def\cosh{\mathop{\rm cosh}\nolimits}
+\def\tan{\mathop{\rm tan}\nolimits}
+\def\arctan{\mathop{\rm arctan}\nolimits}
+\def\tanh{\mathop{\rm tanh}\nolimits}
+\def\cot{\mathop{\rm cot}\nolimits}
+\def\coth{\mathop{\rm coth}\nolimits}
+\def\sec{\mathop{\rm sec}\nolimits}
+\def\csc{\mathop{\rm csc}\nolimits}
+\def\max{\mathop{\rm max}}
+\def\min{\mathop{\rm min}}
+\def\sup{\mathop{\rm sup}}
+\def\inf{\mathop{\rm inf}}
+\def\arg{\mathop{\rm arg}\nolimits}
+\def\ker{\mathop{\rm ker}\nolimits}
+\def\dim{\mathop{\rm dim}\nolimits}
+\def\hom{\mathop{\rm hom}\nolimits}
+\def\det{\mathop{\rm det}}
+\def\exp{\mathop{\rm exp}\nolimits}
+\def\Pr{\mathop{\rm Pr}}
+\def\gcd{\mathop{\rm gcd}}
+\def\deg{\mathop{\rm deg}\nolimits}
+
+\def\bmod{\nonscript\mskip-\medmuskip\mkern5mu
+ \mathbin{\rm mod}\penalty900\mkern5mu\nonscript\mskip-\medmuskip}
+\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)}
+
+\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th
+ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.}
+\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+\def\pmatrix#1{\left(\matrix{#1}\right)}
+\newdimen\p@renwd
+\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left (
+\def\bordermatrix#1{\begingroup \m@th
+ \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}%
+ \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil
+ &&\quad\hfil$##$\hfil\crcr
+ \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}%
+ #1\crcr\omit\strut\cr}}%
+ \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne
+ \global\setbox\@ne\vbox{\box\@ne\kern2\p@}%
+ \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}%
+ \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup}
+
+\def\openup{\afterassignment\@penup\dimen@=}
+\def\@penup{\advance\lineskip\dimen@
+ \advance\baselineskip\dimen@
+ \advance\lineskiplimit\dimen@}
+\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th
+ \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
+ \crcr#1\crcr}}\,}
+\newif\ifdt@p
+\def\displ@y{\global\dt@ptrue\openup\jot\m@th
+ \everycr{\noalign{\ifdt@p \global\dt@pfalse \ifdim\prevdepth>-1000\p@
+ \vskip-\lineskiplimit \vskip\normallineskiplimit \fi
+ \else \penalty\interdisplaylinepenalty \fi}}}
+\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y
+\def\displaylines#1{\displ@y \tabskip\z@skip
+ \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
+ #1\crcr}}
+\def\eqalignno#1{\displ@y \tabskip\centering
+ \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\llap{$\@lign##$}\tabskip\z@skip\crcr
+ #1\crcr}}
+\def\leqalignno#1{\displ@y \tabskip\centering
+ \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
+ #1\crcr}}
+
+% Definitions related to output
+
+\message{output routines,}
+
+\countdef\pageno=0 \pageno=1 % first page is number 1
+\newtoks\headline \headline={\hfil} % headline is normally blank
+\newtoks\footline \footline={\hss\tenrm\folio\hss}
+ % footline is normally a centered page number in font \tenrm
+\newif\ifr@ggedbottom
+\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue}
+\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom
+\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi}
+\def\nopagenumbers{\footline{\hfil}} % blank out the footline
+\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne
+ \else\global\advance\pageno\@ne \fi} % increase |pageno|
+
+\newinsert\footins
+\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ #1\@sf\vfootnote{#1}}
+\def\vfootnote#1{\insert\footins\bgroup
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
+ \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+ \textindent{#1}\footstrut\futurelet\next\fo@t}
+\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
+ \else\let\next\f@t\fi \next}
+\def\f@@t{\bgroup\aftergroup\@foot\let\next}
+\def\f@t#1{#1\@foot}
+\def\@foot{\strut\egroup}
+\def\footstrut{\vbox to\splittopskip{}}
+\skip\footins=\bigskipamount % space added when footnote is present
+\count\footins=1000 % footnote magnification factor (1 to 1)
+\dimen\footins=8in % maximum footnotes per page
+
+\newinsert\topins
+\newif\ifp@ge \newif\if@mid
+\def\topinsert{\@midfalse\p@gefalse\@ins}
+\def\midinsert{\@midtrue\@ins}
+\def\pageinsert{\@midfalse\p@getrue\@ins}
+\skip\topins=\z@skip % no space added when a topinsert is present
+\count\topins=1000 % magnification factor (1 to 1)
+\dimen\topins=\maxdimen % no limit per page
+\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox
+\def\endinsert{\egroup % finish the \vbox
+ \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@
+ \advance\dimen@\pagetotal \advance\dimen@-\pageshrink
+ \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi
+ \if@mid \bigskip\box\z@\bigbreak
+ \else\insert\topins{\penalty100 % floating insertion
+ \splittopskip\z@skip
+ \splitmaxdepth\maxdimen \floatingpenalty\z@
+ \ifp@ge \dimen@\dp\z@
+ \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
+ \else \box\z@\nobreak\bigskip\fi}\fi\endgroup}
+
+\output{\plainoutput}
+\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
+ \advancepageno
+ \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
+\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}}
+\def\makeheadline{\vbox to\z@{\vskip-22.5\p@
+ \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip}
+\def\makefootline{\baselineskip24\p@\line{\the\footline}}
+\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over
+ \line{}\kern-\topskip\nobreak\vfill\supereject\fi}
+
+\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
+ \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
+ \ifvoid\footins\else % footnote info is present
+ \vskip\skip\footins
+ \footnoterule
+ \unvbox\footins\fi
+ \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+\def\footnoterule{\kern-3\p@
+ \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high
+
+% Hyphenation, miscellaneous macros, and initial values for standard layout
+\message{hyphenation}
+
+\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks
+\input hyphen
+
+\def\magnification{\afterassignment\m@g\count@}
+\def\m@g{\mag\count@
+ \hsize6.5truein\vsize8.9truein\dimen\footins8truein}
+
+\def\tracingall{\tracingonline\@ne\tracingcommands\tw@\tracingstats\tw@
+ \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne
+ \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode}
+
+\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm
+ \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}}
+
+\normalbaselines\rm % select roman font
+\nonfrenchspacing % punctuation affects the spacing
+\catcode`@=12 % at signs are no longer letters
+
+\def\fmtname{plain}\def\fmtversion{3.14159} % identifies the current format
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/spec-ini.tex b/tex/context/base/spec-ini.tex index 0e3ef3be4..b26f067f1 100644 --- a/tex/context/base/spec-ini.tex +++ b/tex/context/base/spec-ini.tex @@ -1,958 +1,958 @@ -%D \module -%D [ file=spec-ini, -%D version=1996.01.25, -%D title=\CONTEXT\ Special 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. - -%D Specials are \TEX's channel to the outside world. They make -%D \TEX\ even more platform independant and permit easy -%D adaption to new developments. One major drawback of specials -%D is that they have to be supported by printer drivers. We've -%D tried to overcome this problem by implementinmg specials as -%D a sort of drivers themselves. - -\writestatus{loading}{Context Special Macros / Initialization} - -\unprotect - -\startmessages dutch library: specials - title: specials - 1: -- geladen - 2: verdere nesting is niet toegestaan -- - 3: -- gereset - 4: commando -- bestaat niet - 5: definitiefile -- wordt geladen - 6: nesting is niet toegestaan -\stopmessages - -\startmessages english library: specials - title: specials - 1: -- loaded - 2: no deeper nesting is permitted -- - 3: -- is reset - 4: command -- does not exist - 5: loading definition file -- - 6: nesting is not permitted -\stopmessages - -\startmessages german library: specials - title: spezielles - 1: -- geladen - 2: Keine tiefere Verschachtelung erlaubt -- - 3: -- ist zurueckgesetzt - 4: Befehl -- existiert nicht - 5: Lade Definitionsdatei -- - 6: Verschachtelung nicht erlaubt -\stopmessages - -\startmessages dutch library: interactions - 21: -- code tussengevoegd -\stopmessages - -\startmessages english library: interactions - 21: -- code inserted -\stopmessages - -\startmessages german library: interactions - 21: -- Code eingefuegt -\stopmessages - -%D Because there is no standardization in the use of specials, -%D more than one driver or program can be supported. The -%D specials are grouped in libraries. Some of these are -%D general, such as the \type{postscript} library, some are -%D tuned to a special kind of program, like the \type{pdf} -%D ones, and some support a specific driver, as we can see in -%D the \type{yandy} library. A library is build with the -%D commands: -%D -%D \starttypen -%D \startspecials[name][inheritance] -%D -%D \definespecial\none{...} -%D \definespecial\onlyone#1{...} -%D \definespecial\alot#1#2#3#4{...} -%D -%D \stopspecials -%D \stoptypen -%D -%D Because drivers show some overlap in their support of -%D specials, a mechanism of inheritance is implemented. The -%D predefined libraries show this feature. -%D -%D Every special has to be predefined first. We do this with -%D the command: -%D -%D \starttypen -%D \installspecial [\none] [and] [0] -%D \installspecial [\onlyone] [and] [1] -%D \installspecial [\alot] [or] [4] -%D \stoptypen -%D -%D This means as much as: there is a special names -%D \type{\none} which has no arguments and has more than one -%D appearance. The special \type{\alot} on the other hand has -%D four arguments and is only defined once. Every instance in -%D the libraries of a special of category \type{and} is -%D executed when called upon, but only one special of -%D category \type{or} can be active. Most of the -%D \type{postscript}||specials are of category \type{or}, -%D because they tend to interfere with driver specific ones. -%D The interactive specials of \type{dviwindo} and \type{pdf} -%D are an example of specials that can be called both. -%D -%D A library is defined in a file with the name -%D \type{spec-...}. We load a library with the command: -%D -%D \starttypen -%D \usespecials [list] -%D \stoptypen -%D -%D where the list can contain one or more file tags, the -%D \type{...} in the filename. The keyword \type{reset} -%D resets all loaded specials. This is equivalent to -%D \type{\resetspecials}. - -%D Although a mechanism of nesting can be implemented, we -%D prefer to use a inheritance mechanism as mentioned. Calls -%D upon \type{\usespecials} within a \type{\startspecials} -%D would lead to confusion and errors. - -\newif\ifinheritspecials - -%D We define some local constants and variables. They look a -%D bit horrible but we don't want conflicts. - -\def\@@specfil@@{@@specfil@@} -\def\@@speclst@@{@@speclst@@} -\def\@@speccat@@{@@speccat@@} -\def\@@specarg@@{@@specarg@@} -\def\@@specexc@@{@@specexc@@} - -\def\currentspecial {} -\def\currentspecialfile {} -\def\preloadedspecials {} - -%D \macros -%D {preloadspecials} -%D {} -%D -%D The following command can be used to show the loaded list -%D of specials. - -\def\preloadspecials% - {\doifsomething{\preloadedspecials} - {\showmessage{\m!specials}{1}{\preloadedspecials}}} - -%D \macros -%D {startspecials} -%D {} -%D -%D Every library has a unique name, which is given as the first -%D argument to \type{\startspecials}. When another library is -%D defined with the same name, previous specials can be -%D overruled. The name may differ from the file||tag. -%D -%D The optional second argument can consist of a list of -%D libraries that are to be loaded first. This list can contain -%D file||tags or names of libraries. Names are often more -%D meaningful. - -\def\dostartspecials[#1][#2]% - {\let\mainspecialfile=\currentspecialfile - \doifelsenothing{#2} - {\inheritspecialsfalse} - {\ifinheritspecials - \showmessage{\m!specials}{2}{(#2)}% - \else - \inheritspecialstrue - \processcommalist[#2]\dousespecials - \inheritspecialsfalse - \fi}% - \doifelsenothing{#1} - {\def\currentspecial{\s!unknown}} - {\def\currentspecial{#1}}% - \let\currentspecialfile=\mainspecialfile - \setevalue{\@@specfil@@\currentspecial}{\currentspecialfile}% - \unprotect - \addtocommalist{\currentspecial}\preloadedspecials} - -\def\startspecials% - {\dodoubleempty\dostartspecials} - -\def\stopspecials% - {\def\currentspecial{}% - \protect} - -%D \macros -%D {installspecial, -%D resetspecials} -%D {} -%D -%D We have to install specials before we can define and use -%D them. The command itself is defined as a call to another -%D command that executes one or more user||defined specials, -%D depending of it's category: \type{or} versus \type{and}. -%D -%D The command \type{\installspecial} takes three -%D (non||optional) arguments: the name of the command, the -%D category it belongs to and the number of arguments it -%D takes. -%D -%D With \type{\resetspecials} we can unload the predefined -%D specials. - -\def\@@allspecials{} - -\def\doinstallspecial[#1][#2][#3]% - {\setvalue{\@@speclst@@\string#1}{}% - \setvalue{\@@speccat@@\string#1}{#2}% - \setvalue{\@@specarg@@\string#1}{#3}% - \addtocommalist{\string#1}\@@allspecials - \def#1{\executespecial#1}} - -\def\installspecial% - {\dotripleargument\doinstallspecial} - -\def\resetspecials% - {\def\docommando##1% - {\setvalue{\@@speclst@@##1}{}}% - \processcommacommand[\@@allspecials]\docommando - \showmessage{\m!specials}{3}{\preloadedspecials}% - \def\preloadedspecials{}% - \def\@@allspecials{}} - -%D \macros -%D {definespecial} -%D {} -%D -%D The command \type{\definespecial} take the place of -%D \type{\def} in the definition of a special. Just to be -%D sure, we first check if the command is permitted, i.e. -%D installed. If not, we give a warning and gobble the -%D illegal command in an quite elegant way. -%D -%D If the command can be combined (\type{and}) with others, -%D we append it to a list, otherwise (\type{or}) it becomes -%D the only item in the list. - -\def\definespecial#1% - {\ifx#1\undefined - \showmessage{\m!specials}{4}{\string#1}% - \def\next% - {\def\@@illegalspecial@@}% - \else - \def\next% - {\doifelse{\getvalue{\@@speccat@@\string#1}}{or} - {\edef\@@newspeclst@@{\currentspecial}} - {\edef\@@newspeclst@@{\getvalue{\@@speclst@@\string#1}}% - \addtocommalist{\currentspecial}\@@newspeclst@@}% - \setevalue{\@@speclst@@\string#1}{\@@newspeclst@@}% - \setvalue{\currentspecial\string#1}}% - \fi - \next} - -%D \macros -%D {usespecials} -%D {} -%D -%D We use \type{\usespecials} to load a specific library. -%D This command is only permitted outside de definition part. - -\def\dousespecials#1% - {\doifelse{#1}{\v!reset} - {\resetspecials} - {\doifdefinedelse{\@@specfil@@#1} - {\edef\currentspecialfile{\getvalue{\@@specfil@@#1}}} - {\edef\currentspecialfile{#1}}% - \makeshortfilename[\f!specialprefix\currentspecialfile]% - \showmessage{\m!specials}{5}{\currentspecialfile}% - \startreadingfile - \readsysfile{\shortfilename}{}{}% - \stopreadingfile - \showmessage{\m!specials}{1}{\preloadedspecials}}} - -\def\usespecials[#1]% - {\doifelsenothing{\currentspecial} - {\processcommalist[#1]\dousespecials} - {\showmessage{\m!specials}{6}{}}} - -%D \macros -%D {executespecials} -%D {} -%D -%D The command \type{\executespecials} is used to execute the -%D defined specials. Once a special is installed, the special -%D itself calls for this command, so it's not needed outside -%D this module. One can use it if wanted. -%D -%D A former implementation grouped the execution. Recent -%D additions however |<|like the specials that implement object -%D handling|>| asked for non||grouped execution. - -\def\executespecials#1#2% - {\def\doonespecial##1% - {\getvalue{##1\string#1}#2\relax}% - \processcommacommand - [\getvalue{\@@speclst@@\string#1}]\doonespecial} - -\def\executespecial#1% - {\expandafter\ifcase\getvalue{\@@specarg@@\string#1}\relax - \def\next% - {\executespecials#1{}}% - \or - \def\next##1% - {\executespecials#1{{##1}}}% - \or - \def\next##1##2% - {\executespecials#1{{##1}{##2}}}% - \or - \def\next##1##2##3% - {\executespecials#1{{##1}{##2}{##3}}}% - \or - \def\next##1##2##3##4% - {\executespecials#1{{##1}{##2}{##3}{##4}}}% - \or - \def\next##1##2##3##4##5% - {\executespecials#1{{##1}{##2}{##3}{##4}{##5}}}% - \or - \def\next##1##2##3##4##5##6% - {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}}}% - \or - \def\next##1##2##3##4##5##6##7% - {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}}}% - \or - \def\next##1##2##3##4##5##6##7##8% - {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}}}% - \or - \def\next##1##2##3##4##5##6##7##8##9% - {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}{##9}}}% - \else - \def\next% - {\message{illegal special: \string#1}}% - \fi - \next} - -%D The \type{{{...}}} are needed because we pass all those -%D arguments to the specials support macro. - -\let\openspecialfile = \relax -\let\closespecialfile = \relax - -% %D This is some new, experimental code, used for testing some -% %D proposals of Laurent Siebenmann on behalf of the -% %D \kap{EMJ} discussionlist. -% -% \newif\ifexternalspecials \externalspecialsfalse -% \newif\ifspecialstatus \specialstatustrue -% -% \newwrite\specialfile -% -% \def\openspecialfile% -% {\immediate\openout\specialfile=\jobname.etc\relax} -% -% \def\closespecialfile% -% {\immediate\closeout\specialfile} -% -% \let\internalspecial=\special -% -% \def\externalspecial#1% -% {\internalspecial{}% -% \immediate\write\specialfile{\currentspecialdriver\space: #1}} -% -% \def\doinstallspecial[#1][#2][#3]% -% {\setvalue{\@@specexc@@\string#1}{}% -% \setvalue{\@@speclst@@\string#1}{}% -% \setvalue{\@@speccat@@\string#1}{#2}% -% \setvalue{\@@specarg@@\string#1}{#3}% -% \addtocommalist{\string#1}\@@allspecials -% \def#1{\executespecial#1}} -% -% \def\resetspecials% -% {\def\docommando##1% -% {\setvalue{\@@specexc@@##1}{}% -% \setvalue{\@@speclst@@##1}{}}% -% \processcommacommand[\@@allspecials]\docommando -% \showmessage{\m!specials}{3}{\preloadedspecials}} -% -% \def\executespecials#1#2% -% {\edef\supportedspecials{\getvalue{\@@speclst@@\string#1}}% -% \def\doonespecial##1% -% {\doifdefined{##1\string#1} -% {\def\currentspecialdriver{##1}% -% \getvalue{##1\string#1}#2\relax}}% -% \ifexternalspecials -% \let\special=\externalspecial -% \doifelse{\supportedspecials}{} -% {\ifspecialstatus -% \immediate\write\specialfile{}% -% \immediate\write\specialfile{skipping : \string#1} -% \immediate\write\specialfile{}% -% \fi} -% {\ifspecialstatus -% \immediate\write\specialfile{}% -% \immediate\write\specialfile{executing : \string#1}% -% \immediate\write\specialfile{supported : \supportedspecials}% -% \fi -% \immediate\write\specialfile{}% -% \processcommacommand[\supportedspecials]\doonespecial}% -% \else -% \let\special=\internalspecial -% \doifelse{\getvalue{\@@speccat@@\string#1}}{or} -% {\doonespecial{\getvalue{\@@specexc@@\string#1}}} -% {\processcommacommand[\supportedspecials]\doonespecial}% -% \fi} -% -% \def\definespecial#1% -% {\ifx#1\undefined -% \showmessage{\m!specials}{4}{\string#1}% -% \def\next% -% {\def\@@illegalspecial@@}% -% \else -% \def\next% -% {\edef\@@newspeclst@@{\getvalue{\@@speclst@@\string#1}}% -% \addtocommalist{\currentspecial}\@@newspeclst@@ -% \setevalue{\@@speclst@@\string#1}{\@@newspeclst@@}% -% \setevalue{\@@specexc@@\string#1}{\currentspecial}% -% \setvalue{\currentspecial\string#1}}% -% \fi -% \next} -% -% %D So far for the experiment. - -\protect - -%D The following libraries are defined. Two postscript -%D drivers are supported, as well as two mechanisms for -%D interactive texts. -%D -%D \startregelcorrectie -%D \starttabel[|l|l|l|l|l|] -%D \HL -%D \NC \bf file \NC -%D \bf name \NC -%D \bf calls \NC -%D \bf support \NC -%D \bf program / driver \NC\SR -%D \HL -%D \NC \tttf spec-tex \NC -%D \tttf tex \NC -%D \NC -%D Generic \TEX\ (\DVI) \NC -%D (default) \NC\FR -%D \NC \tttf spec-ps \NC -%D \tttf postscript \NC -%D \NC -%D Adobe PostScript \NC -%D (default) \NC\MR -%D \NC \tttf spec-tr \NC -%D \tttf rokicky \NC -%D \tttf postscript \NC -%D Thomas Rokicky \NC -%D (dvips) \NC\MR -%D \NC \tttf spec-yy \NC -%D \tttf yandy \NC -%D \tttf postscript \NC -%D YandY \NC -%D (dvipsone, dviwindo) \NC\MR -%D \NC \tttf spec-pdf \NC -%D \tttf pdf \NC -%D \NC -%D Adobe PDF V2.1 \NC -%D (Acrobat) \NC\MR -%D \NC \tttf spec-win \NC -%D \tttf dviwindo \NC -%D YandY \NC -%D (dviwindo) \NC\MR -%D \NC \tttf spec-1p0 \NC -%D \tttf pdf \NC -%D \NC -%D Adobe PDF V 1.0 \NC -%D (Acrobat) \NC\MR -%D \NC \tttf spec-2p0 \NC -%D \tttf pdf \NC -%D \NC -%D Adobe PDF V 2.0 \NC -%D (Acrobat) \NC\MR -%D \NC \tttf spec-htm \NC -%D \tttf html \NC -%D \NC -%D HTML V 2.0 \NC -%D (dvips) \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie - -%D \macros -%D {dostartgraymode,dostopgraymode, -%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode} -%D {} -%D -%D We start with the installation of color and grayscale -%D specials. The values are in the range 0..1 (e.g. 0.25). -%D -%D \starttypen -%D \dostartgraymode {gray} ... \dostopgraymode -%D \dostartrgbcolormode {red} {green} {blue} ... \dostopcolormode -%D \dostartcmykcolormode {cyan} {magenta} {yellow} {black} ... \dostopcolormode -%D \dostartgraycolormode {gray} ... \dostopcolormode -%D \stoptypen -%D -%D Because we can expect conflicts between drivers, we -%D implement them as category \type{or}. In previous versions -%D of \DVIPSONE\ the use of their color||specials did not -%D interfere with the PostScript ones, but recent versions do. - -\installspecial [\dostartgraymode] [or] [1] -\installspecial [\dostopgraymode] [or] [0] - -\installspecial [\dostartrgbcolormode] [or] [3] -\installspecial [\dostartcmykcolormode] [or] [4] -\installspecial [\dostartgraycolormode] [or] [1] -\installspecial [\dostopcolormode] [or] [0] - -%D \macros -%D {doinsertfile} -%D {} -%D -%D Probably the most problematic special is the following -%D one. Because we want to be able to support different -%D schemes, we pass a lot of data to it. -%D -%D \starttypen -%D \doinsertfile {type,method} {file} -%D {xscale} {yscale} {x} {y} {w} {h} -%D {options} -%D \stoptypen -%D -%D The scale is given percents, the other values are base -%D points. -%D -%D The special is implemented as \type{or}. Because -%D \DVIPSONE\ understands them all, a chain of alternatives -%D would generate multiple courrences of the same -%D illustration. -%D -%D When option 1 is passed, the viewers is asked to present a -%D preview, like the first frame of a movie. - -\installspecial [\doinsertfile] [or] [9] - -%D \macros -%D {dostartrotation, -%D dostoprotation} -%D {} -%D -%D We support rotation with the special: -%D -%D \starttypen -%D \dostartrotation {angle} ... \dostoprotation -%D \stoptypen -%D -%D For the moment these specials are installed as -%D category \type{or}. - -\installspecial [\dostartrotation] [or] [1] -\installspecial [\dostoprotation] [or] [0] - -%D \macros -%D {dostartscaling, -%D dostopscaling} -%D {} -%D -%D Scaling is also supported: -%D -%D \starttypen -%D \dostartscaling {x} {y} ... \dostopscaling -%D \stoptypen -%D -%D Like the previous one, these specials are of category -%D \type{or}. - -\installspecial [\dostartscaling] [or] [2] -\installspecial [\dostopscaling] [or] [0] - -%D \macros -%D {dostartmirroring, -%D dostopmirroring} -%D {} -%D -%D And indeed, mirroring is there too: -%D -%D \starttypen -%D \dostartmirroring {x} {y} ... \dostopmirroring -%D \stoptypen -%D -%D Again these specials are installed as category \type{or}. - -\installspecial [\dostartmirroring] [or] [0] -\installspecial [\dostopmirroring] [or] [0] - -%D \macros -%D {dostartnegative, -%D dostopnegative} -%D {} -%D -%D When producing output for an image setter, negating the -%D page comes into view. Here are the tools: - -\installspecial [\dostartnegative] [or] [0] -\installspecial [\dostopnegative] [or] [0] - -%D \macros -%D {doselectfirstpaperbin, -%D doselectsecondpaperbin} -%D {} -%D -%D Here are some very printer||specific ones. No further -%D comment. - -\installspecial [\doselectfirstpaperbin] [or] [0] -\installspecial [\doselectsecondpaperbin] [or] [0] - -%D \macros -%D {doovalbox} -%D {} -%D -%D When we look at the implementation, this is a complicated -%D one. There are seven arguments. -%D -%D \starttypen -%D \doovalbox {w} {h} {d} {linewidth} {radius} {stroke} {fill} -%D \stoptypen -%D -%D This command has to return a \type{\vbox} which can be used -%D to lay over another one (with text). The radius is in -%D degrees, the stroke and fill are~\type{1} (true) of~\type{0} -%D (false). - -\installspecial [\doovalbox] [or] [7] - -%D \macros -%D {dosetupidentity} -%D {} -%D -%D We can declare some characteristics of the document with -%D -%D \starttypen -%D \dosetupidentity {title} {subject} {author} {creator} {date} -%D \stoptypen -%D -%D All data is in string format. - -\installspecial [\dosetupidentity] [and] [5] - -%D \macros -%D {dosetuppaper} -%D {} -%D -%D This special can be used to tell the driver what page size -%D to use. The special takes three arguments. -%D -%D \starttypen -%D \dosetuppaper {type} {width} {height} -%D \stoptypen -%D -%D The type is one of the common identifiers, like A4, A5 or -%D B2. - -\installspecial [\dosetuppaper] [and] [3] - -%D \macros -%D {dosetupprinter} -%D {} -%D -%D Some drivers enable the user to specify the paper type -%D used and/or page dimensions to be taken into account. -%D -%D \starttypen -%D \dosetupprinter {type} {hoffset} {voffset} {width} {height} -%D \stoptypen -%D -%D The first argument is one of \type{letter}, \type{legal}, -%D \type{A4}, \type{A5} etc. The dimensions are in -%D basepoints. - -\installspecial [\dosetupprinter] [and] [5] - -%D \macros -%D {dosetuppage, -%D dosetupinteraction, -%D dosetupscreen} -%D {} -%D -%D Here come some obscure interactive commands. Probably the -%D specs will change with the development of the macros that -%D use them. -%D -%D The first ones can be used to set up the interaction. -%D -%D \starttypen -%D \dosetupinteraction -%D \stoptypen -%D -%D Normally this command does nothing but giving a message -%D that some scheme is supported. Postscript prolog files -%D can best be loaded by the printer driver program. -%D -%D The second one sets up the screen. It takes three -%D arguments: -%D -%D \starttypen -%D \dosetupscreen {hoffset} {voffset} {width} {height} {options} -%D \stoptypen -%D -%D The first four arguments are in scaled points. Option~1 -%D results in a full screen launch. - -\installspecial [\dosetupinteraction] [and] [0] -\installspecial [\dosetupscreen] [and] [5] - -%D \macros -%D {dostarthide, -%D dostophide} -%D {} -%D -%D Not every part of the screen is suitable for paper. Menus -%D for instance have no meaning on an non||interactive medium. -%D These elements are hidden by means of: -%D -%D \starttypen -%D \dostarthide -%D \dostophide -%D \stoptypen - -\installspecial [\dostarthide] [or] [0] -\installspecial [\dostophide] [or] [0] - -%D \macros -%D {dostartgotolocation, dostopgotolocation, -%D dostartgotorealpage, dostopgotorealpage} -%D {} -%D -%D The interactive real work is done by the following four -%D specials. The reason for providing the first one with both -%D a label and a number, is a result of the quite poor -%D implementation of \type{pdfmarks} in version 1.0 of -%D Acrobat. Because only pagenumbers were supported as -%D destination, we had to provide both labels (\DVIWINDO) and -%D pagenumbers (\PDF). Some drivers use start stop pairs. -%D -%D \starttypen -%D \dostartgotolocation {w} {h} {url} {file} {label} {page} -%D \dostartgotorealpage {w} {h} {url} {file} {page} -%D \stoptypen -%D -%D Their counterparts are: -%D -%D \starttypen -%D \dostopgotolocation -%D \dostopgotorealpage -%D \stoptypen -%D -%D The internal alternative is used for system||generated -%D links, the external one for user||generated links. The -%D Uniform Resource Locator can be used to let the reader -%D surf the net. - -\installspecial [\dostartgotolocation] [and] [6] -\installspecial [\dostopgotolocation] [and] [0] -\installspecial [\dostartgotorealpage] [and] [5] -\installspecial [\dostopgotorealpage] [and] [0] - -%D \macros -%D {dostartgotoJS, doflushJSpreamble} -%D -%D -%D Rather special is the option to include and execute -%D JavaScript code. This is a typical \PDF\ option. -%D -%D \starttypen -%D \dostartgotoJS {w} {h} {script} -%D \stoptypen -%D -%D This not so standard \TEX\ feature should be used with -%D care. Preamble scripts are flushed by -%D -%D \doflushJSpreamble {script} - -\installspecial [\dostartgotoJS] [and] [3] -\installspecial [\dostopgotoJS] [and] [0] -\installspecial [\doflushJSpreamble][and] [1] - -%D \macros -%D {dostartthisislocation, dostopthisislocation, -%D dostartthisisrealpage, dostopthisisrealpage} -%D {} -%D -%D The opposite commands of \type{\dogotosomething} have only -%D one argument: -%D -%D \starttypen -%D \dostartthisislocation {label} -%D \dostartthisisrealpage {page} -%D \stoptypen -%D -%D These commands are accompanied by: -%D -%D \starttypen -%D \dostopthisislocation -%D \dostopthisisrealpage -%D \stoptypen -%D -%D As with all interactive commands's they are installed as -%D \type{and} category specials. - -\installspecial [\dostartthisislocation] [and] [1] -\installspecial [\dostopthisislocation] [and] [0] -\installspecial [\dostartthisisrealpage] [and] [1] -\installspecial [\dostopthisisrealpage] [and] [0] - -%D \macros -%D {dostartexecutecommand, dostopexecutecommand} -%D {} -%D -%D The actual behavior of the next pair of commands depends -%D much on the viewing engine. Therefore one cannot depend -%D too much on their support. -%D -%D \starttypen -%D \dostartexecutecommand {w} {h} {command} {options} -%D \stoptypen -%D -%D -%D The next commands are supported: -%D -%D \startregelcorrectie\steluitlijnenin[midden]\leavevmode -%D \starttabel[|l|l|] -%D \HL -%D \NC \bf command \NC \bf action \NC\SR -%D \HL -%D \NC first \NC go to the first page \NC\FR -%D \NC previous \NC go to the previous page \NC\MR -%D \NC next \NC go to the next page \NC\MR -%D \NC last \NC go to the last page \NC\MR -%D \NC backward \NC go back to the link list \NC\MR -%D \NC forward \NC go forward in the link list \NC\MR -%D \NC print \NC enter print mode \NC\MR -%D \NC exit \NC exit viewer \NC\MR -%D \NC close \NC close document \NC\MR -%D \NC enter \NC enter viewer \NC\MR -%D \NC help \NC show help on the viewer \NC\LR -%D \HL -%D \stoptabel -%D \stopregelcorrectie -%D -%D There are no options yet. Options are to be passed as a -%D comma separated list of assignments. - -\installspecial [\dostartexecutecommand] [and] [4] -\installspecial [\dostopexecutecommand] [and] [0] - -%D \macros -%D {dostartobject, -%D dostopobject, -%D doinsertobject} -%D -%D Reuse of object can reduce the output filesize -%D considerably. Reusable objects are implemented with: -%D -%D \starttypen -%D \dostartobject{name}{width}{height}{depth} -%D some typeset material -%D \dostopobject -%D \stoptypen -%D -%D \starttypen -%D \doinsertobject{name} -%D \stoptypen -%D -%D The savings can be huge in interactive texts. - -\installspecial [\dostartobject] [or] [4] -\installspecial [\dostopobject] [or] [0] -\installspecial [\doinsertobject] [or] [1] - -% %D \macros -% %D {dogetobjectreference} -% %D -% %D For very special purposes, one can ask for the internal -% %D reference to the object. Beware! -% -% \installspecial [\dogetobjectreference] [or] [2] -% -% %D The first argument is the name, the second a macro that -% %D gets the assiciated value. - -%D \macros -%D {dostartrunprogram, dostoprunprogram, -%D dostartgotoprofile, dostopgotoprofile, -%D dobeginofprofile, -%D doendofprofile} -%D {} -%D -%D These specials are still experimental. They are not yet -%D supported by the programs the way they should be. -%D -%D {\em --- still undocumented ---} - -\installspecial [\dostartrunprogram] [and] [3] -\installspecial [\dostoprunprogram] [and] [0] -\installspecial [\dostartgotoprofile] [and] [3] -\installspecial [\dostopgotoprofile] [and] [0] -\installspecial [\dobeginofprofile] [and] [4] -\installspecial [\doendofprofile] [and] [0] - -%D \macros -%D {doinsertbookmark} -%D -%D Bookmarks, that is viewer generated tables of contents, are -%D a strange phenomena, mainly because \TEX\ can provide -%D whatever kind of table in much better quality. - -\installspecial [\doinsertbookmark] [and] [5] - -%D This special is called as: -%D -%D \starttypen -%D \doinstallbookmark {level} {nofsubentries} {text} {page} {open} -%D \stoptypen -%D -%D This definition is very \PDF\ oriented, so for more -%D information we kindly refer to the \PDF\ manuals. - -%D \macros -%D {dosetpagetransition} -%D -%D In presentations, fancy page transitions can, at least for a -%D short moment, let the audience focus at the screen. Like the -%D previous one, this special is very \PDF. -%D -%D \starttypen -%D \dosetpagetransition{dissolve} -%D \stoptypen -%D -%D Transitions have symbolic names, like dissolve, box, split, -%D blinds, wipe and glitter. - -\installspecial [\dosetpagetransition] [or] [1] - -%D So far for the installation. Finally we preload our -%D favorite set of specials. - -\usespecials[ps,yy,win,pdf] - -%D One can overrule this by for instance -%D -%D \starttypen -%D \usespecials[reset,ps,tr,pdf] -%D \stoptypen - -\endinput +%D \module
+%D [ file=spec-ini,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special 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.
+
+%D Specials are \TEX's channel to the outside world. They make
+%D \TEX\ even more platform independant and permit easy
+%D adaption to new developments. One major drawback of specials
+%D is that they have to be supported by printer drivers. We've
+%D tried to overcome this problem by implementinmg specials as
+%D a sort of drivers themselves.
+
+\writestatus{loading}{Context Special Macros / Initialization}
+
+\unprotect
+
+\startmessages dutch library: specials
+ title: specials
+ 1: -- geladen
+ 2: verdere nesting is niet toegestaan --
+ 3: -- gereset
+ 4: commando -- bestaat niet
+ 5: definitiefile -- wordt geladen
+ 6: nesting is niet toegestaan
+\stopmessages
+
+\startmessages english library: specials
+ title: specials
+ 1: -- loaded
+ 2: no deeper nesting is permitted --
+ 3: -- is reset
+ 4: command -- does not exist
+ 5: loading definition file --
+ 6: nesting is not permitted
+\stopmessages
+
+\startmessages german library: specials
+ title: spezielles
+ 1: -- geladen
+ 2: Keine tiefere Verschachtelung erlaubt --
+ 3: -- ist zurueckgesetzt
+ 4: Befehl -- existiert nicht
+ 5: Lade Definitionsdatei --
+ 6: Verschachtelung nicht erlaubt
+\stopmessages
+
+\startmessages dutch library: interactions
+ 21: -- code tussengevoegd
+\stopmessages
+
+\startmessages english library: interactions
+ 21: -- code inserted
+\stopmessages
+
+\startmessages german library: interactions
+ 21: -- Code eingefuegt
+\stopmessages
+
+%D Because there is no standardization in the use of specials,
+%D more than one driver or program can be supported. The
+%D specials are grouped in libraries. Some of these are
+%D general, such as the \type{postscript} library, some are
+%D tuned to a special kind of program, like the \type{pdf}
+%D ones, and some support a specific driver, as we can see in
+%D the \type{yandy} library. A library is build with the
+%D commands:
+%D
+%D \starttypen
+%D \startspecials[name][inheritance]
+%D
+%D \definespecial\none{...}
+%D \definespecial\onlyone#1{...}
+%D \definespecial\alot#1#2#3#4{...}
+%D
+%D \stopspecials
+%D \stoptypen
+%D
+%D Because drivers show some overlap in their support of
+%D specials, a mechanism of inheritance is implemented. The
+%D predefined libraries show this feature.
+%D
+%D Every special has to be predefined first. We do this with
+%D the command:
+%D
+%D \starttypen
+%D \installspecial [\none] [and] [0]
+%D \installspecial [\onlyone] [and] [1]
+%D \installspecial [\alot] [or] [4]
+%D \stoptypen
+%D
+%D This means as much as: there is a special names
+%D \type{\none} which has no arguments and has more than one
+%D appearance. The special \type{\alot} on the other hand has
+%D four arguments and is only defined once. Every instance in
+%D the libraries of a special of category \type{and} is
+%D executed when called upon, but only one special of
+%D category \type{or} can be active. Most of the
+%D \type{postscript}||specials are of category \type{or},
+%D because they tend to interfere with driver specific ones.
+%D The interactive specials of \type{dviwindo} and \type{pdf}
+%D are an example of specials that can be called both.
+%D
+%D A library is defined in a file with the name
+%D \type{spec-...}. We load a library with the command:
+%D
+%D \starttypen
+%D \usespecials [list]
+%D \stoptypen
+%D
+%D where the list can contain one or more file tags, the
+%D \type{...} in the filename. The keyword \type{reset}
+%D resets all loaded specials. This is equivalent to
+%D \type{\resetspecials}.
+
+%D Although a mechanism of nesting can be implemented, we
+%D prefer to use a inheritance mechanism as mentioned. Calls
+%D upon \type{\usespecials} within a \type{\startspecials}
+%D would lead to confusion and errors.
+
+\newif\ifinheritspecials
+
+%D We define some local constants and variables. They look a
+%D bit horrible but we don't want conflicts.
+
+\def\@@specfil@@{@@specfil@@}
+\def\@@speclst@@{@@speclst@@}
+\def\@@speccat@@{@@speccat@@}
+\def\@@specarg@@{@@specarg@@}
+\def\@@specexc@@{@@specexc@@}
+
+\def\currentspecial {}
+\def\currentspecialfile {}
+\def\preloadedspecials {}
+
+%D \macros
+%D {preloadspecials}
+%D {}
+%D
+%D The following command can be used to show the loaded list
+%D of specials.
+
+\def\preloadspecials%
+ {\doifsomething{\preloadedspecials}
+ {\showmessage{\m!specials}{1}{\preloadedspecials}}}
+
+%D \macros
+%D {startspecials}
+%D {}
+%D
+%D Every library has a unique name, which is given as the first
+%D argument to \type{\startspecials}. When another library is
+%D defined with the same name, previous specials can be
+%D overruled. The name may differ from the file||tag.
+%D
+%D The optional second argument can consist of a list of
+%D libraries that are to be loaded first. This list can contain
+%D file||tags or names of libraries. Names are often more
+%D meaningful.
+
+\def\dostartspecials[#1][#2]%
+ {\let\mainspecialfile=\currentspecialfile
+ \doifelsenothing{#2}
+ {\inheritspecialsfalse}
+ {\ifinheritspecials
+ \showmessage{\m!specials}{2}{(#2)}%
+ \else
+ \inheritspecialstrue
+ \processcommalist[#2]\dousespecials
+ \inheritspecialsfalse
+ \fi}%
+ \doifelsenothing{#1}
+ {\def\currentspecial{\s!unknown}}
+ {\def\currentspecial{#1}}%
+ \let\currentspecialfile=\mainspecialfile
+ \setevalue{\@@specfil@@\currentspecial}{\currentspecialfile}%
+ \unprotect
+ \addtocommalist{\currentspecial}\preloadedspecials}
+
+\def\startspecials%
+ {\dodoubleempty\dostartspecials}
+
+\def\stopspecials%
+ {\def\currentspecial{}%
+ \protect}
+
+%D \macros
+%D {installspecial,
+%D resetspecials}
+%D {}
+%D
+%D We have to install specials before we can define and use
+%D them. The command itself is defined as a call to another
+%D command that executes one or more user||defined specials,
+%D depending of it's category: \type{or} versus \type{and}.
+%D
+%D The command \type{\installspecial} takes three
+%D (non||optional) arguments: the name of the command, the
+%D category it belongs to and the number of arguments it
+%D takes.
+%D
+%D With \type{\resetspecials} we can unload the predefined
+%D specials.
+
+\def\@@allspecials{}
+
+\def\doinstallspecial[#1][#2][#3]%
+ {\setvalue{\@@speclst@@\string#1}{}%
+ \setvalue{\@@speccat@@\string#1}{#2}%
+ \setvalue{\@@specarg@@\string#1}{#3}%
+ \addtocommalist{\string#1}\@@allspecials
+ \def#1{\executespecial#1}}
+
+\def\installspecial%
+ {\dotripleargument\doinstallspecial}
+
+\def\resetspecials%
+ {\def\docommando##1%
+ {\setvalue{\@@speclst@@##1}{}}%
+ \processcommacommand[\@@allspecials]\docommando
+ \showmessage{\m!specials}{3}{\preloadedspecials}%
+ \def\preloadedspecials{}%
+ \def\@@allspecials{}}
+
+%D \macros
+%D {definespecial}
+%D {}
+%D
+%D The command \type{\definespecial} take the place of
+%D \type{\def} in the definition of a special. Just to be
+%D sure, we first check if the command is permitted, i.e.
+%D installed. If not, we give a warning and gobble the
+%D illegal command in an quite elegant way.
+%D
+%D If the command can be combined (\type{and}) with others,
+%D we append it to a list, otherwise (\type{or}) it becomes
+%D the only item in the list.
+
+\def\definespecial#1%
+ {\ifx#1\undefined
+ \showmessage{\m!specials}{4}{\string#1}%
+ \def\next%
+ {\def\@@illegalspecial@@}%
+ \else
+ \def\next%
+ {\doifelse{\getvalue{\@@speccat@@\string#1}}{or}
+ {\edef\@@newspeclst@@{\currentspecial}}
+ {\edef\@@newspeclst@@{\getvalue{\@@speclst@@\string#1}}%
+ \addtocommalist{\currentspecial}\@@newspeclst@@}%
+ \setevalue{\@@speclst@@\string#1}{\@@newspeclst@@}%
+ \setvalue{\currentspecial\string#1}}%
+ \fi
+ \next}
+
+%D \macros
+%D {usespecials}
+%D {}
+%D
+%D We use \type{\usespecials} to load a specific library.
+%D This command is only permitted outside de definition part.
+
+\def\dousespecials#1%
+ {\doifelse{#1}{\v!reset}
+ {\resetspecials}
+ {\doifdefinedelse{\@@specfil@@#1}
+ {\edef\currentspecialfile{\getvalue{\@@specfil@@#1}}}
+ {\edef\currentspecialfile{#1}}%
+ \makeshortfilename[\f!specialprefix\currentspecialfile]%
+ \showmessage{\m!specials}{5}{\currentspecialfile}%
+ \startreadingfile
+ \readsysfile{\shortfilename}{}{}%
+ \stopreadingfile
+ \showmessage{\m!specials}{1}{\preloadedspecials}}}
+
+\def\usespecials[#1]%
+ {\doifelsenothing{\currentspecial}
+ {\processcommalist[#1]\dousespecials}
+ {\showmessage{\m!specials}{6}{}}}
+
+%D \macros
+%D {executespecials}
+%D {}
+%D
+%D The command \type{\executespecials} is used to execute the
+%D defined specials. Once a special is installed, the special
+%D itself calls for this command, so it's not needed outside
+%D this module. One can use it if wanted.
+%D
+%D A former implementation grouped the execution. Recent
+%D additions however |<|like the specials that implement object
+%D handling|>| asked for non||grouped execution.
+
+\def\executespecials#1#2%
+ {\def\doonespecial##1%
+ {\getvalue{##1\string#1}#2\relax}%
+ \processcommacommand
+ [\getvalue{\@@speclst@@\string#1}]\doonespecial}
+
+\def\executespecial#1%
+ {\expandafter\ifcase\getvalue{\@@specarg@@\string#1}\relax
+ \def\next%
+ {\executespecials#1{}}%
+ \or
+ \def\next##1%
+ {\executespecials#1{{##1}}}%
+ \or
+ \def\next##1##2%
+ {\executespecials#1{{##1}{##2}}}%
+ \or
+ \def\next##1##2##3%
+ {\executespecials#1{{##1}{##2}{##3}}}%
+ \or
+ \def\next##1##2##3##4%
+ {\executespecials#1{{##1}{##2}{##3}{##4}}}%
+ \or
+ \def\next##1##2##3##4##5%
+ {\executespecials#1{{##1}{##2}{##3}{##4}{##5}}}%
+ \or
+ \def\next##1##2##3##4##5##6%
+ {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}}}%
+ \or
+ \def\next##1##2##3##4##5##6##7%
+ {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}}}%
+ \or
+ \def\next##1##2##3##4##5##6##7##8%
+ {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}}}%
+ \or
+ \def\next##1##2##3##4##5##6##7##8##9%
+ {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}{##9}}}%
+ \else
+ \def\next%
+ {\message{illegal special: \string#1}}%
+ \fi
+ \next}
+
+%D The \type{{{...}}} are needed because we pass all those
+%D arguments to the specials support macro.
+
+\let\openspecialfile = \relax
+\let\closespecialfile = \relax
+
+% %D This is some new, experimental code, used for testing some
+% %D proposals of Laurent Siebenmann on behalf of the
+% %D \kap{EMJ} discussionlist.
+%
+% \newif\ifexternalspecials \externalspecialsfalse
+% \newif\ifspecialstatus \specialstatustrue
+%
+% \newwrite\specialfile
+%
+% \def\openspecialfile%
+% {\immediate\openout\specialfile=\jobname.etc\relax}
+%
+% \def\closespecialfile%
+% {\immediate\closeout\specialfile}
+%
+% \let\internalspecial=\special
+%
+% \def\externalspecial#1%
+% {\internalspecial{}%
+% \immediate\write\specialfile{\currentspecialdriver\space: #1}}
+%
+% \def\doinstallspecial[#1][#2][#3]%
+% {\setvalue{\@@specexc@@\string#1}{}%
+% \setvalue{\@@speclst@@\string#1}{}%
+% \setvalue{\@@speccat@@\string#1}{#2}%
+% \setvalue{\@@specarg@@\string#1}{#3}%
+% \addtocommalist{\string#1}\@@allspecials
+% \def#1{\executespecial#1}}
+%
+% \def\resetspecials%
+% {\def\docommando##1%
+% {\setvalue{\@@specexc@@##1}{}%
+% \setvalue{\@@speclst@@##1}{}}%
+% \processcommacommand[\@@allspecials]\docommando
+% \showmessage{\m!specials}{3}{\preloadedspecials}}
+%
+% \def\executespecials#1#2%
+% {\edef\supportedspecials{\getvalue{\@@speclst@@\string#1}}%
+% \def\doonespecial##1%
+% {\doifdefined{##1\string#1}
+% {\def\currentspecialdriver{##1}%
+% \getvalue{##1\string#1}#2\relax}}%
+% \ifexternalspecials
+% \let\special=\externalspecial
+% \doifelse{\supportedspecials}{}
+% {\ifspecialstatus
+% \immediate\write\specialfile{}%
+% \immediate\write\specialfile{skipping : \string#1}
+% \immediate\write\specialfile{}%
+% \fi}
+% {\ifspecialstatus
+% \immediate\write\specialfile{}%
+% \immediate\write\specialfile{executing : \string#1}%
+% \immediate\write\specialfile{supported : \supportedspecials}%
+% \fi
+% \immediate\write\specialfile{}%
+% \processcommacommand[\supportedspecials]\doonespecial}%
+% \else
+% \let\special=\internalspecial
+% \doifelse{\getvalue{\@@speccat@@\string#1}}{or}
+% {\doonespecial{\getvalue{\@@specexc@@\string#1}}}
+% {\processcommacommand[\supportedspecials]\doonespecial}%
+% \fi}
+%
+% \def\definespecial#1%
+% {\ifx#1\undefined
+% \showmessage{\m!specials}{4}{\string#1}%
+% \def\next%
+% {\def\@@illegalspecial@@}%
+% \else
+% \def\next%
+% {\edef\@@newspeclst@@{\getvalue{\@@speclst@@\string#1}}%
+% \addtocommalist{\currentspecial}\@@newspeclst@@
+% \setevalue{\@@speclst@@\string#1}{\@@newspeclst@@}%
+% \setevalue{\@@specexc@@\string#1}{\currentspecial}%
+% \setvalue{\currentspecial\string#1}}%
+% \fi
+% \next}
+%
+% %D So far for the experiment.
+
+\protect
+
+%D The following libraries are defined. Two postscript
+%D drivers are supported, as well as two mechanisms for
+%D interactive texts.
+%D
+%D \startregelcorrectie
+%D \starttabel[|l|l|l|l|l|]
+%D \HL
+%D \NC \bf file \NC
+%D \bf name \NC
+%D \bf calls \NC
+%D \bf support \NC
+%D \bf program / driver \NC\SR
+%D \HL
+%D \NC \tttf spec-tex \NC
+%D \tttf tex \NC
+%D \NC
+%D Generic \TEX\ (\DVI) \NC
+%D (default) \NC\FR
+%D \NC \tttf spec-ps \NC
+%D \tttf postscript \NC
+%D \NC
+%D Adobe PostScript \NC
+%D (default) \NC\MR
+%D \NC \tttf spec-tr \NC
+%D \tttf rokicky \NC
+%D \tttf postscript \NC
+%D Thomas Rokicky \NC
+%D (dvips) \NC\MR
+%D \NC \tttf spec-yy \NC
+%D \tttf yandy \NC
+%D \tttf postscript \NC
+%D YandY \NC
+%D (dvipsone, dviwindo) \NC\MR
+%D \NC \tttf spec-pdf \NC
+%D \tttf pdf \NC
+%D \NC
+%D Adobe PDF V2.1 \NC
+%D (Acrobat) \NC\MR
+%D \NC \tttf spec-win \NC
+%D \tttf dviwindo \NC
+%D YandY \NC
+%D (dviwindo) \NC\MR
+%D \NC \tttf spec-1p0 \NC
+%D \tttf pdf \NC
+%D \NC
+%D Adobe PDF V 1.0 \NC
+%D (Acrobat) \NC\MR
+%D \NC \tttf spec-2p0 \NC
+%D \tttf pdf \NC
+%D \NC
+%D Adobe PDF V 2.0 \NC
+%D (Acrobat) \NC\MR
+%D \NC \tttf spec-htm \NC
+%D \tttf html \NC
+%D \NC
+%D HTML V 2.0 \NC
+%D (dvips) \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+
+%D \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode}
+%D {}
+%D
+%D We start with the installation of color and grayscale
+%D specials. The values are in the range 0..1 (e.g. 0.25).
+%D
+%D \starttypen
+%D \dostartgraymode {gray} ... \dostopgraymode
+%D \dostartrgbcolormode {red} {green} {blue} ... \dostopcolormode
+%D \dostartcmykcolormode {cyan} {magenta} {yellow} {black} ... \dostopcolormode
+%D \dostartgraycolormode {gray} ... \dostopcolormode
+%D \stoptypen
+%D
+%D Because we can expect conflicts between drivers, we
+%D implement them as category \type{or}. In previous versions
+%D of \DVIPSONE\ the use of their color||specials did not
+%D interfere with the PostScript ones, but recent versions do.
+
+\installspecial [\dostartgraymode] [or] [1]
+\installspecial [\dostopgraymode] [or] [0]
+
+\installspecial [\dostartrgbcolormode] [or] [3]
+\installspecial [\dostartcmykcolormode] [or] [4]
+\installspecial [\dostartgraycolormode] [or] [1]
+\installspecial [\dostopcolormode] [or] [0]
+
+%D \macros
+%D {doinsertfile}
+%D {}
+%D
+%D Probably the most problematic special is the following
+%D one. Because we want to be able to support different
+%D schemes, we pass a lot of data to it.
+%D
+%D \starttypen
+%D \doinsertfile {type,method} {file}
+%D {xscale} {yscale} {x} {y} {w} {h}
+%D {options}
+%D \stoptypen
+%D
+%D The scale is given percents, the other values are base
+%D points.
+%D
+%D The special is implemented as \type{or}. Because
+%D \DVIPSONE\ understands them all, a chain of alternatives
+%D would generate multiple courrences of the same
+%D illustration.
+%D
+%D When option 1 is passed, the viewers is asked to present a
+%D preview, like the first frame of a movie.
+
+\installspecial [\doinsertfile] [or] [9]
+
+%D \macros
+%D {dostartrotation,
+%D dostoprotation}
+%D {}
+%D
+%D We support rotation with the special:
+%D
+%D \starttypen
+%D \dostartrotation {angle} ... \dostoprotation
+%D \stoptypen
+%D
+%D For the moment these specials are installed as
+%D category \type{or}.
+
+\installspecial [\dostartrotation] [or] [1]
+\installspecial [\dostoprotation] [or] [0]
+
+%D \macros
+%D {dostartscaling,
+%D dostopscaling}
+%D {}
+%D
+%D Scaling is also supported:
+%D
+%D \starttypen
+%D \dostartscaling {x} {y} ... \dostopscaling
+%D \stoptypen
+%D
+%D Like the previous one, these specials are of category
+%D \type{or}.
+
+\installspecial [\dostartscaling] [or] [2]
+\installspecial [\dostopscaling] [or] [0]
+
+%D \macros
+%D {dostartmirroring,
+%D dostopmirroring}
+%D {}
+%D
+%D And indeed, mirroring is there too:
+%D
+%D \starttypen
+%D \dostartmirroring {x} {y} ... \dostopmirroring
+%D \stoptypen
+%D
+%D Again these specials are installed as category \type{or}.
+
+\installspecial [\dostartmirroring] [or] [0]
+\installspecial [\dostopmirroring] [or] [0]
+
+%D \macros
+%D {dostartnegative,
+%D dostopnegative}
+%D {}
+%D
+%D When producing output for an image setter, negating the
+%D page comes into view. Here are the tools:
+
+\installspecial [\dostartnegative] [or] [0]
+\installspecial [\dostopnegative] [or] [0]
+
+%D \macros
+%D {doselectfirstpaperbin,
+%D doselectsecondpaperbin}
+%D {}
+%D
+%D Here are some very printer||specific ones. No further
+%D comment.
+
+\installspecial [\doselectfirstpaperbin] [or] [0]
+\installspecial [\doselectsecondpaperbin] [or] [0]
+
+%D \macros
+%D {doovalbox}
+%D {}
+%D
+%D When we look at the implementation, this is a complicated
+%D one. There are seven arguments.
+%D
+%D \starttypen
+%D \doovalbox {w} {h} {d} {linewidth} {radius} {stroke} {fill}
+%D \stoptypen
+%D
+%D This command has to return a \type{\vbox} which can be used
+%D to lay over another one (with text). The radius is in
+%D degrees, the stroke and fill are~\type{1} (true) of~\type{0}
+%D (false).
+
+\installspecial [\doovalbox] [or] [7]
+
+%D \macros
+%D {dosetupidentity}
+%D {}
+%D
+%D We can declare some characteristics of the document with
+%D
+%D \starttypen
+%D \dosetupidentity {title} {subject} {author} {creator} {date}
+%D \stoptypen
+%D
+%D All data is in string format.
+
+\installspecial [\dosetupidentity] [and] [5]
+
+%D \macros
+%D {dosetuppaper}
+%D {}
+%D
+%D This special can be used to tell the driver what page size
+%D to use. The special takes three arguments.
+%D
+%D \starttypen
+%D \dosetuppaper {type} {width} {height}
+%D \stoptypen
+%D
+%D The type is one of the common identifiers, like A4, A5 or
+%D B2.
+
+\installspecial [\dosetuppaper] [and] [3]
+
+%D \macros
+%D {dosetupprinter}
+%D {}
+%D
+%D Some drivers enable the user to specify the paper type
+%D used and/or page dimensions to be taken into account.
+%D
+%D \starttypen
+%D \dosetupprinter {type} {hoffset} {voffset} {width} {height}
+%D \stoptypen
+%D
+%D The first argument is one of \type{letter}, \type{legal},
+%D \type{A4}, \type{A5} etc. The dimensions are in
+%D basepoints.
+
+\installspecial [\dosetupprinter] [and] [5]
+
+%D \macros
+%D {dosetuppage,
+%D dosetupinteraction,
+%D dosetupscreen}
+%D {}
+%D
+%D Here come some obscure interactive commands. Probably the
+%D specs will change with the development of the macros that
+%D use them.
+%D
+%D The first ones can be used to set up the interaction.
+%D
+%D \starttypen
+%D \dosetupinteraction
+%D \stoptypen
+%D
+%D Normally this command does nothing but giving a message
+%D that some scheme is supported. Postscript prolog files
+%D can best be loaded by the printer driver program.
+%D
+%D The second one sets up the screen. It takes three
+%D arguments:
+%D
+%D \starttypen
+%D \dosetupscreen {hoffset} {voffset} {width} {height} {options}
+%D \stoptypen
+%D
+%D The first four arguments are in scaled points. Option~1
+%D results in a full screen launch.
+
+\installspecial [\dosetupinteraction] [and] [0]
+\installspecial [\dosetupscreen] [and] [5]
+
+%D \macros
+%D {dostarthide,
+%D dostophide}
+%D {}
+%D
+%D Not every part of the screen is suitable for paper. Menus
+%D for instance have no meaning on an non||interactive medium.
+%D These elements are hidden by means of:
+%D
+%D \starttypen
+%D \dostarthide
+%D \dostophide
+%D \stoptypen
+
+\installspecial [\dostarthide] [or] [0]
+\installspecial [\dostophide] [or] [0]
+
+%D \macros
+%D {dostartgotolocation, dostopgotolocation,
+%D dostartgotorealpage, dostopgotorealpage}
+%D {}
+%D
+%D The interactive real work is done by the following four
+%D specials. The reason for providing the first one with both
+%D a label and a number, is a result of the quite poor
+%D implementation of \type{pdfmarks} in version 1.0 of
+%D Acrobat. Because only pagenumbers were supported as
+%D destination, we had to provide both labels (\DVIWINDO) and
+%D pagenumbers (\PDF). Some drivers use start stop pairs.
+%D
+%D \starttypen
+%D \dostartgotolocation {w} {h} {url} {file} {label} {page}
+%D \dostartgotorealpage {w} {h} {url} {file} {page}
+%D \stoptypen
+%D
+%D Their counterparts are:
+%D
+%D \starttypen
+%D \dostopgotolocation
+%D \dostopgotorealpage
+%D \stoptypen
+%D
+%D The internal alternative is used for system||generated
+%D links, the external one for user||generated links. The
+%D Uniform Resource Locator can be used to let the reader
+%D surf the net.
+
+\installspecial [\dostartgotolocation] [and] [6]
+\installspecial [\dostopgotolocation] [and] [0]
+\installspecial [\dostartgotorealpage] [and] [5]
+\installspecial [\dostopgotorealpage] [and] [0]
+
+%D \macros
+%D {dostartgotoJS, doflushJSpreamble}
+%D
+%D
+%D Rather special is the option to include and execute
+%D JavaScript code. This is a typical \PDF\ option.
+%D
+%D \starttypen
+%D \dostartgotoJS {w} {h} {script}
+%D \stoptypen
+%D
+%D This not so standard \TEX\ feature should be used with
+%D care. Preamble scripts are flushed by
+%D
+%D \doflushJSpreamble {script}
+
+\installspecial [\dostartgotoJS] [and] [3]
+\installspecial [\dostopgotoJS] [and] [0]
+\installspecial [\doflushJSpreamble][and] [1]
+
+%D \macros
+%D {dostartthisislocation, dostopthisislocation,
+%D dostartthisisrealpage, dostopthisisrealpage}
+%D {}
+%D
+%D The opposite commands of \type{\dogotosomething} have only
+%D one argument:
+%D
+%D \starttypen
+%D \dostartthisislocation {label}
+%D \dostartthisisrealpage {page}
+%D \stoptypen
+%D
+%D These commands are accompanied by:
+%D
+%D \starttypen
+%D \dostopthisislocation
+%D \dostopthisisrealpage
+%D \stoptypen
+%D
+%D As with all interactive commands's they are installed as
+%D \type{and} category specials.
+
+\installspecial [\dostartthisislocation] [and] [1]
+\installspecial [\dostopthisislocation] [and] [0]
+\installspecial [\dostartthisisrealpage] [and] [1]
+\installspecial [\dostopthisisrealpage] [and] [0]
+
+%D \macros
+%D {dostartexecutecommand, dostopexecutecommand}
+%D {}
+%D
+%D The actual behavior of the next pair of commands depends
+%D much on the viewing engine. Therefore one cannot depend
+%D too much on their support.
+%D
+%D \starttypen
+%D \dostartexecutecommand {w} {h} {command} {options}
+%D \stoptypen
+%D
+%D
+%D The next commands are supported:
+%D
+%D \startregelcorrectie\steluitlijnenin[midden]\leavevmode
+%D \starttabel[|l|l|]
+%D \HL
+%D \NC \bf command \NC \bf action \NC\SR
+%D \HL
+%D \NC first \NC go to the first page \NC\FR
+%D \NC previous \NC go to the previous page \NC\MR
+%D \NC next \NC go to the next page \NC\MR
+%D \NC last \NC go to the last page \NC\MR
+%D \NC backward \NC go back to the link list \NC\MR
+%D \NC forward \NC go forward in the link list \NC\MR
+%D \NC print \NC enter print mode \NC\MR
+%D \NC exit \NC exit viewer \NC\MR
+%D \NC close \NC close document \NC\MR
+%D \NC enter \NC enter viewer \NC\MR
+%D \NC help \NC show help on the viewer \NC\LR
+%D \HL
+%D \stoptabel
+%D \stopregelcorrectie
+%D
+%D There are no options yet. Options are to be passed as a
+%D comma separated list of assignments.
+
+\installspecial [\dostartexecutecommand] [and] [4]
+\installspecial [\dostopexecutecommand] [and] [0]
+
+%D \macros
+%D {dostartobject,
+%D dostopobject,
+%D doinsertobject}
+%D
+%D Reuse of object can reduce the output filesize
+%D considerably. Reusable objects are implemented with:
+%D
+%D \starttypen
+%D \dostartobject{name}{width}{height}{depth}
+%D some typeset material
+%D \dostopobject
+%D \stoptypen
+%D
+%D \starttypen
+%D \doinsertobject{name}
+%D \stoptypen
+%D
+%D The savings can be huge in interactive texts.
+
+\installspecial [\dostartobject] [or] [4]
+\installspecial [\dostopobject] [or] [0]
+\installspecial [\doinsertobject] [or] [1]
+
+% %D \macros
+% %D {dogetobjectreference}
+% %D
+% %D For very special purposes, one can ask for the internal
+% %D reference to the object. Beware!
+%
+% \installspecial [\dogetobjectreference] [or] [2]
+%
+% %D The first argument is the name, the second a macro that
+% %D gets the assiciated value.
+
+%D \macros
+%D {dostartrunprogram, dostoprunprogram,
+%D dostartgotoprofile, dostopgotoprofile,
+%D dobeginofprofile,
+%D doendofprofile}
+%D {}
+%D
+%D These specials are still experimental. They are not yet
+%D supported by the programs the way they should be.
+%D
+%D {\em --- still undocumented ---}
+
+\installspecial [\dostartrunprogram] [and] [3]
+\installspecial [\dostoprunprogram] [and] [0]
+\installspecial [\dostartgotoprofile] [and] [3]
+\installspecial [\dostopgotoprofile] [and] [0]
+\installspecial [\dobeginofprofile] [and] [4]
+\installspecial [\doendofprofile] [and] [0]
+
+%D \macros
+%D {doinsertbookmark}
+%D
+%D Bookmarks, that is viewer generated tables of contents, are
+%D a strange phenomena, mainly because \TEX\ can provide
+%D whatever kind of table in much better quality.
+
+\installspecial [\doinsertbookmark] [and] [5]
+
+%D This special is called as:
+%D
+%D \starttypen
+%D \doinstallbookmark {level} {nofsubentries} {text} {page} {open}
+%D \stoptypen
+%D
+%D This definition is very \PDF\ oriented, so for more
+%D information we kindly refer to the \PDF\ manuals.
+
+%D \macros
+%D {dosetpagetransition}
+%D
+%D In presentations, fancy page transitions can, at least for a
+%D short moment, let the audience focus at the screen. Like the
+%D previous one, this special is very \PDF.
+%D
+%D \starttypen
+%D \dosetpagetransition{dissolve}
+%D \stoptypen
+%D
+%D Transitions have symbolic names, like dissolve, box, split,
+%D blinds, wipe and glitter.
+
+\installspecial [\dosetpagetransition] [or] [1]
+
+%D So far for the installation. Finally we preload our
+%D favorite set of specials.
+
+\usespecials[ps,yy,win,pdf]
+
+%D One can overrule this by for instance
+%D
+%D \starttypen
+%D \usespecials[reset,ps,tr,pdf]
+%D \stoptypen
+
+\endinput
diff --git a/tex/context/base/spec-mis.tex b/tex/context/base/spec-mis.tex index 8b03e33b1..21f099c7b 100644 --- a/tex/context/base/spec-mis.tex +++ b/tex/context/base/spec-mis.tex @@ -1,131 +1,137 @@ -%D \module -%D [ file=spec-mis, -%D version=1997.04.01, -%D title=\CONTEXT\ Special Macros, -%D subtitle=Miscellaneous Macros, -%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. - -%D Quite some modules in this group are dedicated to supporting -%D \PDF\ directly by means of \PDFTEX or indirectly by using -%D Acrobat Distiller. This module implements some common -%D features. - -\writestatus{loading}{Context Special Macros / Miscellaneous Macros} - -\unprotect - -%D \macros -%D {setPDFdestination} -%D -%D \PDF\ destinations should obey the specifications laid down -%D in the \PDF\ reference manual. The next macro strips illegal -%D characters from the destination name. - -\def\setPDFdestination#1% - {\bgroup - \obeylccodes - \lccode`\/=`-\lccode`\#=`-\lccode`\<=`-\lccode`\>=`-% - \lccode`\[=`-\lccode`\]=`-\lccode`\(=`-\lccode`\)=`-% - \stripcharacter{ }\from#1\to\PDFdestination - \@EA\lowercase\@EA{\@EA\xdef\@EA\PDFdestination\@EA{\PDFdestination}}% - \egroup} - -%D \macros -%D {URLhash} -%D -%D A rather trivial macro: - -\expandafter\def\expandafter\URLhash\expandafter{\string#} - -%D \macros -%D {ifusepagedestinations} -%D -%D In \PDF\ version 1.0 only page references were supported, -%D while in \DVIWINDO\ 1.N only named references were accepted. -%D Therefore \CONTEXT\ supports both methods of referencing. In -%D \PDF\ version 1.1 named destinations arrived. Lack of -%D continuous support of version 1.1 viewers for \MSDOS\ -%D therefore sometimes forces us to prefer page references. As -%D a bonus, they are faster too and have no limitations. How -%D fortunate we were having both mechanisms available when the -%D version 3.0 (\PDF\ version 1.2) viewers proved to be too -%D bugged to support named destinations. - -\newif\ifusepagedestinations - -%D \macros -%D {sanitizePDFstring} -%D -%D This macro at least tries to convert a arbitrary string -%D into a sequence of characters valid for \PDF\ bookmarks and -%D alike. It's a slow one, that uses \type{\lccode}'s to -%D change the glyph as well as converts sensisitve ones into a -%D \PDF\ command sequence, so \type{(} becomes \type{\(}. In -%D fact we translate the string to lowercase inactive and non -%D special characters, limit their number and finaly convert -%D some of the characters to save ones. - -\chardef\maxPDFstringsize=60 - -\def\sanitizePDFstring#1\to#2% - {\bgroup - \obeylccodes - \lccode`( =1 \lccode`) =1 - \lccode`< =1 \lccode`> =1 - \lccode`[ =1 \lccode`] =1 - \lccode`\\=1 \lccode`/ =1 - \lowercase{\convertargument#1\to\ascii}% - % by integrating the split in the loop below - % \splitofftokens\maxPDFstringsize\from\ascii\to\ascii - % we diminish the processing time considerably - \scratchcounter=\maxPDFstringsize - \def\docommando##1% - {\ifnum\scratchcounter>0 - \advance\scratchcounter by -1 - \ifcase\lccode`##1\relax - \xdef#2{#2.}% let's show that something is missing - \or - \xdef#2{#2\expandafter\string\csname##1\endcsname}% - \else - \xdef#2{#2##1}% - \fi - \fi}% - %\global\let#2=\empty - % or to permit #2 to be \ascii too: - \@EA\global\@EA\let\@EA#2\@EA\empty - \@EA\handletokens\ascii\with\docommando - \egroup} - -%D \macros -%D {dodoinsertfile} -%D -%D File insertion depend on the driver or \TEX\ variant used. -%D All driver modules use the same scheme for file insertion, -%D and therefore have the next macro in common: - -\def\dododoinsertfile[#1][#2,#3][#4]% - {\def\fileinsertionclass{do#1insert}% - \doifdefinedelse{\fileinsertionclass#3} - {\def\next{\getvalue{\fileinsertionclass#3}}} - {\doifdefinedelse{\fileinsertionclass#2} - {\def\next{\getvalue{\fileinsertionclass#2}}} - {\def\next{\gobbleeightarguments}}}% - \next{#4}} - -\def\dodoinsertfile#1#2#3% - {\dododoinsertfile[#1][#2][#3]} - -%D This macro is called with 10 arguments, where the first -%D one specifies the driver, like \type{yy} or \type{tr}. The -%D second argument is a \type{{type,method}} pair and the -%D third the filename. - -\protect - -\endinput +%D \module
+%D [ file=spec-mis,
+%D version=1997.04.01,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Miscellaneous Macros,
+%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.
+
+%D Quite some modules in this group are dedicated to supporting
+%D \PDF\ directly by means of \PDFTEX or indirectly by using
+%D Acrobat Distiller. This module implements some common
+%D features.
+
+\writestatus{loading}{Context Special Macros / Miscellaneous Macros}
+
+\unprotect
+
+%D \macros
+%D {setPDFdestination}
+%D
+%D \PDF\ destinations should obey the specifications laid down
+%D in the \PDF\ reference manual. The next macro strips illegal
+%D characters from the destination name.
+%D
+%D The \ACROBAT\ programs are not bug free. By setting the next
+%D switch, we will at least try to prevent problems.
+
+\newif\ifovercomePDFbugs \overcomePDFbugstrue
+
+\def\setPDFdestination#1%
+ {\bgroup
+ \obeylccodes
+ \lccode`\/=`-\lccode`\#=`-\lccode`\<=`-\lccode`\>=`-%
+ \lccode`\[=`-\lccode`\]=`-\lccode`\(=`-\lccode`\)=`-%
+ \stripcharacter{ }\from#1\to\PDFdestination
+ \@EA\lowercase\@EA{\@EA\xdef\@EA\PDFdestination\@EA
+ {\ifovercomePDFbugs'\fi\PDFdestination\ifovercomePDFbugs'\fi}}%
+ \egroup}
+
+%D \macros
+%D {URLhash}
+%D
+%D A rather trivial macro:
+
+\expandafter\def\expandafter\URLhash\expandafter{\string#}
+
+%D \macros
+%D {ifusepagedestinations}
+%D
+%D In \PDF\ version 1.0 only page references were supported,
+%D while in \DVIWINDO\ 1.N only named references were accepted.
+%D Therefore \CONTEXT\ supports both methods of referencing. In
+%D \PDF\ version 1.1 named destinations arrived. Lack of
+%D continuous support of version 1.1 viewers for \MSDOS\
+%D therefore sometimes forces us to prefer page references. As
+%D a bonus, they are faster too and have no limitations. How
+%D fortunate we were having both mechanisms available when the
+%D version 3.0 (\PDF\ version 1.2) viewers proved to be too
+%D bugged to support named destinations.
+
+\newif\ifusepagedestinations
+
+%D \macros
+%D {sanitizePDFstring}
+%D
+%D This macro at least tries to convert a arbitrary string
+%D into a sequence of characters valid for \PDF\ bookmarks and
+%D alike. It's a slow one, that uses \type{\lccode}'s to
+%D change the glyph as well as converts sensisitve ones into a
+%D \PDF\ command sequence, so \type{(} becomes \type{\(}. In
+%D fact we translate the string to lowercase inactive and non
+%D special characters, limit their number and finaly convert
+%D some of the characters to save ones.
+
+\chardef\maxPDFstringsize=60
+
+\def\sanitizePDFstring#1\to#2%
+ {\bgroup
+ \obeylccodes
+ \lccode`( =1 \lccode`) =1
+ \lccode`< =1 \lccode`> =1
+ \lccode`[ =1 \lccode`] =1
+ \lccode`\\=1 \lccode`/ =1
+ \lowercase{\convertargument#1\to\ascii}%
+ % by integrating the split in the loop below
+ % \splitofftokens\maxPDFstringsize\from\ascii\to\ascii
+ % we diminish the processing time considerably
+ \scratchcounter=\maxPDFstringsize
+ \def\docommando##1%
+ {\ifnum\scratchcounter>0
+ \advance\scratchcounter by -1
+ \ifcase\lccode`##1\relax
+ \xdef#2{#2.}% let's show that something is missing
+ \or
+ \xdef#2{#2\expandafter\string\csname##1\endcsname}%
+ \else
+ \xdef#2{#2##1}%
+ \fi
+ \fi}%
+ %\global\let#2=\empty
+ % or to permit #2 to be \ascii too:
+ \@EA\global\@EA\let\@EA#2\@EA\empty
+ \@EA\handletokens\ascii\with\docommando
+ \egroup}
+
+%D \macros
+%D {dodoinsertfile}
+%D
+%D File insertion depend on the driver or \TEX\ variant used.
+%D All driver modules use the same scheme for file insertion,
+%D and therefore have the next macro in common:
+
+\def\dododoinsertfile[#1][#2,#3][#4]%
+ {\def\fileinsertionclass{do#1insert}%
+ \doifdefinedelse{\fileinsertionclass#3}
+ {\def\next{\getvalue{\fileinsertionclass#3}}}
+ {\doifdefinedelse{\fileinsertionclass#2}
+ {\def\next{\getvalue{\fileinsertionclass#2}}}
+ {\def\next{\gobbleeightarguments}}}%
+ \next{#4}}
+
+\def\dodoinsertfile#1#2#3%
+ {\dododoinsertfile[#1][#2][#3]}
+
+%D This macro is called with 10 arguments, where the first
+%D one specifies the driver, like \type{yy} or \type{tr}. The
+%D second argument is a \type{{type,method}} pair and the
+%D third the filename.
+
+\protect
+
+\endinput
diff --git a/tex/context/base/spec-pdf.tex b/tex/context/base/spec-pdf.tex index 5d6375e65..0500eb7d2 100644 --- a/tex/context/base/spec-pdf.tex +++ b/tex/context/base/spec-pdf.tex @@ -1,535 +1,494 @@ -%D \module -%D [ file=spec-pdf, -%D version=1997.09.20, -%D title=\CONTEXT\ Special Macros, -%D subtitle=Adobe \PDF\ version 1.2, -%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. - -\unprotect - -%D \macros -%D {dosetupinteraction, -%D dosetupscreen, -%D dosetupidentity, -%D dostartthisislocation, -%D dostartgotolocation, -%D dostartgotorealpage, -%D doflushJSpreamble, -%D dostartgotoJS, -%D dostartcommand, -%D dostartgotoprofile, -%D dobeginofprofile, -%D doendofprofile, -%D dostartrunprogram, -%D dostartobject, -%D dostopobject, -%D doinsertobject, -%D doinsertbookmark, -%D dosetpagetransition, -%D usepagedestinations} -%D {} -%D -%D These specials are not as beautiful as they should be. The -%D main reason for this is that we started with \DVIWINDO, -%D which lacks support of \EPS||insertions, but offered a -%D powerfull linking mechanism. The first version -%D of \PDF\ did not support labels but only pagenumbers. -%D This dreadfull omission was corrected in version 2.0, but -%D we continue to support both alternatives. One never knows. -%D -%D Although the concepts behind the \type{pdfmark}'s are -%D still far from perfect, version 2.1 brought another -%D change. This time the format was changed. So much for -%D upward compatibility. - -\startspecials[pdf] - -%D Instead of a prolog, we can put the code in the file -%D ourselve. -%D -%D \starttypen -%D \definespecial\dosetupinteraction% -%D {\special -%D {\@@insertpostscriptretain -%D /pdfmark where -%D {pop} -%D {userdict /pdfmark /cleartomark load put} -%D ifelse}} -%D \stoptypen -%D -%D We decided to use a prolog file. The following code has to be -%D put somewhere. To overcome problems, we always embed the -%D fonts, but copyrights force us always to make subsets. -%D -%D \starttypen -%D /currentdistillerparams where -%D { pop } { userdict /currentdistillerparams { 1 dict } put } ifelse -%D -%D /setdistillerparams where -%D { pop } { userdict /setdistillerparams { pop } put } ifelse -%D -%D << /AntiAliasColorImages true -%D /AntiAliasGrayImages true -%D /AntiAliasMonoImages true -%D /ConvertCMYKImagesToRGB true -%D /MaxSubsetPct 99 -%D /EmbedAllFonts true -%D /SubSetFonts true >> setdistillerparams -%D \stoptypen -%D -%D Beware, this is the PostScript Level 2 way of doing things. - -\definespecial\dosetupinteraction% - {\showmessage{\m!interactions}{21}{acrobat}} - -\definespecial\dostartthisislocation#1% - {\ifusepagedestinations \else - \setPDFdestination{#1}% - \doifsomething{\PDFdestination} - {\special - {\@@insertpostscriptretain - [/Dest /\PDFdestination\space % (\PDFdestination) - /View [/Fit] - /DEST - pdfmark}}% - \fi} - -\definespecial\dostartgotolocation#1#2#3#4#5#6% - {\bgroup - \ScaledPointsToBigPoints{#1}\width - \ScaledPointsToBigPoints{#2}\height - \doifelsenothing{#3} - {\doifelsenothing{#4} - {\!!doneafalse} - {\doifparentfileelse{#4} - {\!!doneafalse} - {\!!doneatrue}}% - \ifusepagedestinations - \doifnot{0#6}{0} - {\special - {\@@insertpostscriptretain - [\if!!donea - /Action /GoToR - /File (#4.pdf) - \else - /Action /GoTo - \fi - /Rect [0 0 \width\space \height] - /Border [0 0 0] - /Page #6 - /View [/Fit] - /Subtype /Link - /ANN - pdfmark}}% - \else - \setPDFdestination{#5}% - \doifsomething{\PDFdestination} - {\special - {\@@insertpostscriptretain - [\if!!donea - /Action /GoToR - /File (#4.pdf) - \else - /Action /GoTo - \fi - /Rect [0 0 \width\space \height] - /Border [0 0 0] - /Dest /\PDFdestination\space % (\PDFdestination) - /Subtype /Link - /ANN - pdfmark}}% - \fi} - {\doifelsenothing{#4} - {\let\PDFfile=\empty - \let\PDFdestination=\empty} - {\edef\PDFfile{/#4}% - \setPDFdestination{#5}% - \doifsomething{\PDFdestination} - {\edef\PDFdestination{\URLhash\PDFdestination}}}% - \special - {\@@insertpostscriptretain - [/Action <</Subtype /URI /URI (#3\PDFfile\PDFdestination)>> - /Rect [0 0 \width\space \height] - /Border [0 0 0] - /Subtype /Link - /ANN - pdfmark}}% - \egroup} - -\definespecial\dostartgotorealpage#1#2#3#4#5% - {\bgroup - \ScaledPointsToBigPoints{#1}\width - \ScaledPointsToBigPoints{#2}\height - \doifelsenothing{#3} - {\doifelsenothing{#4} - {\!!doneafalse} - {\doifparentfileelse{#4} - {\!!doneafalse} - {\!!doneatrue}}% - \doifnot{0#5}{0} - {\special - {\@@insertpostscriptretain - [\if!!donea - /Action /GoToR - /File (#4.pdf) - \else - /Action /GoTo - \fi - /Rect [0 0 \width\space \height] - /Border [0 0 0] - /View [/Fit] - /Page #5 - /Subtype /Link - /ANN - pdfmark}}} - {\doifelsenothing{#4} - {\let\PDFfile=\empty} - {\edef\PDFfile{/#4}}% - \special - {\@@insertpostscriptretain - [/Action <</Subtype /URI /URI (#3\PDFfile)>> - /Rect [0 0 \width\space \height] - /Border [0 0 0] - /Subtype /Link - /ANN - pdfmark}}% - \egroup} - -\def\PDFexecutestart {/Movie /T (movie \currentmovie) /Operation /Play} -\def\PDFexecutestop {/Movie /T (movie \currentmovie) /Operation /Stop} -\def\PDFexecutepause {/Movie /T (movie \currentmovie) /Operation /Pause} -\def\PDFexecuteresume {/Movie /T (movie \currentmovie) /Operation /Resume} - -\def\PDFexecutefirst {/Named /N /First} -\def\PDFexecuteprevious {/Named /N /Prev} -\def\PDFexecutenext {/Named /N /Next} -\def\PDFexecutelast {/Named /N /Last} -\def\PDFexecutebackward {/Named /N /GoBack} -\def\PDFexecuteforward {/Named /N /GoForward} -\def\PDFexecuteprint {/Named /N /Print} -\def\PDFexecuteexit {/Named /N /Quit} -\def\PDFexecuteclose {/Named /N /Close} -\def\PDFexecutesave {/Named /N /Save} -\def\PDFexecutehelp {/Named /N /HelpUserGuide} -\def\PDFexecuteswap {/Named /N /FullScreen} -\def\PDFexecutesearch {/Named /N /Find} -\def\PDFexecutesearchagain {/Named /N /FindAgain} - -\definespecial\dostartexecutecommand#1#2#3#4% - {\doifdefined{PDFexecute#3} - {\bgroup - \ScaledPointsToBigPoints{#1}\width - \ScaledPointsToBigPoints{#2}\height - \special - {\@@insertpostscriptretain - [/Subtype /Link - /Action <</Subtype \getvalue{PDFexecute#3}>> - /Rect [0 0 \width\space \height] - /Border [0 0 0] - /ANN - pdfmark}% - \egroup}} - -\definespecial\dostopexecutecommand% - {} - -% \def\translatepdfcommand#1% -% {\processaction -% [#1] -% [ first=>\def\command{First}, -% previous=>\def\command{Prev}, -% next=>\def\command{Next}, -% last=>\def\command{Last}, -% backward=>\def\command{GoBack}, -% forward=>\def\command{GoForward}, -% print=>\def\command{Print}, -% exit=>\def\command{Quit}, -% help=>\def\command{HelpUserGuide}, -% enter=>\def\command{FitPage}, -% view=>\def\command{FullScreen}, -% \s!unknown=>\let\command=\s!unknown]} -% -% \definespecial\dostartexecutecommand#1#2#3#4% -% {\bgroup -% \ScaledPointsToBigPoints{#1}\width -% \ScaledPointsToBigPoints{#2}\height -% \def\nextcommands{}% -% \getcommalistsize[#1]% -% \dostepwiserecurse{2}{\commalistsize}{1} -% {\getfromcommalist[#1][\recurselevel]% -% \translatepdfcommand\commalistelement -% \edef\nextcommands% -% {\nextcommands /Next << /Type /Action /S /Named /N /\command\space}}% -% \dostepwiserecurse{2}{\commalistsize}{1} -% {\edef\nextcommands{\nextcommands >>}}% -% \getfromcommalist[#1][1]% -% \translatepdfcommand\commalistelement -% \special -% {\@@insertpostscriptretain -% [/Action << /Subtype /Named /N /\command\space \nextcommands >> -% /Rect [0 0 100 100 ] -% /Subtype /Link -% /ANN -% pdfmark}% -% \egroup} - -\edef\@@psbgroup{\string{} -\edef\@@psegroup{\string}} - -\definespecial\dostarthide% - {\special - {\@@insertpostscriptretain - [/DataSource (false \@@psbgroup) - /PS - pdfmark}} - -\definespecial\dostophide% - {\special - {\@@insertpostscriptretain - [/DataSource (\@@psegroup if) - /PS - pdfmark}} - -\definespecial\dosetupscreen#1#2#3#4#5% - {\bgroup - \!!widtha=#3sp - \advance\!!widtha by #1sp - \!!heighta=-#4sp - \!!heightb=\printpapierhoogte - \advance\!!heightb by -#2sp - \advance\!!heighta by \!!heightb - %\ScaledPointsToBigPoints{#1}\left - %\ScaledPointsToBigPoints{\number\!!heighta}\bottom - %\ScaledPointsToBigPoints{\number\!!widtha}\width - %\ScaledPointsToBigPoints{\number\!!heightb}\height - \ScaledPointsToWholeBigPoints{#1}\left - \ScaledPointsToWholeBigPoints{\number\!!heighta}\bottom - \ScaledPointsToWholeBigPoints{\number\!!widtha}\width - \ScaledPointsToWholeBigPoints{\number\!!heightb}\height - \edef\pdf@@screenmode{\ifcase#5/UseNone\else/FullScreen\fi}% - \special - {\@@insertpostscriptretain - [/CropBox [\left\space\bottom\space\width\space\height] - /PAGES - pdfmark}% - \special - {\@@insertpostscriptretain - [/PageMode \pdf@@screenmode\space - /Page 1 - /View [/Fit] - /ViewerPreferences - << /PageLayout /SinglePage - /NonFullScreenPageMode /UseNone >> - /DOCVIEW - pdfmark}% - \egroup} - -\definespecial\dosetupidentity#1#2#3#4#5% - {\special - {\@@insertpostscriptretain - [/Title (#1) - /Subject (#2) - /Author (#3) - /Creator (#4) - /ModificationDate (#5) - /DOCINFO - pdfmark}} - -\definespecial\dostartrunprogram#1#2#3% - {\bgroup - \ScaledPointsToBigPoints{#1}\width - \ScaledPointsToBigPoints{#2}\height - \edef\string{#3}% - \@EA\beforesplitstring\string\at{ }\to\program - \@EA\aftersplitstring \string\at{ }\to\parameters - \special - {\@@insertpostscriptretain - [/Action /Launch - /File (\program) - /Params (\parameters) - /Rect [0 0 \width\space \height] - /Border [0 0 0] - /Subtype /Link - /ANN - pdfmark}% - \egroup} - -\definespecial\dostartgotoprofile#1#2#3% - {\bgroup - \ScaledPointsToBigPoints{#1}\width - \ScaledPointsToBigPoints{#2}\height - \doifsomething{#3} - {\special - {\@@insertpostscriptretain - [/Action /Article - /Dest (#3) - /Rect [0 0 \width\space \height] - /Border [0 0 0] - /View [/Fit] - /Subtype /Link - /ANN - pdfmark}}% - \egroup} - -\def\dobeginofprofile#1#2#3#4% label width height page - {\bgroup - \ScaledPointsToBigPoints{#2}\width - \ScaledPointsToBigPoints{#3}\height - \doifelsenothing{#1} - {\!!doneatrue} - {\!!doneafalse}% - \doifnot{0#4}{0} - {\special - {\@@insertpostscriptretain - [/Title (#1) - /Rect [0 0 \width\space\height] - \if!!donea /Page #4 \fi - /ARTICLE - pdfmark}}% - \egroup} - -\def\doendofprofile% - {} - -\newcounter\currentmovie - -\def\docommoninsertmov#1#2#3#4#5#6#7#8% - {\bgroup - \ScaledPointsToBigPoints{#6}\width - \ScaledPointsToBigPoints{#7}\height - \edef\pdf@@posterize{\ifcase#8 \or/Poster true\fi}% - \doglobal\increment\currentmovie - \special - {\@@insertpostscriptretain - [/Type /Annot - /Subtype /Movie - /Rect [0 0 \width\space \height] - /Movie <</T (movie \currentmovie) /F (#1) /Aspect [\width\space \height] \pdf@@posterize>> - /A <</ShowControls false>> - /ANN - pdfmark}% - \egroup} - -\let\doyyinsertmov=\docommoninsertmov -\let\dotrinsertmov=\docommoninsertmov - -%\definespecial\dostartobject#1#2#3#4% -% {\bgroup -% \setbox\nextbox=\hbox\bgroup -% \bgroup -% \ScaledPointsToBigPoints{#2}\width -% \ScaledPointsToBigPoints{#3}\height -% \ScaledPointsToBigPoints{#4}\depth -% \escapechar=-1 -% \setPDFdestination{#1}% -% \special -% {\@@insertpostscriptretain -% [/BBox [0 -\depth\space \width\space \height] -% /_objdef {\PDFdestination} -% /BP pdfmark}% -% \egroup} - -\definespecial\dostartobject#1#2#3#4% - {\bgroup - \setbox\nextbox=\hbox\bgroup - \bgroup - \ScaledPointsToBigPoints{#2}\width - \ScaledPointsToBigPoints{#3}\height - \ScaledPointsToBigPoints{#4}\depth - \escapechar=-1 - \setPDFdestination{#1}% - \dosetobjectreference{#1}{\PDFdestination}% - \special - {\@@insertpostscriptretain - [/BBox [0 -\depth\space \width\space \height] - /_objdef {\PDFdestination} - /BP pdfmark}% - \egroup} - -\definespecial\dostopobject% - {\special - {\@@insertpostscriptretain - [/EP pdfmark}% - \egroup - \smashbox\nextbox - \flushatshipout{\box\nextbox}% - \egroup} - -%\definespecial\doinsertobject#1% -% {\hbox\bgroup -% \escapechar=-1 -% \setPDFdestination{#1}% -% \special -% {\@@insertpostscriptretain -% [{\PDFdestination} /SP pdfmark}% -% \egroup} - -\definespecial\doinsertobject#1% - {\hbox\bgroup - \dogetobjectreference{#1}\objectreference - \ifx\objectreference\empty \else - \special - {\@@insertpostscriptretain - [{\objectreference} /SP pdfmark}% - \fi - \egroup} - -%\definespecial\dogetobjectreference#1#2% -% {\edef#2{#1}} - -\definespecial\doinsertbookmark#1#2#3#4#5% level sublevels text page open (1) - {\sanitizePDFstring#3\to\bookmarktext - \special - {\@@insertpostscriptretain - [/Page #4\space - \ifnum#2>0 /Count \ifcase#5-\fi#2\space\fi - /View [/Fit] - /Title (\bookmarktext) - /OUT - pdfmark}} - -\def\PDFpagesplit {/S /Split } -\def\PDFpageblinds {/S /Blinds } -\def\PDFpagebox {/S /Box } -\def\PDFpagewipe {/S /Wipe } -\def\PDFpagedissolve {/S /Dissolve } -\def\PDFpageglitter {/S /Glitter } -\def\PDFpagereplace {/S /R } - -\def\PDFpagehorizontal {/Dm /H } -\def\PDFpagevertical {/Dm /V } -\def\PDFpagein {/M /I } -\def\PDFpageout {/M /O } -\def\PDFpageeast {/Di 0 } -\def\PDFpagenorth {/Di 90 } -\def\PDFpagewest {/Di 180 } -\def\PDFpagesouth {/Di 270 } - -\def\dosetPDFpagetransition#1% - {\doifdefined{PDFpage#1} - {\edef\PDFpagetransitions{\PDFpagetransitions\getvalue{PDFpage#1}}}} - -\def\dosetpagetransition#1% - {\let\PDFpagetransitions=\empty - \processcommalist[#1]\dosetPDFpagetransition - \expanded{\global\noexpand\pdfpageattr{/Trans <<\PDFpagetransitions>>}}} - -\def\pagetransitions % replace not in this list - {{split,in,vertical},{split,in,horizontal},{split,out,vertical},{split,out,horizontal}, - {blinds,horizontal},{blinds,vertical}, - {box,in},{box,out}, - {wipe,east},{wipe,west},{wipe,north},{wipe,south}, - dissolve, - {glitter,east},{glitter,south}} - -\stopspecials - -\protect - -\endinput +%D \module
+%D [ file=spec-pdf,
+%D version=1997.09.20,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Adobe \PDF\ version 1.2,
+%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.
+
+\unprotect
+
+% /Border -> /B, evt meer indirecte objecten!
+
+%D \macros
+%D {dosetupinteraction,
+%D dosetupscreen,
+%D dosetupidentity,
+%D dostartthisislocation,
+%D dostartgotolocation,
+%D dostartgotorealpage,
+%D doflushJSpreamble,
+%D dostartgotoJS,
+%D dostartcommand,
+%D dostartgotoprofile,
+%D dobeginofprofile,
+%D doendofprofile,
+%D dostartrunprogram,
+%D dostartobject,
+%D dostopobject,
+%D doinsertobject,
+%D doinsertbookmark,
+%D dosetpagetransition}
+%D {}
+%D
+%D These specials are not as beautiful as they should be. The
+%D main reason for this is that we started with \DVIWINDO,
+%D which lacks support of \EPS||insertions, but offered a
+%D powerfull linking mechanism. The first version
+%D of \PDF\ did not support labels but only pagenumbers.
+%D This dreadfull omission was corrected in version 2.0, but
+%D we continue to support both alternatives. One never knows.
+%D
+%D Although the concepts behind the \type{pdfmark}'s are
+%D still far from perfect, version 2.1 brought another
+%D change. This time the format was changed. So much for
+%D upward compatibility.
+
+\startspecials[pdf]
+
+%D Instead of a prolog, we can put the code in the file
+%D ourselve.
+%D
+%D \starttypen
+%D \definespecial\dosetupinteraction%
+%D {\special
+%D {\@@insertpostscriptretain
+%D /pdfmark where
+%D {pop}
+%D {userdict /pdfmark /cleartomark load put}
+%D ifelse}}
+%D \stoptypen
+%D
+%D We decided to use a prolog file. The following code has to be
+%D put somewhere. To overcome problems, we always embed the
+%D fonts, but copyrights force us always to make subsets.
+%D
+%D \starttypen
+%D /currentdistillerparams where
+%D { pop } { userdict /currentdistillerparams { 1 dict } put } ifelse
+%D
+%D /setdistillerparams where
+%D { pop } { userdict /setdistillerparams { pop } put } ifelse
+%D
+%D << /AntiAliasColorImages true
+%D /AntiAliasGrayImages true
+%D /AntiAliasMonoImages true
+%D /ConvertCMYKImagesToRGB true
+%D /MaxSubsetPct 99
+%D /EmbedAllFonts true
+%D /SubSetFonts true >> setdistillerparams
+%D \stoptypen
+%D
+%D Beware, this is the PostScript Level 2 way of doing things.
+
+\definespecial\dosetupinteraction%
+ {\showmessage{\m!interactions}{21}{acrobat}}
+
+\definespecial\dostartthisislocation#1%
+ {\bgroup
+ \setPDFdestination{#1}%
+ \doifsomething{\PDFdestination}
+ {\special
+ {\@@insertpostscriptretain
+ [/Dest /\PDFdestination\space
+ /View [/Fit]
+ /DEST
+ pdfmark}}%
+ \egroup}
+
+\definespecial\dostartgotolocation#1#2#3#4#5#6%
+ {\bgroup
+ \ScaledPointsToBigPoints{#1}\width
+ \ScaledPointsToBigPoints{#2}\height
+ \doifelsenothing{#3}
+ {\setPDFdestination{#5}%
+ \doifsomething{\PDFdestination}
+ {\doifelsenothing{#4}
+ {\!!doneafalse}
+ {\doifparentfileelse{#4}
+ {\!!doneafalse}
+ {\!!doneatrue}}%
+ \special
+ {\@@insertpostscriptretain
+ [\if!!donea
+ /Action /GoToR
+ /File (#4.pdf)
+ \else
+ /Action /GoTo
+ \fi
+ /Rect [0 0 \width\space \height]
+ /Border [0 0 0]
+ /Dest /\PDFdestination\space
+ /Subtype /Link
+ /ANN
+ pdfmark}}}
+ {\doifelsenothing{#4}
+ {\let\PDFfile=\empty
+ \let\PDFdestination=\empty}
+ {\edef\PDFfile{/#4}%
+ \setPDFdestination{#5}%
+ \doifsomething{\PDFdestination}
+ {\edef\PDFdestination{\URLhash\PDFdestination}}}%
+ \special
+ {\@@insertpostscriptretain
+ [/Action <</Subtype /URI /URI (#3\PDFfile\PDFdestination)>>
+ /Rect [0 0 \width\space \height]
+ /Border [0 0 0]
+ /Subtype /Link
+ /ANN
+ pdfmark}}%
+ \egroup}
+
+\definespecial\dostartgotorealpage#1#2#3#4#5%
+ {\bgroup
+ \ScaledPointsToBigPoints{#1}\width
+ \ScaledPointsToBigPoints{#2}\height
+ \doifelsenothing{#3}
+ {\doifnot{0#5}{0}
+ {\doifelsenothing{#4}
+ {\!!doneafalse}
+ {\doifparentfileelse{#4}
+ {\!!doneafalse}
+ {\!!doneatrue}}%
+ \special
+ {\@@insertpostscriptretain
+ [\if!!donea
+ /Action /GoToR
+ /File (#4.pdf)
+ \else
+ /Action /GoTo
+ \fi
+ /Rect [0 0 \width\space \height]
+ /Border [0 0 0]
+ /View [/Fit]
+ /Page #5
+ /Subtype /Link
+ /ANN
+ pdfmark}}}%
+ {\doifelsenothing{#4}
+ {\let\PDFfile=\empty}
+ {\edef\PDFfile{/#4}}%
+ \special
+ {\@@insertpostscriptretain
+ [/Action <</Subtype /URI /URI (#3\PDFfile)>>
+ /Rect [0 0 \width\space \height]
+ /Border [0 0 0]
+ /Subtype /Link
+ /ANN
+ pdfmark}}%
+ \egroup}
+
+\definespecial\dostartgotoJS#1#2#3%
+ {\bgroup
+ \ifx\doPSsanitizeJScode\undefined \else
+ \ScaledPointsToBigPoints{#1}\width
+ \ScaledPointsToBigPoints{#2}\height
+ \doPSsanitizeJScode{#3}%
+ \special
+ {\@@insertpostscriptretain
+ [/Rect [0 0 \width\space \height]
+ /Border [0 0 0]
+ /Action << /Subtype /JavaScript /JS (\sanitizedJScode) >>
+ /Subtype /Link
+ /ANN
+ pdfmark}%
+ \fi
+ \egroup}
+
+\definespecial\doflushJSpreamble#1%
+ {\bgroup
+ \ifx\doPSsanitizeJScode\undefined \else
+ \special
+ {\@@insertpostscriptretain
+ [ /_objdef{initialize}
+ /type /dict
+ /OBJ pdfmark}%
+ \let\compositeJScode=\empty
+ \def\docommando##1%
+ {\special
+ {\@@insertpostscriptretain
+ [ /_objdef{JS:##1} /type /dict /OBJ pdfmark}%
+ \expanded{\doPSsanitizeJScode{\getJSpreamble{##1}}}%
+ \special
+ {\@@insertpostscriptretain
+ [ {JS:##1} << /S /JavaScript /JS (\sanitizedJScode) >> /PUT pdfmark}%
+ \edef\compositeJScode%
+ {\compositeJScode\space (##1) {JS:##1}}}%
+ \processcommalist[#1]\docommando
+ \special
+ {\@@insertpostscriptretain
+ [ {initialize} << /JavaScript << /Names [ \compositeJScode ] >> >> /PUT pdfmark
+ [ {Catalog} << /Names {initialize} >> /PUT pdfmark}%
+ \fi
+ \egroup}
+
+\def\PDFexecutestart {/Movie /T (movie \currentmovie) /Operation /Play}
+\def\PDFexecutestop {/Movie /T (movie \currentmovie) /Operation /Stop}
+\def\PDFexecutepause {/Movie /T (movie \currentmovie) /Operation /Pause}
+\def\PDFexecuteresume {/Movie /T (movie \currentmovie) /Operation /Resume}
+
+\def\PDFexecutefirst {/Named /N /First}
+\def\PDFexecuteprevious {/Named /N /Prev}
+\def\PDFexecutenext {/Named /N /Next}
+\def\PDFexecutelast {/Named /N /Last}
+\def\PDFexecutebackward {/Named /N /GoBack}
+\def\PDFexecuteforward {/Named /N /GoForward}
+\def\PDFexecuteprint {/Named /N /Print}
+\def\PDFexecuteexit {/Named /N /Quit}
+\def\PDFexecuteclose {/Named /N /Close}
+\def\PDFexecutesave {/Named /N /Save}
+\def\PDFexecutehelp {/Named /N /HelpUserGuide}
+\def\PDFexecuteswap {/Named /N /FullScreen}
+\def\PDFexecutesearch {/Named /N /Find}
+\def\PDFexecutesearchagain {/Named /N /FindAgain}
+
+\definespecial\dostartexecutecommand#1#2#3#4%
+ {\doifdefined{PDFexecute#3}
+ {\bgroup
+ \ScaledPointsToBigPoints{#1}\width
+ \ScaledPointsToBigPoints{#2}\height
+ \special
+ {\@@insertpostscriptretain
+ [/Subtype /Link
+ /Action <</Subtype \getvalue{PDFexecute#3}>>
+ /Rect [0 0 \width\space \height]
+ /Border [0 0 0]
+ /ANN
+ pdfmark}%
+ \egroup}}
+
+\definespecial\dostopexecutecommand%
+ {}
+
+\edef\@@psbgroup{\string{}
+\edef\@@psegroup{\string}}
+
+\definespecial\dostarthide%
+ {\special
+ {\@@insertpostscriptretain
+ [/DataSource (false \@@psbgroup)
+ /PS
+ pdfmark}}
+
+\definespecial\dostophide%
+ {\special
+ {\@@insertpostscriptretain
+ [/DataSource (\@@psegroup if)
+ /PS
+ pdfmark}}
+
+\definespecial\dosetupscreen#1#2#3#4#5%
+ {\bgroup
+ \!!widtha=#3sp
+ \advance\!!widtha by #1sp
+ \!!heighta=-#4sp
+ \!!heightb=\printpapierhoogte
+ \advance\!!heightb by -#2sp
+ \advance\!!heighta by \!!heightb
+ %\ScaledPointsToBigPoints{#1}\left
+ %\ScaledPointsToBigPoints{\number\!!heighta}\bottom
+ %\ScaledPointsToBigPoints{\number\!!widtha}\width
+ %\ScaledPointsToBigPoints{\number\!!heightb}\height
+ \ScaledPointsToWholeBigPoints{#1}\left
+ \ScaledPointsToWholeBigPoints{\number\!!heighta}\bottom
+ \ScaledPointsToWholeBigPoints{\number\!!widtha}\width
+ \ScaledPointsToWholeBigPoints{\number\!!heightb}\height
+ \edef\pdf@@screenmode{\ifcase#5/UseNone\else/FullScreen\fi}%
+ \special
+ {\@@insertpostscriptretain
+ [/CropBox [\left\space\bottom\space\width\space\height]
+ /PAGES
+ pdfmark}%
+ \special
+ {\@@insertpostscriptretain
+ [/PageMode \pdf@@screenmode\space
+ /Page 1
+ /View [/Fit]
+ /ViewerPreferences
+ << /PageLayout /SinglePage
+ /NonFullScreenPageMode /UseNone >>
+ /DOCVIEW
+ pdfmark}%
+ \egroup}
+
+\definespecial\dosetupidentity#1#2#3#4#5%
+ {\special
+ {\@@insertpostscriptretain
+ [/Title (#1)
+ /Subject (#2)
+ /Author (#3)
+ /Creator (#4)
+ /ModificationDate (#5)
+ /DOCINFO
+ pdfmark}}
+
+\definespecial\dostartrunprogram#1#2#3%
+ {\bgroup
+ \ScaledPointsToBigPoints{#1}\width
+ \ScaledPointsToBigPoints{#2}\height
+ \edef\string{#3}%
+ \@EA\beforesplitstring\string\at{ }\to\program
+ \@EA\aftersplitstring \string\at{ }\to\parameters
+ \special
+ {\@@insertpostscriptretain
+ [/Action /Launch
+ /File (\program)
+ /Params (\parameters)
+ /Rect [0 0 \width\space \height]
+ /Border [0 0 0]
+ /Subtype /Link
+ /ANN
+ pdfmark}%
+ \egroup}
+
+\definespecial\dostartgotoprofile#1#2#3%
+ {\bgroup
+ \doifsomething{#3}
+ {\ScaledPointsToBigPoints{#1}\width
+ \ScaledPointsToBigPoints{#2}\height
+ \special
+ {\@@insertpostscriptretain
+ [/Action /Article
+ /Dest (#3)
+ /Rect [0 0 \width\space \height]
+ /Border [0 0 0]
+ /View [/Fit]
+ /Subtype /Link
+ /ANN
+ pdfmark}}%
+ \egroup}
+
+\def\dobeginofprofile#1#2#3#4% label width height page
+ {\bgroup
+ \doifnot{0#4}{0}
+ {\ScaledPointsToBigPoints{#2}\width
+ \ScaledPointsToBigPoints{#3}\height
+ \doifelsenothing{#1}
+ {\!!doneatrue}
+ {\!!doneafalse}%
+ \special
+ {\@@insertpostscriptretain
+ [/Title (#1)
+ /Rect [0 0 \width\space\height]
+ \if!!donea /Page #4 \fi
+ /ARTICLE
+ pdfmark}}%
+ \egroup}
+
+\def\doendofprofile%
+ {}
+
+\newcounter\currentmovie
+
+\def\docommoninsertmov#1#2#3#4#5#6#7#8%
+ {\bgroup
+ \ScaledPointsToBigPoints{#6}\width
+ \ScaledPointsToBigPoints{#7}\height
+ \edef\pdf@@posterize{\ifcase#8 \or/Poster true\fi}%
+ \doglobal\increment\currentmovie
+ \special
+ {\@@insertpostscriptretain
+ [/Type /Annot
+ /Subtype /Movie
+ /Rect [0 0 \width\space \height]
+ /Movie <</T (movie \currentmovie) /F (#1) /Aspect [\width\space \height] \pdf@@posterize>>
+ /A <</ShowControls false>>
+ /ANN
+ pdfmark}%
+ \egroup}
+
+\let\doyyinsertmov=\docommoninsertmov
+\let\dotrinsertmov=\docommoninsertmov
+
+\definespecial\dostartobject#1#2#3#4%
+ {\bgroup
+ \setbox\nextbox=\hbox\bgroup
+ \bgroup
+ \ScaledPointsToBigPoints{#2}\width
+ \ScaledPointsToBigPoints{#3}\height
+ \ScaledPointsToBigPoints{#4}\depth
+ \escapechar=-1
+ \setPDFdestination{#1}%
+ \dosetobjectreference{#1}{\PDFdestination}%
+ \special
+ {\@@insertpostscriptretain
+ [/BBox [0 -\depth\space \width\space \height]
+ /_objdef {\PDFdestination}
+ /BP pdfmark}%
+ \egroup}
+
+\definespecial\dostopobject%
+ {\special
+ {\@@insertpostscriptretain
+ [/EP pdfmark}%
+ \egroup
+ \smashbox\nextbox
+ \flushatshipout{\box\nextbox}%
+ \egroup}
+
+\definespecial\doinsertobject#1%
+ {\hbox
+ {\dogetobjectreference{#1}\objectreference
+ \ifx\objectreference\empty \else
+ \special
+ {\@@insertpostscriptretain
+ [{\objectreference} /SP pdfmark}%
+ \fi}}
+
+\definespecial\doinsertbookmark#1#2#3#4#5% level sublevels text page open (1)
+ {\bgroup
+ \sanitizePDFstring#3\to\bookmarktext
+ \special
+ {\@@insertpostscriptretain
+ [/Page #4\space
+ \ifnum#2>0 /Count \ifcase#5-\fi#2\space\fi
+ /View [/Fit]
+ /Title (\bookmarktext)
+ /OUT
+ pdfmark}%
+ \egroup}
+
+\def\PDFpagesplit {/S /Split }
+\def\PDFpageblinds {/S /Blinds }
+\def\PDFpagebox {/S /Box }
+\def\PDFpagewipe {/S /Wipe }
+\def\PDFpagedissolve {/S /Dissolve }
+\def\PDFpageglitter {/S /Glitter }
+\def\PDFpagereplace {/S /R }
+
+\def\PDFpagehorizontal {/Dm /H }
+\def\PDFpagevertical {/Dm /V }
+\def\PDFpagein {/M /I }
+\def\PDFpageout {/M /O }
+\def\PDFpageeast {/Di 0 }
+\def\PDFpagenorth {/Di 90 }
+\def\PDFpagewest {/Di 180 }
+\def\PDFpagesouth {/Di 270 }
+
+\def\dosetPDFpagetransition#1%
+ {\doifdefined{PDFpage#1}
+ {\edef\PDFpagetransitions{\PDFpagetransitions\getvalue{PDFpage#1}}}}
+
+\def\dosetpagetransition#1%
+ {\let\PDFpagetransitions=\empty
+ \processcommalist[#1]\dosetPDFpagetransition
+ \expanded{\global\noexpand\pdfpageattr{/Trans <<\PDFpagetransitions>>}}}
+
+\def\pagetransitions % replace not in this list
+ {{split,in,vertical},{split,in,horizontal},{split,out,vertical},{split,out,horizontal},
+ {blinds,horizontal},{blinds,vertical},
+ {box,in},{box,out},
+ {wipe,east},{wipe,west},{wipe,north},{wipe,south},
+ dissolve,
+ {glitter,east},{glitter,south}}
+
+\stopspecials
+
+\protect
+
+\endinput
diff --git a/tex/context/base/spec-ps.tex b/tex/context/base/spec-ps.tex index 54013fda8..513c4ed02 100644 --- a/tex/context/base/spec-ps.tex +++ b/tex/context/base/spec-ps.tex @@ -1,195 +1,196 @@ -%D \module -%D [ file=spec-ps, -%D version=1996.01.25, -%D title=\CONTEXT\ Special Macros, -%D subtitle=Adobe PostScript, -%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. - -%D \macros -%D {dostartgraymode,dostopgraymode, -%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode, -%D dostartrotation,dostoprotation, -%D dostartscaling,dostopscaling, -%D dostartmirroring,dostopmirroring, -%D dostartnegative,dostopnegative, -%D doselectfirstpaperbin, -%D doselectsecondpaperbin} -%D {} -%D -%D This implementation is straightforward and can be used as -%D a default with postscript||drivers. We use \type{ps:} as -%D opening, because most drivers support this. - -\startspecials[postscript] - -\def\@@insertpostscriptliteral {ps: } -\def\@@insertpostscriptretain {" } - -\definespecial\dostartgraymode#1% - {\special - {\@@insertpostscriptliteral - #1\space setgray}} - -\definespecial\dostopgraymode% - {\special - {\@@insertpostscriptliteral - 0 setgray}} - -\definespecial\dostartrgbcolormode#1#2#3% - {\special - {\@@insertpostscriptliteral - #1\space #2\space #3\space setrgbcolor}} - -\definespecial\dostartcmykcolormode#1#2#3#4% - {\special - {\@@insertpostscriptliteral - #1\space #2\space #3\space #4\space setcmykcolor}} - -\definespecial\dostartgraycolormode#1% - {\special - {\@@insertpostscriptliteral - #1\space setgray}} - -\definespecial\dostopcolormode - {\special - {\@@insertpostscriptliteral - 0 setgray}} - -\definespecial\doselectfirstpaperbin% - {\special - {\@@insertpostscriptliteral - statusdict begin 1 setpapertray end}} % checken - -\definespecial\doselectsecondpaperbin% - {\special - {\@@insertpostscriptliteral - statusdict begin 0 setpapertray end}} % checken - -\definespecial\dostartrotation#1% straight from the YandY manual - {\special - {\@@insertpostscriptliteral - gsave currentpoint currentpoint translate - #1 rotate neg exch neg exch translate}} - -\definespecial\dostoprotation% - {\special - {\@@insertpostscriptliteral - currentfont currentpoint grestore moveto setfont}} - -\definespecial\dostartscaling#1#2% conforming the YandY manual - {\special - {\@@insertpostscriptliteral - gsave currentpoint currentpoint translate - #1\space #2\space scale neg exch neg exch translate}} - -\definespecial\dostopscaling% - {\special - {\@@insertpostscriptliteral - currentfont currentpoint grestore moveto setfont}} - -\definespecial\dostartmirroring% some translate and exch stuff from YandY - {\special - {\@@insertpostscriptliteral - gsave currentpoint currentpoint translate - [-1 0 0 1 0 0] concat neg exch neg exch translate}} - -\definespecial\dostopmirroring% - {\special - {\@@insertpostscriptliteral - currentfont currentpoint grestore moveto setfont}} - -\definespecial\dostartnegative% - {\special - {\@@insertpostscriptliteral - gsave {1 exch sub} settransfer}} - -\definespecial\dostopnegative% - {\special - {\@@insertpostscriptliteral - grestore}} - -%D \macros -%D {doovalbox} -%D {} -%D -%D This implementation is a mixture of several possible -%D implementations. We use some constants that may not be -%D changed. It took some time to find them, but these values -%D offer quite accurate results. The macro calls for -%D \type{\forgetall}, which resets indentation, skips and -%D \type{\everypar}. -%D -%D Because a stroke follows the line, we correct for half of -%D the linewidth. Furthermore we use scaling to overcome some -%D limitations in the precision ($<1$~sp) and to prevent -%D rounding errors. We also do some correction for large -%D values. We let PostScript compare some arguments with -%D \type{a b eq {action} fi}. -%D -%D The path is based on a macro of J.~Hefferon cs. We also -%D tried the D.~Salomon implementation, but this did not work -%D well, just like some other alternatives. - -% #1 = width #2 = height #3 = depth -% #4 = linewidth #5 = radius -% #5 = stroke (ja,nee) #7 = fill (ja,nee) - -\def\@@insertpostscriptliteral {ps: } -\def\@@insertpostscriptretain {postscript } % unknown - -\def\dosomeovalcalc#1#2#3% - {\dimen2=#1sp% - \advance\dimen2 by #2% - \ScaledPointsToBigPoints{\number\dimen2}#3} - -\def\dosomeovalbox#1#2#3#4#5#6#7% - {\bgroup - \dimen0=#4sp\divide\dimen0 by 2 - \dosomeovalcalc {0}{+\dimen0}\xmin - \dosomeovalcalc{#1}{-\dimen0}\xmax - \dosomeovalcalc{#2}{-\dimen0}\ymax - \dosomeovalcalc{-#3}{+\dimen0}\ymin - \dosomeovalcalc{#4}{0pt}\stroke - \dosomeovalcalc{#5}{0pt}\radius - \edef\dostroke{#6}% - \edef\dofill{#7}% - \setbox0=\hbox - {\special - {\@@insertpostscriptretain - gsave - newpath - \xmin\space \radius\space add \ymin\space moveto - \xmax\space \ymin\space \xmax\space \ymax\space \radius\space arcto - \xmax\space \ymax\space \xmin\space \ymax\space \radius\space arcto - \xmin\space \ymax\space \xmin\space \ymin\space \radius\space arcto - \xmin\space \ymin\space \xmax\space \ymin\space \radius\space arcto - \xmin\space \radius\space add \ymin\space moveto - 16 {pop} repeat - closepath - (\dostroke) (1) eq - {\stroke\space 0 ne - {gsave - \stroke\space setlinewidth - stroke - grestore} if} if - (\dofill) (1) eq - {fill} if - grestore}}% - \wd0=#1sp\ht0=#2sp\dp0=#3sp\box0 - \egroup} - -%D The indirect call permits a (rather) dirty hack, needed -%D for \DVIPS\ support. - -\definespecial\doovalbox% - {\dosomeovalbox} - -\stopspecials - -\endinput +%D \module
+%D [ file=spec-ps,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Adobe PostScript,
+%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.
+
+%D \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode,
+%D dostartrotation,dostoprotation,
+%D dostartscaling,dostopscaling,
+%D dostartmirroring,dostopmirroring,
+%D dostartnegative,dostopnegative,
+%D doselectfirstpaperbin,
+%D doselectsecondpaperbin}
+%D {}
+%D
+%D This implementation is straightforward and can be used as
+%D a default with postscript||drivers. We use \type{ps:} as
+%D opening, because most drivers support this.
+
+\startspecials[postscript]
+
+\def\@@insertpostscriptliteral {ps: }
+\def\@@insertpostscriptretain {" }
+
+\definespecial\dostartgraymode#1%
+ {\special
+ {\@@insertpostscriptliteral
+ #1\space setgray}}
+
+\definespecial\dostopgraymode%
+ {\special
+ {\@@insertpostscriptliteral
+ 0 setgray}}
+
+\definespecial\dostartrgbcolormode#1#2#3%
+ {\special
+ {\@@insertpostscriptliteral
+ #1\space #2\space #3\space setrgbcolor}}
+
+\definespecial\dostartcmykcolormode#1#2#3#4%
+ {\special
+ {\@@insertpostscriptliteral
+ #1\space #2\space #3\space #4\space setcmykcolor}}
+
+\definespecial\dostartgraycolormode#1%
+ {\special
+ {\@@insertpostscriptliteral
+ #1\space setgray}}
+
+\definespecial\dostopcolormode
+ {\special
+ {\@@insertpostscriptliteral
+ 0 setgray}}
+
+\definespecial\doselectfirstpaperbin%
+ {\special
+ {\@@insertpostscriptliteral
+ statusdict begin 1 setpapertray end}} % checken
+
+\definespecial\doselectsecondpaperbin%
+ {\special
+ {\@@insertpostscriptliteral
+ statusdict begin 0 setpapertray end}} % checken
+
+\definespecial\dostartrotation#1% straight from the YandY manual
+ {\special
+ {\@@insertpostscriptliteral
+ gsave currentpoint currentpoint translate
+ #1 rotate neg exch neg exch translate}}
+
+\definespecial\dostoprotation%
+ {\special
+ {\@@insertpostscriptliteral
+ currentfont currentpoint grestore moveto setfont}}
+
+\definespecial\dostartscaling#1#2% conforming the YandY manual
+ {\special
+ {\@@insertpostscriptliteral
+ gsave currentpoint currentpoint translate
+ #1\space #2\space scale neg exch neg exch translate}}
+
+\definespecial\dostopscaling%
+ {\special
+ {\@@insertpostscriptliteral
+ currentfont currentpoint grestore moveto setfont}}
+
+\definespecial\dostartmirroring% some translate and exch stuff from YandY
+ {\special
+ {\@@insertpostscriptliteral
+ gsave currentpoint currentpoint translate
+ [-1 0 0 1 0 0] concat neg exch neg exch translate}}
+
+\definespecial\dostopmirroring%
+ {\special
+ {\@@insertpostscriptliteral
+ currentfont currentpoint grestore moveto setfont}}
+
+\definespecial\dostartnegative%
+ {\special
+ {\@@insertpostscriptliteral
+ gsave {1 exch sub} settransfer}}
+
+\definespecial\dostopnegative%
+ {\special
+ {\@@insertpostscriptliteral
+ grestore}}
+
+%D \macros
+%D {doovalbox}
+%D {}
+%D
+%D This implementation is a mixture of several possible
+%D implementations. We use some constants that may not be
+%D changed. It took some time to find them, but these values
+%D offer quite accurate results. The macro calls for
+%D \type{\forgetall}, which resets indentation, skips and
+%D \type{\everypar}.
+%D
+%D Because a stroke follows the line, we correct for half of
+%D the linewidth. Furthermore we use scaling to overcome some
+%D limitations in the precision ($<1$~sp) and to prevent
+%D rounding errors. We also do some correction for large
+%D values. We let PostScript compare some arguments with
+%D \type{a b eq {action} fi}.
+%D
+%D The path is based on a macro of J.~Hefferon cs. We also
+%D tried the D.~Salomon implementation, but this did not work
+%D well, just like some other alternatives.
+
+% #1 = width #2 = height #3 = depth
+% #4 = linewidth #5 = radius
+% #5 = stroke (ja,nee) #7 = fill (ja,nee)
+
+\def\@@insertpostscriptliteral {ps: }
+\def\@@insertpostscriptretain {postscript } % unknown
+
+\def\dosomeovalcalc#1#2#3%
+ {\dimen2=#1sp%
+ \advance\dimen2 by #2%
+ \ScaledPointsToBigPoints{\number\dimen2}#3}
+
+\def\dosomeovalbox#1#2#3#4#5#6#7%
+ {\bgroup
+ \dimen0=#4sp\divide\dimen0 by 2
+ \dosomeovalcalc {0}{+\dimen0}\xmin
+ \dosomeovalcalc{#1}{-\dimen0}\xmax
+ \dosomeovalcalc{#2}{-\dimen0}\ymax
+ \dosomeovalcalc{-#3}{+\dimen0}\ymin
+ \dosomeovalcalc{#4}{0pt}\stroke
+ \dosomeovalcalc{#5}{0pt}\radius
+ \edef\dostroke{#6}%
+ \edef\dofill{#7}%
+ \setbox0=\hbox
+ {\special
+ {\@@insertpostscriptretain
+ gsave
+ newpath
+ \xmin\space \radius\space add \ymin\space moveto
+ \xmax\space \ymin\space \xmax\space \ymax\space \radius\space arcto
+ \xmax\space \ymax\space \xmin\space \ymax\space \radius\space arcto
+ \xmin\space \ymax\space \xmin\space \ymin\space \radius\space arcto
+ \xmin\space \ymin\space \xmax\space \ymin\space \radius\space arcto
+ \xmin\space \radius\space add \ymin\space moveto
+ 16 {pop} repeat
+ closepath
+ (\dostroke) (1) eq
+ {\stroke\space 0 ne
+ {gsave
+ \stroke\space setlinewidth
+ stroke
+ grestore} if} if
+ (\dofill) (1) eq
+ {fill} if
+ grestore}}%
+ \wd0=#1sp\ht0=#2sp\dp0=#3sp\box0
+ \egroup}
+
+%D The indirect call permits a (rather) dirty hack, needed
+%D for \DVIPS\ support.
+
+\definespecial\doovalbox%
+ {\dosomeovalbox}
+
+\stopspecials
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/spec-tpd.tex b/tex/context/base/spec-tpd.tex index 810ad97da..bab5561ee 100644 --- a/tex/context/base/spec-tpd.tex +++ b/tex/context/base/spec-tpd.tex @@ -1,652 +1,670 @@ -%D \module -%D [ file=spec-tpd, -%D version=1996.01.25, -%D title=\CONTEXT\ Special Macros, -%D subtitle=\PDFTEX, -%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. - -%D Being one of the first typographical systems able to support -%D advances \PDF\ support, \TEX\ is also one of the first -%D systems to produce high quality \PDF\ code directly. Thanks -%D to Han The Thanh c.s. the \TEX\ community can leap forward -%D once again. -%D -%D One important characteristic of \PDFTEX\ is that is can -%D produce standard \DVI\ code as well as \PDF\ code. This -%D enables us to use one format file to support both output -%D formats. -%D -%D All modules in this group use specials to tell drivers what -%D non||\TEX\ actions to take. Because from the \TEX\ point of -%D view, there is no difference between \DVI\ and \PDF, we -%D therefore only have to bend the \DVI\ driver support into -%D \PDF\ support. Technically spoken, specials no longer serve -%D a purpose, except from ending up as comment in the \PDF\ -%D file. The core primitive in this module therefore is the -%D \PDFTEX\ primitive \type{\pdfliteral}. -%D -%D Before we continue we need to make sure if indeed those -%D \PDFTEX\ primitives are permitted. If no primitives are -%D available, we just stop reading any further. - -\ifx\pdftexversion\undefined \endinput \else \unprotect \fi - -%D Once we are sure that we're indeed supporting \PDFTEX, we -%D force \PDF\ output at the highest compression. For debugging -%D purposes one can set the compresslevel to~0. - -\pdfoutput =1 -\pdfcompresslevel=9 -%\pdfthreadhoffset=\maxdimen -%\pdfthreadvoffset=\maxdimen - -%D Now we have to make sure no other specials are supported, -%D else \PDFTEX\ will keep on telling us that we're wrong. - -\unprotected \usespecials[\v!reset] - -%D Just in case we mimmick specials, we have to make sure no -%D default specials end up in the process. - -\let\defaultspecial=\gobbleoneargument - -%D Having reset all the special support, we have to define -%D all needed and possible support in this module. - -\startspecials[tpd] - -%D This means that by saying -%D -%D \starttypen -%D \usespecials[tpd] -%D \stoptypen -%D -%D we get ourselves \PDF\ output. - -%D \macros -%D {dosetuppaper} -%D -%D If we don't set the paper size, \PDFTEX\ will certainly do -%D it in a way we don't want, therefore we need: - -\def\dosetuppdftexpaper#1#2#3% - {\global\pdfpagewidth =#2\relax - \global\pdfpageheight=#3\relax - \global\let\dosetuppdftexpaper=\gobblethreearguments} - -\definespecial\dosetuppaper#1#2#3% - {\dosetuppdftexpaper{#1}{#2}{#3}} - -%D \macros -%D {doinsertfile} -%D -%D Graphics are not part of \TEX\ and therefore not part of the -%D \DVI\ standard. \PDF\ on the other hand has several graphic -%D primitives. During the multi||step process \TEX\ -%D $\rightarrow$ \DVI\ $\rightarrow$ \POSTSCRIPT\ $\rightarrow$ -%D \PDF\ one can insert graphics using specials. In \PDFTEX\ -%D however there is only one step! This means that \PDFTEX\ -%D itself has to do the inclusion. -%D -%D At the moment \PDFTEX\ supports inclusion of bitmap \PNG\ -%D graphics as well as not too complicated \PDF\ code. Using -%D this last option, we are able to include both \METAPOST\ and -%D \PDF\ output produced by \GHOSTSCRIPT. -%D -%D We fall back on the generic \CONTEXT\ module supp-pdf to -%D accomplish \PDF\ inclusion. The methods implemented there -%D are hooked into both the figure placement mechanisms of -%D \CONTEXT\ and the specials inclusion mechanism. - -\definespecial\doinsertfile#1#2#3#4#5#6#7#8#9% - {\bgroup - \dodoinsertfile{tpd}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}% - \egroup} - -%D The three methods supported for the moment are \type{mps} -%D for \METAPOST\ graphics, \type{pdf} for \GHOSTSCRIPT\ \PDF\ -%D code, and \type{png} for bitmap graphics. - -\def\dotpdinsertmps#1#2#3#4#5#6#7#8% - {\scratchdimen=#2pt \PointsToReal{.01\scratchdimen}\xscale - \scratchdimen=#3pt \PointsToReal{.01\scratchdimen}\yscale - \convertMPtoPDF{#1}\xscale\yscale} - -\def\dotpdinsertpdf#1#2#3#4#5#6#7#8% - {\beforesplitstring#1\at.\to\filename - \scratchdimen=#2pt \PointsToReal{.01\scratchdimen}\xscale - \scratchdimen=#3pt \PointsToReal{.01\scratchdimen}\yscale - \convertPDFtoPDF{\filename.pdf}\xscale\yscale{#4sp}{#5sp}{#6sp}{#7sp}} - -\def\dotpdinsertpng#1#2#3#4#5#6#7#8% - {\pdfimage width #6sp height #7sp #1\relax} - -%D Some surrogate \type{tif} and \type{eps} support is -%D provided too. These work only when the size compatible -%D \type{png} and \type{pdf} alternatives are present. - -\def\dotpdinserttif#1#2#3#4#5#6#7#8% - {\beforesplitstring#1\at.\to\filename - \pdfimage width #6sp height #7sp \filename.png\relax} - -\def\dotpdinserteps% - {\dotpdinsertpdf} - -%D \PDF\ supports the inclusion of video movies. In \CONTEXT\ -%D we support these in a way similar to figure inclusion. - -\newcounter\currentmovie - -\def\dotpdinsertmov#1#2#3#4#5#6#7#8% - {\ScaledPointsToBigPoints{#6}\width - \ScaledPointsToBigPoints{#7}\height - \edef\pdf@@posterize{\ifcase#8 \or/Poster true\fi}% - \doglobal\increment\currentmovie - \pdfannot - width #6sp - height -#7sp - depth 0pt - {/Border [0 0 0] - /Subtype /Movie - /Movie <</T (movie \currentmovie) /F (#1) /Aspect [\width\space \height\space] \pdf@@posterize>> - /A <</ShowControls false>>}} - -%D \macros -%D {doovalbox} -%D -%D For drawing ovals we use quite raw \PDF\ code. The next -%D implementation does not differ that much from the one -%D implemented in the \POSTSCRIPT\ driver. - -\def\dosomeovalcalc#1#2#3% - {\dimen2=#1sp - \advance\dimen2 by #2\relax - \ScaledPointsToBigPoints{\number\dimen2}#3} - -\definespecial\doovalbox#1#2#3#4#5#6#7% - {\bgroup - \dimen0=#4sp\divide\dimen0 by 2 - \dosomeovalcalc{0} {+\dimen0}\xmin - \dosomeovalcalc{#1}{-\dimen0}\xmax - \dosomeovalcalc{#2}{-\dimen0}\ymax - \dosomeovalcalc{-#3}{+\dimen0}\ymin - \advance\dimen0 by #5sp - \dosomeovalcalc{0} {+\dimen0}\xxmin - \dosomeovalcalc{#1}{-\dimen0}\xxmax - \dosomeovalcalc{#2}{-\dimen0}\yymax - \dosomeovalcalc{-#3}{+\dimen0}\yymin - \dosomeovalcalc{#4}{0pt}\stroke - \dosomeovalcalc{#5}{0pt}\radius - \edef\dostroke{#6}% - \edef\dofill{#7}% - \setbox0=\hbox - {\pdfliteral - {q - \stroke\space w - \xxmin\space \ymin\space m - \xxmax\space \ymin\space l - \xmax\space \ymin\space \xmax\space \yymin\space y - \xmax\space \yymax\space l - \xmax\space \ymax\space \xxmax\space \ymax\space y - \xxmin\space \ymax\space l - \xmin\space \ymax\space \xmin\space \yymax\space y - \xmin\space \yymin\space l - \xmin\space \ymin\space \xxmin\space \ymin\space y - \ifnum\dostroke=1 S \fi - \ifnum\dofill =1 f \fi - Q}}% - \wd0=#1sp\ht0=#2sp\dp0=#3sp\box0 - \egroup} - -%D \macros -%D {dostartgraymode,dostopgraymode, -%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode, -%D dostopcolormode} -%D -%D In \PDF\ there are two color states, one for strokes and one -%D for fills. This means that we have to set the color in a -%D rather redundant looking way. Unfortunately this makes the -%D \PDF\ file much larger than needed. - -\definespecial\dostartgraymode#1% - {\pdfliteral{#1 g #1 G}} - -\definespecial\dostopgraymode% - {\pdfliteral{0 g 0 G}} - -\definespecial\dostartrgbcolormode#1#2#3% - {\pdfliteral{#1 #2 #3 rg #1 #2 #3 RG}} - -\definespecial\dostartcmykcolormode#1#2#3#4% - {\pdfliteral{#1 #2 #3 #4 k #1 #2 #3 #4 K}} - -\definespecial\dostartgraycolormode#1% - {\pdfliteral{#1 g #1 G}} - -\definespecial\dostopcolormode% - {\pdfliteral{0 g 0 G}} - -%D \macros -%D {dostartrotation,dostoprotation} -%D -%D Rotating some text can be accomplished by setting the first -%D four elements of the transform matrix. We only support some -%D fixed angles. The q's take care of grouping. - -\definespecial\dostartrotation#1% - {\processaction - [#1] - [ 90=>\pdfliteral{q 0 1 -1 0 0 0 cm}, - 180=>\pdfliteral{q -1 0 0 -1 0 0 cm}, - 270=>\pdfliteral{q 0 -1 1 0 0 0 cm}, - 360=>\pdfliteral{q 1 0 0 1 0 0 cm}]} - -\definespecial\dostoprotation% - {\pdfliteral{Q}} - -%D \macros -%D {dostartscaling,dostopscaling} -%D -%D Scaling is rather straightforward: - -\definespecial\dostartscaling#1#2% - {\pdfliteral{q #1\space 0 0 #2\space 0 0 cm}} - -\definespecial\dostopscaling% - {\pdfliteral{Q}} - -%D \macros -%D {dostartmirroring,dostopmirroring} -%D -%D Mirroring is implemented in a similar way: - -\definespecial\dostartmirroring% - {\pdfliteral{-1 0 0 1 0 0 cm}} - -\definespecial\dostopmirroring% - {\pdfliteral{-1 0 0 1 0 0 cm}} - -%D \macros -%D {dostartnegative,dostopnegative} -%D -%D When producng output for an image setter, sometimes -%D negative output is needed. - -\definespecial\dostartnegative% - {\writestatus{system}{negative not yet supported}} - -\definespecial\dostopnegative% - {} - -%D \macros -%D {dosetupinteraction} -%D -%D Nothing special is needed to enable \PDF\ commands and -%D interaction. We stick with a message. - -\definespecial\dosetupinteraction% - {\showmessage{\m!interactions}{21}{pdftex}} - -%D \macros -%D {dostartthisisrealpage,dostartthisislocation -%D dostartgotorealpage,dostartgotolocation,dostartgotoJS} -%D -%D The interactions macros are the core of this module. We -%D support both page destinations and named ones. -%D -%D {\em For the moment we use object number (that is, behind -%D the screens, the user uses his own numbers) destinations -%D instead of page ones. The latter works, but not 100\%.} - -\definespecial\dostartthisisrealpage#1% - {} - -\definespecial\dostartthisislocation#1% - {\ifusepagedestinations \else - \setPDFdestination{#1}% - \doifsomething{\PDFdestination} - {\pdfdest name {\PDFdestination} fit}% - \fi} - -%D When going to a location, we obey the time and space saving -%D boolean\type{\ifusepagedestination}. Names destinations are -%D stripped and made robust. - -\definespecial\dostartgotolocation#1#2#3#4#5#6% url nog afhandelen - {\bgroup - \doifelsenothing{#3} - {\doifelsenothing{#4} - {\!!doneafalse} - {\doifparentfileelse{#4} - {\!!doneafalse} - {\!!doneatrue}}% - \ifusepagedestinations - \scratchcounter=0#6\relax - \edef\PDFdestination{\the\scratchcounter}% - \pdfannotlink - width #1sp - height #2sp - depth 0pt - attr {/Border [0 0 0]} - goto \if!!donea file {#4.pdf} \fi page \PDFdestination\space{/Fit}% - \pdfendlink - \else - \setPDFdestination{#5}% - \doifsomething{\PDFdestination} - {\pdfannotlink - width #1sp - height #2sp - depth 0pt - attr {/Border [0 0 0]} - goto \if!!donea file {#4.pdf} \fi name {\PDFdestination}% - \pdfendlink}% - \fi} - {\doifelsenothing{#4} - {\let\PDFfile=\empty - \let\PDFdestination=\empty} - {\edef\PDFfile{/#4}% - \setPDFdestination{#5}% - \doifsomething{\PDFdestination} - {\edef\PDFdestination{\URLhash\PDFdestination}}}% - \pdfannotlink - width #1sp - height #2sp - depth 0pt - user {/Subtype /Link - /Border [0 0 0] - /A << /Type /Action - /S /URI - /URI (#3\PDFfile\PDFdestination)>>}% - \pdfendlink}% - \egroup} - -\definespecial\dostartgotorealpage#1#2#3#4#5% - {\bgroup - \doifelsenothing{#3} - {\doifelsenothing{#4} - {\!!doneafalse} - {\doifparentfileelse{#4} - {\!!doneafalse} - {\!!doneatrue}}% - \scratchcounter=0#5\relax - \edef\PDFdestination{\the\scratchcounter}% - \pdfannotlink - width #1sp - height #2sp - depth 0pt - attr {/Border [0 0 0]} - goto \if!!donea file {#4.pdf} \fi page \PDFdestination\space{/Fit}% - \pdfendlink} - {\doifelsenothing{#4} - {\let\PDFfile=\empty} - {\edef\PDFfile{/#4}}% - \pdfannotlink - width #1sp - height #2sp - depth 0pt - user {/Subtype /Link - /Border [0 0 0] - /A << /Type /Action - /S /URI - /URI (#3\PDFfile)>>}% - \pdfendlink}% - \egroup} - -%D \macros -%D {dostarthide,dostophide} -%D -%D Hiding parts of the document for printing is not yet -%D supported by \PDF\ and therefore \PDFTEX. - -\definespecial\dostarthide% - {} - -\definespecial\dostophide% - {} - -%D \macros -%D {dosetupscreen} -%D -%D Setting of the screen boundingbox involves some -%D calculations. Here we also take care of (non) full screen -%D startup. The dimensions are rounded. - -\definespecial\dosetupscreen#1#2#3#4#5% - {\bgroup - \!!widtha=#3sp - \advance\!!widtha by #1sp - \!!heighta=-#4sp - \!!heightb=\pdfpageheight - \advance\!!heightb by -#2sp - \advance\!!heighta by \!!heightb - \ScaledPointsToWholeBigPoints{#1}\left - \ScaledPointsToWholeBigPoints{\number\!!heighta}\bottom - \ScaledPointsToWholeBigPoints{\number\!!widtha}\width - \ScaledPointsToWholeBigPoints{\number\!!heightb}\height - \expanded{\global\noexpand\pdfpagesattr= - {/CropBox [\left\space\bottom\space\width\space\height]}}% - \ifcase#5% - \pdfcatalog{} openaction goto page 1 {/Fit}% - \else - \pdfcatalog{/PageMode /FullScreen} openaction goto page 1 {/Fit}% - \fi - \egroup} - -%D \macros -%D {dostartexecutecommand} -%D -%D \PDF\ viewers enable us to navigate using menus and shortcut -%D keys. These navigational tools can also be accessed by using -%D annotations. The next special takes care of inserting them. - -\def\PDFexecutestart {/Movie /T (movie \currentmovie) /Operation /Play} -\def\PDFexecutestop {/Movie /T (movie \currentmovie) /Operation /Stop} -\def\PDFexecutepause {/Movie /T (movie \currentmovie) /Operation /Pause} -\def\PDFexecuteresume {/Movie /T (movie \currentmovie) /Operation /Resume} - -\def\PDFexecutefirst {/Named /N /First} -\def\PDFexecuteprevious {/Named /N /Prev} -\def\PDFexecutenext {/Named /N /Next} -\def\PDFexecutelast {/Named /N /Last} -\def\PDFexecutebackward {/Named /N /GoBack} -\def\PDFexecuteforward {/Named /N /GoForward} -\def\PDFexecuteprint {/Named /N /Print} -\def\PDFexecuteexit {/Named /N /Quit} -\def\PDFexecuteclose {/Named /N /Close} -\def\PDFexecutesave {/Named /N /Save} -\def\PDFexecutehelp {/Named /N /HelpUserGuide} -\def\PDFexecuteswap {/Named /N /FullScreen} -\def\PDFexecutesearch {/Named /N /Find} -\def\PDFexecutesearchagain {/Named /N /FindAgain} - -\definespecial\dostartexecutecommand#1#2#3#4% - {\doifdefined{PDFexecute#3} - {\bgroup - \ScaledPointsToBigPoints{#1}\width - \ScaledPointsToBigPoints{#2}\height - \pdfannotlink - width #1sp - height #2sp - depth 0pt - user {/Subtype /Link - /A <</S \getvalue{PDFexecute#3}>> - /Border [0 0 0]}% - \pdfendlink - \egroup}} - -%D \macros -%D {dosetupidentity} -%D -%D Documents can be tagged with an application accessible title -%D and subtitle, the authorname, a date, the creator, keywords -%D etc. For the moment \PDFTEX\ only supports the first three -%D of these. - -\definespecial\dosetupidentity#1#2#3#4#5% - {\pdfinfo - {/Title (#1) - /Subject (#2) - /Author (#3) - /Creator (#4) - /Producer (pdfTeX)}} - -%D \macros -%D {dostartrunprogam} -%D -%D Although possible, running applications is not yet -%D implemented here. - -\definespecial\dostartrunprogram#1#2#3% - {\bgroup - \edef\string{#3}% - \@EA\beforesplitstring\string\at{ }\to\program - \@EA\aftersplitstring \string\at{ }\to\parameters - \pdfannotlink - width #1sp - height #2sp - depth 0pt - user {/Subtype /Link - /A <</S /Launch /F (\program) /P (\parameters)>> - /Border [0 0 0]}% - \pdfendlink - \egroup} - -%D \macros -%D {dostartgotoprofile, dostopgotoprofile, -%D dobeginofprofile, doendofprofile} -%D -%D \CONTEXT\ user profiles and version control fall back on -%D \PDF\ article threads. Unfortunately one cannot influence -%D the view yet in an (for me) acceptable way. - -\definespecial\dostartgotoprofile#1#2#3% - {\pdfannotlink - width #1sp - height #2sp - depth 0pt - attr {/Border [0 0 0]} - thread name {#3}% - \pdfendlink} - -\definespecial\dobeginofprofile#1#2#3#4% - {\doifsomething{#1} - {\pdfthread name {#1}}} - -\definespecial\doendofprofile% - {\pdfendthread} - -%D \macros -%D {doinsertbookmark} -%D -%D In \PDF\ bookmarks are the building blocks of a viewer -%D provided sort of table of contents. \TEX\ has to provide -%D the entry as well as the number of child entries. Strings -%D need to be sanatized as good as possible to suit the default -%D encoding. In \CONTEXT\ users can overrule this string by -%D supplying an alternative one. - -\definespecial\doinsertbookmark#1#2#3#4#5% level sublevels text page open (1) - {\sanitizePDFstring#3\to\bookmarktext - \pdfoutline - goto page #4\space - \ifnum#2>0 count \ifcase#5-\fi#2\fi\space - {\bookmarktext}} - -%D \macros -%D {dostartobject,dostopobject,doinsertobject} -%D -%D Due to \PDF's object oriented character, we can include and -%D reuse objects. These can be compared with \TEX's boxes. The -%D \TEX\ counterpart is defined in the module \type{spec-dvi}. -%D We don't use the dimensions here. - -% Forms can interfere with page dimension settings. Therefore -% calling macros can best postpone flushing. - -%\definespecial\dostartobject#1#2#3#4% -% {\setbox\nextbox=\vbox\bgroup -% \def\dodostopobject% -% {\egroup -% \pdfform\nextbox -% \scratchcounter=\pdflastform -% \setxvalue{\r!driver#1}{\the\pdflastform}}} - -\definespecial\dostartobject#1#2#3#4% - {\setbox\nextbox=\vbox\bgroup - \def\dodostopobject% - {\egroup - \pdfform\nextbox - \scratchcounter=\pdflastform - \dosetobjectreference{#1}{\the\pdflastform}}}% - -\definespecial\dostopobject% - {\dodostopobject} - -%\definespecial\doinsertobject#1% -% {\expandafter\pdfrefform\csname\r!driver#1\endcsname\relax} - -\definespecial\doinsertobject#1% - {\dogetobjectreference{#1}\objectreference - \pdfrefform\objectreference} - -%\definespecial\dogetobjectreference#1#2% -% {\edef#2{\csname\r!driver#1\endcsname}} - -%D \macros -%D {dosetpagetransitions} -%D -%D Page transitions only make sence in presentations. They are -%D passed as raw \PDF\ code to the page object. This -%D implementation looks much like the one in \type{spec-pdf}. - -\def\PDFpagesplit {/S /Split } -\def\PDFpageblinds {/S /Blinds } -\def\PDFpagebox {/S /Box } -\def\PDFpagewipe {/S /Wipe } -\def\PDFpagedissolve {/S /Dissolve } -\def\PDFpageglitter {/S /Glitter } -\def\PDFpagereplace {/S /R } - -\def\PDFpagehorizontal {/Dm /H } -\def\PDFpagevertical {/Dm /V } -\def\PDFpagein {/M /I } -\def\PDFpageout {/M /O } -\def\PDFpageeast {/Di 0 } -\def\PDFpagenorth {/Di 90 } -\def\PDFpagewest {/Di 180 } -\def\PDFpagesouth {/Di 270 } - -\def\dosetPDFpagetransition#1% - {\doifdefined{PDFpage#1} - {\edef\PDFpagetransitions{\PDFpagetransitions\getvalue{PDFpage#1}}}} - -\def\dosetpagetransition#1% - {\let\PDFpagetransitions=\empty - \processcommalist[#1]\dosetPDFpagetransition - \expanded{\global\noexpand\pdfpageattr{/Trans <<\PDFpagetransitions>>}}} - -\def\pagetransitions % replace not in this list - {{split,in,vertical},{split,in,horizontal},{split,out,vertical},{split,out,horizontal}, - {blinds,horizontal},{blinds,vertical}, - {box,in},{box,out}, - {wipe,east},{wipe,west},{wipe,north},{wipe,south}, - dissolve, - {glitter,east},{glitter,south}} - -%D The expansion is needed because else the \type{\pdfpageattr} -%D token list flushes an unexpanded \type{\csname}. The -%D \type{\global} is needed because the assignment can take -%D place deeply buried (for instance in the \type{\shipout} -%D box. - -\stopspecials - -\protect - -\endinput +%D \module
+%D [ file=spec-tpd,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=\PDFTEX,
+%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.
+
+% /Border -> /B, evt meer indirecte objecten!
+
+%D Being one of the first typographical systems able to support
+%D advances \PDF\ support, \TEX\ is also one of the first
+%D systems to produce high quality \PDF\ code directly. Thanks
+%D to Han The Thanh c.s. the \TEX\ community can leap forward
+%D once again.
+%D
+%D One important characteristic of \PDFTEX\ is that is can
+%D produce standard \DVI\ code as well as \PDF\ code. This
+%D enables us to use one format file to support both output
+%D formats.
+%D
+%D All modules in this group use specials to tell drivers what
+%D non||\TEX\ actions to take. Because from the \TEX\ point of
+%D view, there is no difference between \DVI\ and \PDF, we
+%D therefore only have to bend the \DVI\ driver support into
+%D \PDF\ support. Technically spoken, specials no longer serve
+%D a purpose, except from ending up as comment in the \PDF\
+%D file. The core primitive in this module therefore is the
+%D \PDFTEX\ primitive \type{\pdfliteral}.
+%D
+%D Before we continue we need to make sure if indeed those
+%D \PDFTEX\ primitives are permitted. If no primitives are
+%D available, we just stop reading any further.
+
+\ifx\pdftexversion\undefined \endinput \else \unprotect \fi
+
+%D Once we are sure that we're indeed supporting \PDFTEX, we
+%D force \PDF\ output at the highest compression. For debugging
+%D purposes one can set the compresslevel to~0.
+
+\pdfoutput =1
+\pdfcompresslevel=9
+%\pdfthreadhoffset=\maxdimen
+%\pdfthreadvoffset=\maxdimen
+
+%D Now we have to make sure no other specials are supported,
+%D else \PDFTEX\ will keep on telling us that we're wrong.
+
+\unprotected \usespecials[\v!reset]
+
+%D Just in case we mimmick specials, we have to make sure no
+%D default specials end up in the process.
+
+\let\defaultspecial=\gobbleoneargument
+
+%D Having reset all the special support, we have to define
+%D all needed and possible support in this module.
+
+\startspecials[tpd]
+
+%D This means that by saying
+%D
+%D \starttypen
+%D \usespecials[tpd]
+%D \stoptypen
+%D
+%D we get ourselves \PDF\ output.
+
+%D \macros
+%D {dosetuppaper}
+%D
+%D If we don't set the paper size, \PDFTEX\ will certainly do
+%D it in a way we don't want, therefore we need:
+
+\def\dosetuppdftexpaper#1#2#3%
+ {\global\pdfpagewidth =#2\relax
+ \global\pdfpageheight=#3\relax
+ \global\let\dosetuppdftexpaper=\gobblethreearguments}
+
+\definespecial\dosetuppaper#1#2#3%
+ {\dosetuppdftexpaper{#1}{#2}{#3}}
+
+%D \macros
+%D {doinsertfile}
+%D
+%D Graphics are not part of \TEX\ and therefore not part of the
+%D \DVI\ standard. \PDF\ on the other hand has several graphic
+%D primitives. During the multi||step process \TEX\
+%D $\rightarrow$ \DVI\ $\rightarrow$ \POSTSCRIPT\ $\rightarrow$
+%D \PDF\ one can insert graphics using specials. In \PDFTEX\
+%D however there is only one step! This means that \PDFTEX\
+%D itself has to do the inclusion.
+%D
+%D At the moment \PDFTEX\ supports inclusion of bitmap \PNG\
+%D graphics as well as not too complicated \PDF\ code. Using
+%D this last option, we are able to include both \METAPOST\ and
+%D \PDF\ output produced by \GHOSTSCRIPT.
+%D
+%D We fall back on the generic \CONTEXT\ module supp-pdf to
+%D accomplish \PDF\ inclusion. The methods implemented there
+%D are hooked into both the figure placement mechanisms of
+%D \CONTEXT\ and the specials inclusion mechanism.
+
+\definespecial\doinsertfile#1#2#3#4#5#6#7#8#9%
+ {\bgroup
+ \dodoinsertfile{tpd}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}%
+ \egroup}
+
+%D The three methods supported for the moment are \type{mps}
+%D for \METAPOST\ graphics, \type{pdf} for \GHOSTSCRIPT\ \PDF\
+%D code, and \type{png} for bitmap graphics.
+
+\def\dotpdinsertmps#1#2#3#4#5#6#7#8%
+ {\scratchdimen=#2pt \PointsToReal{.01\scratchdimen}\xscale
+ \scratchdimen=#3pt \PointsToReal{.01\scratchdimen}\yscale
+ \convertMPtoPDF{#1}\xscale\yscale}
+
+\def\dotpdinsertpdf#1#2#3#4#5#6#7#8%
+ {\beforesplitstring#1\at.\to\filename
+ \scratchdimen=#2pt \PointsToReal{.01\scratchdimen}\xscale
+ \scratchdimen=#3pt \PointsToReal{.01\scratchdimen}\yscale
+ \convertPDFtoPDF{\filename.pdf}\xscale\yscale{#4sp}{#5sp}{#6sp}{#7sp}}
+
+\def\dotpdinsertpng#1#2#3#4#5#6#7#8%
+ {\pdfimage width #6sp height #7sp #1\relax}
+
+%D Some surrogate \type{tif} and \type{eps} support is
+%D provided too. These work only when the size compatible
+%D \type{png} and \type{pdf} alternatives are present.
+
+\def\dotpdinserttif#1#2#3#4#5#6#7#8%
+ {\beforesplitstring#1\at.\to\filename
+ \pdfimage width #6sp height #7sp \filename.png\relax}
+
+\def\dotpdinserteps%
+ {\dotpdinsertpdf}
+
+%D \PDF\ supports the inclusion of video movies. In \CONTEXT\
+%D we support these in a way similar to figure inclusion.
+
+\newcounter\currentmovie
+
+\def\dotpdinsertmov#1#2#3#4#5#6#7#8%
+ {\bgroup
+ \ScaledPointsToBigPoints{#6}\width
+ \ScaledPointsToBigPoints{#7}\height
+ \edef\pdf@@posterize{\ifcase#8 \or/Poster true\fi}%
+ \doglobal\increment\currentmovie
+ \pdfannot
+ width #6sp
+ height -#7sp
+ depth 0pt
+ {/Border [0 0 0]
+ /Subtype /Movie
+ /Movie <</T (movie \currentmovie) /F (#1) /Aspect [\width\space \height\space] \pdf@@posterize>>
+ /A <</ShowControls false>>}%
+ \egroup}
+
+%D \macros
+%D {doovalbox}
+%D
+%D For drawing ovals we use quite raw \PDF\ code. The next
+%D implementation does not differ that much from the one
+%D implemented in the \POSTSCRIPT\ driver.
+
+\def\dosomeovalcalc#1#2#3%
+ {\dimen2=#1sp
+ \advance\dimen2 by #2\relax
+ \ScaledPointsToBigPoints{\number\dimen2}#3}
+
+\definespecial\doovalbox#1#2#3#4#5#6#7%
+ {\bgroup
+ \dimen0=#4sp\divide\dimen0 by 2
+ \dosomeovalcalc{0} {+\dimen0}\xmin
+ \dosomeovalcalc{#1}{-\dimen0}\xmax
+ \dosomeovalcalc{#2}{-\dimen0}\ymax
+ \dosomeovalcalc{-#3}{+\dimen0}\ymin
+ \advance\dimen0 by #5sp
+ \dosomeovalcalc{0} {+\dimen0}\xxmin
+ \dosomeovalcalc{#1}{-\dimen0}\xxmax
+ \dosomeovalcalc{#2}{-\dimen0}\yymax
+ \dosomeovalcalc{-#3}{+\dimen0}\yymin
+ \dosomeovalcalc{#4}{0pt}\stroke
+ \dosomeovalcalc{#5}{0pt}\radius
+ \edef\dostroke{#6}%
+ \edef\dofill{#7}%
+ \setbox0=\hbox
+ {\pdfliteral
+ {q
+ \stroke\space w
+ \xxmin\space \ymin\space m
+ \xxmax\space \ymin\space l
+ \xmax\space \ymin\space \xmax\space \yymin\space y
+ \xmax\space \yymax\space l
+ \xmax\space \ymax\space \xxmax\space \ymax\space y
+ \xxmin\space \ymax\space l
+ \xmin\space \ymax\space \xmin\space \yymax\space y
+ \xmin\space \yymin\space l
+ \xmin\space \ymin\space \xxmin\space \ymin\space y
+ \ifnum\dostroke=1 S \fi
+ \ifnum\dofill =1 f \fi
+ Q}}%
+ \wd0=#1sp\ht0=#2sp\dp0=#3sp\box0
+ \egroup}
+
+%D \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,
+%D dostopcolormode}
+%D
+%D In \PDF\ there are two color states, one for strokes and one
+%D for fills. This means that we have to set the color in a
+%D rather redundant looking way. Unfortunately this makes the
+%D \PDF\ file much larger than needed.
+
+\definespecial\dostartgraymode#1%
+ {\pdfliteral{#1 g #1 G}}
+
+\definespecial\dostopgraymode%
+ {\pdfliteral{0 g 0 G}}
+
+\definespecial\dostartrgbcolormode#1#2#3%
+ {\pdfliteral{#1 #2 #3 rg #1 #2 #3 RG}}
+
+\definespecial\dostartcmykcolormode#1#2#3#4%
+ {\pdfliteral{#1 #2 #3 #4 k #1 #2 #3 #4 K}}
+
+\definespecial\dostartgraycolormode#1%
+ {\pdfliteral{#1 g #1 G}}
+
+\definespecial\dostopcolormode%
+ {\pdfliteral{0 g 0 G}}
+
+%D \macros
+%D {dostartrotation,dostoprotation}
+%D
+%D Rotating some text can be accomplished by setting the first
+%D four elements of the transform matrix. We only support some
+%D fixed angles. The q's take care of grouping.
+
+\definespecial\dostartrotation#1%
+ {\processaction
+ [#1]
+ [ 90=>\pdfliteral{q 0 1 -1 0 0 0 cm},
+ 180=>\pdfliteral{q -1 0 0 -1 0 0 cm},
+ 270=>\pdfliteral{q 0 -1 1 0 0 0 cm},
+ 360=>\pdfliteral{q 1 0 0 1 0 0 cm}]}
+
+\definespecial\dostoprotation%
+ {\pdfliteral{Q}}
+
+%D \macros
+%D {dostartscaling,dostopscaling}
+%D
+%D Scaling is rather straightforward:
+
+\definespecial\dostartscaling#1#2%
+ {\pdfliteral{q #1\space 0 0 #2\space 0 0 cm}}
+
+\definespecial\dostopscaling%
+ {\pdfliteral{Q}}
+
+%D \macros
+%D {dostartmirroring,dostopmirroring}
+%D
+%D Mirroring is implemented in a similar way:
+
+\definespecial\dostartmirroring%
+ {\pdfliteral{-1 0 0 1 0 0 cm}}
+
+\definespecial\dostopmirroring%
+ {\pdfliteral{-1 0 0 1 0 0 cm}}
+
+%D \macros
+%D {dostartnegative,dostopnegative}
+%D
+%D When producng output for an image setter, sometimes
+%D negative output is needed.
+
+\definespecial\dostartnegative%
+ {\writestatus{system}{negative not yet supported}}
+
+\definespecial\dostopnegative%
+ {}
+
+%D \macros
+%D {dosetupinteraction}
+%D
+%D Nothing special is needed to enable \PDF\ commands and
+%D interaction. We stick with a message.
+
+\definespecial\dosetupinteraction%
+ {\showmessage{\m!interactions}{21}{pdftex}}
+
+%D \macros
+%D {dostartthisisrealpage,dostartthisislocation
+%D dostartgotorealpage,dostartgotolocation,dostartgotoJS}
+%D
+%D The interactions macros are the core of this module. We
+%D support both page destinations and named ones.
+%D
+%D {\em For the moment we use object number (that is, behind
+%D the screens, the user uses his own numbers) destinations
+%D instead of page ones. The latter works, but not 100\%.}
+
+\definespecial\dostartthisisrealpage#1%
+ {}
+
+\definespecial\dostartthisislocation#1%
+ {\bgroup
+ \setPDFdestination{#1}%
+ \doifsomething{\PDFdestination}
+ {\pdfdest name {\PDFdestination} fit}%
+ \egroup}
+
+%D When going to a location, we obey the time and space saving
+%D boolean\type{\ifusepagedestination}. Names destinations are
+%D stripped and made robust.
+
+\definespecial\dostartgotolocation#1#2#3#4#5#6% url nog afhandelen
+ {\bgroup
+ \doifelsenothing{#3}
+ {\setPDFdestination{#5}%
+ \doifsomething{\PDFdestination}
+ {\doifelsenothing{#4}
+ {\!!doneafalse}
+ {\doifparentfileelse{#4}
+ {\!!doneafalse}
+ {\!!doneatrue}}%
+ \pdfannotlink
+ width #1sp
+ height #2sp
+ depth 0pt
+ attr {/Border [0 0 0]}
+ goto \if!!donea file {#4.pdf} \fi name {\PDFdestination}%
+ \pdfendlink}}
+ {\doifelsenothing{#4}
+ {\let\PDFfile=\empty
+ \let\PDFdestination=\empty}
+ {\edef\PDFfile{/#4}%
+ \setPDFdestination{#5}%
+ \doifsomething{\PDFdestination}
+ {\edef\PDFdestination{\URLhash\PDFdestination}}}%
+ \pdfannotlink
+ width #1sp
+ height #2sp
+ depth 0pt
+ user {/Subtype /Link
+ /Border [0 0 0]
+ /A << /Type /Action
+ /S /URI
+ /URI (#3\PDFfile\PDFdestination)>>}%
+ \pdfendlink}%
+ \egroup}
+
+\definespecial\dostartgotorealpage#1#2#3#4#5%
+ {\bgroup
+ \doifelsenothing{#3}
+ {\doifelsenothing{#4}
+ {\!!doneafalse}
+ {\doifparentfileelse{#4}
+ {\!!doneafalse}
+ {\!!doneatrue}}%
+ \scratchcounter=0#5\relax
+ \edef\PDFdestination{\the\scratchcounter}%
+ \pdfannotlink
+ width #1sp
+ height #2sp
+ depth 0pt
+ attr {/Border [0 0 0]}
+ goto \if!!donea file {#4.pdf} \fi page \PDFdestination {/Fit}%
+ \pdfendlink}
+ {\doifelsenothing{#4}
+ {\let\PDFfile=\empty}
+ {\edef\PDFfile{/#4}}%
+ \pdfannotlink
+ width #1sp
+ height #2sp
+ depth 0pt
+ user {/Subtype /Link
+ /Border [0 0 0]
+ /A << /Type /Action
+ /S /URI
+ /URI (#3\PDFfile)>>}%
+ \pdfendlink}%
+ \egroup}
+
+\definespecial\dostartgotoJS#1#2#3%
+ {\bgroup
+ \ifx\doPSsanitizeJScode\undefined \else
+ \doPSsanitizeJScode{#3}%
+ \pdfannotlink
+ width #1sp
+ height #2sp
+ depth 0pt
+ user {/Subtype /Link
+ /Border [0 0 0]
+ /A << /Type /Action
+ /S /JavaScript
+ /JS (\sanitizedJScode) >>}%
+ \pdfendlink
+ \fi
+ \egroup}
+
+%D {\em Tijdelijk hier!}
+
+\definespecial\doflushJSpreamble#1%
+ {\bgroup
+ \ifx\doPSsanitizeJScode\undefined \else
+ \let\compositeJScode=\empty
+ \def\docommando##1%
+ {\expanded{\doPSsanitizeJScode{\getJSpreamble{##1}}}%
+ \pdfobj{<< /S /JavaScript /JS (\sanitizedJScode) >>}%
+ \edef\compositeJScode%
+ {\compositeJScode\space (##1) \the\pdflastobj\space 0 R}}%
+ \processcommalist[#1]\docommando
+ \pdfobj{<< /JavaScript << /Names [ \compositeJScode ] >> >>}%
+ \pdfcatalog{/Names \the\pdflastobj\space 0 R}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {dostarthide,dostophide}
+%D
+%D Hiding parts of the document for printing is not yet
+%D supported by \PDF\ and therefore \PDFTEX.
+
+\definespecial\dostarthide%
+ {}
+
+\definespecial\dostophide%
+ {}
+
+%D \macros
+%D {dosetupscreen}
+%D
+%D Setting of the screen boundingbox involves some
+%D calculations. Here we also take care of (non) full screen
+%D startup. The dimensions are rounded.
+
+\definespecial\dosetupscreen#1#2#3#4#5%
+ {\bgroup
+ \!!widtha=#3sp
+ \advance\!!widtha by #1sp
+ \!!heighta=-#4sp
+ \!!heightb=\pdfpageheight
+ \advance\!!heightb by -#2sp
+ \advance\!!heighta by \!!heightb
+ \ScaledPointsToWholeBigPoints{#1}\left
+ \ScaledPointsToWholeBigPoints{\number\!!heighta}\bottom
+ \ScaledPointsToWholeBigPoints{\number\!!widtha}\width
+ \ScaledPointsToWholeBigPoints{\number\!!heightb}\height
+ \expanded{\global\noexpand\pdfpagesattr=
+ {/CropBox [\left\space\bottom\space\width\space\height]}}%
+ \ifcase#5%
+ \pdfcatalog{} openaction goto page 1 {/Fit}%
+ \else
+ \pdfcatalog{/PageMode /FullScreen} openaction goto page 1 {/Fit}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {dostartexecutecommand}
+%D
+%D \PDF\ viewers enable us to navigate using menus and shortcut
+%D keys. These navigational tools can also be accessed by using
+%D annotations. The next special takes care of inserting them.
+
+\def\PDFexecutestart {/Movie /T (movie \currentmovie) /Operation /Play}
+\def\PDFexecutestop {/Movie /T (movie \currentmovie) /Operation /Stop}
+\def\PDFexecutepause {/Movie /T (movie \currentmovie) /Operation /Pause}
+\def\PDFexecuteresume {/Movie /T (movie \currentmovie) /Operation /Resume}
+
+\def\PDFexecutefirst {/Named /N /First}
+\def\PDFexecuteprevious {/Named /N /Prev}
+\def\PDFexecutenext {/Named /N /Next}
+\def\PDFexecutelast {/Named /N /Last}
+\def\PDFexecutebackward {/Named /N /GoBack}
+\def\PDFexecuteforward {/Named /N /GoForward}
+\def\PDFexecuteprint {/Named /N /Print}
+\def\PDFexecuteexit {/Named /N /Quit}
+\def\PDFexecuteclose {/Named /N /Close}
+\def\PDFexecutesave {/Named /N /Save}
+\def\PDFexecutehelp {/Named /N /HelpUserGuide}
+\def\PDFexecuteswap {/Named /N /FullScreen}
+\def\PDFexecutesearch {/Named /N /Find}
+\def\PDFexecutesearchagain {/Named /N /FindAgain}
+
+\definespecial\dostartexecutecommand#1#2#3#4%
+ {\doifdefined{PDFexecute#3}
+ {\bgroup
+ \ScaledPointsToBigPoints{#1}\width
+ \ScaledPointsToBigPoints{#2}\height
+ \pdfannotlink
+ width #1sp
+ height #2sp
+ depth 0pt
+ user {/Subtype /Link
+ /A <</S \getvalue{PDFexecute#3}>>
+ /Border [0 0 0]}%
+ \pdfendlink
+ \egroup}}
+
+%D \macros
+%D {dosetupidentity}
+%D
+%D Documents can be tagged with an application accessible title
+%D and subtitle, the authorname, a date, the creator, keywords
+%D etc. For the moment \PDFTEX\ only supports the first three
+%D of these.
+
+\definespecial\dosetupidentity#1#2#3#4#5%
+ {\pdfinfo
+ {/Title (#1)
+ /Subject (#2)
+ /Author (#3)
+ /Creator (#4)
+ /Producer (pdfTeX)}}
+
+%D \macros
+%D {dostartrunprogam}
+%D
+%D Although possible, running applications is not yet
+%D implemented here.
+
+\definespecial\dostartrunprogram#1#2#3%
+ {\bgroup
+ \edef\string{#3}%
+ \@EA\beforesplitstring\string\at{ }\to\program
+ \@EA\aftersplitstring \string\at{ }\to\parameters
+ \pdfannotlink
+ width #1sp
+ height #2sp
+ depth 0pt
+ user {/Subtype /Link
+ /A <</S /Launch /F (\program) /P (\parameters)>>
+ /Border [0 0 0]}%
+ \pdfendlink
+ \egroup}
+
+%D \macros
+%D {dostartgotoprofile, dostopgotoprofile,
+%D dobeginofprofile, doendofprofile}
+%D
+%D \CONTEXT\ user profiles and version control fall back on
+%D \PDF\ article threads. Unfortunately one cannot influence
+%D the view yet in an (for me) acceptable way.
+
+\definespecial\dostartgotoprofile#1#2#3%
+ {\pdfannotlink
+ width #1sp
+ height #2sp
+ depth 0pt
+ attr {/Border [0 0 0]}
+ thread name {#3}%
+ \pdfendlink}
+
+\definespecial\dobeginofprofile#1#2#3#4%
+ {\doifsomething{#1}
+ {\pdfthread name {#1}}}
+
+\definespecial\doendofprofile%
+ {\pdfendthread}
+
+%D \macros
+%D {doinsertbookmark}
+%D
+%D In \PDF\ bookmarks are the building blocks of a viewer
+%D provided sort of table of contents. \TEX\ has to provide
+%D the entry as well as the number of child entries. Strings
+%D need to be sanatized as good as possible to suit the default
+%D encoding. In \CONTEXT\ users can overrule this string by
+%D supplying an alternative one.
+
+\definespecial\doinsertbookmark#1#2#3#4#5% level sublevels text page open (1)
+ {\bgroup
+ \sanitizePDFstring#3\to\bookmarktext
+ \pdfoutline
+ goto page #4\space
+ \ifnum#2>0 count \ifcase#5-\fi#2\fi\space
+ {\bookmarktext}%
+ \egroup}
+
+%D \macros
+%D {dostartobject,dostopobject,doinsertobject}
+%D
+%D Due to \PDF's object oriented character, we can include and
+%D reuse objects. These can be compared with \TEX's boxes. The
+%D \TEX\ counterpart is defined in the module \type{spec-dvi}.
+%D We don't use the dimensions here.
+
+% Forms can interfere with page dimension settings. Therefore
+% calling macros can best postpone flushing.
+
+\definespecial\dostartobject#1#2#3#4%
+ {\bgroup
+ \setbox\nextbox=\vbox\bgroup
+ \def\dodostopobject%
+ {\egroup
+ \pdfform\nextbox
+ \scratchcounter=\pdflastform
+ \dosetobjectreference{#1}{\the\pdflastform}}}%
+
+\definespecial\dostopobject%
+ {\dodostopobject
+ \egroup}
+
+\definespecial\doinsertobject#1%
+ {\bgroup
+ \dogetobjectreference{#1}\objectreference
+ \pdfrefform\objectreference
+ \egroup}
+
+%D \macros
+%D {dosetpagetransitions}
+%D
+%D Page transitions only make sence in presentations. They are
+%D passed as raw \PDF\ code to the page object. This
+%D implementation looks much like the one in \type{spec-pdf}.
+
+\def\PDFpagesplit {/S /Split }
+\def\PDFpageblinds {/S /Blinds }
+\def\PDFpagebox {/S /Box }
+\def\PDFpagewipe {/S /Wipe }
+\def\PDFpagedissolve {/S /Dissolve }
+\def\PDFpageglitter {/S /Glitter }
+\def\PDFpagereplace {/S /R }
+
+\def\PDFpagehorizontal {/Dm /H }
+\def\PDFpagevertical {/Dm /V }
+\def\PDFpagein {/M /I }
+\def\PDFpageout {/M /O }
+\def\PDFpageeast {/Di 0 }
+\def\PDFpagenorth {/Di 90 }
+\def\PDFpagewest {/Di 180 }
+\def\PDFpagesouth {/Di 270 }
+
+\def\dosetPDFpagetransition#1%
+ {\doifdefined{PDFpage#1}
+ {\edef\PDFpagetransitions{\PDFpagetransitions\getvalue{PDFpage#1}}}}
+
+\def\dosetpagetransition#1%
+ {\let\PDFpagetransitions=\empty
+ \processcommalist[#1]\dosetPDFpagetransition
+ \expanded{\global\noexpand\pdfpageattr{/Trans <<\PDFpagetransitions>>}}}
+
+\def\pagetransitions % replace not in this list
+ {{split,in,vertical},{split,in,horizontal},{split,out,vertical},{split,out,horizontal},
+ {blinds,horizontal},{blinds,vertical},
+ {box,in},{box,out},
+ {wipe,east},{wipe,west},{wipe,north},{wipe,south},
+ dissolve,
+ {glitter,east},{glitter,south}}
+
+%D The expansion is needed because else the \type{\pdfpageattr}
+%D token list flushes an unexpanded \type{\csname}. The
+%D \type{\global} is needed because the assignment can take
+%D place deeply buried (for instance in the \type{\shipout}
+%D box.
+
+\stopspecials
+
+\protect
+
+\endinput
diff --git a/tex/context/base/spec-tr.tex b/tex/context/base/spec-tr.tex index b27951d6f..d8400786d 100644 --- a/tex/context/base/spec-tr.tex +++ b/tex/context/base/spec-tr.tex @@ -1,81 +1,82 @@ -%D \module -%D [ file=spec-tr, -%D version=1996.01.25, -%D title=\CONTEXT\ Special Macros, -%D subtitle=Thomas Rokicky's \DVIPS, -%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. - -%D Especially the rotation proved to be incompatible with -%D the default \POSTSCRIPT\ special driver. Many thanks to -%D Gilbert van den Dobbelsteen for testing and hacking the -%D \DVIPS\ source and pinpointing the problem. - -%D \macros -%D {doinsertfile} -%D -%D We overrule the figure||insertion special. Things should -%D be more accurate, but maybe someday \onbekend - -\startspecials[rokicky] % [postscript] - -\def\@@insertpostscriptliteral {ps: } -\def\@@insertpostscriptretain {" } - -\def\dotrinserteps#1#2#3#4#5#6#7#8% - {\ScaledPointsToBigPoints{#4}\width - \ScaledPointsToBigPoints{#5}\height - \special - {psfile=#1 - hscale=#2\space - vscale=#3\space - hoffset=\width \space - voffset=\height}} - -\definespecial\doinsertfile#1#2#3#4#5#6#7#8#9% - {\bgroup - \dodoinsertfile{tr}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}% - \egroup} - -%D \macros -%D {dostartrotation} -%D -%D Because \DVIPS\ uses a reverse rotation scheme, we have -%D to add an extra \type{neg} to the default \POSTSCRIPT\ -%D rotation definition: - -\definespecial\dostartrotation#1% straight from the YandY manual / 1st neg added - {\special - {\@@insertpostscriptliteral - gsave currentpoint currentpoint translate - #1 neg rotate neg exch neg exch translate}} - -\definespecial\dostoprotation% - {\special - {\@@insertpostscriptliteral - currentfont currentpoint grestore moveto setfont}} - -%D Drawing ovals in \DVIPS\ is complicated by the fact that -%D the colors get reset. Therefore we need a more literal -%D approach and therefore scale to local units. By redefining -%D the retain constant into a macro, we can use the already -%D present \POSTSCRIPT\ definition (see \type{spec-ps}). - -\definespecial\doovalbox#1#2#3#4#5#6#7% - {\bgroup - \edef\@@insertpostscriptretain gsave% - {\@@insertpostscriptliteral - gsave - Resolution 72 div - VResolution 72 div neg scale currentpoint translate}% - \dosomeovalbox{#1}{#2}{#3}{#4}{#5}{#6}{#7}% - \egroup} - -\stopspecials - -\endinput +%D \module
+%D [ file=spec-tr,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Thomas Rokicky's \DVIPS,
+%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.
+
+%D Especially the rotation proved to be incompatible with
+%D the default \POSTSCRIPT\ special driver. Many thanks to
+%D Gilbert van den Dobbelsteen for testing and hacking the
+%D \DVIPS\ source and pinpointing the problem.
+
+%D \macros
+%D {doinsertfile}
+%D
+%D We overrule the figure||insertion special. Things should
+%D be more accurate, but maybe someday \onbekend
+
+\startspecials[rokicky] % [postscript]
+
+\def\@@insertpostscriptliteral {ps: }
+\def\@@insertpostscriptretain {" }
+
+\def\dotrinserteps#1#2#3#4#5#6#7#8%
+ {\ScaledPointsToBigPoints{#4}\width
+ \ScaledPointsToBigPoints{#5}\height
+ \special
+ {psfile=#1
+ hscale=#2\space
+ vscale=#3\space
+ hoffset=\width \space
+ voffset=\height}}
+
+\definespecial\doinsertfile#1#2#3#4#5#6#7#8#9%
+ {\bgroup
+ \dodoinsertfile{tr}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}%
+ \egroup}
+
+%D \macros
+%D {dostartrotation}
+%D
+%D Because \DVIPS\ uses a reverse rotation scheme, we have
+%D to add an extra \type{neg} to the default \POSTSCRIPT\
+%D rotation definition:
+
+\definespecial\dostartrotation#1% straight from the YandY manual / 1st neg added
+ {\special
+ {\@@insertpostscriptliteral
+ gsave currentpoint currentpoint translate
+ #1 neg rotate neg exch neg exch translate}}
+
+\definespecial\dostoprotation%
+ {\special
+ {\@@insertpostscriptliteral
+ currentfont currentpoint grestore moveto setfont}}
+
+%D Drawing ovals in \DVIPS\ is complicated by the fact that
+%D the colors get reset. Therefore we need a more literal
+%D approach and therefore scale to local units. By redefining
+%D the retain constant into a macro, we can use the already
+%D present \POSTSCRIPT\ definition (see \type{spec-ps}).
+
+\definespecial\doovalbox#1#2#3#4#5#6#7%
+ {\bgroup
+ \edef\@@insertpostscriptretain gsave%
+ {\@@insertpostscriptliteral
+ gsave
+ Resolution 72 div
+ VResolution 72 div neg scale currentpoint translate}%
+ \dosomeovalbox{#1}{#2}{#3}{#4}{#5}{#6}{#7}%
+ \egroup}
+
+\stopspecials
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/spec-win.tex b/tex/context/base/spec-win.tex index ac60b6e98..674d694cd 100644 --- a/tex/context/base/spec-win.tex +++ b/tex/context/base/spec-win.tex @@ -1,97 +1,90 @@ -%D \module -%D [ file=spec-win, -%D version=1996.01.25, -%D title=\CONTEXT\ Special Macros, -%D subtitle=\YandY's \DVIWINDO, -%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. - -\unprotect - -%D \macros -%D {dosetupinteraction, -%D dostartthisislocation, -%D dostartthisisrealpage, -%D dostartgotolocation, -%D dostartgotorealpage, -%D dostartrunprogram, -%D usepagedestinations} -%D {} -%D -%D As told before, these were the first interactive specials. -%D In those days, these kind of specials were still elegant -%D and straightforward. - -\startspecials[dviwindo] - -\definespecial\dosetupinteraction% - {\showmessage{\m!interactions}{21}{dviwindo}} - -\definespecial\dostartgotolocation#1#2#3#4#5#6% - {\bgroup - \doifelsenothing{#3} - {\doifelsenothing{#4} - {\!!doneafalse} - {\doifparentfileelse{#4} - {\!!doneafalse} - {\!!doneatrue}}% - \special - {button: - #1 #2 - \if!!donea - file: #4, - \fi - \ifusepagedestinations - page: #6 - \else - "#5" - \fi}} - {}% nog uri afhandelen - \egroup} - -\definespecial\dostartgotorealpage#1#2#3#4#5% - {\bgroup - \doifelsenothing{#3} - {\doifelsenothing{#4} - {\!!doneafalse} - {\doifparentfileelse{#4} - {\!!doneafalse} - {\!!doneatrue}}% - \special - {button: - #1 #2 - \if!!donea - file: #4, - \fi - page:#5}} - {}% nog uri afhandelen - \egroup} - -\definespecial\dostartthisislocation#1% - {\ifusepagedestinations \else - \special{mark: "#1"}% - \fi} - -\definespecial\dostartthisisrealpage#1% - {} - -\definespecial\dostartrunprogram#1#2#3% - {\special{button: #1 #2 launch: #3}} - -\let\doyandyinsertmov = \docommoninsertmov -\let\dotrinsertmov = \docommoninsertmov - -%\def\doyandyinsertmov#1#2#3#4#5#6#7#8% -% {\special -% {button: 20000000 23000000 launch: w:/play32.exe #1}} - -\stopspecials - -\protect - -\endinput +%D \module
+%D [ file=spec-win,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=\YandY's \DVIWINDO,
+%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.
+
+\unprotect
+
+%D \macros
+%D {dosetupinteraction,
+%D dostartthisislocation,
+%D dostartthisisrealpage,
+%D dostartgotolocation,
+%D dostartgotorealpage,
+%D dostartrunprogram,
+%D usepagedestinations}
+%D {}
+%D
+%D As told before, these were the first interactive specials.
+%D In those days, these kind of specials were still elegant
+%D and straightforward.
+
+\startspecials[dviwindo]
+
+\definespecial\dosetupinteraction%
+ {\showmessage{\m!interactions}{21}{dviwindo}}
+
+\definespecial\dostartgotolocation#1#2#3#4#5#6%
+ {\bgroup
+ \doifelsenothing{#3}
+ {\doifelsenothing{#4}
+ {\!!doneafalse}
+ {\doifparentfileelse{#4}
+ {\!!doneafalse}
+ {\!!doneatrue}}%
+ \special
+ {button:
+ #1 #2
+ \if!!donea
+ file: #4,
+ \fi
+ "#5"}}
+ {}% nog uri afhandelen
+ \egroup}
+
+\definespecial\dostartgotorealpage#1#2#3#4#5%
+ {\bgroup
+ \doifelsenothing{#3}
+ {\doifelsenothing{#4}
+ {\!!doneafalse}
+ {\doifparentfileelse{#4}
+ {\!!doneafalse}
+ {\!!doneatrue}}%
+ \special
+ {button:
+ #1 #2
+ \if!!donea
+ file: #4,
+ \fi
+ \ifnum0#5=0 \else
+ page: #5
+ \fi}}
+ {}% nog uri afhandelen
+ \egroup}
+
+\definespecial\dostartthisislocation#1%
+ {\special{mark: "#1"}}
+
+\definespecial\dostartthisisrealpage#1%
+ {}
+
+\definespecial\dostartrunprogram#1#2#3%
+ {\special{button: #1 #2 launch: #3}}
+
+\let\doyandyinsertmov = \docommoninsertmov
+\let\dotrinsertmov = \docommoninsertmov
+
+\stopspecials
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/spec-yy.tex b/tex/context/base/spec-yy.tex index 832d1e6d0..885c6be01 100644 --- a/tex/context/base/spec-yy.tex +++ b/tex/context/base/spec-yy.tex @@ -1,72 +1,73 @@ -%D \module -%D [ file=spec-yy, -%D version=1996.01.25, -%D title=\CONTEXT\ Special Macros, -%D subtitle=\YandY's \DVIPSONE\ and \DVIWINDO, -%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. - -%D \macros -%D {dostartgraymode,dostopgraymode, -%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode, -%D doinsertfile} -%D {} -%D -%D We implement a nice and simple figure||insertion special -%D and make use of \YandY's color specials. Otherwise \DVIWINDO\ -%D would not show colors. - -\startspecials[yandy] % [postscript] - -\def\@@insertpostscriptliteral {ps: } -\def\@@insertpostscriptretain {" } % this was: {postscript} - -\definespecial\dostartgraymode#1% - {\special{color gray #1}} - -\definespecial\dostopgraymode% - {\special{color gray 0}} - -\definespecial\dostartrgbcolormode#1#2#3% - {\special{color rgb #1 #2 #3}} - -\definespecial\dostartcmykcolormode#1#2#3#4% - {\special{color cmyk #1 #2 #3 #4}} - -\definespecial\dostartgraycolormode#1% - {\special{color gray #1}} - -\definespecial\dostopcolormode% - {\special{color gray 0}} - -\def\doyyinserteps#1#2#3#4#5#6#7#8% equals rockiky - {\ScaledPointsToBigPoints{#4}\width - \ScaledPointsToBigPoints{#5}\height - \special - {psfile=#1 - hscale=#2\space - vscale=#3\space - hoffset=\width \space - voffset=\height}} - -\def\doyyinsertmps#1#2#3#4#5#6#7#8% - {\hbox - {\UseMetaPostGraphic{#1}% - \doyyinserteps{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}} - -\def\doyyinserttif#1#2#3#4#5#6#7#8% - {\special{insertimage: #1 #6 #7}} - -\definespecial\doinsertfile#1#2#3#4#5#6#7#8#9% - {\bgroup - \dodoinsertfile{yy}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}% - \egroup} - -\stopspecials - -\endinput +%D \module
+%D [ file=spec-yy,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=\YandY's \DVIPSONE\ and \DVIWINDO,
+%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.
+
+%D \macros
+%D {dostartgraymode,dostopgraymode,
+%D dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode,
+%D doinsertfile}
+%D {}
+%D
+%D We implement a nice and simple figure||insertion special
+%D and make use of \YandY's color specials. Otherwise \DVIWINDO\
+%D would not show colors.
+
+\startspecials[yandy] % [postscript]
+
+\def\@@insertpostscriptliteral {ps: }
+\def\@@insertpostscriptretain {" } % this was: {postscript}
+
+\definespecial\dostartgraymode#1%
+ {\special{color gray #1}}
+
+\definespecial\dostopgraymode%
+ {\special{color gray 0}}
+
+\definespecial\dostartrgbcolormode#1#2#3%
+ {\special{color rgb #1 #2 #3}}
+
+\definespecial\dostartcmykcolormode#1#2#3#4%
+ {\special{color cmyk #1 #2 #3 #4}}
+
+\definespecial\dostartgraycolormode#1%
+ {\special{color gray #1}}
+
+\definespecial\dostopcolormode%
+ {\special{color gray 0}}
+
+\def\doyyinserteps#1#2#3#4#5#6#7#8% equals rockiky
+ {\ScaledPointsToBigPoints{#4}\width
+ \ScaledPointsToBigPoints{#5}\height
+ \special
+ {psfile=#1
+ hscale=#2\space
+ vscale=#3\space
+ hoffset=\width \space
+ voffset=\height}}
+
+\def\doyyinsertmps#1#2#3#4#5#6#7#8%
+ {\hbox
+ {\UseMetaPostGraphic{#1}%
+ \doyyinserteps{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}
+
+\def\doyyinserttif#1#2#3#4#5#6#7#8%
+ {\special{insertimage: #1 #6 #7}}
+
+\definespecial\doinsertfile#1#2#3#4#5#6#7#8#9%
+ {\bgroup
+ \dodoinsertfile{yy}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}%
+ \egroup}
+
+\stopspecials
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/supp-box.tex b/tex/context/base/supp-box.tex index b3fe1d618..fb9e1e2d1 100644 --- a/tex/context/base/supp-box.tex +++ b/tex/context/base/supp-box.tex @@ -1,1107 +1,1108 @@ -% NEW - -\unprotect - -% limitatetext -> beter {text} als laatste !! - -% \limitvbox -% \limithbox - -\def\limitatelines#1#2% size sentinel - {\dowithnextbox - {\dimen0=#1\hsize - \ifdim\wd\nextbox>\dimen0 - \setbox\nextbox=\hbox - {\advance\dimen0 by -.1\hsize - \limitatetext{\unhbox\nextbox}{\dimen0}{\nobreak#2}}% - \fi - \unhbox\nextbox} - \hbox} - -\def\fittoptobaselinegrid% weg hier - {\dowithnextbox - {\bgroup - \par - \dimen0=\ht\nextbox - \ht\nextbox=\ht\strutbox - \dp\nextbox=\dp\strutbox - \hbox{\box\nextbox} - \prevdepth\dp\strutbox - \doloop - {\advance\dimen0 by -\lineheight - \ifdim\dimen0<\!!zeropoint - \exitloop - \else - \nobreak - \hbox{\strut} - \fi} - \egroup} - \vbox} - -\protect - -%D \module -%D [ file=supp-box, -%D version=1995.10.10, -%D title=\CONTEXT\ Support Macros, -%D subtitle=Boxes, -%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. - -%D This module implements some box manipulation macros. Some -%D are quite simple, some are more advanced and when understood -%D well, all can be of use. - -\writestatus{loading}{Context Support Macros / Boxes} - -\unprotect - -%D \macros -%D {nextdepth} -%D {} -%D -%D Let's start with a rather simple declaration. Sometimes we -%D need to save the \TEX\ \DIMENSION\ \type{\prevdepth} and -%D append it later on. The name \type{\nextdepth} suits -%D this purpose well. - -\newdimen\nextdepth - -%D \macros -%D {smashbox} -%D {} -%D -%D Smashing is introduced in \PLAIN\ \TEX, and stands for -%D reducing the dimensions of a box to zero. The most resolute -%D one is presented first. - -\def\smashbox#1% - {\wd#1=\!!zeropoint - \ht#1=\!!zeropoint - \dp#1=\!!zeropoint} - -%D \macros -%D {hsmashbox,vsmashbox} -%D {} -%D -%D Smashing can be used for overlaying boxes. Depending on -%D the mode, horizontal or vertical, one can use: - -\def\hsmashbox#1% - {\wd#1=\!!zeropoint} - -\def\vsmashbox#1% - {\ht#1=\!!zeropoint - \dp#1=\!!zeropoint} - -%D \macros -%D {hsmash,vsmash, -%D hsmashed,vsmashed} -%D {} -%D -%D While the previous macros expected a \BOX, the next act on a -%D content. They are some subtle differences betreen the smash -%D and smashed alternatives. The later ones reduce all -%D dimensions to zero. - -\def\hsmash#1% - {\bgroup - \setbox0=\normalhbox{#1}% - \hsmashbox0% - \box0 - \egroup} - -\def\vsmash#1% - {\bgroup - \setbox0=\normalvbox{#1}% - \vsmashbox0% - \box0 - \egroup} - -\def\hsmashed#1% - {\bgroup - \setbox0=\normalhbox{#1}% - \smashbox0% - \box0 - \egroup} - -\def\vsmashed#1% - {\bgroup - \setbox0=\normalvbox{#1}% - \smashbox0% - \box0 - \egroup} - -%D \macros -%D {getboxheight} -%D {} -%D -%D Although often needed, \TEX\ does not support arithmics -%D like: -%D -%D \starttypen -%D \dimen0 = \ht0 + \dp0 -%D \stoptypen -%D -%D so we implemented: -%D -%D \starttypen -%D \getboxheight ... \of \box... -%D \stoptypen -%D -%D For instance, -%D -%D \starttypen -%D \getboxheight \dimen0 \of \box0 -%D \getboxheight \someheight \of \box \tempbox -%D \stoptypen - -\def\getboxheight#1\of#2\box#3% - {#1=\ht#3% - \advance#1 by \dp#3\relax} - -%D \macros -%D {dowithnextbox, -%D nextbox} -%D {} -%D -%D Sometimes we want a macro to grab a box and do something -%D on the content. One could pass an argument to a box, but -%D this can violate the specific \CATCODES\ of its content and -%D leads to unexpected results. The next macro treats the -%D following braced text as the content of a box and -%D manipulates it afterwards in a predefined way. -%D -%D The first argument specifies what to do with the content. -%D This content is available in \type{\nextbox}. The second -%D argument is one of \type{\hbox}, \type{\vbox} or -%D \type{\vtop}. The third argument must be grouped with -%D \type{\bgroup} and \type{\egroup}, \type{{...}} or can be -%D a \type{\box} specification. -%D -%D In \CONTEXT\ this macro is used for picking up a box and -%D treating it according to earlier specifications. We use for -%D instance something like: -%D -%D \starttypen -%D \def\getfloat% -%D {\def\handlefloat{...\box\nextbox...} -%D \dowithnextbox\handlefloat\vbox} -%D \stoptypen -%D -%D in stead of: -%D -%D \starttypen -%D \def\getfloat#1% -%D {...#1...} -%D \stoptypen -%D -%D In this implementation the \type{\aftergroup} construction -%D is needed because \type{\afterassignment} is executed inside -%D the box. - -\newbox\nextbox - -\long\def\dowithnextbox#1% - {\long\def\dodowithnextbox{#1}% - \afterassignment\dododowithnextbox - \setbox\nextbox} - -\def\dododowithnextbox% - {\aftergroup\dodowithnextbox} - -%D So in fact we get: -%D -%D \starttypen -%D \setbox\nextbox { \aftergroup\dodowithnextbox ... } -%D \stoptypen -%D -%D or -%D -%D \starttypen -%D \setbox\nextbox { ... } \dodowithnextbox -%D \stoptypen -%D -%D A slower but more versatile implementation is: -%D -%D \starttypen -%D \long\def\dowithnextbox#1#2% -%D {\long\def\dodowithnextbox{#1}% -%D \ifx#2\hbox -%D \afterassignment\dododowithnextbox -%D \else\ifx#2\vbox -%D \afterassignment\dododowithnextbox -%D \else\ifx#2\vtop -%D \afterassignment\dododowithnextbox -%D \else\ifx#2\vcenter -%D \afterassignment\dododowithnextbox -%D \else -%D \afterassignment\dodowithnextbox -%D \fi\fi\fi\fi -%D \setbox\nextbox#2} -%D \stoptypen -%D -%D This alternative also accepts \type{\box0} and alike, but -%D we don't really need this functionality now. - -%D \macros -%D {beginofshapebox, -%D reshapebox, doreshapebox, -%D flushshapebox, -%D shapebox, -%D ifreshapingbox} -%D {} -%D -%D The next utility macro originates from some linenumbering -%D mechanism. Due to \TEX's advanced way of typesetting -%D paragraphs, it's not easy to do things on a line||by||line -%D basis. This macro is able to reprocess a given box and can -%D act upon its vertical boxed components, such as lines. The -%D unwinding sequence in this macro is inspired by a \NTG\ -%D workshop of David Salomon in June 1992. -%D -%D First we have to grab the piece of text we want to act -%D upon. This is done by means of the duo macros: -%D -%D \starttypen -%D \beginofshapebox -%D a piece of text -%D \endofshapebox -%D \stoptypen -%D -%D When all texts is collected, we can call \type{\reshapebox} -%D and do something with it's vertical components. We can make -%D as much passes as needed. When we're done, the box can be -%D unloaded with \type{\flushshapebox}. The only condition in -%D this scheme is that \type{\reshapebox} must somehow unload -%D the \BOX\ \type{\shapebox}. -%D -%D An important aspect is that the content is unrolled -%D bottom||up. The next example illustrates this maybe -%D unexpected characteristic. -%D -%D \startbuffer -%D \beginofshapebox -%D \em \input tufte -%D \endofshapebox -%D -%D \newcounter\LineNumber -%D -%D \reshapebox -%D {\doglobal\increment\LineNumber -%D \hbox{\llap{\LineNumber\hskip2em}\box\shapebox}} -%D -%D \flushshapebox -%D \stopbuffer -%D -%D \typebuffer -%D -%D \haalbuffer -%D -%D As we can see, when some kind of numbering is done, we have -%D to add a second pass. -%D -%D \startbuffer -%D \newcounter\LineNumber -%D \newcounter\NumberOfLines -%D -%D \reshapebox -%D {\doglobal\increment\NumberOfLines -%D \box\shapebox} -%D -%D \reshapebox -%D {\doglobal\increment\LineNumber -%D \hbox -%D {\llap{\LineNumber\ (\NumberOfLines)\hskip2em}% -%D \box\shapebox}% -%D \doglobal\decrement\NumberOfLines} -%D -%D \flushshapebox -%D \stopbuffer -%D -%D \typebuffer -%D -%D \haalbuffer -%D -%D This example shows that the content of the box is still -%D available after flushing. Another feature is that only the -%D last reshaping counts. Multiple reshaping can be done by: -%D -%D \startbuffer -%D \beginofshapebox -%D \flushshapebox -%D \endofshapebox -%D -%D \reshapebox -%D {\doglobal\increment\LineNumber -%D \hbox{\llap{$\star$\hskip1em}\box\shapebox}% -%D \doglobal\decrement\NumberOfLines} -%D -%D \flushshapebox -%D \stopbuffer -%D -%D \typebuffer -%D -%D \haalbuffer -%D -%D The macros are surprisingly easy to follow and in fact -%D introduce no new concepts. Nearly all books on \TEX\ show -%D similar solutions for unwinding \BOXES. -%D -%D Some macros, like footnote ones, can be sensitive for -%D reshaping, which can result in an endless loop. We -%D therefore offer: -%D -%D \starttypen -%D \ifreshapingbox -%D \stoptypen -%D -%D Some \CONTEXT\ commands are protected this way. Anyhow, -%D reshaping is aborted after 100 dead cycles. -%D -%D By the way, changing the height and depth of \BOX\ -%D \type{\shapebox} results in bad spacing. This means that -%D for instance linenumbers etc. should be given zero height -%D and depth before being lapped into the margin. The -%D previous examples ignore this side effect, but beware! - -\newif\ifsomeshapeleft -\newif\ifreshapingbox - -\def\shapesignal {.12345678pt} - -\newbox \shapebox -\newcount \shapepenalty -\newdimen \shapekern -\newskip \shapeskip - -\newbox\newshapebox -\newbox\oldshapebox - -\newcount\shapecounter - -\def\reshapebox#1% - {\doreshapebox - {#1} - {\penalty\shapepenalty} - {\kern\shapekern} - {\vskip\shapeskip}} - -\def\doreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip - {\setbox\newshapebox=\normalvbox - \bgroup - \unvcopy\oldshapebox - \setbox\newshapebox=\box\voidb@x - \shapecounter=0 - \loop - \someshapelefttrue - \ifdim\lastskip=\!!zeropoint\relax - \ifdim\lastkern=\!!zeropoint\relax - \ifnum\lastpenalty=0 - \setbox\shapebox=\lastbox - \ifvoid\shapebox - \unskip\unpenalty\unkern - \else - \ifdim\wd\shapebox=\shapesignal\relax - \someshapeleftfalse - \else - \shapecounter=0 - \setbox\newshapebox= - \normalvbox{#1\unvbox\newshapebox} - \fi - \fi - \else - \shapepenalty=\lastpenalty - \setbox\newshapebox= - \normalvbox{#2\unvbox\newshapebox} - \unpenalty - \fi - \else - \shapekern=\lastkern - \setbox\newshapebox= - \normalvbox{#3\unvbox\newshapebox} - \unkern - \fi - \else - \shapeskip=\lastskip - \setbox\newshapebox= - \normalvbox{#4\unvbox\newshapebox} - \unskip - \fi - \ifnum\shapecounter>100 % can be less - \message{<<forced exit from shapebox>>}% - \someshapeleftfalse - \else - \advance\shapecounter by 1 - \fi - \ifsomeshapeleft \repeat - \unvbox\newshapebox - \egroup} - -\def\beginofshapebox% - {\setbox\oldshapebox=\normalvbox - \bgroup - \reshapingboxtrue - \hbox to \shapesignal{\hss}} - -\def\endofshapebox% - {\endgraf - \egroup} - -\let\beginshapebox=\beginofshapebox -\let\endshapebox =\endofshapebox - -\def\flushshapebox% - {\ifdim\ht\newshapebox=\!!zeropoint\relax - \else - % make \prevdepth legal - \par - % and take a look - \ifdim\prevdepth=\hideskip\relax - \prevdepth=\!!zeropoint - \fi - \ifdim\prevdepth<\!!zeropoint - % something like a line or a signal or ... - \else - \ifinner - % not watertight and not ok - \else\ifdim\pagegoal=\maxdimen\else - % give the previous line a normal depth - \vbox to \!!zeropoint{} - % go back one line - \vskip-\lineheight - \fi\fi - \fi - \unvcopy\newshapebox\relax - % \prevdepth=0pt and \dp\newshapebox depend on last line - \kern-\dp\newshapebox\relax - % now \prevdepth=0pt - \fi} - -%D For absolute control, one can use \type{\doreshapebox} -%D directly. This macro takes four arguments, that take care -%D of: -%D -%D \startopsomming[n,opelkaar] -%D \som \type{\shapebox} -%D \som \type{\shapepenalty} -%D \som \type{\shapekern} -%D \som \type{\shapeskip} -%D \stopopsomming - -%D \macros -%D {hyphenatedword, -%D dohyphenateword} -%D {} -%D -%D The next one is a tricky one. \PLAIN\ \TEX\ provides -%D \type{\showhyphens} for showing macros on the terminal. When -%D preparing a long list of words we decided to show the -%D hyphens, but had to find out that the \PLAIN\ alternative -%D can hardly be used and|/|or adapted to typesetting. The next -%D two macros do the job and a little more. -%D -%D The simple command \type{\hyphenatedword} accepts one -%D argument and gives the hyphenated word. This macro calls for -%D -%D \starttypen -%D \dohyphenateword {n} {pre} {word} -%D \stoptypen -%D -%D The next examples tell more than lots of words: -%D -%D \startbuffer -%D \dohyphenateword{0} {} {dohyphenatedword} -%D \dohyphenateword{1} {...} {dohyphenatedword} -%D \dohyphenateword{2} {...} {dohyphenatedword} -%D \stopbuffer -%D -%D \typebuffer -%D -%D Here, \type{\hyphenatedword{dohyphenatedword}} is the -%D shorter alternative for the first line. -%D -%D \startvoorbeeld -%D \haalbuffer -%D \stopvoorbeeld -%D -%D These macros are slow but effective and not that hard to -%D program at all. - -\def\dohyphenateword#1#2#3% - {\bgroup - \setbox0=\hbox - {\mindermeldingen - \widowpenalty=0 - \clubpenalty=0 - \setbox0=\vbox - {\hsize\!!zeropoint \ #3}% - \ifnum#1>0 - \dorecurse{#1} - {\setbox2=\hbox - {\vsplit0 to \baselineskip}}% - #2% - \fi - \loop - \setbox2=\hbox - {\vsplit0 to \baselineskip}% - \hbox - {\unhbox2 - \setbox2=\lastbox - \vbox - {\unvbox2 - \setbox2=\lastbox - \hbox{\unhbox2}}}% - \ifdim\ht0>\!!zeropoint - \repeat}% - \ht0=\ht\strutbox - \dp0=\dp\strutbox - \box0 - \egroup} - -\def\hyphenatedword% - {\dohyphenateword{0}{}} - -%D \macros -%D {doboundtext} -%D {} -%D -%D Sometimes there is not enough room to show the complete -%D (line of) text. In such a situation we can strip of some -%D characters by using \type{\doboundtext}. When the text is -%D wider than the given width, it's split and the third -%D argument is appended. When the text to be checked is packed -%D in a command, we'll have to use \type{\expandafter}. -%D -%D \starttypen -%D \doboundtext{a very, probably to long, text}{3cm}{...} -%D \stoptypen -%D -%D When calculating the room needed, we take the width of the -%D third argument into account, which leads to a bit more -%D complex macro than needed at first sight. - -\def\dodoboundtext#1% - {\setbox0=\hbox{\unhcopy0 #1}% - \ifdim\wd0>\dimen0 - \let\dodoboundtext=\gobbleoneargument - \else - #1\relax - \fi} - -\def\doboundtext#1#2#3% - {\hbox - {\setbox0=\hbox{#1}% - \dimen0=#2\relax - \ifdim\wd0>\dimen0 - \setbox2=\hbox{#3}% - \advance\dimen0 by -\wd2 - \setbox0=\hbox{}% - \processtokens - {\dodoboundtext} - {\dodoboundtext} - {} - {\space} - {#1}% - \box2 - \else - \box0 - \fi}} - -%D \macros -%D {limitatetext} -%D {} -%D -%D A bit more beautiful alternative for the previous command is -%D the next one. This command is more robust because we let -%D \TEX\ do most of the job. The previous command works better -%D on text that cannot be hyphenated. -%D -%D \starttypen -%D \limitatetext {text} {width} {sentinel} -%D \stoptypen -%D -%D When no width is given, the whole text comes available. The -%D sentinel is optional. - -\def\limitatetext#1#2#3% - {\doifelse{#2}{} - {#1} - {\bgroup - \setbox0=\hbox{#1}% - \dimen0=#2\relax - \ifdim\wd0>\dimen0 - \setbox2=\hbox{\ #3}% - \advance\dimen0 by -\wd2 - \setbox0=\vbox - {\hsize=\dimen0\relax - \hfuzz\maxdimen - \raggedright - \strut\unhbox0}% - \vbox % if omitted: missing brace reported - {\setbox0=\vsplit0 to \ht\strutbox - \unvbox0 - \setbox0=\lastbox - \unhbox0\kern0pt\box2}% - \else - \unhbox0 - \fi - \egroup}} - -%D \macros -%D {processisolatedwords,betweenisolatedwords} -%D {} -%D -%D References are often made up of one word or a combination -%D of tightly connected words. The typeset text {\bf -%D chapter~5} is for instance the results of the character -%D sequence: -%D -%D \starttypen -%D The typeset text \in{chapter}[texniques] is for instance -%D \stoptypen -%D -%D When such words are made active in interactive texts, the -%D combination cannot longer be hyphenated. Normally this is no -%D problem, because \TEX\ tries to prevent hyphenation as best -%D as can. -%D -%D Sometimes however we need a few more words to make things -%D clear, like when we want to refer to {\bf \TEX\ by Topic}. -%D The macros that are responsible for typesetting hyperlinks, -%D take care of such sub||sentences by breaking them up in -%D words. Long ago we processed words using the space as a -%D separator, but the more advanced our interactive text became, -%D the more we needed a robust solution. Well, here it is and -%D it called as: -%D -%D \starttypen -%D \processisolatedwords{some words}\someaction -%D \stoptypen -%D -%D The second argument \type{someactions} handles the -%D individual words, like in: -%D -%D \startbuffer -%D \processisolatedwords{some more words} \ruledhbox \par -%D \processisolatedwords{and some $x + y = z$ math} \ruledhbox \par -%D \processisolatedwords{and a \hbox{$x + y = z$}} \ruledhbox \par -%D \stopbuffer -%D -%D \typebuffer -%D -%D which let the words turn up as: -%D -%D \startvoorbeeld -%D \haalbuffer -%D \stopvoorbeeld -%D -%D The macro has been made a bit more clever than needed at -%D first sight. This is due to the fact that we don't want to -%D generate more overhead in terms of interactive commands than -%D needed. -%D -%D \startbuffer -%D \processisolatedwords{see this \ruledhskip1em} \ruledhbox -%D \processisolatedwords{and \ruledhskip1em this one} \ruledhbox -%D \stopbuffer -%D -%D \typebuffer -%D -%D becomes: -%D -%D \startvoorbeeld -%D \startregels -%D \haalbuffer -%D \stopregels -%D \stopvoorbeeld -%D -%D Single word arguments are treated without further -%D processing. This was needed because this command is used in -%D the \type{\goto} command, to which we sometimes pass very -%D strange and|/|or complicated arguments or simply boxes -%D whose dimensions are to be left intact. -%D -%D First we build a \type{\hbox}. This enables us to save the -%D last skip. Next we fill a \type{\vbox} without hyphenating -%D words. After we've tested if there is more than one word, we -%D start processing the individual lines (words). We need some -%D splitting, packing and unpacking to get the spacing and -%D dimensions right. -%D -%D Normally the isolated words are separated by space, but -%D one can overrule this separator by changing the next macros. - -\def\betweenisolatedwords% - {\hskip\fontdimen2\font\!!plus\fontdimen3\font\!!minus\fontdimen4\font} - -\def\processisolatedwords#1#2% - {\bgroup - \mindermeldingen - \forgetall - \setbox0=\hbox - {#1% - \xdef\isolatedlastskip{\the\lastskip}}% - \setbox2=\vbox - {\hyphenpenalty10000 - \hsize\!!zeropoint - \unhcopy0}% == #1 - \ifdim\ht0=\ht2 - #2{\unhcopy0}% == #2{#1} - \else - \setbox0=\hbox - {\ignorespaces - \loop - \setbox4=\hbox - {\vsplit2 to \baselineskip}% - \hbox - {\unhbox4 - \setbox4=\lastbox - \vbox % outer \hbox needed - {\unvbox4 % for nested use - \setbox4=\lastbox - \hbox{#2{\hbox{\unhbox4}}}}}% - \ifdim\ht2>\!!zeropoint \betweenisolatedwords \repeat - \unskip}% - \unhbox0\unskip\hskip\isolatedlastskip - \fi - \egroup} - -%D \macros -%D {sbox} -%D {} -%D -%D This is a rather strange command. It grabs some box content -%D and and limits the size to the height and depth of a -%D \type{\strut}. The resulting bottom||alligned box can be used -%D aside other ones, without disturbing the normal baseline -%D distance. -%D -%D \startbuffer -%D \ruledhbox to .5\hsize{\sbox{eerste\par tweede \par derde}} -%D \stopbuffer -%D -%D \typebuffer -%D -%D Shows up as: -%D -%D \startvoorbeeld -%D \vskip3\baselineskip -%D \haalbuffer -%D \stopvoorbeeld -%D -%D Before displaying the result we added some skip, otherwise -%D the first two lines would have ended up in the text. This -%D macro can be useful when building complicated menus, headers -%D and footers and|/|or margin material. -%D -%D {\em This macro still needs some improvement.} - -\def\sbox% in handleiding, voorbeeld \inlinker{xx} \extern.. - {\dowithnextbox - {\setbox0=\hbox - {\strut - \dp\nextbox=0pt - \lower\strutdepth\box\nextbox}% - \dp0=\strutdepth - \ht0=\strutheight - \box0}% - \vbox} - -%D \macros -%D {centeredbox} -%D {} -%D -%D Here is another strange one. This one offers a sort of overlay -%D with positive or negative offsets. This command can be used -%D in well defined areas where no offset options are available. -%D We first used it when building a button inside the margin -%D footer, where the button should have a horizontal offset and -%D should be centered with respect to the surrounding box. The -%D last of the three examples we show below says: -%D -%D \starttypen -%D \vsize=3cm -%D \hsize=3cm -%D \ruledvbox to \vsize -%D {\centeredbox height .5cm width -1cm -%D {\vrule width \hsize height \vsize}}} -%D \stoptypen -%D -%D Here the \type{\ruledvbox} just shows the surrounding box -%D and \type{\vrule} is used to show the centered box. -%D -%D \def\AnExample#1#2% -%D {\vsize=3cm -%D \hsize=3cm -%D \ruledvbox to \vsize -%D {\centeredbox height #1 width #2 -%D {\color[groen]{\vrule width \hsize height \vsize}}}} -%D -%D \startregelcorrectie -%D \startcombinatie[3*1] -%D {\AnExample {-1cm} {.5cm}} {} -%D {\AnExample {.5cm} {-1cm}} {} -%D {\AnExample {-1cm} {-.5cm}} {} -%D \stopcombinatie -%D \stopregelcorrectie -%D -%D This command takes two optional arguments: \type{width} and -%D \type{height}. Observing readers can see that we use \TEX's -%D own scanner for grabbing these arguments: \type{#1#} reads -%D everyting till the next brace and passes it to both rules. -%D The setting of the box dimensions at the end is needed for -%D special cases. The dimensions of the surounding box are kept -%D intact. This commands handles positive and negative -%D dimensions (which is why we need two boxes with rules). - -\def\centeredbox#1#% height +/-dimen width +/-dimen - {\bgroup - \setbox0=\vbox to \vsize - \bgroup - \mindermeldingen - \forgetall - \setbox0=\hbox{\vrule\!!width\!!zeropoint#1}% - \setbox2=\vbox{\hrule\!!height\!!zeropoint#1}% - \advance\vsize by \ht2 - \advance\hsize by \wd0 - \vbox to \vsize - \bgroup - \vskip-\ht2 - \vss - \hbox to \hsize - \bgroup - \dowithnextbox - {\hskip-\wd0 - \hss - \box\nextbox - \hss - \egroup - \vss - \egroup - \egroup - \wd0=\hsize - \ht0=\vsize - \box0 - \egroup} - \hbox} - -%D \macros -%D {setrigidcolumnhsize,rigidcolumnbalance} -%D -%D These macros are copied from the \TEX book, page~397, and -%D extended by a macro that sets the \type{\hsize}. -%D -%D \starttypen -%D \setrigidcolumnhsize {total width} {distance} {n} -%D \rigidcolumnbalance {box} {n} -%D \stoptypen -%D -%D Both these macros are for instance used in typesetting -%D footnotes. -%D -%D Men kan het proces van breken enigzins beinvloeden met de -%D volgende twee swithes: - -\newif\ifalignrigidcolumns -\newif\ifstretchrigidcolumns - -%D De eerste switch bepaald het uitlijnen, de tweede rekt de -%D individuele kolommen op naar \type{\vsize}. - -\def\setrigidcolumnhsize#1#2#3% - {\hsize=#1\relax - \scratchdimen=-#2\relax - \multiply\scratchdimen by #3\relax - \advance\scratchdimen by #2\relax - \advance\hsize by \scratchdimen - \divide\hsize by #3\relax} - -\def\rigidcolumnbalance#1#2% - {\global\chardef\rigidcolumnbox=#1\relax - \global\chardef\rigidcolumns=#2\relax - \ifnum\rigidcolumns=1 - \ifinner\ifhmode\box\else\unvbox\fi\else\unvbox\fi\rigidcolumnbox - \else - \line - {\vbadness=10000 - \tabskip\!!zeropoint - \splittopskip=\ht\strutbox - %\scratchdimen=\ht\rigidcolumnbox % sensitive for overflow - %\divide\scratchdimen by \rigidcolumns % therefore we need the hack: - \scratchdimen=1pt - \divide\scratchdimen by \rigidcolumns - \expanded{\scratchdimen=\withoutpt{\the\scratchdimen}\ht\rigidcolumnbox}% - \advance\scratchdimen by \ht\strutbox - \valign{##\vfill\cr\dorigidcolumnsplits}}% - \fi} - -\def\dorigidcolumnsplits% - {\ifnum\rigidcolumns>0 - \setbox\scratchbox=\vsplit\rigidcolumnbox to \scratchdimen - \ifalignrigidcolumns - \vbox to \ifstretchrigidcolumns\vsize\else\scratchdimen\fi - {\unvbox\scratchbox}% - \else - \vbox{\unvbox\scratchbox}% - \fi - \doglobal\decrement\rigidcolumns - \cr - \ifnum\rigidcolumns>0\noalign{\hfil}\fi - \expandafter\dorigidcolumnsplits - \fi} - -%D \macros -%D {startvboxtohbox,stopvboxtohbox,convertvboxtohbox} -%D -%D Here is another of Knuth's dirty tricks, as presented on -%D pages 398 and 399 of the \TEX book. These macros can be used -%D like: -%D -%D \starttypen -%D \vbox -%D \bgroup -%D \startvboxtohbox ... \stopvboxtohbox -%D \startvboxtohbox ... \stopvboxtohbox -%D \startvboxtohbox ... \stopvboxtohbox -%D \egroup -%D -%D \vbox -%D \bgroup -%D \converthboxtovbox -%D \egroup -%D \stoptypen -%D -%D These macros are used in reformatting footnotes, so they do -%D what they're meant for. - -\def\setvboxtohbox% - {\bgroup - \ifdim\baselineskip<16pt \relax - \dimen0=\baselineskip - \multiply\dimen0 by 1024 - \else - \message{cropping \baselineskip to 16pt}% - \baselineskip=\maxdimen - \fi - \divide\dimen0 by \hsize - \multiply\dimen0 by 64 - \xdef\vboxtohboxfactor{\expandafter\withoutpt\the\dimen0}% - \egroup} - -\def\startvboxtohbox% - {\bgroup - \setvboxtohbox - \setbox0=\hbox\bgroup} - -\def\stopvboxtohbox% - {\egroup - \dp0=\!!zeropoint - \ht0=\vboxtohboxfactor\wd0 - \box0 - \egroup} - -\def\convertvboxtohbox% - {\setvboxtohbox - \makehboxofhboxes - \setbox0=\hbox{\unhbox0 \removehboxes}% - \noindent\unhbox0\par} - -\def\makehboxofhboxes% - {\setbox0=\hbox{}% - \loop - \setbox2=\lastbox - \ifhbox2 - \setbox0=\hbox{\box2\unhbox0}% - \repeat} - -\def\removehboxes% - {\setbox0=\lastbox - \ifhbox0 - {\removehboxes}% - \unhbox0 - \fi} - -%D \macros -%D {doifcontent} -%D -%D When processing depends on the availability of content, one -%D can gove the next macro a try. -%D -%D \starttypen -%D \doifcontent{pre content}{post content}{no content}\somebox -%D \stoptypen -%D -%D Where \type{\somebox} is either a \type{\hbox} or -%D \type{\vbox}. If the dimension of this box suggest some -%D content, the resulting box is unboxed and surrounded by the -%D first two arguments, else the third arguments is executed. - -\def\doifcontent#1#2#3% - {\dowithnextbox - {\ifhbox\nextbox - \ifdim\wd\nextbox>\!!zeropoint - #1\unhbox\nextbox#2\relax - \else - #3\relax - \fi - \else - \ifdim\ht\nextbox>\!!zeropoint - #1\unvbox\nextbox#2\relax - \else - #3\relax - \fi - \fi}} - -%D So when we say: -%D -%D \startbuffer -%D \doifcontent{[}{]}{}\hbox{content sensitive typesetting} -%D -%D \doifcontent{}{\pagina}{}\vbox{content sensitive typesetting} -%D -%D \doifcontent{}{}{\message{Didn't you forget something?}}\hbox{} -%D \stopbuffer -%D -%D \typebuffer -%D -%D We get: -%D -%D \haalbuffer -%D -%D Where the last call of course does not show up in this -%D document, but definitely generates a confusing message. - -% maybe some day we need this -% -% \def\appendvbox#1% % uses \box8 -% {\bgroup -% \ifdim\prevdepth<\!!zeropoint -% \ifdim\pagetotal=\!!zeropoint -% \setbox8=\vtop{\unvcopy#1}% -% \hrule\c!!height\!!zeropoint -% \kern-\ht8 -% \box#1\relax -% \else -% \box#1\relax -% \fi -% \else -% \dimen0=\prevdepth -% \hrule\c!!height\!!zeropoint -% \setbox8=\vtop{\unvcopy#1}% -% \dimen2=\baselineskip -% \advance\dimen2 by -\dimen0 -% \advance\dimen2 by -\ht8 -% \kern\dimen2 -% \box#1\relax -% \fi -% \egroup} - -\protect - -\endinput +% NEW
+
+\unprotect
+
+% limitatetext -> beter {text} als laatste !!
+
+% \limitvbox
+% \limithbox
+
+\def\limitatelines#1#2% size sentinel
+ {\dowithnextbox
+ {\dimen0=#1\hsize
+ \ifdim\wd\nextbox>\dimen0
+ \setbox\nextbox=\hbox
+ {\advance\dimen0 by -.1\hsize
+ \limitatetext{\unhbox\nextbox}{\dimen0}{\nobreak#2}}%
+ \fi
+ \unhbox\nextbox}
+ \hbox}
+
+\def\fittoptobaselinegrid% weg hier
+ {\dowithnextbox
+ {\bgroup
+ \par
+ \dimen0=\ht\nextbox
+ \ht\nextbox=\ht\strutbox
+ \dp\nextbox=\dp\strutbox
+ \hbox{\box\nextbox}
+ \prevdepth\dp\strutbox
+ \doloop
+ {\advance\dimen0 by -\lineheight
+ \ifdim\dimen0<\!!zeropoint
+ \exitloop
+ \else
+ \nobreak
+ \hbox{\strut}
+ \fi}
+ \egroup}
+ \vbox}
+
+\protect
+
+%D \module
+%D [ file=supp-box,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Boxes,
+%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.
+
+%D This module implements some box manipulation macros. Some
+%D are quite simple, some are more advanced and when understood
+%D well, all can be of use.
+
+\writestatus{loading}{Context Support Macros / Boxes}
+
+\unprotect
+
+%D \macros
+%D {nextdepth}
+%D {}
+%D
+%D Let's start with a rather simple declaration. Sometimes we
+%D need to save the \TEX\ \DIMENSION\ \type{\prevdepth} and
+%D append it later on. The name \type{\nextdepth} suits
+%D this purpose well.
+
+\newdimen\nextdepth
+
+%D \macros
+%D {smashbox}
+%D {}
+%D
+%D Smashing is introduced in \PLAIN\ \TEX, and stands for
+%D reducing the dimensions of a box to zero. The most resolute
+%D one is presented first.
+
+\def\smashbox#1%
+ {\wd#1=\!!zeropoint
+ \ht#1=\!!zeropoint
+ \dp#1=\!!zeropoint}
+
+%D \macros
+%D {hsmashbox,vsmashbox}
+%D {}
+%D
+%D Smashing can be used for overlaying boxes. Depending on
+%D the mode, horizontal or vertical, one can use:
+
+\def\hsmashbox#1%
+ {\wd#1=\!!zeropoint}
+
+\def\vsmashbox#1%
+ {\ht#1=\!!zeropoint
+ \dp#1=\!!zeropoint}
+
+%D \macros
+%D {hsmash,vsmash,
+%D hsmashed,vsmashed}
+%D {}
+%D
+%D While the previous macros expected a \BOX, the next act on a
+%D content. They are some subtle differences betreen the smash
+%D and smashed alternatives. The later ones reduce all
+%D dimensions to zero.
+
+\def\hsmash#1%
+ {\bgroup
+ \setbox0=\normalhbox{#1}%
+ \hsmashbox0%
+ \box0
+ \egroup}
+
+\def\vsmash#1%
+ {\bgroup
+ \setbox0=\normalvbox{#1}%
+ \vsmashbox0%
+ \box0
+ \egroup}
+
+\def\hsmashed#1%
+ {\bgroup
+ \setbox0=\normalhbox{#1}%
+ \smashbox0%
+ \box0
+ \egroup}
+
+\def\vsmashed#1%
+ {\bgroup
+ \setbox0=\normalvbox{#1}%
+ \smashbox0%
+ \box0
+ \egroup}
+
+%D \macros
+%D {getboxheight}
+%D {}
+%D
+%D Although often needed, \TEX\ does not support arithmics
+%D like:
+%D
+%D \starttypen
+%D \dimen0 = \ht0 + \dp0
+%D \stoptypen
+%D
+%D so we implemented:
+%D
+%D \starttypen
+%D \getboxheight ... \of \box...
+%D \stoptypen
+%D
+%D For instance,
+%D
+%D \starttypen
+%D \getboxheight \dimen0 \of \box0
+%D \getboxheight \someheight \of \box \tempbox
+%D \stoptypen
+
+\def\getboxheight#1\of#2\box#3%
+ {#1=\ht#3%
+ \advance#1 by \dp#3\relax}
+
+%D \macros
+%D {dowithnextbox,
+%D nextbox}
+%D {}
+%D
+%D Sometimes we want a macro to grab a box and do something
+%D on the content. One could pass an argument to a box, but
+%D this can violate the specific \CATCODES\ of its content and
+%D leads to unexpected results. The next macro treats the
+%D following braced text as the content of a box and
+%D manipulates it afterwards in a predefined way.
+%D
+%D The first argument specifies what to do with the content.
+%D This content is available in \type{\nextbox}. The second
+%D argument is one of \type{\hbox}, \type{\vbox} or
+%D \type{\vtop}. The third argument must be grouped with
+%D \type{\bgroup} and \type{\egroup}, \type{{...}} or can be
+%D a \type{\box} specification.
+%D
+%D In \CONTEXT\ this macro is used for picking up a box and
+%D treating it according to earlier specifications. We use for
+%D instance something like:
+%D
+%D \starttypen
+%D \def\getfloat%
+%D {\def\handlefloat{...\box\nextbox...}
+%D \dowithnextbox\handlefloat\vbox}
+%D \stoptypen
+%D
+%D in stead of:
+%D
+%D \starttypen
+%D \def\getfloat#1%
+%D {...#1...}
+%D \stoptypen
+%D
+%D In this implementation the \type{\aftergroup} construction
+%D is needed because \type{\afterassignment} is executed inside
+%D the box.
+
+\newbox\nextbox
+
+\long\def\dowithnextbox#1%
+ {\long\def\dodowithnextbox{#1}%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+\def\dododowithnextbox%
+ {\aftergroup\dodowithnextbox}
+
+%D So in fact we get:
+%D
+%D \starttypen
+%D \setbox\nextbox { \aftergroup\dodowithnextbox ... }
+%D \stoptypen
+%D
+%D or
+%D
+%D \starttypen
+%D \setbox\nextbox { ... } \dodowithnextbox
+%D \stoptypen
+%D
+%D A slower but more versatile implementation is:
+%D
+%D \starttypen
+%D \long\def\dowithnextbox#1#2%
+%D {\long\def\dodowithnextbox{#1}%
+%D \ifx#2\hbox
+%D \afterassignment\dododowithnextbox
+%D \else\ifx#2\vbox
+%D \afterassignment\dododowithnextbox
+%D \else\ifx#2\vtop
+%D \afterassignment\dododowithnextbox
+%D \else\ifx#2\vcenter
+%D \afterassignment\dododowithnextbox
+%D \else
+%D \afterassignment\dodowithnextbox
+%D \fi\fi\fi\fi
+%D \setbox\nextbox#2}
+%D \stoptypen
+%D
+%D This alternative also accepts \type{\box0} and alike, but
+%D we don't really need this functionality now.
+
+%D \macros
+%D {beginofshapebox,
+%D reshapebox, doreshapebox,
+%D flushshapebox,
+%D shapebox,
+%D ifreshapingbox}
+%D {}
+%D
+%D The next utility macro originates from some linenumbering
+%D mechanism. Due to \TEX's advanced way of typesetting
+%D paragraphs, it's not easy to do things on a line||by||line
+%D basis. This macro is able to reprocess a given box and can
+%D act upon its vertical boxed components, such as lines. The
+%D unwinding sequence in this macro is inspired by a \NTG\
+%D workshop of David Salomon in June 1992.
+%D
+%D First we have to grab the piece of text we want to act
+%D upon. This is done by means of the duo macros:
+%D
+%D \starttypen
+%D \beginofshapebox
+%D a piece of text
+%D \endofshapebox
+%D \stoptypen
+%D
+%D When all texts is collected, we can call \type{\reshapebox}
+%D and do something with it's vertical components. We can make
+%D as much passes as needed. When we're done, the box can be
+%D unloaded with \type{\flushshapebox}. The only condition in
+%D this scheme is that \type{\reshapebox} must somehow unload
+%D the \BOX\ \type{\shapebox}.
+%D
+%D An important aspect is that the content is unrolled
+%D bottom||up. The next example illustrates this maybe
+%D unexpected characteristic.
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D \em \input tufte
+%D \endofshapebox
+%D
+%D \newcounter\LineNumber
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \hbox{\llap{\LineNumber\hskip2em}\box\shapebox}}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \haalbuffer
+%D
+%D As we can see, when some kind of numbering is done, we have
+%D to add a second pass.
+%D
+%D \startbuffer
+%D \newcounter\LineNumber
+%D \newcounter\NumberOfLines
+%D
+%D \reshapebox
+%D {\doglobal\increment\NumberOfLines
+%D \box\shapebox}
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \hbox
+%D {\llap{\LineNumber\ (\NumberOfLines)\hskip2em}%
+%D \box\shapebox}%
+%D \doglobal\decrement\NumberOfLines}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \haalbuffer
+%D
+%D This example shows that the content of the box is still
+%D available after flushing. Another feature is that only the
+%D last reshaping counts. Multiple reshaping can be done by:
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D \flushshapebox
+%D \endofshapebox
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \hbox{\llap{$\star$\hskip1em}\box\shapebox}%
+%D \doglobal\decrement\NumberOfLines}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \haalbuffer
+%D
+%D The macros are surprisingly easy to follow and in fact
+%D introduce no new concepts. Nearly all books on \TEX\ show
+%D similar solutions for unwinding \BOXES.
+%D
+%D Some macros, like footnote ones, can be sensitive for
+%D reshaping, which can result in an endless loop. We
+%D therefore offer:
+%D
+%D \starttypen
+%D \ifreshapingbox
+%D \stoptypen
+%D
+%D Some \CONTEXT\ commands are protected this way. Anyhow,
+%D reshaping is aborted after 100 dead cycles.
+%D
+%D By the way, changing the height and depth of \BOX\
+%D \type{\shapebox} results in bad spacing. This means that
+%D for instance linenumbers etc. should be given zero height
+%D and depth before being lapped into the margin. The
+%D previous examples ignore this side effect, but beware!
+
+\newif\ifsomeshapeleft
+\newif\ifreshapingbox
+
+\def\shapesignal {.12345678pt}
+
+\newbox \shapebox
+\newcount \shapepenalty
+\newdimen \shapekern
+\newskip \shapeskip
+
+\newbox\newshapebox
+\newbox\oldshapebox
+
+\newcount\shapecounter
+
+\def\reshapebox#1%
+ {\doreshapebox
+ {#1}
+ {\penalty\shapepenalty}
+ {\kern\shapekern}
+ {\vskip\shapeskip}}
+
+\def\doreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
+ {\setbox\newshapebox=\normalvbox
+ \bgroup
+ \unvcopy\oldshapebox
+ \setbox\newshapebox=\box\voidb@x
+ \shapecounter=0
+ \loop
+ \someshapelefttrue
+ \ifdim\lastskip=\!!zeropoint\relax
+ \ifdim\lastkern=\!!zeropoint\relax
+ \ifnum\lastpenalty=0
+ \setbox\shapebox=\lastbox
+ \ifvoid\shapebox
+ \unskip\unpenalty\unkern
+ \else
+ \ifdim\wd\shapebox=\shapesignal\relax
+ \someshapeleftfalse
+ \else
+ \shapecounter=0
+ \setbox\newshapebox=
+ \normalvbox{#1\unvbox\newshapebox}
+ \fi
+ \fi
+ \else
+ \shapepenalty=\lastpenalty
+ \setbox\newshapebox=
+ \normalvbox{#2\unvbox\newshapebox}
+ \unpenalty
+ \fi
+ \else
+ \shapekern=\lastkern
+ \setbox\newshapebox=
+ \normalvbox{#3\unvbox\newshapebox}
+ \unkern
+ \fi
+ \else
+ \shapeskip=\lastskip
+ \setbox\newshapebox=
+ \normalvbox{#4\unvbox\newshapebox}
+ \unskip
+ \fi
+ \ifnum\shapecounter>100 % can be less
+ \message{<<forced exit from shapebox>>}%
+ \someshapeleftfalse
+ \else
+ \advance\shapecounter by 1
+ \fi
+ \ifsomeshapeleft \repeat
+ \unvbox\newshapebox
+ \egroup}
+
+\def\beginofshapebox%
+ {\setbox\oldshapebox=\normalvbox
+ \bgroup
+ \reshapingboxtrue
+ \hbox to \shapesignal{\hss}}
+
+\def\endofshapebox%
+ {\endgraf
+ \egroup}
+
+\let\beginshapebox=\beginofshapebox
+\let\endshapebox =\endofshapebox
+
+\def\flushshapebox%
+ {\ifdim\ht\newshapebox=\!!zeropoint\relax
+ \else
+ % make \prevdepth legal
+ \par
+ % and take a look
+ \ifdim\prevdepth=\hideskip\relax
+ \prevdepth=\!!zeropoint
+ \fi
+ \ifdim\prevdepth<\!!zeropoint
+ % something like a line or a signal or ...
+ \else
+ \ifinner
+ % not watertight and not ok
+ \else\ifdim\pagegoal=\maxdimen\else
+ % give the previous line a normal depth
+ \vbox to \!!zeropoint{}
+ % go back one line
+ \vskip-\lineheight
+ \fi\fi
+ \fi
+ \unvcopy\newshapebox\relax
+ % \prevdepth=0pt and \dp\newshapebox depend on last line
+ \kern-\dp\newshapebox\relax
+ % now \prevdepth=0pt
+ \fi}
+
+%D For absolute control, one can use \type{\doreshapebox}
+%D directly. This macro takes four arguments, that take care
+%D of:
+%D
+%D \startopsomming[n,opelkaar]
+%D \som \type{\shapebox}
+%D \som \type{\shapepenalty}
+%D \som \type{\shapekern}
+%D \som \type{\shapeskip}
+%D \stopopsomming
+
+%D \macros
+%D {hyphenatedword,
+%D dohyphenateword}
+%D {}
+%D
+%D The next one is a tricky one. \PLAIN\ \TEX\ provides
+%D \type{\showhyphens} for showing macros on the terminal. When
+%D preparing a long list of words we decided to show the
+%D hyphens, but had to find out that the \PLAIN\ alternative
+%D can hardly be used and|/|or adapted to typesetting. The next
+%D two macros do the job and a little more.
+%D
+%D The simple command \type{\hyphenatedword} accepts one
+%D argument and gives the hyphenated word. This macro calls for
+%D
+%D \starttypen
+%D \dohyphenateword {n} {pre} {word}
+%D \stoptypen
+%D
+%D The next examples tell more than lots of words:
+%D
+%D \startbuffer
+%D \dohyphenateword{0} {} {dohyphenatedword}
+%D \dohyphenateword{1} {...} {dohyphenatedword}
+%D \dohyphenateword{2} {...} {dohyphenatedword}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here, \type{\hyphenatedword{dohyphenatedword}} is the
+%D shorter alternative for the first line.
+%D
+%D \startvoorbeeld
+%D \haalbuffer
+%D \stopvoorbeeld
+%D
+%D These macros are slow but effective and not that hard to
+%D program at all.
+
+\def\dohyphenateword#1#2#3%
+ {\bgroup
+ \setbox0=\hbox
+ {\mindermeldingen
+ \widowpenalty=0
+ \clubpenalty=0
+ \setbox0=\vbox
+ {\hsize\!!zeropoint \ #3}%
+ \ifnum#1>0
+ \dorecurse{#1}
+ {\setbox2=\hbox
+ {\vsplit0 to \baselineskip}}%
+ #2%
+ \fi
+ \loop
+ \setbox2=\hbox
+ {\vsplit0 to \baselineskip}%
+ \hbox
+ {\unhbox2
+ \setbox2=\lastbox
+ \vbox
+ {\unvbox2
+ \setbox2=\lastbox
+ \hbox{\unhbox2}}}%
+ \ifdim\ht0>\!!zeropoint
+ \repeat}%
+ \ht0=\ht\strutbox
+ \dp0=\dp\strutbox
+ \box0
+ \egroup}
+
+\def\hyphenatedword%
+ {\dohyphenateword{0}{}}
+
+%D \macros
+%D {doboundtext}
+%D {}
+%D
+%D Sometimes there is not enough room to show the complete
+%D (line of) text. In such a situation we can strip of some
+%D characters by using \type{\doboundtext}. When the text is
+%D wider than the given width, it's split and the third
+%D argument is appended. When the text to be checked is packed
+%D in a command, we'll have to use \type{\expandafter}.
+%D
+%D \starttypen
+%D \doboundtext{a very, probably to long, text}{3cm}{...}
+%D \stoptypen
+%D
+%D When calculating the room needed, we take the width of the
+%D third argument into account, which leads to a bit more
+%D complex macro than needed at first sight.
+
+\def\dodoboundtext#1%
+ {\setbox0=\hbox{\unhcopy0 #1}%
+ \ifdim\wd0>\dimen0
+ \let\dodoboundtext=\gobbleoneargument
+ \else
+ #1\relax
+ \fi}
+
+\def\doboundtext#1#2#3%
+ {\hbox
+ {\setbox0=\hbox{#1}%
+ \dimen0=#2\relax
+ \ifdim\wd0>\dimen0
+ \setbox2=\hbox{#3}%
+ \advance\dimen0 by -\wd2
+ \setbox0=\hbox{}%
+ \processtokens
+ {\dodoboundtext}
+ {\dodoboundtext}
+ {}
+ {\space}
+ {#1}%
+ \box2
+ \else
+ \box0
+ \fi}}
+
+%D \macros
+%D {limitatetext}
+%D {}
+%D
+%D A bit more beautiful alternative for the previous command is
+%D the next one. This command is more robust because we let
+%D \TEX\ do most of the job. The previous command works better
+%D on text that cannot be hyphenated.
+%D
+%D \starttypen
+%D \limitatetext {text} {width} {sentinel}
+%D \stoptypen
+%D
+%D When no width is given, the whole text comes available. The
+%D sentinel is optional.
+
+\def\limitatetext#1#2#3%
+ {\doifelse{#2}{}
+ {#1}
+ {\bgroup
+ \setbox0=\hbox{#1}%
+ \dimen0=#2\relax
+ \ifdim\wd0>\dimen0
+ \setbox2=\hbox{\ #3}%
+ \advance\dimen0 by -\wd2
+ \setbox0=\vbox
+ {\hsize=\dimen0\relax
+ \hfuzz\maxdimen
+ \raggedright
+ \strut\unhbox0}%
+ \vbox % if omitted: missing brace reported
+ {\setbox0=\vsplit0 to \ht\strutbox
+ \unvbox0
+ \setbox0=\lastbox
+ \unhbox0\kern0pt\box2}%
+ \else
+ \unhbox0
+ \fi
+ \egroup}}
+
+%D \macros
+%D {processisolatedwords,betweenisolatedwords}
+%D {}
+%D
+%D References are often made up of one word or a combination
+%D of tightly connected words. The typeset text {\bf
+%D chapter~5} is for instance the results of the character
+%D sequence:
+%D
+%D \starttypen
+%D The typeset text \in{chapter}[texniques] is for instance
+%D \stoptypen
+%D
+%D When such words are made active in interactive texts, the
+%D combination cannot longer be hyphenated. Normally this is no
+%D problem, because \TEX\ tries to prevent hyphenation as best
+%D as can.
+%D
+%D Sometimes however we need a few more words to make things
+%D clear, like when we want to refer to {\bf \TEX\ by Topic}.
+%D The macros that are responsible for typesetting hyperlinks,
+%D take care of such sub||sentences by breaking them up in
+%D words. Long ago we processed words using the space as a
+%D separator, but the more advanced our interactive text became,
+%D the more we needed a robust solution. Well, here it is and
+%D it called as:
+%D
+%D \starttypen
+%D \processisolatedwords{some words}\someaction
+%D \stoptypen
+%D
+%D The second argument \type{someactions} handles the
+%D individual words, like in:
+%D
+%D \startbuffer
+%D \processisolatedwords{some more words} \ruledhbox \par
+%D \processisolatedwords{and some $x + y = z$ math} \ruledhbox \par
+%D \processisolatedwords{and a \hbox{$x + y = z$}} \ruledhbox \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D which let the words turn up as:
+%D
+%D \startvoorbeeld
+%D \haalbuffer
+%D \stopvoorbeeld
+%D
+%D The macro has been made a bit more clever than needed at
+%D first sight. This is due to the fact that we don't want to
+%D generate more overhead in terms of interactive commands than
+%D needed.
+%D
+%D \startbuffer
+%D \processisolatedwords{see this \ruledhskip1em} \ruledhbox
+%D \processisolatedwords{and \ruledhskip1em this one} \ruledhbox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D becomes:
+%D
+%D \startvoorbeeld
+%D \startregels
+%D \haalbuffer
+%D \stopregels
+%D \stopvoorbeeld
+%D
+%D Single word arguments are treated without further
+%D processing. This was needed because this command is used in
+%D the \type{\goto} command, to which we sometimes pass very
+%D strange and|/|or complicated arguments or simply boxes
+%D whose dimensions are to be left intact.
+%D
+%D First we build a \type{\hbox}. This enables us to save the
+%D last skip. Next we fill a \type{\vbox} without hyphenating
+%D words. After we've tested if there is more than one word, we
+%D start processing the individual lines (words). We need some
+%D splitting, packing and unpacking to get the spacing and
+%D dimensions right.
+%D
+%D Normally the isolated words are separated by space, but
+%D one can overrule this separator by changing the next macros.
+
+\def\betweenisolatedwords%
+ {\hskip\fontdimen2\font\!!plus\fontdimen3\font\!!minus\fontdimen4\font}
+
+\def\processisolatedwords#1#2%
+ {\bgroup
+ \mindermeldingen
+ \forgetall
+ \setbox0=\hbox
+ {#1%
+ \xdef\isolatedlastskip{\the\lastskip}}%
+ \setbox2=\vbox
+ {\hyphenpenalty10000
+ \hsize\!!zeropoint
+ \unhcopy0}% == #1
+ \ifdim\ht0=\ht2
+ #2{\unhcopy0}% == #2{#1}
+ \else
+ \setbox0=\hbox
+ {\ignorespaces
+ \loop
+ \setbox4=\hbox
+ {\vsplit2 to \baselineskip}%
+ \hbox
+ {\unhbox4
+ \setbox4=\lastbox
+ \vbox % outer \hbox needed
+ {\unvbox4 % for nested use
+ \setbox4=\lastbox
+ \hbox{#2{\hbox{\unhbox4}}}}}%
+ \ifdim\ht2>\!!zeropoint \betweenisolatedwords \repeat
+ \unskip}%
+ \unhbox0\unskip\hskip\isolatedlastskip
+ \fi
+ \egroup}
+
+%D \macros
+%D {sbox}
+%D {}
+%D
+%D This is a rather strange command. It grabs some box content
+%D and and limits the size to the height and depth of a
+%D \type{\strut}. The resulting bottom||alligned box can be used
+%D aside other ones, without disturbing the normal baseline
+%D distance.
+%D
+%D \startbuffer
+%D \ruledhbox to .5\hsize{\sbox{eerste\par tweede \par derde}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Shows up as:
+%D
+%D \startvoorbeeld
+%D \vskip3\baselineskip
+%D \haalbuffer
+%D \stopvoorbeeld
+%D
+%D Before displaying the result we added some skip, otherwise
+%D the first two lines would have ended up in the text. This
+%D macro can be useful when building complicated menus, headers
+%D and footers and|/|or margin material.
+%D
+%D {\em This macro still needs some improvement.}
+
+\def\sbox% in handleiding, voorbeeld \inlinker{xx} \extern..
+ {\dowithnextbox
+ {\setbox0=\hbox
+ {\strut
+ \dp\nextbox=0pt
+ \lower\strutdepth\box\nextbox}%
+ \dp0=\strutdepth
+ \ht0=\strutheight
+ \box0}%
+ \vbox}
+
+%D \macros
+%D {centeredbox}
+%D {}
+%D
+%D Here is another strange one. This one offers a sort of overlay
+%D with positive or negative offsets. This command can be used
+%D in well defined areas where no offset options are available.
+%D We first used it when building a button inside the margin
+%D footer, where the button should have a horizontal offset and
+%D should be centered with respect to the surrounding box. The
+%D last of the three examples we show below says:
+%D
+%D \starttypen
+%D \vsize=3cm
+%D \hsize=3cm
+%D \ruledvbox to \vsize
+%D {\centeredbox height .5cm width -1cm
+%D {\vrule width \hsize height \vsize}}}
+%D \stoptypen
+%D
+%D Here the \type{\ruledvbox} just shows the surrounding box
+%D and \type{\vrule} is used to show the centered box.
+%D
+%D \def\AnExample#1#2%
+%D {\vsize=3cm
+%D \hsize=3cm
+%D \ruledvbox to \vsize
+%D {\centeredbox height #1 width #2
+%D {\color[groen]{\vrule width \hsize height \vsize}}}}
+%D
+%D \startregelcorrectie
+%D \startcombinatie[3*1]
+%D {\AnExample {-1cm} {.5cm}} {}
+%D {\AnExample {.5cm} {-1cm}} {}
+%D {\AnExample {-1cm} {-.5cm}} {}
+%D \stopcombinatie
+%D \stopregelcorrectie
+%D
+%D This command takes two optional arguments: \type{width} and
+%D \type{height}. Observing readers can see that we use \TEX's
+%D own scanner for grabbing these arguments: \type{#1#} reads
+%D everyting till the next brace and passes it to both rules.
+%D The setting of the box dimensions at the end is needed for
+%D special cases. The dimensions of the surounding box are kept
+%D intact. This commands handles positive and negative
+%D dimensions (which is why we need two boxes with rules).
+
+\def\centeredbox#1#% height +/-dimen width +/-dimen
+ {\bgroup
+ \setbox0=\vbox to \vsize
+ \bgroup
+ \mindermeldingen
+ \forgetall
+ \setbox0=\hbox{\vrule\!!width\!!zeropoint#1}%
+ \setbox2=\vbox{\hrule\!!height\!!zeropoint#1}%
+ \advance\vsize by \ht2
+ \advance\hsize by \wd0
+ \vbox to \vsize
+ \bgroup
+ \vskip-\ht2
+ \vss
+ \hbox to \hsize
+ \bgroup
+ \dowithnextbox
+ {\hskip-\wd0
+ \hss
+ \box\nextbox
+ \hss
+ \egroup
+ \vss
+ \egroup
+ \egroup
+ \wd0=\hsize
+ \ht0=\vsize
+ \box0
+ \egroup}
+ \hbox}
+
+%D \macros
+%D {setrigidcolumnhsize,rigidcolumnbalance}
+%D
+%D These macros are copied from the \TEX book, page~397, and
+%D extended by a macro that sets the \type{\hsize}.
+%D
+%D \starttypen
+%D \setrigidcolumnhsize {total width} {distance} {n}
+%D \rigidcolumnbalance {box} {n}
+%D \stoptypen
+%D
+%D Both these macros are for instance used in typesetting
+%D footnotes.
+%D
+%D Men kan het proces van breken enigzins beinvloeden met de
+%D volgende twee swithes:
+
+\newif\ifalignrigidcolumns
+\newif\ifstretchrigidcolumns
+
+%D De eerste switch bepaald het uitlijnen, de tweede rekt de
+%D individuele kolommen op naar \type{\vsize}.
+
+\def\setrigidcolumnhsize#1#2#3%
+ {\hsize=#1\relax
+ \scratchdimen=-#2\relax
+ \multiply\scratchdimen by #3\relax
+ \advance\scratchdimen by #2\relax
+ \advance\hsize by \scratchdimen
+ \divide\hsize by #3\relax}
+
+\def\rigidcolumnbalance#1#2%
+ {\global\chardef\rigidcolumnbox=#1\relax
+ \global\chardef\rigidcolumns=#2\relax
+ \ifnum\rigidcolumns=1
+ \ifinner\ifhmode\box\else\unvbox\fi\else\unvbox\fi\rigidcolumnbox
+ \else
+ \line
+ {\vbadness=10000
+ \tabskip\!!zeropoint
+ \splittopskip=\ht\strutbox
+ %\scratchdimen=\ht\rigidcolumnbox % sensitive for overflow
+ %\divide\scratchdimen by \rigidcolumns % therefore we need the hack:
+ \scratchdimen=1pt
+ \divide\scratchdimen by \rigidcolumns
+ \expanded{\scratchdimen=\withoutpt{\the\scratchdimen}\ht\rigidcolumnbox}%
+ \advance\scratchdimen by \ht\strutbox
+ \valign{##\vfill\cr\dorigidcolumnsplits}}%
+ \fi}
+
+\def\dorigidcolumnsplits%
+ {\ifnum\rigidcolumns>0
+ \setbox\scratchbox=\vsplit\rigidcolumnbox to \scratchdimen
+ \ifalignrigidcolumns
+ \vbox to \ifstretchrigidcolumns\vsize\else\scratchdimen\fi
+ {\unvbox\scratchbox}%
+ \else
+ \vbox{\unvbox\scratchbox}%
+ \fi
+ \doglobal\decrement\rigidcolumns
+ \cr
+ \ifnum\rigidcolumns>0\noalign{\hfil}\fi
+ \expandafter\dorigidcolumnsplits
+ \fi}
+
+%D \macros
+%D {startvboxtohbox,stopvboxtohbox,convertvboxtohbox}
+%D
+%D Here is another of Knuth's dirty tricks, as presented on
+%D pages 398 and 399 of the \TEX book. These macros can be used
+%D like:
+%D
+%D \starttypen
+%D \vbox
+%D \bgroup
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \egroup
+%D
+%D \vbox
+%D \bgroup
+%D \converthboxtovbox
+%D \egroup
+%D \stoptypen
+%D
+%D These macros are used in reformatting footnotes, so they do
+%D what they're meant for.
+
+\def\setvboxtohbox%
+ {\bgroup
+ \ifdim\baselineskip<16pt \relax
+ \dimen0=\baselineskip
+ \multiply\dimen0 by 1024
+ \else
+ \message{cropping \baselineskip to 16pt}%
+ \baselineskip=\maxdimen
+ \fi
+ \divide\dimen0 by \hsize
+ \multiply\dimen0 by 64
+ \xdef\vboxtohboxfactor{\expandafter\withoutpt\the\dimen0}%
+ \egroup}
+
+\def\startvboxtohbox%
+ {\bgroup
+ \setvboxtohbox
+ \setbox0=\hbox\bgroup}
+
+\def\stopvboxtohbox%
+ {\egroup
+ \dp0=\!!zeropoint
+ \ht0=\vboxtohboxfactor\wd0
+ \box0
+ \egroup}
+
+\def\convertvboxtohbox%
+ {\setvboxtohbox
+ \makehboxofhboxes
+ \setbox0=\hbox{\unhbox0 \removehboxes}%
+ \noindent\unhbox0\par}
+
+\def\makehboxofhboxes%
+ {\setbox0=\hbox{}%
+ \loop
+ \setbox2=\lastbox
+ \ifhbox2
+ \setbox0=\hbox{\box2\unhbox0}%
+ \repeat}
+
+\def\removehboxes%
+ {\setbox0=\lastbox
+ \ifhbox0
+ {\removehboxes}%
+ \unhbox0
+ \fi}
+
+%D \macros
+%D {doifcontent}
+%D
+%D When processing depends on the availability of content, one
+%D can gove the next macro a try.
+%D
+%D \starttypen
+%D \doifcontent{pre content}{post content}{no content}\somebox
+%D \stoptypen
+%D
+%D Where \type{\somebox} is either a \type{\hbox} or
+%D \type{\vbox}. If the dimension of this box suggest some
+%D content, the resulting box is unboxed and surrounded by the
+%D first two arguments, else the third arguments is executed.
+
+\def\doifcontent#1#2#3%
+ {\dowithnextbox
+ {\ifhbox\nextbox
+ \ifdim\wd\nextbox>\!!zeropoint
+ #1\unhbox\nextbox#2\relax
+ \else
+ #3\relax
+ \fi
+ \else
+ \ifdim\ht\nextbox>\!!zeropoint
+ #1\unvbox\nextbox#2\relax
+ \else
+ #3\relax
+ \fi
+ \fi}}
+
+%D So when we say:
+%D
+%D \startbuffer
+%D \doifcontent{[}{]}{}\hbox{content sensitive typesetting}
+%D
+%D \doifcontent{}{\pagina}{}\vbox{content sensitive typesetting}
+%D
+%D \doifcontent{}{}{\message{Didn't you forget something?}}\hbox{}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D We get:
+%D
+%D \haalbuffer
+%D
+%D Where the last call of course does not show up in this
+%D document, but definitely generates a confusing message.
+
+% maybe some day we need this
+%
+% \def\appendvbox#1% % uses \box8
+% {\bgroup
+% \ifdim\prevdepth<\!!zeropoint
+% \ifdim\pagetotal=\!!zeropoint
+% \setbox8=\vtop{\unvcopy#1}%
+% \hrule\c!!height\!!zeropoint
+% \kern-\ht8
+% \box#1\relax
+% \else
+% \box#1\relax
+% \fi
+% \else
+% \dimen0=\prevdepth
+% \hrule\c!!height\!!zeropoint
+% \setbox8=\vtop{\unvcopy#1}%
+% \dimen2=\baselineskip
+% \advance\dimen2 by -\dimen0
+% \advance\dimen2 by -\ht8
+% \kern\dimen2
+% \box#1\relax
+% \fi
+% \egroup}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/supp-fil.tex b/tex/context/base/supp-fil.tex index 74c109e5a..72fde6175 100644 --- a/tex/context/base/supp-fil.tex +++ b/tex/context/base/supp-fil.tex @@ -1,405 +1,405 @@ -%D \module -%D [ file=supp-fil, -%D version=1995.10.10, -%D title=\CONTEXT\ Support Macros, -%D subtitle=Files, -%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. - -%D \TEX\ operates on files, so one wouldn't wonder that there -%D is a separate module for file support. In \CONTEXT\ files -%D are used for several purposes: -%D -%D \startopsomming[opelkaar] -%D \som general textual input -%D \som logging status information -%D \som saving registers, lists and references -%D \som buffering defered textual input -%D \stopopsomming -%D -%D When dealing with files we can load them as a whole, using -%D the \type{\input} primitive or load them on a line||by||line -%D basis, using \type{\read}. Writing is always done line by -%D line, using \type{\write}. - -\writestatus{loading}{Context Support Macros / Files} - -\unprotect - -%D \macros -%D {pushendofline,popendofline} -%D {} -%D -%D When we are loading files in the middle of the typesetting -%D process, for instance when we load references, we have to be -%D sure that the reading process does not generate so called -%D 'spurious spaces'. This can be prevented by assigning the -%D line ending character the \CATCODE\ comment. This is -%D accomplished by -%D -%D \starttypen -%D \pushendofline -%D ... reading ... -%D \popendofline -%D \stoptypen -%D -%D Just to be sure, we save the current meaning of \type{^^M} -%D in \type{\poppedendofline}. - -\def\pushendofline - {\chardef\poppedendofline=\the\catcode`\^^M\relax - \catcode`\^^M=\@@comment\relax} - -\def\popendofline - {\catcode`\^^M=\poppedendofline} - -%D \macros -%D {scratchread, scratchwrite} -%D {} -%D -%D We define a scratch file for reading. Keep in mind that -%D the number of files is limited to~16, so use this one when -%D possible. We also define a scratch output file. - -\newread \scratchread -\newwrite \scratchwrite - -%D \macros -%D {processfile,fileline} -%D -%D The next macro offers a framework for processing files on a -%D line by line basis. -%D -%D \starttypen -%D \processfile \identifier {name} \action -%D \stoptypen -%D -%D The first argument can for instance be \type{\scratchread}. -%D The action must do something with \type{\fileline}, which -%D holds the current line. - -\def\doprocessfile#1#2#3% - {\openin#1=#2\relax - \gdef\doprocessline% - {\ifeof#1% - \gdef\doprocessline{\closein#1}% - \else - \global\read#1 to \fileline - #3\relax - \fi - \doprocessline}% - \doprocessline} - -%D \macros -%D {readfile,ReadFile,maxreadlevel, -%D normalinput} -%D {} -%D -%D One cannot be sure if a file exists. When no file can be -%D found, the \type{\input} primitive gives an error message -%D and switches to interactive mode. The macro \type{\readfile} -%D takes care of non||existing files. This macro has two faces. -%D -%D \starttypen -%D \ReadFile {filename} -%D \readfile {filename} {before loading} {not found} -%D \stoptypen -%D -%D Many \TEX\ implementations have laid out some strategy for -%D locating files. This can lead to unexpected results, -%D especially when one loads files that are not found in the -%D current directory. Let's give an example of this. In -%D \CONTEXT\ illustrations can be defined in an external file. -%D The resizing macro first looks if an illustration is defined -%D in the local definitions file. When no such file is found, -%D it searches for a global file and when this file is not -%D found either, the illustration itself is scanned for -%D dimensions. One can imagine what happens if an adapted, -%D localy stored illustration, is scaled according to -%D dimensions stored somewhere else. -%D -%D When some \TEX\ implementation starts looking for a file, it -%D normally first looks in the current directory. When no file -%D is found, \TEX\ starts searching on the path where format -%D and/or style files are stored. Depending on the implementation -%D this can considerably slow down processing speed. -%D -%D In \CONTEXT, we support a project||wise ordening of files. -%D In such an approach it seems feasible to store common files -%D in a lower directory. When for instance searching for a -%D general layout file, we therefore have to backtrack. -%D -%D These three considerations have lead to a more advanced -%D approach for loading files. -%D -%D We first present an earlier implementation of -%D \type{\readfile}. This command backtracks parent -%D directories, upto a predefined level. Users can change this -%D level, but we default to~3. -%D -%D \starttypen -%D \def\maxreadlevel {3} -%D \stoptypen -%D -%D This is a pseudo \COUNTER. -%D -%D We use \type{\normalinput} instead of \type{\input} -%D because we want to be able to redefine the original -%D \type{\input} when needed, for instance when loading third -%D party libraries. - -\let\normalinput=\input - -\def\maxreadlevel {3} - -\def\doreadfile#1#2#3% - {\immediate\openin\scratchread=#1\relax - \ifeof\scratchread - \immediate\closein\scratchread - \decrement\readlevel - \ifnum\readlevel>0\relax - \doreadfile{\f!parentpath/#1}{#2}{#3}% - \else - #3% - \fi - \else - \immediate\closein\scratchread - #2% - \normalinput #1\relax - \fi} - -\def\readfile#1% - {\let\readlevel=\maxreadlevel - \doreadfile{#1}} - -\def\ReadFile#1% - {\readfile{#1}{}{}} - -%D \macros -%D {readjobfile,readlocfile,readsysfile,readfixfile} -%D {} -%D -%D This implementation honnors the third situation, but we -%D still can get unwanted files loaded and/or can get involved -%D in extensive searching. -%D -%D Due to different needs, we decided to offer four alternative -%D loading commands. With \type{\readjobfile} we load a local -%D file and do no backtracking, while \type{\readlocfile} -%D backtracks~\readlevel\ directories, including the current -%D one. - -\def\readjobfile#1% - {\newcounter\readlevel - \doreadfile{\f!currentpath/#1}} - -\def\readlocfile#1% - {\let\readlevel=\maxreadlevel - \doreadfile{\f!currentpath/#1}} - -%D System files can be anywhere and therefore -%D \type{\readsysfile} is not bound to the current directory -%D and obeys the \TEX\ implementation. - -\def\readsysfile#1% - {\let\readlevel=\maxreadlevel - \doreadfile{#1}} - -%D The last one, \type{\readfixfile} searches on the directory -%D specified and backtracks too. - -\def\readfixfile#1#2% - {\let\readlevel=\maxreadlevel - \doreadfile{#1/#2}} - -%D After having defined this commands, we reconsidered the -%D previously defined \type{\readfile}. This time we more or -%D less impose the search order. - -\def\readfile#1#2#3% - {\readlocfile{#1}{#2} - {\readjobfile{#1}{#2} - {\readsysfile{#1}{#2}{#3}}}} - -%D So now we've got ourselves five file loading commands: -%D -%D \starttypen -%D \readfile {filename} {before loading} {not found} -%D -%D \readjobfile {filename} {before loading} {not found} -%D \readlocfile {filename} {before loading} {not found} -%D \readfixfile {filename} {before loading} {not found} -%D \readsysfile {directory} {filename} {before loading} {not found} -%D \stoptypen - -%D \macros -%D {readjobfile,readlocfile,readsysfile,readfixfile} -%D {} -%D -%D The next four alternatives can be used for opening files -%D for reading on a line||by||line basis. These commands get -%D an extra argument, the filetag. Explicit closing is done -%D in the normal way by \type{\closein}. - -\def\doopenin#1#2% - {\increment\readlevel - \immediate\openin#1=#2\relax - \ifeof#1\relax - \ifnum\readlevel>\maxreadlevel\relax - \else - \immediate\closein#1\relax - \doopenin{#1}{\f!parentpath/#2}% - \fi - \fi} - -\def\openjobin#1#2% - {\newcounter\readlevel - \doopenin{#1}{\f!currentpath/#2}} - -\def\opensysin#1#2% - {\let\readlevel=\maxreadlevel - \doopenin{#1}{#2}} - -\def\openlocin#1#2% - {\let\readlevel=\maxreadlevel - \doopenin{#1}{\f!currentpath/#2}} - -\def\openfixin#1#2#3% - {\let\readlevel=\maxreadlevel - \doopenin{#1}{#2/#3}} - -%D \macros -%D {doiffileelse,doiflocfileelse} -%D {} -%D -%D The next alternative only looks if a file is present. No -%D loading is done. This one obeys the standard \TEX\ -%D implementation method. -%D -%D \starttypen -%D \doiffileelse {filename} {before loading} {not found} -%D \stoptypen -%D -%D We use \type{\next} here, because we want to close the -%D file first. We also provide the local alternative: -%D -%D \starttypen -%D \doiflocfileelse {filename} {before loading} {not found} -%D \stoptypen - -\def\doiffileelse#1#2#3% - {\immediate\openin\scratchread=#1\relax - \ifeof\scratchread - \def\next{#3}% - \else - \def\next{#2}% - \fi - \immediate\closein\scratchread - \next} - -\def\doiflocfileelse#1% - {\doiffileelse{\f!currentpath/#1}} - -%D \macros -%D {doonlyonce, doinputonce} -%D {} -%D -%D Especially macropackages need only be loaded once. -%D Repetitive loading not only costs time, relocating registers -%D often leads to abortion of the processing because \TEX's -%D capacity is limited. One can prevent multiple execution and -%D loading by using one of both: -%D -%D \starttypen -%D \doonlyonce{actions} -%D \doloadonce{filename} -%D \stoptypen -%D -%D This command obeys the standard method for locating files. - -\long\def\doonlyonce#1#2% - {\doifundefined{@@@#1@@@}{\setgvalue{@@@#1@@@}{}#2}} - -\def\doinputonce#1% - {\doonlyonce{#1}{\doiffileelse{#1}{\normalinput #1\relax}{}}} - -%D \macros -%D {doifparentfileelse} -%D {} -%D -%D The test \type{\doifelse{\jobname}{filename}} does not give -%D the desired result, simply because \type{\jobname} expands -%D to characters with \CATCODE~12, while the characters in -%D \type{filename} have \CATCODE~11. So we can better use: -%D -%D \starttypen -%D \doifparentfileelse{filename}{yes}{no} -%D \stoptypen - -\def\doifparentfileelse#1#2#3% - {\edef\!!stringa{#1}% - \@EA\convertargument\!!stringa\to\!!stringa - \@EA\def\@EA\!!stringb\@EA{\jobname}% - \ifx\!!stringa\!!stringb#2\else#3\fi} - -% \newcounter\readingfilelevel -% -% \def\startreadingfile% -% {\ifnum\readingfilelevel=0 -% \edef\doreadingfilecharacters% -% {\catcode`"=\the\catcode`"\relax -% \catcode`<=\the\catcode`<\relax -% \catcode`>=\the\catcode`>\relax}% -% \catcode`"=\@@other -% \catcode`<=\@@other -% \catcode`>=\@@other -% \let\stopreadingfile=\dostopreadingfile -% \fi -% \increment\readingfilelevel} -% -% \def\dostopreadingfile% -% {\ifnum\readingfilelevel=1 -% \doreadingfilecharacters -% \fi -% \decrement\readingfilelevel} - -\def\normalless {<} % geen \let ! -\def\normalmore {>} % geen \let ! -\def\normalequal{=} % geen \let ! - -\newcounter\readingfilelevel - -\def\popfilecharacter#1#2% - {\ifnum\catcode`#1=\@@other \ifnum#2=\@@other \else - \message{[popping catcode #1 to #2]}% - \catcode`#1=#2\relax - \fi \fi} - -\def\pushfilecharacter#1% - {\ifnum\catcode`#1=\@@other \else - \message{[pushing catcode #1 from \the\catcode`#1]}% - \catcode`#1=\@@other - \fi} - -\def\startreadingfile% - {\doglobal\increment\readingfilelevel - \setxvalue{popfilecharacters::\readingfilelevel}% - {\noexpand\popfilecharacter{"}{\the\catcode`"}% - \noexpand\popfilecharacter{<}{\the\catcode`<}% - \noexpand\popfilecharacter{>}{\the\catcode`>}}% - \pushfilecharacter{"}% - \pushfilecharacter{<}% - \pushfilecharacter{>}} - -\def\stopreadingfile% - {\getvalue{popfilecharacters::\readingfilelevel}% - \doglobal\decrement\readingfilelevel} - -\protect - -\endinput +%D \module
+%D [ file=supp-fil,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Files,
+%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.
+
+%D \TEX\ operates on files, so one wouldn't wonder that there
+%D is a separate module for file support. In \CONTEXT\ files
+%D are used for several purposes:
+%D
+%D \startopsomming[opelkaar]
+%D \som general textual input
+%D \som logging status information
+%D \som saving registers, lists and references
+%D \som buffering defered textual input
+%D \stopopsomming
+%D
+%D When dealing with files we can load them as a whole, using
+%D the \type{\input} primitive or load them on a line||by||line
+%D basis, using \type{\read}. Writing is always done line by
+%D line, using \type{\write}.
+
+\writestatus{loading}{Context Support Macros / Files}
+
+\unprotect
+
+%D \macros
+%D {pushendofline,popendofline}
+%D {}
+%D
+%D When we are loading files in the middle of the typesetting
+%D process, for instance when we load references, we have to be
+%D sure that the reading process does not generate so called
+%D 'spurious spaces'. This can be prevented by assigning the
+%D line ending character the \CATCODE\ comment. This is
+%D accomplished by
+%D
+%D \starttypen
+%D \pushendofline
+%D ... reading ...
+%D \popendofline
+%D \stoptypen
+%D
+%D Just to be sure, we save the current meaning of \type{^^M}
+%D in \type{\poppedendofline}.
+
+\def\pushendofline
+ {\chardef\poppedendofline=\the\catcode`\^^M\relax
+ \catcode`\^^M=\@@comment\relax}
+
+\def\popendofline
+ {\catcode`\^^M=\poppedendofline}
+
+%D \macros
+%D {scratchread, scratchwrite}
+%D {}
+%D
+%D We define a scratch file for reading. Keep in mind that
+%D the number of files is limited to~16, so use this one when
+%D possible. We also define a scratch output file.
+
+\newread \scratchread
+\newwrite \scratchwrite
+
+%D \macros
+%D {processfile,fileline}
+%D
+%D The next macro offers a framework for processing files on a
+%D line by line basis.
+%D
+%D \starttypen
+%D \processfile \identifier {name} \action
+%D \stoptypen
+%D
+%D The first argument can for instance be \type{\scratchread}.
+%D The action must do something with \type{\fileline}, which
+%D holds the current line.
+
+\def\doprocessfile#1#2#3%
+ {\openin#1=#2\relax
+ \gdef\doprocessline%
+ {\ifeof#1%
+ \gdef\doprocessline{\closein#1}%
+ \else
+ \global\read#1 to \fileline
+ #3\relax
+ \fi
+ \doprocessline}%
+ \doprocessline}
+
+%D \macros
+%D {readfile,ReadFile,maxreadlevel,
+%D normalinput}
+%D {}
+%D
+%D One cannot be sure if a file exists. When no file can be
+%D found, the \type{\input} primitive gives an error message
+%D and switches to interactive mode. The macro \type{\readfile}
+%D takes care of non||existing files. This macro has two faces.
+%D
+%D \starttypen
+%D \ReadFile {filename}
+%D \readfile {filename} {before loading} {not found}
+%D \stoptypen
+%D
+%D Many \TEX\ implementations have laid out some strategy for
+%D locating files. This can lead to unexpected results,
+%D especially when one loads files that are not found in the
+%D current directory. Let's give an example of this. In
+%D \CONTEXT\ illustrations can be defined in an external file.
+%D The resizing macro first looks if an illustration is defined
+%D in the local definitions file. When no such file is found,
+%D it searches for a global file and when this file is not
+%D found either, the illustration itself is scanned for
+%D dimensions. One can imagine what happens if an adapted,
+%D localy stored illustration, is scaled according to
+%D dimensions stored somewhere else.
+%D
+%D When some \TEX\ implementation starts looking for a file, it
+%D normally first looks in the current directory. When no file
+%D is found, \TEX\ starts searching on the path where format
+%D and/or style files are stored. Depending on the implementation
+%D this can considerably slow down processing speed.
+%D
+%D In \CONTEXT, we support a project||wise ordening of files.
+%D In such an approach it seems feasible to store common files
+%D in a lower directory. When for instance searching for a
+%D general layout file, we therefore have to backtrack.
+%D
+%D These three considerations have lead to a more advanced
+%D approach for loading files.
+%D
+%D We first present an earlier implementation of
+%D \type{\readfile}. This command backtracks parent
+%D directories, upto a predefined level. Users can change this
+%D level, but we default to~3.
+%D
+%D \starttypen
+%D \def\maxreadlevel {3}
+%D \stoptypen
+%D
+%D This is a pseudo \COUNTER.
+%D
+%D We use \type{\normalinput} instead of \type{\input}
+%D because we want to be able to redefine the original
+%D \type{\input} when needed, for instance when loading third
+%D party libraries.
+
+\let\normalinput=\input
+
+\def\maxreadlevel {3}
+
+\def\doreadfile#1#2#3%
+ {\immediate\openin\scratchread=#1\relax
+ \ifeof\scratchread
+ \immediate\closein\scratchread
+ \decrement\readlevel
+ \ifnum\readlevel>0\relax
+ \doreadfile{\f!parentpath/#1}{#2}{#3}%
+ \else
+ #3%
+ \fi
+ \else
+ \immediate\closein\scratchread
+ #2%
+ \normalinput #1\relax
+ \fi}
+
+\def\readfile#1%
+ {\let\readlevel=\maxreadlevel
+ \doreadfile{#1}}
+
+\def\ReadFile#1%
+ {\readfile{#1}{}{}}
+
+%D \macros
+%D {readjobfile,readlocfile,readsysfile,readfixfile}
+%D {}
+%D
+%D This implementation honnors the third situation, but we
+%D still can get unwanted files loaded and/or can get involved
+%D in extensive searching.
+%D
+%D Due to different needs, we decided to offer four alternative
+%D loading commands. With \type{\readjobfile} we load a local
+%D file and do no backtracking, while \type{\readlocfile}
+%D backtracks~\readlevel\ directories, including the current
+%D one.
+
+\def\readjobfile#1%
+ {\newcounter\readlevel
+ \doreadfile{\f!currentpath/#1}}
+
+\def\readlocfile#1%
+ {\let\readlevel=\maxreadlevel
+ \doreadfile{\f!currentpath/#1}}
+
+%D System files can be anywhere and therefore
+%D \type{\readsysfile} is not bound to the current directory
+%D and obeys the \TEX\ implementation.
+
+\def\readsysfile#1%
+ {\let\readlevel=\maxreadlevel
+ \doreadfile{#1}}
+
+%D The last one, \type{\readfixfile} searches on the directory
+%D specified and backtracks too.
+
+\def\readfixfile#1#2%
+ {\let\readlevel=\maxreadlevel
+ \doreadfile{#1/#2}}
+
+%D After having defined this commands, we reconsidered the
+%D previously defined \type{\readfile}. This time we more or
+%D less impose the search order.
+
+\def\readfile#1#2#3%
+ {\readlocfile{#1}{#2}
+ {\readjobfile{#1}{#2}
+ {\readsysfile{#1}{#2}{#3}}}}
+
+%D So now we've got ourselves five file loading commands:
+%D
+%D \starttypen
+%D \readfile {filename} {before loading} {not found}
+%D
+%D \readjobfile {filename} {before loading} {not found}
+%D \readlocfile {filename} {before loading} {not found}
+%D \readfixfile {filename} {before loading} {not found}
+%D \readsysfile {directory} {filename} {before loading} {not found}
+%D \stoptypen
+
+%D \macros
+%D {readjobfile,readlocfile,readsysfile,readfixfile}
+%D {}
+%D
+%D The next four alternatives can be used for opening files
+%D for reading on a line||by||line basis. These commands get
+%D an extra argument, the filetag. Explicit closing is done
+%D in the normal way by \type{\closein}.
+
+\def\doopenin#1#2%
+ {\increment\readlevel
+ \immediate\openin#1=#2\relax
+ \ifeof#1\relax
+ \ifnum\readlevel>\maxreadlevel\relax
+ \else
+ \immediate\closein#1\relax
+ \doopenin{#1}{\f!parentpath/#2}%
+ \fi
+ \fi}
+
+\def\openjobin#1#2%
+ {\newcounter\readlevel
+ \doopenin{#1}{\f!currentpath/#2}}
+
+\def\opensysin#1#2%
+ {\let\readlevel=\maxreadlevel
+ \doopenin{#1}{#2}}
+
+\def\openlocin#1#2%
+ {\let\readlevel=\maxreadlevel
+ \doopenin{#1}{\f!currentpath/#2}}
+
+\def\openfixin#1#2#3%
+ {\let\readlevel=\maxreadlevel
+ \doopenin{#1}{#2/#3}}
+
+%D \macros
+%D {doiffileelse,doiflocfileelse}
+%D {}
+%D
+%D The next alternative only looks if a file is present. No
+%D loading is done. This one obeys the standard \TEX\
+%D implementation method.
+%D
+%D \starttypen
+%D \doiffileelse {filename} {before loading} {not found}
+%D \stoptypen
+%D
+%D We use \type{\next} here, because we want to close the
+%D file first. We also provide the local alternative:
+%D
+%D \starttypen
+%D \doiflocfileelse {filename} {before loading} {not found}
+%D \stoptypen
+
+\def\doiffileelse#1#2#3%
+ {\immediate\openin\scratchread=#1\relax
+ \ifeof\scratchread
+ \def\next{#3}%
+ \else
+ \def\next{#2}%
+ \fi
+ \immediate\closein\scratchread
+ \next}
+
+\def\doiflocfileelse#1%
+ {\doiffileelse{\f!currentpath/#1}}
+
+%D \macros
+%D {doonlyonce, doinputonce}
+%D {}
+%D
+%D Especially macropackages need only be loaded once.
+%D Repetitive loading not only costs time, relocating registers
+%D often leads to abortion of the processing because \TEX's
+%D capacity is limited. One can prevent multiple execution and
+%D loading by using one of both:
+%D
+%D \starttypen
+%D \doonlyonce{actions}
+%D \doloadonce{filename}
+%D \stoptypen
+%D
+%D This command obeys the standard method for locating files.
+
+\long\def\doonlyonce#1#2%
+ {\doifundefined{@@@#1@@@}{\setgvalue{@@@#1@@@}{}#2}}
+
+\def\doinputonce#1%
+ {\doonlyonce{#1}{\doiffileelse{#1}{\normalinput #1\relax}{}}}
+
+%D \macros
+%D {doifparentfileelse}
+%D {}
+%D
+%D The test \type{\doifelse{\jobname}{filename}} does not give
+%D the desired result, simply because \type{\jobname} expands
+%D to characters with \CATCODE~12, while the characters in
+%D \type{filename} have \CATCODE~11. So we can better use:
+%D
+%D \starttypen
+%D \doifparentfileelse{filename}{yes}{no}
+%D \stoptypen
+
+\def\doifparentfileelse#1#2#3%
+ {\edef\!!stringa{#1}%
+ \@EA\convertargument\!!stringa\to\!!stringa
+ \@EA\def\@EA\!!stringb\@EA{\jobname}%
+ \ifx\!!stringa\!!stringb#2\else#3\fi}
+
+% \newcounter\readingfilelevel
+%
+% \def\startreadingfile%
+% {\ifnum\readingfilelevel=0
+% \edef\doreadingfilecharacters%
+% {\catcode`"=\the\catcode`"\relax
+% \catcode`<=\the\catcode`<\relax
+% \catcode`>=\the\catcode`>\relax}%
+% \catcode`"=\@@other
+% \catcode`<=\@@other
+% \catcode`>=\@@other
+% \let\stopreadingfile=\dostopreadingfile
+% \fi
+% \increment\readingfilelevel}
+%
+% \def\dostopreadingfile%
+% {\ifnum\readingfilelevel=1
+% \doreadingfilecharacters
+% \fi
+% \decrement\readingfilelevel}
+
+\def\normalless {<} % geen \let !
+\def\normalmore {>} % geen \let !
+\def\normalequal{=} % geen \let !
+
+\newcounter\readingfilelevel
+
+\def\popfilecharacter#1#2%
+ {\ifnum\catcode`#1=\@@other \ifnum#2=\@@other \else
+ \message{[popping catcode #1 to #2]}%
+ \catcode`#1=#2\relax
+ \fi \fi}
+
+\def\pushfilecharacter#1%
+ {\ifnum\catcode`#1=\@@other \else
+ \message{[pushing catcode #1 from \the\catcode`#1]}%
+ \catcode`#1=\@@other
+ \fi}
+
+\def\startreadingfile%
+ {\doglobal\increment\readingfilelevel
+ \setxvalue{popfilecharacters::\readingfilelevel}%
+ {\noexpand\popfilecharacter{"}{\the\catcode`"}%
+ \noexpand\popfilecharacter{<}{\the\catcode`<}%
+ \noexpand\popfilecharacter{>}{\the\catcode`>}}%
+ \pushfilecharacter{"}%
+ \pushfilecharacter{<}%
+ \pushfilecharacter{>}}
+
+\def\stopreadingfile%
+ {\getvalue{popfilecharacters::\readingfilelevel}%
+ \doglobal\decrement\readingfilelevel}
+
+\protect
+
+\endinput
diff --git a/tex/context/base/supp-fun.tex b/tex/context/base/supp-fun.tex index d2f3b92a8..a5a49732e 100644 --- a/tex/context/base/supp-fun.tex +++ b/tex/context/base/supp-fun.tex @@ -1,428 +1,428 @@ -%D \module -%D [ file=supp-fun, -%D version=1995.10.10, -%D title=\CONTEXT\ Support Macros, -%D subtitle=Fun Stuff, -%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. - -\unprotect - -%D This module implements some typographics tricks that can -%D be fun when designing document layouts. The examples use -%D macros that are typical to \CONTEXT, but non \CONTEXT\ -%D users can use the drop caps and first line treatment -%D macros without problems. This module will be extended -%D when the need for more of such tricks arises. - -\ifx \undefined \writestatus \input supp-mis.tex \relax \fi - -\writestatus{loading}{Context Support Macros / Fun Stuff} - -%D \macros -%D {DroppedCaps} -%D -%D \startbuffer -%D \DroppedCaps -%D {\color[green]} {cmbx12} {2.2\baselineskip} {2pt} {\baselineskip} {2} -%D Let's start -%D \stopbuffer -%D -%D \haalbuffer with dropped caps, those blown up first -%D characters of a paragraph. It's hard to implement a general -%D mechanism that suits all situations, but dropped caps are so -%D seldomly used that we can permit ourselves a rather user -%D unfriendly implementation. -%D -%D \typebuffer -%D -%D As we will see, there are 7 different settings involved. The -%D first argument takes a command that is used to do whatever -%D fancy things we want to do, but normally this one will be -%D empty. The second argument takes the font. Because we're -%D dealing with something very typographic, there is no real -%D reason to adopt complicated font switching schemes, a mere -%D name will do. Font encodings can bring no harm, because the -%D alphanumeric characters are nearly always located at their -%D natural position in the encoding vector. -%D -%D \startbuffer -%D \DroppedCaps -%D {\color[red]} {cmbx12} {\baselineskip} {0pt} {0pt} {1} -%D This simple -%D \stopbuffer -%D -%D \haalbuffer case shows us what happens when we apply minimal -%D values. Here we used: -%D -%D \typebuffer -%D -%D \startbuffer -%D \DroppedCaps -%D {\color[red]} {cmbx12} {2\baselineskip} {0pt} {\baselineskip} {2} -%D In this ugly -%D \stopbuffer -%D -%D \haalbuffer example the third argument tells -%D this macro that we want a dropped capital scaled to the -%D baseline distance. The two zero point arguments are the -%D horizontal and vertical offsets and the last arguments -%D determines the hanging indentation. In this paragraph we -%D set the height to two times the baselinedistance and use -%D two hanging lines: -%D -%D \typebuffer -%D -%D Here, the first character is moved down one baseline. Here -%D we also see why the horizontal offset is important. The -%D first example (showing the~L) sets this to a few points and -%D also used a slightly larger height. -%D -%D Of course common users (typist) are not supposed to see this -%D kind of fuzzy definitions, but fortunately \TEX\ permits us -%D to hide them in macros. Using a macro also enables us to -%D garantee consistency throughout the document: -%D -%D \startbuffer -%D \def\MyDroppedCaps% -%D {\DroppedCaps -%D {\color[green]} {cmbx12} {5\baselineskip} {3pt} {3\baselineskip} {4}} -%D -%D \MyDroppedCaps The implementation -%D \stopbuffer -%D -%D \typebuffer -%D -%D \haalbuffer of the general macro is rather simple and only -%D depends on the arguments given and the dimensions of the -%D strut box. We explicitly load the font, which is no problem -%D because \TEX\ does not load a font twice. We could have -%D combined some arguments, like the height, vertical offset -%D and the number of lines, but the current implementation -%D proved to be the most flexible. One should be aware of the -%D fact that the offsets depend on the design of the glyphs -%D used. - -\def\DroppedCaps#1#2#3#4#5#6#7% - {\par - \vskip#6\baselineskip - \penalty-200 - \vskip-#6\baselineskip - \setbox0=\hbox - {\font\temp=#2 at #3% - \temp#1{#7}\hskip#4}% - \setbox0=\hbox - {\lower#5\box0}% - \ht0=\ht\strutbox - \dp0=\dp\strutbox - \hangindent\wd0 - \hangafter-#6% - \noindent - \hskip-\wd0 - \vbox{\box0}% - \nobreak} - -%D Before we go to the next topic, we summarize this command: -%D -%D \starttypen -%D \DroppedCaps {command} {font} {height} {hoffset} {voffset} {lines} -%D \stoptypen - -%D \macros -%D {TreatFirstLine} -%D -%D \startbuffer -%D \TreatFirstLine {\sc} {} {} {} -%D Instead of limiting its action to one token, the next macro -%D treats the whole first line. This paragraph was typeset by -%D saying: -%D \stopbuffer -%D -%D \haalbuffer -%D -%D \typebuffer -%D -%D \startbuffer -%D \TreatFirstLine {\startcolor[red]\bf} {\stopcolor} {} {} -%D The combined color and font effect is also possible, -%D although one must be careful in using macros that accumulate -%D grouping, but the commands used here are pretty save in that -%D respect. -%D \stopbuffer -%D -%D \haalbuffer -%D -%D \typebuffer -%D -%D Before we explain the third and fourth argument, we show the -%D implementation. Those who know a bit about the way \TEX\ treats -%D tokens, will probably see in one glance that this -%D alternative works all right for most text||only situations -%D in which there is enough text available for the first line, -%D but that more complicated things will blow. One has to live -%D with that. - -\def\TreatFirstLine#1#2#3#4% before, after, first, next - {\leavevmode - \bgroup - \forgetall - \bgroup - #1% - \setbox0=\box\voidb@x - \setbox2=\box\voidb@x - \def\grabfirstline##1 % - {\setbox2=\hbox - {\ifvoid0 - {#3{\ignorespaces##1}}% - \else - \unhcopy0\ {#4{##1}}% - \fi}% - \ifdim\wd2=\!!zeropoint - \setbox0=\box\voidb@x - \setbox2=\box\voidb@x - \let\next=\grabfirstline - \else\ifdim\wd2>\hsize - \hbox to \hsize{\strut\unhbox0}#2\egroup - \break##1\ - \egroup - \let\next=\relax - \else - \setbox0=\box2 - \let\next=\grabfirstline - \fi\fi - \next}% - \grabfirstline} - -%D \startbuffer -%D \gdef\FunnyCommand -%D {\getrandomfloat\FunnyR{0}{1}% -%D \getrandomfloat\FunnyG{0}{1}% -%D \getrandomfloat\FunnyB{0}{1}% -%D \definecolor[FunnyColor][r=\FunnyR,g=\FunnyG,b=\FunnyB]% -%D \color[FunnyColor]} -%D -%D \TreatFirstLine {\bf} {} {\FunnyCommand} {\FunnyCommand} -%D The third and fourth argument can be used to gain special effects on -%D the individual words. Of course one needs to know -%D \stopbuffer -%D -%D \haalbuffer -%D a bit more about the macro package used to get real nice effects, -%D but this example probably demonstrates the principles well. -%D -%D \typebuffer -%D -%D Like in dropped caps case, one can hide such treatments in a -%D macro, like: -%D -%D \starttypen -%D \def\MyTreatFirstLine% -%D {\TreatFirstLine {\bf} {} {\FunnyCommand} {\FunnyCommand}} -%D \stoptypen - -%D \macros -%D {reshapebox} -%D -%D \startbuffer -%D \beginofshapebox -%D When using \CONTEXT, one can also apply this funny command to whole lines -%D by using the reshape mechanism. Describing this interesting mechanism falls -%D outside the scope of this module, so we only show the trick. This is an -%D example of low level \CONTEXT\ functionality: it's all there, and it's -%D stable, but not entirely meant for novice users. -%D \endofshapebox -%D -%D \reshapebox{\FunnyCommand{\box\shapebox}} \flushshapebox -%D \stopbuffer -%D -%D \haalbuffer -%D -%D \typebuffer -%D -%D This mechanism permits hyphenation and therefore gives -%D better results than the previously discussed macro -%D \type{\TreatFirstLine}. - -%D \macros -%D {TreatFirstCharacter} -%D -%D \startbuffer -%D \TreatFirstCharacter {\bf\color[green]} Just to be -%D \stopbuffer -%D -%D \haalbuffer complete we also offer a very simple one -%D character alternative, that is not that hard to understand: - -\def\TreatFirstCharacter#1#2% command, character - {{#1{#2}}} - -%D A previous paragraph started with: -%D -%D \typebuffer - -%D \macros -%D {StackCharacters} -%D -%D The next hack deals with vertical stacking. - -\def\StackCharacters#1#2#3#4% sequence vsize vskip command - {\vbox #2 - {\forgetall - \baselineskip0pt - \def\StackCharacter##1{#4{##1}\cr\noalign{#3}}% - \halign{\hss##\hss&##\cr\handletokens#1\with\StackCharacter\cr}}} - -%D \startbuffer -%D \StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand} -%D \stopbuffer -%D -%D Such a stack looks like: -%D -%D \startregelcorrectie -%D \hbox to \hsize -%D {$\hss\bfd -%D \vcenter{\StackCharacters{TEX} {}{\vskip.2ex}{\FunnyCommand}}% -%D \hss -%D \vcenter{\StackCharacters{CON} {}{\vskip.2ex}{\FunnyCommand}} -%D \hss -%D \vcenter{\StackCharacters{TEXT} {}{\vskip.2ex}{\FunnyCommand}} -%D \hss -%D \vcenter{\StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}} -%D \hss$} -%D \stopregelcorrectie -%D -%D and is typeset by saying: -%D -%D \typebuffer -%D -%D An alternative would have been -%D -%D \starttypen -%D \StackCharacters{CONTEXT}{to 5cm}{\vfill}{\FunnyCommand} -%D \stoptypen - -%D \macros -%D {processtokens} -%D -%D At a lower level horizontal and vertical manipulations are -%D already supported by: -%D -%D \starttypen -%D \processtokens {begin} {between} {end} {space} {text} -%D \stoptypen -%D -%D \startbuffer[a] -%D \processtokens -%D {\hbox to .5\hsize\bgroup} {\hfill} {\egroup} -%D {\space} {LET'S HAVE} -%D \stopbuffer -%D -%D \startbuffer[b] -%D \processtokens -%D {\vbox\bgroup\raggedcenter\hsize1em} {\vskip.25ex} {\egroup} -%D {\strut} {FUN} -%D \stopbuffer -%D -%D This macro is able to typeset: -%D -%D \leavevmode\hbox to \hsize -%D {$\hfil\hfil -%D \vcenter{\bf\haalbuffer[a]}% -%D \hfil -%D \vcenter{\bfd\haalbuffer[b]}% -%D \hfil\hfil$} -%D -%D which was specified as: -%D -%D \typebuffer[a] -%D \typebuffer[b] - -%D \macros -%D {NormalizeFontHeight, NormalizeFontWidth} -%D -%D Next we introduce some font manipulation macros. When we -%D want to typeset some text spread in a well defined area, it -%D can be considered bad practice to manipulate character and -%D word spacing. In such situations the next few macros can be -%D of help: -%D -%D \starttypen -%D \NormalizeFontHeight \name {sample text} {height} {font} -%D \NormalizeFontWidth \name {sample text} {width} {font} -%D \stoptypen -%D -%D These are implemented using an auxilliary macro: - -\def\NormalizeFontHeight% - {\NormalizeFontSize\ht} - -\def\NormalizeFontWidth% - {\NormalizeFontSize\wd} - -\def\NormalizeFontSize#1#2#3#4#5% - {\setbox0=\hbox{\font\temp=#5 at 10pt\temp#3}% - \dimen0=#10 - \dimen2=10000pt - \divide\dimen2 by \dimen0 - \dimen4=#4 - \divide\dimen4 by 1000 - \dimen4=\number\dimen2\dimen4 - \edef\NormalizedFontSize{\the\dimen4}% - \font#2=#5 at \NormalizedFontSize} - -%D Consider for instance: -%D -%D \startbuffer -%D \NormalizeFontHeight \temp {X} {2\baselineskip} {cmr10} -%D -%D {\temp To Be Or Not To Be} -%D \stopbuffer -%D -%D \typebuffer -%D -%D This shows up as (we also show the baselines): -%D -%D {\showbaselines\haalbuffer} -%D -%D The horizontal counterpart is: -%D -%D \startbuffer -%D \NormalizeFontWidth \temp {This Sentence Fits} {\hsize} {cmr10} -%D -%D \hbox{\temp This Sentence Fits} -%D \stopbuffer -%D -%D \typebuffer -%D -%D \startregelcorrectie -%D \ruledhbox{\haalbuffer} -%D \stopregelcorrectie -%D -%D The calculated font scale is avaliable in the macro -%D \type{\NormalizedFontSize}. -%D -%D One can of course combine these macros with the ones -%D described earlier, like in: -%D -%D \starttypen -%D \NormalizeFontHeight \NicelyDroppedFont {X} {2\baselineskip} {cmbx12} -%D -%D \def\NicelyDroppedCaps% -%D {\DroppedCaps -%D {\kleur[groen]} -%D {\NicelyDroppedFont} -%D {2pt} -%D {\baselineskip} -%D {2}} -%D \stoptypen -%D -%D It's up to the reader to test this one. - -\protect - -\endinput +%D \module
+%D [ file=supp-fun,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Fun Stuff,
+%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.
+
+\unprotect
+
+%D This module implements some typographics tricks that can
+%D be fun when designing document layouts. The examples use
+%D macros that are typical to \CONTEXT, but non \CONTEXT\
+%D users can use the drop caps and first line treatment
+%D macros without problems. This module will be extended
+%D when the need for more of such tricks arises.
+
+\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+
+\writestatus{loading}{Context Support Macros / Fun Stuff}
+
+%D \macros
+%D {DroppedCaps}
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D {\color[green]} {cmbx12} {2.2\baselineskip} {2pt} {\baselineskip} {2}
+%D Let's start
+%D \stopbuffer
+%D
+%D \haalbuffer with dropped caps, those blown up first
+%D characters of a paragraph. It's hard to implement a general
+%D mechanism that suits all situations, but dropped caps are so
+%D seldomly used that we can permit ourselves a rather user
+%D unfriendly implementation.
+%D
+%D \typebuffer
+%D
+%D As we will see, there are 7 different settings involved. The
+%D first argument takes a command that is used to do whatever
+%D fancy things we want to do, but normally this one will be
+%D empty. The second argument takes the font. Because we're
+%D dealing with something very typographic, there is no real
+%D reason to adopt complicated font switching schemes, a mere
+%D name will do. Font encodings can bring no harm, because the
+%D alphanumeric characters are nearly always located at their
+%D natural position in the encoding vector.
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D {\color[red]} {cmbx12} {\baselineskip} {0pt} {0pt} {1}
+%D This simple
+%D \stopbuffer
+%D
+%D \haalbuffer case shows us what happens when we apply minimal
+%D values. Here we used:
+%D
+%D \typebuffer
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D {\color[red]} {cmbx12} {2\baselineskip} {0pt} {\baselineskip} {2}
+%D In this ugly
+%D \stopbuffer
+%D
+%D \haalbuffer example the third argument tells
+%D this macro that we want a dropped capital scaled to the
+%D baseline distance. The two zero point arguments are the
+%D horizontal and vertical offsets and the last arguments
+%D determines the hanging indentation. In this paragraph we
+%D set the height to two times the baselinedistance and use
+%D two hanging lines:
+%D
+%D \typebuffer
+%D
+%D Here, the first character is moved down one baseline. Here
+%D we also see why the horizontal offset is important. The
+%D first example (showing the~L) sets this to a few points and
+%D also used a slightly larger height.
+%D
+%D Of course common users (typist) are not supposed to see this
+%D kind of fuzzy definitions, but fortunately \TEX\ permits us
+%D to hide them in macros. Using a macro also enables us to
+%D garantee consistency throughout the document:
+%D
+%D \startbuffer
+%D \def\MyDroppedCaps%
+%D {\DroppedCaps
+%D {\color[green]} {cmbx12} {5\baselineskip} {3pt} {3\baselineskip} {4}}
+%D
+%D \MyDroppedCaps The implementation
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \haalbuffer of the general macro is rather simple and only
+%D depends on the arguments given and the dimensions of the
+%D strut box. We explicitly load the font, which is no problem
+%D because \TEX\ does not load a font twice. We could have
+%D combined some arguments, like the height, vertical offset
+%D and the number of lines, but the current implementation
+%D proved to be the most flexible. One should be aware of the
+%D fact that the offsets depend on the design of the glyphs
+%D used.
+
+\def\DroppedCaps#1#2#3#4#5#6#7%
+ {\par
+ \vskip#6\baselineskip
+ \penalty-200
+ \vskip-#6\baselineskip
+ \setbox0=\hbox
+ {\font\temp=#2 at #3%
+ \temp#1{#7}\hskip#4}%
+ \setbox0=\hbox
+ {\lower#5\box0}%
+ \ht0=\ht\strutbox
+ \dp0=\dp\strutbox
+ \hangindent\wd0
+ \hangafter-#6%
+ \noindent
+ \hskip-\wd0
+ \vbox{\box0}%
+ \nobreak}
+
+%D Before we go to the next topic, we summarize this command:
+%D
+%D \starttypen
+%D \DroppedCaps {command} {font} {height} {hoffset} {voffset} {lines}
+%D \stoptypen
+
+%D \macros
+%D {TreatFirstLine}
+%D
+%D \startbuffer
+%D \TreatFirstLine {\sc} {} {} {}
+%D Instead of limiting its action to one token, the next macro
+%D treats the whole first line. This paragraph was typeset by
+%D saying:
+%D \stopbuffer
+%D
+%D \haalbuffer
+%D
+%D \typebuffer
+%D
+%D \startbuffer
+%D \TreatFirstLine {\startcolor[red]\bf} {\stopcolor} {} {}
+%D The combined color and font effect is also possible,
+%D although one must be careful in using macros that accumulate
+%D grouping, but the commands used here are pretty save in that
+%D respect.
+%D \stopbuffer
+%D
+%D \haalbuffer
+%D
+%D \typebuffer
+%D
+%D Before we explain the third and fourth argument, we show the
+%D implementation. Those who know a bit about the way \TEX\ treats
+%D tokens, will probably see in one glance that this
+%D alternative works all right for most text||only situations
+%D in which there is enough text available for the first line,
+%D but that more complicated things will blow. One has to live
+%D with that.
+
+\def\TreatFirstLine#1#2#3#4% before, after, first, next
+ {\leavevmode
+ \bgroup
+ \forgetall
+ \bgroup
+ #1%
+ \setbox0=\box\voidb@x
+ \setbox2=\box\voidb@x
+ \def\grabfirstline##1 %
+ {\setbox2=\hbox
+ {\ifvoid0
+ {#3{\ignorespaces##1}}%
+ \else
+ \unhcopy0\ {#4{##1}}%
+ \fi}%
+ \ifdim\wd2=\!!zeropoint
+ \setbox0=\box\voidb@x
+ \setbox2=\box\voidb@x
+ \let\next=\grabfirstline
+ \else\ifdim\wd2>\hsize
+ \hbox to \hsize{\strut\unhbox0}#2\egroup
+ \break##1\
+ \egroup
+ \let\next=\relax
+ \else
+ \setbox0=\box2
+ \let\next=\grabfirstline
+ \fi\fi
+ \next}%
+ \grabfirstline}
+
+%D \startbuffer
+%D \gdef\FunnyCommand
+%D {\getrandomfloat\FunnyR{0}{1}%
+%D \getrandomfloat\FunnyG{0}{1}%
+%D \getrandomfloat\FunnyB{0}{1}%
+%D \definecolor[FunnyColor][r=\FunnyR,g=\FunnyG,b=\FunnyB]%
+%D \color[FunnyColor]}
+%D
+%D \TreatFirstLine {\bf} {} {\FunnyCommand} {\FunnyCommand}
+%D The third and fourth argument can be used to gain special effects on
+%D the individual words. Of course one needs to know
+%D \stopbuffer
+%D
+%D \haalbuffer
+%D a bit more about the macro package used to get real nice effects,
+%D but this example probably demonstrates the principles well.
+%D
+%D \typebuffer
+%D
+%D Like in dropped caps case, one can hide such treatments in a
+%D macro, like:
+%D
+%D \starttypen
+%D \def\MyTreatFirstLine%
+%D {\TreatFirstLine {\bf} {} {\FunnyCommand} {\FunnyCommand}}
+%D \stoptypen
+
+%D \macros
+%D {reshapebox}
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D When using \CONTEXT, one can also apply this funny command to whole lines
+%D by using the reshape mechanism. Describing this interesting mechanism falls
+%D outside the scope of this module, so we only show the trick. This is an
+%D example of low level \CONTEXT\ functionality: it's all there, and it's
+%D stable, but not entirely meant for novice users.
+%D \endofshapebox
+%D
+%D \reshapebox{\FunnyCommand{\box\shapebox}} \flushshapebox
+%D \stopbuffer
+%D
+%D \haalbuffer
+%D
+%D \typebuffer
+%D
+%D This mechanism permits hyphenation and therefore gives
+%D better results than the previously discussed macro
+%D \type{\TreatFirstLine}.
+
+%D \macros
+%D {TreatFirstCharacter}
+%D
+%D \startbuffer
+%D \TreatFirstCharacter {\bf\color[green]} Just to be
+%D \stopbuffer
+%D
+%D \haalbuffer complete we also offer a very simple one
+%D character alternative, that is not that hard to understand:
+
+\def\TreatFirstCharacter#1#2% command, character
+ {{#1{#2}}}
+
+%D A previous paragraph started with:
+%D
+%D \typebuffer
+
+%D \macros
+%D {StackCharacters}
+%D
+%D The next hack deals with vertical stacking.
+
+\def\StackCharacters#1#2#3#4% sequence vsize vskip command
+ {\vbox #2
+ {\forgetall
+ \baselineskip0pt
+ \def\StackCharacter##1{#4{##1}\cr\noalign{#3}}%
+ \halign{\hss##\hss&##\cr\handletokens#1\with\StackCharacter\cr}}}
+
+%D \startbuffer
+%D \StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}
+%D \stopbuffer
+%D
+%D Such a stack looks like:
+%D
+%D \startregelcorrectie
+%D \hbox to \hsize
+%D {$\hss\bfd
+%D \vcenter{\StackCharacters{TEX} {}{\vskip.2ex}{\FunnyCommand}}%
+%D \hss
+%D \vcenter{\StackCharacters{CON} {}{\vskip.2ex}{\FunnyCommand}}
+%D \hss
+%D \vcenter{\StackCharacters{TEXT} {}{\vskip.2ex}{\FunnyCommand}}
+%D \hss
+%D \vcenter{\StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}}
+%D \hss$}
+%D \stopregelcorrectie
+%D
+%D and is typeset by saying:
+%D
+%D \typebuffer
+%D
+%D An alternative would have been
+%D
+%D \starttypen
+%D \StackCharacters{CONTEXT}{to 5cm}{\vfill}{\FunnyCommand}
+%D \stoptypen
+
+%D \macros
+%D {processtokens}
+%D
+%D At a lower level horizontal and vertical manipulations are
+%D already supported by:
+%D
+%D \starttypen
+%D \processtokens {begin} {between} {end} {space} {text}
+%D \stoptypen
+%D
+%D \startbuffer[a]
+%D \processtokens
+%D {\hbox to .5\hsize\bgroup} {\hfill} {\egroup}
+%D {\space} {LET'S HAVE}
+%D \stopbuffer
+%D
+%D \startbuffer[b]
+%D \processtokens
+%D {\vbox\bgroup\raggedcenter\hsize1em} {\vskip.25ex} {\egroup}
+%D {\strut} {FUN}
+%D \stopbuffer
+%D
+%D This macro is able to typeset:
+%D
+%D \leavevmode\hbox to \hsize
+%D {$\hfil\hfil
+%D \vcenter{\bf\haalbuffer[a]}%
+%D \hfil
+%D \vcenter{\bfd\haalbuffer[b]}%
+%D \hfil\hfil$}
+%D
+%D which was specified as:
+%D
+%D \typebuffer[a]
+%D \typebuffer[b]
+
+%D \macros
+%D {NormalizeFontHeight, NormalizeFontWidth}
+%D
+%D Next we introduce some font manipulation macros. When we
+%D want to typeset some text spread in a well defined area, it
+%D can be considered bad practice to manipulate character and
+%D word spacing. In such situations the next few macros can be
+%D of help:
+%D
+%D \starttypen
+%D \NormalizeFontHeight \name {sample text} {height} {font}
+%D \NormalizeFontWidth \name {sample text} {width} {font}
+%D \stoptypen
+%D
+%D These are implemented using an auxilliary macro:
+
+\def\NormalizeFontHeight%
+ {\NormalizeFontSize\ht}
+
+\def\NormalizeFontWidth%
+ {\NormalizeFontSize\wd}
+
+\def\NormalizeFontSize#1#2#3#4#5%
+ {\setbox0=\hbox{\font\temp=#5 at 10pt\temp#3}%
+ \dimen0=#10
+ \dimen2=10000pt
+ \divide\dimen2 by \dimen0
+ \dimen4=#4
+ \divide\dimen4 by 1000
+ \dimen4=\number\dimen2\dimen4
+ \edef\NormalizedFontSize{\the\dimen4}%
+ \font#2=#5 at \NormalizedFontSize}
+
+%D Consider for instance:
+%D
+%D \startbuffer
+%D \NormalizeFontHeight \temp {X} {2\baselineskip} {cmr10}
+%D
+%D {\temp To Be Or Not To Be}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This shows up as (we also show the baselines):
+%D
+%D {\showbaselines\haalbuffer}
+%D
+%D The horizontal counterpart is:
+%D
+%D \startbuffer
+%D \NormalizeFontWidth \temp {This Sentence Fits} {\hsize} {cmr10}
+%D
+%D \hbox{\temp This Sentence Fits}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startregelcorrectie
+%D \ruledhbox{\haalbuffer}
+%D \stopregelcorrectie
+%D
+%D The calculated font scale is avaliable in the macro
+%D \type{\NormalizedFontSize}.
+%D
+%D One can of course combine these macros with the ones
+%D described earlier, like in:
+%D
+%D \starttypen
+%D \NormalizeFontHeight \NicelyDroppedFont {X} {2\baselineskip} {cmbx12}
+%D
+%D \def\NicelyDroppedCaps%
+%D {\DroppedCaps
+%D {\kleur[groen]}
+%D {\NicelyDroppedFont}
+%D {2pt}
+%D {\baselineskip}
+%D {2}}
+%D \stoptypen
+%D
+%D It's up to the reader to test this one.
+
+\protect
+
+\endinput
diff --git a/tex/context/base/supp-ini.tex b/tex/context/base/supp-ini.tex index 857d3d512..d409365a1 100644 --- a/tex/context/base/supp-ini.tex +++ b/tex/context/base/supp-ini.tex @@ -1,18 +1,19 @@ -%D \module -%D [ file=supp-ini, -%D version=1995.10.10, -%D title=\CONTEXT\ Support ystem Macros, -%D subtitle=Initializations, -%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 Support Macros / Initializations} - -\newif\ifeightbitcharacters \eightbitcharactersfalse - -\endinput +%D \module
+%D [ file=supp-ini,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support ystem Macros,
+%D subtitle=Initializations,
+%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 Support Macros / Initializations}
+
+\newif\ifeightbitcharacters \eightbitcharactersfalse
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/supp-lan.tex b/tex/context/base/supp-lan.tex index c2061e128..e64967aef 100644 --- a/tex/context/base/supp-lan.tex +++ b/tex/context/base/supp-lan.tex @@ -1,686 +1,687 @@ -%D \module -%D [ file=supp-lan, -%D version=1997.03.20, -%D title=\CONTEXT\ Support Macros, -%D subtitle=Language Options, -%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. - -%D \gdef\starttest% -%D {\blanko -%D \noindent -%D \halign\bgroup\tt##\hskip2em&##\hskip2em&##\cr} -%D -%D \gdef\stoptest% -%D {\egroup -%D \blanko} -%D -%D \gdef\test#1% -%D {\convertargument#1\to\ascii\ascii&\hyphenatedword{#1}\cr} - -%D One of \TEX's strong points in building paragraphs is the way -%D hyphenations are handled. Although for real good hyphenation -%D of non||english languages some extensions to the program are -%D needed, fairly good results can be reached with the standard -%D mechanisms and an additional macro, at least in Dutch. - -\unprotect - -%D \CONTEXT\ originates in the wish to typeset educational -%D materials, especially in a technical environment. In -%D production oriented environments, a lot of compound words -%D are used. Because the Dutch language poses no limits on -%D combining words, we often favor putting dashes between those -%D words, because it facilitates reading, at least for those -%D who are not that accustomed to it. -%D -%D In \TEX\ compound words, separated by a hyphen, are not -%D hyphenated at all. In spite of the multiple pass paragraph -%D typesetting this can lead to parts of words sticking into -%D the margin. The solution lays in saying -%D \type{spoelwater||terugwinunit} instead of -%D \type{spoelwater-terugwinunit}. By using a one character -%D command like \type{|}, delimited by the same character -%D \type{|}, we get ourselves both a decent visualization (in -%D \TEXEDIT\ and colored verbatim we color these commands -%D yellow) and an efficient way of combining words. -%D -%D The sequence \type{||} simply leads to two words connected by -%D a hyphen. Because we want to distinguish such a hyphen from -%D the one inserted when \TEX\ hyphenates a word, we use a bit -%D longer one. -%D -%D \hyphenation {spoel-wa-ter te-rug-win-unit} -%D -%D \starttest -%D \test {spoelwater||terugwinunit} -%D \stoptest -%D -%D As we already said, the \type{|} is a command. This commands -%D accepts an optional argument before it's delimiter, which is -%D also a \type{|}. -%D -%D \hyphenation {po-ly-meer che-mie} -%D -%D \starttest -%D \test {polymeer|*|chemie} -%D \stoptest -%D -%D Arguments like \type{*} are not interpreted and inserted -%D directly, in contrary to arguments like: -%D -%D \starttest -%D \test {polymeer|~|chemie} -%D \test {|(|polymeer|)|chemie} -%D \test {polymeer|(|chemie|)| } -%D \stoptest -%D -%D Although such situations seldom occur |<|we typeset thousands -%D of pages before we encountered one that forced us to enhance -%D this mechanism|>| we also have to take care of comma's. -%D -%D \hyphenation {uit-stel-len} -%D -%D \starttest -%D \test {op||, in|| en uitstellen} -%D \stoptest -%D -%D The next special case (concerning quotes) was brought to my -%D attention by Piet Tutelaers, one of the driving forces -%D behind rebuilding hyphenation patterns for the dutch -%D language.\voetnoot{In 1996 the spelling of the dutch -%D language has been slightly reformed which made this topic -%D actual again.} We'll also take care of this case. -%D -%D \starttest -%D \test {AOW|'|er} -%D \test {cd|'|tje} -%D \test {ex|-|PTT|'|er} -%D \test {rock|-|'n|-|roller} -%D \stoptest -%D -%D Tobias Burnus pointed out that I should also support -%D something like -%D -%D \starttest -%D \test {well|_|known} -%D \stoptest -%D -%D to strees the compoundness of hyphenated words. -%D -%D Of course we also have to take care of the special case: -%D -%D \starttest -%D \test {text||color and ||font} -%D \stoptest - -%D \macros -%D {installdiscretionaries} -%D {} -%D -%D The mechanism described here is one of the older inner parts -%D of \CONTEXT. The most recent extensions concerns some -%D special cases as well as the possibility to install other -%D characters as delimiters. The prefered way of specifying -%D compound words is using \type{||}, which is installed by: -%D -%D \starttypen -%D \installdiscretionaries || - -%D \stoptypen -%D -%D Some alternative definitions are: -%D -%D \startbuffer -%D \installdiscretionaries ** - -%D \installdiscretionaries ++ - -%D \installdiscretionaries // - -%D \installdiscretionaries ~~ - -%D \stopbuffer -%D -%D \typebuffer -%D -%D after which we can say: -%D -%D \bgroup -%D \haalbuffer -%D \starttest -%D \test {test**test**test} -%D \test {test++test++test} -%D \test {test//test//test} -%D \test {test~~test~~test} -%D \stoptest -%D \egroup - -%D \macros -%D {compoundhyphen, -%D beginofsubsentence,endofsubsentence} -%D {} -%D -%D Now let's go to the macros. First we define some variables. -%D In the main \CONTEXT\ modules these can be tuned by a setup -%D command. Watch the (maybe) better looking compound hyphen. - -\def\compoundhyphen {{-}\kern-.25ex{-}} -\def\beginofsubsentence {---} -\def\endofsubsentence {---} - -%D The last two variables are needed for subsentences -%D |<|like this one|>| which we did not yet mention. -%D -%D We want to enable breaking but at the same time don't want -%D compound characters like |-| or || to be separated from the -%D words. \TEX\ hackers will recognise the next two macro's: - -\def\prewordbreak {\penalty10000\hskip0pt\relax} -\def\postwordbreak {\penalty0\prewordbreak} - -%D We first show the original implementation, which only -%D supports \type{|} as command and delimiter. Before -%D activating \type{|} we save it's value: -%D -%D \starttypen -%D \edef\domathmodediscretionary{\string|} -%D \stoptypen -%D -%D after which we're ready to define it's meaning to: -%D -%D \starttypen -%D \catcode`\|=\@@active -%D -%D \unexpanded\def|% -%D {\ifmmode -%D \expandafter\domathmodediscretionary -%D \else -%D \expandafter\dotextmodediscretionary -%D \fi} -%D \stoptypen -%D -%D We need a two stage \type{\futurelet} because we want to -%D look ahead for both the compound character definition and -%D the (optional) comma that follows it, and because we want to -%D prevent that \TEX\ puts this comma on the next line. We use -%D \type{\next} for easy and fast checking of the argument, we -%D save this argument (which can consist of more tokens) and -%D also save the character following the \type{|#1|} in -%D \type{\nextnext}. -%D -%D \starttypen -%D \def\dotextmodediscretionary% -%D {\bgroup -%D \futurelet\next\dodotextmodediscretionary} -%D -%D \def\dodotextmodediscretionary#1|% -%D {\def\betweendiscretionaries{#1}% -%D \futurelet\nextnext\dododotextmodediscretionary} -%D \stoptypen -%D -%D The main macro consists of quite some \type{\ifx} tests -%D while \type{\checkafterdiscretionary} handles the commas. -%D We show the simplified version here: -%D -%D \starttypen -%D \def\dododotextmodediscretionary% -%D {\let\nextnextnext=\egroup -%D \ifx |\next -%D \checkafterdiscretionary -%D \prewordbreak\hbox{\compoundhyphen\nextnext}\allowbreak -%D \else\ifx=\next -%D \prewordbreak\compoundhyphen -%D \else\ifx~\next -%D \discretionary{-}{}{\thinspace}\postwordbreak -%D \else\ifx(\next -%D \prewordbreak\discretionary{}{(-}{(}\prewordbreak -%D \else\ifx)\next -%D \prewordbreak\discretionary{-)}{}{)}\prewordbreak -%D \else\ifx'\next -%D \prewordbreak\discretionary{-}{}{'}\postwordbreak -%D \else -%D \checkafterdiscretionary -%D \prewordbreak\hbox{\betweendiscretionaries\nextnext}\allowbreak -%D \fi\fi\fi\fi\fi\fi -%D \nextnextnext} -%D -%D \def\checkafterdiscretionary% -%D {\ifx,\nextnext -%D \def\nextnextnext{\afterassignment\egroup\let\next=}% -%D \else -%D \let\nextnext=\relax -%D \fi} -%D \stoptypen -%D -%D Handling \type{(} and \type{)} is a a bit special, because -%D \TEX\ sees them as decent hyphenation points, according to -%D their \type{\lccode} being non||zero. For the same reason, -%D later on in this module we cannot manipulate the -%D \type{\lccode} but take the \type{\uccode}. - -%D The most recent implementation is more advanced. As -%D demonstrated we can install delimiters, like: -%D -%D \starttypen -%D \installdiscretionaries || \compoundhyphen -%D \stoptypen -%D -%D This time we have to use a bit more clever way of saving the -%D math mode specification of the character we're going to -%D make active. We also save the user supplied compound hyphen. -%D We show the a bit more traditional implementation first. -%D -%D \starttypen -%D \def\installdiscretionaries#1% -%D {\catcode`#1\@@other -%D \expandafter\doinstalldiscretionaries\string#1} -%D -%D \def\doinstalldiscretionaries#1% -%D {\setvalue{mathmodediscretionary#1}{#1}% -%D \catcode`#1\@@active -%D \dodoinstalldiscretionaries} -%D -%D \def\dodoinstalldiscretionaries#1#2% -%D {\setvalue{textmodediscretionary\string#1}{#2}% -%D \unexpanded\def#1{\discretionarycommand#1}} -%D \stoptypen -%D -%D A bit more \CATCODE\ and character trickery enables us to -%D discard the two intermediate steps. This trick originates -%D on page~394 of the \TEX book, in the appendix full of -%D dirty tricks. The second argument has now become redundant, -%D but I decided to reserve it for future use. At least it -%D remembers us of the symmetry. - -\def\installdiscretionaries#1#2#3% - {\setvalue{mathmodediscretionary\string#1}{\char`#1}% - \setvalue{textmodediscretionary\string#1}{#3}% - \catcode`#1=\@@active - \scratchcounter=\the\uccode`~ - \uccode`~=`#1 - \uppercase{\unexpanded\def~{\discretionarycommand~}}% - \uccode`~=\scratchcounter} - -\def\dohandlemathmodebar#1% - {\getvalue{mathmodediscretionary\string#1}} - -\def\discretionarycommand% - {\ifmmode - \expandafter\dohandlemathmodebar - \else - \expandafter\dotextmodediscretionary - \fi} - -%D Although adapting character codes and making characters -%D active can interfere with other features of macropackages, -%D normally there should be no problems with things like: -%D -%D \starttypen -%D \installdiscretionary || + -%D \installdiscretionary ++ = -%D \stoptypen -%D -%D The real work is done by the next set of macros. We have -%D to use a double \type{\futurelet} because we have to take -%D following characters into account. - -\def\dotextmodediscretionary#1% - {\bgroup - \def\dodotextmodediscretionary##1#1% - {\def\betweendiscretionary{##1}% - \futurelet\nextnext\dododotextmodediscretionary}% - \let\discretionarycommand=#1% - \def\textmodediscretionary{\getvalue{textmodediscretionary\string#1}}% - \futurelet\next\dodotextmodediscretionary} - -\def\dododotextmodediscretionary% - {\let\nextnextnext=\egroup - \ifx\discretionarycommand\next - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak - \egroup - \else\ifx=\next - \prewordbreak\textmodediscretionary - \else\ifx~\next - \prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak - \else\ifx_\next - \prewordbreak\discretionary{\textmodediscretionary} - {\textmodediscretionary}{\textmodediscretionary}\prewordbreak - \else\ifx(\next - \ifdim\lastskip>\!!zeropoint\relax - (\prewordbreak - \else - \prewordbreak\discretionary{}{(-}{(}\prewordbreak - \fi - \else\ifx)\next - \ifx\nextnext\blankspace - \prewordbreak)\relax - \else - \prewordbreak\discretionary{-)}{}{)}\prewordbreak - \fi - \else\ifx'\next - \prewordbreak\discretionary{-}{}{'}\postwordbreak - \else\ifx<\next - \beginofsubsentence\prewordbreak\beginofsubsentencespacing - \else\ifnum\uccode`>=\nextuccode - \endofsubsentencespacing\prewordbreak\endofsubsentence - \else - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - \prewordbreak\hbox{\betweendiscretionary\nextnext}\allowbreak - \egroup - \fi\fi\fi\fi\fi\fi\fi\fi\fi - \nextnextnext} - -\def\checkbeforediscretionary% - {\setbox0=\lastbox - \ifdim\wd0=\!!zeropoint - \let\postwordbreak=\prewordbreak - \fi - \box0\relax} - -\def\checkafterdiscretionary% - {\ifx,\nextnext - \def\nextnextnext{\afterassignment\egroup\let\next=}% - \else - \let\nextnext=\relax - \fi} - -%D The macro \type{\checkbeforediscretionary} takes care of -%D loners like \type{||word}, while it counterpart -%D \type{\checkafterdiscretionary} is responsible for handling -%D the comma. - -%D \macros -%D {beginofsubsentencespacing,endofsubsentencespacing} -%D {} -%D -%D In the previous macros we provided two hooks which can be -%D used to support nested sub||sentences. In \CONTEXT\ these -%D hooks are used to insert a small space when needed. - -\let\beginofsubsentencespacing=\relax -\let\endofsubsentencespacing =\relax - -%D Before we show some more tricky alternative, we first install -%D the mechanism: - -\installdiscretionaries || \compoundhyphen - -%D One of the drawbacks of this mechanism is that characters can -%D be made active afterwards. The next alternative can be used -%D in such situations. This time we don't compare the arguments -%D directly but use the \type{\uccode}'s instead. \TEX\ -%D initializes these codes of the alphabetics glyphs to their -%D uppercase counterparts. Normally the other characters remain -%D zero. If so, we can use the \type{\uccode} as a signal. - -%D \macros -%D {enableactivediscretionaries} -%D {} -%D -%D The more advanced mechanism is activated by calling: -%D -%D \starttypen -%D \enableactivediscretionaries -%D \stoptypen -%D -%D which is defined as: - -\def\enableactivediscretionaries% - {\uccode`'=`'\relax \uccode`~=`~\relax \uccode`_=`_\relax - \uccode`(=`(\relax \uccode`)=`)\relax \uccode`==`=\relax - \uccode`<=`<\relax \uccode`>=`>\relax - \let\dotextmodediscretionary = \activedotextmodediscretionary - \let\dododotextmodediscretionary = \activedododotextmodediscretionary} - -%D We only have to redefine two macros. While saving the -%D \type{\uccode} in a macro we have to take care of empty -%D arguments, like in \type{||}. - -\def\activedotextmodediscretionary#1% - {\bgroup - \def\dodotextmodediscretionary##1#1% - {\def\betweendiscretionary{##1}% - \def\nextuccode####1####2\relax% - {\ifcat\noexpand####1\noexpand\relax - \edef\nextuccode{0}% - \else - \edef\nextuccode{\the\uccode`####1}% - \fi}% - \nextuccode##1@\relax - \futurelet\nextnext\dododotextmodediscretionary}% - \let\discretionarycommand=#1% - \def\textmodediscretionary{\getvalue{textmodediscretionary\string#1}}% - \futurelet\next\dodotextmodediscretionary} - -%D This time we use \type{\ifnum}: - -\def\activedododotextmodediscretionary% - {\let\nextnextnext=\egroup - \ifx\discretionarycommand\next - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak - \egroup - \else\ifnum\uccode`==\nextuccode - \prewordbreak\textmodediscretionary - \else\ifnum\uccode`~=\nextuccode - \prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak - \else\ifnum\uccode`_=\nextuccode - \prewordbreak\discretionary{\textmodediscretionary} - {\textmodediscretionary}{\textmodediscretionary}\prewordbreak - \else\ifnum\uccode`(=\nextuccode - \ifdim\lastskip>\!!zeropoint\relax - (\prewordbreak - \else - \prewordbreak\discretionary{}{(-}{(}\prewordbreak - \fi - \else\ifnum\uccode`)=\nextuccode - \ifx\nextnext\blankspace - \prewordbreak)\relax - \else - \prewordbreak\discretionary{-)}{}{)}\prewordbreak - \fi - \else\ifnum\uccode`'=\nextuccode - \prewordbreak\discretionary{-}{}{'}\postwordbreak - \else\ifnum\uccode`<=\nextuccode - \beginofsubsentence\prewordbreak\beginofsubsentencespacing - \else\ifnum\uccode`>=\nextuccode - \endofsubsentencespacing\prewordbreak\endofsubsentence - \else - \checkafterdiscretionary - \bgroup - \checkbeforediscretionary - \prewordbreak\hbox{\betweendiscretionary\nextnext}\allowbreak - \egroup - \fi\fi\fi\fi\fi\fi\fi\fi\fi - \nextnextnext} - -%D Now we can safely do things like: \enableactivediscretionaries -%D -%D \starttypen -%D \catcode`<=\@@active \def<{hello there} -%D \catcode`>=\@@active \def>{hello there} -%D \catcode`(=\@@active \def({hello there} -%D \catcode`)=\@@active \def){hello there} -%D \stoptypen -%D -%D In normal day||to||day production of texts this kind of -%D activation is seldom used.\voetnoot{In the \CONTEXT\ manual -%D the \type{<} and \type{>} are made active and used for some -%D cross||reference trickery.} If so, we have to take care of -%D the math mode explicitly, just like we did when making -%D \type{|} active. It can be confusing too, especially when we -%D load macropackages afterwards that make use of \type{<} in -%D \type{\ifnum} or \type{\ifdim} statements. - -%D \macros -%D {installcompoundcharacter} -%D {} -%D -%D When Tobias Burnus started translating the dutch manual of -%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support -%D the \type{german.sty} method of handling compound -%D characters, especially the umlaut. This package is meant for -%D use with \PLAIN\ \TEX\ as well as \LATEX. -%D -%D I decided to implement compound character support as -%D versatile as possible. As a result one can define his own -%D compound character support, like: -%D -%D \starttypen -%D \installcompoundcharacter "a {\"a} -%D \installcompoundcharacter "e {\"e} -%D \installcompoundcharacter "i {\"i} -%D \installcompoundcharacter "u {\"u} -%D \installcompoundcharacter "o {\"o} -%D \installcompoundcharacter "s {\SS} -%D \stoptypen -%D -%D or even -%D -%D \starttypen -%D \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}} -%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}} -%D \stoptypen -%D -%D The support is not limited to alphabetic characters, so the -%D next definition is also valid. -%D -%D \starttypen -%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}} -%D \stoptypen -%D -%D The implementation looks familiar and uses the same tricks as -%D mentioned earlier in this module. We take care of two -%D arguments, which complicates things a bit. - -\def\@nc@{@nc@} % normal character -\def\@cc@{@cc@} % compound character -\def\@cs@{@cs@} % compound characters - -\def\installcompoundcharacter #1#2#3 #4% {{#4}} keeps move local - {\setvalue{\@nc@\string#1}{\char`#1}% - \def\!!stringa{#3}% - \ifx\!!stringa\empty - \setvalue{\@cc@\string#1\string#2}{{#4}}% - \else - \setvalue{\@cs@\string#1\string#2\string#3}{{#4}}% - \fi - \catcode`#1=\@@active - \scratchcounter=\the\uccode`~ - \uccode`~=`#1 - \uppercase{\unexpanded\def~{\handlecompoundcharacter~}}% - \uccode`~=\scratchcounter} - -%D In handling the compound characters we have to take care of -%D \type{\bgroup} and \type{\egroup} tokens, so we end up with -%D a multi||step interpretation macro. We look ahead for a -%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being -%D no user of this mechanism, the credits for testing them goes -%D to Tobias Burnus, the first german user of \CONTEXT. -%D -%D We define these macros as \type{\long} because we can -%D expect \type{\par} tokens. We need to look into the future -%D with \type{\futurelet} to prevent spaces from -%D disappearing. - -\def\handlecompoundcharacter#1% - {\def\dohandlecompoundcharacter% - {\ifx\next\bgroup - %\def\next{\dodohandlecompoundcharacter#1}% % handle "{ee} -> \"ee - %\let\next=\relax % forget "{ee} -> ee - \def\next{\handlecompoundcharacterone#1}% % ignore "{ee} -> "ee - \else\ifx\next\egroup - \let\next=\relax - \else\ifx\next\blankspace - \let\next=\relax - \else - \def\next{\dodohandlecompoundcharacter#1}% - \fi\fi\fi - \next}% - \futurelet\next\dohandlecompoundcharacter} - -\def\dodohandlecompoundcharacter#1#2% - {\def\dododohandlecompoundcharacter% - {\ifx\next\bgroup - \def\next{\handlecompoundcharacterone#1#2}% - \else\ifx\next\egroup - \def\next{\handlecompoundcharacterone#1#2}% - \else\ifx\next\blankspace - \def\next{\handlecompoundcharacterone#1#2}% - \else - \def\next{\handlecompoundcharactertwo#1#2}% - \fi\fi\fi - \next}% - \futurelet\next\dododohandlecompoundcharacter} - -%D Besides taken care of the grouping and space tokens, we have -%D to deal with three situations. First we look if the next -%D character equals the first one, if so, then we just insert -%D the original. Next we look if indeed a compound character is -%D defined. We either execute the compound character or just -%D insert the first. So we have -%D -%D \starttypen -%D <key><key> <key><known> <key><unknown> -%D \stoptypen -%D -%D In later modules we will see how these commands are used. - -\long\def\handlecompoundcharacterone#1#2% - {\ifx#1#2% - \def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}}% - \else - \expandafter\ifx\csname\@cc@\string#1\string#2\endcsname\relax - \def\next{\getvalue{\@nc@\string#1}#2}% - \else - \def\next{\getvalue{\@cc@\string#1\string#2}}% - \fi - \fi - \next} - -\long\def\handlecompoundcharactertwo#1#2#3% - {\ifx#1#2% - \def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}#3}% - \else - \@EA\ifx\csname\@cs@\string#1\string#2\string#3\endcsname\relax - \expandafter\ifx\csname\@cc@\string#1\string#2\endcsname\relax - \def\next{\getvalue{\@nc@\string#1}#2#3}% - \else - \def\next{\getvalue{\@cc@\string#1\string#2}#3}% - \fi - \else - \def\next{\getvalue{\@cs@\string#1\string#2\string#3}}% - \fi - \fi - \next} - -%D \macros -%D {midworddiscretionary} -%D -%D If needed, one can add a discretionary hyphen using \type -%D {\midworddiscretionary}. This macro does the same as -%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented -%D earlier, this one also looks ahead for spaces and grouping -%D tokens. - -\def\domidworddiscretionary% - {\ifx\next\blankspace\else - \ifx\next\bgroup \else - \ifx\next\egroup \else - \discretionary{-}{}{}% - \fi\fi\fi} - -\def\midworddiscretionary% - {\futurelet\next\domidworddiscretionary} - -\protect - -\endinput +%D \module
+%D [ file=supp-lan,
+%D version=1997.03.20,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Language Options,
+%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.
+
+%D \gdef\starttest%
+%D {\blanko
+%D \noindent
+%D \halign\bgroup\tt##\hskip2em&##\hskip2em&##\cr}
+%D
+%D \gdef\stoptest%
+%D {\egroup
+%D \blanko}
+%D
+%D \gdef\test#1%
+%D {\convertargument#1\to\ascii\ascii&\hyphenatedword{#1}\cr}
+
+%D One of \TEX's strong points in building paragraphs is the way
+%D hyphenations are handled. Although for real good hyphenation
+%D of non||english languages some extensions to the program are
+%D needed, fairly good results can be reached with the standard
+%D mechanisms and an additional macro, at least in Dutch.
+
+\unprotect
+
+%D \CONTEXT\ originates in the wish to typeset educational
+%D materials, especially in a technical environment. In
+%D production oriented environments, a lot of compound words
+%D are used. Because the Dutch language poses no limits on
+%D combining words, we often favor putting dashes between those
+%D words, because it facilitates reading, at least for those
+%D who are not that accustomed to it.
+%D
+%D In \TEX\ compound words, separated by a hyphen, are not
+%D hyphenated at all. In spite of the multiple pass paragraph
+%D typesetting this can lead to parts of words sticking into
+%D the margin. The solution lays in saying
+%D \type{spoelwater||terugwinunit} instead of
+%D \type{spoelwater-terugwinunit}. By using a one character
+%D command like \type{|}, delimited by the same character
+%D \type{|}, we get ourselves both a decent visualization (in
+%D \TEXEDIT\ and colored verbatim we color these commands
+%D yellow) and an efficient way of combining words.
+%D
+%D The sequence \type{||} simply leads to two words connected by
+%D a hyphen. Because we want to distinguish such a hyphen from
+%D the one inserted when \TEX\ hyphenates a word, we use a bit
+%D longer one.
+%D
+%D \hyphenation {spoel-wa-ter te-rug-win-unit}
+%D
+%D \starttest
+%D \test {spoelwater||terugwinunit}
+%D \stoptest
+%D
+%D As we already said, the \type{|} is a command. This commands
+%D accepts an optional argument before it's delimiter, which is
+%D also a \type{|}.
+%D
+%D \hyphenation {po-ly-meer che-mie}
+%D
+%D \starttest
+%D \test {polymeer|*|chemie}
+%D \stoptest
+%D
+%D Arguments like \type{*} are not interpreted and inserted
+%D directly, in contrary to arguments like:
+%D
+%D \starttest
+%D \test {polymeer|~|chemie}
+%D \test {|(|polymeer|)|chemie}
+%D \test {polymeer|(|chemie|)| }
+%D \stoptest
+%D
+%D Although such situations seldom occur |<|we typeset thousands
+%D of pages before we encountered one that forced us to enhance
+%D this mechanism|>| we also have to take care of comma's.
+%D
+%D \hyphenation {uit-stel-len}
+%D
+%D \starttest
+%D \test {op||, in|| en uitstellen}
+%D \stoptest
+%D
+%D The next special case (concerning quotes) was brought to my
+%D attention by Piet Tutelaers, one of the driving forces
+%D behind rebuilding hyphenation patterns for the dutch
+%D language.\voetnoot{In 1996 the spelling of the dutch
+%D language has been slightly reformed which made this topic
+%D actual again.} We'll also take care of this case.
+%D
+%D \starttest
+%D \test {AOW|'|er}
+%D \test {cd|'|tje}
+%D \test {ex|-|PTT|'|er}
+%D \test {rock|-|'n|-|roller}
+%D \stoptest
+%D
+%D Tobias Burnus pointed out that I should also support
+%D something like
+%D
+%D \starttest
+%D \test {well|_|known}
+%D \stoptest
+%D
+%D to strees the compoundness of hyphenated words.
+%D
+%D Of course we also have to take care of the special case:
+%D
+%D \starttest
+%D \test {text||color and ||font}
+%D \stoptest
+
+%D \macros
+%D {installdiscretionaries}
+%D {}
+%D
+%D The mechanism described here is one of the older inner parts
+%D of \CONTEXT. The most recent extensions concerns some
+%D special cases as well as the possibility to install other
+%D characters as delimiters. The prefered way of specifying
+%D compound words is using \type{||}, which is installed by:
+%D
+%D \starttypen
+%D \installdiscretionaries || -
+%D \stoptypen
+%D
+%D Some alternative definitions are:
+%D
+%D \startbuffer
+%D \installdiscretionaries ** -
+%D \installdiscretionaries ++ -
+%D \installdiscretionaries // -
+%D \installdiscretionaries ~~ -
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D after which we can say:
+%D
+%D \bgroup
+%D \haalbuffer
+%D \starttest
+%D \test {test**test**test}
+%D \test {test++test++test}
+%D \test {test//test//test}
+%D \test {test~~test~~test}
+%D \stoptest
+%D \egroup
+
+%D \macros
+%D {compoundhyphen,
+%D beginofsubsentence,endofsubsentence}
+%D {}
+%D
+%D Now let's go to the macros. First we define some variables.
+%D In the main \CONTEXT\ modules these can be tuned by a setup
+%D command. Watch the (maybe) better looking compound hyphen.
+
+\def\compoundhyphen {{-}\kern-.25ex{-}}
+\def\beginofsubsentence {---}
+\def\endofsubsentence {---}
+
+%D The last two variables are needed for subsentences
+%D |<|like this one|>| which we did not yet mention.
+%D
+%D We want to enable breaking but at the same time don't want
+%D compound characters like |-| or || to be separated from the
+%D words. \TEX\ hackers will recognise the next two macro's:
+
+\def\prewordbreak {\penalty10000\hskip0pt\relax}
+\def\postwordbreak {\penalty0\prewordbreak}
+
+%D We first show the original implementation, which only
+%D supports \type{|} as command and delimiter. Before
+%D activating \type{|} we save it's value:
+%D
+%D \starttypen
+%D \edef\domathmodediscretionary{\string|}
+%D \stoptypen
+%D
+%D after which we're ready to define it's meaning to:
+%D
+%D \starttypen
+%D \catcode`\|=\@@active
+%D
+%D \unexpanded\def|%
+%D {\ifmmode
+%D \expandafter\domathmodediscretionary
+%D \else
+%D \expandafter\dotextmodediscretionary
+%D \fi}
+%D \stoptypen
+%D
+%D We need a two stage \type{\futurelet} because we want to
+%D look ahead for both the compound character definition and
+%D the (optional) comma that follows it, and because we want to
+%D prevent that \TEX\ puts this comma on the next line. We use
+%D \type{\next} for easy and fast checking of the argument, we
+%D save this argument (which can consist of more tokens) and
+%D also save the character following the \type{|#1|} in
+%D \type{\nextnext}.
+%D
+%D \starttypen
+%D \def\dotextmodediscretionary%
+%D {\bgroup
+%D \futurelet\next\dodotextmodediscretionary}
+%D
+%D \def\dodotextmodediscretionary#1|%
+%D {\def\betweendiscretionaries{#1}%
+%D \futurelet\nextnext\dododotextmodediscretionary}
+%D \stoptypen
+%D
+%D The main macro consists of quite some \type{\ifx} tests
+%D while \type{\checkafterdiscretionary} handles the commas.
+%D We show the simplified version here:
+%D
+%D \starttypen
+%D \def\dododotextmodediscretionary%
+%D {\let\nextnextnext=\egroup
+%D \ifx |\next
+%D \checkafterdiscretionary
+%D \prewordbreak\hbox{\compoundhyphen\nextnext}\allowbreak
+%D \else\ifx=\next
+%D \prewordbreak\compoundhyphen
+%D \else\ifx~\next
+%D \discretionary{-}{}{\thinspace}\postwordbreak
+%D \else\ifx(\next
+%D \prewordbreak\discretionary{}{(-}{(}\prewordbreak
+%D \else\ifx)\next
+%D \prewordbreak\discretionary{-)}{}{)}\prewordbreak
+%D \else\ifx'\next
+%D \prewordbreak\discretionary{-}{}{'}\postwordbreak
+%D \else
+%D \checkafterdiscretionary
+%D \prewordbreak\hbox{\betweendiscretionaries\nextnext}\allowbreak
+%D \fi\fi\fi\fi\fi\fi
+%D \nextnextnext}
+%D
+%D \def\checkafterdiscretionary%
+%D {\ifx,\nextnext
+%D \def\nextnextnext{\afterassignment\egroup\let\next=}%
+%D \else
+%D \let\nextnext=\relax
+%D \fi}
+%D \stoptypen
+%D
+%D Handling \type{(} and \type{)} is a a bit special, because
+%D \TEX\ sees them as decent hyphenation points, according to
+%D their \type{\lccode} being non||zero. For the same reason,
+%D later on in this module we cannot manipulate the
+%D \type{\lccode} but take the \type{\uccode}.
+
+%D The most recent implementation is more advanced. As
+%D demonstrated we can install delimiters, like:
+%D
+%D \starttypen
+%D \installdiscretionaries || \compoundhyphen
+%D \stoptypen
+%D
+%D This time we have to use a bit more clever way of saving the
+%D math mode specification of the character we're going to
+%D make active. We also save the user supplied compound hyphen.
+%D We show the a bit more traditional implementation first.
+%D
+%D \starttypen
+%D \def\installdiscretionaries#1%
+%D {\catcode`#1\@@other
+%D \expandafter\doinstalldiscretionaries\string#1}
+%D
+%D \def\doinstalldiscretionaries#1%
+%D {\setvalue{mathmodediscretionary#1}{#1}%
+%D \catcode`#1\@@active
+%D \dodoinstalldiscretionaries}
+%D
+%D \def\dodoinstalldiscretionaries#1#2%
+%D {\setvalue{textmodediscretionary\string#1}{#2}%
+%D \unexpanded\def#1{\discretionarycommand#1}}
+%D \stoptypen
+%D
+%D A bit more \CATCODE\ and character trickery enables us to
+%D discard the two intermediate steps. This trick originates
+%D on page~394 of the \TEX book, in the appendix full of
+%D dirty tricks. The second argument has now become redundant,
+%D but I decided to reserve it for future use. At least it
+%D remembers us of the symmetry.
+
+\def\installdiscretionaries#1#2#3%
+ {\setvalue{mathmodediscretionary\string#1}{\char`#1}%
+ \setvalue{textmodediscretionary\string#1}{#3}%
+ \catcode`#1=\@@active
+ \scratchcounter=\the\uccode`~
+ \uccode`~=`#1
+ \uppercase{\unexpanded\def~{\discretionarycommand~}}%
+ \uccode`~=\scratchcounter}
+
+\def\dohandlemathmodebar#1%
+ {\getvalue{mathmodediscretionary\string#1}}
+
+\def\discretionarycommand%
+ {\ifmmode
+ \expandafter\dohandlemathmodebar
+ \else
+ \expandafter\dotextmodediscretionary
+ \fi}
+
+%D Although adapting character codes and making characters
+%D active can interfere with other features of macropackages,
+%D normally there should be no problems with things like:
+%D
+%D \starttypen
+%D \installdiscretionary || +
+%D \installdiscretionary ++ =
+%D \stoptypen
+%D
+%D The real work is done by the next set of macros. We have
+%D to use a double \type{\futurelet} because we have to take
+%D following characters into account.
+
+\def\dotextmodediscretionary#1%
+ {\bgroup
+ \def\dodotextmodediscretionary##1#1%
+ {\def\betweendiscretionary{##1}%
+ \futurelet\nextnext\dododotextmodediscretionary}%
+ \let\discretionarycommand=#1%
+ \def\textmodediscretionary{\getvalue{textmodediscretionary\string#1}}%
+ \futurelet\next\dodotextmodediscretionary}
+
+\def\dododotextmodediscretionary%
+ {\let\nextnextnext=\egroup
+ \ifx\discretionarycommand\next
+ \checkafterdiscretionary
+ \bgroup
+ \checkbeforediscretionary
+ \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak
+ \egroup
+ \else\ifx=\next
+ \prewordbreak\textmodediscretionary
+ \else\ifx~\next
+ \prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak
+ \else\ifx_\next
+ \prewordbreak\discretionary{\textmodediscretionary}
+ {\textmodediscretionary}{\textmodediscretionary}\prewordbreak
+ \else\ifx(\next
+ \ifdim\lastskip>\!!zeropoint\relax
+ (\prewordbreak
+ \else
+ \prewordbreak\discretionary{}{(-}{(}\prewordbreak
+ \fi
+ \else\ifx)\next
+ \ifx\nextnext\blankspace
+ \prewordbreak)\relax
+ \else
+ \prewordbreak\discretionary{-)}{}{)}\prewordbreak
+ \fi
+ \else\ifx'\next
+ \prewordbreak\discretionary{-}{}{'}\postwordbreak
+ \else\ifx<\next
+ \beginofsubsentence\prewordbreak\beginofsubsentencespacing
+ \else\ifnum\uccode`>=\nextuccode
+ \endofsubsentencespacing\prewordbreak\endofsubsentence
+ \else
+ \checkafterdiscretionary
+ \bgroup
+ \checkbeforediscretionary
+ \prewordbreak\hbox{\betweendiscretionary\nextnext}\allowbreak
+ \egroup
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \nextnextnext}
+
+\def\checkbeforediscretionary%
+ {\setbox0=\lastbox
+ \ifdim\wd0=\!!zeropoint
+ \let\postwordbreak=\prewordbreak
+ \fi
+ \box0\relax}
+
+\def\checkafterdiscretionary%
+ {\ifx,\nextnext
+ \def\nextnextnext{\afterassignment\egroup\let\next=}%
+ \else
+ \let\nextnext=\relax
+ \fi}
+
+%D The macro \type{\checkbeforediscretionary} takes care of
+%D loners like \type{||word}, while it counterpart
+%D \type{\checkafterdiscretionary} is responsible for handling
+%D the comma.
+
+%D \macros
+%D {beginofsubsentencespacing,endofsubsentencespacing}
+%D {}
+%D
+%D In the previous macros we provided two hooks which can be
+%D used to support nested sub||sentences. In \CONTEXT\ these
+%D hooks are used to insert a small space when needed.
+
+\let\beginofsubsentencespacing=\relax
+\let\endofsubsentencespacing =\relax
+
+%D Before we show some more tricky alternative, we first install
+%D the mechanism:
+
+\installdiscretionaries || \compoundhyphen
+
+%D One of the drawbacks of this mechanism is that characters can
+%D be made active afterwards. The next alternative can be used
+%D in such situations. This time we don't compare the arguments
+%D directly but use the \type{\uccode}'s instead. \TEX\
+%D initializes these codes of the alphabetics glyphs to their
+%D uppercase counterparts. Normally the other characters remain
+%D zero. If so, we can use the \type{\uccode} as a signal.
+
+%D \macros
+%D {enableactivediscretionaries}
+%D {}
+%D
+%D The more advanced mechanism is activated by calling:
+%D
+%D \starttypen
+%D \enableactivediscretionaries
+%D \stoptypen
+%D
+%D which is defined as:
+
+\def\enableactivediscretionaries%
+ {\uccode`'=`'\relax \uccode`~=`~\relax \uccode`_=`_\relax
+ \uccode`(=`(\relax \uccode`)=`)\relax \uccode`==`=\relax
+ \uccode`<=`<\relax \uccode`>=`>\relax
+ \let\dotextmodediscretionary = \activedotextmodediscretionary
+ \let\dododotextmodediscretionary = \activedododotextmodediscretionary}
+
+%D We only have to redefine two macros. While saving the
+%D \type{\uccode} in a macro we have to take care of empty
+%D arguments, like in \type{||}.
+
+\def\activedotextmodediscretionary#1%
+ {\bgroup
+ \def\dodotextmodediscretionary##1#1%
+ {\def\betweendiscretionary{##1}%
+ \def\nextuccode####1####2\relax%
+ {\ifcat\noexpand####1\noexpand\relax
+ \edef\nextuccode{0}%
+ \else
+ \edef\nextuccode{\the\uccode`####1}%
+ \fi}%
+ \nextuccode##1@\relax
+ \futurelet\nextnext\dododotextmodediscretionary}%
+ \let\discretionarycommand=#1%
+ \def\textmodediscretionary{\getvalue{textmodediscretionary\string#1}}%
+ \futurelet\next\dodotextmodediscretionary}
+
+%D This time we use \type{\ifnum}:
+
+\def\activedododotextmodediscretionary%
+ {\let\nextnextnext=\egroup
+ \ifx\discretionarycommand\next
+ \checkafterdiscretionary
+ \bgroup
+ \checkbeforediscretionary
+ \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak
+ \egroup
+ \else\ifnum\uccode`==\nextuccode
+ \prewordbreak\textmodediscretionary
+ \else\ifnum\uccode`~=\nextuccode
+ \prewordbreak\discretionary{-}{}{\thinspace}\postwordbreak
+ \else\ifnum\uccode`_=\nextuccode
+ \prewordbreak\discretionary{\textmodediscretionary}
+ {\textmodediscretionary}{\textmodediscretionary}\prewordbreak
+ \else\ifnum\uccode`(=\nextuccode
+ \ifdim\lastskip>\!!zeropoint\relax
+ (\prewordbreak
+ \else
+ \prewordbreak\discretionary{}{(-}{(}\prewordbreak
+ \fi
+ \else\ifnum\uccode`)=\nextuccode
+ \ifx\nextnext\blankspace
+ \prewordbreak)\relax
+ \else
+ \prewordbreak\discretionary{-)}{}{)}\prewordbreak
+ \fi
+ \else\ifnum\uccode`'=\nextuccode
+ \prewordbreak\discretionary{-}{}{'}\postwordbreak
+ \else\ifnum\uccode`<=\nextuccode
+ \beginofsubsentence\prewordbreak\beginofsubsentencespacing
+ \else\ifnum\uccode`>=\nextuccode
+ \endofsubsentencespacing\prewordbreak\endofsubsentence
+ \else
+ \checkafterdiscretionary
+ \bgroup
+ \checkbeforediscretionary
+ \prewordbreak\hbox{\betweendiscretionary\nextnext}\allowbreak
+ \egroup
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \nextnextnext}
+
+%D Now we can safely do things like: \enableactivediscretionaries
+%D
+%D \starttypen
+%D \catcode`<=\@@active \def<{hello there}
+%D \catcode`>=\@@active \def>{hello there}
+%D \catcode`(=\@@active \def({hello there}
+%D \catcode`)=\@@active \def){hello there}
+%D \stoptypen
+%D
+%D In normal day||to||day production of texts this kind of
+%D activation is seldom used.\voetnoot{In the \CONTEXT\ manual
+%D the \type{<} and \type{>} are made active and used for some
+%D cross||reference trickery.} If so, we have to take care of
+%D the math mode explicitly, just like we did when making
+%D \type{|} active. It can be confusing too, especially when we
+%D load macropackages afterwards that make use of \type{<} in
+%D \type{\ifnum} or \type{\ifdim} statements.
+
+%D \macros
+%D {installcompoundcharacter}
+%D {}
+%D
+%D When Tobias Burnus started translating the dutch manual of
+%D \PPCHTEX\ into german, he suggested to let \CONTEXT\ support
+%D the \type{german.sty} method of handling compound
+%D characters, especially the umlaut. This package is meant for
+%D use with \PLAIN\ \TEX\ as well as \LATEX.
+%D
+%D I decided to implement compound character support as
+%D versatile as possible. As a result one can define his own
+%D compound character support, like:
+%D
+%D \starttypen
+%D \installcompoundcharacter "a {\"a}
+%D \installcompoundcharacter "e {\"e}
+%D \installcompoundcharacter "i {\"i}
+%D \installcompoundcharacter "u {\"u}
+%D \installcompoundcharacter "o {\"o}
+%D \installcompoundcharacter "s {\SS}
+%D \stoptypen
+%D
+%D or even
+%D
+%D \starttypen
+%D \installcompoundcharacter "ck {\discretionary {k-}{k}{ck}}
+%D \installcompoundcharacter "ff {\discretionary{ff-}{f}{ff}}
+%D \stoptypen
+%D
+%D The support is not limited to alphabetic characters, so the
+%D next definition is also valid.
+%D
+%D \starttypen
+%D \installcompoundcharacter ". {.\doifnextcharelse{\spacetoken}{}{\kern.125em}}
+%D \stoptypen
+%D
+%D The implementation looks familiar and uses the same tricks as
+%D mentioned earlier in this module. We take care of two
+%D arguments, which complicates things a bit.
+
+\def\@nc@{@nc@} % normal character
+\def\@cc@{@cc@} % compound character
+\def\@cs@{@cs@} % compound characters
+
+\def\installcompoundcharacter #1#2#3 #4% {{#4}} keeps move local
+ {\setvalue{\@nc@\string#1}{\char`#1}%
+ \def\!!stringa{#3}%
+ \ifx\!!stringa\empty
+ \setvalue{\@cc@\string#1\string#2}{{#4}}%
+ \else
+ \setvalue{\@cs@\string#1\string#2\string#3}{{#4}}%
+ \fi
+ \catcode`#1=\@@active
+ \scratchcounter=\the\uccode`~
+ \uccode`~=`#1
+ \uppercase{\unexpanded\def~{\handlecompoundcharacter~}}%
+ \uccode`~=\scratchcounter}
+
+%D In handling the compound characters we have to take care of
+%D \type{\bgroup} and \type{\egroup} tokens, so we end up with
+%D a multi||step interpretation macro. We look ahead for a
+%D \type{\bgroup}, \type{\egroup} or \type{\blankspace}. Being
+%D no user of this mechanism, the credits for testing them goes
+%D to Tobias Burnus, the first german user of \CONTEXT.
+%D
+%D We define these macros as \type{\long} because we can
+%D expect \type{\par} tokens. We need to look into the future
+%D with \type{\futurelet} to prevent spaces from
+%D disappearing.
+
+\def\handlecompoundcharacter#1%
+ {\def\dohandlecompoundcharacter%
+ {\ifx\next\bgroup
+ %\def\next{\dodohandlecompoundcharacter#1}% % handle "{ee} -> \"ee
+ %\let\next=\relax % forget "{ee} -> ee
+ \def\next{\handlecompoundcharacterone#1}% % ignore "{ee} -> "ee
+ \else\ifx\next\egroup
+ \let\next=\relax
+ \else\ifx\next\blankspace
+ \let\next=\relax
+ \else
+ \def\next{\dodohandlecompoundcharacter#1}%
+ \fi\fi\fi
+ \next}%
+ \futurelet\next\dohandlecompoundcharacter}
+
+\def\dodohandlecompoundcharacter#1#2%
+ {\def\dododohandlecompoundcharacter%
+ {\ifx\next\bgroup
+ \def\next{\handlecompoundcharacterone#1#2}%
+ \else\ifx\next\egroup
+ \def\next{\handlecompoundcharacterone#1#2}%
+ \else\ifx\next\blankspace
+ \def\next{\handlecompoundcharacterone#1#2}%
+ \else
+ \def\next{\handlecompoundcharactertwo#1#2}%
+ \fi\fi\fi
+ \next}%
+ \futurelet\next\dododohandlecompoundcharacter}
+
+%D Besides taken care of the grouping and space tokens, we have
+%D to deal with three situations. First we look if the next
+%D character equals the first one, if so, then we just insert
+%D the original. Next we look if indeed a compound character is
+%D defined. We either execute the compound character or just
+%D insert the first. So we have
+%D
+%D \starttypen
+%D <key><key> <key><known> <key><unknown>
+%D \stoptypen
+%D
+%D In later modules we will see how these commands are used.
+
+\long\def\handlecompoundcharacterone#1#2%
+ {\ifx#1#2%
+ \def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}}%
+ \else
+ \expandafter\ifx\csname\@cc@\string#1\string#2\endcsname\relax
+ \def\next{\getvalue{\@nc@\string#1}#2}%
+ \else
+ \def\next{\getvalue{\@cc@\string#1\string#2}}%
+ \fi
+ \fi
+ \next}
+
+\long\def\handlecompoundcharactertwo#1#2#3%
+ {\ifx#1#2%
+ \def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}#3}%
+ \else
+ \@EA\ifx\csname\@cs@\string#1\string#2\string#3\endcsname\relax
+ \expandafter\ifx\csname\@cc@\string#1\string#2\endcsname\relax
+ \def\next{\getvalue{\@nc@\string#1}#2#3}%
+ \else
+ \def\next{\getvalue{\@cc@\string#1\string#2}#3}%
+ \fi
+ \else
+ \def\next{\getvalue{\@cs@\string#1\string#2\string#3}}%
+ \fi
+ \fi
+ \next}
+
+%D \macros
+%D {midworddiscretionary}
+%D
+%D If needed, one can add a discretionary hyphen using \type
+%D {\midworddiscretionary}. This macro does the same as
+%D \PLAIN\ \TEX's \type {\-}, but, like the ones implemented
+%D earlier, this one also looks ahead for spaces and grouping
+%D tokens.
+
+\def\domidworddiscretionary%
+ {\ifx\next\blankspace\else
+ \ifx\next\bgroup \else
+ \ifx\next\egroup \else
+ \discretionary{-}{}{}%
+ \fi\fi\fi}
+
+\def\midworddiscretionary%
+ {\futurelet\next\domidworddiscretionary}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/supp-mis.tex b/tex/context/base/supp-mis.tex deleted file mode 100644 index 500eb31ee..000000000 --- a/tex/context/base/supp-mis.tex +++ /dev/null @@ -1,400 +0,0 @@ -%D \module
-%D [ file=supp-mis,
-%D version=1997.01.04,
-%D title=\CONTEXT\ Support Macros,
-%D subtitle=Missing (For Generic Use),
-%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.
-
-%D Some support modules are more or less independant. This
-%D module, which is not part of plain \CONTEXT, provides the
-%D missing macros and declarations of registers.
-
-%D \macros
-%D {ifnocontextobject}
-%D {}
-%D
-%D First we take care of redundant defining. The next set of
-%D macros are a bit complicated by the fact that Plain
-%D \TEX\ defines the \type{\new}||macros as being outer.
-%D Furthermore nested \type{\if}'s can get us into
-%D trouble.
-
-\def\definecontextobject%
- {\iftrue}
-
-\def\gobblecontextobject%
- {\setbox0=\hbox
- \bgroup
- \long\def\gobblecontextobject##1\fi{\egroup}%
- \expandafter\gobblecontextobject\string}
-
-\def\ifnocontextobject#1\do%
- {\ifx#1\undefined
- \let\next=\definecontextobject
- \else
- %\writestatus{system}{beware of conflicting \string#1}%
- \let\next=\gobblecontextobject
- \fi
- \next}
-
-%D \macros
-%D {writestatus}
-%D {}
-%D
-%D We start each module with a message. Normally the output is
-%D formatted, but here we keep things simple.
-
-\ifnocontextobject \writestatus \do
-
- \def\writestatus#1#2%
- {\immediate\write16{#1 : #2}}
-
-\fi
-
-%D Lets see if it works.
-
-\writestatus{loading}{Context Support Macros / Missing}
-
-%D \macros
-%D {protect,unprotect}
-%D {}
-%D
-%D Next we present a poor mans alternative for \type{\protect}
-%D and \type{\unprotect}, two commands that enable us to use
-%D the characters \type{@}, \type{!} and \type{?} in macro
-%D names.
-
-\ifnocontextobject \protect \do
-
- \let\protect=\relax
-
-\fi
-
-\ifnocontextobject \unprotect \do
-
- \newcount\protectiondepth
-
- \def\unprotect%
- {\advance\protectiondepth 1
- \ifnum\protectiondepth=1
- \let\normalprotect=\protect
- \def\protect%
- {\ifnum\protectiondepth>0
- \advance\protectiondepth -1
- \ifnum\protectiondepth=0
- \doprotect
- \let\protect=\normalprotect
- \fi
- \fi}
- \edef\doprotect%
- {\catcode`@=\the\catcode`@\relax
- \catcode`!=\the\catcode`!\relax
- \catcode`?=\the\catcode`?\relax}
- \catcode`@=11
- \catcode`!=11
- \catcode`?=11
- \fi}
-
-\fi
-
-%D We start using this one it at once.
-
-\unprotect
-
-%D \macros
-%D {scratch...,if...,next...}
-%D {}
-%D
-%D We need some scratch registers. Users are free to use them,
-%D but can never be sure of their value once another macro is
-%D called. We only allocate things when they are yet
-%D undefined. This way we can't mess up other macro packages,
-%D but of course previous definitions can mess up our modules.
-
-\ifnocontextobject \scratchcounter \do \newcount \scratchcounter \fi
-\ifnocontextobject \scratchdimen \do \newdimen \scratchdimen \fi
-\ifnocontextobject \scratchskip \do \newskip \scratchskip \fi
-\ifnocontextobject \scratchmuskip \do \newmuskip \scratchmuskip \fi
-\ifnocontextobject \scratchbox \do \newbox \scratchbox \fi
-\ifnocontextobject \scratchread \do \newread \scratchread \fi
-\ifnocontextobject \scratchwrite \do \newwrite \scratchwrite \fi
-
-\ifnocontextobject \nextbox \do \newbox \nextbox \fi
-
-\ifnocontextobject \nextdepth \do \newdimen \nextdepth \fi
-
-\ifnocontextobject \CONTEXTtrue \do \newif\ifCONTEXT \fi
-\ifnocontextobject \donetrue \do \newif\ifdone \fi
-\ifnocontextobject \eightbitcharacterstrue \do \newif\ifeightbitcharacters \fi
-
-%D \macros
-%D {@@...}
-%D {}
-%D
-%D We use symbolic name for \CATCODES. They can only be used
-%D when we are in unprotected state.
-
-\ifnocontextobject \@@escape \do \chardef\@@escape = 0 \fi
-\ifnocontextobject \@@begingroup \do \chardef\@@begingroup = 1 \fi
-\ifnocontextobject \@@endgroup \do \chardef\@@endgroup = 2 \fi
-\ifnocontextobject \@@endofline \do \chardef\@@endofline = 5 \fi
-\ifnocontextobject \@@ignore \do \chardef\@@ignore = 9 \fi
-\ifnocontextobject \@@space \do \chardef\@@space = 10 \fi
-\ifnocontextobject \@@letter \do \chardef\@@letter = 11 \fi
-\ifnocontextobject \@@other \do \chardef\@@other = 12 \fi
-\ifnocontextobject \@@active \do \chardef\@@active = 13 \fi
-\ifnocontextobject \@@comment \do \chardef\@@comment = 14 \fi
-
-%D \macros
-%D {everyline,EveryLine,EveryPar}
-%D {}
-%D
-%D In \CONTEXT\ we use \type{\everypar} for special purposes
-%D and provide \type{\EveryPar} as an alternative. The same
-%D goes for \type{\everyline} and \type{\EveryLine}.
-
-\ifnocontextobject \everyline \do \newtoks\everyline \fi
-\ifnocontextobject \EveryPar \do \let\EveryPar =\everypar \fi
-\ifnocontextobject \EveryLine \do \let\EveryLine=\everyline \fi
-
-%D \macros
-%D {!!...}
-%D {}
-%D
-%D We reserve ourselves some scratch strings (i.e. macros)
-%D and some more counters.
-
-\ifnocontextobject \!!stringa \do \def\!!stringa {} \fi
-\ifnocontextobject \!!stringb \do \def\!!stringb {} \fi
-\ifnocontextobject \!!stringc \do \def\!!stringc {} \fi
-\ifnocontextobject \!!stringd \do \def\!!stringd {} \fi
-
-\ifnocontextobject \!!counta \do \newcount\!!counta {} \fi
-\ifnocontextobject \!!countb \do \newcount\!!countb {} \fi
-
-%D \macros
-%D {!!...}
-%D {}
-%D
-%D The next set of definitions speed up processing a bit.
-%D Furthermore it saves memory.
-
-\ifnocontextobject \!!zeropoint \do \def\!!zeropoint {0pt} \fi
-\ifnocontextobject \!!tenthousand \do \def\!!tenthousand {10000} \fi
-
-\ifnocontextobject \!!width \do \def\!!width {width} \fi
-\ifnocontextobject \!!height \do \def\!!height {height} \fi
-\ifnocontextobject \!!depth \do \def\!!depth {depth} \fi
-
-\ifnocontextobject \!!plus \do \def\!!plus {plus} \fi
-\ifnocontextobject \!!minus \do \def\!!minus {minus} \fi
-
-%D \macros
-%D {smashbox}
-%D {}
-%D
-%D The system modules offer a range of smashing macros, of
-%D which we only copied \type{\smashbox}.
-
-\ifnocontextobject \smashbox \do
-
- \def\smashbox#1%
- {\wd#1=\!!zeropoint
- \ht#1=\!!zeropoint
- \dp#1=\!!zeropoint}
-
-\fi
-
-%D \macros
-%D {dowithnextbox}
-%D {}
-%D
-%D Also without further comment, we introduce a macro that
-%D gets the next box and does something usefull with it.
-%D Because the \type{\afterassignment} is executed inside the
-%D box, we have to use a \type{\aftergroup} too.
-
-\ifnocontextobject \dowithnextbox \do
-
- \def\dowithnextbox#1%
- {\def\dodowithnextbox{#1}%
- \afterassignment\dododowithnextbox
- \setbox\nextbox}
-
- \def\dododowithnextbox%
- {\aftergroup\dodowithnextbox}
-
-\fi
-
-%D \macros
-%D {setvalue,getvalue,letvalue,setgvalue}
-%D {}
-%D
-%D The next two macros expand their argument to
-%D \type{\argument}. The first one is used to define macro's
-%D the second one executes them.
-
-\ifnocontextobject \setvalue \do
-
- \def\setvalue #1{\expandafter\def\csname#1\endcsname}
- \def\getvalue #1{\csname#1\endcsname}
- \def\letvalue #1{\expandafter\let\csname#1\endcsname}
- \def\setgvalue#1{\expandafter\gdef\csname#1\endcsname}
-
-\fi
-
-%D \macros
-%D {unexpanded}
-%D {}
-%D
-%D The next command can be used as prefixed for commands that
-%D need protection during tests and writing to files. This
-%D is a very \CONTEXT\ specific one.
-
-\ifnocontextobject \unexpanded \do
-
- \let\unexpanded=\relax
-
-\fi
-
-%D \macros
-%D {convertargument}
-%D {}
-%D
-%D The original one offers a bit more, like global assignment, the
-%D the next implementation is however a bit more byte saving.
-
-\ifnocontextobject \convertargument \do
-
- \def\doconvertargument#1>{}
-
- \long\def\convertargument#1\to#2%
- {\long\def\convertedargument{#1}%
- \edef#2{\expandafter\doconvertargument\meaning\convertedargument}}
-
-\fi
-
-%D \macros
-%D {forgetall}
-%D {}
-%D
-%D Sometimes we have to disable interference of whatever kind
-%D of skips and mechanisms. The next macro resets some.
-
-\ifnocontextobject \forgetall \do
-
- \def\forgetall%
- {\parskip\!!zeropoint
- \leftskip\!!zeropoint
- \parindent\!!zeropoint
- \everypar{}}
-
-\fi
-
-%D \macros
-%D {withoutpt}
-%D {}
-%D
-%D \TEX\ lacks some real datastructure. We can however use
-%D \DIMENSIONS. This kind of trickery is needed when we want
-%D \TEX\ to communicate with the outside world (by means of
-%D \type{\specials}).
-
-\ifnocontextobject \withoutpt \do
-
- {\catcode`\.=\@@other
- \catcode`\p=\@@other
- \catcode`\t=\@@other
- \gdef\WITHOUTPT#1pt{#1}}
-
- \def\withoutpt#1%
- {\expandafter\WITHOUTPT#1}
-
- \def\ScaledPointsToBigPoints#1#2%
- {\scratchdimen=#1sp\relax
- \scratchdimen=.996264\scratchdimen
- \edef#2{\withoutpt{\the\scratchdimen}}}
-
-\fi
-
-%D \macros
-%D {doprocessfile}
-%D {}
-%D
-%D This macro takes three arguments: the file number, the
-%D filename and a macro that handles the content of a read
-%D line.
-
-\ifnocontextobject \doprocessfile \do
-
- \def\doprocessfile#1#2#3%
- {\openin#1=#2\relax
- \def\doprocessline%
- {\ifeof#1%
- \def\doprocessline{\closein#1}%
- \else
- \read#1 to \fileline
- #3\relax
- \fi
- \doprocessline}%
- \doprocessline}
-
-\fi
-
-%D \macros
-%D {uncatcodespecials}
-%D {}
-%D
-%D This one is taken from the \TEX\ book. The \CONTEXT\
-%D alternative is a bit different, but we hope this one works
-%D here.
-
-\ifnocontextobject \uncatcodespecials \do
-
- \def\uncatcodespecials%
- {\def\do##1{\catcode`##1=12 }\dospecials}
-
-\fi
-
-%D \macros
-%D {doglobal}
-%D
-%D Some \CONTEXT\ low level macros can have a \type{\doglobal}
-%D prefix. Let's just forget about that here:
-
-\ifnocontextobject \doglobal \do \let\doglobal=\relax \fi
-
-%D The next obscure one is needed in the generic verbatim
-%D environment. When we end up with more of these, it's time
-%D to load the module \type{syst-gen}.
-
-\ifnocontextobject \doifincsnameelse \do
-
- \def\v!ifincsnameelse#1#2%
- {\def\c!ifincsnameelse##1#1##2##3\war%
- {\csname\if##2@iffalse\else iftrue\fi\endcsname}%
- \expandafter\c!ifincsnameelse#2#1@@\war}
-
- \long\def\doifincsnameelse#1#2#3#4%
- {\edef\@@instring{#1}%
- \expandafter\v!ifincsnameelse\expandafter{\@@instring}{#2}%
- #3%
- \else
- #4%
- \fi}
-
-\fi
-
-%D That's it. Please forget this junk and take a look at how
-%D it should be done.
-
-\protect
-
-\endinput
-
\ No newline at end of file diff --git a/tex/context/base/supp-mps.tex b/tex/context/base/supp-mps.tex index 95a51991f..d3a0e2115 100644 --- a/tex/context/base/supp-mps.tex +++ b/tex/context/base/supp-mps.tex @@ -1,864 +1,865 @@ -%D \module -%D [ file=supp-mps, -%D version=1997.07.05, -%D title=\CONTEXT\ Support Macros, -%D subtitle=\METAPOST\ Inclusion, -%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. - -% E-tex : a primitive that tells us that \write18 works -% E-tex : \executeMetaPost filename -% ConTeXt : automatic flush at end of job - -% The MP generation support is still experimental. - -%D \METAPOST\ is John Hobbys alternative for \METAFONT\ and -%D produces superior \POSTSCRIPT\ code. In this module we -%D integrate \METAPOST\ support int \CONTEXT. We offer two -%D tracks: -%D -%D \startopsomming -%D \som generating \METAPOST\ code, running this program from -%D within \TEX\ using \type{\write18}, and importing the -%D result -%D \som generating \METAPOST\ code, processing the code -%D afterward, and importing the result in a second pass -%D \stopopsomming -%D -%D The first approach uses a non standard \TEX\ feature, -%D implemented in Web2c. I'm not going to discuss the pros and -%D cons of running programs from within others, but all -%D arguments against this can be overcome by implementing a -%D \TEX\ worthy primitive: -%D -%D \starttypen -%D \excuteMetaPost filename -%D \stoptypen -%D -%D Ok then, let's start: - -\ifx \undefined \writestatus \input supp-mis.tex \relax \fi - -\writestatus{loading}{Context Support Macros / MetaPost Inclusion} - -\unprotect - -%D \macros -%D {startMPgraphic} -%D -%D From within \TEX\ one can execute \METAPOST\ code by putting -%D it between the two commands -%D -%D \starttypen -%D \startMPgraphic -%D \stopMPgraphic -%D \stoptypen -%D -%D This is implemented as: - -\long\def\startMPgraphic#1\stopMPgraphic% - {\startwritingMPgraphic - \writeMPgraphic{#1}% - \stopwritingMPgraphic} - -%D \macros -%D {startMPrun} -%D -%D If we just wat to run \METAPOST\ code, that is, not to -%D explictly generate a figure in terms of \type{beginfig} and -%D \type{endfig}, we can use: -%D -%D \starttypen -%D \startMPgraphic -%D \stopMPgraphic -%D \stoptypen -%D -%D \starttypen -%D \startMPrun -%D \stopMPrun -%D \stoptypen -%D -%D The next boolean is for internal purposes only. - -\newif\ifMPrun \MPrunfalse - -\long\def\startMPrun#1\stopMPrun% geeft nog conflicten met nummer! - {\MPruntrue - \startwritingMPgraphic - \writeMPgraphic{#1}% - \stopwritingMPgraphic - \MPrunfalse} - -%D \macros -%D {startwritingMPgraphic, -%D writeMPgraphic, -%D stopwritingMPgraphic} -%D -%D If the writing process is divided into more steps, one can -%D use the components of this macro directly. -%D -%D \starttypen -%D \startwritingMPgraphic -%D ... -%D \writeMPgraphic{...} -%D ... -%D \writeMPgraphic{...} -%D ... -%D \stopwritingMPgraphic -%D \stoptypen - -%D \macros -%D {ifrunMPgraphics} -%D -%D These macros look a bit more complicated that one would -%D expect at first sight. This is due to the two ways of -%D processing these graphics, mentioned in a previous -%D paragraph. Which method is used, the direct or indirect -%D one, depends on a boolean. - -\newif\ifrunMPgraphics - -%D If set to true, one can do with a single pass, else one must -%D process the \METAPOST\ file \type{mpgraph} between two -%D succesive \TEX\ runs. - -\def\MPgraphicfile{mpgraph} - -%D \macros -%D {MPgraphic} -%D -%D When we run \METAPOST\ from within \TEX, each graphic is -%D processed at once, which means that we reuse this file many -%D times. When however the execution is delayed, all graphics -%D are saved in a separate figure. The current graphic is -%D characterized bij a \COUNTER. This counter is available -%D in \type{\MPgraphic}. - -\newcount\currentMPgraphic - -\def\MPgraphic{0} - -%D \macros -%D {ifreuseMPgraphics} -%D -%D If one want to reuse grapics, one can save much redundant -%D run time by setting the next switch to true. - -\newif\ifreuseMPgraphics - -%D The three macros responsible for writing the graphic -%D implement both schemes. - -%D \macros -%D {MPinclusions, startMPinclusions} -%D -%D One can include for instance common input commands by -%D passing them to \type{\MPinclusions}: -%D -%D \starttypen -%D \MPinclusions{input tools} -%D \stoptypen - -\let\theMPinclusions=\empty - -\long\def\startMPinclusions#1\stopMPinclusions% - {\long\def\theMPinclusions{\writeMPgraphic{#1}}} - -\long\def\MPinclusions#1% - {\startMPinclusions#1\stopMPinclusions} - -%D \macros -%D {iflongMPlines} -%D -%D When grabbing a graphic deifnition, newlines are turned -%D into spaces. By default we split the graphic definition -%D at the colon, but long lines are still possible by -%D setting the next boolean to true. - -\newif\iflongMPlines - -\long\def\writeMPgraphic#1% - {\bgroup - \iflongMPlines - \let\par=\empty - \long\def\flush##1##2\par% - {\ifx##1\relax \else - \immediate\write\scratchwrite{##1##2}% - \expandafter\flush - \fi}% - \flush#1\empty\par\relax\par - \else - \long\def\flush##1##2;% - {\ifx##1\relax \else - \dowriteMPgraphicline##1##2btex\relax etex\end - \expandafter\flush - \fi}% - \flush#1\empty;\relax;% - \fi - \egroup} - -%D The \type{;} aware method (the \type{\else} branch) also -%D takes care of \type{btex}||\type{etex} bound data. - -\def\dowriteMPgraphicline% - {\futurelet\next\dodowriteMPgraphicline} - -\long\def\dodowriteMPgraphicline#1btex#2#3etex#4\end% - {\ifx\next\empty\else\ifx\next\relax\else - \bgroup - \let\par=\empty - \ifx#2\relax - \immediate\write\scratchwrite{#1;}% - \egroup - \else - \convertargument#2#3\to\ascii - \immediate\write\scratchwrite{#1btex \ascii etex;}% - \egroup - \dowriteMPgraphicline#4btex\relax etex\end - \fi - \fi\fi} - -%D This stripper is suboptimal in the sense that more -%D \type{;}'s are output than feasible. Anyhow, \METAPOST\ -%D can handle this and users may consider it being a sort -%D of error prevention bonus. - -\def\writeMPgraph% - {\immediate\write\scratchwrite{mpgraph:=\the\currentMPgraphic;}} - -\def\startwritingMPgraphic% - {\ifrunMPgraphics - \ifMPrun \else \ifreuseMPgraphics \else - \global\currentMPgraphic=0 - \fi \fi - \global\advance\currentMPgraphic by 1 - \xdef\MPgraphic{\the\currentMPgraphic}% - \immediate\openout\scratchwrite=\MPgraphicfile.mp - \writeMPgraph - \theMPinclusions - \else - \global\advance\currentMPgraphic by 1 - \xdef\MPgraphic{\the\currentMPgraphic}% - \ifnum\currentMPgraphic=1 - \immediate\openout\scratchwrite=\MPgraphicfile.mp - \writeMPgraph - \theMPinclusions - \fi - \fi - \ifMPrun \else - \immediate\write\scratchwrite{beginfig(\the\currentMPgraphic);}% - \fi - \global\let\flushMPgraphics\dodostopwritingMPgraphic - \global\let\stopwritingMPgraphic=\dostopwritingMPgraphic} - -\def\dostopwritingMPgraphic% - {\ifMPrun \else - \immediate\write\scratchwrite{endfig;}% - \fi - \ifrunMPgraphics - \dodostopwritingMPgraphic - \fi} - -\def\dodostopwritingMPgraphic% - {\ifnum\currentMPgraphic>0 - \immediate\write\scratchwrite{end.}% - \immediate\closeout\scratchwrite - \runMPgraphic{\MPgraphicfile}% - \fi - \global\let\flushMPgraphics=\relax} - -\let\stopwritingMPgraphic=\relax -\let\flushMPgraphics =\relax - -%D \macros -%D {flushMPgraphics} -%D -%D When we use the indirect method, all graphics are saved in -%D one file. This means that we cannot close this file after -%D every \type{\stopMPgraphic}. Therefore we need to say: -%D -%D \starttypen -%D \flushMPgraphic -%D \stoptypen -%D -%D else the file is closed without writing the \METAPOST\ end -%D command. One will notice this fast enough when in indirect -%D mode. When using the direct mode this command is not -%D implicitly needed, but ommiting it makes files less -%D portable. - -%D \macros -%D {loadcurrentMPgraphic, -%D placeMPgraphic} -%D -%D Once defined, we can call for this graphic by saying: -%D -%D \starttypen -%D \loadcurrentMPgraphic{setups} -%D \placeMPgraphic -%D \stoptypen -%D -%D This two stage insert permits some intermediate manipulations -%D of the graphic, which temporary saved in: - -\newbox\MPgraphicbox - -\def\loadcurrentMPgraphic#1% - {\loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{#1}} - -\def\loadMPgraphic#1#2% - {\setbox\MPgraphicbox=\hbox{\insertMPfile{#1}{#2}}} - -\def\placeMPgraphic% - {\box\MPgraphicbox} - -%D \macros -%D {startreusableMPgraphic, reuseMPgraphic, useMPbox} -%D -%D One can use the next macro for defining graphics that are -%D to be reused. When the next switch is set, graphics are -%D cached. - -\newif\ifuseMPbox % nog eens cyclische buffer - -\def\douseMPbox#1% - {\setobject{#1} - \vbox - {\loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}% - \placeMPgraphic}% - \setgvalue{#1}% - {\getobject{#1}}} - -\def\nouseMPbox#1% - {\setxvalue{#1}% - {\noexpand\loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}% - \noexpand\placeMPgraphic}} - -\ifCONTEXT \else \let\douseMPbox=\nouseMPbox \fi - -\long\def\startreusableMPgraphic#1#2\stopreusableMPgraphic% - {\reuseMPgraphicstrue - \doifundefined{MP:#1} - {\startMPgraphic#2\stopMPgraphic - \ifuseMPbox - \douseMPbox{MP:#1}% - \else - \nouseMPbox{MP:#1}% - \fi}} - -\def\reuseMPgraphic#1% - {\getvalue{MP:#1}} - -%D \macros -%D {startuseMPgraphic,useMPgraphic} -%D -%D The every||time||it's||used original one is defined below. -%D This one makes sense when the graphic uses random numbers. - -\long\def\startuseMPgraphic#1#2\stopuseMPgraphic% - {\reuseMPgraphicstrue - \long\setgvalue{MP:#1}% - {\startMPgraphic#2\stopMPgraphic - \loadcurrentMPgraphic{}% - \placeMPgraphic}} - -\let\useMPgraphic=\reuseMPgraphic - -%D We didn't yet define the macro responsible for processing -%D the graphic from within \TEX. - -\def\runMPgraphic#1% - {\ifrunMPgraphics - \executeMETAPOST{#1}% - \else - \message{[flush and process \MPgraphicfile.mp afterwards]}% - \fi} - -%D \macros -%D {executeMetaPost, executeMETAPOST, executesystemcommand} -%D -%D With \type{\executeMETAPOST} being defined as: - -\ifx\undefined\executeMetaPost - \def\executeMETAPOST#1{\executesystemcommand{\executeMetaPost{#1}}} -\fi - -%D There are two system dependant definitions: - -\ifx\undefined\executesystemcommand - \def\executesystemcommand#1{\immediate\write18{#1}} -\fi - -\ifx\undefined\executeMetaPost - \def\executeMetaPost#1{mpost #1} -\fi - -%D \macros -%D {insertMPfile} -%D -%D One can define this command in advance or redefine it after -%D loading this module. The same goes for the forward -%D reference to the figure loading macro: - -\ifx\undefined\insertMPfile - - \def\insertMPfile#1#2% - {\ifx\undefined\externalfigure - \message{[insert file #1 here]}% - \else - \externalfigure[#1][\c!type=eps,\c!methode=mps,#2]% - \fi} - -\fi - -%D This macro takes {\em two} arguments, the second one can be -%D used to pass info to the inclusion macro. Some examples -%D of its use can be found in the modules \type{supp-tpi} and -%D \type{prag-log}. - -%D This module can be used in \PLAIN\ \TEX too. When using -%D \DVIPS, just try to process: -%D -%D \starttypen -%D \input supp-mps -%D -%D \runMPgraphicstrue -%D -%D \def\insertMPfile#1#2% -%D {\special{psfile=#1}} -%D -%D \startuseMPgraphic{1} -%D prologues := 1; -%D draw (0,0) withpen pencircle scaled 100; -%D \stopuseMPgraphic -%D -%D \useMPgraphic{1} -%D \stoptypen -%D -%D Don't forget to enable \type{\write18}. When does not say -%D \type{\runMPgraphicstrue}, the \METAPOST\ scratch file -%D must be closed by saying -%D -%D \starttypen -%D \flushMPgraphics -%D \stoptypen -%D -%D When using the indirect method, one has to process the file -%D \type{mpgraph.mp} between two successive \TEX\ runs. - -%D For some reason, \METAPOST\ needs the public domain \DVI\ to -%D \POSTSCRIPT\ converter \DVIPS. This symbiosis originates in -%D the need to include the fonts (glyphs) that \METAPOST\ uses -%D in the \POSTSCRIPT\ file. Driver independancy was one of my -%D prerequisites for using \METAPOST, so I decided to build -%D this kind of support myself. Personally I consider driver -%D dependancy a drawback for the dissemination of such a -%D package. The second part of this module more or less -%D decouples \METAPOST\ and \DVIPS. -%D -%D The macros hereafter are copied from the module -%D \type{m-metapost}. After writing module \type{supp-pdf} I -%D added this method to the module named and after a while -%D decided to hook it into module \type{spec-yy}. Therefore -%D they made it into a support module, but in a slightly -%D different way. - -%D \macros -%D {includeMPfonts, ifincludeMPfonts} -%D {} -%D -%D The method we use is both robust and simple: one can do -%D with calling the next macro with the filename as argument: -%D -%D \starttypen -%D \includeMPfonts{filename} -%D \stoptypen -%D -%D We can turn of this mechanism with: -%D -%D \starttypen -%D \includeMPfontsfalse -%D \stoptypen - -\newif\ifincludeMPfonts \includeMPfontstrue - -\def\includeMPfonts#1% - {\ifincludeMPfonts - \bgroup - \message{[MP fonts #1]}% - %\uncatcodespecials - \endlinechar=-1 - \setMPspecials - \obeyMPspecials - \setbox0=\hbox - {\hskip-\maxdimen - \doprocessfile\scratchread{#1}\handleMPfont}% - \smashbox0 - \box0 - \egroup - \fi} - -\def\UseMetaPostGraphic {\includeMPfonts} % upward compatible -\def\DontUseMetaPostGraphics {\includeMPfontsfalse} % upward compatible - -%D The characters are collected in a box and moved as far as -%D possible into the left margin. The resulting box has no -%D dimensions and can be prepended (appended) to the special -%D that handles the inclusion. The characters are in the file -%D but made invisible. - -%D We scan the graphics file for the \type{fshow} operator, -%D that is, lines that start with \type{(}. If found it -%D interprets the line, which looks like: -%D -%D \starttypen -%D (string ... string) font size fshow -%D \stoptypen -%D -%D Font definitions specified in the preamble are simply -%D ignored. Only lines starting with \type{(} are interpreted. - -\def\dohandleMPfont#1#2\relax% - {\if#1(% - \expandafter\includeMPcharacters\fileline\relax - \fi} - -\def\handleMPfont% - {\expandafter\dohandleMPfont\fileline\relax} - -%D Before we start scanning for data, we first change some -%D \CATCODES. The first set of macro's is copied from module -%D \type{supp-pdf}. This scheme is a bit overdone for this -%D module, but using the same macros saves us some memory. - -\def\octalMPcharacter#1#2#3% - {\char'#1#2#3\relax} - -\bgroup -\catcode`\|=\@@comment -\catcode`\%=\@@active -\catcode`\[=\@@active -\catcode`\]=\@@active -\catcode`\{=\@@active -\catcode`\}=\@@active -\catcode`B=\@@begingroup -\catcode`E=\@@endgroup -\gdef\ignoreMPspecials| - B\def%BE| - \def[BE| - \def]BE| - \def{BE| - \def}BEE -\gdef\obeyMPspecials| - B\def%B\char 37\relax E| - \def[B\char 91\relax E| - \def]B\char 93\relax E| - \def{B\char123\relax E| - \def}B\char125\relax EE -\gdef\setMPspecials| - B\catcode`\%=\@@active - \catcode`\[=\@@active - \catcode`\]=\@@active - \catcode`\{=\@@active - \catcode`\}=\@@active - \catcode`\$=\@@letter - \catcode`\_=\@@letter - \catcode`\#=\@@letter - \catcode`\^=\@@letter - \catcode`\&=\@@letter - \catcode`\|=\@@letter - \catcode`\~=\@@letter - \def\(B\char40\relax E| - \def\)B\char41\relax E| - \def\\B\char92\relax E| - \def\0B\octalMPcharacter0E| - \def\1B\octalMPcharacter1E| - \def\2B\octalMPcharacter2E| - \def\3B\octalMPcharacter3E| - \def\4B\octalMPcharacter4E| - \def\5B\octalMPcharacter5E| - \def\6B\octalMPcharacter6E| - \def\7B\octalMPcharacter7E| - \def\8B\octalMPcharacter8E| - \def\9B\octalMPcharacter9EE -\egroup - -%D The lines starting with \type{(} are interpreted and -%D handled by - -\def\includeMPcharacters(#1) #2 #3 #4\relax% - {\font\temp=#2 at #3bp\temp#1} - -%D This method is both robust and reasonable fast. The only -%D disadvantage is that when not embedded properly in the -%D graphics inclusion macros, one has to load all graphics by -%D hand. - -%D Now let's see if things work all right and show the example -%D files that are part of the \METAPOST\ distribution: -%D -%D \startregelcorrectie -%D \steluitlijnenin[midden] -%D \leavevmode -%D \startcombinatie[3*3] -%D {\externfiguur[mp-exa-1][methode=mps,kader=aan,breedte=.2\hsize]} {} -%D {\externfiguur[mp-exa-2][methode=mps,kader=aan,breedte=.2\hsize]} {} -%D {\externfiguur[mp-exa-3][methode=mps,kader=aan,breedte=.2\hsize]} {} -%D {\externfiguur[mp-exa-4][methode=mps,kader=aan,breedte=.2\hsize]} {} -%D {\externfiguur[mp-exa-5][methode=mps,kader=aan,breedte=.2\hsize]} {} -%D {\externfiguur[mp-exa-6][methode=mps,kader=aan,breedte=.2\hsize]} {} -%D {\externfiguur[mp-exa-7][methode=mps,kader=aan,breedte=.2\hsize]} {} -%D {\externfiguur[mp-exa-8][methode=mps,kader=aan,breedte=.2\hsize]} {} -%D {\externfiguur[mp-exa-9][methode=mps,kader=aan,breedte=.2\hsize]} {} -%D \stopcombinatie -%D \stopregelcorrectie -%D -%D Here we used calls like: -%D -%D \starttypen -%D \externfiguur[mp-exa-1][methode-mps,kader=aan,breedte=.2\hsize] -%D \stoptypen - -%D \macros -%D {convertMPcolors, -%D ifconvertMPcolors,ifreduceMPcolors,ifforceMPcolors} -%D -%D When I told the editors that I wanted to use colored -%D \METAPOST\ graphics in the color issue of the \MAPS, I was -%D asked to use the \kap{CMYK} colorspace instead of \kap{RGB} -%D one. However, \METAPOST\ only supports \kap{RGB} colors. I -%D decided to write a utility to convert the \type -%D {setrgbcolor} operators into \type {setcmykcolor} ones, and -%D some experiments showed me that I could best let \TEX\ do it -%D itself. Here it is: -%D -%D There are two booleans that control the conversion process. -%D These are false by default. - -\newif\ifconvertMPcolors -\newif\ifreduceMPcolors -\newif\ifforcegrayMPcolors - -%D The main macro is calles as: -%D -%D \starttypen -%D \convertMPcolors{filename} -%D \stoptypen -%D -%D When active, this macro returns a message saying if indeed -%D conversion took place. The old file is overwritten! This -%D saves time in a succesive passes and can't harm, simply -%D because MP can generate them anew. - -\def\convertMPcolorpath{} % {./} -\def\convertMPcolorfile{metacmyk.eps} - -\def\convertMPcolors#1% - {\bgroup - \ifforcegrayMPcolors - \donetrue - \else\ifconvertMPcolors - \donetrue - \else - \donefalse - \fi\fi - \ifdone - \message{[MP color conversion #1}% - \endlinechar=-1 - \uncatcodespecials - \donefalse - \immediate\openout\scratchwrite=\convertMPcolorpath\convertMPcolorfile - \doprocessfile\scratchread{#1}\handleMPcolor - \immediate\closeout\scratchwrite - \ifdone - \immediate\openout\scratchwrite=\convertMPcolorpath#1 - \doprocessfile\scratchread{\convertMPcolorpath \convertMPcolorfile}\handleMPcopy - \immediate\closeout\scratchwrite - \message{done]}% - \else - \message{not needed]}% - \fi - \immediate\openout\scratchwrite=\convertMPcolorpath\convertMPcolorfile - \immediate\closeout\scratchwrite - \fi - \egroup} - -%D The process is rather simple: read a line, look for the -%D \type {setrgbcolor} operator, recalculate the components and -%D check for gray reduction or black removal, write the result -%D to a temporary file, and go on. Afterwards, the file is -%D copied back. We don't have to reduce to gray scales; -%D \METAPOST\ already takes care of that. - -\def\handleMPcolor - {\expandafter\dohandleMPcolor\fileline setrgbcolor*\\} - -\def\dohandleMPcolor#1setrgbcolor#2#3\\% - {\if#2*% - \immediate\write\scratchwrite{#1}% - \else - \dodohandleMPcolor#1setrgbcolor#2#3\\% - \fi} - -\def\dodohandleMPcolor#1 #2 #3setrgbcolor#4setrgbcolor*\\% - {\bgroup - \ifforcegrayMPcolors - \convertRGBtoGRAY{#1}{#2}{#3}% - \immediate\write\scratchwrite - {\@@cl@@s \space setgray #4}% - \else - \dimen0=1pt \advance\dimen0 by -#1pt - \dimen2=1pt \advance\dimen2 by -#2pt - \dimen4=1pt \advance\dimen4 by -#3pt - \ifreduceMPcolors - \dimen6=\dimen0 - \ifdim\dimen2<\dimen6 \dimen6=\dimen2 \fi - \ifdim\dimen4<\dimen6 \dimen6=\dimen4 \fi - \advance\dimen0 by -\dimen6 - \advance\dimen2 by -\dimen6 - \advance\dimen4 by -\dimen6 - \else - \dimen6=\!!zeropoint - \fi - \immediate\write\scratchwrite - {\withoutpt{\the\dimen0} \space - \withoutpt{\the\dimen2} \space - \withoutpt{\the\dimen4} \space - \withoutpt{\the\dimen6} \space setcmykcolor #4}% - \fi - \egroup - \donetrue} % needed for message - -\def\handleMPcopy% - {\immediate\write\scratchwrite{\fileline}} - -%D The next macro is needed for forced conversion. This macro -%D is copied from \type{colo-ini}, just in case one uses this -%D module outside \CONTEXT. - -\ifx\convertRGBtoGRAY\undefined - - \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}} - -\fi - -%D The next examples show the color conversion macros in -%D action. These examples also demonstrate in||text \METAPOST\ -%D handling. As we will see, the conversion is hooked into the -%D \CONTEXT\ color mechanism. -%D -%D By setting both \type{rgb} and \type{cmyk} to off, we force -%D conversion to gray scales using: -%D -%D \plaatsformule[-] -%D \startformule -%D G = .30r + .59g + .11b -%D \stopformule -%D -%D By using buffers, we keep the \ASCII\ layout clean: -%D -%D \startbuffer -%D \startbuffer[rgb] -%D \stelkleurenin[rgb=ja,cmyk=nee,reductie=nee,conversie=nee] -%D \useMPgraphic{hans} -%D \stopbuffer -%D -%D \startbuffer[cmyk] -%D \stelkleurenin[rgb=nee,cmyk=ja,reductie=nee,conversie=nee] -%D \useMPgraphic{hans} -%D \stopbuffer -%D -%D \startbuffer[cmy] -%D \stelkleurenin[rgb=nee,cmyk=ja,reductie=ja,conversie=nee] -%D \useMPgraphic{hans} -%D \stopbuffer -%D -%D \startbuffer[gray] -%D \stelkleurenin[rgb=nee,cmyk=nee,reductie=nee,conversie=nee] -%D \useMPgraphic{hans} -%D \stopbuffer -%D \stopbuffer -%D -%D \typebuffer -%D \haalbuffer -%D -%D The graphic is rather simple and is generated each time -%D it's called: -%D -%D \global\runMPgraphicstrue -%D -%D \startbuffer -%D \startbuffer[graphic] -%D \startuseMPgraphic{hans} -%D width :=\the\tekstbreedte/5; -%D height := width/4; -%D fill fullcircle -%D xscaled width -%D yscaled height -%D withcolor (\RedGreenBlue); -%D \stopuseMPgraphic -%D \stopbuffer -%D \stopbuffer -%D -%D \typebuffer -%D \haalbuffer -%D -%D Next we combine the four alternative interpretations in a -%D combination: -%D -%D \startbuffer -%D \startbuffer[result] -%D \startcombinatie[4] -%D {\haalbuffer[rgb]} {\tfxx original} -%D {\haalbuffer[cmyk]} {\ttxx\string\convertMPcolorstrue} -%D {\haalbuffer[cmy]} {\ttxx\string\reduceMPcolorstrue} -%D {\haalbuffer[gray]} {\ttxx\string\forcegrayMPcolorstrue} -%D \stopcombinatie -%D \stopbuffer -%D \stopbuffer -%D -%D \typebuffer -%D \haalbuffer -%D -%D Finally we call the buffers, using different setting: -%D -%D \startbuffer -%D \plaatsfiguur -%D {\METAPOST\ color conversions} -%D {\def\RedGreenBlue{.1,.4,.6}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt -%D \def\RedGreenBlue{.1,.6,.4}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt -%D \def\RedGreenBlue{.4,.1,.6}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt -%D \def\RedGreenBlue{.4,.6,.1}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt -%D \def\RedGreenBlue{.6,.1,.4}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt -%D \def\RedGreenBlue{.6,.4,.1}\haalbuffer[graphic]\haalbuffer[result]} -%D \stopbuffer -%D -%D \typebuffer -%D \haalbuffer -%D -%D By the way, when the \POSTSCRIPT\ file resulting from -%D this input is converted into \PDF\ and viewed in Acrobat -%D Reader, one can quite different colors from those -%D displayed in \GHOSTSCRIPT, which view equals the -%D \POSTSCRIPT\ originals. - -\protect - -\endinput +%D \module
+%D [ file=supp-mps,
+%D version=1997.07.05,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\METAPOST\ Inclusion,
+%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.
+
+% E-tex : a primitive that tells us that \write18 works
+% E-tex : \executeMetaPost filename
+% ConTeXt : automatic flush at end of job
+
+% The MP generation support is still experimental.
+
+%D \METAPOST\ is John Hobbys alternative for \METAFONT\ and
+%D produces superior \POSTSCRIPT\ code. In this module we
+%D integrate \METAPOST\ support int \CONTEXT. We offer two
+%D tracks:
+%D
+%D \startopsomming
+%D \som generating \METAPOST\ code, running this program from
+%D within \TEX\ using \type{\write18}, and importing the
+%D result
+%D \som generating \METAPOST\ code, processing the code
+%D afterward, and importing the result in a second pass
+%D \stopopsomming
+%D
+%D The first approach uses a non standard \TEX\ feature,
+%D implemented in Web2c. I'm not going to discuss the pros and
+%D cons of running programs from within others, but all
+%D arguments against this can be overcome by implementing a
+%D \TEX\ worthy primitive:
+%D
+%D \starttypen
+%D \excuteMetaPost filename
+%D \stoptypen
+%D
+%D Ok then, let's start:
+
+\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+
+\writestatus{loading}{Context Support Macros / MetaPost Inclusion}
+
+\unprotect
+
+%D \macros
+%D {startMPgraphic}
+%D
+%D From within \TEX\ one can execute \METAPOST\ code by putting
+%D it between the two commands
+%D
+%D \starttypen
+%D \startMPgraphic
+%D \stopMPgraphic
+%D \stoptypen
+%D
+%D This is implemented as:
+
+\long\def\startMPgraphic#1\stopMPgraphic%
+ {\startwritingMPgraphic
+ \writeMPgraphic{#1}%
+ \stopwritingMPgraphic}
+
+%D \macros
+%D {startMPrun}
+%D
+%D If we just wat to run \METAPOST\ code, that is, not to
+%D explictly generate a figure in terms of \type{beginfig} and
+%D \type{endfig}, we can use:
+%D
+%D \starttypen
+%D \startMPgraphic
+%D \stopMPgraphic
+%D \stoptypen
+%D
+%D \starttypen
+%D \startMPrun
+%D \stopMPrun
+%D \stoptypen
+%D
+%D The next boolean is for internal purposes only.
+
+\newif\ifMPrun \MPrunfalse
+
+\long\def\startMPrun#1\stopMPrun% geeft nog conflicten met nummer!
+ {\MPruntrue
+ \startwritingMPgraphic
+ \writeMPgraphic{#1}%
+ \stopwritingMPgraphic
+ \MPrunfalse}
+
+%D \macros
+%D {startwritingMPgraphic,
+%D writeMPgraphic,
+%D stopwritingMPgraphic}
+%D
+%D If the writing process is divided into more steps, one can
+%D use the components of this macro directly.
+%D
+%D \starttypen
+%D \startwritingMPgraphic
+%D ...
+%D \writeMPgraphic{...}
+%D ...
+%D \writeMPgraphic{...}
+%D ...
+%D \stopwritingMPgraphic
+%D \stoptypen
+
+%D \macros
+%D {ifrunMPgraphics}
+%D
+%D These macros look a bit more complicated that one would
+%D expect at first sight. This is due to the two ways of
+%D processing these graphics, mentioned in a previous
+%D paragraph. Which method is used, the direct or indirect
+%D one, depends on a boolean.
+
+\newif\ifrunMPgraphics
+
+%D If set to true, one can do with a single pass, else one must
+%D process the \METAPOST\ file \type{mpgraph} between two
+%D succesive \TEX\ runs.
+
+\def\MPgraphicfile{mpgraph}
+
+%D \macros
+%D {MPgraphic}
+%D
+%D When we run \METAPOST\ from within \TEX, each graphic is
+%D processed at once, which means that we reuse this file many
+%D times. When however the execution is delayed, all graphics
+%D are saved in a separate figure. The current graphic is
+%D characterized bij a \COUNTER. This counter is available
+%D in \type{\MPgraphic}.
+
+\newcount\currentMPgraphic
+
+\def\MPgraphic{0}
+
+%D \macros
+%D {ifreuseMPgraphics}
+%D
+%D If one want to reuse grapics, one can save much redundant
+%D run time by setting the next switch to true.
+
+\newif\ifreuseMPgraphics
+
+%D The three macros responsible for writing the graphic
+%D implement both schemes.
+
+%D \macros
+%D {MPinclusions, startMPinclusions}
+%D
+%D One can include for instance common input commands by
+%D passing them to \type{\MPinclusions}:
+%D
+%D \starttypen
+%D \MPinclusions{input tools}
+%D \stoptypen
+
+\let\theMPinclusions=\empty
+
+\long\def\startMPinclusions#1\stopMPinclusions%
+ {\long\def\theMPinclusions{\writeMPgraphic{#1}}}
+
+\long\def\MPinclusions#1%
+ {\startMPinclusions#1\stopMPinclusions}
+
+%D \macros
+%D {iflongMPlines}
+%D
+%D When grabbing a graphic deifnition, newlines are turned
+%D into spaces. By default we split the graphic definition
+%D at the colon, but long lines are still possible by
+%D setting the next boolean to true.
+
+\newif\iflongMPlines
+
+\long\def\writeMPgraphic#1%
+ {\bgroup
+ \iflongMPlines
+ \let\par=\empty
+ \long\def\flush##1##2\par%
+ {\ifx##1\relax \else
+ \immediate\write\scratchwrite{##1##2}%
+ \expandafter\flush
+ \fi}%
+ \flush#1\empty\par\relax\par
+ \else
+ \long\def\flush##1##2;%
+ {\ifx##1\relax \else
+ \dowriteMPgraphicline##1##2btex\relax etex\end
+ \expandafter\flush
+ \fi}%
+ \flush#1\empty;\relax;%
+ \fi
+ \egroup}
+
+%D The \type{;} aware method (the \type{\else} branch) also
+%D takes care of \type{btex}||\type{etex} bound data.
+
+\def\dowriteMPgraphicline%
+ {\futurelet\next\dodowriteMPgraphicline}
+
+\long\def\dodowriteMPgraphicline#1btex#2#3etex#4\end%
+ {\ifx\next\empty\else\ifx\next\relax\else
+ \bgroup
+ \let\par=\empty
+ \ifx#2\relax
+ \immediate\write\scratchwrite{#1;}%
+ \egroup
+ \else
+ \convertargument#2#3\to\ascii
+ \immediate\write\scratchwrite{#1btex \ascii etex;}%
+ \egroup
+ \dowriteMPgraphicline#4btex\relax etex\end
+ \fi
+ \fi\fi}
+
+%D This stripper is suboptimal in the sense that more
+%D \type{;}'s are output than feasible. Anyhow, \METAPOST\
+%D can handle this and users may consider it being a sort
+%D of error prevention bonus.
+
+\def\writeMPgraph%
+ {\immediate\write\scratchwrite{mpgraph:=\the\currentMPgraphic;}}
+
+\def\startwritingMPgraphic%
+ {\ifrunMPgraphics
+ \ifMPrun \else \ifreuseMPgraphics \else
+ \global\currentMPgraphic=0
+ \fi \fi
+ \global\advance\currentMPgraphic by 1
+ \xdef\MPgraphic{\the\currentMPgraphic}%
+ \immediate\openout\scratchwrite=\MPgraphicfile.mp
+ \writeMPgraph
+ \theMPinclusions
+ \else
+ \global\advance\currentMPgraphic by 1
+ \xdef\MPgraphic{\the\currentMPgraphic}%
+ \ifnum\currentMPgraphic=1
+ \immediate\openout\scratchwrite=\MPgraphicfile.mp
+ \writeMPgraph
+ \theMPinclusions
+ \fi
+ \fi
+ \ifMPrun \else
+ \immediate\write\scratchwrite{beginfig(\the\currentMPgraphic);}%
+ \fi
+ \global\let\flushMPgraphics\dodostopwritingMPgraphic
+ \global\let\stopwritingMPgraphic=\dostopwritingMPgraphic}
+
+\def\dostopwritingMPgraphic%
+ {\ifMPrun \else
+ \immediate\write\scratchwrite{endfig;}%
+ \fi
+ \ifrunMPgraphics
+ \dodostopwritingMPgraphic
+ \fi}
+
+\def\dodostopwritingMPgraphic%
+ {\ifnum\currentMPgraphic>0
+ \immediate\write\scratchwrite{end.}%
+ \immediate\closeout\scratchwrite
+ \runMPgraphic{\MPgraphicfile}%
+ \fi
+ \global\let\flushMPgraphics=\relax}
+
+\let\stopwritingMPgraphic=\relax
+\let\flushMPgraphics =\relax
+
+%D \macros
+%D {flushMPgraphics}
+%D
+%D When we use the indirect method, all graphics are saved in
+%D one file. This means that we cannot close this file after
+%D every \type{\stopMPgraphic}. Therefore we need to say:
+%D
+%D \starttypen
+%D \flushMPgraphic
+%D \stoptypen
+%D
+%D else the file is closed without writing the \METAPOST\ end
+%D command. One will notice this fast enough when in indirect
+%D mode. When using the direct mode this command is not
+%D implicitly needed, but ommiting it makes files less
+%D portable.
+
+%D \macros
+%D {loadcurrentMPgraphic,
+%D placeMPgraphic}
+%D
+%D Once defined, we can call for this graphic by saying:
+%D
+%D \starttypen
+%D \loadcurrentMPgraphic{setups}
+%D \placeMPgraphic
+%D \stoptypen
+%D
+%D This two stage insert permits some intermediate manipulations
+%D of the graphic, which temporary saved in:
+
+\newbox\MPgraphicbox
+
+\def\loadcurrentMPgraphic#1%
+ {\loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{#1}}
+
+\def\loadMPgraphic#1#2%
+ {\setbox\MPgraphicbox=\hbox{\insertMPfile{#1}{#2}}}
+
+\def\placeMPgraphic%
+ {\box\MPgraphicbox}
+
+%D \macros
+%D {startreusableMPgraphic, reuseMPgraphic, useMPbox}
+%D
+%D One can use the next macro for defining graphics that are
+%D to be reused. When the next switch is set, graphics are
+%D cached.
+
+\newif\ifuseMPbox % nog eens cyclische buffer
+
+\def\douseMPbox#1%
+ {\setobject{#1}
+ \vbox
+ {\loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \placeMPgraphic}%
+ \setgvalue{#1}%
+ {\getobject{#1}}}
+
+\def\nouseMPbox#1%
+ {\setxvalue{#1}%
+ {\noexpand\loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \noexpand\placeMPgraphic}}
+
+\ifCONTEXT \else \let\douseMPbox=\nouseMPbox \fi
+
+\long\def\startreusableMPgraphic#1#2\stopreusableMPgraphic%
+ {\reuseMPgraphicstrue
+ \doifundefined{MP:#1}
+ {\startMPgraphic#2\stopMPgraphic
+ \ifuseMPbox
+ \douseMPbox{MP:#1}%
+ \else
+ \nouseMPbox{MP:#1}%
+ \fi}}
+
+\def\reuseMPgraphic#1%
+ {\getvalue{MP:#1}}
+
+%D \macros
+%D {startuseMPgraphic,useMPgraphic}
+%D
+%D The every||time||it's||used original one is defined below.
+%D This one makes sense when the graphic uses random numbers.
+
+\long\def\startuseMPgraphic#1#2\stopuseMPgraphic%
+ {\reuseMPgraphicstrue
+ \long\setgvalue{MP:#1}%
+ {\startMPgraphic#2\stopMPgraphic
+ \loadcurrentMPgraphic{}%
+ \placeMPgraphic}}
+
+\let\useMPgraphic=\reuseMPgraphic
+
+%D We didn't yet define the macro responsible for processing
+%D the graphic from within \TEX.
+
+\def\runMPgraphic#1%
+ {\ifrunMPgraphics
+ \executeMETAPOST{#1}%
+ \else
+ \message{[flush and process \MPgraphicfile.mp afterwards]}%
+ \fi}
+
+%D \macros
+%D {executeMetaPost, executeMETAPOST, executesystemcommand}
+%D
+%D With \type{\executeMETAPOST} being defined as:
+
+\ifx\undefined\executeMetaPost
+ \def\executeMETAPOST#1{\executesystemcommand{\executeMetaPost{#1}}}
+\fi
+
+%D There are two system dependant definitions:
+
+\ifx\undefined\executesystemcommand
+ \def\executesystemcommand#1{\immediate\write18{#1}}
+\fi
+
+\ifx\undefined\executeMetaPost
+ \def\executeMetaPost#1{mpost #1}
+\fi
+
+%D \macros
+%D {insertMPfile}
+%D
+%D One can define this command in advance or redefine it after
+%D loading this module. The same goes for the forward
+%D reference to the figure loading macro:
+
+\ifx\undefined\insertMPfile
+
+ \def\insertMPfile#1#2%
+ {\ifx\undefined\externalfigure
+ \message{[insert file #1 here]}%
+ \else
+ \externalfigure[#1][\c!type=eps,\c!methode=mps,#2]%
+ \fi}
+
+\fi
+
+%D This macro takes {\em two} arguments, the second one can be
+%D used to pass info to the inclusion macro. Some examples
+%D of its use can be found in the modules \type{supp-tpi} and
+%D \type{prag-log}.
+
+%D This module can be used in \PLAIN\ \TEX too. When using
+%D \DVIPS, just try to process:
+%D
+%D \starttypen
+%D \input supp-mps
+%D
+%D \runMPgraphicstrue
+%D
+%D \def\insertMPfile#1#2%
+%D {\special{psfile=#1}}
+%D
+%D \startuseMPgraphic{1}
+%D prologues := 1;
+%D draw (0,0) withpen pencircle scaled 100;
+%D \stopuseMPgraphic
+%D
+%D \useMPgraphic{1}
+%D \stoptypen
+%D
+%D Don't forget to enable \type{\write18}. When does not say
+%D \type{\runMPgraphicstrue}, the \METAPOST\ scratch file
+%D must be closed by saying
+%D
+%D \starttypen
+%D \flushMPgraphics
+%D \stoptypen
+%D
+%D When using the indirect method, one has to process the file
+%D \type{mpgraph.mp} between two successive \TEX\ runs.
+
+%D For some reason, \METAPOST\ needs the public domain \DVI\ to
+%D \POSTSCRIPT\ converter \DVIPS. This symbiosis originates in
+%D the need to include the fonts (glyphs) that \METAPOST\ uses
+%D in the \POSTSCRIPT\ file. Driver independancy was one of my
+%D prerequisites for using \METAPOST, so I decided to build
+%D this kind of support myself. Personally I consider driver
+%D dependancy a drawback for the dissemination of such a
+%D package. The second part of this module more or less
+%D decouples \METAPOST\ and \DVIPS.
+%D
+%D The macros hereafter are copied from the module
+%D \type{m-metapost}. After writing module \type{supp-pdf} I
+%D added this method to the module named and after a while
+%D decided to hook it into module \type{spec-yy}. Therefore
+%D they made it into a support module, but in a slightly
+%D different way.
+
+%D \macros
+%D {includeMPfonts, ifincludeMPfonts}
+%D {}
+%D
+%D The method we use is both robust and simple: one can do
+%D with calling the next macro with the filename as argument:
+%D
+%D \starttypen
+%D \includeMPfonts{filename}
+%D \stoptypen
+%D
+%D We can turn of this mechanism with:
+%D
+%D \starttypen
+%D \includeMPfontsfalse
+%D \stoptypen
+
+\newif\ifincludeMPfonts \includeMPfontstrue
+
+\def\includeMPfonts#1%
+ {\ifincludeMPfonts
+ \bgroup
+ \message{[MP fonts #1]}%
+ %\uncatcodespecials
+ \endlinechar=-1
+ \setMPspecials
+ \obeyMPspecials
+ \setbox0=\hbox
+ {\hskip-\maxdimen
+ \doprocessfile\scratchread{#1}\handleMPfont}%
+ \smashbox0
+ \box0
+ \egroup
+ \fi}
+
+\def\UseMetaPostGraphic {\includeMPfonts} % upward compatible
+\def\DontUseMetaPostGraphics {\includeMPfontsfalse} % upward compatible
+
+%D The characters are collected in a box and moved as far as
+%D possible into the left margin. The resulting box has no
+%D dimensions and can be prepended (appended) to the special
+%D that handles the inclusion. The characters are in the file
+%D but made invisible.
+
+%D We scan the graphics file for the \type{fshow} operator,
+%D that is, lines that start with \type{(}. If found it
+%D interprets the line, which looks like:
+%D
+%D \starttypen
+%D (string ... string) font size fshow
+%D \stoptypen
+%D
+%D Font definitions specified in the preamble are simply
+%D ignored. Only lines starting with \type{(} are interpreted.
+
+\def\dohandleMPfont#1#2\relax%
+ {\if#1(%
+ \expandafter\includeMPcharacters\fileline\relax
+ \fi}
+
+\def\handleMPfont%
+ {\expandafter\dohandleMPfont\fileline\relax}
+
+%D Before we start scanning for data, we first change some
+%D \CATCODES. The first set of macro's is copied from module
+%D \type{supp-pdf}. This scheme is a bit overdone for this
+%D module, but using the same macros saves us some memory.
+
+\def\octalMPcharacter#1#2#3%
+ {\char'#1#2#3\relax}
+
+\bgroup
+\catcode`\|=\@@comment
+\catcode`\%=\@@active
+\catcode`\[=\@@active
+\catcode`\]=\@@active
+\catcode`\{=\@@active
+\catcode`\}=\@@active
+\catcode`B=\@@begingroup
+\catcode`E=\@@endgroup
+\gdef\ignoreMPspecials|
+ B\def%BE|
+ \def[BE|
+ \def]BE|
+ \def{BE|
+ \def}BEE
+\gdef\obeyMPspecials|
+ B\def%B\char 37\relax E|
+ \def[B\char 91\relax E|
+ \def]B\char 93\relax E|
+ \def{B\char123\relax E|
+ \def}B\char125\relax EE
+\gdef\setMPspecials|
+ B\catcode`\%=\@@active
+ \catcode`\[=\@@active
+ \catcode`\]=\@@active
+ \catcode`\{=\@@active
+ \catcode`\}=\@@active
+ \catcode`\$=\@@letter
+ \catcode`\_=\@@letter
+ \catcode`\#=\@@letter
+ \catcode`\^=\@@letter
+ \catcode`\&=\@@letter
+ \catcode`\|=\@@letter
+ \catcode`\~=\@@letter
+ \def\(B\char40\relax E|
+ \def\)B\char41\relax E|
+ \def\\B\char92\relax E|
+ \def\0B\octalMPcharacter0E|
+ \def\1B\octalMPcharacter1E|
+ \def\2B\octalMPcharacter2E|
+ \def\3B\octalMPcharacter3E|
+ \def\4B\octalMPcharacter4E|
+ \def\5B\octalMPcharacter5E|
+ \def\6B\octalMPcharacter6E|
+ \def\7B\octalMPcharacter7E|
+ \def\8B\octalMPcharacter8E|
+ \def\9B\octalMPcharacter9EE
+\egroup
+
+%D The lines starting with \type{(} are interpreted and
+%D handled by
+
+\def\includeMPcharacters(#1) #2 #3 #4\relax%
+ {\font\temp=#2 at #3bp\temp#1}
+
+%D This method is both robust and reasonable fast. The only
+%D disadvantage is that when not embedded properly in the
+%D graphics inclusion macros, one has to load all graphics by
+%D hand.
+
+%D Now let's see if things work all right and show the example
+%D files that are part of the \METAPOST\ distribution:
+%D
+%D \startregelcorrectie
+%D \steluitlijnenin[midden]
+%D \leavevmode
+%D \startcombinatie[3*3]
+%D {\externfiguur[mp-exa-1][methode=mps,kader=aan,breedte=.2\hsize]} {}
+%D {\externfiguur[mp-exa-2][methode=mps,kader=aan,breedte=.2\hsize]} {}
+%D {\externfiguur[mp-exa-3][methode=mps,kader=aan,breedte=.2\hsize]} {}
+%D {\externfiguur[mp-exa-4][methode=mps,kader=aan,breedte=.2\hsize]} {}
+%D {\externfiguur[mp-exa-5][methode=mps,kader=aan,breedte=.2\hsize]} {}
+%D {\externfiguur[mp-exa-6][methode=mps,kader=aan,breedte=.2\hsize]} {}
+%D {\externfiguur[mp-exa-7][methode=mps,kader=aan,breedte=.2\hsize]} {}
+%D {\externfiguur[mp-exa-8][methode=mps,kader=aan,breedte=.2\hsize]} {}
+%D {\externfiguur[mp-exa-9][methode=mps,kader=aan,breedte=.2\hsize]} {}
+%D \stopcombinatie
+%D \stopregelcorrectie
+%D
+%D Here we used calls like:
+%D
+%D \starttypen
+%D \externfiguur[mp-exa-1][methode-mps,kader=aan,breedte=.2\hsize]
+%D \stoptypen
+
+%D \macros
+%D {convertMPcolors,
+%D ifconvertMPcolors,ifreduceMPcolors,ifforceMPcolors}
+%D
+%D When I told the editors that I wanted to use colored
+%D \METAPOST\ graphics in the color issue of the \MAPS, I was
+%D asked to use the \kap{CMYK} colorspace instead of \kap{RGB}
+%D one. However, \METAPOST\ only supports \kap{RGB} colors. I
+%D decided to write a utility to convert the \type
+%D {setrgbcolor} operators into \type {setcmykcolor} ones, and
+%D some experiments showed me that I could best let \TEX\ do it
+%D itself. Here it is:
+%D
+%D There are two booleans that control the conversion process.
+%D These are false by default.
+
+\newif\ifconvertMPcolors
+\newif\ifreduceMPcolors
+\newif\ifforcegrayMPcolors
+
+%D The main macro is calles as:
+%D
+%D \starttypen
+%D \convertMPcolors{filename}
+%D \stoptypen
+%D
+%D When active, this macro returns a message saying if indeed
+%D conversion took place. The old file is overwritten! This
+%D saves time in a succesive passes and can't harm, simply
+%D because MP can generate them anew.
+
+\def\convertMPcolorpath{} % {./}
+\def\convertMPcolorfile{metacmyk.eps}
+
+\def\convertMPcolors#1%
+ {\bgroup
+ \ifforcegrayMPcolors
+ \donetrue
+ \else\ifconvertMPcolors
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \message{[MP color conversion #1}%
+ \endlinechar=-1
+ \uncatcodespecials
+ \donefalse
+ \immediate\openout\scratchwrite=\convertMPcolorpath\convertMPcolorfile
+ \doprocessfile\scratchread{#1}\handleMPcolor
+ \immediate\closeout\scratchwrite
+ \ifdone
+ \immediate\openout\scratchwrite=\convertMPcolorpath#1
+ \doprocessfile\scratchread{\convertMPcolorpath \convertMPcolorfile}\handleMPcopy
+ \immediate\closeout\scratchwrite
+ \message{done]}%
+ \else
+ \message{not needed]}%
+ \fi
+ \immediate\openout\scratchwrite=\convertMPcolorpath\convertMPcolorfile
+ \immediate\closeout\scratchwrite
+ \fi
+ \egroup}
+
+%D The process is rather simple: read a line, look for the
+%D \type {setrgbcolor} operator, recalculate the components and
+%D check for gray reduction or black removal, write the result
+%D to a temporary file, and go on. Afterwards, the file is
+%D copied back. We don't have to reduce to gray scales;
+%D \METAPOST\ already takes care of that.
+
+\def\handleMPcolor
+ {\expandafter\dohandleMPcolor\fileline setrgbcolor*\\}
+
+\def\dohandleMPcolor#1setrgbcolor#2#3\\%
+ {\if#2*%
+ \immediate\write\scratchwrite{#1}%
+ \else
+ \dodohandleMPcolor#1setrgbcolor#2#3\\%
+ \fi}
+
+\def\dodohandleMPcolor#1 #2 #3setrgbcolor#4setrgbcolor*\\%
+ {\bgroup
+ \ifforcegrayMPcolors
+ \convertRGBtoGRAY{#1}{#2}{#3}%
+ \immediate\write\scratchwrite
+ {\@@cl@@s \space setgray #4}%
+ \else
+ \dimen0=1pt \advance\dimen0 by -#1pt
+ \dimen2=1pt \advance\dimen2 by -#2pt
+ \dimen4=1pt \advance\dimen4 by -#3pt
+ \ifreduceMPcolors
+ \dimen6=\dimen0
+ \ifdim\dimen2<\dimen6 \dimen6=\dimen2 \fi
+ \ifdim\dimen4<\dimen6 \dimen6=\dimen4 \fi
+ \advance\dimen0 by -\dimen6
+ \advance\dimen2 by -\dimen6
+ \advance\dimen4 by -\dimen6
+ \else
+ \dimen6=\!!zeropoint
+ \fi
+ \immediate\write\scratchwrite
+ {\withoutpt{\the\dimen0} \space
+ \withoutpt{\the\dimen2} \space
+ \withoutpt{\the\dimen4} \space
+ \withoutpt{\the\dimen6} \space setcmykcolor #4}%
+ \fi
+ \egroup
+ \donetrue} % needed for message
+
+\def\handleMPcopy%
+ {\immediate\write\scratchwrite{\fileline}}
+
+%D The next macro is needed for forced conversion. This macro
+%D is copied from \type{colo-ini}, just in case one uses this
+%D module outside \CONTEXT.
+
+\ifx\convertRGBtoGRAY\undefined
+
+ \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}}
+
+\fi
+
+%D The next examples show the color conversion macros in
+%D action. These examples also demonstrate in||text \METAPOST\
+%D handling. As we will see, the conversion is hooked into the
+%D \CONTEXT\ color mechanism.
+%D
+%D By setting both \type{rgb} and \type{cmyk} to off, we force
+%D conversion to gray scales using:
+%D
+%D \plaatsformule[-]
+%D \startformule
+%D G = .30r + .59g + .11b
+%D \stopformule
+%D
+%D By using buffers, we keep the \ASCII\ layout clean:
+%D
+%D \startbuffer
+%D \startbuffer[rgb]
+%D \stelkleurenin[rgb=ja,cmyk=nee,reductie=nee,conversie=nee]
+%D \useMPgraphic{hans}
+%D \stopbuffer
+%D
+%D \startbuffer[cmyk]
+%D \stelkleurenin[rgb=nee,cmyk=ja,reductie=nee,conversie=nee]
+%D \useMPgraphic{hans}
+%D \stopbuffer
+%D
+%D \startbuffer[cmy]
+%D \stelkleurenin[rgb=nee,cmyk=ja,reductie=ja,conversie=nee]
+%D \useMPgraphic{hans}
+%D \stopbuffer
+%D
+%D \startbuffer[gray]
+%D \stelkleurenin[rgb=nee,cmyk=nee,reductie=nee,conversie=nee]
+%D \useMPgraphic{hans}
+%D \stopbuffer
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \haalbuffer
+%D
+%D The graphic is rather simple and is generated each time
+%D it's called:
+%D
+%D \global\runMPgraphicstrue
+%D
+%D \startbuffer
+%D \startbuffer[graphic]
+%D \startuseMPgraphic{hans}
+%D width :=\the\tekstbreedte/5;
+%D height := width/4;
+%D fill fullcircle
+%D xscaled width
+%D yscaled height
+%D withcolor (\RedGreenBlue);
+%D \stopuseMPgraphic
+%D \stopbuffer
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \haalbuffer
+%D
+%D Next we combine the four alternative interpretations in a
+%D combination:
+%D
+%D \startbuffer
+%D \startbuffer[result]
+%D \startcombinatie[4]
+%D {\haalbuffer[rgb]} {\tfxx original}
+%D {\haalbuffer[cmyk]} {\ttxx\string\convertMPcolorstrue}
+%D {\haalbuffer[cmy]} {\ttxx\string\reduceMPcolorstrue}
+%D {\haalbuffer[gray]} {\ttxx\string\forcegrayMPcolorstrue}
+%D \stopcombinatie
+%D \stopbuffer
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \haalbuffer
+%D
+%D Finally we call the buffers, using different setting:
+%D
+%D \startbuffer
+%D \plaatsfiguur
+%D {\METAPOST\ color conversions}
+%D {\def\RedGreenBlue{.1,.4,.6}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.1,.6,.4}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.4,.1,.6}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.4,.6,.1}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.6,.1,.4}\haalbuffer[graphic]\haalbuffer[result]\vskip6pt
+%D \def\RedGreenBlue{.6,.4,.1}\haalbuffer[graphic]\haalbuffer[result]}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D \haalbuffer
+%D
+%D By the way, when the \POSTSCRIPT\ file resulting from
+%D this input is converted into \PDF\ and viewed in Acrobat
+%D Reader, one can quite different colors from those
+%D displayed in \GHOSTSCRIPT, which view equals the
+%D \POSTSCRIPT\ originals.
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/supp-mrk.tex b/tex/context/base/supp-mrk.tex index 93a7056ac..287d4bbec 100644 --- a/tex/context/base/supp-mrk.tex +++ b/tex/context/base/supp-mrk.tex @@ -1,298 +1,299 @@ -%D \module -%D [ file=supp-mrk, -%D version=1995.10.10, -%D title=\CONTEXT\ Support Macros, -%D subtitle=Marks, -%D author=Jim Fox / 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. - -%D There are 256 \COUNTERS, \DIMENSIONS, \SKIPS, \MUSKIPS\ and -%D \BOXES, 16~in- and output buffers, but there is only one -%D \MARK. In TugBoat~8 (1987, no~1) Jim Fox presents a set of -%D macros that can be used to mimmick multiple marks. We -%D gladly adopt them here. - -\writestatus{loading}{Context Support Macros / Marks} - -\unprotect - -%D This implementation is more or less compatible with the -%D other register macros in \PLAIN\ \TEX. A mark is defined by: -%D -%D \starttypen -%D \newmark\name -%D \stoptypen -%D -%D and can be called upon with: -%D -%D \starttypen -%D \topname -%D \botname -%D \firstname -%D \stoptypen -%D -%D The only drawback of his approach is that the marks must be -%D preloaded in the output routine. This is accomplished by -%D means of: -%D -%D \starttypen -%D \getmarks\name -%D \stoptypen -%D -%D The macros presented here are in most aspects copies of -%D those presented by Jim Fox. We've taken the freedom to -%D change a few things for more or less obvious reasons: -%D -%D \startopsomming -%D \som Because the original macros look quite complicated, -%D which is mainly due to extensive use of -%D \type{\expandafter}'s and \type{\csname}'s, we changed -%D those in favor of \type{\getvalue}. -%D \som To be more in line with the rest of \CONTEXT, we've -%D changed some of the names of macros. -%D \som Because we are already short on \COUNTERS\ we use -%D macros when possible. -%D \som We maintain a list of defined marks and use one -%D call for getting them all at once. -%D \som We have extended the mechanism to splitmarks (not -%D perfected yet). -%D \som We've introduced optional expansion of the contents -%D of marks. -%D \stopopsomming -%D -%D Whatever changes we've made, the credits still go to Jim, -%D whatever goes wrong is due to me. The method is described -%D in the TugBoat mentioned before, so we won't go into -%D details. All marks belonging to a group are packed in a -%D list. In this list they are preceded by a macro that can -%D be defined at will and a number concerning the position at -%D which it was defined. -%D -%D \starttypen -%D \def\somelist{... \domark5{this} ... \domark31{that} ...} -%D \stoptypen -%D -%D The original \type{\mark} keeps track of the number and -%D \type{\topmark} and \type{\botmark} are used to extract the -%D actual marks from the list. The counting is done by -%D -%D \starttypen -%D \currentmarker -%D \stoptypen -%D -%D In \CONTEXT\ we use the mark mechanism to keep track of -%D colors. In a complicated documents with many colors per -%D page, \type{\currentmarker} can therefore get pretty high. -%D (Well, this is not completely true, because we don't -%D always have to use marks.) - -\newcount\currentmarker - -%D The original implementation used a few more \COUNTERS. Two -%D have been substituted by macros, one has been replaced by -%D our scratch counter. -%D -%D \starttypen -%D % \newcount\topmarker -%D % \newcount\botmarker -%D % \newcount\foundmarker -%D \stoptypen -%D -%D We've also introduced some constants, one for the lists and -%D three for composing the mark commands. - -\def\@@marklist@@ {marklist} -\def\@@marktop@@ {top} -\def\@@markbot@@ {bot} -\def\@@markfirst@@ {first} - -%D The next one is new too. All defined marks are packed in a -%D comma seperated list. This could of course have been a token -%D list but \CONTEXT\ has some preference for comma lists. - -\def\markers {} - -%D \macros -%D {expandmarks} -%D {} -%D -%D There are two booleans. The first one handles the first -%D marks, the second concerns expansion. This second one is -%D new. - -\newif\ifnofirstmarker -\newif\ifexpandmarks \expandmarkstrue - -%D We use an indirect call to the mack mechanism. - -\let\normalmark = \mark -\let\normaltopmark = \topmark -\let\normalbotmark = \botmark -\let\normalfirstmark = \firstmark -\let\normalsplitbotmark = \splitbotmark -\let\normalsplitfirstmark = \splitfirstmark - -%D The next macro replaces the multiple step expansion and -%D command name constructors of Jim. This alternative leads to -%D a more readable source (we hope). - -\def\makemarknames#1% - {\bgroup - \escapechar=-1 - \xdef\markname{\string#1}% - \xdef\marklist{\@@marklist@@\string#1}% - \egroup} - -%D \macros -%D {newmark} -%D {} -%D -%D A mark is defined by \type{\newmark}. At the same time, -%D the name of the mark is added to a commalist. The -%D three initializations were not in the original design, but -%D make calls from outside the output routine a bit more -%D robust. - -\def\newmark#1% - {\bgroup - \makemarknames{#1}% - \doglobal\addtocommalist{\markname}\markers% - \long\setgvalue{\@@marktop@@\markname}{}% - \long\setgvalue{\@@markfirst@@\markname}{}% - \long\setgvalue{\@@markbot@@\markname}{}% - \setgvalue{\marklist}{\domark0{}}% - \long\gdef#1{\addmarker#1}% - \egroup} - -%D Setting a new mark and adding a mark to the designated -%D list is done by \type{\addmarker}. This is an internal -%D command, the user set a marks bij calling it's name: -%D -%D \starttypen -%D \mymark{some text} -%D \stoptypen -%D -%D Where \type{\mymark} is previously defined by -%D \type{\newmark}. - -\long\def\addmarker#1#2% - {\bgroup - \makemarknames{#1}% - \global\advance\currentmarker by 1\relax - \normalmark{\the\currentmarker}% - \@EA\!!toksa\@EA=\@EA\@EA\@EA{\csname\marklist\endcsname}% - \ifexpandmarks - \setxvalue{\marklist}% - {\the\!!toksa - \noexpand\domark - \the\currentmarker{#2}}% - \else - \!!toksb=\@EA{#2}% - \setxvalue{\marklist}% - {\the\!!toksa - \noexpand\domark - \the\currentmarker{\the\!!toksb}}% - \fi - \egroup} - -%D \macros -%D {getmarks,getallmarks, -%D getsplitmarks,getallsplitmarks} -%D {} -%D -%D In fact, marks make only sense in the output routine. Marks -%D are derived from their list by means of \type{\getmarks}. -%D Only one call per mark is permitted in the output routine. -%D Therefore, it's far more easy to get them all at once, by -%D means of \type{\getallmarks}, which is not part of the -%D original design. -%D -%D This grabbing is done by processing the list using the -%D embedded \type{\domark} macros. When a relevant mark is -%D found, this macro is reassigned and from then on serves -%D in building the new list. - -\def\getmarks#1% - {\bgroup - \makemarknames{#1}% - \edef\topmarker{0\normaltopmark}% - \edef\botmarker{0\normalbotmark}% - \!!toksb={}% - \nofirstmarkertrue - \let\@fi=\fi \let\fi=\relax - \let\@or=\or \let\or=\relax - \let\@else=\else \let\else=\relax - \let\domark=\doscanmarks - \getvalue{\marklist}\lastmark - %\message{markstatus : [\the\!!toksa\the\!!toksb\the\!!toksc]}% - \long\setxvalue{\marklist}{\the\!!toksa\the\!!toksb\the\!!toksc}% - \egroup} - -\def\getallmarks% - {\processcommacommand[\markers]\getmarks} - -\def\getsplitmarks#1% - {\bgroup - \makemarknames{#1}% - \@EA\let\@EA\savedmarklist\@EA=\csname\marklist\endcsname - \edef\topmarker{0\normalsplitfirstmark}% - \edef\botmarker{0\normalsplitbotmark}% - \!!toksb={}% - \nofirstmarkertrue - \let\@fi=\fi \let\fi=\relax - \let\@or=\or \let\or=\relax - \let\@else=\else \let\else=\relax - \let\domark=\doscanmarks - \getvalue{\marklist}\lastmark - \@EA\global\@EA\let\csname\marklist\endcsname=\savedmarklist - \egroup} - -\def\getallsplitmarks% - {\processcommacommand[\markers]\getsplitmarks} - -\long\def\dodoscanmarks#1% - {\ifnum\scratchcounter>\topmarker\relax - \@else - \long\setgvalue{\@@marktop@@\markname}{#1}% - \@fi - \ifnum\scratchcounter>\botmarker\relax - \let\domark=\dorecovermarks - \!!toksb=\@EA{\@EA\domark\the\scratchcounter{#1}}% - \@else - \ifnofirstmarker - \long\setgvalue{\@@markfirst@@\markname}{#1}% - \ifnum\scratchcounter>\topmarker\relax - \nofirstmarkerfalse - \@fi - \@fi - \long\setgvalue{\@@markbot@@\markname}{#1}% - \!!toksa=\@EA{\@EA\domark\the\scratchcounter{#1}}% - \@fi} - -\def\doscanmarks% - {\afterassignment\dodoscanmarks\scratchcounter=} - -\long\def\dorecovermarks#1\lastmark% - {\!!toksc={\domark#1}} - -\def\lastmark% - {\!!toksc={}} - -%D No watch what happens next. Because we used an indirect -%D call to the mark mechanism we can redefine the original -%D \type{\mark} command. - -\newmark\mark - -%D One final advice. Use marks with care. When used in globally -%D assigned boxes, the list can grow quite big, and processing -%D can slow down considerably. - -\protect - -\endinput +%D \module
+%D [ file=supp-mrk,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Marks,
+%D author=Jim Fox / 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.
+
+%D There are 256 \COUNTERS, \DIMENSIONS, \SKIPS, \MUSKIPS\ and
+%D \BOXES, 16~in- and output buffers, but there is only one
+%D \MARK. In TugBoat~8 (1987, no~1) Jim Fox presents a set of
+%D macros that can be used to mimmick multiple marks. We
+%D gladly adopt them here.
+
+\writestatus{loading}{Context Support Macros / Marks}
+
+\unprotect
+
+%D This implementation is more or less compatible with the
+%D other register macros in \PLAIN\ \TEX. A mark is defined by:
+%D
+%D \starttypen
+%D \newmark\name
+%D \stoptypen
+%D
+%D and can be called upon with:
+%D
+%D \starttypen
+%D \topname
+%D \botname
+%D \firstname
+%D \stoptypen
+%D
+%D The only drawback of his approach is that the marks must be
+%D preloaded in the output routine. This is accomplished by
+%D means of:
+%D
+%D \starttypen
+%D \getmarks\name
+%D \stoptypen
+%D
+%D The macros presented here are in most aspects copies of
+%D those presented by Jim Fox. We've taken the freedom to
+%D change a few things for more or less obvious reasons:
+%D
+%D \startopsomming
+%D \som Because the original macros look quite complicated,
+%D which is mainly due to extensive use of
+%D \type{\expandafter}'s and \type{\csname}'s, we changed
+%D those in favor of \type{\getvalue}.
+%D \som To be more in line with the rest of \CONTEXT, we've
+%D changed some of the names of macros.
+%D \som Because we are already short on \COUNTERS\ we use
+%D macros when possible.
+%D \som We maintain a list of defined marks and use one
+%D call for getting them all at once.
+%D \som We have extended the mechanism to splitmarks (not
+%D perfected yet).
+%D \som We've introduced optional expansion of the contents
+%D of marks.
+%D \stopopsomming
+%D
+%D Whatever changes we've made, the credits still go to Jim,
+%D whatever goes wrong is due to me. The method is described
+%D in the TugBoat mentioned before, so we won't go into
+%D details. All marks belonging to a group are packed in a
+%D list. In this list they are preceded by a macro that can
+%D be defined at will and a number concerning the position at
+%D which it was defined.
+%D
+%D \starttypen
+%D \def\somelist{... \domark5{this} ... \domark31{that} ...}
+%D \stoptypen
+%D
+%D The original \type{\mark} keeps track of the number and
+%D \type{\topmark} and \type{\botmark} are used to extract the
+%D actual marks from the list. The counting is done by
+%D
+%D \starttypen
+%D \currentmarker
+%D \stoptypen
+%D
+%D In \CONTEXT\ we use the mark mechanism to keep track of
+%D colors. In a complicated documents with many colors per
+%D page, \type{\currentmarker} can therefore get pretty high.
+%D (Well, this is not completely true, because we don't
+%D always have to use marks.)
+
+\newcount\currentmarker
+
+%D The original implementation used a few more \COUNTERS. Two
+%D have been substituted by macros, one has been replaced by
+%D our scratch counter.
+%D
+%D \starttypen
+%D % \newcount\topmarker
+%D % \newcount\botmarker
+%D % \newcount\foundmarker
+%D \stoptypen
+%D
+%D We've also introduced some constants, one for the lists and
+%D three for composing the mark commands.
+
+\def\@@marklist@@ {marklist}
+\def\@@marktop@@ {top}
+\def\@@markbot@@ {bot}
+\def\@@markfirst@@ {first}
+
+%D The next one is new too. All defined marks are packed in a
+%D comma seperated list. This could of course have been a token
+%D list but \CONTEXT\ has some preference for comma lists.
+
+\def\markers {}
+
+%D \macros
+%D {expandmarks}
+%D {}
+%D
+%D There are two booleans. The first one handles the first
+%D marks, the second concerns expansion. This second one is
+%D new.
+
+\newif\ifnofirstmarker
+\newif\ifexpandmarks \expandmarkstrue
+
+%D We use an indirect call to the mack mechanism.
+
+\let\normalmark = \mark
+\let\normaltopmark = \topmark
+\let\normalbotmark = \botmark
+\let\normalfirstmark = \firstmark
+\let\normalsplitbotmark = \splitbotmark
+\let\normalsplitfirstmark = \splitfirstmark
+
+%D The next macro replaces the multiple step expansion and
+%D command name constructors of Jim. This alternative leads to
+%D a more readable source (we hope).
+
+\def\makemarknames#1%
+ {\bgroup
+ \escapechar=-1
+ \xdef\markname{\string#1}%
+ \xdef\marklist{\@@marklist@@\string#1}%
+ \egroup}
+
+%D \macros
+%D {newmark}
+%D {}
+%D
+%D A mark is defined by \type{\newmark}. At the same time,
+%D the name of the mark is added to a commalist. The
+%D three initializations were not in the original design, but
+%D make calls from outside the output routine a bit more
+%D robust.
+
+\def\newmark#1%
+ {\bgroup
+ \makemarknames{#1}%
+ \doglobal\addtocommalist{\markname}\markers%
+ \long\setgvalue{\@@marktop@@\markname}{}%
+ \long\setgvalue{\@@markfirst@@\markname}{}%
+ \long\setgvalue{\@@markbot@@\markname}{}%
+ \setgvalue{\marklist}{\domark0{}}%
+ \long\gdef#1{\addmarker#1}%
+ \egroup}
+
+%D Setting a new mark and adding a mark to the designated
+%D list is done by \type{\addmarker}. This is an internal
+%D command, the user set a marks bij calling it's name:
+%D
+%D \starttypen
+%D \mymark{some text}
+%D \stoptypen
+%D
+%D Where \type{\mymark} is previously defined by
+%D \type{\newmark}.
+
+\long\def\addmarker#1#2%
+ {\bgroup
+ \makemarknames{#1}%
+ \global\advance\currentmarker by 1\relax
+ \normalmark{\the\currentmarker}%
+ \@EA\!!toksa\@EA=\@EA\@EA\@EA{\csname\marklist\endcsname}%
+ \ifexpandmarks
+ \setxvalue{\marklist}%
+ {\the\!!toksa
+ \noexpand\domark
+ \the\currentmarker{#2}}%
+ \else
+ \!!toksb=\@EA{#2}%
+ \setxvalue{\marklist}%
+ {\the\!!toksa
+ \noexpand\domark
+ \the\currentmarker{\the\!!toksb}}%
+ \fi
+ \egroup}
+
+%D \macros
+%D {getmarks,getallmarks,
+%D getsplitmarks,getallsplitmarks}
+%D {}
+%D
+%D In fact, marks make only sense in the output routine. Marks
+%D are derived from their list by means of \type{\getmarks}.
+%D Only one call per mark is permitted in the output routine.
+%D Therefore, it's far more easy to get them all at once, by
+%D means of \type{\getallmarks}, which is not part of the
+%D original design.
+%D
+%D This grabbing is done by processing the list using the
+%D embedded \type{\domark} macros. When a relevant mark is
+%D found, this macro is reassigned and from then on serves
+%D in building the new list.
+
+\def\getmarks#1%
+ {\bgroup
+ \makemarknames{#1}%
+ \edef\topmarker{0\normaltopmark}%
+ \edef\botmarker{0\normalbotmark}%
+ \!!toksb={}%
+ \nofirstmarkertrue
+ \let\@fi=\fi \let\fi=\relax
+ \let\@or=\or \let\or=\relax
+ \let\@else=\else \let\else=\relax
+ \let\domark=\doscanmarks
+ \getvalue{\marklist}\lastmark
+ %\message{markstatus : [\the\!!toksa\the\!!toksb\the\!!toksc]}%
+ \long\setxvalue{\marklist}{\the\!!toksa\the\!!toksb\the\!!toksc}%
+ \egroup}
+
+\def\getallmarks%
+ {\processcommacommand[\markers]\getmarks}
+
+\def\getsplitmarks#1%
+ {\bgroup
+ \makemarknames{#1}%
+ \@EA\let\@EA\savedmarklist\@EA=\csname\marklist\endcsname
+ \edef\topmarker{0\normalsplitfirstmark}%
+ \edef\botmarker{0\normalsplitbotmark}%
+ \!!toksb={}%
+ \nofirstmarkertrue
+ \let\@fi=\fi \let\fi=\relax
+ \let\@or=\or \let\or=\relax
+ \let\@else=\else \let\else=\relax
+ \let\domark=\doscanmarks
+ \getvalue{\marklist}\lastmark
+ \@EA\global\@EA\let\csname\marklist\endcsname=\savedmarklist
+ \egroup}
+
+\def\getallsplitmarks%
+ {\processcommacommand[\markers]\getsplitmarks}
+
+\long\def\dodoscanmarks#1%
+ {\ifnum\scratchcounter>\topmarker\relax
+ \@else
+ \long\setgvalue{\@@marktop@@\markname}{#1}%
+ \@fi
+ \ifnum\scratchcounter>\botmarker\relax
+ \let\domark=\dorecovermarks
+ \!!toksb=\@EA{\@EA\domark\the\scratchcounter{#1}}%
+ \@else
+ \ifnofirstmarker
+ \long\setgvalue{\@@markfirst@@\markname}{#1}%
+ \ifnum\scratchcounter>\topmarker\relax
+ \nofirstmarkerfalse
+ \@fi
+ \@fi
+ \long\setgvalue{\@@markbot@@\markname}{#1}%
+ \!!toksa=\@EA{\@EA\domark\the\scratchcounter{#1}}%
+ \@fi}
+
+\def\doscanmarks%
+ {\afterassignment\dodoscanmarks\scratchcounter=}
+
+\long\def\dorecovermarks#1\lastmark%
+ {\!!toksc={\domark#1}}
+
+\def\lastmark%
+ {\!!toksc={}}
+
+%D No watch what happens next. Because we used an indirect
+%D call to the mark mechanism we can redefine the original
+%D \type{\mark} command.
+
+\newmark\mark
+
+%D One final advice. Use marks with care. When used in globally
+%D assigned boxes, the list can grow quite big, and processing
+%D can slow down considerably.
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/supp-mul.tex b/tex/context/base/supp-mul.tex deleted file mode 100644 index b425c9723..000000000 --- a/tex/context/base/supp-mul.tex +++ /dev/null @@ -1,1163 +0,0 @@ -%D \module
-%D [ file=supp-mul,
-%D version=1995.03.01,
-%D title=\CONTEXT\ Support Macros,
-%D subtitle=Multi Column Output,
-%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 Support Macros / Multi Column Output}
-
-\unprotect
-
-%D Multi||column output: the main routines
-%D
-%D The following macro's implement a multi||column output
-%D routine. The original implementation was based on Donald
-%D Knuth's implementation, which was adapted by Craig Platt to
-%D support balancing of the last page. I gradually adapted
-%D Platt's version to our needs but under certain
-%D circumstances things still went wrong. I considered all
-%D calls to Platt's \type{\balancingerror} as undesirable.
-
-\startmessages dutch library: columns
- title: kolommen
- 1: maximaal -- kolommen
- 2: gebruik eventueel \string\filbreak
- 3: probleempje, probeer [balanceren=nee]
- 4: plaatsblok boven nog niet mogelijk
- 5: plaatsblok onder nog niet mogelijk
- 6: -- plaatsblok(en) opgeschort
- 7: balanceren afgebroken na 100 stappen
- 8: gebalanceerd in -- stap(pen)
- 9: uitlijnen controleren!
- 10: (minder dan) 1 regel over
- 11: plaatsblok te breed voor kolom
- 12: plaatsblok verplaatst naar volgende kolom
- 13: breed figuur geplaatst boven kolommen
-\stopmessages
-
-\startmessages english library: columns
- title: columns
- 1: only -- columns possible
- 2: use \string\filbreak\space as alternative
- 3: problems, disable balancing
- 4: top float not yet supported
- 5: bottom float not yet supported
- 6: -- float(s) postponed
- 7: balancing aborted after 100 steps
- 8: balanced in -- step(s)
- 9: check raggedness
- 10: (less than) 1 line left
- 11: float to wide for column
- 12: float moved to next column
- 13: wide float moved to top of columns
-\stopmessages
-
-\startmessages german library: columns
- title: Spalten
- 1: nur -- Spalten moeglich
- 2: benutzte \string\filbreak\space als Alternative
- 3: Problem, verwende [ausgleich=nein]
- 4: Gleitobjekt oben ncoh nicht unterstuetzt
- 5: Gleitobjekt unten ncoh nicht unterstuetzt
- 6: -- Gleitobjekt(e) verschoben
- 7: ausgleich nach 100 Schritten abgebrocheb
- 8: ausgeglichen nach -- Schritt(en)
- 9: Ausrichtung ueberpruefen
- 10: (weniger als) 1 Zeile uebrig
- 11: Gleitobjekt zu breit fuer Spalte
- 12: Gleitobjekt in naechste Zeile verschoben
- 13: breites Gleitobjekt an den Anfang der Spalten verschoben
-\stopmessages
-
-%D This completely new implementation can handle enough
-%D situations for everyday documents, but is still far from
-%D perfect. While at the moment the routine doesn't support
-%D all kind of floats, it does support:
-%D
-%D \startopsomming
-%D \som an unlimitted number of columns
-%D \som ragged or not ragged bottoms
-%D \som optional balancing without \type{\balancingerrors}
-%D \som different \type{\baselineskips}, \type{\spacing},
-%D \type{\topskip} and \type{\maxdepth}
-%D \som left- and right indentation, e.g. within lists
-%D \som moving columns floats to the next column or page
-%D \som handling of floats that are to wide for a columns
-%D \stopopsomming
-%D
-%D One could wonder why single and multi||columns modes are
-%D still separated. One reason for this is that \TeX\ is not
-%D suited well for handling multi||columns. As a result, the
-%D single columns routines are more robust. Handling one
-%D column as a special case of multi||columns is posible but at
-%D the cost of worse float handling, worse page breaking,
-%D worse etc. Complicated multi||column page handling should
-%D be done in \kap{DTP}||systems anyway.
-%D
-%D There are three commands provided for entering and leaving
-%D multi||column mode and for going to the next column:
-%D
-%D \interface \type{\beginmulticolumns} \\ \\
-%D \interface \type{\endmulticolumns} \\ \\
-%D \interface \type{\ejectcolumn} \\ \\
-%D
-%D This routines are sort of stand||alone. They communicate
-%D with the rest of \CONTEXT\ by means of some interface
-%D macro's, which we only mention.
-%D
-%D \interface \type{\nofcolumns} \\
-%D the number of columns \\
-%D \interface \type{\betweencolumns} \\
-%D the stuff between columns \\
-%D \interface \type{\finaloutput{material}} \\
-%D some kind of \type{\pagebody} and \type{\shipout} \\
-%D
-%D \interface \type{\ifbalancecolumns} \\
-%D balancing the colums or not \\
-%D \interface \type{\ifstretchcolumns} \\
-%D ragging the bottom or not \\
-%D
-%D \interface \type{\ifheightencolumns} \\
-%D fix the heigh tor not \\
-%D \interface \type{\fixedcolumnheight} \\
-%D the optional fixed height \\
-%D
-%D \interface \type{\ifinheritcolumns} \\
-%D handle ragging or not \\
-%D \interface \type{\ifr@ggedbottom} \\
-%D use ragged bottoms \\
-%D \interface \type{\ifb@selinebottom} \\
-%D put the bottom line on the \\
-%D \interface \type{\ifnormalbottom} \\
-%D put the bottom line at the \\
-%D
-%D \interface \type{\usercolumnwidth} \\
-%D the calculated width of a column \\
-%D \interface \type{\columntextwidth} \\
-%D the maximum width of a column \\
-%D \interface \type{\columntextheight} \\
-%D the minimum width of a column \\
-%D
-%D \interface \type{\spacingfactor} \\
-%D the spacing factor \\
-%D \interface \type{\corpssize} \\
-%D the (local) corpssize \\
-%D \interface \type{\openlineheight} \\
-%D the lineheight (including \type{\spacing}) \\
-%D
-%D \interface \type{\EveryCorps} \\
-%D communication channel to font switching routines \\
-%D
-%D \interface \type{\global\settopskip} \\
-%D set \type{\topskip} \\
-%D \interface \type{\setcolumnwarnings} \\
-%D set \type{\badness} and \type{\fuzz} \\
-%D \interface \type{\setcolumninserts} \\
-%D set \type{\insert}'s \\
-%D \interface \type{\setvsize} \\
-%D set \type{\vsize} and \type{\pagegoal} \\
-%D \interface \type{\sethsize} \\
-%D set \type{\hsize} \\
-%D
-%D \interface \type{\flushcolumnfloats} \\
-%D push saved column floats (next page) \\
-%D \interface \type{\flushcolumnfloat} \\
-%D push saved column floats (next column) \\
-%D \interface \type{\setcolumnfloats} \\
-%D initialize column floats \\
-%D
-%D \interface \type{\finishcolumnbox} \\
-%D do something special (a hook) \\
-%D \interface \type{\postprocesscolumnline} \\
-%D do something with each columnline (also a hook) \\
-%D \interface \type{\currentcolumn} \\
-%D the current column \\
-%D
-%D These interface macro's are called upon or initialized
-%D by the multi||column macro's.
-
-\def\columntextwidth {\zetbreedte}
-\def\columntextheight {\teksthoogte}
-\def\usercolumnwidth {\tekstbreedte}
-
-\def\fixedcolumnheight {\teksthoogte}
-\def\betweencolumns {\hskip\corpssize}
-
-\def\setcolumnwarnings {\dontcomplaincolumnboxes}
-\def\setcolumninserts {\dontpermitcolumninserts}
-
-\def\setcolumnfloats {} % in CONTEXT used for floats
-\def\flushcolumnfloats {} % in CONTEXT used for floats
-\def\flushcolumnfloat {} % in CONTEXT used for floats
-
-\def\finishcolumnbox {} % in CONTEXT used for backgrounds
-
-%D In fact, the column height and width are set by mens of
-%D two macro's. One can change their meaning if needed:
-
-\def\setcolumntextheight%
- {\def\columntextheight{\teksthoogte}}
-
-\def\setcolumntextwidth%
- {\def\columntextwidth{\tekstbreedte}}
-
-%D Both macros are redefined in \CONTEXT\ when backgrounds
-%D are applied to columns.
-
-\newcount\nofcolumns \nofcolumns=2
-
-\def\maxnofcolumns {16}
-\def\allocatednofcolumns {0}
-
-\newif\ifbalancecolumns \balancecolumnsfalse
-\newif\ifstretchcolumns \stretchcolumnsfalse
-\newif\ifinheritcolumns \inheritcolumnsfalse
-\newif\ifheightencolumns \heightencolumnsfalse
-
-\newbox\partialpage
-\newskip\partialpageskip
-
-\newbox\restofpage
-\newbox\savedfloatlist
-
-\newdimen\intercolumnwidth
-\newdimen\localcolumnwidth
-\newdimen\partialpageheight
-
-\newtoks\singlecolumnout
-
-%D During initialization the temporary boxes are allocated.
-%D This enables us to use as much columns as we want, without
-%D exhausting the pool of boxes too fast. We could have packed
-%D them in one box, but we've got enough boxes.
-%D
-%D Two sets of boxes are declared, the txtboxes are used for
-%D the text, the topboxes are for moved column floats.
-
-\def\@@txtcol{@@txtcol}
-\def\@@topcol{@@topcol}
-
-\def\initializemulticolumns#1%
- {\ifnum#1>\maxnofcolumns\relax
- \showmessage{\m!columns}{1}{\maxnofcolumns}%
- \nofcolumns=\maxnofcolumns
- \else
- \nofcolumns=#1\relax
- \fi
- \ifnum\nofcolumns>\allocatednofcolumns\relax
- \dorecurse
- {#1}
- {\ifnum\recurselevel>\allocatednofcolumns\relax
- \newbox\next
- \global\letvalue{\@@txtcol\recurselevel}=\next
- \newbox\next
- \global\letvalue{\@@topcol\recurselevel}=\next
- \fi}%
- \xdef\allocatednofcolumns{\the\nofcolumns}%
- \fi
- \edef\firstcolumnbox{\getvalue{\@@txtcol1}}%
- \edef\firsttopcolumnbox{\getvalue{\@@topcol1}}%
- \edef\lastcolumnbox{\getvalue{\@@txtcol\the\nofcolumns}}%
- \edef\lasttopcolumnbox{\getvalue{\@@topcol\the\nofcolumns}}}
-
-%D Without going in details we present two macro's which
-%D handle the columns. The action which is transfered by the
-%D the first and only parameter can do something with
-%D \type{\currentcolumnbox}. In case of the mid columns,
-%D \type{\firstcolumnbox} and \type{\lastcolumnbox} are handled
-%D outside these macro's.
-
-\def\dohandlemidcolumns#1%
- {\dorecurse
- {\nofcolumns}
- {\ifnum\recurselevel>1
- \ifnum\recurselevel<\nofcolumns\relax
- \edef\currentcolumnbox{\getvalue{\@@txtcol\recurselevel}}%
- \edef\currenttopcolumnbox{\getvalue{\@@topcol\recurselevel}}%
- \let\currentcolumn=\recurselevel
- #1\relax
- \fi
- \fi}}
-
-\def\dohandleallcolumns#1%
- {\dorecurse
- {\nofcolumns}
- {\edef\currentcolumnbox{\getvalue{\@@txtcol\recurselevel}}%
- \edef\currenttopcolumnbox{\getvalue{\@@topcol\recurselevel}}%
- \let\currentcolumn=\recurselevel
- #1\relax}}
-
-%D Going to a new columns is done by means of a
-%D \type{\ejectcolumn}. The following definition does not
-%D always work.
-
-\def\ejectcolumn%
- {\goodbreak
- \showmessage{\m!columns}{2}{}}
-
-%D The next macro should never be called so let's deal with it.
-%D There were several solutions to these kind of errors. First
-%D we check for a good breakpoint before firing up the
-%D multi||column routine (\type{\break} or \type{\allowbreak}).
-%D We do the same at the end of the routine
-%D (\type{\allowbreak}). These allowances are definitely
-%D needed!
-%D
-%D Some on first sight redundant calls to for instance
-%D \type{\setvsize} in the flushing, splitting and balancing
-%D macro's can definitely not be omitted! Some are just there
-%D to handle situations that only few times arise. One of
-%D those can be that the output routine is invoked before
-%D everything is taken care of. This happens when we
-%D flush (part of) the current page with an \type{\unvbox}
-%D with a \type{\pagetotal}~$\approx$ \type{\pagegoal}. One
-%D simply cannot balance columns that are just balanced.
-%D
-%D I hope one never sees the following message. Because it
-%D took me a lot of time to develop the multi||columns
-%D routines, every (although seldom) warning gives me the
-%D creeps!
-
-\def\balancingerror%
- {\showmessage{\m!columns}{3}{}%
- \finaloutput{\unvbox255}}
-
-%D Here we present the two \type{\dont...} macro's, which are
-%D of course \CONTEXT||specific ones.
-
-\def\dontcomplaincolumnboxes%
- {\mindermeldingen}
-
-\def\dontpermitcolumninserts%
- {\def\dotopfloat%
- {\showmessage{\m!columns}{4}{}%
- \doexecfloat}%
- \def\dobotfloat%
- {\showmessage{\m!columns}{5}{}%
- \doexecfloat}}
-
-\def\getinsertionheights\to#1\\% \relax'm
- {#1=\!!zeropoint
- \def\doaddinsertionheight##1%
- {\ifvoid##1\else
- \advance#1 by \skip##1
- \advance#1 by \ht##1
- \fi}%
- \doaddinsertionheight\topins
- \doaddinsertionheight\botins
- \doaddinsertionheight\footins}
-
-%D The local column width is available in the dimension
-%D register \type{\localcolumnwidth}, which is calculated as:
-
-\def\setcolumnhsize%
- {\setbox0=\hbox
- {\parindent\!!zeropoint\betweencolumns}%
- \intercolumnwidth=\wd0
- \localcolumnwidth=\columntextwidth
- \edef\globalcolumnwidth{\the\localcolumnwidth}%
- \advance\localcolumnwidth by -\leftskip
- \advance\localcolumnwidth by -\rightskip
- \advance\localcolumnwidth by -\nofcolumns\intercolumnwidth
- \advance\localcolumnwidth by \intercolumnwidth
- \divide\localcolumnwidth by \nofcolumns
- \usercolumnwidth=\localcolumnwidth
- \hsize=\localcolumnwidth} % we don't do it \global
-
-%D One should be aware that when font related dimensions are
-%D used in typesetting the in||between material, these
-%D dimensions are influenced by corps switches inside
-%D multi||column mode.
-
-%D The global width is saved in \type {\globalcolumnwidth}.
-%D This value is used when we pack the columns in a \type
-%D {\hbox}.
-
-\def\setcolumnvsize%
- {\global\vsize=\columntextheight
- \ifdim\partialpageheight>\!!zeropoint
- \global\advance\vsize by -\partialpageheight
- \fi
- \getinsertionheights\to\dimen0\\%
- \global\advance\vsize by -\dimen0
- \global\vsize=\nofcolumns\vsize
- \global\pagegoal=\vsize} % let's do it only here
-
-%D It really starts here. After some checks and initializations
-%D we change the output routine to continous multi||column
-%D mode. This mode handles columns that fill the current and
-%D next full pages. The method used is (more or less)
-%D multiplying \type{\vsize} and dividing \type{\hsize} by
-%D \type{\nofcolumns}. More on this can be found in the
-%D \TeX book. We save the top of the current page in box
-%D \type{\partialpage}.
-%D
-%D We manipulate \type{\topskip} a bit, just to be shure that
-%D is has no flexibility. This has te be done every time a
-%D font switch takles place, because \type{\topskip} can depend
-%D on this.
-%D
-%D Watch the trick with the \type{\vbox}. This way we get the
-%D right interlining and white space.
-
-\def\beginmulticolumns%
- {\par
- \begingroup
- \dontshowcomposition
- \setcolumntextwidth\relax
- \setcolumntextheight\relax
- \ifsomefloatwaiting
- \showmessage{\m!columns}{6}{\the\savednoffloats}%
- \global\setbox\savedfloatlist=\box\floatlist
- \edef\restoresavedfloats%
- {\global\savednoffloats=\the\savednoffloats
- \global\setbox\floatlist=\box\savedfloatlist
- \global\noexpand\somefloatwaitingtrue}%
- \global\savednoffloats=0
- \global\somefloatwaitingfalse
- \else
- \let\restoresavedfloats=\relax
- \fi
- %\global\partialpageskip=\lastskip % vervallen
- \dimen0=\pagetotal
- \advance\dimen0 by \parskip
- \advance\dimen0 by \openlineheight
- \ifdim\dimen0<\pagegoal
- \allowbreak
- \else
- \break
- \fi
- \EveryCorps{\topskip=1\topskip}% % nog nodig ?
- \the\everycorps % nog nodig ?
- \initializemulticolumns\nofcolumns
- \setcolumninserts
- \hangafter=0\relax
- \hangindent=\!!zeropoint\relax
- \everypar{}% \everypar={\flushcolumnfloat}%
- \ifdim\pagetotal=\!!zeropoint\relax % later toegevoegd
- \else % later toegevoegd
- \vbox{\strut}% % toegevoegd
- \vskip-\lineskip % toegevoegd
- \vskip-\openlineheight % toegevoegd
- \fi % later toegevoegd
- %\global\partialpageheight=\pagetotal % vervangen door \ht\partialpage
- \global\singlecolumnout=\output
- \global\output={\global\setbox\partialpage=\vbox{\unvbox255}}%
- \eject
- \global\partialpageheight=\ht\partialpage
- \global\output={\continuousmulticolumnsout}%
- \setcolumnfloats
- \dohandleallcolumns
- {\global\setbox\currenttopcolumnbox=\box\voidb@x}%
- \let\sethsize=\setcolumnhsize
- \let\setvsize=\setcolumnvsize
- \sethsize
- \setvsize
- \showcomposition}
-
-%D When we leave the multi||column mode, we have to process the
-%D not yet shipped out part of the columns. When we don't
-%D balance, we simply force a continuous output, but a balanced
-%D output is more tricky.
-%D
-%D First we try to fill up the page and when all or something
-%D is left we try to balance things. This is another useful
-%D adaption of the ancesters of these macro's. It takes some
-%D reasoning to find out what happens and maybe I'm making
-%D some mistake, but it works.
-%D
-%D Unvoiding box \type{\partialpage} is sometimes necessary,
-%D e.g. when there is no text given between \type{\begin..}
-%D and \type{\end..}. The \type{\par} is needed!
-
-\def\endmulticolumns%
- {\dontshowcomposition
- \doflushcolumnfloats % added recently
- \par
- \ifbalancecolumns
- \global\output={\continuousmulticolumnsout}%
- \goodbreak
- \global\output={\balancedmulticolumnsout}%
- \else
- \goodbreak
- \fi
- \eject % the prevdepth is important, try e.g. toclist in
- \prevdepth\!!zeropoint % columns before some noncolumned text text
- \global\output=\singlecolumnout
- \ifvoid\partialpage\else
- \unvbox\partialpage
- \fi
- \global\partialpageheight=\!!zeropoint
- \nofcolumns=1
- \setvsize
- \dosomebreak\allowbreak
- \restoresavedfloats
- \endgroup}
-
-%D Because some initializations happen three times, we
-%D defined a macro for them. The \type{\everypar{}} is
-%D needed because we don't want anything to interfere.
-
-\def\setmulticolumnsout%
- {\everypar{}%
- \setcolumnwarnings
- \settopskip
- \setmaxdepth
- \topskip=1\topskip
- \splittopskip=\topskip
- \splitmaxdepth=\maxdepth
- \boxmaxdepth=\maxdepth
- \emergencystretch=\!!zeropoint\relax} % sometimes needed !
-
-%D Flushing the page comes to pasting the columns together and
-%D appending the result to box \type{\partialpage}, if not
-%D void. I've seen a lot of implementations in which some skip
-%D was put between normal text and multi||column text. When we
-%D don't want this, the baselines can be messed up. I hope the
-%D seemingly complicated calculation of a correction
-%D \type{\kern} is adequate to overcome this. Although not
-%D watertight, spacing is taken into account and even multiple
-%D mode changes on one page go well. But cross your fingers and
-%D don't blame me.
-%D
-%D One of the complications of flushing out the boxes is that
-%D \type{\partialpage} needs to be \type{\unvbox}'ed, otherwise
-%D there is too less flexibility in the page when using
-%D \type{\r@ggedbottom}. It took a lot of time before these
-%D kind of problems were overcome. Using \type{\unvbox} at the
-%D wrong moment can generate \type{\balancingerror}'s.
-%D
-%D One can use the macros \type {\maxcolumnheight} and \type
-%D {\maxcolumndepth} when generating material between columns
-%D as well as postprocessing column lines.
-
-\let\maxcolumnheight=\!!zeropoint
-\let\maxcolumndepth =\!!zeropoint
-
-\def\setmaxcolumndimensions%
- {\let\maxcolumnheight=\!!zeropoint
- \let\maxcolumndepth =\!!zeropoint
- \dohandleallcolumns
- {\ifdim\ht\currentcolumnbox>\maxcolumnheight
- \edef\maxcolumnheight{\the\ht\currentcolumnbox}%
- \fi
- \ifdim\dp\currentcolumnbox>\maxcolumndepth
- \edef\maxcolumndepth{\the\dp\currentcolumnbox}%
- \fi}}
-
-\def\flushcolumnedpage%
- {\bgroup
- \setmulticolumnsout
- \showcomposition
- \setmaxcolumndimensions
- \postprocesscolumns
- \dohandleallcolumns % \hbox i.v.m. \showcomposition
- {\global\setbox\currentcolumnbox=\hbox to \localcolumnwidth
- {\box\currentcolumnbox
- \global\wd\currentcolumnbox=\localcolumnwidth
- \ifheightencolumns
- \global\ht\currentcolumnbox=\fixedcolumnheight
- \fi}}%
- \setmaxcolumndimensions
- \setbox0=\vbox
- {\hbox to \globalcolumnwidth
- {\dohandleallcolumns
- {\finishcolumnbox{\box\currentcolumnbox}%
- \ifnum\currentcolumn<\nofcolumns
- \hfil\betweencolumns\hfil
- \fi}}}%
- \dohandleallcolumns
- {\global\setbox\currenttopcolumnbox=\box\voidb@x}%
- \ifvoid\partialpage
- \else
- \unvbox\partialpage
- \fi
- \global\partialpageheight=\!!zeropoint
- \setvsize
- \dosomebreak\nobreak
- \dp0=\!!zeropoint
- \box0
- \allowbreak % nieuw / test
- \egroup}
-
-%D In case one didn't notice, finaly \type{\finishcolumnbox} is
-%D applied to all boxes. One can use this hook for special
-%D purposes. But there is more:
-%D
-%D Once upon a time I wanted to manipulate the individual lines
-%D in a column. This feature is demonstrated in the two examples
-%D below.
-%D
-%D \startbuffer
-%D \def\postprocesscolumnline#1%
-%D {\ruledhbox{#1}\hss}
-%D
-%D \startkolommen[n=4]
-%D \dorecurse{25}{line: \recurselevel\par}
-%D \stopkolommen
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D Here we show the natural width of the lines:
-%D
-%D {\haalbuffer}
-%D
-%D The next example does a bit more advanced manipulation:
-%D
-%D \startbuffer
-%D \def\postprocesscolumnline#1%
-%D {\ifodd\currentcolumn
-%D \hfill#1\relax
-%D \else
-%D \relax#1\hfill
-%D \fi}
-%D
-%D \startkolommen[n=4]
-%D \dorecurse{25}{line \recurselevel\par}
-%D \stopkolommen
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D Here we also see an application of \type{\currentcolumn}:
-%D
-%D {\haalbuffer}
-%D
-%D This feature is implemented using the reshape macros
-%D presented in \type{supp-box}.
-
-\def\postprocesscolumns% recent extension
- {\ifx\postprocesscolumnline\undefined \else
- \dohandleallcolumns
- {\global\setbox\currentcolumnbox=\vtop
- {\beginofshapebox
- \unvbox\currentcolumnbox
- \unskip\unskip
- \endofshapebox
- \reshapebox
- {\dimen0=\ht\shapebox
- \dimen2=\dp\shapebox
- \setbox\shapebox=\hbox to \hsize
- {\postprocesscolumnline{\unhbox\shapebox}}%
- \ht\shapebox=\dimen0
- \dp\shapebox=\dimen2
- \box\shapebox}%
- \flushshapebox
- \everypar{}\parskip\!!zeropoint % = \forgetall
- \strut\endgraf
- \vskip-\lineheight
- \vfil}}%
- \fi}
-
-%D We default to doing nothing!
-
-\let\postprocesscolumnline=\undefined
-
-%D Here comes the simple splitting routine. It's a bit
-%D longer than expected because of ragging bottoms or not.
-%D This part can be a bit shorter but I suppose that I will
-%D forget what happens. The splitting takes some already
-%D present material (think of floats) into account!
-%D
-%D First we present some auxiliary routines. Any material,
-%D like for instance floats, that is already present in the
-%D boxes is preserved.
-
-\def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
- {\bgroup
- \ifdim\ht#4>\!!zeropoint
- \dimen0=\dimen#3\relax
- \dimen2=\dimen#3\relax
- \advance\dimen0 by -\ht#4
- \setbox0=\vsplit#2 to \dimen0
- \global\setbox#1=\vbox to \dimen2{\unvcopy#4\unvbox0}%
- \else
- \global\setbox#1=\vsplit#2 to \dimen#3
- \fi
- \egroup}
-
-\def\splitcurrentcolumn from \box#1to \dimen#2%
- {\splitcolumn\currentcolumnbox from \box#1 to \dimen#2 top \box\currenttopcolumnbox}
-
-\def\splitfirstcolumn from \box#1to \dimen#2%
- {\splitcolumn\firstcolumnbox from \box#1 to \dimen#2 top \box\firsttopcolumnbox}
-
-\def\splitlastcolumn from \box#1to \dimen#2%
- {\global\setbox\lastcolumnbox=\vbox
- {\unvcopy\lasttopcolumnbox
- \unvbox#1}}
-
-%D Here comes the routine that splits the long box in columns.
-%D The macro \type{\flushcolumnfloats} can be used to flush
-%D either floats that were present before the multi||column
-%D mode was entered, or floats that migrate to next columns.
-%D Flushing floats is a delicate process.
-
-\def\continuousmulticolumnsout%
- {\bgroup
- \setmulticolumnsout
- \dontshowcomposition
- \dimen0=\columntextheight
- %\advance\dimen0 by -\maxdepth % wel of niet (niet dus)
- \advance\dimen0 by -\partialpageheight
- \getinsertionheights\to\dimen2\\% toegevoegd ivm voetnoten
- \advance\dimen0 by -\dimen2 % idem
- \dohandleallcolumns
- {\splitcurrentcolumn from \box255 to \dimen0}%
- \setbox\restofpage=\vbox{\unvbox255}%
- \ifinheritcolumns
- \ifr@ggedbottom
- \dohandleallcolumns
- {\global\setbox\currentcolumnbox=\vbox to \dimen0
- {\unvbox\currentcolumnbox
- \vfill}}%
- \fi
- \ifn@rmalbottom
- \advance\dimen0 by \maxdepth
- \dohandleallcolumns
- {\global\setbox\currentcolumnbox=\vbox to \dimen0
- {\unvbox\currentcolumnbox}}%
- \fi
- \ifb@selinebottom
- % the columns are on top of the baseline
- \fi
- \else
- \dohandleallcolumns
- {\global\setbox\currentcolumnbox=\vbox to \dimen0
- {\ifstretchcolumns
- \unvbox\currentcolumnbox
- \else
- \unvbox\currentcolumnbox % wel of niet \unvbox ?
- \vfill
- \fi}}%
- \dohandleallcolumns
- {\global\ht\currentcolumnbox=\dimen0}%
- \fi
- \finaloutput{\flushcolumnedpage}%
- \sethsize
- \setvsize
- \flushcolumnfloats
- \unvbox\restofpage
- % \penalty\outputpenalty % gaat gruwelijk mis in opsommingen
- \egroup}
-
-%D And this is the balancing stuff. Again, part of the routine
-%D is dedicated to handling ragged bottoms, but here we also
-%D see some handling concerning the stretching of columns.
-%D We set \type{\widowpenalty} at~0, which enables us to
-%D balance columns with few lines. The use of \type{\box2} and
-%D \type{\box4} garantees a more robust check when skips are
-%D used.
-
-\def\balancedmulticolumnsout%
- {\bgroup
- \setmulticolumnsout
- \dontshowcomposition
- \widowpenalty=0
- \setbox0=\vbox{\unvbox255}%
- \ifdim\ht0>\openlineheight
- \dimen0=\ht0
- \advance\dimen0 by \topskip
- \advance\dimen0 by -\baselineskip
- \divide\dimen0 by \nofcolumns
- \vbadness=\!!tenthousand\relax
- \count255=0
- \bgroup
- \dimen2=\!!onepoint
- \dimen2=\spacingfactor\dimen2
- \loop
- \advance\count255 by 1
- \global\setbox\restofpage=\copy0\relax
- \splitfirstcolumn from \box\restofpage to \dimen0
- \dohandlemidcolumns
- {\splitcurrentcolumn from \box\restofpage to \dimen0}%
- \splitlastcolumn from \box\restofpage to \dimen0
- \setbox2=\vbox{\unvcopy\firstcolumnbox}%
- \dimen4=\!!zeropoint
- \dohandleallcolumns
- {\setbox4=\vbox{\unvcopy\currentcolumnbox}%
- \dimen6=\ht4
- \ifdim\dimen6>\dimen4 \dimen4=\dimen6\fi}%
- \donefalse
- \ifnum\count255>100\relax
- \donefalse
- \fi
- \ifdim\dimen4>\ht2
- \donetrue
- \fi
- \ifdone
- \advance\dimen0 by \dimen2\relax
- \repeat
- \dohandleallcolumns
- {\global\setbox\currentcolumnbox=\vbox{\unvcopy\currentcolumnbox}}% NIEUW
- \ifnum\count255>100\relax
- \showmessage{\m!columns}{7}{}%
- \else
- \showmessage{\m!columns}{8}{\the\count255\space}%
- \fi
- \egroup
- \ifinheritcolumns
- \dimen0=\ht\firstcolumnbox
- \dimen2=\ht\firstcolumnbox
- \advance\dimen2 by -\openlineheight
- \dohandleallcolumns
- {\dimen4=\ht\currentcolumnbox
- \dimen6=10\openlineheight
- \global\setbox\currentcolumnbox=\vbox to \dimen0
- {\unvbox\currentcolumnbox
- \ifdim\dimen4>\dimen6
- \ifdim\dimen4<\dimen0
- \ifdim\dimen4>\dimen2
- \vskip\!!zeropoint % !!
- \else
- \vskip\openlineheight
- \vfill
- \fi
- \else
- \vskip\!!zeropoint
- \fi
- \else
- \vskip\openlineheight
- \vfill
- \fi}}%
- \else
- \bgroup
- \ifstretchcolumns
- \dimen0=\ht\firstcolumnbox
- \dimen2=\bottomtolerance\ht\firstcolumnbox
- \setbox0=\vbox{\unvcopy\lastcolumnbox}%
- \advance\dimen0 by -\ht0\relax
- \advance\dimen0 by -\dp0\relax
- \ifdim\dimen0>\openlineheight\relax
- \ifdim\dimen0>\dimen2\relax
- % \stretchcolumnsfalse % beter goed slecht dan slecht goed
- \showmessage{\m!columns}{9}{}%
- \fi
- \fi
- \fi
- \dohandleallcolumns
- {\global\setbox\currentcolumnbox=\vbox to \ht\firstcolumnbox
- {\ifstretchcolumns
- \unvbox\currentcolumnbox
- \else
- \box\currentcolumnbox
- \vfill
- \fi}}%
- \egroup
- \fi
- \else
- \showmessage{\m!columns}{10}{}%
- \global\setbox\firstcolumnbox=\vbox{\unvbox0}%
- \fi
- \global\output={\balancingerror}%
- \b@selinebottomtrue % forces depth in separation rule
- \flushcolumnedpage
- \egroup}
-
-%D The multicolumn mechanism is incorporated in a \CONTEXT\
-%D interface, which acts like:
-%D
-%D \starttypen
-%D \startcolumns[n=4,balance=no,stretch=no,line=on]
-%D some text
-%D \stopcolumns
-%D \stoptypen
-%D
-%D The setup is optional. The default behaviour of columns
-%D can be set up with:
-%D
-%D \starttypen
-%D \setupcolumns
-%D [n=2,
-%D balance=yes,
-%D stretch=text,
-%D line=off]
-%D \stoptypen
-%D
-%D In this case, stretching is according to the way it's
-%D done outside columns (\type{\inheritcolumnstrue}). Also
-%D we can setup the \type{tolerance} within a column, the
-%D \type{distance} between columns and the fixed
-%D \type{height} of a column.
-
-%D Multi||column output: the float routines
-%D
-%D Here come the routines that handle the placement of column
-%D floats. Floats that are to big migrate to the next
-%D column. Floats that are too wide, migrate to the top of the
-%D next page, where they span as much columns as needed.
-%D Floats that are left over from outside the multi||column
-%D mode are flushed first. In macro \type{\finaloutput} the
-%D topfloats that are left from previous text should be set.
-%D
-%D When there are some floats in the queue, we inhibit the
-%D flushing of floats on top of columns. The number of
-%D waiting floats is preswent in \type{\savednoftopfloats} and
-%D is saved. As long as there are floats waiting, the topfloats
-%D are places as if we are outside multi||column mode. This is
-%D neccessary for e.g. multicolumn lists.
-%D
-%D When all those floats are flushed, we switch to the local
-%D flushing routine.
-
-\def\setcolumnfloats%
- {\xdef\globalsavednoffloats{\the\savednoffloats}%
- \ifnum\globalsavednoffloats>0
- \setglobalcolumnfloats
- \else
- \setlocalcolumnfloats
- \fi}
-
-\def\setglobalcolumnfloats%
- {\everypar={}%
- \let\flushcolumnfloat=\relax
- \let\doroomfloat=\relax
- \let\flushcolumnfloats=\noflushcolumnfloats}
-
-\def\setlocalcolumnfloats%
- {\everypar={\flushcolumnfloat\checkindentation}% nog documenteren
- \let\flushcolumnfloat=\doflushcolumnfloat
- \let\doroomfloat=\docolumnroomfloat
- \let\flushcolumnfloats=\doflushcolumnfloats
- \let\dosetbothinserts=\relax
- \let\dotopinsertions=\relax}
-
-\def\noflushcolumnfloats%
- {\bgroup
- \xdef\localsavednoffloats{\the\savednoffloats}%
- \global\savednoffloats=\globalsavednoffloats
- \dotopinsertions
- \xdef\globalsavenoffloats{\the\savednoffloats}%
- \ifnum\globalsavednoffloats=0
- \setlocalcolumnfloats
- \fi
- \global\savednoffloats=\localsavednoffloats
- \egroup}
-
-%D We need to calculate the amount of free space in a columns.
-%D When there is not enough room, we migrate the float to the
-%D next column. These macro's are alternatives (and
-%D look||alikes) of \type{\doroomfloat}. When a float is to
-%D wide, for one column, it is moved to the top of the next
-%D page. Of course such moved floats have to be taken into
-%D account when we calculate the available space. It's a pitty
-%D that such things are no integral part of \TEX.
-
-% \def\getcolumnstatus\column#1\total#2\goal#3\\%
-% {\ifdim\pagegoal<\maxdimen
-% \dimen0=\pagegoal
-% \divide\dimen0 by \nofcolumns
-% \dimen2=\!!zeropoint
-% \count255=0\relax
-% \dimen8=\columntextheight
-% \advance\dimen8 by -\partialpageheight
-% %\advance\dimen8 by -\maxdepth % recently deleted
-% \def\dogetcolumnstatus%
-% {\advance\count255 by 1\relax
-% \advance\dimen2 by \ht\currenttopcolumnbox
-% \advance\dimen2 by \dp\currenttopcolumnbox
-% \dimen4=\dimen2\relax
-% \advance\dimen4 by \pagetotal
-% \dimen6=\count255\dimen8
-% \ifdim\dimen4>\dimen6
-% \else
-% \let\dogetcolumnstatus=\relax
-% \fi}%
-% \dohandleallcolumns{\dogetcolumnstatus}%
-% \ifdim\dimen4=\dimen6
-% \dimen4=\!!zeropoint
-% \advance\count255 by 1
-% \fi
-% #1=\count255
-% #2=\dimen4
-% #3=\dimen6
-% \else
-% #1=1
-% #2=\!!zeropoint
-% #3=\teksthoogte
-% \advance#3 by -\partialpageheight
-% \fi}
-
-\def\getcolumnstatus\column#1\total#2\goal#3\\%
- {\ifdim\pagegoal<\maxdimen
- \dimen0=\pagegoal
- \dimen10=\pagetotal
- \else
- \dimen0=\nofcolumns\teksthoogte
- \dimen10=\!!zeropoint
- \fi
- \divide\dimen0 by \nofcolumns
- \dimen2=\!!zeropoint
- \count255=0
- \dimen8=\columntextheight
- \advance\dimen8 by -\partialpageheight
- %\advance\dimen8 by -\maxdepth % recently deleted
- \def\dogetcolumnstatus%
- {\advance\count255 by 1
- \advance\dimen2 by \ht\currenttopcolumnbox
- \advance\dimen2 by \dp\currenttopcolumnbox
- \dimen4=\dimen2
- \advance\dimen4 by \dimen10 % pagetotal
- \dimen6=\count255\dimen8
- \ifdim\dimen4>\dimen6
- \else
- \let\dogetcolumnstatus=\relax
- \fi}%
- \dohandleallcolumns{\dogetcolumnstatus}%
- \ifnum\count255=0 \count255=1 \fi
- #1=\count255
- #2=\dimen4
- #3=\dimen6 }
-
-\def\docolumnroomfloat%
- {\ifnofloatpermitted
- \global\roomforfloatfalse
- \else
- \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
- \advance\dimen0 by \ht\floatbox
- \advance\dimen0 by \dp\floatbox
- \advance\dimen0 by \floattopskip
- % \advance\dimen0 by -\pageshrink nog eens testen
- \ifdim\dimen0>\dimen2
- \global\roomforfloatfalse
- \else
- \global\roomforfloattrue
- \fi
- \ifdim\wd\floatbox>\hsize
- \showmessage{\m!columns}{11}{}%
- \global\roomforfloatfalse
- \fi
- \fi}
-
-%D Flushing one float is done as soon as possible, i.e.
-%D \type{\everypar}. This means that (at the moment)
-%D sidefloats are not supported (overulled)!
-
-\def\doflushcolumnfloat%
- {\bgroup
- \ifsomefloatwaiting
- \let\doflushcolumnfloat=\relax
- \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
- \ifdim\dimen0>\!!zeropoint
- \dogetfloat
- \ifdim\wd\floatbox>\hsize
- \doresavefloat
- \else
- \setbox2=\vbox
- {\blanko[\@@bkvoorwit]
- \copy\floatbox
- \blanko[\@@bknawit]}%
- \advance\dimen0 by \ht2
- \advance\dimen0 by 2\openlineheight % still neccessary ?
- \ifdim\dimen0>\dimen2
- \showmessage{\m!columns}{12}{}%
- \doresavefloat
- \else
- \ifhmode{\setbox0=\lastbox}\fi% waar is die er in geslopen
- \par
- \ifdim\prevdepth<\!!zeropoint\relax % anders bovenaan kolom witruimte
- \else
- \blanko[\@@bkvoorwit]
- \fi
- \copy\floatbox
- \blanko[\@@bknawit]
- \fi
- \fi
- \fi
- \fi
- \egroup}
-
-%D This one looks complicated. Upto \type{\nofcolumns} floats
-%D are placed, taking the width of a float into account. This
-%D routine can be improved on different ways:
-%D
-%D \startopsomming[intro,opelkaar]
-%D \som taking into account some imaginary baseline, just to
-%D get the captions in line
-%D \som multipass flushing until as many floats are displaced
-%D as possible
-%D \stopopsomming
-%D
-%D When handling lots of (small) floats spacing can get worse
-%D because of lining out the columns.
-
-\def\doflushcolumnfloats%
- {\bgroup
- \ifnum\savednoffloats>1\relax % no \ifsomefloatwaiting
- \dimen8=\!!zeropoint
- \dimen4=\!!zeropoint
- \count0=0 % count0 can be used local
- \count2=\nofcolumns % count2 can be used local
- \dohandleallcolumns
- {\ifnum\count0>0\relax % the wide one's reserved space
- \global\setbox\currenttopcolumnbox=
- \vbox{\vphantom{\copy\floatbox}\witruimte\blanko[\@@bknawit]}%
- \else
- \dogetfloat
- \ifdim\wd\floatbox>\hsize
- \dimen0=\wd\floatbox
- \advance\dimen0 by \intercolumnwidth
- \dimen2=\hsize
- \advance\dimen2 by \intercolumnwidth
- \divide\dimen0 by \dimen2
- \count0=\dimen0
- \advance\count0 by 1
- \ifnum\count0>\count2
- \doresavefloat
- \else
- \dimen0=\count0\hsize
- \advance\dimen0 by \count0\intercolumnwidth
- \advance\dimen0 by -\intercolumnwidth
- \wd\floatbox=.5\wd\floatbox
- \setbox\floatbox=\hbox to \dimen0{\hss\box\floatbox\hss}%
- \fi
- \showmessage{\m!columns}{13}{}%
- \else
- \showmessage{\m!columns}{13}{}%
- \fi
- \ifdim\ht\floatbox>\!!zeropoint\relax
- \global\setbox\currenttopcolumnbox=
- \vbox
- {\copy\floatbox
- \witruimte % nodig ?
- \blanko[\@@bknawit]}%
- \fi
- \dimen6=\ht\currenttopcolumnbox
- \advance\dimen6 by \dp\currenttopcolumnbox
- \fi
- \ifdim\dimen4<\ht\currenttopcolumnbox
- \dimen4=\ht\currenttopcolumnbox
- \fi
- \advance\dimen8 by \dimen6
- \advance\count2 by -1
- \advance\count0 by -1\relax}%
- \setvsize
- \global\advance\vsize by -\dimen8
- \global\pagegoal=\vsize
- \else
- \doflushfloats
- \fi
- \egroup}
-
-%D This were the multi||column routines. They can and need to
-%D be improved but at the moment their behaviour is acceptable.
-%D
-%D One inprovement can be to normalize the height of floats
-%D to $n\times \type{\lineheight}$ with a macro like:
-%D
-%D \starttypen
-%D \normalizevbox{...}
-%D \stoptypen
-
-\protect
-
-\endinput
-
\ No newline at end of file diff --git a/tex/context/base/supp-pdf.tex b/tex/context/base/supp-pdf.tex index 1ac8136dc..caf9d72e4 100644 --- a/tex/context/base/supp-pdf.tex +++ b/tex/context/base/supp-pdf.tex @@ -1,1171 +1,1172 @@ -%D \module -%D [ file=supp-pdf, -%D version=1997.05.21, -%D title=\CONTEXT\ Support Macros, -%D subtitle=\METAPOST\ to \PDF\ conversion, -%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. - -%D These macros are written as generic as possible. Some -%D general support macro's are loaded from a small module -%D especially made for non \CONTEXT\ use. In this module I -%D use a matrix transformation macro written by Tanmoy -%D Bhattacharya. Thanks to extensive testing of Sebastian -%D Ratz I was able to complete this module within reasonable -%D time. First we take care of non||\CONTEXT\ use: - -\ifx \undefined \writestatus \input supp-mis.tex \relax \fi - -%D This module handles some \PDF\ conversion and insertions -%D topics. The macros use the \PDFTEX\ primitive -%D \type{\pdfliteral}. - -\writestatus{loading}{Context Support Macros / PDF} - -\unprotect - -\ifx\pdfliteral\undefined - \def\pdfliteral#1{\message{[ignored pdfliteral: #1]}} -\fi - -%D \macros -%D {convertPDFtoPDF} -%D {} -%D -%D \PDFTEX\ supports verbatim inclusion of \PDF\ code. The -%D following macro takes care of inserting externally defined -%D illustrations in \PDF\ format. According to a suggestion -%D Tanmoy Bhattacharya posted to the \PDFTEX\ mailing list, we -%D first skip lines until \type{stream} is reached and then -%D copy lines until \type{endstream} is encountered. This -%D scheme only works with vectorized graphics in which no -%D indirect references to objects are used. Bitmaps also don't -%D work. Interpreting their specifications is beyond the -%D current implementation. -%D -%D \starttypen -%D \convertPDFtoPDF -%D {filename} -%D {x scale} {y scale} -%D {x offset } {y offset} -%D {width} {height} -%D \stoptypen -%D -%D When the scales are set to~1, the last last four values -%D are the same as the bounding box, e.g. -%D -%D \starttypen -%D \convertPDFtoPDF{mp-pra-1.pdf} {1} {1}{-1bp}{-1bp}{398bp}{398bp} -%D \convertPDFtoPDF{mp-pra-1.pdf}{.5}{.5} {0bp} {0bp}{199bp}{199bp} -%D \stoptypen -%D -%D Keep in mind, that this kind of copying only works for -%D pure and valid pdf code (without fonts). - -%D The scanning and copying is straightforward and quite fast. -%D To speed up things we use two constants. - -\def\@@PDFstream@@ {stream} -\def\@@PDFendstream@@ {endstream} - -%D \macros -%D {PDFmediaboxprefered} -%D {} -%D -%D If needed, the macros can scan for the mediabox that -%D specifies the dimensions and offsets of the graphic. When -%D we say: -%D -%D \starttypen -%D \PDFmediaboxpreferedtrue -%D \stoptypen -%D -%D the mediabox present in the file superseded the user -%D specified, already scaled and calculated offset and -%D dimensions. Beware: the user supplied values are not the -%D bounding box ones! - -\newif\ifPDFmediaboxprefered - -\def\setPDFboundingbox#1#2#3#4#5#6% - {\dimen0=#1\dimen0=#5\dimen0 - \ScaledPointsToBigPoints{\number\dimen0}\PDFxoffset - \dimen0=#3\dimen0=#5\dimen0 - \xdef\PDFwidth{\the\dimen0}% - \dimen0=#2\dimen0=#6\dimen0 - \ScaledPointsToBigPoints{\number\dimen0}\PDFyoffset - \dimen0=#4\dimen0=#6\dimen0 - \xdef\PDFheight{\the\dimen0}% - \global\let\PDFxoffset=\PDFxoffset - \global\let\PDFyoffset=\PDFyoffset} - -\def\setPDFmediabox#1[#2 #3 #4 #5]#6\done% - {\dimen2=#2bp\dimen2=-\dimen2 - \dimen4=#3bp\dimen4=-\dimen4 - \dimen6=#4bp\advance\dimen6 by \dimen2 - \dimen8=#5bp\advance\dimen8 by \dimen4 - \setPDFboundingbox{\dimen2}{\dimen4}{\dimen6}{\dimen8}\PDFxscale\PDFyscale} - -\def\checkPDFmediabox#1/MediaBox#2#3\done% - {\ifx#2\relax \else - \message{mediabox}% - \setPDFmediabox#2#3\done - \fi} - -%D We use the general macro \type{\doprocessfile} and feed this -%D with a line handling macro that changed it's behavior when -%D the stream operators are encountered. - -\def\handlePDFline% - {\ifx\@@PDFstream@@\fileline - \let\doprocessPDFline=\copyPDFobject - \startPDFtoPDF - \else\ifPDFmediaboxprefered - \expandafter\checkPDFmediabox\fileline/MediaBox\relax\done - \fi\fi} - -\def\copyPDFobject% - {\ifx\@@PDFendstream@@\fileline - \ifPDFmediaboxprefered - \let\doprocessPDFline=\findPDFmediabox - \else - \let\doprocessPDFline=\relax - \fi - \else - \advance\scratchcounter by 1 - \pdfliteral{\fileline}% - \fi} - -\def\findPDFmediabox% - {\expandafter\checkPDFmediabox\fileline/MediaBox\relax\done} - -%D The main conversion macro wraps the \PDF\ codes in a box -%D that is output as an object. The graphics are embedded -%D in~\type{q} and~\type{Q} and are scaled and positioned using -%D one transform call (\type{cm}). This saves some additional -%D scaling. - -\def\startPDFtoPDF% - {\setbox0=\vbox\bgroup - \message{[PDF to PDF \PDFfilename}% - \forgetall - \scratchcounter=0 - \let\stopPDFtoPDF=\dostopPDFtoPDF} - -\def\dostopPDFtoPDF% - {\ifnum\scratchcounter<0 \scratchcounter=1 \fi - \message{(\the\scratchcounter\space lines)]}% - \egroup - \wd0=\PDFwidth - \vbox to \PDFheight - {\forgetall - \vfill - \pdfliteral{q}% - \pdfliteral{1 0 0 1 \PDFxoffset\space \PDFyoffset\space cm}% - \pdfliteral{\PDFxscale\space 0 0 \PDFyscale\space 0 0 cm}% - \box0 - \pdfliteral{Q}}} - -\def\stopPDFtoPDF% - {\message{[PDF to PDF \PDFfilename\space not found]}} - -\def\convertPDFtoPDF#1#2#3#4#5#6#7% - {\bgroup - \def\PDFfilename{#1}% - \def\PDFxscale {#2}% - \def\PDFyscale {#3}% - \setPDFboundingbox{#4}{#5}{#6}{#7}{1}{1}% - \uncatcodespecials - \endlinechar=-1 - \let\doprocessPDFline=\handlePDFline - \doprocessfile\scratchread\PDFfilename\doprocessPDFline - \stopPDFtoPDF - \egroup} - -%D \macros -%D {convertMPtoPDF} -%D {} -%D -%D The next set of macros implements \METAPOST\ to \PDF\ -%D conversion. Because we want to test as fast as possible, we -%D first define the \POSTSCRIPT\ operators that \METAPOST\ -%D uses. We don't define irrelevant ones, because these are -%D skipped anyway. - -\def \PScurveto {curveto} -\def \PSlineto {lineto} -\def \PSmoveto {moveto} -\def \PSshowpage {showpage} -\def \PSnewpath {newpath} -\def \PSfshow {fshow} -\def \PSclosepath {closepath} -\def \PSfill {fill} -\def \PSstroke {stroke} -\def \PSclip {clip} -\def \PSrlineto {rlineto} -\def \PSsetlinejoin {setlinejoin} -\def \PSsetlinecap {setlinecap} -\def \PSsetmiterlimit {setmiterlimit} -\def \PSsetgray {setgray} -\def \PSsetrgbcolor {setrgbcolor} -\def \PSsetcmykcolor {setcmykcolor} -\def \PSsetdash {setdash} -\def \PSgsave {gsave} -\def \PSgrestore {grestore} -\def \PStranslate {translate} -\def \PSscale {scale} -\def \PSconcat {concat} -\def \PSdtransform {dtransform} - -\def \PSBoundingBox {BoundingBox:} -\def \PSHiResBoundingBox {HiResBoundingBox:} -\def \PSExactBoundingBox {ExactBoundingBox:} -\def \PSPage {Page:} - -%D By the way, the \type {setcmykcolor} operator is not -%D output by \METAPOST\ but can result from converting the -%D \kap{RGB} color specifications, as implemented in -%D \type{supp-mps}. - -%D In \POSTSCRIPT\ arguments precede the operators. Due to the -%D fact that in some translations we need access to those -%D arguments, as well as that sometimes we have to skip them, -%D we stack them up. The stack is one||dimensional for non path -%D operators and two||dimensional for operators inside a path. -%D This is because we have to save the whole path for -%D (optional) postprocessing. Values are pushed onto the stack -%D by: -%D -%D \starttypen -%D \setMPargument {value} -%D \stoptypen -%D -%D They can be retrieved by the short named macros: -%D -%D \starttypen -%D \gMPa {number} -%D \sMPa {number} -%D \stoptypen -%D -%D When scanning a path specification, we also save the -%D operator, using -%D -%D \starttypen -%D \setMPkeyword {n} -%D \stoptypen -%D -%D The path drawing operators are coded for speed: \type{clip}, -%D \type{stroke}, \type{fill} and \type{fillstroke} become -%D 1, 2, 3 and~4. -%D -%D When processing the path this code can be retrieved -%D using -%D -%D \starttypen -%D \getMPkeyword{n} -%D \stoptypen -%D -%D When setting an argument, the exact position on the stack -%D depend on the current value of the \COUNTERS\ -%D \type{\nofMPsegments} and \type{\nofMParguments}. - -\newcount\nofMPsegments -\newcount\nofMParguments - -%D These variables hold the coordinates. The argument part of -%D the stack is reset by: -%D -%D \starttypen -%D \resetMPstack -%D \stoptypen -%D -%D We use the prefix \type{@@MP} to keep the stack from -%D conflicting with existing macros. To speed up things bit -%D more, we use the constant \type{\@@MP}. - -\def\@@MP{@@MP} - -\def\setMPargument#1% - {\advance\nofMParguments by 1 - \expandafter\def - \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname% - {\do#1}} - -\def\gMPa#1% - {\csname\@@MP0#1\endcsname} - -\def\gMPs#1% - {\csname\@@MP\the\nofMPsegments#1\endcsname} - -\def\setMPkeyword#1 - {\expandafter\def\csname\@@MP\the\nofMPsegments0\endcsname{#1}% - \advance\nofMPsegments by 1 - \nofMParguments=0\relax} - -\def\getMPkeyword#1% - {\csname\@@MP#10\endcsname} - -%D When we reset the stack, we can assume that all further -%D comment is to be ignored as well as handled in strings. -%D By redefining the reset macro after the first call, we -%D save some run time. - -\def\resetMPstack% - {\catcode`\%=\@@active - \let\handleMPgraphic=\handleMPendgraphic - \def\resetMPstack{\nofMParguments=0\relax}% - \resetMPstack} - -%D The arguments are saved with the preceding command -%D \type{\do}. By default this command expands to nothing, but -%D when we deal with strings it's used to strip off the -%D \type{(} and \type{)}. -%D -%D Strings are kind of tricky, because characters can be -%D passed verbatim \type{(hello)}, by octal number -%D \type{(\005)} or as command \type{(\()}. We therefore -%D cannot simply ignore \type{(} and \type{)}, the way we do -%D with \type{[} and \type{]}. Another complication is that -%D strings may contain characters that normally have a -%D special meaning in \TEX, like \type{$} and \type{{}}. -%D -%D A previous solution made \type{\} an active character and -%D let it look ahead for a number or character. W ehad to -%D abandon this scheme because of the need for verbatim -%D support. The next solution involved some \CATCODE\ -%D trickery but works well. - -\def\octalMPcharacter#1#2#3% - {\char'#1#2#3\relax} - -\bgroup -\catcode`\|=\@@comment -\catcode`\%=\@@active -\catcode`\[=\@@active -\catcode`\]=\@@active -\catcode`\{=\@@active -\catcode`\}=\@@active -\catcode`B=\@@begingroup -\catcode`E=\@@endgroup -\gdef\ignoreMPspecials| - B\def%BE| - \def[BE| - \def]BE| - \def{BE| - \def}BEE -\gdef\obeyMPspecials| - B\def%B\char 37\relax E| - \def[B\char 91\relax E| - \def]B\char 93\relax E| - \def{B\char123\relax E| - \def}B\char125\relax EE -\gdef\setMPspecials| - B\catcode`\%=\@@active - \catcode`\[=\@@active - \catcode`\]=\@@active - \catcode`\{=\@@active - \catcode`\}=\@@active - \catcode`\$=\@@letter - \catcode`\_=\@@letter - \catcode`\#=\@@letter - \catcode`\^=\@@letter - \catcode`\&=\@@letter - \catcode`\|=\@@letter - \catcode`\~=\@@letter - \def\(B\char40\relax E| - \def\)B\char41\relax E| - \def\\B\char92\relax E| - \def\0B\octalMPcharacter0E| - \def\1B\octalMPcharacter1E| - \def\2B\octalMPcharacter2E| - \def\3B\octalMPcharacter3E| - \def\4B\octalMPcharacter4E| - \def\5B\octalMPcharacter5E| - \def\6B\octalMPcharacter6E| - \def\7B\octalMPcharacter7E| - \def\8B\octalMPcharacter8E| - \def\9B\octalMPcharacter9EE -\egroup - -%D We use the comment symbol as a sort of trigger: - -\bgroup -\catcode`\%=\@@active -\gdef\startMPscanning{\let%=\startMPconversion} -\egroup - -%D In earlier versions we used the sequence -%D -%D \starttypen -%D \expandafter\handleMPsequence\input filename\relax -%D \stoptypen -%D -%D Persistent problems in \LATEX\ however forced us to use a -%D different scheme. Every \POSTSCRIPT\ file starts with a -%D \type{%}, so we temporary make this an active character -%D that starts the scanning and redefines itself. (The problem -%D originates in the redefinition by \LATEX\ of the -%D \type{\input} primitive.) - -\def\startMPconversion% - {\catcode`\%=\@@ignore - \ignoreMPspecials - \handleMPsequence} - -%D Here comes the main loop. Most arguments are numbers. This -%D means that they can be recognized by their \type{\lccode}. -%D This method saves a lot of processing time. We could -%D speed up the conversion by handling the \type{path} -%D seperately. - -\def\dohandleMPsequence#1#2 % - {\ifnum\lccode`#1=0 - \setMPargument{#1#2}% - \else - \edef\somestring{#1#2}% - \ifx\somestring\PSmoveto - \edef\lastMPmoveX{\gMPa1}% - \edef\lastMPmoveY{\gMPa2}% - \pdfliteral{\gMPa1 \gMPa2 m}% - \resetMPstack - \else\ifx\somestring\PSnewpath - \let\handleMPsequence=\handleMPpath - \else\ifx\somestring\PSgsave - \pdfliteral{q}% - \resetMPstack - \else\ifx\somestring\PSgrestore - \pdfliteral{Q}% - \resetMPstack - \else\ifx\somestring\PSdtransform % == setlinewidth - \let\handleMPsequence=\handleMPdtransform - \else\ifx\somestring\PSconcat - \pdfliteral{\gMPa1 \gMPa2 \gMPa3 \gMPa4 \gMPa5 \gMPa6 cm}% - \resetMPstack - \else\ifx\somestring\PSsetrgbcolor - \pdfliteral{\gMPa1 \gMPa2 \gMPa3 rg \gMPa1 \gMPa2 \gMPa3 RG}% - \resetMPstack - \else\ifx\somestring\PSsetcmykcolor - \pdfliteral{\gMPa1 \gMPa2 \gMPa3 \gMPa4 k \gMPa1 \gMPa2 \gMPa3 \gMPa4 K}% - \resetMPstack - \else\ifx\somestring\PSsetgray - \pdfliteral{\gMPa1 g \gMPa1 G}% - \resetMPstack - \else\ifx\somestring\PStranslate - \pdfliteral{1 0 0 1 \gMPa1 \gMPa2 cm}% - \resetMPstack - \else\ifx\somestring\PSsetdash - \handleMPsetdash - \resetMPstack - \else\ifx\somestring\PSsetlinejoin - \pdfliteral{\gMPa1 j}% - \resetMPstack - \else\ifx\somestring\PSsetmiterlimit - \pdfliteral{\gMPa1 M}% - \resetMPstack - \else\ifx\somestring\PSfshow - \handleMPfshow - \resetMPstack - \else\ifx\somestring\PSsetlinecap - \pdfliteral{\gMPa1 J}% - \resetMPstack - \else\ifx\somestring\PSrlineto - \pdfliteral{\lastMPmoveX\space \lastMPmoveY\space l S}% - \resetMPstack - \else\ifx\somestring\PSscale - \pdfliteral{\gMPa1 0 0 \gMPa2 0 0 cm}% - \resetMPstack - \else - \handleMPgraphic{#1#2}% - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \fi - \handleMPsequence} - -%D Beginning and ending the graphics is taken care of by the -%D macro \type{\handleMPgraphic}, which is redefined when -%D the first graphics operator is met. - -\def\handleMPendgraphic#1% - {\ifx\somestring\PSshowpage - \let\handleMPsequence=\finishMPgraphic - \else - \setMPargument{#1}% - \fi} - -\def\handleMPbegingraphic#1% - {\ifx\somestring\PSBoundingBox - \let\handleMPsequence=\handleMPboundingbox - \else\ifx\somestring\PSHiResBoundingBox - \let\handleMPsequence=\handleMPboundingbox - \else\ifx\somestring\PSExactBoundingBox - \let\handleMPsequence=\handleMPboundingbox - \else\ifx\somestring\PSPage - \let\handleMPsequence=\handleMPpage - \else - \setMPargument{#1}% - \fi\fi\fi\fi} - -\let\handleMPgraphic=\handleMPbegingraphic - -%D We check for three kind of bounding boxes: the normal one -%D and two high precission ones: -%D -%D \starttypen -%D BoundingBox: llx lly ucx ucy -%D HiResBoundingBox: llx lly ucx ucy -%D ExactBoundingBox: llx lly ucx ucy -%D \stoptypen -%D -%D The dimensions are saved for later use. - -\def\handleMPboundingbox #1 #2 #3 #4 - {\dimen0=#1pt\dimen0=-\MPxscale\dimen0 - \dimen2=#2pt\dimen2=-\MPyscale\dimen2 - \xdef\MPxoffset{\withoutpt{\the\dimen0}}% - \xdef\MPyoffset{\withoutpt{\the\dimen2}}% - \dimen0=#1bp\dimen0=-\dimen0 - \dimen2=#2bp\dimen2=-\dimen2 - \advance\dimen0 by #3bp - \dimen0=\MPxscale\dimen0 - \xdef\MPwidth{\the\dimen0}% - \advance\dimen2 by #4bp - \dimen2=\MPyscale\dimen2 - \xdef\MPheight{\the\dimen2}% - \nofMParguments=0 - \let\handleMPsequence=\dohandleMPsequence - \handleMPsequence} - -%D We use the \type{page} comment as a signal that -%D stackbuilding can be started. - -\def\handleMPpage #1 #2 - {\nofMParguments=0 - \let\handleMPsequence=\dohandleMPsequence - \handleMPsequence} - -%D \METAPOST\ draws it dots by moving to a location and -%D invoking \type{0 0 rlineto}. This operator is not -%D available in \PDF. Our solution is straightforward: we draw -%D a line from $(current\_x, current\_y)$ to itself. This -%D means that the arguments of the preceding \type{moveto} have -%D to be saved. - -\def\lastMPmoveX{0} -\def\lastMPmoveY{0} - -%D These saved coordinates are also used when we handle the -%D texts. Text handling proved to be a bit of a nuisance, but -%D finaly I saw the light. It proved that we also had to -%D take care of \type{(split arguments)}. - -\def\handleMPfshow% - {\setbox0=\hbox - {\obeyMPspecials - \edef\size{\gMPa{\the\nofMParguments} }% - \advance\nofMParguments by -1 - \font\temp=\gMPa{\the\nofMParguments} at \size bp - \advance\nofMParguments by -1 - \temp - \ifnum\nofMParguments=1 - \def\do(##1){##1}% - \gMPa1% - \else - \scratchcounter=1 - \def\do(##1{##1}% - \gMPa{\the\scratchcounter}\space - \def\do{}% - \loop - \advance\scratchcounter by 1 - \ifnum\scratchcounter<\nofMParguments - \gMPa{\the\scratchcounter}\space - \repeat - \def\do##1){##1}% - \gMPa{\the\scratchcounter}% - \fi - \unskip}% - \dimen0=\lastMPmoveY bp - \advance\dimen0 by \ht0 - \ScaledPointsToBigPoints{\number\dimen0}\lastMPmoveY - \pdfliteral{n q 1 0 0 1 \lastMPmoveX\space\lastMPmoveY\space cm}% - \dimen0=\ht0 - \advance\dimen0 by \dp0 - \box0 - \vskip-\dimen0 - \pdfliteral{Q}} - -%D Most operators are just converted and keep their -%D arguments. Dashes however need a bit different treatment, -%D otherwise \PDF\ viewers complain loudly. Another -%D complication is that one argument comes after the \type{]}. -%D When reading the data, we simple ignore the array boundary -%D characters. We save ourselves some redundant newlines and -%D at the same time keep the output readable by packing the -%D literals. - -\def\handleMPsetdash% - {\bgroup - \def\somestring{[}% - \scratchcounter=1 - \loop - \ifnum\scratchcounter<\nofMParguments - \edef\somestring{\somestring\space\gMPa{\the\scratchcounter}}% - \advance\scratchcounter by 1 - \repeat - \edef\somestring{\somestring]\gMPa{\the\scratchcounter} d}% - \pdfliteral{\somestring}% - \egroup} - -%D The \type{setlinewidth} commands look a bit complicated. There are -%D two alternatives, that alsways look the same. As John Hobby -%D says: -%D -%D \startsmaller -%D \starttypen -%D x 0 dtransform exch truncate exch idtransform pop setlinewidth -%D 0 y dtransform truncate idtransform setlinewidth pop -%D \stoptypen -%D -%D These are just fancy versions of \type{x setlinewidth} and -%D \type{y setlinewidth}. The \type{x 0 ...} form is used if -%D the path is {\em primarily vertical}. It rounds the width -%D so that vertical lines come out an integer number of pixels -%D wide in device space. The \type{0 y ...} form does the same -%D for paths that are {\em primarily horizontal}. The reason -%D why I did this is Knuth insists on getting exactly the -%D widths \TEX\ intends for the horizontal and vertical rules -%D in \type{btex...etex} output. (Note that PostScript scan -%D conversion rules cause a horizontal or vertical line of -%D integer width $n$ in device space to come out $n+1$ pixels -%D wide, regardless of the phase relative to the pixel grid.) -%D \stopsmaller -%D -%D The common operator in these sequences is \type{dtransform}, -%D so we can use this one to trigger setting the linewidth. - -\def\handleMPdtransform% - {\ifdim\gMPa1pt>\!!zeropoint - \pdfliteral{\gMPa1 w}% - \def\next##1 ##2 ##3 ##4 ##5 ##6 {\handleMPsequence}% - \else - \pdfliteral{\gMPa2 w}% - \def\next##1 ##2 ##3 ##4 {\handleMPsequence}% - \fi - \let\handleMPsequence=\dohandleMPsequence - \resetMPstack - \next} - -%D The most complicated command is \type{concat}. \METAPOST\ -%D applies this operator to \type{stoke}. At that moment the -%D points set by \type{curveto} and \type{moveto}, are already -%D fixed. In \PDF\ however the \type{cm} operator affects the -%D points as well as the pen (stroke). Like more \PDF\ -%D operators, \type{cm} is a defined in a bit ambiguous way. -%D The only save route for non||circular penshapes, is saving -%D teh path, recalculating the points and applying the -%D transformation matrix in such a way that we can be sure -%D that its behavior is well defined. This comes down to -%D inverting the path and applying \type{cm} to that path as -%D well as the pen. This all means that we have to save the -%D path. - -%D In \METAPOST\ there are three ways to handle a path $p$: -%D -%D \starttypen -%D draw p; fill p; filldraw p; -%D \stoptypen -%D -%D The last case outputs a \type{gsave fill grestore} before -%D \type{stroke}. Handling the path outside the main loops -%D saves about 40\% run time.\voetnoot{We can save some more by -%D following the \METAPOST\ output routine, but for the moment -%D we keep things simple.} Switching between the main loop and -%D the path loop is done by means of the recursely called -%D macro \type{\handleMPsequence}. - -\def\handleMPpath% - {\chardef\finiMPpath=0 - \let\closeMPpath=\relax - \let\flushMPpath=\flushnormalMPpath - \resetMPstack - \nofMPsegments=1 - \let\handleMPsequence=\dohandleMPpath - \dohandleMPpath} - -%D Most paths are drawn with simple round pens. Therefore we've -%D split up the routinein two. - -\def\flushnormalMPpath% - {\scratchcounter=\nofMPsegments - \nofMPsegments=1 - \loop - \expandafter\ifcase\getMPkeyword{\the\nofMPsegments}\relax - \pdfliteral{\gMPs1 \gMPs2 l}% - \or - \pdfliteral{\gMPs1 \gMPs2 \gMPs3 \gMPs4 \gMPs5 \gMPs6 c}% - \or - \pdfliteral{\lastMPmoveX\space \lastMPmoveY\space l S}% - \or - \edef\lastMPmoveX{\gMPs1}% - \edef\lastMPmoveY{\gMPs2}% - \pdfliteral{\lastMPmoveX\space \lastMPmoveY\space m}% - \fi - \advance\nofMPsegments by 1\relax - \ifnum\nofMPsegments<\scratchcounter - \repeat} - -\def\flushconcatMPpath% - {\scratchcounter=\nofMPsegments - \nofMPsegments=1 - \loop - \expandafter\ifcase\getMPkeyword{\the\nofMPsegments}\relax - \doMPconcat{\gMPs1}\a{\gMPs2}\b - \pdfliteral{\a\space \b\space l}% - \or - \doMPconcat{\gMPs1}\a{\gMPs2}\b - \doMPconcat{\gMPs3}\c{\gMPs4}\d - \doMPconcat{\gMPs5}\e{\gMPs6}\f - \pdfliteral{\a\space \b\space \c\space \d\space \e\space \f\space c}% - \or - \bgroup - \noMPtranslate - \doMPconcat\lastMPmoveX\a\lastMPmoveY\b - \pdfliteral{\a\space \b\space l S}% - \egroup - \or - \edef\lastMPmoveX{\gMPs1}% - \edef\lastMPmoveY{\gMPs2}% - \doMPconcat\lastMPmoveX\a\lastMPmoveY\b - \pdfliteral{\a\space \b\space m}% - \fi - \advance\nofMPsegments by 1\relax - \ifnum\nofMPsegments<\scratchcounter - \repeat} - -%D The transformation of the coordinates is handled by one of -%D the macros Tanmoy posted to the \PDFTEX\ mailing list. -%D I rewrote and optimized the original macro to suit the other -%D macros in this module. -%D -%D \starttypen -%D \doMPconcat {x position} \xresult {y position} \yresult -%D \stoptypen -%D -%D -%D By setting the auxiliary \DIMENSIONS\ \type{\dimen0} upto -%D \type{\dimen10} only once per path, we save over 20\% run -%D time. Some more speed was gained by removing some parameter -%D passing. These macros can be optimized a bit more by using -%D more constants. There is however not much need for further -%D optimization because penshapes usually are round and -%D therefore need no transformation. Nevertheless we move the -%D factor to the outer level and use bit different \type{pt} -%D removal macro. Although the values represent base points, -%D we converted them to pure points, simply because those can -%D be converted back. - -\def\MPconcatfactor{256} - -\def\doMPreducedimen#1 - {\count0=\MPconcatfactor - \advance\dimen#1 \ifdim\dimen#1>\!!zeropoint .5\else -.5\fi\count0 - \divide\dimen#1 \count0\relax} - -\def\doMPexpanddimen#1 - {\multiply\dimen#1 \MPconcatfactor\relax} - -\def\presetMPconcat% - {\dimen 0=\gMPs1 pt \doMPreducedimen 0 % r_x - \dimen 2=\gMPs2 pt \doMPreducedimen 2 % s_x - \dimen 4=\gMPs3 pt \doMPreducedimen 4 % s_y - \dimen 6=\gMPs4 pt \doMPreducedimen 6 % r_y - \dimen 8=\gMPs5 pt \doMPreducedimen 8 % t_x - \dimen10=\gMPs6 pt \doMPreducedimen10 } % t_y - -\def\noMPtranslate% use this one grouped - {\dimen 8=\!!zeropoint % t_x - \dimen10=\!!zeropoint} % t_y - -\def\doMPconcat#1#2#3#4% - {\dimen12=#1 pt \doMPreducedimen12 % p_x - \dimen14=#3 pt \doMPreducedimen14 % p_y - % - \dimen16 \dimen 0 - \multiply \dimen16 \dimen 6 - \dimen20 \dimen 2 - \multiply \dimen20 \dimen 4 - \advance \dimen16 -\dimen20 - % - \dimen18 \dimen12 - \multiply \dimen18 \dimen 6 - \dimen20 \dimen14 - \multiply \dimen20 \dimen 4 - \advance \dimen18 -\dimen20 - \dimen20 \dimen 4 - \multiply \dimen20 \dimen10 - \advance \dimen18 \dimen20 - \dimen20 \dimen 6 - \multiply \dimen20 \dimen 8 - \advance \dimen18 -\dimen20 - % - \multiply \dimen12 -\dimen 2 - \multiply \dimen14 \dimen 0 - \advance \dimen12 \dimen14 - \dimen20 \dimen 2 - \multiply \dimen20 \dimen 8 - \advance \dimen12 \dimen20 - \dimen20 \dimen 0 - \multiply \dimen20 \dimen10 - \advance \dimen12 -\dimen20 - % - \doMPreducedimen16 - \divide \dimen18 \dimen16 \doMPexpanddimen18 - \divide \dimen12 \dimen16 \doMPexpanddimen12 - % - \edef#2{\withoutpt{\the\dimen18}}% % p_x^\prime - \edef#4{\withoutpt{\the\dimen12}}} % p_y^\prime - -%D The following explanation of the conversion process was -%D posted to the \PDFTEX\ mailing list by Tanmoy. The original -%D macro was part of a set of macro's that included sinus and -%D cosinus calculation as well as scaling and translating. The -%D \METAPOST\ to \PDF\ conversion however only needs -%D transformation. - -%D \start \switchnaarkorps [ss] -%D -%D Given a point $(U_x, U_y)$ in user coordinates, the business -%D of \POSTSCRIPT\ is to convert it to device space. Let us say -%D that the device space coordinates are $(D_x, D_y)$. Then, in -%D \POSTSCRIPT\ $(D_x, D_y)$ can be written in terms of -%D $(U_x, U_y)$ in matrix notation, either as -%D -%D \plaatsformule -%D \startformule -%D \pmatrix{D_x&D_y&1\cr} = \pmatrix{U_x&U_y&1\cr} -%D \pmatrix{s_x&r_x&0\cr -%D r_y&s_y&0\cr -%D t_x&t_y&1\cr} -%D \stopformule -%D -%D or -%D -%D \plaatsformule -%D \startformule -%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x&r_y&t_x\cr -%D r_x&s_y&t_y\cr -%D 0 &0 &1 \cr} -%D \pmatrix{U_x\cr -%D U_y\cr -%D 1 \cr} -%D \stopformule -%D -%D both of which is a shorthand for the same set of equations: -%D -%D \plaatsformule -%D \startformule -%D D_x = s_x U_x + r_y U_y + t_x -%D \stopformule -%D -%D \plaatsformule -%D \startformule -%D D_y = r_x U_x + s_y U_y + t_y -%D \stopformule -%D -%D which define what is called an `affine transformation'. -%D -%D \POSTSCRIPT\ represents the `transformation matrix' as a -%D six element matrix instead of a $3\times 3$ array because -%D three of the elements are always~0, 0 and~1. Thus the above -%D transformation is written in postscript as $[s_x\, r_x\, -%D r_y\, s_y\, t_x\, t_y]$. However, when doing any -%D calculations, it is useful to go back to the original -%D matrix notation (whichever: I will use the second) and -%D continue from there. -%D -%D As an example, if the current transformation matrix is -%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$ and you say \typ{[a b -%D c d e f] concat}, this means: -%D -%D \startsmaller -%D Take the user space coordinates and transform them to an -%D intermediate set of coordinates using array $[a\, b\, c\, d\, -%D e\, f]$ as the transformation matrix. -%D -%D Take the intermediate set of coordinates and change them to -%D device coordinates using array $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$ -%D as the transformation matrix. -%D \stopsmaller -%D -%D Well, what is the net effect? In matrix notation, it is -%D -%D \plaatsformule -%D \startformule -%D \pmatrix{I_x\cr I_y\cr 1\cr} = \pmatrix{a&c&e\cr -%D b&d&f\cr -%D 0&0&1\cr} -%D \pmatrix{U_x\cr -%D U_y\cr -%D 1 \cr} -%D \stopformule -%D -%D \plaatsformule -%D \startformule -%D \pmatrix{D_y\cr D_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr -%D r_x&s_y&t_y\cr -%D 0 &0 &1 \cr} -%D \pmatrix{I_x\cr -%D I_y\cr -%D 1 \cr} -%D \stopformule -%D -%D where $(I_x, I_y)$ is the intermediate coordinate. -%D -%D Now, the beauty of the matrix notation is that when there is -%D a chain of such matrix equations, one can always compose -%D them into one matrix equation using the standard matrix -%D composition law. The composite matrix from two matrices can -%D be derived very easily: the element in the $i$\hoog{th} -%D horizontal row and $j$\hoog{th} vertical column is -%D calculated by`multiplying' the $i$\hoog{th} row of the first -%D matrix and the $j$\hoog{th} column of the second matrix (and -%D summing over the elements). Thus, in the above: -%D -%D \plaatsformule -%D \startformule -%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr -%D r_x^\prime&s_y^\prime&t_y^\prime\cr -%D 0 &0 &0 \cr} -%D \pmatrix{U_x\cr -%D U_y\cr -%D 1 \cr} -%D \stopformule -%D -%D with -%D -%D \plaatsformule -%D \startformule -%D \eqalign -%D {s_x^\prime & = s_x a + r_y b \cr -%D r_x^\prime & = r_x a + s_y b \cr -%D r_y^\prime & = s_x c + r_y d \cr -%D s_y^\prime & = r_x c + s_y d \cr -%D t_x^\prime & = s_x e + r_y f + t_x \cr -%D t_y^\prime & = r_x e + s_y f + t_y \cr} -%D \stopformule - -%D In fact, the same rule is true not only when one is going -%D from user coordinates to device coordinates, but whenever -%D one is composing two `transformations' together -%D (transformations are `associative'). Note that the formula -%D is not symmetric: you have to keep track of which -%D transformation existed before (i.e.\ the equivalent of -%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$) and which was -%D specified later (i.e.\ the equivalent of $[a\, b\, c\, d\, -%D e\, f]$). Note also that the language can be rather -%D confusing: the one specified later `acts earlier', -%D converting the user space coordinates to intermediate -%D coordinates, which are then acted upon by the pre||existing -%D transformation. The important point is that order of -%D transformation matrices cannot be flipped (transformations -%D are not `commutative'). -%D -%D Now what does it mean to move a transformation matrix -%D before a drawing? What it means is that given a point -%D $(P_x, P_y)$ we need a different set of coordinates -%D $(P_x^\prime, P_y^\prime)$ such that if the transformation -%D acts on $(P_x^\prime, P_y^\prime)$, they produce $(P_x, -%D P_y)$. That is we need to solve the set of equations: -%D -%D \plaatsformule -%D \startformule -%D \pmatrix{P_x\cr P_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr -%D r_x&s_y&t_y\cr -%D 0 &0 &1 \cr} -%D \pmatrix{P_x^\prime\cr -%D P_y^\prime\cr -%D 1 \cr} -%D \stopformule -%D -%D Again matrix notation comes in handy (i.e. someone has -%D already solved the problem for us): we need the inverse -%D transformation matrix. The inverse transformation matrix can -%D be calculated very easily: it is -%D -%D \plaatsformule -%D \startformule -%D \pmatrix{P_x^\prime\cr P_y^\prime\cr 1\cr} = -%D \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr -%D r_x^\prime&s_y^\prime&t_y^\prime\cr -%D 0 &0 &1 \cr} -%D \pmatrix{P_x\cr -%D P_y\cr -%D 1 \cr} -%D \stopformule -%D -%D where, the inverse transformation matrix is given by -%D -%D \plaatsformule -%D \startformule -%D \eqalign -%D {D & = s_x s_y - r_x r_y \cr -%D s_x^\prime & = s_y / D \cr -%D s_y^\prime & = s_x / D \cr -%D r_x^\prime & = - r_x / D \cr -%D r_y^\prime & = - r_y / D \cr -%D t_x^\prime & = ( - s_y t_x + r_y t_y ) / D \cr -%D t_y^\prime & = ( r_x t_x - s_x t_y ) / D \cr} -%D \stopformule -%D -%D And you can see that when expanded out, this does -%D give the formulas: -%D -%D \plaatsformule -%D \startformule -%D P_x^\prime = { { s_y(p_x-t_x) + r_y(t_y-p_y) } \over -%D { s_x*s_y-r_x*r_y } } -%D \stopformule -%D -%D \plaatsformule -%D \startformule -%D P_y^\prime = { { s_x(p_y-t_y) + r_x(t_x-p_x) } \over -%D { s_x*s_y-r_x*r_y } } -%D \stopformule -%D -%D The code works by representing a real number by converting -%D it to a dimension to be put into a \DIMENSION\ register: 2.3 would -%D be represented as 2.3pt for example. In this scheme, -%D multiplying two numbers involves multiplying the \DIMENSION\ -%D registers and dividing by 65536. Accuracy demands that the -%D division be done as late as possible, but overflow -%D considerations need early division. -%D -%D Division involves dividing the two \DIMENSION\ registers and -%D multiplying the result by 65536. Again, accuracy would -%D demand that the numerator be multiplied (and|/|or the -%D denominator divided) early: but that can lead to overflow -%D which needs to be avoided. -%D -%D If nothing is known about the numbers to start with (in -%D concat), I have chosen to divide the 65536 as a 256 in each -%D operand. However, in the series calculating the sine and -%D cosine, I know that the terms are small (because I never -%D have an angle greater than 45 degrees), so I chose to -%D apportion the factor in a different way. -%D -%D \stop -%D -%D The path is output using the values saved on the stack. If -%D needed, all coordinates are recalculated. - -\def\processMPpath% - {\flushMPpath - \closeMPpath - \pdfliteral{\ifcase\finiMPpath W n\or S\or f\or B\fi}% - \let\handleMPsequence=\dohandleMPsequence - \resetMPstack - \nofMPsegments=0 - \handleMPsequence} - -%D In \PDF\ the \type{cm} operator must precede the path -%D specification. We therefore can output the \type{cm} at -%D the moment we encounter it. - -\def\handleMPpathconcat% - {\presetMPconcat - \pdfliteral{\gMPs1 \gMPs2 \gMPs3 \gMPs4 \gMPs5 \gMPs6 cm}% - \resetMPstack} - -%D This macro interprets the path and saves it as compact as -%D possible. - -\def\dohandleMPpath#1#2 % - {\ifnum\lccode`#1=0 - \setMPargument{#1#2}% - \else - \def\somestring{#1#2}% - \ifx\somestring\PSlineto - \setMPkeyword0 - \else\ifx\somestring\PScurveto - \setMPkeyword1 - \else\ifx\somestring\PSrlineto - \setMPkeyword2 - \else\ifx\somestring\PSmoveto - \setMPkeyword3 - \else\ifx\somestring\PSclip - \let\handleMPsequence=\processMPpath - \else\ifx\somestring\PSgsave - \chardef\finiMPpath=3 - \else\ifx\somestring\PSgrestore - \else\ifx\somestring\PSfill - \ifnum\finiMPpath=0 - \chardef\finiMPpath=2 - \let\handleMPsequence=\processMPpath - \fi - \else\ifx\somestring\PSstroke - \ifnum\finiMPpath=0 - \chardef\finiMPpath=1 - \fi - \let\handleMPsequence=\processMPpath - \else\ifx\somestring\PSclosepath - \def\closeMPpath{\pdfliteral{h}}% - \else\ifx\somestring\PSconcat - \let\flushMPpath=\flushconcatMPpath - \handleMPpathconcat - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \fi - \handleMPsequence} - -%D The main conversion command is -%D -%D \starttypen -%D \convertMPtoPDF {filename} {x scale} {y scale} -%D \stoptypen -%D -%D The dimensions are derived from the bounding box. So we -%D only have to say: -%D -%D \starttypen -%D \convertMPtoPDF{mp-pra-1.eps}{1}{1} -%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5} -%D \stoptypen - -\def\convertMPtoPDF#1#2#3% - {\bgroup - \message{[MP to PDF #1]}% - \setMPspecials - \startMPscanning - \def\do{}% - \edef\MPxscale{#2}% - \edef\MPyscale{#3}% - \setbox0=\vbox\bgroup - \forgetall - \offinterlineskip - \pdfliteral{q}% - \let\handleMPsequence=\dohandleMPsequence - \catcode`\^^M=\@@endofline - \input #1\relax} - -\def\finishMPgraphic% - {\pdfliteral{Q}% - \egroup - \wd0=\MPwidth - \vbox to \MPheight - {\forgetall - \vfill - \pdfliteral{q \MPxscale\space 0 0 \MPyscale\space - \MPxoffset\space \MPyoffset\space cm}% - \box0 - \pdfliteral{Q}}% - \egroup} - -%D This kind of conversion is possible because \METAPOST\ -%D does all the calculations. Converting other \POSTSCRIPT\ -%D files would drive both me and \TEX\ crazy. - -\protect - -\endinput +%D \module
+%D [ file=supp-pdf,
+%D version=1997.05.21,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\METAPOST\ to \PDF\ conversion,
+%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.
+
+%D These macros are written as generic as possible. Some
+%D general support macro's are loaded from a small module
+%D especially made for non \CONTEXT\ use. In this module I
+%D use a matrix transformation macro written by Tanmoy
+%D Bhattacharya. Thanks to extensive testing of Sebastian
+%D Ratz I was able to complete this module within reasonable
+%D time. First we take care of non||\CONTEXT\ use:
+
+\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+
+%D This module handles some \PDF\ conversion and insertions
+%D topics. The macros use the \PDFTEX\ primitive
+%D \type{\pdfliteral}.
+
+\writestatus{loading}{Context Support Macros / PDF}
+
+\unprotect
+
+\ifx\pdfliteral\undefined
+ \def\pdfliteral#1{\message{[ignored pdfliteral: #1]}}
+\fi
+
+%D \macros
+%D {convertPDFtoPDF}
+%D {}
+%D
+%D \PDFTEX\ supports verbatim inclusion of \PDF\ code. The
+%D following macro takes care of inserting externally defined
+%D illustrations in \PDF\ format. According to a suggestion
+%D Tanmoy Bhattacharya posted to the \PDFTEX\ mailing list, we
+%D first skip lines until \type{stream} is reached and then
+%D copy lines until \type{endstream} is encountered. This
+%D scheme only works with vectorized graphics in which no
+%D indirect references to objects are used. Bitmaps also don't
+%D work. Interpreting their specifications is beyond the
+%D current implementation.
+%D
+%D \starttypen
+%D \convertPDFtoPDF
+%D {filename}
+%D {x scale} {y scale}
+%D {x offset } {y offset}
+%D {width} {height}
+%D \stoptypen
+%D
+%D When the scales are set to~1, the last last four values
+%D are the same as the bounding box, e.g.
+%D
+%D \starttypen
+%D \convertPDFtoPDF{mp-pra-1.pdf} {1} {1}{-1bp}{-1bp}{398bp}{398bp}
+%D \convertPDFtoPDF{mp-pra-1.pdf}{.5}{.5} {0bp} {0bp}{199bp}{199bp}
+%D \stoptypen
+%D
+%D Keep in mind, that this kind of copying only works for
+%D pure and valid pdf code (without fonts).
+
+%D The scanning and copying is straightforward and quite fast.
+%D To speed up things we use two constants.
+
+\def\@@PDFstream@@ {stream}
+\def\@@PDFendstream@@ {endstream}
+
+%D \macros
+%D {PDFmediaboxprefered}
+%D {}
+%D
+%D If needed, the macros can scan for the mediabox that
+%D specifies the dimensions and offsets of the graphic. When
+%D we say:
+%D
+%D \starttypen
+%D \PDFmediaboxpreferedtrue
+%D \stoptypen
+%D
+%D the mediabox present in the file superseded the user
+%D specified, already scaled and calculated offset and
+%D dimensions. Beware: the user supplied values are not the
+%D bounding box ones!
+
+\newif\ifPDFmediaboxprefered
+
+\def\setPDFboundingbox#1#2#3#4#5#6%
+ {\dimen0=#1\dimen0=#5\dimen0
+ \ScaledPointsToBigPoints{\number\dimen0}\PDFxoffset
+ \dimen0=#3\dimen0=#5\dimen0
+ \xdef\PDFwidth{\the\dimen0}%
+ \dimen0=#2\dimen0=#6\dimen0
+ \ScaledPointsToBigPoints{\number\dimen0}\PDFyoffset
+ \dimen0=#4\dimen0=#6\dimen0
+ \xdef\PDFheight{\the\dimen0}%
+ \global\let\PDFxoffset=\PDFxoffset
+ \global\let\PDFyoffset=\PDFyoffset}
+
+\def\setPDFmediabox#1[#2 #3 #4 #5]#6\done%
+ {\dimen2=#2bp\dimen2=-\dimen2
+ \dimen4=#3bp\dimen4=-\dimen4
+ \dimen6=#4bp\advance\dimen6 by \dimen2
+ \dimen8=#5bp\advance\dimen8 by \dimen4
+ \setPDFboundingbox{\dimen2}{\dimen4}{\dimen6}{\dimen8}\PDFxscale\PDFyscale}
+
+\def\checkPDFmediabox#1/MediaBox#2#3\done%
+ {\ifx#2\relax \else
+ \message{mediabox}%
+ \setPDFmediabox#2#3\done
+ \fi}
+
+%D We use the general macro \type{\doprocessfile} and feed this
+%D with a line handling macro that changed it's behavior when
+%D the stream operators are encountered.
+
+\def\handlePDFline%
+ {\ifx\@@PDFstream@@\fileline
+ \let\doprocessPDFline=\copyPDFobject
+ \startPDFtoPDF
+ \else\ifPDFmediaboxprefered
+ \expandafter\checkPDFmediabox\fileline/MediaBox\relax\done
+ \fi\fi}
+
+\def\copyPDFobject%
+ {\ifx\@@PDFendstream@@\fileline
+ \ifPDFmediaboxprefered
+ \let\doprocessPDFline=\findPDFmediabox
+ \else
+ \let\doprocessPDFline=\relax
+ \fi
+ \else
+ \advance\scratchcounter by 1
+ \pdfliteral{\fileline}%
+ \fi}
+
+\def\findPDFmediabox%
+ {\expandafter\checkPDFmediabox\fileline/MediaBox\relax\done}
+
+%D The main conversion macro wraps the \PDF\ codes in a box
+%D that is output as an object. The graphics are embedded
+%D in~\type{q} and~\type{Q} and are scaled and positioned using
+%D one transform call (\type{cm}). This saves some additional
+%D scaling.
+
+\def\startPDFtoPDF%
+ {\setbox0=\vbox\bgroup
+ \message{[PDF to PDF \PDFfilename}%
+ \forgetall
+ \scratchcounter=0
+ \let\stopPDFtoPDF=\dostopPDFtoPDF}
+
+\def\dostopPDFtoPDF%
+ {\ifnum\scratchcounter<0 \scratchcounter=1 \fi
+ \message{(\the\scratchcounter\space lines)]}%
+ \egroup
+ \wd0=\PDFwidth
+ \vbox to \PDFheight
+ {\forgetall
+ \vfill
+ \pdfliteral{q}%
+ \pdfliteral{1 0 0 1 \PDFxoffset\space \PDFyoffset\space cm}%
+ \pdfliteral{\PDFxscale\space 0 0 \PDFyscale\space 0 0 cm}%
+ \box0
+ \pdfliteral{Q}}}
+
+\def\stopPDFtoPDF%
+ {\message{[PDF to PDF \PDFfilename\space not found]}}
+
+\def\convertPDFtoPDF#1#2#3#4#5#6#7%
+ {\bgroup
+ \def\PDFfilename{#1}%
+ \def\PDFxscale {#2}%
+ \def\PDFyscale {#3}%
+ \setPDFboundingbox{#4}{#5}{#6}{#7}{1}{1}%
+ \uncatcodespecials
+ \endlinechar=-1
+ \let\doprocessPDFline=\handlePDFline
+ \doprocessfile\scratchread\PDFfilename\doprocessPDFline
+ \stopPDFtoPDF
+ \egroup}
+
+%D \macros
+%D {convertMPtoPDF}
+%D {}
+%D
+%D The next set of macros implements \METAPOST\ to \PDF\
+%D conversion. Because we want to test as fast as possible, we
+%D first define the \POSTSCRIPT\ operators that \METAPOST\
+%D uses. We don't define irrelevant ones, because these are
+%D skipped anyway.
+
+\def \PScurveto {curveto}
+\def \PSlineto {lineto}
+\def \PSmoveto {moveto}
+\def \PSshowpage {showpage}
+\def \PSnewpath {newpath}
+\def \PSfshow {fshow}
+\def \PSclosepath {closepath}
+\def \PSfill {fill}
+\def \PSstroke {stroke}
+\def \PSclip {clip}
+\def \PSrlineto {rlineto}
+\def \PSsetlinejoin {setlinejoin}
+\def \PSsetlinecap {setlinecap}
+\def \PSsetmiterlimit {setmiterlimit}
+\def \PSsetgray {setgray}
+\def \PSsetrgbcolor {setrgbcolor}
+\def \PSsetcmykcolor {setcmykcolor}
+\def \PSsetdash {setdash}
+\def \PSgsave {gsave}
+\def \PSgrestore {grestore}
+\def \PStranslate {translate}
+\def \PSscale {scale}
+\def \PSconcat {concat}
+\def \PSdtransform {dtransform}
+
+\def \PSBoundingBox {BoundingBox:}
+\def \PSHiResBoundingBox {HiResBoundingBox:}
+\def \PSExactBoundingBox {ExactBoundingBox:}
+\def \PSPage {Page:}
+
+%D By the way, the \type {setcmykcolor} operator is not
+%D output by \METAPOST\ but can result from converting the
+%D \kap{RGB} color specifications, as implemented in
+%D \type{supp-mps}.
+
+%D In \POSTSCRIPT\ arguments precede the operators. Due to the
+%D fact that in some translations we need access to those
+%D arguments, as well as that sometimes we have to skip them,
+%D we stack them up. The stack is one||dimensional for non path
+%D operators and two||dimensional for operators inside a path.
+%D This is because we have to save the whole path for
+%D (optional) postprocessing. Values are pushed onto the stack
+%D by:
+%D
+%D \starttypen
+%D \setMPargument {value}
+%D \stoptypen
+%D
+%D They can be retrieved by the short named macros:
+%D
+%D \starttypen
+%D \gMPa {number}
+%D \sMPa {number}
+%D \stoptypen
+%D
+%D When scanning a path specification, we also save the
+%D operator, using
+%D
+%D \starttypen
+%D \setMPkeyword {n}
+%D \stoptypen
+%D
+%D The path drawing operators are coded for speed: \type{clip},
+%D \type{stroke}, \type{fill} and \type{fillstroke} become
+%D 1, 2, 3 and~4.
+%D
+%D When processing the path this code can be retrieved
+%D using
+%D
+%D \starttypen
+%D \getMPkeyword{n}
+%D \stoptypen
+%D
+%D When setting an argument, the exact position on the stack
+%D depend on the current value of the \COUNTERS\
+%D \type{\nofMPsegments} and \type{\nofMParguments}.
+
+\newcount\nofMPsegments
+\newcount\nofMParguments
+
+%D These variables hold the coordinates. The argument part of
+%D the stack is reset by:
+%D
+%D \starttypen
+%D \resetMPstack
+%D \stoptypen
+%D
+%D We use the prefix \type{@@MP} to keep the stack from
+%D conflicting with existing macros. To speed up things bit
+%D more, we use the constant \type{\@@MP}.
+
+\def\@@MP{@@MP}
+
+\def\setMPargument#1%
+ {\advance\nofMParguments by 1
+ \expandafter\def
+ \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname%
+ {\do#1}}
+
+\def\gMPa#1%
+ {\csname\@@MP0#1\endcsname}
+
+\def\gMPs#1%
+ {\csname\@@MP\the\nofMPsegments#1\endcsname}
+
+\def\setMPkeyword#1
+ {\expandafter\def\csname\@@MP\the\nofMPsegments0\endcsname{#1}%
+ \advance\nofMPsegments by 1
+ \nofMParguments=0\relax}
+
+\def\getMPkeyword#1%
+ {\csname\@@MP#10\endcsname}
+
+%D When we reset the stack, we can assume that all further
+%D comment is to be ignored as well as handled in strings.
+%D By redefining the reset macro after the first call, we
+%D save some run time.
+
+\def\resetMPstack%
+ {\catcode`\%=\@@active
+ \let\handleMPgraphic=\handleMPendgraphic
+ \def\resetMPstack{\nofMParguments=0\relax}%
+ \resetMPstack}
+
+%D The arguments are saved with the preceding command
+%D \type{\do}. By default this command expands to nothing, but
+%D when we deal with strings it's used to strip off the
+%D \type{(} and \type{)}.
+%D
+%D Strings are kind of tricky, because characters can be
+%D passed verbatim \type{(hello)}, by octal number
+%D \type{(\005)} or as command \type{(\()}. We therefore
+%D cannot simply ignore \type{(} and \type{)}, the way we do
+%D with \type{[} and \type{]}. Another complication is that
+%D strings may contain characters that normally have a
+%D special meaning in \TEX, like \type{$} and \type{{}}.
+%D
+%D A previous solution made \type{\} an active character and
+%D let it look ahead for a number or character. W ehad to
+%D abandon this scheme because of the need for verbatim
+%D support. The next solution involved some \CATCODE\
+%D trickery but works well.
+
+\def\octalMPcharacter#1#2#3%
+ {\char'#1#2#3\relax}
+
+\bgroup
+\catcode`\|=\@@comment
+\catcode`\%=\@@active
+\catcode`\[=\@@active
+\catcode`\]=\@@active
+\catcode`\{=\@@active
+\catcode`\}=\@@active
+\catcode`B=\@@begingroup
+\catcode`E=\@@endgroup
+\gdef\ignoreMPspecials|
+ B\def%BE|
+ \def[BE|
+ \def]BE|
+ \def{BE|
+ \def}BEE
+\gdef\obeyMPspecials|
+ B\def%B\char 37\relax E|
+ \def[B\char 91\relax E|
+ \def]B\char 93\relax E|
+ \def{B\char123\relax E|
+ \def}B\char125\relax EE
+\gdef\setMPspecials|
+ B\catcode`\%=\@@active
+ \catcode`\[=\@@active
+ \catcode`\]=\@@active
+ \catcode`\{=\@@active
+ \catcode`\}=\@@active
+ \catcode`\$=\@@letter
+ \catcode`\_=\@@letter
+ \catcode`\#=\@@letter
+ \catcode`\^=\@@letter
+ \catcode`\&=\@@letter
+ \catcode`\|=\@@letter
+ \catcode`\~=\@@letter
+ \def\(B\char40\relax E|
+ \def\)B\char41\relax E|
+ \def\\B\char92\relax E|
+ \def\0B\octalMPcharacter0E|
+ \def\1B\octalMPcharacter1E|
+ \def\2B\octalMPcharacter2E|
+ \def\3B\octalMPcharacter3E|
+ \def\4B\octalMPcharacter4E|
+ \def\5B\octalMPcharacter5E|
+ \def\6B\octalMPcharacter6E|
+ \def\7B\octalMPcharacter7E|
+ \def\8B\octalMPcharacter8E|
+ \def\9B\octalMPcharacter9EE
+\egroup
+
+%D We use the comment symbol as a sort of trigger:
+
+\bgroup
+\catcode`\%=\@@active
+\gdef\startMPscanning{\let%=\startMPconversion}
+\egroup
+
+%D In earlier versions we used the sequence
+%D
+%D \starttypen
+%D \expandafter\handleMPsequence\input filename\relax
+%D \stoptypen
+%D
+%D Persistent problems in \LATEX\ however forced us to use a
+%D different scheme. Every \POSTSCRIPT\ file starts with a
+%D \type{%}, so we temporary make this an active character
+%D that starts the scanning and redefines itself. (The problem
+%D originates in the redefinition by \LATEX\ of the
+%D \type{\input} primitive.)
+
+\def\startMPconversion%
+ {\catcode`\%=\@@ignore
+ \ignoreMPspecials
+ \handleMPsequence}
+
+%D Here comes the main loop. Most arguments are numbers. This
+%D means that they can be recognized by their \type{\lccode}.
+%D This method saves a lot of processing time. We could
+%D speed up the conversion by handling the \type{path}
+%D seperately.
+
+\def\dohandleMPsequence#1#2 %
+ {\ifnum\lccode`#1=0
+ \setMPargument{#1#2}%
+ \else
+ \edef\somestring{#1#2}%
+ \ifx\somestring\PSmoveto
+ \edef\lastMPmoveX{\gMPa1}%
+ \edef\lastMPmoveY{\gMPa2}%
+ \pdfliteral{\gMPa1 \gMPa2 m}%
+ \resetMPstack
+ \else\ifx\somestring\PSnewpath
+ \let\handleMPsequence=\handleMPpath
+ \else\ifx\somestring\PSgsave
+ \pdfliteral{q}%
+ \resetMPstack
+ \else\ifx\somestring\PSgrestore
+ \pdfliteral{Q}%
+ \resetMPstack
+ \else\ifx\somestring\PSdtransform % == setlinewidth
+ \let\handleMPsequence=\handleMPdtransform
+ \else\ifx\somestring\PSconcat
+ \pdfliteral{\gMPa1 \gMPa2 \gMPa3 \gMPa4 \gMPa5 \gMPa6 cm}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetrgbcolor
+ \pdfliteral{\gMPa1 \gMPa2 \gMPa3 rg \gMPa1 \gMPa2 \gMPa3 RG}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetcmykcolor
+ \pdfliteral{\gMPa1 \gMPa2 \gMPa3 \gMPa4 k \gMPa1 \gMPa2 \gMPa3 \gMPa4 K}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetgray
+ \pdfliteral{\gMPa1 g \gMPa1 G}%
+ \resetMPstack
+ \else\ifx\somestring\PStranslate
+ \pdfliteral{1 0 0 1 \gMPa1 \gMPa2 cm}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetdash
+ \handleMPsetdash
+ \resetMPstack
+ \else\ifx\somestring\PSsetlinejoin
+ \pdfliteral{\gMPa1 j}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetmiterlimit
+ \pdfliteral{\gMPa1 M}%
+ \resetMPstack
+ \else\ifx\somestring\PSfshow
+ \handleMPfshow
+ \resetMPstack
+ \else\ifx\somestring\PSsetlinecap
+ \pdfliteral{\gMPa1 J}%
+ \resetMPstack
+ \else\ifx\somestring\PSrlineto
+ \pdfliteral{\lastMPmoveX\space \lastMPmoveY\space l S}%
+ \resetMPstack
+ \else\ifx\somestring\PSscale
+ \pdfliteral{\gMPa1 0 0 \gMPa2 0 0 cm}%
+ \resetMPstack
+ \else
+ \handleMPgraphic{#1#2}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi
+ \handleMPsequence}
+
+%D Beginning and ending the graphics is taken care of by the
+%D macro \type{\handleMPgraphic}, which is redefined when
+%D the first graphics operator is met.
+
+\def\handleMPendgraphic#1%
+ {\ifx\somestring\PSshowpage
+ \let\handleMPsequence=\finishMPgraphic
+ \else
+ \setMPargument{#1}%
+ \fi}
+
+\def\handleMPbegingraphic#1%
+ {\ifx\somestring\PSBoundingBox
+ \let\handleMPsequence=\handleMPboundingbox
+ \else\ifx\somestring\PSHiResBoundingBox
+ \let\handleMPsequence=\handleMPboundingbox
+ \else\ifx\somestring\PSExactBoundingBox
+ \let\handleMPsequence=\handleMPboundingbox
+ \else\ifx\somestring\PSPage
+ \let\handleMPsequence=\handleMPpage
+ \else
+ \setMPargument{#1}%
+ \fi\fi\fi\fi}
+
+\let\handleMPgraphic=\handleMPbegingraphic
+
+%D We check for three kind of bounding boxes: the normal one
+%D and two high precission ones:
+%D
+%D \starttypen
+%D BoundingBox: llx lly ucx ucy
+%D HiResBoundingBox: llx lly ucx ucy
+%D ExactBoundingBox: llx lly ucx ucy
+%D \stoptypen
+%D
+%D The dimensions are saved for later use.
+
+\def\handleMPboundingbox #1 #2 #3 #4
+ {\dimen0=#1pt\dimen0=-\MPxscale\dimen0
+ \dimen2=#2pt\dimen2=-\MPyscale\dimen2
+ \xdef\MPxoffset{\withoutpt{\the\dimen0}}%
+ \xdef\MPyoffset{\withoutpt{\the\dimen2}}%
+ \dimen0=#1bp\dimen0=-\dimen0
+ \dimen2=#2bp\dimen2=-\dimen2
+ \advance\dimen0 by #3bp
+ \dimen0=\MPxscale\dimen0
+ \xdef\MPwidth{\the\dimen0}%
+ \advance\dimen2 by #4bp
+ \dimen2=\MPyscale\dimen2
+ \xdef\MPheight{\the\dimen2}%
+ \nofMParguments=0
+ \let\handleMPsequence=\dohandleMPsequence
+ \handleMPsequence}
+
+%D We use the \type{page} comment as a signal that
+%D stackbuilding can be started.
+
+\def\handleMPpage #1 #2
+ {\nofMParguments=0
+ \let\handleMPsequence=\dohandleMPsequence
+ \handleMPsequence}
+
+%D \METAPOST\ draws it dots by moving to a location and
+%D invoking \type{0 0 rlineto}. This operator is not
+%D available in \PDF. Our solution is straightforward: we draw
+%D a line from $(current\_x, current\_y)$ to itself. This
+%D means that the arguments of the preceding \type{moveto} have
+%D to be saved.
+
+\def\lastMPmoveX{0}
+\def\lastMPmoveY{0}
+
+%D These saved coordinates are also used when we handle the
+%D texts. Text handling proved to be a bit of a nuisance, but
+%D finaly I saw the light. It proved that we also had to
+%D take care of \type{(split arguments)}.
+
+\def\handleMPfshow%
+ {\setbox0=\hbox
+ {\obeyMPspecials
+ \edef\size{\gMPa{\the\nofMParguments} }%
+ \advance\nofMParguments by -1
+ \font\temp=\gMPa{\the\nofMParguments} at \size bp
+ \advance\nofMParguments by -1
+ \temp
+ \ifnum\nofMParguments=1
+ \def\do(##1){##1}%
+ \gMPa1%
+ \else
+ \scratchcounter=1
+ \def\do(##1{##1}%
+ \gMPa{\the\scratchcounter}\space
+ \def\do{}%
+ \loop
+ \advance\scratchcounter by 1
+ \ifnum\scratchcounter<\nofMParguments
+ \gMPa{\the\scratchcounter}\space
+ \repeat
+ \def\do##1){##1}%
+ \gMPa{\the\scratchcounter}%
+ \fi
+ \unskip}%
+ \dimen0=\lastMPmoveY bp
+ \advance\dimen0 by \ht0
+ \ScaledPointsToBigPoints{\number\dimen0}\lastMPmoveY
+ \pdfliteral{n q 1 0 0 1 \lastMPmoveX\space\lastMPmoveY\space cm}%
+ \dimen0=\ht0
+ \advance\dimen0 by \dp0
+ \box0
+ \vskip-\dimen0
+ \pdfliteral{Q}}
+
+%D Most operators are just converted and keep their
+%D arguments. Dashes however need a bit different treatment,
+%D otherwise \PDF\ viewers complain loudly. Another
+%D complication is that one argument comes after the \type{]}.
+%D When reading the data, we simple ignore the array boundary
+%D characters. We save ourselves some redundant newlines and
+%D at the same time keep the output readable by packing the
+%D literals.
+
+\def\handleMPsetdash%
+ {\bgroup
+ \def\somestring{[}%
+ \scratchcounter=1
+ \loop
+ \ifnum\scratchcounter<\nofMParguments
+ \edef\somestring{\somestring\space\gMPa{\the\scratchcounter}}%
+ \advance\scratchcounter by 1
+ \repeat
+ \edef\somestring{\somestring]\gMPa{\the\scratchcounter} d}%
+ \pdfliteral{\somestring}%
+ \egroup}
+
+%D The \type{setlinewidth} commands look a bit complicated. There are
+%D two alternatives, that alsways look the same. As John Hobby
+%D says:
+%D
+%D \startsmaller
+%D \starttypen
+%D x 0 dtransform exch truncate exch idtransform pop setlinewidth
+%D 0 y dtransform truncate idtransform setlinewidth pop
+%D \stoptypen
+%D
+%D These are just fancy versions of \type{x setlinewidth} and
+%D \type{y setlinewidth}. The \type{x 0 ...} form is used if
+%D the path is {\em primarily vertical}. It rounds the width
+%D so that vertical lines come out an integer number of pixels
+%D wide in device space. The \type{0 y ...} form does the same
+%D for paths that are {\em primarily horizontal}. The reason
+%D why I did this is Knuth insists on getting exactly the
+%D widths \TEX\ intends for the horizontal and vertical rules
+%D in \type{btex...etex} output. (Note that PostScript scan
+%D conversion rules cause a horizontal or vertical line of
+%D integer width $n$ in device space to come out $n+1$ pixels
+%D wide, regardless of the phase relative to the pixel grid.)
+%D \stopsmaller
+%D
+%D The common operator in these sequences is \type{dtransform},
+%D so we can use this one to trigger setting the linewidth.
+
+\def\handleMPdtransform%
+ {\ifdim\gMPa1pt>\!!zeropoint
+ \pdfliteral{\gMPa1 w}%
+ \def\next##1 ##2 ##3 ##4 ##5 ##6 {\handleMPsequence}%
+ \else
+ \pdfliteral{\gMPa2 w}%
+ \def\next##1 ##2 ##3 ##4 {\handleMPsequence}%
+ \fi
+ \let\handleMPsequence=\dohandleMPsequence
+ \resetMPstack
+ \next}
+
+%D The most complicated command is \type{concat}. \METAPOST\
+%D applies this operator to \type{stoke}. At that moment the
+%D points set by \type{curveto} and \type{moveto}, are already
+%D fixed. In \PDF\ however the \type{cm} operator affects the
+%D points as well as the pen (stroke). Like more \PDF\
+%D operators, \type{cm} is a defined in a bit ambiguous way.
+%D The only save route for non||circular penshapes, is saving
+%D teh path, recalculating the points and applying the
+%D transformation matrix in such a way that we can be sure
+%D that its behavior is well defined. This comes down to
+%D inverting the path and applying \type{cm} to that path as
+%D well as the pen. This all means that we have to save the
+%D path.
+
+%D In \METAPOST\ there are three ways to handle a path $p$:
+%D
+%D \starttypen
+%D draw p; fill p; filldraw p;
+%D \stoptypen
+%D
+%D The last case outputs a \type{gsave fill grestore} before
+%D \type{stroke}. Handling the path outside the main loops
+%D saves about 40\% run time.\voetnoot{We can save some more by
+%D following the \METAPOST\ output routine, but for the moment
+%D we keep things simple.} Switching between the main loop and
+%D the path loop is done by means of the recursely called
+%D macro \type{\handleMPsequence}.
+
+\def\handleMPpath%
+ {\chardef\finiMPpath=0
+ \let\closeMPpath=\relax
+ \let\flushMPpath=\flushnormalMPpath
+ \resetMPstack
+ \nofMPsegments=1
+ \let\handleMPsequence=\dohandleMPpath
+ \dohandleMPpath}
+
+%D Most paths are drawn with simple round pens. Therefore we've
+%D split up the routinein two.
+
+\def\flushnormalMPpath%
+ {\scratchcounter=\nofMPsegments
+ \nofMPsegments=1
+ \loop
+ \expandafter\ifcase\getMPkeyword{\the\nofMPsegments}\relax
+ \pdfliteral{\gMPs1 \gMPs2 l}%
+ \or
+ \pdfliteral{\gMPs1 \gMPs2 \gMPs3 \gMPs4 \gMPs5 \gMPs6 c}%
+ \or
+ \pdfliteral{\lastMPmoveX\space \lastMPmoveY\space l S}%
+ \or
+ \edef\lastMPmoveX{\gMPs1}%
+ \edef\lastMPmoveY{\gMPs2}%
+ \pdfliteral{\lastMPmoveX\space \lastMPmoveY\space m}%
+ \fi
+ \advance\nofMPsegments by 1\relax
+ \ifnum\nofMPsegments<\scratchcounter
+ \repeat}
+
+\def\flushconcatMPpath%
+ {\scratchcounter=\nofMPsegments
+ \nofMPsegments=1
+ \loop
+ \expandafter\ifcase\getMPkeyword{\the\nofMPsegments}\relax
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b
+ \pdfliteral{\a\space \b\space l}%
+ \or
+ \doMPconcat{\gMPs1}\a{\gMPs2}\b
+ \doMPconcat{\gMPs3}\c{\gMPs4}\d
+ \doMPconcat{\gMPs5}\e{\gMPs6}\f
+ \pdfliteral{\a\space \b\space \c\space \d\space \e\space \f\space c}%
+ \or
+ \bgroup
+ \noMPtranslate
+ \doMPconcat\lastMPmoveX\a\lastMPmoveY\b
+ \pdfliteral{\a\space \b\space l S}%
+ \egroup
+ \or
+ \edef\lastMPmoveX{\gMPs1}%
+ \edef\lastMPmoveY{\gMPs2}%
+ \doMPconcat\lastMPmoveX\a\lastMPmoveY\b
+ \pdfliteral{\a\space \b\space m}%
+ \fi
+ \advance\nofMPsegments by 1\relax
+ \ifnum\nofMPsegments<\scratchcounter
+ \repeat}
+
+%D The transformation of the coordinates is handled by one of
+%D the macros Tanmoy posted to the \PDFTEX\ mailing list.
+%D I rewrote and optimized the original macro to suit the other
+%D macros in this module.
+%D
+%D \starttypen
+%D \doMPconcat {x position} \xresult {y position} \yresult
+%D \stoptypen
+%D
+%D
+%D By setting the auxiliary \DIMENSIONS\ \type{\dimen0} upto
+%D \type{\dimen10} only once per path, we save over 20\% run
+%D time. Some more speed was gained by removing some parameter
+%D passing. These macros can be optimized a bit more by using
+%D more constants. There is however not much need for further
+%D optimization because penshapes usually are round and
+%D therefore need no transformation. Nevertheless we move the
+%D factor to the outer level and use bit different \type{pt}
+%D removal macro. Although the values represent base points,
+%D we converted them to pure points, simply because those can
+%D be converted back.
+
+\def\MPconcatfactor{256}
+
+\def\doMPreducedimen#1
+ {\count0=\MPconcatfactor
+ \advance\dimen#1 \ifdim\dimen#1>\!!zeropoint .5\else -.5\fi\count0
+ \divide\dimen#1 \count0\relax}
+
+\def\doMPexpanddimen#1
+ {\multiply\dimen#1 \MPconcatfactor\relax}
+
+\def\presetMPconcat%
+ {\dimen 0=\gMPs1 pt \doMPreducedimen 0 % r_x
+ \dimen 2=\gMPs2 pt \doMPreducedimen 2 % s_x
+ \dimen 4=\gMPs3 pt \doMPreducedimen 4 % s_y
+ \dimen 6=\gMPs4 pt \doMPreducedimen 6 % r_y
+ \dimen 8=\gMPs5 pt \doMPreducedimen 8 % t_x
+ \dimen10=\gMPs6 pt \doMPreducedimen10 } % t_y
+
+\def\noMPtranslate% use this one grouped
+ {\dimen 8=\!!zeropoint % t_x
+ \dimen10=\!!zeropoint} % t_y
+
+\def\doMPconcat#1#2#3#4%
+ {\dimen12=#1 pt \doMPreducedimen12 % p_x
+ \dimen14=#3 pt \doMPreducedimen14 % p_y
+ %
+ \dimen16 \dimen 0
+ \multiply \dimen16 \dimen 6
+ \dimen20 \dimen 2
+ \multiply \dimen20 \dimen 4
+ \advance \dimen16 -\dimen20
+ %
+ \dimen18 \dimen12
+ \multiply \dimen18 \dimen 6
+ \dimen20 \dimen14
+ \multiply \dimen20 \dimen 4
+ \advance \dimen18 -\dimen20
+ \dimen20 \dimen 4
+ \multiply \dimen20 \dimen10
+ \advance \dimen18 \dimen20
+ \dimen20 \dimen 6
+ \multiply \dimen20 \dimen 8
+ \advance \dimen18 -\dimen20
+ %
+ \multiply \dimen12 -\dimen 2
+ \multiply \dimen14 \dimen 0
+ \advance \dimen12 \dimen14
+ \dimen20 \dimen 2
+ \multiply \dimen20 \dimen 8
+ \advance \dimen12 \dimen20
+ \dimen20 \dimen 0
+ \multiply \dimen20 \dimen10
+ \advance \dimen12 -\dimen20
+ %
+ \doMPreducedimen16
+ \divide \dimen18 \dimen16 \doMPexpanddimen18
+ \divide \dimen12 \dimen16 \doMPexpanddimen12
+ %
+ \edef#2{\withoutpt{\the\dimen18}}% % p_x^\prime
+ \edef#4{\withoutpt{\the\dimen12}}} % p_y^\prime
+
+%D The following explanation of the conversion process was
+%D posted to the \PDFTEX\ mailing list by Tanmoy. The original
+%D macro was part of a set of macro's that included sinus and
+%D cosinus calculation as well as scaling and translating. The
+%D \METAPOST\ to \PDF\ conversion however only needs
+%D transformation.
+
+%D \start \switchnaarkorps [ss]
+%D
+%D Given a point $(U_x, U_y)$ in user coordinates, the business
+%D of \POSTSCRIPT\ is to convert it to device space. Let us say
+%D that the device space coordinates are $(D_x, D_y)$. Then, in
+%D \POSTSCRIPT\ $(D_x, D_y)$ can be written in terms of
+%D $(U_x, U_y)$ in matrix notation, either as
+%D
+%D \plaatsformule
+%D \startformule
+%D \pmatrix{D_x&D_y&1\cr} = \pmatrix{U_x&U_y&1\cr}
+%D \pmatrix{s_x&r_x&0\cr
+%D r_y&s_y&0\cr
+%D t_x&t_y&1\cr}
+%D \stopformule
+%D
+%D or
+%D
+%D \plaatsformule
+%D \startformule
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformule
+%D
+%D both of which is a shorthand for the same set of equations:
+%D
+%D \plaatsformule
+%D \startformule
+%D D_x = s_x U_x + r_y U_y + t_x
+%D \stopformule
+%D
+%D \plaatsformule
+%D \startformule
+%D D_y = r_x U_x + s_y U_y + t_y
+%D \stopformule
+%D
+%D which define what is called an `affine transformation'.
+%D
+%D \POSTSCRIPT\ represents the `transformation matrix' as a
+%D six element matrix instead of a $3\times 3$ array because
+%D three of the elements are always~0, 0 and~1. Thus the above
+%D transformation is written in postscript as $[s_x\, r_x\,
+%D r_y\, s_y\, t_x\, t_y]$. However, when doing any
+%D calculations, it is useful to go back to the original
+%D matrix notation (whichever: I will use the second) and
+%D continue from there.
+%D
+%D As an example, if the current transformation matrix is
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$ and you say \typ{[a b
+%D c d e f] concat}, this means:
+%D
+%D \startsmaller
+%D Take the user space coordinates and transform them to an
+%D intermediate set of coordinates using array $[a\, b\, c\, d\,
+%D e\, f]$ as the transformation matrix.
+%D
+%D Take the intermediate set of coordinates and change them to
+%D device coordinates using array $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$
+%D as the transformation matrix.
+%D \stopsmaller
+%D
+%D Well, what is the net effect? In matrix notation, it is
+%D
+%D \plaatsformule
+%D \startformule
+%D \pmatrix{I_x\cr I_y\cr 1\cr} = \pmatrix{a&c&e\cr
+%D b&d&f\cr
+%D 0&0&1\cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformule
+%D
+%D \plaatsformule
+%D \startformule
+%D \pmatrix{D_y\cr D_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{I_x\cr
+%D I_y\cr
+%D 1 \cr}
+%D \stopformule
+%D
+%D where $(I_x, I_y)$ is the intermediate coordinate.
+%D
+%D Now, the beauty of the matrix notation is that when there is
+%D a chain of such matrix equations, one can always compose
+%D them into one matrix equation using the standard matrix
+%D composition law. The composite matrix from two matrices can
+%D be derived very easily: the element in the $i$\hoog{th}
+%D horizontal row and $j$\hoog{th} vertical column is
+%D calculated by`multiplying' the $i$\hoog{th} row of the first
+%D matrix and the $j$\hoog{th} column of the second matrix (and
+%D summing over the elements). Thus, in the above:
+%D
+%D \plaatsformule
+%D \startformule
+%D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &0 \cr}
+%D \pmatrix{U_x\cr
+%D U_y\cr
+%D 1 \cr}
+%D \stopformule
+%D
+%D with
+%D
+%D \plaatsformule
+%D \startformule
+%D \eqalign
+%D {s_x^\prime & = s_x a + r_y b \cr
+%D r_x^\prime & = r_x a + s_y b \cr
+%D r_y^\prime & = s_x c + r_y d \cr
+%D s_y^\prime & = r_x c + s_y d \cr
+%D t_x^\prime & = s_x e + r_y f + t_x \cr
+%D t_y^\prime & = r_x e + s_y f + t_y \cr}
+%D \stopformule
+
+%D In fact, the same rule is true not only when one is going
+%D from user coordinates to device coordinates, but whenever
+%D one is composing two `transformations' together
+%D (transformations are `associative'). Note that the formula
+%D is not symmetric: you have to keep track of which
+%D transformation existed before (i.e.\ the equivalent of
+%D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$) and which was
+%D specified later (i.e.\ the equivalent of $[a\, b\, c\, d\,
+%D e\, f]$). Note also that the language can be rather
+%D confusing: the one specified later `acts earlier',
+%D converting the user space coordinates to intermediate
+%D coordinates, which are then acted upon by the pre||existing
+%D transformation. The important point is that order of
+%D transformation matrices cannot be flipped (transformations
+%D are not `commutative').
+%D
+%D Now what does it mean to move a transformation matrix
+%D before a drawing? What it means is that given a point
+%D $(P_x, P_y)$ we need a different set of coordinates
+%D $(P_x^\prime, P_y^\prime)$ such that if the transformation
+%D acts on $(P_x^\prime, P_y^\prime)$, they produce $(P_x,
+%D P_y)$. That is we need to solve the set of equations:
+%D
+%D \plaatsformule
+%D \startformule
+%D \pmatrix{P_x\cr P_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr
+%D r_x&s_y&t_y\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x^\prime\cr
+%D P_y^\prime\cr
+%D 1 \cr}
+%D \stopformule
+%D
+%D Again matrix notation comes in handy (i.e. someone has
+%D already solved the problem for us): we need the inverse
+%D transformation matrix. The inverse transformation matrix can
+%D be calculated very easily: it is
+%D
+%D \plaatsformule
+%D \startformule
+%D \pmatrix{P_x^\prime\cr P_y^\prime\cr 1\cr} =
+%D \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr
+%D r_x^\prime&s_y^\prime&t_y^\prime\cr
+%D 0 &0 &1 \cr}
+%D \pmatrix{P_x\cr
+%D P_y\cr
+%D 1 \cr}
+%D \stopformule
+%D
+%D where, the inverse transformation matrix is given by
+%D
+%D \plaatsformule
+%D \startformule
+%D \eqalign
+%D {D & = s_x s_y - r_x r_y \cr
+%D s_x^\prime & = s_y / D \cr
+%D s_y^\prime & = s_x / D \cr
+%D r_x^\prime & = - r_x / D \cr
+%D r_y^\prime & = - r_y / D \cr
+%D t_x^\prime & = ( - s_y t_x + r_y t_y ) / D \cr
+%D t_y^\prime & = ( r_x t_x - s_x t_y ) / D \cr}
+%D \stopformule
+%D
+%D And you can see that when expanded out, this does
+%D give the formulas:
+%D
+%D \plaatsformule
+%D \startformule
+%D P_x^\prime = { { s_y(p_x-t_x) + r_y(t_y-p_y) } \over
+%D { s_x*s_y-r_x*r_y } }
+%D \stopformule
+%D
+%D \plaatsformule
+%D \startformule
+%D P_y^\prime = { { s_x(p_y-t_y) + r_x(t_x-p_x) } \over
+%D { s_x*s_y-r_x*r_y } }
+%D \stopformule
+%D
+%D The code works by representing a real number by converting
+%D it to a dimension to be put into a \DIMENSION\ register: 2.3 would
+%D be represented as 2.3pt for example. In this scheme,
+%D multiplying two numbers involves multiplying the \DIMENSION\
+%D registers and dividing by 65536. Accuracy demands that the
+%D division be done as late as possible, but overflow
+%D considerations need early division.
+%D
+%D Division involves dividing the two \DIMENSION\ registers and
+%D multiplying the result by 65536. Again, accuracy would
+%D demand that the numerator be multiplied (and|/|or the
+%D denominator divided) early: but that can lead to overflow
+%D which needs to be avoided.
+%D
+%D If nothing is known about the numbers to start with (in
+%D concat), I have chosen to divide the 65536 as a 256 in each
+%D operand. However, in the series calculating the sine and
+%D cosine, I know that the terms are small (because I never
+%D have an angle greater than 45 degrees), so I chose to
+%D apportion the factor in a different way.
+%D
+%D \stop
+%D
+%D The path is output using the values saved on the stack. If
+%D needed, all coordinates are recalculated.
+
+\def\processMPpath%
+ {\flushMPpath
+ \closeMPpath
+ \pdfliteral{\ifcase\finiMPpath W n\or S\or f\or B\fi}%
+ \let\handleMPsequence=\dohandleMPsequence
+ \resetMPstack
+ \nofMPsegments=0
+ \handleMPsequence}
+
+%D In \PDF\ the \type{cm} operator must precede the path
+%D specification. We therefore can output the \type{cm} at
+%D the moment we encounter it.
+
+\def\handleMPpathconcat%
+ {\presetMPconcat
+ \pdfliteral{\gMPs1 \gMPs2 \gMPs3 \gMPs4 \gMPs5 \gMPs6 cm}%
+ \resetMPstack}
+
+%D This macro interprets the path and saves it as compact as
+%D possible.
+
+\def\dohandleMPpath#1#2 %
+ {\ifnum\lccode`#1=0
+ \setMPargument{#1#2}%
+ \else
+ \def\somestring{#1#2}%
+ \ifx\somestring\PSlineto
+ \setMPkeyword0
+ \else\ifx\somestring\PScurveto
+ \setMPkeyword1
+ \else\ifx\somestring\PSrlineto
+ \setMPkeyword2
+ \else\ifx\somestring\PSmoveto
+ \setMPkeyword3
+ \else\ifx\somestring\PSclip
+ \let\handleMPsequence=\processMPpath
+ \else\ifx\somestring\PSgsave
+ \chardef\finiMPpath=3
+ \else\ifx\somestring\PSgrestore
+ \else\ifx\somestring\PSfill
+ \ifnum\finiMPpath=0
+ \chardef\finiMPpath=2
+ \let\handleMPsequence=\processMPpath
+ \fi
+ \else\ifx\somestring\PSstroke
+ \ifnum\finiMPpath=0
+ \chardef\finiMPpath=1
+ \fi
+ \let\handleMPsequence=\processMPpath
+ \else\ifx\somestring\PSclosepath
+ \def\closeMPpath{\pdfliteral{h}}%
+ \else\ifx\somestring\PSconcat
+ \let\flushMPpath=\flushconcatMPpath
+ \handleMPpathconcat
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi
+ \handleMPsequence}
+
+%D The main conversion command is
+%D
+%D \starttypen
+%D \convertMPtoPDF {filename} {x scale} {y scale}
+%D \stoptypen
+%D
+%D The dimensions are derived from the bounding box. So we
+%D only have to say:
+%D
+%D \starttypen
+%D \convertMPtoPDF{mp-pra-1.eps}{1}{1}
+%D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5}
+%D \stoptypen
+
+\def\convertMPtoPDF#1#2#3%
+ {\bgroup
+ \message{[MP to PDF #1]}%
+ \setMPspecials
+ \startMPscanning
+ \def\do{}%
+ \edef\MPxscale{#2}%
+ \edef\MPyscale{#3}%
+ \setbox0=\vbox\bgroup
+ \forgetall
+ \offinterlineskip
+ \pdfliteral{q}%
+ \let\handleMPsequence=\dohandleMPsequence
+ \catcode`\^^M=\@@endofline
+ \input #1\relax}
+
+\def\finishMPgraphic%
+ {\pdfliteral{Q}%
+ \egroup
+ \wd0=\MPwidth
+ \vbox to \MPheight
+ {\forgetall
+ \vfill
+ \pdfliteral{q \MPxscale\space 0 0 \MPyscale\space
+ \MPxoffset\space \MPyoffset\space cm}%
+ \box0
+ \pdfliteral{Q}}%
+ \egroup}
+
+%D This kind of conversion is possible because \METAPOST\
+%D does all the calculations. Converting other \POSTSCRIPT\
+%D files would drive both me and \TEX\ crazy.
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/supp-spe.tex b/tex/context/base/supp-spe.tex index 00bec7a53..59dabe7df 100644 --- a/tex/context/base/supp-spe.tex +++ b/tex/context/base/supp-spe.tex @@ -1,165 +1,166 @@ -%D \module -%D [ file=supp-spe, -%D version=1997.07.05, -%D title=\CONTEXT\ Support Macros, -%D subtitle=Specials, -%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. - -\unprotect - -%D This module implements some \type{\special} manipulation -%D macros. I needed these when I implemented the code that -%D handles the conversion of \TPIC\ specials to \PDF\ code. - -\writestatus{loading}{Context Support Macros / Specials} - -%D When interpreting specials we need to do some basic scanning. -%D For the moment we distinguish between three cases. We need -%D -%D \starttypen -%D \special{tag: arguments} -%D \special{tag arguments} -%D \special{tag} -%D \stoptypen -%D -%D We cannot be sure that the first case isn't -%D -%D \starttypen -%D \special{tag:arguments} -%D \stoptypen -%D -%D So we have to take care of that one too. - -%D \macros -%D {redefinespecial} -%D -%D Specials that are to be interpreted are defined with -%D commands like: -%D -%D \startbuffer[tmp-1] -%D \redefinespecial a: \using#1\endspecial% -%D {let's execute special 'a:' using '#1'} -%D -%D \redefinespecial a \using#1\endspecial% -%D {let's execute special 'a' using '#1'} -%D -%D \redefinespecial a \using#1\endspecial% -%D {let's execute special 'a' using nothing} -%D \stopbuffer -%D -%D \typebuffer[tmp-1] -%D -%D The first two always take an argument, the last one not. -%D The definition of this redefinition macro is not that -%D complex. The names are internally tagged with \type{\@rds@} -%D which saves both time and space. - -\def\@rds@{@rds@} - -\def\redefinespecial #1 % - {\setvalue{\@rds@#1}} - -%D \macros -%D {mimmickspecials} -%D -%D Mimmicking specials is activated by saying: -%D -%D \starttypen -%D \mimmickspecials -%D \stoptypen -%D -%D This commands redefines the \PLAIN\ \TEX\ primitive -%D \type{\special}. - -\def\mimmickspecials% - {\let\special=\domimmickspecial} - -%D The special mimmicking macro first looks if it can find an -%D colon terminated tag, next it searches for a tag that end -%D with a space. If both cannot find, the tag itself is treated -%D without argument. - -\def\domimmickspecial#1% - {\domimmickcolonspecial#1:\relax/:\relax/\end} - -\def\domimmickcolonspecial#1:#2#3:\relax/#4\end% - {\ifx#2\relax - \domimmickspacespecial#1 \relax/ \relax/\end - \else - \dodomimmickspecial#1:\using#2#3\endspecial - \fi} - -\def\domimmickspacespecial#1 #2#3 \relax/#4\end% - {\ifx#2\relax - \dodomimmickspecial#1\using\endspecial - \else - \dodomimmickspecial#1\using#2#3\endspecial - \fi} - -\def\dodomimmickspecial#1\using#2\endspecial% - {\expandafter\ifx\csname\@rds@#1\endcsname\relax % \doifdefinedelse - \defaultspecial{#1 #2}% - \else - %\message{[mimmick special #1 with #2#3]}% - \getvalue{\@rds@#1}\using#2\endspecial - \fi} - -%D Now let's show that things work the way we want, using the -%D previous definitions of tag~a. -%D -%D \startbuffer[tmp-2] -%D \mimmickspecials -%D \special{a: 1 2 3 4 5} -%D \special{a: 1 2 3 4 5} -%D \special{a} -%D \stopbuffer -%D -%D \typebuffer[tmp-2] -%D -%D Which results in: -%D -%D \startregels -%D \haalbuffer[tmp-1] -%D \haalbuffer[tmp-2] -%D \stopregels - -%D \macros -%D {mimmickspecial} -%D -%D When needed, one can call a mimmicked special directly by -%D saying for instance: -%D -%D \starttypen -%D \mimmickspecial a: \using...\endspecial -%D \stoptypen -%D -%D This can be handy when specials have much in common. - -\def\mimmickspecial #1 % - {\getvalue{\@rds@#1}} - -%D \macros -%D {normalspecial,defaultspecial} -%D -%D Unknown specials are passed to the default special handler. -%D One can for instance ignore all further specials by saying -%D \type{\normalspecial}: -%D -%D \starttypen -%D \def\defaultspecial#1{} -%D \stoptypen -%D -%D But here we default to idle. - -\let\normalspecial =\special -\let\defaultspecial=\special - -\protect - -\endinput +%D \module
+%D [ file=supp-spe,
+%D version=1997.07.05,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Specials,
+%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.
+
+\unprotect
+
+%D This module implements some \type{\special} manipulation
+%D macros. I needed these when I implemented the code that
+%D handles the conversion of \TPIC\ specials to \PDF\ code.
+
+\writestatus{loading}{Context Support Macros / Specials}
+
+%D When interpreting specials we need to do some basic scanning.
+%D For the moment we distinguish between three cases. We need
+%D
+%D \starttypen
+%D \special{tag: arguments}
+%D \special{tag arguments}
+%D \special{tag}
+%D \stoptypen
+%D
+%D We cannot be sure that the first case isn't
+%D
+%D \starttypen
+%D \special{tag:arguments}
+%D \stoptypen
+%D
+%D So we have to take care of that one too.
+
+%D \macros
+%D {redefinespecial}
+%D
+%D Specials that are to be interpreted are defined with
+%D commands like:
+%D
+%D \startbuffer[tmp-1]
+%D \redefinespecial a: \using#1\endspecial%
+%D {let's execute special 'a:' using '#1'}
+%D
+%D \redefinespecial a \using#1\endspecial%
+%D {let's execute special 'a' using '#1'}
+%D
+%D \redefinespecial a \using#1\endspecial%
+%D {let's execute special 'a' using nothing}
+%D \stopbuffer
+%D
+%D \typebuffer[tmp-1]
+%D
+%D The first two always take an argument, the last one not.
+%D The definition of this redefinition macro is not that
+%D complex. The names are internally tagged with \type{\@rds@}
+%D which saves both time and space.
+
+\def\@rds@{@rds@}
+
+\def\redefinespecial #1 %
+ {\setvalue{\@rds@#1}}
+
+%D \macros
+%D {mimmickspecials}
+%D
+%D Mimmicking specials is activated by saying:
+%D
+%D \starttypen
+%D \mimmickspecials
+%D \stoptypen
+%D
+%D This commands redefines the \PLAIN\ \TEX\ primitive
+%D \type{\special}.
+
+\def\mimmickspecials%
+ {\let\special=\domimmickspecial}
+
+%D The special mimmicking macro first looks if it can find an
+%D colon terminated tag, next it searches for a tag that end
+%D with a space. If both cannot find, the tag itself is treated
+%D without argument.
+
+\def\domimmickspecial#1%
+ {\domimmickcolonspecial#1:\relax/:\relax/\end}
+
+\def\domimmickcolonspecial#1:#2#3:\relax/#4\end%
+ {\ifx#2\relax
+ \domimmickspacespecial#1 \relax/ \relax/\end
+ \else
+ \dodomimmickspecial#1:\using#2#3\endspecial
+ \fi}
+
+\def\domimmickspacespecial#1 #2#3 \relax/#4\end%
+ {\ifx#2\relax
+ \dodomimmickspecial#1\using\endspecial
+ \else
+ \dodomimmickspecial#1\using#2#3\endspecial
+ \fi}
+
+\def\dodomimmickspecial#1\using#2\endspecial%
+ {\expandafter\ifx\csname\@rds@#1\endcsname\relax % \doifdefinedelse
+ \defaultspecial{#1 #2}%
+ \else
+ %\message{[mimmick special #1 with #2]}%
+ \getvalue{\@rds@#1}\using#2\endspecial
+ \fi}
+
+%D Now let's show that things work the way we want, using the
+%D previous definitions of tag~a.
+%D
+%D \startbuffer[tmp-2]
+%D \mimmickspecials
+%D \special{a: 1 2 3 4 5}
+%D \special{a: 1 2 3 4 5}
+%D \special{a}
+%D \stopbuffer
+%D
+%D \typebuffer[tmp-2]
+%D
+%D Which results in:
+%D
+%D \startregels
+%D \haalbuffer[tmp-1]
+%D \haalbuffer[tmp-2]
+%D \stopregels
+
+%D \macros
+%D {mimmickspecial}
+%D
+%D When needed, one can call a mimmicked special directly by
+%D saying for instance:
+%D
+%D \starttypen
+%D \mimmickspecial a: \using...\endspecial
+%D \stoptypen
+%D
+%D This can be handy when specials have much in common.
+
+\def\mimmickspecial #1 %
+ {\getvalue{\@rds@#1}}
+
+%D \macros
+%D {normalspecial,defaultspecial}
+%D
+%D Unknown specials are passed to the default special handler.
+%D One can for instance ignore all further specials by saying
+%D \type{\normalspecial}:
+%D
+%D \starttypen
+%D \def\defaultspecial#1{}
+%D \stoptypen
+%D
+%D But here we default to idle.
+
+\let\normalspecial =\special
+\let\defaultspecial=\special
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/supp-tpi.tex b/tex/context/base/supp-tpi.tex index 107a66ac6..857d610f6 100644 --- a/tex/context/base/supp-tpi.tex +++ b/tex/context/base/supp-tpi.tex @@ -1,338 +1,339 @@ -%D \module -%D [ file=supp-tpi, -%D version=1997.07.05, -%D title=\CONTEXT\ Support Macros, -%D subtitle=\TPIC\ Conversion, -%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. - -%D This modules implements the conversion of graphic \TPIC\ -%D specials using \METAPOST. -%D -%D We reimplement the \TPIC\ specials using the special -%D mimmicking mechanism implemented in the support module -%D \type{supp-spe} as well as the \METAPOST\ run||time support -%D implemented in \type{supp-mps}. - -\ifx\undefined\writestatus \input supp-mis \relax \fi -\ifx\undefined\mimmickspecials \input supp-spe \relax \fi -\ifx\undefined\MPgraphicbox \input supp-mps \relax \fi - -\writestatus{loading}{Context Support Macros / TPIC Conversion} - -%D Beware: we haven't activated both mechanism yet. This is -%D to be done in the calling module. - -\unprotect - -%D When we want to mimmick \TPIC\ specials in \PDFTEX, we need -%D to map its graphic primitives into \PDF\ ones. The main -%D problem in doing so is that \PDF\ does not support b-splines -%D directly and also does not offer us something to draw arcs. -%D Of course all this scan be implemented in \TEX, and the -%D first implementation of this module did so, but the results -%D were not that satisfying. Not having used these specials -%D before, I had for instance to find out that the \TPIC\ -%D specials were not that unambiguesly defined. -%D -%D Then, while discussing something else, Sebastian Ratz told -%D me that the Web2c implementation that \PDFTEX\ is base upon, -%D offers some rather discutable, but nevertheless handy -%D feature: -%D -%D \starttypen -%D \write18{execute program with arguments} -%D \stoptypen -%D -%D Knowing this, I immediatelly decided to throw away the old -%D conversion macros and use the marvelous \METAPOST, \TEX\ -%D related, drawing program to do the conversion in as high a -%D quality as possible. -%D -%D implementation we're going to present here, not only uses -%D for drawing purposes, but also uses the more efficient -%D \METAPOST\ features to store the path. -%D -%D \in{Table}[tab:TPIC specials] lists the \TPIC\ specials as -%D mentioned in the \LATEX\ Graphics Companion and the -%D relevant part of the \DVIPS\ source. This list shows us -%D that we have to store the path before we can use it, simply -%D because we don't know in advance what actions to apply on -%D it. -%D -%D \plaatstabel[hier][tab:TPIC specials]{The \TPIC\ special syntax.} -%D \starttabel[|||l|] -%D \HL -%D \NC \bf tag \NC \bf arguments \NC \bf meaning \NC\SR -%D \HL -%D \NC pn \NC $w$ \NC set linewidth \NC\FR -%D \NC pa \NC $x$ $y$ \NC add point to path \NC\MR -%D \NC fp \NC \NC draw/fill path \NC\MR -%D \NC ip \NC \NC fill path \NC\MR -%D \NC da \NC $l$ \NC draw dashed path \NC\MR -%D \NC dt \NC $l$ \NC draw doted path \NC\MR -%D \NC sp \NC $d$ \NC draw spline \NC\MR -%D \NC ar \NC $x$ $y$ $r_x$ $r_y$ $b$ $e$ \NC draw (partial) arc \NC\MR -%D \NC ia \NC $x$ $y$ $r_x$ $r_y$ $b$ $e$ \NC fill (partial) arc \NC\MR -%D \NC sh \NC $s$ \NC fill next path \NC\LR -%D \HL -%D \stoptabel - -%D The first problem we have to take care of is the fact that -%D there is no decent begin or end of the drawing process -%D defined. We can however be quite sure that writers of -%D packages using these specials will put them into a box, -%D simply because else this is the most common used way to -%D treat something \TEX\ as as a whole, like: -%D -%D \starttypen -%D \hbox{\special{}\special{}...} -%D \stoptypen -%D -%D We just start a picture as soon as the first special is -%D encountered, so this becomes: -%D -%D \starttypen -%D \hbox{\openpicture\newspecial{}\newspecial{}... -%D \stoptypen - -%D The first step in opening the picture is to start a group. -%D Now we can savely use the egroup that closes the box to also -%D end the picture. - -\def\startTPICspecials% - {\bgroup - \let\startTPICspecials=\relax - \aftergroup\stopTPICspecials - \startwritingMPgraphic - \writeMPgraphic{pair p[];}} - -%D As soon as we begin a picture, we inhibit nesting by -%D relaxing the start macro. The first \METAPOST\ action we -%D take is declaring an array of pairs named $p$. - -%D Ending the picture is invoked by closing the current group. -%D Because the \TPIC\ picture comes out mirrored, we have to -%D reflect the current \METAPOST\ picture, stored in the system -%D variable {\it currentpicture}, around the $x$-axis. - -\def\stopTPICspecials% - {\writeMPgraphic - {currentpicture:=currentpicture reflectedabout ((0,0),(4095,0));}% - \stopwritingMPgraphic - \flushMPgraphics - \loadcurrentMPgraphic{}% - \setbox\MPgraphicbox=\hbox to \!!zeropoint - {\kern-\wd\MPgraphicbox - \vbox to \!!zeropoint{\box\MPgraphicbox\vss}\hss}% - \ht\MPgraphicbox=\!!zeropoint - \wd\MPgraphicbox=\!!zeropoint - \dp\MPgraphicbox=\!!zeropoint - \box\MPgraphicbox - \egroup} - -%D Here the macro \type{\stopwritingMPgraphic} has to take care -%D of executing and including the \METAPOST\ code. - -%D We need to keep track of the number of elements that form -%D the path. This is needed because we don't know in advance -%D how the points are to be connected. - -\newcount\TPICcounter - -%D When a path is draw, we can connect the points using a -%D smooth curve of drawing straight lines. A closed path can be -%D drawn or filled. - -\newif\ifTPICdraw -\newif\ifTPICfill -\newif\ifTPICcurve - -%D The \TPIC\ specials permit specifying the line and fill -%D color as well as the linetype, which can be solid, dashed or -%D dotted. We'll save those specifications as a \METAPOST\ -%D string, using: - -\let\TPIClinetype =\empty -\let\TPICgrayscale=\empty - -%D The magic reduction factor $.07227$ is needed to map the -%D \TPIC\ $1/1000$ of an inch to \POSTSCRIPT\ points. We cannot -%D delegate this task to \METAPOST\ because this program does -%D not accept values greater than 4095. - -%D I won't discuss all the specifics used in implementing -%D the specials. The \METAPOST\ part is rather trivial. Many -%D specials have much in common, so the amout of code is not -%D that large. - -\redefinespecial pa \using#1 #2\endspecial - {\startTPICspecials - \bgroup - \global\advance\TPICcounter by 1 - \dimen0=#1pt \dimen0=.07227\dimen0 - \dimen2=#2pt \dimen2=.07227\dimen2 - \writeMPgraphic{p[\the\TPICcounter]:=(\the\dimen0,\the\dimen2);}% - \egroup} - -\redefinespecial pn \using#1\endspecial - {\startTPICspecials - \bgroup - \dimen0=#1pt \dimen0=.07227\dimen0 - \writeMPgraphic{pickup pencircle scaled \the\dimen0;}% - \egroup} - -\redefinespecial sh \using#1\endspecial - {\startTPICspecials - \bgroup - \edef\g{#1}% - \edef\g{\ifx\g\empty.5\else#1\fi}% - \xdef\TPICgrayscale{withcolor (\g,\g,\g)}% - \egroup} - -\redefinespecial wh \using#1\endspecial - {\mimmickspecial sh \using0\endspecial} - -\redefinespecial bk \using#1\endspecial - {\mimmickspecial sh \using1\endspecial} - -\redefinespecial da \using#1\endspecial - {\startTPICspecials - \bgroup - \edef\l{#1}% - \ifx\l\empty - \gdef\TPIClinetype{dashed evenly}% - \else - \dimen0=#1in - \ifdim\dimen0<\!!zeropoint \dimen0=-\dimen0\fi - \edef\f{\the\dimen0 \space}% - \dimen0=.5\dimen0 - \edef\h{\the\dimen0 \space}% - \xdef\TPIClinetype{dashed dashpattern (on \h off \f on \h)}% - \fi - \egroup - \TPICcurvefalse\TPICdrawtrue - \drawTPICpath\using#1\endspecial} - -\redefinespecial dt \using#1\endspecial - {\startTPICspecials - \bgroup - \edef\l{#1}% - \xdef\TPIClinetype{dashed withdots \ifx\l\empty\else scaled #1in\fi}% - \egroup - \TPICcurvefalse\TPICdrawtrue - \drawTPICpath\using#1\endspecial} - -\redefinespecial fp \using#1\endspecial - {\startTPICspecials - \TPICcurvefalse\TPICdrawtrue - \ifdim0#1pt=\!!zeropoint - \drawTPICpath\using#1\endspecial - \else\ifdim0#1pt<\!!zeropoint - \mimmickspecial dt\using#1\endspecial - \else - \mimmickspecial da\using#1\endspecial - \fi\fi} - -\redefinespecial sp - {\startTPICspecials\TPICdrawtrue\TPICcurvetrue\drawTPICpath} - -\redefinespecial ip - {\startTPICspecials\TPICfilltrue\drawTPICpath} - -\redefinespecial ar - {\startTPICspecials\TPICdrawtrue\drawTPICarc} - -\redefinespecial ia - {\startTPICspecials\TPICfilltrue\drawTPICarc} - -%D These substitutes use two auxiliary macros that take care of -%D actually drawing the shape or arc. Here we use the stored -%D linetype (solid, dashed, dotted) and color (grayscale). - -\def\drawTPICpath\using#1\endspecial - {\bgroup - \ifTPICdraw - \def\TPICgrayscale{}% - \fi - \writeMPgraphic - {\ifTPICfill fill\fi\ifTPICdraw draw\fi\space - for i:=1 upto \the\TPICcounter-1: - p[i]\ifTPICcurve..\else--\fi - endfor - p[\the\TPICcounter] - \ifTPICfill\ifTPICcurve..\else--\fi cycle \fi - \TPIClinetype\space\TPICgrayscale;}% - \resetTPICvariables - \egroup} - -%D I have to admit that at the moment I wrote this macro, I -%D could not write this piece of \METAPOST. Fortunately -%D Thortsen Ohl promptly answered the question I posted to the -%D \METAFONT\ discussion list. - -\def\drawTPICarc\using#1 #2 #3 #4 #5 #6\endspecial - {\bgroup - \ifTPICdraw - \def\TPICgrayscale{}% - \fi - \dimen 0=#1pt\dimen 0=.07227\dimen 0 - \dimen 2=#2pt\dimen 2=.07227\dimen 2 - \dimen10=#3pt\dimen10=.14454\dimen10 - \dimen12=#4pt\dimen12=.14454\dimen12 - \dimen20=#5pt - \dimen22=#6pt - \writeMPgraphic - {\ifTPICfill fill\fi\ifTPICdraw draw\fi \space - \ifTPICfill\else subpath 4/3.14159*(\the\dimen20,\the\dimen22) of \fi - fullcircle xscaled \the\dimen10 \space yscaled \the\dimen12 \space - shifted (\the\dimen0,\the\dimen2) - \TPIClinetype \space \TPICgrayscale;}% - \resetTPICvariables - \egroup} - -%D Resetting the variables need to be done globally because we -%D cannot be sure if any further grouping is used by the -%D envelopping macros. - -\def\resetTPICvariables% - {\global\TPICcounter=0 - \global\TPICfillfalse - \global\TPICdrawfalse - \global\let\TPIClinetype=\empty - \global\let\TPICgrayscale=\empty} - -%D I have to admit that by using the \METAPOST\ B‚zier cubics -%D routines these implementation does produce better curves -%D then most \DVI\ drivers do using the \TPIC\ prescribed -%D b-splines. Take for instance the sequence: -%D -%D \starttypen -%D \special{pa 2000 1000} -%D \special{pa 1000 2000} -%D \special{pa 0000 1000} -%D \special{pa 1000 0000} -%D \special{pa 2000 1000} -%D \special{sp} -%D \stoptypen -%D -%D One would expect that this code produced a closed circle, -%D but the curve that comes out using b-splines is far from -%D round. We can however savely asume that the arc producing -%D specials will be used for drawing circle fragments, while -%D the path specials will be used for arbitraty curves. And for -%D b-splines to produce nice curves, one will often use many -%D points to get the desired results. Therefore, using the -%D \METAPOST\ B‚zier curves will certainly produce similar and -%D even better graphics, except in those rare cases where one -%D uses delinberately the not that accurate features of -%D b-splines. Hereby the user is warned. - -\protect - -\endinput +%D \module
+%D [ file=supp-tpi,
+%D version=1997.07.05,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\TPIC\ Conversion,
+%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.
+
+%D This modules implements the conversion of graphic \TPIC\
+%D specials using \METAPOST.
+%D
+%D We reimplement the \TPIC\ specials using the special
+%D mimmicking mechanism implemented in the support module
+%D \type{supp-spe} as well as the \METAPOST\ run||time support
+%D implemented in \type{supp-mps}.
+
+\ifx\undefined\writestatus \input supp-mis \relax \fi
+\ifx\undefined\mimmickspecials \input supp-spe \relax \fi
+\ifx\undefined\MPgraphicbox \input supp-mps \relax \fi
+
+\writestatus{loading}{Context Support Macros / TPIC Conversion}
+
+%D Beware: we haven't activated both mechanism yet. This is
+%D to be done in the calling module.
+
+\unprotect
+
+%D When we want to mimmick \TPIC\ specials in \PDFTEX, we need
+%D to map its graphic primitives into \PDF\ ones. The main
+%D problem in doing so is that \PDF\ does not support b-splines
+%D directly and also does not offer us something to draw arcs.
+%D Of course all this scan be implemented in \TEX, and the
+%D first implementation of this module did so, but the results
+%D were not that satisfying. Not having used these specials
+%D before, I had for instance to find out that the \TPIC\
+%D specials were not that unambiguesly defined.
+%D
+%D Then, while discussing something else, Sebastian Ratz told
+%D me that the Web2c implementation that \PDFTEX\ is base upon,
+%D offers some rather discutable, but nevertheless handy
+%D feature:
+%D
+%D \starttypen
+%D \write18{execute program with arguments}
+%D \stoptypen
+%D
+%D Knowing this, I immediatelly decided to throw away the old
+%D conversion macros and use the marvelous \METAPOST, \TEX\
+%D related, drawing program to do the conversion in as high a
+%D quality as possible.
+%D
+%D implementation we're going to present here, not only uses
+%D for drawing purposes, but also uses the more efficient
+%D \METAPOST\ features to store the path.
+%D
+%D \in{Table}[tab:TPIC specials] lists the \TPIC\ specials as
+%D mentioned in the \LATEX\ Graphics Companion and the
+%D relevant part of the \DVIPS\ source. This list shows us
+%D that we have to store the path before we can use it, simply
+%D because we don't know in advance what actions to apply on
+%D it.
+%D
+%D \plaatstabel[hier][tab:TPIC specials]{The \TPIC\ special syntax.}
+%D \starttabel[|||l|]
+%D \HL
+%D \NC \bf tag \NC \bf arguments \NC \bf meaning \NC\SR
+%D \HL
+%D \NC pn \NC $w$ \NC set linewidth \NC\FR
+%D \NC pa \NC $x$ $y$ \NC add point to path \NC\MR
+%D \NC fp \NC \NC draw/fill path \NC\MR
+%D \NC ip \NC \NC fill path \NC\MR
+%D \NC da \NC $l$ \NC draw dashed path \NC\MR
+%D \NC dt \NC $l$ \NC draw doted path \NC\MR
+%D \NC sp \NC $d$ \NC draw spline \NC\MR
+%D \NC ar \NC $x$ $y$ $r_x$ $r_y$ $b$ $e$ \NC draw (partial) arc \NC\MR
+%D \NC ia \NC $x$ $y$ $r_x$ $r_y$ $b$ $e$ \NC fill (partial) arc \NC\MR
+%D \NC sh \NC $s$ \NC fill next path \NC\LR
+%D \HL
+%D \stoptabel
+
+%D The first problem we have to take care of is the fact that
+%D there is no decent begin or end of the drawing process
+%D defined. We can however be quite sure that writers of
+%D packages using these specials will put them into a box,
+%D simply because else this is the most common used way to
+%D treat something \TEX\ as as a whole, like:
+%D
+%D \starttypen
+%D \hbox{\special{}\special{}...}
+%D \stoptypen
+%D
+%D We just start a picture as soon as the first special is
+%D encountered, so this becomes:
+%D
+%D \starttypen
+%D \hbox{\openpicture\newspecial{}\newspecial{}...
+%D \stoptypen
+
+%D The first step in opening the picture is to start a group.
+%D Now we can savely use the egroup that closes the box to also
+%D end the picture.
+
+\def\startTPICspecials%
+ {\bgroup
+ \let\startTPICspecials=\relax
+ \aftergroup\stopTPICspecials
+ \startwritingMPgraphic
+ \writeMPgraphic{pair p[];}}
+
+%D As soon as we begin a picture, we inhibit nesting by
+%D relaxing the start macro. The first \METAPOST\ action we
+%D take is declaring an array of pairs named $p$.
+
+%D Ending the picture is invoked by closing the current group.
+%D Because the \TPIC\ picture comes out mirrored, we have to
+%D reflect the current \METAPOST\ picture, stored in the system
+%D variable {\it currentpicture}, around the $x$-axis.
+
+\def\stopTPICspecials%
+ {\writeMPgraphic
+ {currentpicture:=currentpicture reflectedabout ((0,0),(4095,0));}%
+ \stopwritingMPgraphic
+ \flushMPgraphics
+ \loadcurrentMPgraphic{}%
+ \setbox\MPgraphicbox=\hbox to \!!zeropoint
+ {\kern-\wd\MPgraphicbox
+ \vbox to \!!zeropoint{\box\MPgraphicbox\vss}\hss}%
+ \ht\MPgraphicbox=\!!zeropoint
+ \wd\MPgraphicbox=\!!zeropoint
+ \dp\MPgraphicbox=\!!zeropoint
+ \box\MPgraphicbox
+ \egroup}
+
+%D Here the macro \type{\stopwritingMPgraphic} has to take care
+%D of executing and including the \METAPOST\ code.
+
+%D We need to keep track of the number of elements that form
+%D the path. This is needed because we don't know in advance
+%D how the points are to be connected.
+
+\newcount\TPICcounter
+
+%D When a path is draw, we can connect the points using a
+%D smooth curve of drawing straight lines. A closed path can be
+%D drawn or filled.
+
+\newif\ifTPICdraw
+\newif\ifTPICfill
+\newif\ifTPICcurve
+
+%D The \TPIC\ specials permit specifying the line and fill
+%D color as well as the linetype, which can be solid, dashed or
+%D dotted. We'll save those specifications as a \METAPOST\
+%D string, using:
+
+\let\TPIClinetype =\empty
+\let\TPICgrayscale=\empty
+
+%D The magic reduction factor $.07227$ is needed to map the
+%D \TPIC\ $1/1000$ of an inch to \POSTSCRIPT\ points. We cannot
+%D delegate this task to \METAPOST\ because this program does
+%D not accept values greater than 4095.
+
+%D I won't discuss all the specifics used in implementing
+%D the specials. The \METAPOST\ part is rather trivial. Many
+%D specials have much in common, so the amout of code is not
+%D that large.
+
+\redefinespecial pa \using#1 #2\endspecial
+ {\startTPICspecials
+ \bgroup
+ \global\advance\TPICcounter by 1
+ \dimen0=#1pt \dimen0=.07227\dimen0
+ \dimen2=#2pt \dimen2=.07227\dimen2
+ \writeMPgraphic{p[\the\TPICcounter]:=(\the\dimen0,\the\dimen2);}%
+ \egroup}
+
+\redefinespecial pn \using#1\endspecial
+ {\startTPICspecials
+ \bgroup
+ \dimen0=#1pt \dimen0=.07227\dimen0
+ \writeMPgraphic{pickup pencircle scaled \the\dimen0;}%
+ \egroup}
+
+\redefinespecial sh \using#1\endspecial
+ {\startTPICspecials
+ \bgroup
+ \edef\g{#1}%
+ \edef\g{\ifx\g\empty.5\else#1\fi}%
+ \xdef\TPICgrayscale{withcolor (\g,\g,\g)}%
+ \egroup}
+
+\redefinespecial wh \using#1\endspecial
+ {\mimmickspecial sh \using0\endspecial}
+
+\redefinespecial bk \using#1\endspecial
+ {\mimmickspecial sh \using1\endspecial}
+
+\redefinespecial da \using#1\endspecial
+ {\startTPICspecials
+ \bgroup
+ \edef\l{#1}%
+ \ifx\l\empty
+ \gdef\TPIClinetype{dashed evenly}%
+ \else
+ \dimen0=#1in
+ \ifdim\dimen0<\!!zeropoint \dimen0=-\dimen0\fi
+ \edef\f{\the\dimen0 \space}%
+ \dimen0=.5\dimen0
+ \edef\h{\the\dimen0 \space}%
+ \xdef\TPIClinetype{dashed dashpattern (on \h off \f on \h)}%
+ \fi
+ \egroup
+ \TPICcurvefalse\TPICdrawtrue
+ \drawTPICpath\using#1\endspecial}
+
+\redefinespecial dt \using#1\endspecial
+ {\startTPICspecials
+ \bgroup
+ \edef\l{#1}%
+ \xdef\TPIClinetype{dashed withdots \ifx\l\empty\else scaled #1in\fi}%
+ \egroup
+ \TPICcurvefalse\TPICdrawtrue
+ \drawTPICpath\using#1\endspecial}
+
+\redefinespecial fp \using#1\endspecial
+ {\startTPICspecials
+ \TPICcurvefalse\TPICdrawtrue
+ \ifdim0#1pt=\!!zeropoint
+ \drawTPICpath\using#1\endspecial
+ \else\ifdim0#1pt<\!!zeropoint
+ \mimmickspecial dt\using#1\endspecial
+ \else
+ \mimmickspecial da\using#1\endspecial
+ \fi\fi}
+
+\redefinespecial sp
+ {\startTPICspecials\TPICdrawtrue\TPICcurvetrue\drawTPICpath}
+
+\redefinespecial ip
+ {\startTPICspecials\TPICfilltrue\drawTPICpath}
+
+\redefinespecial ar
+ {\startTPICspecials\TPICdrawtrue\drawTPICarc}
+
+\redefinespecial ia
+ {\startTPICspecials\TPICfilltrue\drawTPICarc}
+
+%D These substitutes use two auxiliary macros that take care of
+%D actually drawing the shape or arc. Here we use the stored
+%D linetype (solid, dashed, dotted) and color (grayscale).
+
+\def\drawTPICpath\using#1\endspecial
+ {\bgroup
+ \ifTPICdraw
+ \def\TPICgrayscale{}%
+ \fi
+ \writeMPgraphic
+ {\ifTPICfill fill\fi\ifTPICdraw draw\fi\space
+ for i:=1 upto \the\TPICcounter-1:
+ p[i]\ifTPICcurve..\else--\fi
+ endfor
+ p[\the\TPICcounter]
+ \ifTPICfill\ifTPICcurve..\else--\fi cycle \fi
+ \TPIClinetype\space\TPICgrayscale;}%
+ \resetTPICvariables
+ \egroup}
+
+%D I have to admit that at the moment I wrote this macro, I
+%D could not write this piece of \METAPOST. Fortunately
+%D Thortsen Ohl promptly answered the question I posted to the
+%D \METAFONT\ discussion list.
+
+\def\drawTPICarc\using#1 #2 #3 #4 #5 #6\endspecial
+ {\bgroup
+ \ifTPICdraw
+ \def\TPICgrayscale{}%
+ \fi
+ \dimen 0=#1pt\dimen 0=.07227\dimen 0
+ \dimen 2=#2pt\dimen 2=.07227\dimen 2
+ \dimen10=#3pt\dimen10=.14454\dimen10
+ \dimen12=#4pt\dimen12=.14454\dimen12
+ \dimen20=#5pt
+ \dimen22=#6pt
+ \writeMPgraphic
+ {\ifTPICfill fill\fi\ifTPICdraw draw\fi \space
+ \ifTPICfill\else subpath 4/3.14159*(\the\dimen20,\the\dimen22) of \fi
+ fullcircle xscaled \the\dimen10 \space yscaled \the\dimen12 \space
+ shifted (\the\dimen0,\the\dimen2)
+ \TPIClinetype \space \TPICgrayscale;}%
+ \resetTPICvariables
+ \egroup}
+
+%D Resetting the variables need to be done globally because we
+%D cannot be sure if any further grouping is used by the
+%D envelopping macros.
+
+\def\resetTPICvariables%
+ {\global\TPICcounter=0
+ \global\TPICfillfalse
+ \global\TPICdrawfalse
+ \global\let\TPIClinetype=\empty
+ \global\let\TPICgrayscale=\empty}
+
+%D I have to admit that by using the \METAPOST\ B‚zier cubics
+%D routines these implementation does produce better curves
+%D then most \DVI\ drivers do using the \TPIC\ prescribed
+%D b-splines. Take for instance the sequence:
+%D
+%D \starttypen
+%D \special{pa 2000 1000}
+%D \special{pa 1000 2000}
+%D \special{pa 0000 1000}
+%D \special{pa 1000 0000}
+%D \special{pa 2000 1000}
+%D \special{sp}
+%D \stoptypen
+%D
+%D One would expect that this code produced a closed circle,
+%D but the curve that comes out using b-splines is far from
+%D round. We can however savely asume that the arc producing
+%D specials will be used for drawing circle fragments, while
+%D the path specials will be used for arbitraty curves. And for
+%D b-splines to produce nice curves, one will often use many
+%D points to get the desired results. Therefore, using the
+%D \METAPOST\ B‚zier curves will certainly produce similar and
+%D even better graphics, except in those rare cases where one
+%D uses delinberately the not that accurate features of
+%D b-splines. Hereby the user is warned.
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/supp-vis.tex b/tex/context/base/supp-vis.tex index db28c77a5..54dc4779b 100644 --- a/tex/context/base/supp-vis.tex +++ b/tex/context/base/supp-vis.tex @@ -1,1908 +1,1908 @@ -%D \module -%D [ file=supp-vis, -%D version=1996.10.21, -%D title=\CONTEXT\ Support Macros, -%D subtitle=Visualization, -%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. - -%D \gdef\ShowBufferedExample% private typeseting macro -%D {\startregelcorrectie -%D \bgroup -%D \steltypenin[marge=0pt,optie=kleur] -%D \showmakeup -%D \centeredvcuetrue -%D \dontinterfere -%D \baselinerulefalse -%D \normalvbox -%D {\normalhbox to \hsize -%D {$\hsize=.5\hsize -%D \advance\hsize by -.5em -%D \normalvcenter{\vbox{\haalbuffer}}\normalhss -%D \normalvcenter{\vbox{\dontshowcomposition\typebuffer}}$}} -%D \egroup -%D \stopregelcorrectie} -%D -%D \gdef\ShowBufferedExampleBox% private typeseting macro -%D {\startregelcorrectie -%D \bgroup -%D \steltypenin[marge=0pt,optie=kleur] -%D \showmakeup -%D \centeredvcuetrue -%D \dontinterfere -%D \baselinerulefalse -%D \normalvbox -%D {\normalhbox to \hsize -%D {$\hsize=.5\hsize -%D \advance\hsize by -.5em -%D \normalvcenter{\baselineruletrue\vbox{\haalbuffer}}\normalhss -%D \normalvcenter{\vbox{\dontshowcomposition\typebuffer}}$}} -%D \egroup -%D \stopregelcorrectie} - -%D Although an integral part of \CONTEXT, this module is one -%D of the support modules. Its stand alone character permits -%D use in \PLAIN\ \TEX\ or \TEX\ based macropackages. -%D \ifCONTEXT \else If in some examples the verbatim listings -%D don't show up nice, this is due to processing by a system -%D that does not support buffering. In \CONTEXT\ we show the -%D commands in the margin, use bit more advanced way of -%D numbering, and typeset the source in \TEX nicolored -%D verbatim. Sorry for this inconvenience.\fi - -%D This module is still in development. Depending on my -%D personal need and those of whoever uses it, the macros will -%D be improved in terms of visualization, efficiency and -%D compatibility. - -\ifx \undefined \writestatus \input supp-mis.tex \fi - -%D One of the strong points of \TEX\ is abstraction of textual -%D input. When macros are defined well and do what we -%D want them to do, we will seldom need the tools present in -%D What You See Is What You Get systems. For instance, when -%D entering text we don't need rulers, because no manual -%D shifting and/or alignment of text is needed. On the other -%D hand, when we are designing macros or specifying layout -%D elements, some insight in \TEX's advanced spacing, kerning, -%D filling, boxing and punishment abilities will be handy. -%D That's why we've implemented a mechanism that shows some of -%D the inner secrets of \TEX. - -\writestatus{loading}{Context Support Macros / Visualization} - -%D In this module we are going to redefine some \TEX\ -%D primitives and \PLAIN\ macro's. Their original meaning is -%D saved in macros with corresponding names, preceded by -%D \type{normal}. These original macros are (1)~used to -%D temporary restore the old values when needed and -%D (2)~used to prevent recursive calls in the macros that -%D replace them. - -\unprotect - -%D \macros -%D {dontinterfere} -%D {} -%D -%D Indentation, left and/or right skips, redefinition of -%D \type{\par} and assignments to \type{\everypar} can lead to -%D unwanted results. We can therefore turn all those things -%D off with \type{\dontinterfere}. - -\def\dontinterfere% - {\everypar = {}% - \let\par = \endgraf - \parindent = \!!zeropoint - \parskip = \!!zeropoint - \leftskip = \!!zeropoint - \rightskip = \!!zeropoint - \relax} - -%D \macros -%D {dontcomplain} -%D {} -%D -%D In this module we do a lot of box manipulations. Because we -%D don't want to be confronted with to many over- and underfull -%D messages we introduce \type{\dontcomplain}. - -\def\dontcomplain% - {\hbadness = \!!tenthousand - \hfuzz = \maxdimen - \vbadness = \!!tenthousand - \vfuzz = \maxdimen} - -%D \macros -%D {normaloffinterlineskip} -%D {} -%D -%D The next hack is needed because in \CONTEXT\ we redefine -%D \type{\offinterlineskip}. - -\ifx\undefined\normaloffinterlineskip - \let\normaloffinterlineskip=\offinterlineskip -\fi - -%D \macros -%D {normalhbox, -%D normalvbox,normalvtop} -%D {} -%D -%D There are three types of boxes, one horizontal and two -%D vertical in nature. As we will see later on, all three types -%D are to be handled according to their orientation and -%D baseline behavior. Especially \type{\vtop}'s need our -%D special attention. - -\let\normalhbox = \hbox -\let\normalvbox = \vbox -\let\normalvtop = \vtop -\let\normalvcenter = \vcenter - -%D \macros -%D {normalhskip, -%D normalvskip} -%D {} -%D -%D Next come the flexible skips, which come in two flavors -%D too. Like boxes these are handled with \TEX\ primitives. - -\let\normalhskip = \hskip -\let\normalvskip = \vskip - -%D \macros -%D {normalpenalty, -%D normalkern} -%D {} -%D -%D Both penalties and kerns are taken care of by mode sensitive -%D primitives. This means that when making them visible, we -%D have to take the current mode into account. - -\let\normalpenalty = \penalty -\let\normalkern = \kern - -%D \macros -%D {normalhglue, -%D normalvglue} -%D {} -%D -%D Glues on the other hand are macro's defined in \PLAIN\ \TEX. -%D As we will see, their definitions make the implementation of -%D their visible counterparts a bit more \TeX{}nical. - -\let\normalhglue = \hglue -\let\normalvglue = \vglue - -%D \macros -%D {normalmkern, -%D normalmskip} -%D {} -%D -%D Math mode has its own spacing primitives, preceded by -%D \type{m}. Due to the relation with the current font and the -%D way math is typeset, their unit \type{mu} is not compatible -%D with other dimensions. As a result, the visual appearance -%D of these primitives is kept primitive too. - -\let\normalmkern = \mkern -\let\normalmskip = \mskip - -%D \macros -%D {hfilneg, -%D vfilneg} -%D {} -%D -%D Fills can be made visible quite easy. We only need some -%D additional negation macros. Because \PLAIN\ \TEX\ only -%D offers \type{\hfilneg} and \type{\vfilneg}, we define our -%D own alternative double \type{ll}'ed ones. - -\def\hfillneg% - {\normalhskip\!!zeropoint \!!plus-1fill\relax} - -\def\vfillneg% - {\normalvskip\!!zeropoint \!!plus-1fill\relax} - -%D \macros -%D {normalhss,normalhfil,normalhfill, -%D normalvss,normalvfil,normalvfill} -%D {} -%D -%D The positive stretch primitives are used independant and in -%D combination with \type{\leaders}. - -\let\normalhss = \hss -\let\normalhfil = \hfil -\let\normalhfill = \hfill -\let\normalvss = \vss -\let\normalvfil = \vfil -\let\normalvfill = \vfill - -%D \macros -%D {normalhfilneg,normalhfillneg, -%D normalvfilneg,normalvfillneg} -%D {} -%D -%D Keep in mind that both \type{\hfillneg} and \type{\vfillneg} -%D are not part of \PLAIN\ \TEX\ and therefore not documented -%D in standard \TEX\ documentation. They can nevertheless be -%D used at will. - -\let\normalhfilneg = \hfilneg -\let\normalhfillneg = \hfillneg -\let\normalvfilneg = \vfilneg -\let\normalvfillneg = \vfillneg - -%D Visualization is not always wanted. Instead of turning this -%D option off in those (unpredictable) situations, we just -%D redefine a few \PLAIN\ macros. - -\def\rlap#1{\normalhbox to \!!zeropoint{#1\normalhss}} -\def\llap#1{\normalhbox to \!!zeropoint{\normalhss#1}} - -\def~{\normalpenalty\!!tenthousand\ } - -%D \macros -%D {makeruledbox} -%D {} -%D -%D Ruled boxes can be typeset is many ways. Here we present -%D just one alternative. This implementation may be a little -%D complicated, but it supports all three kind of boxes. The -%D next command expects a \BOX\ specification, like: -%D -%D \starttypen -%D \makeruledbox0 -%D \stoptypen - -%D \macros -%D {baselinerule,baselinefill} -%D {} -%D -%D We can make the baseline of a box visible, both dashed and -%D as a rule. The line is drawn on top of the baseline. All -%D we have to say is: -%D -%D \starttypen -%D \baselineruletrue -%D \baselinefilltrue -%D \stoptypen -%D -%D At the cost of some overhead these alternatives are -%D implemented using \type{\if}'s: - -\newif\ifbaselinerule \baselineruletrue -\newif\ifbaselinefill \baselinefillfalse - -%D \macros -%D {iftoprule,ifbottomrule,ifleftrule,ifrightrule} -%D {} -%D -%D Rules can be turned on and off, but by default we have: -%D -%D \starttypen -%D \topruletrue -%D \bottomruletrue -%D \leftruletrue -%D \rightruletrue -%D \stoptypen -%D -%D As we see below: - -\newif\iftoprule \topruletrue -\newif\ifbottomrule \bottomruletrue -\newif\ifleftrule \leftruletrue -\newif\ifrightrule \rightruletrue - -%D \macros -%D {boxrulewidth} -%D {} -%D -%D The width in the surrounding rules can be specified by -%D assigning an apropriate value to the dimension used. This -%D module defaults the width to: -%D -%D \starttypen -%D \boxrulewidth=.2pt -%D \stoptypen -%D -%D Although we are already low on \DIMENSIONS\ it's best to -%D spend one here, mainly because it enables easy manipulation, -%D like multiplication by a given factor. - -\newdimen\boxrulewidth \boxrulewidth=.2pt - -%D The core macro \type{\makeruledbox} looks a bit hefty. The -%D manipulation at the end is needed because we want to -%D preserve both the mode and the baseline. This means that -%D \type{\vtop}'s and \type{\vbox}'es behave the way we expect -%D them to do. -%D -%D \startregelcorrectie -%D \hbox -%D {\ruledhbox to 5em{\strut test\normalhss}\hskip1em -%D \ruledvbox{\hsize 5em\strut test \par test\strut}\hskip1em -%D \ruledvtop{\hsize 5em\strut test \par test\strut}} -%D \stopregelcorrectie -%D -%D The \type{\cleaders} part of the macro is responsible for -%D the visual baseline. The \type{\normalhfill} belongs to this -%D primitive too. By storing and restoring the height and depth -%D of box \type{#1}, we preserve the mode. - -\def\makeruledbox#1% - {\edef\ruledheight{\the\ht#1}% - \edef\ruleddepth {\the\dp#1}% - \edef\ruledwidth {\the\wd#1}% - \setbox\scratchbox=\normalvbox - {\dontcomplain - \normaloffinterlineskip - \hrule - \!!height\boxrulewidth - \iftoprule\else\!!width\!!zeropoint\fi - \normalvskip-\boxrulewidth - \normalhbox to \ruledwidth - {\vrule - \!!height\ruledheight - \!!depth\ruleddepth - \!!width\ifleftrule\else0\fi\boxrulewidth - \ifdim\ruledheight>\!!zeropoint \else \baselinerulefalse \fi - \ifdim\ruleddepth>\!!zeropoint \else \baselinerulefalse \fi - \ifbaselinerule - \ifdim\ruledwidth<20\boxrulewidth - \baselinefilltrue - \fi - \cleaders - \ifbaselinefill - \hrule - \!!height\boxrulewidth - \else - \normalhbox - {\normalhskip2.5\boxrulewidth - \vrule - \!!height\boxrulewidth - \!!width5\boxrulewidth - \normalhskip2.5\boxrulewidth}% - \fi - \fi - \normalhfill - \vrule - \!!width\ifrightrule\else0\fi\boxrulewidth}% - \normalvskip-\boxrulewidth - \hrule - \!!height\boxrulewidth - \ifbottomrule\else\!!width\!!zeropoint\fi}% - \wd#1=\!!zeropoint - \setbox#1=\ifhbox#1\normalhbox\else\normalvbox\fi - {\normalhbox{\box#1\lower\ruleddepth\box\scratchbox}}% - \ht#1=\ruledheight - \wd#1=\ruledwidth - \dp#1=\ruleddepth} - -%D Just in case one didn't notice: the rules are in fact layed -%D over the box. This way the contents of a box cannot -%D visually interfere with the rules around (upon) it. A more -%D advanced version of ruled boxes can be found in one of the -%D core modules of \CONTEXT. There we take offsets, color, -%D rounded corners, backgrounds and alignment into account too. - -%D \macros -%D {ruledhbox, -%D ruledvbox,ruledvtop, -%D ruledvcenter} -%D {} -%D -%D These macro's can be used instead of \type{\hbox}, -%D \type{\vbox}, \type{\vtop} and, when in math mode, -%D \type{\vcenter}. They just do what their names state. Using -%D an auxiliary macro would save us a few words of memory, but -%D it would make their appearance even more obscure. -%D -%D \startbuffer -%D \hbox -%D {\strut -%D one -%D two -%D \hbox{three} -%D four -%D five} -%D \stopbuffer -%D -%D \ShowBufferedExampleBox - -\unexpanded\def\ruledhbox% - {\normalhbox\bgroup - \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}% - \normalhbox} - -%D \startbuffer -%D \vbox -%D {\strut -%D first line \par -%D second line \par -%D third line \par -%D fourth line \par -%D fifth line -%D \strut } -%D \stopbuffer -%D -%D \ShowBufferedExampleBox - -\unexpanded\def\ruledvbox% - {\normalvbox\bgroup - \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}% - \normalvbox} - -%D \startbuffer -%D \vtop -%D {\strut -%D first line \par -%D second line \par -%D third line \par -%D fourth line \par -%D fifth line -%D \strut } -%D \stopbuffer -%D -%D \ShowBufferedExampleBox - -\unexpanded\def\ruledvtop% - {\normalvtop\bgroup - \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}% - \normalvtop} - -%D \startbuffer -%D \hbox -%D {$\vcenter{\hsize.2\hsize -%D alfa \par beta}$ -%D $\vcenter to 3cm{\hsize.2\hsize -%D alfa \par beta \par gamma}$ -%D $\vcenter{\hsize.2\hsize -%D alfa \par beta}$} -%D \stopbuffer -%D -%D \ShowBufferedExampleBox - -\unexpanded\def\ruledvcenter% - {\normalvbox\bgroup - \dontinterfere - \dowithnextbox - {\scratchdimen=.5\ht\nextbox - \advance\scratchdimen by .5\dp\nextbox - \ht\nextbox=\scratchdimen - \dp\nextbox=\scratchdimen - \ruledhbox{\box\nextbox}% - \egroup}% - \normalvbox} - -%D \macros -%D {ruledbox, -%D setruledbox} -%D {} -%D -%D Of the next two macros the first can be used to precede a -%D box of ones own choice. One can for instance prefix boxes -%D with \type{\ruledbox} and afterwards --- when the macro -%D satisfy the needs --- let it to \type{\relax}. -%D -%D \starttypen -%D \ruledbox\hbox{What rules do you mean?} -%D \stoptypen -%D -%D The macro \type{\setruledbox} can be used to directly -%D rule a box. -%D -%D \starttypen -%D \setruledbox12=\hbox{Who's talking about rules here?} -%D \stoptypen -%D -%D At the cost of some extra macros we can implement a -%D variant that does not need the~\type{=}, but we stick to: - -\unexpanded\def\ruledbox% - {\dowithnextbox{\makeruledbox\nextbox\box\nextbox}} - -\def\setruledbox#1=% - {\dowithnextbox{\makeruledbox\nextbox\setbox#1=\nextbox}} - -%D \macros -%D {investigateskip, -%D investigatecount, -%D investigatemuskip} -%D {} -%D -%D Before we meet the visualizing macro's, we first implement -%D ourselves some handy utility ones. Just for the sake of -%D efficiency and readability, we introduce some status -%D variables, that tell us a bit more about the registers we -%D use: -%D -%D \starttypen -%D \ifflexible -%D \ifzero -%D \ifnegative -%D \ifpositive -%D \stoptypen -%D -%D These status variables are set when we call for one of the -%D investigation macros, e.g. -%D -%D \starttypen -%D \investigateskip\scratchskip -%D \stoptypen -%D -%D We use some dirty trick to check stretchability of \SKIPS. -%D Users of these macros are invited to study their exact -%D behavior first. The positive and negative states both -%D include zero and are in fact non-negative ($\geq0$) and -%D non-positive ($\leq0$) . - -\newif\ifflexible -\newif\ifzero -\newif\ifnegative -\newif\ifpositive - -\def\investigateskip#1% - {\relax - \scratchdimen=#1\relax - \edef\!!stringa{\the\scratchdimen}% - \edef\!!stringb{\the#1}% - \ifx\!!stringa\!!stringb \flexiblefalse \else \flexibletrue \fi - \ifdim#1=\!!zeropoint\relax - \zerotrue \else - \zerofalse \fi - \ifdim#1<\!!zeropoint\relax - \positivefalse \else - \positivetrue \fi - \ifdim#1>\!!zeropoint\relax - \negativefalse \else - \negativetrue \fi} - -\def\investigatecount#1% - {\relax - \flexiblefalse - \ifnum#1=0 - \zerotrue \else - \zerofalse \fi - \ifnum#1<0 - \positivefalse \else - \positivetrue \fi - \ifnum#1>0 - \negativefalse \else - \negativetrue \fi} - -\def\investigatemuskip#1% - {\relax - \edef\!!stringa{\the\scratchmuskip}% - \edef\!!stringb{0mu}% - \def\!!stringc##1##2\\{##1}% - \expandafter\edef\expandafter\!!stringc\expandafter - {\expandafter\!!stringc\!!stringa\\}% - \edef\!!stringd{-}% - \flexiblefalse - \ifx\!!stringa\!!stringb - \zerotrue - \negativefalse - \positivefalse - \else - \zerofalse - \ifx\!!stringc\!!stringd - \positivefalse - \negativetrue - \else - \positivetrue - \negativefalse - \fi - \fi} - -%D Now the neccessary utility macros are defined, we can make a -%D start with the visualizing ones. The implementation of these -%D macros is a compromise between readability, efficiency of -%D coding and processing speed. Sometimes we do in steps what -%D could have been done in combination, sometimes we use a few -%D boxes more or less then actually needed, and more than once -%D one can find the same piece of rule drawing code twice. - -%D \macros -%D {ifcenteredvcue,normalvcue} -%D {} -%D -%D Depending on the context, one can force visual vertical cues -%D being centered along \type{\hsize} or being put at the -%D current position. Although centering often looks better, -%D we've chosen the second alternative as default. The main -%D reason for doing so is that often when we don't set the -%D \type{\hsize} ourselves, \TEX\ takes the value of the -%D surrounding box. As a result the visual cues can migrate -%D outside the current context. -%D -%D This behavior is accomplished by a small but effective -%D auxiliary macro, which behavior can be influenced by the -%D boolean \type{\centeredvcue}. By saying -%D -%D \starttypen -%D \centeredvcuetrue -%D \stoptypen -%D -%D one turns centering on. As said, we turn it off. - -\newif\ifcenteredvcue \centeredvcuefalse - -\def\normalvcue#1% - {\normalhbox \ifcenteredvcue to \hsize \fi {\normalhss#1\normalhss}} - -%D We could have used the more robust version -%D -%D \starttypen -%D \def\normalvcue% -%D {\normalhbox \ifcenteredvcue to \hsize \fi -%D \bgroup\bgroup\normalhss -%D \aftergroup\normalhss\aftergroup\egroup -%D \let\next=} -%D \stoptypen -%D -%D or the probably best one: -%D -%D \starttypen -%D \def\normalvcue% -%D {\hbox \ifcenteredvcue to \hsize -%D \bgroup\bgroup\normalhss -%D \aftergroup\normalhss\aftergroup\egroup -%D \else -%D \bgroup -%D \fi -%D \let\next=} -%D \stoptypen -%D -%D Because we don't have to preserve \CATCODES\ and only use -%D small arguments, we stick to the first alternative. - -%D \macros -%D {testrulewidth} -%D {} -%D -%D We build our visual cues out of rules. At the cost of a much -%D bigger \DVI\ file, this is to be prefered over using -%D characters (1)~because we cannot be sure of their -%D availability and (2)~because their dimensions are fixed. -%D -%D As with ruled boxes, we use a \DIMENSION\ to specify the -%D width of the ruled elements. This dimension defaults to: -%D -%D \starttypen -%D \testrulewidth=\boxrulewidth -%D \stoptypen -%D -%D Because we prefer whole numbers for specifying the -%D dimensions, we often use even multiples of -%D \type{\testrulewidth}. - -%D \macros -%D {visiblestretch} -%D {} -%D -%D A second variable is introduced because of the stretch -%D components of \SKIPS. At the cost of some accuracy we can -%D make this stretch visible. -%D -%D \starttypen -%D \visiblestretchtrue -%D \stoptypen - -\newdimen\testrulewidth \testrulewidth=\boxrulewidth -\newif\ifvisiblestretch \visiblestretchfalse - -%D \macros -%D {ruledhss, -%D ruledhfil,ruledhfilneg, -%D ruledhfill,ruledhfillneg} -%D {} -%D -%D We start with the easiest part, the fills. The scheme we -%D follow is {\em visual filling -- going back -- normal -%D filling}. Visualizing is implemented using \type{\cleaders}. -%D Because the \BOX\ that follows this command is constructed -%D only once, the \type{\copy} is not really a prerequisite. We -%D prefer using a \type{\normalhbox} here instead of a -%D \type{\hbox}. - -\def\setvisiblehfilbox#1\to#2#3#4% - {\setbox#1=\normalhbox - {\vrule - \!!width#2\testrulewidth - \!!height#3\testrulewidth - \!!depth#4\testrulewidth}% - \smashbox#1} - -\def\doruledhfiller#1#2#3#4% - {#1#2% - \bgroup - \dontinterfere - \dontcomplain - \setvisiblehfilbox0\to{4}{#3}{#4}% - \setvisiblehfilbox2\to422% - \copy0\copy2 - \bgroup - \setvisiblehfilbox0\to422% - \cleaders - \normalhbox to 12\testrulewidth - {\normalhss\copy0\normalhss}% - #1% - \egroup - \setbox0=\normalhbox - {\normalhskip-4\testrulewidth\copy0\copy2}% - \smashbox0 - \box0 - \egroup} - -%D The horizontal fillers differ in their boundary -%D visualization. Watch the small dots. Fillers can be -%D combined within reasonable margins. -%D -%D \startregelcorrectie -%D \baselinerulefalse -%D \ruledhbox to \hsize -%D {\strut\type{\hss}\ruledhss test} -%D \stopregelcorrectie -%D -%D \startregelcorrectie -%D \baselinerulefalse -%D \ruledhbox to \hsize -%D {\strut\type{\hfil}\ruledhfil test} -%D \stopregelcorrectie -%D -%D \startregelcorrectie -%D \baselinerulefalse -%D \ruledhbox to \hsize -%D {\strut\type{\hfill}\ruledhfill test} -%D \stopregelcorrectie -%D -%D \startregelcorrectie -%D \baselinerulefalse -%D \ruledhbox to \hsize -%D {\strut -%D \type{\hfil}\type{\hfil}\ruledhfil\ruledhfil -%D test% -%D \ruledhfil\type{\hfil}} -%D \stopregelcorrectie -%D -%D The negative counterparts are visualizes, but seldom -%D become visible, apart from their boundaries. -%D -%D \startregelcorrectie -%D \baselinerulefalse -%D \ruledhbox to \hsize -%D {\strut\type{\hfilneg}\ruledhfilneg test} -%D \stopregelcorrectie -%D -%D \startregelcorrectie -%D \baselinerulefalse -%D \ruledhbox to \hsize -%D {\strut\type{\hfillneg}\ruledhfillneg test} -%D \stopregelcorrectie -%D -%D Although leaders are used for visualizing, they are -%D visualized themselves correctly as the next example shows. -%D -%D \startregelcorrectie -%D \baselinerulefalse -%D \ruledhbox to \hsize -%D {\strut\cleaders\normalhbox to 2em{\normalhss$\circ$\normalhss}\ruledhfill} -%D \stopregelcorrectie -%D -%D All five substitutions use the same auxiliary macro. Watch -%D the positive first -- negative next approach. - -\unexpanded\def\ruledhss% - {\doruledhfiller\normalhss\normalhfilneg{0}{0}} - -\unexpanded\def\ruledhfil% - {\doruledhfiller\normalhfil\normalhfilneg{10}{-6}} - -\unexpanded\def\ruledhfill% - {\doruledhfiller\normalhfill\normalhfillneg{18}{-14}} - -\unexpanded\def\ruledhfilneg% - {\doruledhfiller\normalhfilneg\normalhfil{-6}{10}} - -\unexpanded\def\ruledhfillneg% - {\doruledhfiller\normalhfillneg\normalhfill{-14}{18}} - -%D \macros -%D {ruledvss, -%D ruledvfil,ruledvfilneg, -%D ruledvfill,ruledvfillneg} -%D {} -%D -%D The vertical mode commands adopt the same visualization -%D scheme, but are implemented in a slightly different way. - -\def\setvisiblevfilbox#1\to#2#3#4% - {\setbox#1=\normalhbox - {\vrule - \!!width#2\testrulewidth - \!!height#3\testrulewidth - \!!depth#4\testrulewidth}% - \smashbox#1}% - -\def\doruledvfiller#1#2#3% - {#1#2% - \bgroup - \dontinterfere - \dontcomplain - \normaloffinterlineskip - \setvisiblevfilbox0\to422% - \setbox2=\normalvcue - {\normalhskip -#3\testrulewidth\copy0}% - \smashbox2 - \copy2 - \bgroup - \setbox2=\normalvcue - {\normalhskip -2\testrulewidth\copy0}% - \smashbox2 - \copy2 - \cleaders - \normalvbox to 12\testrulewidth - {\normalvss\copy2\normalvss}% - #1% - \setbox2=\normalvbox - {\normalvskip-2\testrulewidth\copy2}% - \smashbox2 - \box2 - \egroup - \box2 - \egroup} - -%D Because they act the same as their horizontal counterparts -%D we only show a few examples. -%D -%D \startregelcorrectie -%D \hbox to \hsize -%D {\dontinterfere -%D \baselinerulefalse -%D \centeredvcuetrue -%D \ruledvbox to 10ex -%D {\hsize.18\hsize -%D \type{\vss}\ruledvss last line}\normalhss -%D \ruledvbox to 10ex -%D {\hsize.18\hsize -%D \type{\vfil}\ruledvfil last line}\normalhss -%D \ruledvbox to 10ex -%D {\hsize.18\hsize -%D \type{\vfill}\ruledvfill last line}\normalhss -%D \ruledvbox to 10ex -%D {\hsize.18\hsize -%D \type{\vfilneg}\ruledvfilneg last line}\normalhss -%D \ruledvbox to 10ex -%D {\hsize.18\hsize -%D \type{\vfillneg}\ruledvfillneg last line}} -%D \stopregelcorrectie -%D -%D Keep in mind that \type{\vfillneg} is not part of \PLAIN\ -%D \TEX, but are mimmicked by a macro. - -\unexpanded\def\ruledvss% - {\doruledvfiller\normalvss\normalvfilneg{2}} - -\unexpanded\def\ruledvfil% - {\doruledvfiller\normalvfil\normalvfilneg{-4}} - -\unexpanded\def\ruledvfill% - {\doruledvfiller\normalvfill\normalvfillneg{-12}} - -\unexpanded\def\ruledvfilneg% - {\doruledvfiller\normalvfilneg\normalvfil{8}} - -\unexpanded\def\ruledvfillneg% - {\doruledvfiller\normalvfillneg\normalvfill{16}} - -%D \macros -%D {ruledhskip} -%D {} -%D -%D Skips differ from kerns in two important aspects: -%D -%D \startopsomming[opelkaar] -%D \som line and pagebreaks are allowed at a skip -%D \som skips can have a positive and/or negative -%D stretchcomponent -%D \stopopsomming -%D -%D Stated a bit different: kerns are fixed skips at which no -%D line or pagebreak can occur. Because skips have a more open -%D character, they are visualized in a open way. -%D -%D \startbuffer -%D one -%D \hskip +30pt plus 5pt -%D two -%D \hskip +30pt -%D \hskip -10pt plus 5pt -%D three -%D \hskip 0pt -%D four -%D \hskip +30pt -%D five -%D \stopbuffer -%D -%D \ShowBufferedExample -%D -%D When skips have a stretch component, this is visualized by -%D means of a dashed line. Positive skips are on top of the -%D baseline, negative ones are below it. This way we can show -%D the combined results. An alternative visualization of -%D stretch could be drawing the mid line over a length of the -%D stretch, in positive or negative direction. - -\def\doruledhskip% - {\relax - \dontinterfere - \dontcomplain - \investigateskip\scratchskip - \ifzero - \setbox0=\normalhbox - {\normalhskip-\testrulewidth - \vrule - \!!width4\testrulewidth - \!!height16\testrulewidth - \!!depth16\testrulewidth}% - \else - \setbox0=\normalhbox to \ifnegative-\fi\scratchskip - {\vrule - \!!width2\testrulewidth - \ifnegative\!!depth\else\!!height\fi16\testrulewidth - \cleaders - \hrule - \ifnegative - \!!depth2\testrulewidth - \!!height\!!zeropoint - \else - \!!height2\testrulewidth - \!!depth\!!zeropoint - \fi - \normalhfill - \ifflexible - \normalhskip\ifnegative\else-\fi\scratchskip - \normalhskip2\testrulewidth - \cleaders - \normalhbox - {\normalhskip 2\testrulewidth - \vrule - \!!width2\testrulewidth - \!!height\ifnegative-7\else9\fi\testrulewidth - \!!depth\ifnegative9\else-7\fi\testrulewidth - \normalhskip 2\testrulewidth}% - \normalhfill - \fi - \vrule - \!!width2\testrulewidth - \ifnegative\!!depth\else\!!height\fi16\testrulewidth}% - \setbox0=\normalhbox - {\ifnegative\else\normalhskip-\scratchskip\fi - \box0}% - \fi - \smashbox0% - \ifvisiblestretch \else - \flexiblefalse - \fi - \ifflexible - % breaks ok but small displacements can occur - \skip2=\scratchskip - \advance\skip2 by -1\scratchskip - \divide\skip2 by 2 - \advance\scratchskip by -\skip2 - \normalhskip\scratchskip - \normalpenalty\!!tenthousand - \box0 - \normalhskip\skip2 - \else - \normalhskip\scratchskip - \box0 - \fi - \egroup} - -\unexpanded\def\ruledhskip% - {\bgroup - \afterassignment\doruledhskip - \scratchskip=} - -%D The visual skip is located at a feasible point. Normally -%D this does not interfere with the normaltypesetting process. -%D The next examples show (1)~the default behavior, (2)~the -%D (not entirely correct) distributed stretch and (3)~the way -%D the text is typeset without cues. -%D -%D \startbuffer -%D \dorecurse -%D {15} -%D {test\hskip1em plus .5em minus .5em -%D test\hskip2em -%D test} -%D \stopbuffer -%D -%D \startregelcorrectie -%D \showmakeup -%D \haalbuffer -%D \stopregelcorrectie -%D -%D \startregelcorrectie -%D \showmakeup -%D \visiblestretchtrue -%D \haalbuffer -%D \stopregelcorrectie -%D -%D \startregelcorrectie -%D \haalbuffer -%D \stopregelcorrectie - -%D \macros -%D {ruledvskip} -%D {} -%D -%D We are less fortunate when implementing the vertical skips. -%D This is a direct result of interference between the boxes that -%D visualize the skip and skip removal at a pagebreak. Normally -%D skips disappear at the top of a page, but not of course when -%D visualized in a \type{\vbox}. A quite perfect simulation -%D could have been built if we would have had available two -%D more primitives: \type{\hnop} and \type{\vnop}. These new -%D primitives could stand for boxes that are visible but are -%D not taken into account in any way. They are there for us, -%D but not for \TEX. -%D -%D \startbuffer -%D first line -%D \vskip +30pt plus 5pt -%D second line -%D \vskip +30pt -%D \vskip -10pt plus 5pt -%D third line -%D \par -%D fourth line -%D \vskip +30pt -%D fifth line -%D \vskip 0pt -%D sixth line -%D \stopbuffer -%D -%D \ShowBufferedExample -%D -%D We have to postpone \type{\prevdepth}. Although this -%D precaution probably is not completely waterproof, it works -%D quite well. - -\def\dodoruledvskip% - {\nextdepth=\prevdepth - \dontinterfere - \dontcomplain - \normaloffinterlineskip - \investigateskip\scratchskip - \ifzero - \setbox0=\normalvcue - {\vrule - \!!width32\testrulewidth - \!!height2\testrulewidth - \!!depth2\testrulewidth}% - \else - \setbox0=\normalvbox to \ifnegative-\fi\scratchskip - {\hrule - \!!width16\testrulewidth - \!!height2\testrulewidth - \ifflexible - \cleaders - \normalhbox to 16\testrulewidth - {\normalhss - \normalvbox - {\normalvskip 2\testrulewidth - \hrule - \!!width2\testrulewidth - \!!height2\testrulewidth - \normalvskip 2\testrulewidth}% - \normalhss}% - \normalvfill - \else - \normalvfill - \fi - \hrule - \!!width16\testrulewidth - \!!height2\testrulewidth}% - \setbox2=\normalvbox to \ht0 - {\hrule - \!!width2\testrulewidth - \!!height\ht0}% - \ifnegative - \ht0=\!!zeropoint - \setbox0=\normalhbox - {\normalhskip2\testrulewidth % will be improved - \normalhskip-\wd0\box0}% - \fi - \smashbox0% - \smashbox2% - \setbox0=\normalvcue - {\box2\box0}% - \setbox0=\normalvbox - {\ifnegative\normalvskip\scratchskip\fi\box0}% - \smashbox0% - \fi - \ifvisiblestretch - \ifflexible - \skip2=\scratchskip - \advance\skip2 by -1\scratchskip - \divide\skip2 by 2 - \advance\scratchskip by -\skip2 - \normalvskip\skip2 - \fi - \fi - \normalpenalty\!!tenthousand - \box0 - \prevdepth=\nextdepth % not \dp0=\nextdepth - \normalvskip\scratchskip} - -%D We try to avoid interfering at the top of a page. Of course -%D we only do so when we are in the main vertical list. - -\def\doruledvskip% - {\endgraf % \par - \ifdim\pagegoal=\maxdimen - \ifinner - \dodoruledvskip - \fi - \else - \dodoruledvskip - \fi - \egroup} - -\unexpanded\def\ruledvskip% - {\bgroup - \afterassignment\doruledvskip - \scratchskip=} - -%D \macros -%D {ruledkern} -%D {} -%D -%D The macros that implement the kerns are a bit more -%D complicated than needed, because they also serve the -%D visualization of glue, our \PLAIN\ defined kerns with -%D stretch or shrink. We've implemented both horizontal and -%D vertical kerns as ruled boxes. -%D -%D \startbuffer -%D one -%D \kern +30pt -%D two -%D \kern +30pt -%D \kern -10pt -%D three -%D \kern 0pt -%D four -%D \kern +30pt -%D five -%D \stopbuffer -%D -%D \ShowBufferedExample -%D -%D Positive and negative kerns are placed on top or below the -%D baseline, so we are able to track their added result. We -%D didn't mention spacings of 0~pt yet. Zero values are -%D visualized a bit different, because we want to see them -%D anyhow. - -\def\doruledhkern% - {\dontinterfere - \dontcomplain - \baselinerulefalse - \investigateskip\scratchskip - \boxrulewidth=2\testrulewidth - \ifzero - \setbox0=\ruledhbox to 8\testrulewidth - {\vrule - \!!width\!!zeropoint - \!!height16\testrulewidth - \!!depth16\testrulewidth}% - \setbox0=\normalhbox - {\normalhskip-4\testrulewidth\box0}% - \else - \setbox0=\ruledhbox to \ifnegative-\fi\scratchskip - {\vrule - \!!width\!!zeropoint - \ifnegative\!!depth\else\!!height\fi16\testrulewidth - \ifflexible - \normalhskip2\testrulewidth - \cleaders - \normalhbox - {\normalhskip 2\testrulewidth - \vrule - \!!width2\testrulewidth - \!!height\ifnegative-7\else9\fi\testrulewidth - \!!depth\ifnegative9\else-7\fi\testrulewidth - \normalhskip 2\testrulewidth}% - \normalhfill - \else - \normalhfill - \fi}% - \testrulewidth=2\testrulewidth - \setbox0=\ruledhbox{\box0}% \make... - \fi - \smashbox0% - \normalpenalty\!!tenthousand - \normalhbox to \!!zeropoint - {\ifnegative\normalhskip1\scratchskip\fi - \box0}% - \afterwards\scratchskip - \egroup} - -\unexpanded\def\ruledhkern#1% - {\bgroup - \let\afterwards=#1\relax - \afterassignment\doruledhkern - \scratchskip=} - -%D After having seen the horizontal ones, the vertical kerns -%D will not surprise us. In this example we use \type{\par} to -%D switch to vertical mode. -%D -%D \startbuffer -%D first line -%D \par \kern +30pt -%D second line -%D \par \kern +30pt -%D \par \kern -10pt -%D third line -%D \par -%D fourth line -%D \par \kern +30pt -%D fifth line -%D \par \kern 0pt -%D sixth line -%D \stopbuffer -%D -%D \ShowBufferedExample -%D -%D Like before, we have to postpone \type{\prevdepth}. If we -%D leave out this trick, we got ourselves some wrong spacing. - -\def\dodoruledvkern% - {\nextdepth=\prevdepth - \dontinterfere - \dontcomplain - \baselinerulefalse - \normaloffinterlineskip - \investigateskip\scratchskip - \boxrulewidth=2\testrulewidth - \ifzero - \setbox0=\ruledhbox to 32\testrulewidth - {\vrule - \!!width\!!zeropoint - \!!height4\testrulewidth - \!!depth4\testrulewidth}% - \else - \setbox0=\ruledvbox to \ifnegative-\fi\scratchskip - {\hsize16\testrulewidth - \ifflexible - \cleaders - \normalhbox to 16\testrulewidth - {\normalhss - \normalvbox - {\normalvskip 2\testrulewidth - \hrule - \!!width2\testrulewidth - \!!height2\testrulewidth - \normalvskip 2\testrulewidth}% - \normalhss}% - \normalvfill - \else - \vrule - \!!width\!!zeropoint - \!!height\ifnegative-\fi\scratchskip - \normalhfill - \fi} - \fi - \testrulewidth=2\testrulewidth - \setbox0=\ruledvbox{\box0}% \make... - \smashbox0% - \setbox0=\normalvbox - {\ifnegative\normalvskip\scratchskip\fi - \normalvcue - {\ifnegative\normalhskip-16\testrulewidth\fi\box0}}% - \smashbox0% - \normalpenalty\!!tenthousand - \box0 - \prevdepth=\nextdepth} % not \dp0=\nextdepth - -\def\doruledvkern% - {\ifdim\pagegoal=\maxdimen - \ifinner - \dodoruledvkern - \fi - \else - \dodoruledvkern - \fi - \afterwards\scratchskip - \egroup} - -\unexpanded\def\ruledvkern#1% - {\bgroup - \let\afterwards=#1\relax - \afterassignment\doruledvkern - \scratchskip=} - -\unexpanded\def\ruledkern% - {\ifvmode - \expandafter\ruledvkern - \else - \expandafter\ruledhkern - \fi - \normalkern} - -%D A a bit more \TEX nice solution is: -%D -%D \starttypen -%D \unexpanded\def\ruledkern% -%D {\csname ruled\ifvmode v\else h\fi kern\endcsname\normalkern} -%D \stoptypen - -%D \macros -%D {ruledhglue,ruledvglue} -%D {} -%D -%D The non-primitive glue commands are treated as kerns with -%D stretch. This stretch is presented as a dashed line. I -%D have to admit that until now, I've never used these glue -%D commands. -%D -%D \startbuffer -%D one -%D \hglue +30pt plus 5pt -%D two -%D \hglue +30pt -%D \hglue -10pt plus 5pt -%D three -%D \hglue 0pt -%D four -%D \hglue +30pt -%D five -%D \stopbuffer -%D -%D \ShowBufferedExample - -\def\doruledhglue% - {\leavevmode - \scratchcounter=\spacefactor - \vrule\!!width\!!zeropoint - \normalpenalty\!!tenthousand - \ruledhkern\normalhskip\scratchskip - \spacefactor=\scratchcounter - \egroup} - -\unexpanded\def\ruledhglue% - {\bgroup - \afterassignment\doruledhglue\scratchskip=} - -%D \startbuffer -%D first line -%D \vglue +30pt plus 5pt -%D second line -%D \vglue +30pt -%D \vglue -10pt plus 5pt -%D third line -%D \par -%D fourth line -%D \vglue +30pt -%D fifth line -%D \vglue 0pt -%D sixth line -%D \stopbuffer -%D -%D \ShowBufferedExample - -\def\doruledvglue% - {\endgraf % \par - \nextdepth=\prevdepth - \hrule\!!height\!!zeropoint - \normalpenalty\!!tenthousand - \ruledvkern\normalvskip\scratchskip - \prevdepth=\nextdepth - \egroup} - -\unexpanded\def\ruledvglue% - {\bgroup - \afterassignment\doruledvglue\scratchskip=} - -%D \macros -%D {ruledmkern,ruledmskip} -%D {} -%D -%D Mathematical kerns and skips are specified in mu. This -%D font related unit is incompatible with those of \DIMENSIONS\ -%D and \SKIPS. Because in math mode spacing is often a very -%D subtle matter, we've used a very simple, not overloaded way -%D to show them. - -\def\dodoruledmkern#1% - {\dontinterfere - \dontcomplain - \setbox0=\normalhbox - {$\normalmkern\ifnegative-\fi\scratchmuskip$}% - \setbox0=\normalhbox to \wd0 - {\vrule - \!!height16\testrulewidth - \!!depth16\testrulewidth - \!!width\testrulewidth - \leaders - \hrule - \!!height\ifpositive16\else-14\fi\testrulewidth - \!!depth\ifpositive-14\else16\fi\testrulewidth - \normalhfill - \ifflexible - \normalhskip-\wd0 - \leaders - \hrule - \!!height\testrulewidth - \!!depth\testrulewidth - \normalhfill - \fi - \vrule - \!!height16\testrulewidth - \!!depth16\testrulewidth - \!!width\testrulewidth}% - \smashbox0% - \ifnegative - #1\scratchmuskip - \box0 - \else - \box0 - #1\scratchmuskip - \fi - \egroup} - -%D \startbuffer -%D $a \mkern3mu = \mkern3mu -%D b \quad -%D \mkern-2mu + \mkern-2mu -%D \quad c$ -%D \stopbuffer -%D -%D \ShowBufferedExample - -\def\doruledmkern% - {\investigatemuskip\scratchmuskip - \flexiblefalse - \dodoruledmkern\normalmkern} - -\unexpanded\def\ruledmkern% - {\bgroup - \afterassignment\doruledmkern\scratchmuskip=} - -%D \startbuffer -%D $a \mskip3mu = \mskip3mu -%D b \quad -%D \mskip-2mu + \mskip-2mu -%D \quad c$ -%D \stopbuffer -%D -%D \ShowBufferedExample - -\def\doruledmskip% - {\investigatemuskip\scratchmuskip - \flexibletrue - \dodoruledmkern\normalmskip} - -\unexpanded\def\ruledmskip% - {\bgroup - \afterassignment\doruledmskip\scratchmuskip=} - -%D \macros -%D {penalty} -%D {} -%D -%D After presenting fills, skip, kerns and glue we've come to -%D see penalties. In the first implementation --- most of the -%D time needed to develop this set of macros went into testing -%D different types of visualization --- penalties were mere -%D small blocks with one black half, depending on the sign. -%D This most recent version also gives an indication of the -%D amount of penalty. Penalties can go from less than $-10000$ -%D to over $+10000$, and their behavior is somewhat -%D non-lineair, with some values having special meanings. We -%D therefore decided not to use its value for a lineair -%D indicator. -%D -%D \startbuffer -%D one -%D \penalty +100 -%D two -%D \penalty +100 -%D \penalty -100 -%D three -%D \penalty 0 -%D four -%D \penalty +100 -%D five -%D \stopbuffer -%D -%D \ShowBufferedExample -%D -%D The small sticks at the side of the penalty indicate it -%D size. The next example shows the positive and negative -%D penalties of 0, 1, 10, 100, 1000 and 10000. -%D -%D \startregelcorrectie -%D \hbox -%D {test \ruledhpenalty0 -%D test \ruledhpenalty1 -%D test \ruledhpenalty10 -%D test \ruledhpenalty100 -%D test \ruledhpenalty1000 -%D test \ruledhpenalty10000 -%D test} -%D \stopregelcorrectie -%D -%D \blanko -%D -%D \startregelcorrectie -%D \hbox -%D {test \ruledhpenalty0 -%D test \ruledhpenalty-1 -%D test \ruledhpenalty-10 -%D test \ruledhpenalty-100 -%D test \ruledhpenalty-1000 -%D test \ruledhpenalty-10000 -%D test} -%D \stopregelcorrectie -%D -%D \blanko -%D -%D This way stacked penalties of different severance can be -%D shown in combination. -%D -%D test \ruledhpenalty10 \ruledhpenalty100 -%D test -%D test \ruledhpenalty1000 \ruledhpenalty-1000 -%D test - -\def\setruledpenaltybox#1#2#3#4#5#6% - {\setbox#1=\normalhbox - {\ifnum#2=0 \else - \ifnum#2>0 - \def\sign{+}% - \else - \def\sign{-}% - \fi - \dimen0=\ifnum\sign#2>9999 - 28\else - \ifnum\sign#2>999 - 22\else - \ifnum\sign#2>99 - 16\else - \ifnum\sign#2>9 - 10\else - 4 - \fi\fi\fi\fi \testrulewidth - \ifnum#2<0 - \normalhskip-\dimen0 - \normalhskip-2\testrulewidth - \vrule - \!!width2\testrulewidth - \!!height#3\testrulewidth - \!!depth#4\testrulewidth - \fi - \vrule - \!!width\dimen0 - \!!height#5\testrulewidth - \!!depth#6\testrulewidth - \ifnum#2>0 - \vrule - \!!width2\testrulewidth - \!!height#3\testrulewidth - \!!depth#4\testrulewidth - \fi - \fi}% - \smashbox#1} - -\def\doruledhpenalty% - {\dontinterfere - \dontcomplain - \investigatecount\scratchcounter - \testrulewidth=2\testrulewidth - \boxrulewidth=\testrulewidth - \setbox0=\ruledhbox to 8\testrulewidth - {\ifnegative\else\normalhss\fi - \vrule - \!!depth8\testrulewidth - \!!width\ifzero0\else4\fi\testrulewidth - \ifpositive\else\normalhss\fi}% - \setruledpenaltybox{2}{\scratchcounter}{0}{8}{-3.5}{4.5}% - \normalpenalty\!!tenthousand - \setbox0=\normalhbox - {\normalhskip-4\testrulewidth - \ifnegative - \box2\box0 - \else - \box0\box2 - \fi}% - \smashbox0% - \box0 - \normalpenalty\scratchcounter - \egroup} - -\unexpanded\def\ruledhpenalty% - {\bgroup - \afterassignment\doruledhpenalty - \scratchcounter=} - -%D The size of a vertical penalty is also shown on the -%D horizontal axis. This way there is less interference with -%D the often preceding or following skips and kerns. -%D -%D \startbuffer -%D first line -%D \par \penalty +100 -%D second line -%D \par \penalty +100 -%D \par \penalty -100 -%D third line -%D \par \penalty 0 -%D fourth line -%D \par \penalty +100 -%D fifth line -%D \stopbuffer -%D -%D \ShowBufferedExample - -\def\doruledvpenalty% - {\ifdim\pagegoal=\maxdimen - \else - \nextdepth=\prevdepth - \dontinterfere - \dontcomplain - \investigatecount\scratchcounter - \testrulewidth=2\testrulewidth - \boxrulewidth=\testrulewidth - \setbox0=\ruledhbox - {\vrule - \!!height4\testrulewidth - \!!depth4\testrulewidth - \!!width\!!zeropoint - \vrule - \!!height\ifnegative.5\else4\fi\testrulewidth - \!!depth\ifpositive.5\else4\fi\testrulewidth - \!!width8\testrulewidth}% - \setruledpenaltybox{2}{\scratchcounter}{4}{4}{.5}{.5}% - \setbox0=\normalhbox - {\normalhskip-4\testrulewidth - \ifnegative - \box2\box0 - \else - \box0\box2 - \fi - \normalhss}% - \smashbox0% - \normalpenalty\!!tenthousand - \nointerlineskip - \dp0=\nextdepth % not \prevdepth=\nextdepth - \normalvbox - {\normalvcue{\box0}}% - \fi - \normalpenalty\scratchcounter - \egroup} - -\unexpanded\def\ruledvpenalty% - {\bgroup - \afterassignment\doruledvpenalty - \scratchcounter=} - -\unexpanded\def\ruledpenalty% - {\ifvmode - \expandafter\ruledvpenalty - \else - \expandafter\ruledhpenalty - \fi} - -%D At the cost of some more tokens, a bit more clever -%D implementation would be: -%D -%D \starttypen -%D \unexpanded\def\ruledpenalty% -%D {\csname ruled\ifvmode v\else h\fi penalty\endcsname} -%D \stoptypen - -%D \macros -%D {showfils,dontshowfils, -%D showboxes,dontshowboxes, -%D showskips,dontshowskips, -%D showpenalties,dontshowpenalties} -%D {} -%D -%D For those who want to manipulate the visual cues in detail, -%D we have grouped them. - -\def\showfils% - {\let\hss = \ruledhss - \let\hfil = \ruledhfil - \let\hfill = \ruledhfill - \let\hfilneg = \ruledhfilneg - \let\hfillneg = \ruledhfillneg - \let\vss = \ruledvss - \let\vfil = \ruledvfil - \let\vfill = \ruledvfill - \let\vfilneg = \ruledvfilneg - \let\vfillneg = \ruledvfillneg} - -\def\dontshowfils% - {\let\hss = \normalhss - \let\hfil = \normalhfil - \let\hfill = \normalhfill - \let\hfilneg = \normalhfilneg - \let\hfillneg = \normalhfillneg - \let\vss = \normalvss - \let\vfil = \normalvfil - \let\vfill = \normalvfill - \let\vfilneg = \normalvfilneg - \let\vfillneg = \normalvfillneg} - -\def\showboxes% - {\baselineruletrue - \let\hbox = \ruledhbox - \let\vbox = \ruledvbox - \let\vtop = \ruledvtop - \let\vcenter = \ruledvcenter} - -\def\dontshowboxes% - {\let\hbox = \normalhbox - \let\vbox = \normalvbox - \let\vtop = \normalvtop - \let\vcenter = \normalvcenter} - -\def\showskips% - {\let\hskip = \ruledhskip - \let\vskip = \ruledvskip - \let\kern = \ruledkern - \let\mskip = \ruledmskip - \let\mkern = \ruledmkern - \let\hglue = \ruledhglue - \let\vglue = \ruledvglue} - -\def\dontshowskips% - {\let\hskip = \normalhskip - \let\vskip = \normalvskip - \let\kern = \normalkern - \let\mskip = \normalmskip - \let\mkern = \normalmkern - \let\hglue = \normalhglue - \let\vglue = \normalvglue} - -\def\showpenalties% - {\let\penalty = \ruledpenalty} - -\def\dontshowpenalties% - {\let\penalty = \normalpenalty} - -%D \macros -%D {showingcomposition, -%D showcomposition,dontshowcomposition,} -%D {} -%D -%D All these nice options come together in two macros. The -%D first one turns the options on, the second turnes them off. -%D Both macros only do their job when we are actually showing -%D the composition. -%D -%D \starttypen -%D \showingcompositiontrue -%D \showcomposition -%D \stoptypen -%D -%D Because the output routine can do tricky things, like -%D multiple column typesetting and manipulation of the -%D pagebody, shifting things around and so on, the macro -%D \type{\dontshowcomposition} best can be called when we enter -%D this routine. Too much visual cues just don't make sense. In -%D \CONTEXT\ this has been taken care of. - -\newif\ifshowingcomposition - -\def\showcomposition% - {\ifshowingcomposition - \showfils - \showboxes - \showskips - \showpenalties - \fi} - -\def\dontshowcomposition% - {\ifshowingcomposition - \dontshowfils - \dontshowboxes - \dontshowskips - \dontshowpenalties - \fi} - -%D \macros -%D {showmakeup, -%D defaulttestrulewidth} -%D {} -%D -%D Just to make things even more easy, we have defined: -%D -%D \starttypen -%D \showmakeup -%D \stoptypen -%D -%D For the sake of those who don't (yet) use \CONTEXT\ we -%D preset \type{\defaulttestrulewidth} to the already set -%D value. Otherwise we default to a bodyfontsize related value. -%D -%D \starttypen -%D \def\defaulttestrulewidth{.2pt} -%D \stoptypen -%D -%D Beware, it's a macro not a \DIMENSION. - -\ifx\korpsgrootte\undefined - \edef\defaulttestrulewidth{\the\testrulewidth} -\else - \def\defaulttestrulewidth{.02\korpsgrootte} % still dutch -\fi - -\def\showmakeup% - {\testrulewidth=\defaulttestrulewidth - \showingcompositiontrue - \showcomposition} - -\protect - -%D \ifCONTEXT \let\next=\relax \else \let\next=\endinput -%D The documented source you have been reading was processed -%D using some surrogate makeup. When this file is processed -%D in \CONTEXT, a few more examples show up here, like a local -%D table of contents and a local register. -%D \fi \next - -% %D Lets end with some more advanced examples. When visualized, -% %D the table of contents of the outer level is typeset as: -% %D -% %D {\showmakeup\plaatsinhoud[criterium=vorige]} -% %D -%D Lets end with some more advanced examples. -%D Definitions and enumerations come in many flavors. The -%D next one for instance is defined as: -%D -%D \starttypen -%D \definedescription[test][place=left,hang=3,width=6em] -%D \stoptypen -%D -%D When applied to some text, this would look like: -%D -%D \bgroup -%D \showmakeup -%D \doordefinieren[test][plaats=links,hang=3,breedte=6em] -%D -%D \test{visual\\debugger} I would be very pleased if \TEX\ -%D had two more primitives: \type{\vnop} and \type{\hnop}. Both -%D should act and show up as normal boxes, but stay invisible -%D for \TEX\ when it's doing calculations. The \type{\vnop} -%D for instance should not interact with the internal mechanism -%D responsible for the disappearing skips, kerns and penalties -%D at a pagebreak. As long as we don't have these two boxtypes, -%D visual debugging will never be perfect. -%D -%D \egroup -%D -%D The index to this section looks like: -%D -%D {\stelrefererenin[prefix=dummy]\showmakeup\plaatsindex[criterium=lokaal]} -%D -%D Although not impressive examples or typesetting, both -%D show us how and where things happen. When somehow the last -%D lines in this two column index don't allign, then this is -%D due to some still unknown interference. - -\endinput +%D \module
+%D [ file=supp-vis,
+%D version=1996.10.21,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Visualization,
+%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.
+
+%D \gdef\ShowBufferedExample% private typeseting macro
+%D {\startregelcorrectie
+%D \bgroup
+%D \steltypenin[marge=0pt,optie=kleur]
+%D \showmakeup
+%D \centeredvcuetrue
+%D \dontinterfere
+%D \baselinerulefalse
+%D \normalvbox
+%D {\normalhbox to \hsize
+%D {$\hsize=.5\hsize
+%D \advance\hsize by -.5em
+%D \normalvcenter{\vbox{\haalbuffer}}\normalhss
+%D \normalvcenter{\vbox{\dontshowcomposition\typebuffer}}$}}
+%D \egroup
+%D \stopregelcorrectie}
+%D
+%D \gdef\ShowBufferedExampleBox% private typeseting macro
+%D {\startregelcorrectie
+%D \bgroup
+%D \steltypenin[marge=0pt,optie=kleur]
+%D \showmakeup
+%D \centeredvcuetrue
+%D \dontinterfere
+%D \baselinerulefalse
+%D \normalvbox
+%D {\normalhbox to \hsize
+%D {$\hsize=.5\hsize
+%D \advance\hsize by -.5em
+%D \normalvcenter{\baselineruletrue\vbox{\haalbuffer}}\normalhss
+%D \normalvcenter{\vbox{\dontshowcomposition\typebuffer}}$}}
+%D \egroup
+%D \stopregelcorrectie}
+
+%D Although an integral part of \CONTEXT, this module is one
+%D of the support modules. Its stand alone character permits
+%D use in \PLAIN\ \TEX\ or \TEX\ based macropackages.
+%D \ifCONTEXT \else If in some examples the verbatim listings
+%D don't show up nice, this is due to processing by a system
+%D that does not support buffering. In \CONTEXT\ we show the
+%D commands in the margin, use bit more advanced way of
+%D numbering, and typeset the source in \TEX nicolored
+%D verbatim. Sorry for this inconvenience.\fi
+
+%D This module is still in development. Depending on my
+%D personal need and those of whoever uses it, the macros will
+%D be improved in terms of visualization, efficiency and
+%D compatibility.
+
+\ifx \undefined \writestatus \input supp-mis.tex \fi
+
+%D One of the strong points of \TEX\ is abstraction of textual
+%D input. When macros are defined well and do what we
+%D want them to do, we will seldom need the tools present in
+%D What You See Is What You Get systems. For instance, when
+%D entering text we don't need rulers, because no manual
+%D shifting and/or alignment of text is needed. On the other
+%D hand, when we are designing macros or specifying layout
+%D elements, some insight in \TEX's advanced spacing, kerning,
+%D filling, boxing and punishment abilities will be handy.
+%D That's why we've implemented a mechanism that shows some of
+%D the inner secrets of \TEX.
+
+\writestatus{loading}{Context Support Macros / Visualization}
+
+%D In this module we are going to redefine some \TEX\
+%D primitives and \PLAIN\ macro's. Their original meaning is
+%D saved in macros with corresponding names, preceded by
+%D \type{normal}. These original macros are (1)~used to
+%D temporary restore the old values when needed and
+%D (2)~used to prevent recursive calls in the macros that
+%D replace them.
+
+\unprotect
+
+%D \macros
+%D {dontinterfere}
+%D {}
+%D
+%D Indentation, left and/or right skips, redefinition of
+%D \type{\par} and assignments to \type{\everypar} can lead to
+%D unwanted results. We can therefore turn all those things
+%D off with \type{\dontinterfere}.
+
+\def\dontinterfere%
+ {\everypar = {}%
+ \let\par = \endgraf
+ \parindent = \!!zeropoint
+ \parskip = \!!zeropoint
+ \leftskip = \!!zeropoint
+ \rightskip = \!!zeropoint
+ \relax}
+
+%D \macros
+%D {dontcomplain}
+%D {}
+%D
+%D In this module we do a lot of box manipulations. Because we
+%D don't want to be confronted with to many over- and underfull
+%D messages we introduce \type{\dontcomplain}.
+
+\def\dontcomplain%
+ {\hbadness = \!!tenthousand
+ \hfuzz = \maxdimen
+ \vbadness = \!!tenthousand
+ \vfuzz = \maxdimen}
+
+%D \macros
+%D {normaloffinterlineskip}
+%D {}
+%D
+%D The next hack is needed because in \CONTEXT\ we redefine
+%D \type{\offinterlineskip}.
+
+\ifx\undefined\normaloffinterlineskip
+ \let\normaloffinterlineskip=\offinterlineskip
+\fi
+
+%D \macros
+%D {normalhbox,
+%D normalvbox,normalvtop}
+%D {}
+%D
+%D There are three types of boxes, one horizontal and two
+%D vertical in nature. As we will see later on, all three types
+%D are to be handled according to their orientation and
+%D baseline behavior. Especially \type{\vtop}'s need our
+%D special attention.
+
+\let\normalhbox = \hbox
+\let\normalvbox = \vbox
+\let\normalvtop = \vtop
+\let\normalvcenter = \vcenter
+
+%D \macros
+%D {normalhskip,
+%D normalvskip}
+%D {}
+%D
+%D Next come the flexible skips, which come in two flavors
+%D too. Like boxes these are handled with \TEX\ primitives.
+
+\let\normalhskip = \hskip
+\let\normalvskip = \vskip
+
+%D \macros
+%D {normalpenalty,
+%D normalkern}
+%D {}
+%D
+%D Both penalties and kerns are taken care of by mode sensitive
+%D primitives. This means that when making them visible, we
+%D have to take the current mode into account.
+
+\let\normalpenalty = \penalty
+\let\normalkern = \kern
+
+%D \macros
+%D {normalhglue,
+%D normalvglue}
+%D {}
+%D
+%D Glues on the other hand are macro's defined in \PLAIN\ \TEX.
+%D As we will see, their definitions make the implementation of
+%D their visible counterparts a bit more \TeX{}nical.
+
+\let\normalhglue = \hglue
+\let\normalvglue = \vglue
+
+%D \macros
+%D {normalmkern,
+%D normalmskip}
+%D {}
+%D
+%D Math mode has its own spacing primitives, preceded by
+%D \type{m}. Due to the relation with the current font and the
+%D way math is typeset, their unit \type{mu} is not compatible
+%D with other dimensions. As a result, the visual appearance
+%D of these primitives is kept primitive too.
+
+\let\normalmkern = \mkern
+\let\normalmskip = \mskip
+
+%D \macros
+%D {hfilneg,
+%D vfilneg}
+%D {}
+%D
+%D Fills can be made visible quite easy. We only need some
+%D additional negation macros. Because \PLAIN\ \TEX\ only
+%D offers \type{\hfilneg} and \type{\vfilneg}, we define our
+%D own alternative double \type{ll}'ed ones.
+
+\def\hfillneg%
+ {\normalhskip\!!zeropoint \!!plus-1fill\relax}
+
+\def\vfillneg%
+ {\normalvskip\!!zeropoint \!!plus-1fill\relax}
+
+%D \macros
+%D {normalhss,normalhfil,normalhfill,
+%D normalvss,normalvfil,normalvfill}
+%D {}
+%D
+%D The positive stretch primitives are used independant and in
+%D combination with \type{\leaders}.
+
+\let\normalhss = \hss
+\let\normalhfil = \hfil
+\let\normalhfill = \hfill
+\let\normalvss = \vss
+\let\normalvfil = \vfil
+\let\normalvfill = \vfill
+
+%D \macros
+%D {normalhfilneg,normalhfillneg,
+%D normalvfilneg,normalvfillneg}
+%D {}
+%D
+%D Keep in mind that both \type{\hfillneg} and \type{\vfillneg}
+%D are not part of \PLAIN\ \TEX\ and therefore not documented
+%D in standard \TEX\ documentation. They can nevertheless be
+%D used at will.
+
+\let\normalhfilneg = \hfilneg
+\let\normalhfillneg = \hfillneg
+\let\normalvfilneg = \vfilneg
+\let\normalvfillneg = \vfillneg
+
+%D Visualization is not always wanted. Instead of turning this
+%D option off in those (unpredictable) situations, we just
+%D redefine a few \PLAIN\ macros.
+
+\def\rlap#1{\normalhbox to \!!zeropoint{#1\normalhss}}
+\def\llap#1{\normalhbox to \!!zeropoint{\normalhss#1}}
+
+\def~{\normalpenalty\!!tenthousand\ }
+
+%D \macros
+%D {makeruledbox}
+%D {}
+%D
+%D Ruled boxes can be typeset is many ways. Here we present
+%D just one alternative. This implementation may be a little
+%D complicated, but it supports all three kind of boxes. The
+%D next command expects a \BOX\ specification, like:
+%D
+%D \starttypen
+%D \makeruledbox0
+%D \stoptypen
+
+%D \macros
+%D {baselinerule,baselinefill}
+%D {}
+%D
+%D We can make the baseline of a box visible, both dashed and
+%D as a rule. The line is drawn on top of the baseline. All
+%D we have to say is:
+%D
+%D \starttypen
+%D \baselineruletrue
+%D \baselinefilltrue
+%D \stoptypen
+%D
+%D At the cost of some overhead these alternatives are
+%D implemented using \type{\if}'s:
+
+\newif\ifbaselinerule \baselineruletrue
+\newif\ifbaselinefill \baselinefillfalse
+
+%D \macros
+%D {iftoprule,ifbottomrule,ifleftrule,ifrightrule}
+%D {}
+%D
+%D Rules can be turned on and off, but by default we have:
+%D
+%D \starttypen
+%D \topruletrue
+%D \bottomruletrue
+%D \leftruletrue
+%D \rightruletrue
+%D \stoptypen
+%D
+%D As we see below:
+
+\newif\iftoprule \topruletrue
+\newif\ifbottomrule \bottomruletrue
+\newif\ifleftrule \leftruletrue
+\newif\ifrightrule \rightruletrue
+
+%D \macros
+%D {boxrulewidth}
+%D {}
+%D
+%D The width in the surrounding rules can be specified by
+%D assigning an apropriate value to the dimension used. This
+%D module defaults the width to:
+%D
+%D \starttypen
+%D \boxrulewidth=.2pt
+%D \stoptypen
+%D
+%D Although we are already low on \DIMENSIONS\ it's best to
+%D spend one here, mainly because it enables easy manipulation,
+%D like multiplication by a given factor.
+
+\newdimen\boxrulewidth \boxrulewidth=.2pt
+
+%D The core macro \type{\makeruledbox} looks a bit hefty. The
+%D manipulation at the end is needed because we want to
+%D preserve both the mode and the baseline. This means that
+%D \type{\vtop}'s and \type{\vbox}'es behave the way we expect
+%D them to do.
+%D
+%D \startregelcorrectie
+%D \hbox
+%D {\ruledhbox to 5em{\strut test\normalhss}\hskip1em
+%D \ruledvbox{\hsize 5em\strut test \par test\strut}\hskip1em
+%D \ruledvtop{\hsize 5em\strut test \par test\strut}}
+%D \stopregelcorrectie
+%D
+%D The \type{\cleaders} part of the macro is responsible for
+%D the visual baseline. The \type{\normalhfill} belongs to this
+%D primitive too. By storing and restoring the height and depth
+%D of box \type{#1}, we preserve the mode.
+
+\def\makeruledbox#1%
+ {\edef\ruledheight{\the\ht#1}%
+ \edef\ruleddepth {\the\dp#1}%
+ \edef\ruledwidth {\the\wd#1}%
+ \setbox\scratchbox=\normalvbox
+ {\dontcomplain
+ \normaloffinterlineskip
+ \hrule
+ \!!height\boxrulewidth
+ \iftoprule\else\!!width\!!zeropoint\fi
+ \normalvskip-\boxrulewidth
+ \normalhbox to \ruledwidth
+ {\vrule
+ \!!height\ruledheight
+ \!!depth\ruleddepth
+ \!!width\ifleftrule\else0\fi\boxrulewidth
+ \ifdim\ruledheight>\!!zeropoint \else \baselinerulefalse \fi
+ \ifdim\ruleddepth>\!!zeropoint \else \baselinerulefalse \fi
+ \ifbaselinerule
+ \ifdim\ruledwidth<20\boxrulewidth
+ \baselinefilltrue
+ \fi
+ \cleaders
+ \ifbaselinefill
+ \hrule
+ \!!height\boxrulewidth
+ \else
+ \normalhbox
+ {\normalhskip2.5\boxrulewidth
+ \vrule
+ \!!height\boxrulewidth
+ \!!width5\boxrulewidth
+ \normalhskip2.5\boxrulewidth}%
+ \fi
+ \fi
+ \normalhfill
+ \vrule
+ \!!width\ifrightrule\else0\fi\boxrulewidth}%
+ \normalvskip-\boxrulewidth
+ \hrule
+ \!!height\boxrulewidth
+ \ifbottomrule\else\!!width\!!zeropoint\fi}%
+ \wd#1=\!!zeropoint
+ \setbox#1=\ifhbox#1\normalhbox\else\normalvbox\fi
+ {\normalhbox{\box#1\lower\ruleddepth\box\scratchbox}}%
+ \ht#1=\ruledheight
+ \wd#1=\ruledwidth
+ \dp#1=\ruleddepth}
+
+%D Just in case one didn't notice: the rules are in fact layed
+%D over the box. This way the contents of a box cannot
+%D visually interfere with the rules around (upon) it. A more
+%D advanced version of ruled boxes can be found in one of the
+%D core modules of \CONTEXT. There we take offsets, color,
+%D rounded corners, backgrounds and alignment into account too.
+
+%D \macros
+%D {ruledhbox,
+%D ruledvbox,ruledvtop,
+%D ruledvcenter}
+%D {}
+%D
+%D These macro's can be used instead of \type{\hbox},
+%D \type{\vbox}, \type{\vtop} and, when in math mode,
+%D \type{\vcenter}. They just do what their names state. Using
+%D an auxiliary macro would save us a few words of memory, but
+%D it would make their appearance even more obscure.
+%D
+%D \startbuffer
+%D \hbox
+%D {\strut
+%D one
+%D two
+%D \hbox{three}
+%D four
+%D five}
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledhbox%
+ {\normalhbox\bgroup
+ \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}%
+ \normalhbox}
+
+%D \startbuffer
+%D \vbox
+%D {\strut
+%D first line \par
+%D second line \par
+%D third line \par
+%D fourth line \par
+%D fifth line
+%D \strut }
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledvbox%
+ {\normalvbox\bgroup
+ \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}%
+ \normalvbox}
+
+%D \startbuffer
+%D \vtop
+%D {\strut
+%D first line \par
+%D second line \par
+%D third line \par
+%D fourth line \par
+%D fifth line
+%D \strut }
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledvtop%
+ {\normalvtop\bgroup
+ \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}%
+ \normalvtop}
+
+%D \startbuffer
+%D \hbox
+%D {$\vcenter{\hsize.2\hsize
+%D alfa \par beta}$
+%D $\vcenter to 3cm{\hsize.2\hsize
+%D alfa \par beta \par gamma}$
+%D $\vcenter{\hsize.2\hsize
+%D alfa \par beta}$}
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledvcenter%
+ {\normalvbox\bgroup
+ \dontinterfere
+ \dowithnextbox
+ {\scratchdimen=.5\ht\nextbox
+ \advance\scratchdimen by .5\dp\nextbox
+ \ht\nextbox=\scratchdimen
+ \dp\nextbox=\scratchdimen
+ \ruledhbox{\box\nextbox}%
+ \egroup}%
+ \normalvbox}
+
+%D \macros
+%D {ruledbox,
+%D setruledbox}
+%D {}
+%D
+%D Of the next two macros the first can be used to precede a
+%D box of ones own choice. One can for instance prefix boxes
+%D with \type{\ruledbox} and afterwards --- when the macro
+%D satisfy the needs --- let it to \type{\relax}.
+%D
+%D \starttypen
+%D \ruledbox\hbox{What rules do you mean?}
+%D \stoptypen
+%D
+%D The macro \type{\setruledbox} can be used to directly
+%D rule a box.
+%D
+%D \starttypen
+%D \setruledbox12=\hbox{Who's talking about rules here?}
+%D \stoptypen
+%D
+%D At the cost of some extra macros we can implement a
+%D variant that does not need the~\type{=}, but we stick to:
+
+\unexpanded\def\ruledbox%
+ {\dowithnextbox{\makeruledbox\nextbox\box\nextbox}}
+
+\def\setruledbox#1=%
+ {\dowithnextbox{\makeruledbox\nextbox\setbox#1=\nextbox}}
+
+%D \macros
+%D {investigateskip,
+%D investigatecount,
+%D investigatemuskip}
+%D {}
+%D
+%D Before we meet the visualizing macro's, we first implement
+%D ourselves some handy utility ones. Just for the sake of
+%D efficiency and readability, we introduce some status
+%D variables, that tell us a bit more about the registers we
+%D use:
+%D
+%D \starttypen
+%D \ifflexible
+%D \ifzero
+%D \ifnegative
+%D \ifpositive
+%D \stoptypen
+%D
+%D These status variables are set when we call for one of the
+%D investigation macros, e.g.
+%D
+%D \starttypen
+%D \investigateskip\scratchskip
+%D \stoptypen
+%D
+%D We use some dirty trick to check stretchability of \SKIPS.
+%D Users of these macros are invited to study their exact
+%D behavior first. The positive and negative states both
+%D include zero and are in fact non-negative ($\geq0$) and
+%D non-positive ($\leq0$) .
+
+\newif\ifflexible
+\newif\ifzero
+\newif\ifnegative
+\newif\ifpositive
+
+\def\investigateskip#1%
+ {\relax
+ \scratchdimen=#1\relax
+ \edef\!!stringa{\the\scratchdimen}%
+ \edef\!!stringb{\the#1}%
+ \ifx\!!stringa\!!stringb \flexiblefalse \else \flexibletrue \fi
+ \ifdim#1=\!!zeropoint\relax
+ \zerotrue \else
+ \zerofalse \fi
+ \ifdim#1<\!!zeropoint\relax
+ \positivefalse \else
+ \positivetrue \fi
+ \ifdim#1>\!!zeropoint\relax
+ \negativefalse \else
+ \negativetrue \fi}
+
+\def\investigatecount#1%
+ {\relax
+ \flexiblefalse
+ \ifnum#1=0
+ \zerotrue \else
+ \zerofalse \fi
+ \ifnum#1<0
+ \positivefalse \else
+ \positivetrue \fi
+ \ifnum#1>0
+ \negativefalse \else
+ \negativetrue \fi}
+
+\def\investigatemuskip#1%
+ {\relax
+ \edef\!!stringa{\the\scratchmuskip}%
+ \edef\!!stringb{0mu}%
+ \def\!!stringc##1##2\\{##1}%
+ \expandafter\edef\expandafter\!!stringc\expandafter
+ {\expandafter\!!stringc\!!stringa\\}%
+ \edef\!!stringd{-}%
+ \flexiblefalse
+ \ifx\!!stringa\!!stringb
+ \zerotrue
+ \negativefalse
+ \positivefalse
+ \else
+ \zerofalse
+ \ifx\!!stringc\!!stringd
+ \positivefalse
+ \negativetrue
+ \else
+ \positivetrue
+ \negativefalse
+ \fi
+ \fi}
+
+%D Now the neccessary utility macros are defined, we can make a
+%D start with the visualizing ones. The implementation of these
+%D macros is a compromise between readability, efficiency of
+%D coding and processing speed. Sometimes we do in steps what
+%D could have been done in combination, sometimes we use a few
+%D boxes more or less then actually needed, and more than once
+%D one can find the same piece of rule drawing code twice.
+
+%D \macros
+%D {ifcenteredvcue,normalvcue}
+%D {}
+%D
+%D Depending on the context, one can force visual vertical cues
+%D being centered along \type{\hsize} or being put at the
+%D current position. Although centering often looks better,
+%D we've chosen the second alternative as default. The main
+%D reason for doing so is that often when we don't set the
+%D \type{\hsize} ourselves, \TEX\ takes the value of the
+%D surrounding box. As a result the visual cues can migrate
+%D outside the current context.
+%D
+%D This behavior is accomplished by a small but effective
+%D auxiliary macro, which behavior can be influenced by the
+%D boolean \type{\centeredvcue}. By saying
+%D
+%D \starttypen
+%D \centeredvcuetrue
+%D \stoptypen
+%D
+%D one turns centering on. As said, we turn it off.
+
+\newif\ifcenteredvcue \centeredvcuefalse
+
+\def\normalvcue#1%
+ {\normalhbox \ifcenteredvcue to \hsize \fi {\normalhss#1\normalhss}}
+
+%D We could have used the more robust version
+%D
+%D \starttypen
+%D \def\normalvcue%
+%D {\normalhbox \ifcenteredvcue to \hsize \fi
+%D \bgroup\bgroup\normalhss
+%D \aftergroup\normalhss\aftergroup\egroup
+%D \let\next=}
+%D \stoptypen
+%D
+%D or the probably best one:
+%D
+%D \starttypen
+%D \def\normalvcue%
+%D {\hbox \ifcenteredvcue to \hsize
+%D \bgroup\bgroup\normalhss
+%D \aftergroup\normalhss\aftergroup\egroup
+%D \else
+%D \bgroup
+%D \fi
+%D \let\next=}
+%D \stoptypen
+%D
+%D Because we don't have to preserve \CATCODES\ and only use
+%D small arguments, we stick to the first alternative.
+
+%D \macros
+%D {testrulewidth}
+%D {}
+%D
+%D We build our visual cues out of rules. At the cost of a much
+%D bigger \DVI\ file, this is to be prefered over using
+%D characters (1)~because we cannot be sure of their
+%D availability and (2)~because their dimensions are fixed.
+%D
+%D As with ruled boxes, we use a \DIMENSION\ to specify the
+%D width of the ruled elements. This dimension defaults to:
+%D
+%D \starttypen
+%D \testrulewidth=\boxrulewidth
+%D \stoptypen
+%D
+%D Because we prefer whole numbers for specifying the
+%D dimensions, we often use even multiples of
+%D \type{\testrulewidth}.
+
+%D \macros
+%D {visiblestretch}
+%D {}
+%D
+%D A second variable is introduced because of the stretch
+%D components of \SKIPS. At the cost of some accuracy we can
+%D make this stretch visible.
+%D
+%D \starttypen
+%D \visiblestretchtrue
+%D \stoptypen
+
+\newdimen\testrulewidth \testrulewidth=\boxrulewidth
+\newif\ifvisiblestretch \visiblestretchfalse
+
+%D \macros
+%D {ruledhss,
+%D ruledhfil,ruledhfilneg,
+%D ruledhfill,ruledhfillneg}
+%D {}
+%D
+%D We start with the easiest part, the fills. The scheme we
+%D follow is {\em visual filling -- going back -- normal
+%D filling}. Visualizing is implemented using \type{\cleaders}.
+%D Because the \BOX\ that follows this command is constructed
+%D only once, the \type{\copy} is not really a prerequisite. We
+%D prefer using a \type{\normalhbox} here instead of a
+%D \type{\hbox}.
+
+\def\setvisiblehfilbox#1\to#2#3#4%
+ {\setbox#1=\normalhbox
+ {\vrule
+ \!!width#2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth#4\testrulewidth}%
+ \smashbox#1}
+
+\def\doruledhfiller#1#2#3#4%
+ {#1#2%
+ \bgroup
+ \dontinterfere
+ \dontcomplain
+ \setvisiblehfilbox0\to{4}{#3}{#4}%
+ \setvisiblehfilbox2\to422%
+ \copy0\copy2
+ \bgroup
+ \setvisiblehfilbox0\to422%
+ \cleaders
+ \normalhbox to 12\testrulewidth
+ {\normalhss\copy0\normalhss}%
+ #1%
+ \egroup
+ \setbox0=\normalhbox
+ {\normalhskip-4\testrulewidth\copy0\copy2}%
+ \smashbox0
+ \box0
+ \egroup}
+
+%D The horizontal fillers differ in their boundary
+%D visualization. Watch the small dots. Fillers can be
+%D combined within reasonable margins.
+%D
+%D \startregelcorrectie
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hss}\ruledhss test}
+%D \stopregelcorrectie
+%D
+%D \startregelcorrectie
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfil}\ruledhfil test}
+%D \stopregelcorrectie
+%D
+%D \startregelcorrectie
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfill}\ruledhfill test}
+%D \stopregelcorrectie
+%D
+%D \startregelcorrectie
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut
+%D \type{\hfil}\type{\hfil}\ruledhfil\ruledhfil
+%D test%
+%D \ruledhfil\type{\hfil}}
+%D \stopregelcorrectie
+%D
+%D The negative counterparts are visualizes, but seldom
+%D become visible, apart from their boundaries.
+%D
+%D \startregelcorrectie
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfilneg}\ruledhfilneg test}
+%D \stopregelcorrectie
+%D
+%D \startregelcorrectie
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfillneg}\ruledhfillneg test}
+%D \stopregelcorrectie
+%D
+%D Although leaders are used for visualizing, they are
+%D visualized themselves correctly as the next example shows.
+%D
+%D \startregelcorrectie
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\cleaders\normalhbox to 2em{\normalhss$\circ$\normalhss}\ruledhfill}
+%D \stopregelcorrectie
+%D
+%D All five substitutions use the same auxiliary macro. Watch
+%D the positive first -- negative next approach.
+
+\unexpanded\def\ruledhss%
+ {\doruledhfiller\normalhss\normalhfilneg{0}{0}}
+
+\unexpanded\def\ruledhfil%
+ {\doruledhfiller\normalhfil\normalhfilneg{10}{-6}}
+
+\unexpanded\def\ruledhfill%
+ {\doruledhfiller\normalhfill\normalhfillneg{18}{-14}}
+
+\unexpanded\def\ruledhfilneg%
+ {\doruledhfiller\normalhfilneg\normalhfil{-6}{10}}
+
+\unexpanded\def\ruledhfillneg%
+ {\doruledhfiller\normalhfillneg\normalhfill{-14}{18}}
+
+%D \macros
+%D {ruledvss,
+%D ruledvfil,ruledvfilneg,
+%D ruledvfill,ruledvfillneg}
+%D {}
+%D
+%D The vertical mode commands adopt the same visualization
+%D scheme, but are implemented in a slightly different way.
+
+\def\setvisiblevfilbox#1\to#2#3#4%
+ {\setbox#1=\normalhbox
+ {\vrule
+ \!!width#2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth#4\testrulewidth}%
+ \smashbox#1}%
+
+\def\doruledvfiller#1#2#3%
+ {#1#2%
+ \bgroup
+ \dontinterfere
+ \dontcomplain
+ \normaloffinterlineskip
+ \setvisiblevfilbox0\to422%
+ \setbox2=\normalvcue
+ {\normalhskip -#3\testrulewidth\copy0}%
+ \smashbox2
+ \copy2
+ \bgroup
+ \setbox2=\normalvcue
+ {\normalhskip -2\testrulewidth\copy0}%
+ \smashbox2
+ \copy2
+ \cleaders
+ \normalvbox to 12\testrulewidth
+ {\normalvss\copy2\normalvss}%
+ #1%
+ \setbox2=\normalvbox
+ {\normalvskip-2\testrulewidth\copy2}%
+ \smashbox2
+ \box2
+ \egroup
+ \box2
+ \egroup}
+
+%D Because they act the same as their horizontal counterparts
+%D we only show a few examples.
+%D
+%D \startregelcorrectie
+%D \hbox to \hsize
+%D {\dontinterfere
+%D \baselinerulefalse
+%D \centeredvcuetrue
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vss}\ruledvss last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfil}\ruledvfil last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfill}\ruledvfill last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfilneg}\ruledvfilneg last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfillneg}\ruledvfillneg last line}}
+%D \stopregelcorrectie
+%D
+%D Keep in mind that \type{\vfillneg} is not part of \PLAIN\
+%D \TEX, but are mimmicked by a macro.
+
+\unexpanded\def\ruledvss%
+ {\doruledvfiller\normalvss\normalvfilneg{2}}
+
+\unexpanded\def\ruledvfil%
+ {\doruledvfiller\normalvfil\normalvfilneg{-4}}
+
+\unexpanded\def\ruledvfill%
+ {\doruledvfiller\normalvfill\normalvfillneg{-12}}
+
+\unexpanded\def\ruledvfilneg%
+ {\doruledvfiller\normalvfilneg\normalvfil{8}}
+
+\unexpanded\def\ruledvfillneg%
+ {\doruledvfiller\normalvfillneg\normalvfill{16}}
+
+%D \macros
+%D {ruledhskip}
+%D {}
+%D
+%D Skips differ from kerns in two important aspects:
+%D
+%D \startopsomming[opelkaar]
+%D \som line and pagebreaks are allowed at a skip
+%D \som skips can have a positive and/or negative
+%D stretchcomponent
+%D \stopopsomming
+%D
+%D Stated a bit different: kerns are fixed skips at which no
+%D line or pagebreak can occur. Because skips have a more open
+%D character, they are visualized in a open way.
+%D
+%D \startbuffer
+%D one
+%D \hskip +30pt plus 5pt
+%D two
+%D \hskip +30pt
+%D \hskip -10pt plus 5pt
+%D three
+%D \hskip 0pt
+%D four
+%D \hskip +30pt
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D When skips have a stretch component, this is visualized by
+%D means of a dashed line. Positive skips are on top of the
+%D baseline, negative ones are below it. This way we can show
+%D the combined results. An alternative visualization of
+%D stretch could be drawing the mid line over a length of the
+%D stretch, in positive or negative direction.
+
+\def\doruledhskip%
+ {\relax
+ \dontinterfere
+ \dontcomplain
+ \investigateskip\scratchskip
+ \ifzero
+ \setbox0=\normalhbox
+ {\normalhskip-\testrulewidth
+ \vrule
+ \!!width4\testrulewidth
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth}%
+ \else
+ \setbox0=\normalhbox to \ifnegative-\fi\scratchskip
+ {\vrule
+ \!!width2\testrulewidth
+ \ifnegative\!!depth\else\!!height\fi16\testrulewidth
+ \cleaders
+ \hrule
+ \ifnegative
+ \!!depth2\testrulewidth
+ \!!height\!!zeropoint
+ \else
+ \!!height2\testrulewidth
+ \!!depth\!!zeropoint
+ \fi
+ \normalhfill
+ \ifflexible
+ \normalhskip\ifnegative\else-\fi\scratchskip
+ \normalhskip2\testrulewidth
+ \cleaders
+ \normalhbox
+ {\normalhskip 2\testrulewidth
+ \vrule
+ \!!width2\testrulewidth
+ \!!height\ifnegative-7\else9\fi\testrulewidth
+ \!!depth\ifnegative9\else-7\fi\testrulewidth
+ \normalhskip 2\testrulewidth}%
+ \normalhfill
+ \fi
+ \vrule
+ \!!width2\testrulewidth
+ \ifnegative\!!depth\else\!!height\fi16\testrulewidth}%
+ \setbox0=\normalhbox
+ {\ifnegative\else\normalhskip-\scratchskip\fi
+ \box0}%
+ \fi
+ \smashbox0%
+ \ifvisiblestretch \else
+ \flexiblefalse
+ \fi
+ \ifflexible
+ % breaks ok but small displacements can occur
+ \skip2=\scratchskip
+ \advance\skip2 by -1\scratchskip
+ \divide\skip2 by 2
+ \advance\scratchskip by -\skip2
+ \normalhskip\scratchskip
+ \normalpenalty\!!tenthousand
+ \box0
+ \normalhskip\skip2
+ \else
+ \normalhskip\scratchskip
+ \box0
+ \fi
+ \egroup}
+
+\unexpanded\def\ruledhskip%
+ {\bgroup
+ \afterassignment\doruledhskip
+ \scratchskip=}
+
+%D The visual skip is located at a feasible point. Normally
+%D this does not interfere with the normaltypesetting process.
+%D The next examples show (1)~the default behavior, (2)~the
+%D (not entirely correct) distributed stretch and (3)~the way
+%D the text is typeset without cues.
+%D
+%D \startbuffer
+%D \dorecurse
+%D {15}
+%D {test\hskip1em plus .5em minus .5em
+%D test\hskip2em
+%D test}
+%D \stopbuffer
+%D
+%D \startregelcorrectie
+%D \showmakeup
+%D \haalbuffer
+%D \stopregelcorrectie
+%D
+%D \startregelcorrectie
+%D \showmakeup
+%D \visiblestretchtrue
+%D \haalbuffer
+%D \stopregelcorrectie
+%D
+%D \startregelcorrectie
+%D \haalbuffer
+%D \stopregelcorrectie
+
+%D \macros
+%D {ruledvskip}
+%D {}
+%D
+%D We are less fortunate when implementing the vertical skips.
+%D This is a direct result of interference between the boxes that
+%D visualize the skip and skip removal at a pagebreak. Normally
+%D skips disappear at the top of a page, but not of course when
+%D visualized in a \type{\vbox}. A quite perfect simulation
+%D could have been built if we would have had available two
+%D more primitives: \type{\hnop} and \type{\vnop}. These new
+%D primitives could stand for boxes that are visible but are
+%D not taken into account in any way. They are there for us,
+%D but not for \TEX.
+%D
+%D \startbuffer
+%D first line
+%D \vskip +30pt plus 5pt
+%D second line
+%D \vskip +30pt
+%D \vskip -10pt plus 5pt
+%D third line
+%D \par
+%D fourth line
+%D \vskip +30pt
+%D fifth line
+%D \vskip 0pt
+%D sixth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D We have to postpone \type{\prevdepth}. Although this
+%D precaution probably is not completely waterproof, it works
+%D quite well.
+
+\def\dodoruledvskip%
+ {\nextdepth=\prevdepth
+ \dontinterfere
+ \dontcomplain
+ \normaloffinterlineskip
+ \investigateskip\scratchskip
+ \ifzero
+ \setbox0=\normalvcue
+ {\vrule
+ \!!width32\testrulewidth
+ \!!height2\testrulewidth
+ \!!depth2\testrulewidth}%
+ \else
+ \setbox0=\normalvbox to \ifnegative-\fi\scratchskip
+ {\hrule
+ \!!width16\testrulewidth
+ \!!height2\testrulewidth
+ \ifflexible
+ \cleaders
+ \normalhbox to 16\testrulewidth
+ {\normalhss
+ \normalvbox
+ {\normalvskip 2\testrulewidth
+ \hrule
+ \!!width2\testrulewidth
+ \!!height2\testrulewidth
+ \normalvskip 2\testrulewidth}%
+ \normalhss}%
+ \normalvfill
+ \else
+ \normalvfill
+ \fi
+ \hrule
+ \!!width16\testrulewidth
+ \!!height2\testrulewidth}%
+ \setbox2=\normalvbox to \ht0
+ {\hrule
+ \!!width2\testrulewidth
+ \!!height\ht0}%
+ \ifnegative
+ \ht0=\!!zeropoint
+ \setbox0=\normalhbox
+ {\normalhskip2\testrulewidth % will be improved
+ \normalhskip-\wd0\box0}%
+ \fi
+ \smashbox0%
+ \smashbox2%
+ \setbox0=\normalvcue
+ {\box2\box0}%
+ \setbox0=\normalvbox
+ {\ifnegative\normalvskip\scratchskip\fi\box0}%
+ \smashbox0%
+ \fi
+ \ifvisiblestretch
+ \ifflexible
+ \skip2=\scratchskip
+ \advance\skip2 by -1\scratchskip
+ \divide\skip2 by 2
+ \advance\scratchskip by -\skip2
+ \normalvskip\skip2
+ \fi
+ \fi
+ \normalpenalty\!!tenthousand
+ \box0
+ \prevdepth=\nextdepth % not \dp0=\nextdepth
+ \normalvskip\scratchskip}
+
+%D We try to avoid interfering at the top of a page. Of course
+%D we only do so when we are in the main vertical list.
+
+\def\doruledvskip%
+ {\endgraf % \par
+ \ifdim\pagegoal=\maxdimen
+ \ifinner
+ \dodoruledvskip
+ \fi
+ \else
+ \dodoruledvskip
+ \fi
+ \egroup}
+
+\unexpanded\def\ruledvskip%
+ {\bgroup
+ \afterassignment\doruledvskip
+ \scratchskip=}
+
+%D \macros
+%D {ruledkern}
+%D {}
+%D
+%D The macros that implement the kerns are a bit more
+%D complicated than needed, because they also serve the
+%D visualization of glue, our \PLAIN\ defined kerns with
+%D stretch or shrink. We've implemented both horizontal and
+%D vertical kerns as ruled boxes.
+%D
+%D \startbuffer
+%D one
+%D \kern +30pt
+%D two
+%D \kern +30pt
+%D \kern -10pt
+%D three
+%D \kern 0pt
+%D four
+%D \kern +30pt
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D Positive and negative kerns are placed on top or below the
+%D baseline, so we are able to track their added result. We
+%D didn't mention spacings of 0~pt yet. Zero values are
+%D visualized a bit different, because we want to see them
+%D anyhow.
+
+\def\doruledhkern%
+ {\dontinterfere
+ \dontcomplain
+ \baselinerulefalse
+ \investigateskip\scratchskip
+ \boxrulewidth=2\testrulewidth
+ \ifzero
+ \setbox0=\ruledhbox to 8\testrulewidth
+ {\vrule
+ \!!width\!!zeropoint
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth}%
+ \setbox0=\normalhbox
+ {\normalhskip-4\testrulewidth\box0}%
+ \else
+ \setbox0=\ruledhbox to \ifnegative-\fi\scratchskip
+ {\vrule
+ \!!width\!!zeropoint
+ \ifnegative\!!depth\else\!!height\fi16\testrulewidth
+ \ifflexible
+ \normalhskip2\testrulewidth
+ \cleaders
+ \normalhbox
+ {\normalhskip 2\testrulewidth
+ \vrule
+ \!!width2\testrulewidth
+ \!!height\ifnegative-7\else9\fi\testrulewidth
+ \!!depth\ifnegative9\else-7\fi\testrulewidth
+ \normalhskip 2\testrulewidth}%
+ \normalhfill
+ \else
+ \normalhfill
+ \fi}%
+ \testrulewidth=2\testrulewidth
+ \setbox0=\ruledhbox{\box0}% \make...
+ \fi
+ \smashbox0%
+ \normalpenalty\!!tenthousand
+ \normalhbox to \!!zeropoint
+ {\ifnegative\normalhskip1\scratchskip\fi
+ \box0}%
+ \afterwards\scratchskip
+ \egroup}
+
+\unexpanded\def\ruledhkern#1%
+ {\bgroup
+ \let\afterwards=#1\relax
+ \afterassignment\doruledhkern
+ \scratchskip=}
+
+%D After having seen the horizontal ones, the vertical kerns
+%D will not surprise us. In this example we use \type{\par} to
+%D switch to vertical mode.
+%D
+%D \startbuffer
+%D first line
+%D \par \kern +30pt
+%D second line
+%D \par \kern +30pt
+%D \par \kern -10pt
+%D third line
+%D \par
+%D fourth line
+%D \par \kern +30pt
+%D fifth line
+%D \par \kern 0pt
+%D sixth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D Like before, we have to postpone \type{\prevdepth}. If we
+%D leave out this trick, we got ourselves some wrong spacing.
+
+\def\dodoruledvkern%
+ {\nextdepth=\prevdepth
+ \dontinterfere
+ \dontcomplain
+ \baselinerulefalse
+ \normaloffinterlineskip
+ \investigateskip\scratchskip
+ \boxrulewidth=2\testrulewidth
+ \ifzero
+ \setbox0=\ruledhbox to 32\testrulewidth
+ {\vrule
+ \!!width\!!zeropoint
+ \!!height4\testrulewidth
+ \!!depth4\testrulewidth}%
+ \else
+ \setbox0=\ruledvbox to \ifnegative-\fi\scratchskip
+ {\hsize16\testrulewidth
+ \ifflexible
+ \cleaders
+ \normalhbox to 16\testrulewidth
+ {\normalhss
+ \normalvbox
+ {\normalvskip 2\testrulewidth
+ \hrule
+ \!!width2\testrulewidth
+ \!!height2\testrulewidth
+ \normalvskip 2\testrulewidth}%
+ \normalhss}%
+ \normalvfill
+ \else
+ \vrule
+ \!!width\!!zeropoint
+ \!!height\ifnegative-\fi\scratchskip
+ \normalhfill
+ \fi}
+ \fi
+ \testrulewidth=2\testrulewidth
+ \setbox0=\ruledvbox{\box0}% \make...
+ \smashbox0%
+ \setbox0=\normalvbox
+ {\ifnegative\normalvskip\scratchskip\fi
+ \normalvcue
+ {\ifnegative\normalhskip-16\testrulewidth\fi\box0}}%
+ \smashbox0%
+ \normalpenalty\!!tenthousand
+ \box0
+ \prevdepth=\nextdepth} % not \dp0=\nextdepth
+
+\def\doruledvkern%
+ {\ifdim\pagegoal=\maxdimen
+ \ifinner
+ \dodoruledvkern
+ \fi
+ \else
+ \dodoruledvkern
+ \fi
+ \afterwards\scratchskip
+ \egroup}
+
+\unexpanded\def\ruledvkern#1%
+ {\bgroup
+ \let\afterwards=#1\relax
+ \afterassignment\doruledvkern
+ \scratchskip=}
+
+\unexpanded\def\ruledkern%
+ {\ifvmode
+ \expandafter\ruledvkern
+ \else
+ \expandafter\ruledhkern
+ \fi
+ \normalkern}
+
+%D A a bit more \TEX nice solution is:
+%D
+%D \starttypen
+%D \unexpanded\def\ruledkern%
+%D {\csname ruled\ifvmode v\else h\fi kern\endcsname\normalkern}
+%D \stoptypen
+
+%D \macros
+%D {ruledhglue,ruledvglue}
+%D {}
+%D
+%D The non-primitive glue commands are treated as kerns with
+%D stretch. This stretch is presented as a dashed line. I
+%D have to admit that until now, I've never used these glue
+%D commands.
+%D
+%D \startbuffer
+%D one
+%D \hglue +30pt plus 5pt
+%D two
+%D \hglue +30pt
+%D \hglue -10pt plus 5pt
+%D three
+%D \hglue 0pt
+%D four
+%D \hglue +30pt
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledhglue%
+ {\leavevmode
+ \scratchcounter=\spacefactor
+ \vrule\!!width\!!zeropoint
+ \normalpenalty\!!tenthousand
+ \ruledhkern\normalhskip\scratchskip
+ \spacefactor=\scratchcounter
+ \egroup}
+
+\unexpanded\def\ruledhglue%
+ {\bgroup
+ \afterassignment\doruledhglue\scratchskip=}
+
+%D \startbuffer
+%D first line
+%D \vglue +30pt plus 5pt
+%D second line
+%D \vglue +30pt
+%D \vglue -10pt plus 5pt
+%D third line
+%D \par
+%D fourth line
+%D \vglue +30pt
+%D fifth line
+%D \vglue 0pt
+%D sixth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledvglue%
+ {\endgraf % \par
+ \nextdepth=\prevdepth
+ \hrule\!!height\!!zeropoint
+ \normalpenalty\!!tenthousand
+ \ruledvkern\normalvskip\scratchskip
+ \prevdepth=\nextdepth
+ \egroup}
+
+\unexpanded\def\ruledvglue%
+ {\bgroup
+ \afterassignment\doruledvglue\scratchskip=}
+
+%D \macros
+%D {ruledmkern,ruledmskip}
+%D {}
+%D
+%D Mathematical kerns and skips are specified in mu. This
+%D font related unit is incompatible with those of \DIMENSIONS\
+%D and \SKIPS. Because in math mode spacing is often a very
+%D subtle matter, we've used a very simple, not overloaded way
+%D to show them.
+
+\def\dodoruledmkern#1%
+ {\dontinterfere
+ \dontcomplain
+ \setbox0=\normalhbox
+ {$\normalmkern\ifnegative-\fi\scratchmuskip$}%
+ \setbox0=\normalhbox to \wd0
+ {\vrule
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth
+ \!!width\testrulewidth
+ \leaders
+ \hrule
+ \!!height\ifpositive16\else-14\fi\testrulewidth
+ \!!depth\ifpositive-14\else16\fi\testrulewidth
+ \normalhfill
+ \ifflexible
+ \normalhskip-\wd0
+ \leaders
+ \hrule
+ \!!height\testrulewidth
+ \!!depth\testrulewidth
+ \normalhfill
+ \fi
+ \vrule
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth
+ \!!width\testrulewidth}%
+ \smashbox0%
+ \ifnegative
+ #1\scratchmuskip
+ \box0
+ \else
+ \box0
+ #1\scratchmuskip
+ \fi
+ \egroup}
+
+%D \startbuffer
+%D $a \mkern3mu = \mkern3mu
+%D b \quad
+%D \mkern-2mu + \mkern-2mu
+%D \quad c$
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledmkern%
+ {\investigatemuskip\scratchmuskip
+ \flexiblefalse
+ \dodoruledmkern\normalmkern}
+
+\unexpanded\def\ruledmkern%
+ {\bgroup
+ \afterassignment\doruledmkern\scratchmuskip=}
+
+%D \startbuffer
+%D $a \mskip3mu = \mskip3mu
+%D b \quad
+%D \mskip-2mu + \mskip-2mu
+%D \quad c$
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledmskip%
+ {\investigatemuskip\scratchmuskip
+ \flexibletrue
+ \dodoruledmkern\normalmskip}
+
+\unexpanded\def\ruledmskip%
+ {\bgroup
+ \afterassignment\doruledmskip\scratchmuskip=}
+
+%D \macros
+%D {penalty}
+%D {}
+%D
+%D After presenting fills, skip, kerns and glue we've come to
+%D see penalties. In the first implementation --- most of the
+%D time needed to develop this set of macros went into testing
+%D different types of visualization --- penalties were mere
+%D small blocks with one black half, depending on the sign.
+%D This most recent version also gives an indication of the
+%D amount of penalty. Penalties can go from less than $-10000$
+%D to over $+10000$, and their behavior is somewhat
+%D non-lineair, with some values having special meanings. We
+%D therefore decided not to use its value for a lineair
+%D indicator.
+%D
+%D \startbuffer
+%D one
+%D \penalty +100
+%D two
+%D \penalty +100
+%D \penalty -100
+%D three
+%D \penalty 0
+%D four
+%D \penalty +100
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D The small sticks at the side of the penalty indicate it
+%D size. The next example shows the positive and negative
+%D penalties of 0, 1, 10, 100, 1000 and 10000.
+%D
+%D \startregelcorrectie
+%D \hbox
+%D {test \ruledhpenalty0
+%D test \ruledhpenalty1
+%D test \ruledhpenalty10
+%D test \ruledhpenalty100
+%D test \ruledhpenalty1000
+%D test \ruledhpenalty10000
+%D test}
+%D \stopregelcorrectie
+%D
+%D \blanko
+%D
+%D \startregelcorrectie
+%D \hbox
+%D {test \ruledhpenalty0
+%D test \ruledhpenalty-1
+%D test \ruledhpenalty-10
+%D test \ruledhpenalty-100
+%D test \ruledhpenalty-1000
+%D test \ruledhpenalty-10000
+%D test}
+%D \stopregelcorrectie
+%D
+%D \blanko
+%D
+%D This way stacked penalties of different severance can be
+%D shown in combination.
+%D
+%D test \ruledhpenalty10 \ruledhpenalty100
+%D test
+%D test \ruledhpenalty1000 \ruledhpenalty-1000
+%D test
+
+\def\setruledpenaltybox#1#2#3#4#5#6%
+ {\setbox#1=\normalhbox
+ {\ifnum#2=0 \else
+ \ifnum#2>0
+ \def\sign{+}%
+ \else
+ \def\sign{-}%
+ \fi
+ \dimen0=\ifnum\sign#2>9999
+ 28\else
+ \ifnum\sign#2>999
+ 22\else
+ \ifnum\sign#2>99
+ 16\else
+ \ifnum\sign#2>9
+ 10\else
+ 4
+ \fi\fi\fi\fi \testrulewidth
+ \ifnum#2<0
+ \normalhskip-\dimen0
+ \normalhskip-2\testrulewidth
+ \vrule
+ \!!width2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth#4\testrulewidth
+ \fi
+ \vrule
+ \!!width\dimen0
+ \!!height#5\testrulewidth
+ \!!depth#6\testrulewidth
+ \ifnum#2>0
+ \vrule
+ \!!width2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth#4\testrulewidth
+ \fi
+ \fi}%
+ \smashbox#1}
+
+\def\doruledhpenalty%
+ {\dontinterfere
+ \dontcomplain
+ \investigatecount\scratchcounter
+ \testrulewidth=2\testrulewidth
+ \boxrulewidth=\testrulewidth
+ \setbox0=\ruledhbox to 8\testrulewidth
+ {\ifnegative\else\normalhss\fi
+ \vrule
+ \!!depth8\testrulewidth
+ \!!width\ifzero0\else4\fi\testrulewidth
+ \ifpositive\else\normalhss\fi}%
+ \setruledpenaltybox{2}{\scratchcounter}{0}{8}{-3.5}{4.5}%
+ \normalpenalty\!!tenthousand
+ \setbox0=\normalhbox
+ {\normalhskip-4\testrulewidth
+ \ifnegative
+ \box2\box0
+ \else
+ \box0\box2
+ \fi}%
+ \smashbox0%
+ \box0
+ \normalpenalty\scratchcounter
+ \egroup}
+
+\unexpanded\def\ruledhpenalty%
+ {\bgroup
+ \afterassignment\doruledhpenalty
+ \scratchcounter=}
+
+%D The size of a vertical penalty is also shown on the
+%D horizontal axis. This way there is less interference with
+%D the often preceding or following skips and kerns.
+%D
+%D \startbuffer
+%D first line
+%D \par \penalty +100
+%D second line
+%D \par \penalty +100
+%D \par \penalty -100
+%D third line
+%D \par \penalty 0
+%D fourth line
+%D \par \penalty +100
+%D fifth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledvpenalty%
+ {\ifdim\pagegoal=\maxdimen
+ \else
+ \nextdepth=\prevdepth
+ \dontinterfere
+ \dontcomplain
+ \investigatecount\scratchcounter
+ \testrulewidth=2\testrulewidth
+ \boxrulewidth=\testrulewidth
+ \setbox0=\ruledhbox
+ {\vrule
+ \!!height4\testrulewidth
+ \!!depth4\testrulewidth
+ \!!width\!!zeropoint
+ \vrule
+ \!!height\ifnegative.5\else4\fi\testrulewidth
+ \!!depth\ifpositive.5\else4\fi\testrulewidth
+ \!!width8\testrulewidth}%
+ \setruledpenaltybox{2}{\scratchcounter}{4}{4}{.5}{.5}%
+ \setbox0=\normalhbox
+ {\normalhskip-4\testrulewidth
+ \ifnegative
+ \box2\box0
+ \else
+ \box0\box2
+ \fi
+ \normalhss}%
+ \smashbox0%
+ \normalpenalty\!!tenthousand
+ \nointerlineskip
+ \dp0=\nextdepth % not \prevdepth=\nextdepth
+ \normalvbox
+ {\normalvcue{\box0}}%
+ \fi
+ \normalpenalty\scratchcounter
+ \egroup}
+
+\unexpanded\def\ruledvpenalty%
+ {\bgroup
+ \afterassignment\doruledvpenalty
+ \scratchcounter=}
+
+\unexpanded\def\ruledpenalty%
+ {\ifvmode
+ \expandafter\ruledvpenalty
+ \else
+ \expandafter\ruledhpenalty
+ \fi}
+
+%D At the cost of some more tokens, a bit more clever
+%D implementation would be:
+%D
+%D \starttypen
+%D \unexpanded\def\ruledpenalty%
+%D {\csname ruled\ifvmode v\else h\fi penalty\endcsname}
+%D \stoptypen
+
+%D \macros
+%D {showfils,dontshowfils,
+%D showboxes,dontshowboxes,
+%D showskips,dontshowskips,
+%D showpenalties,dontshowpenalties}
+%D {}
+%D
+%D For those who want to manipulate the visual cues in detail,
+%D we have grouped them.
+
+\def\showfils%
+ {\let\hss = \ruledhss
+ \let\hfil = \ruledhfil
+ \let\hfill = \ruledhfill
+ \let\hfilneg = \ruledhfilneg
+ \let\hfillneg = \ruledhfillneg
+ \let\vss = \ruledvss
+ \let\vfil = \ruledvfil
+ \let\vfill = \ruledvfill
+ \let\vfilneg = \ruledvfilneg
+ \let\vfillneg = \ruledvfillneg}
+
+\def\dontshowfils%
+ {\let\hss = \normalhss
+ \let\hfil = \normalhfil
+ \let\hfill = \normalhfill
+ \let\hfilneg = \normalhfilneg
+ \let\hfillneg = \normalhfillneg
+ \let\vss = \normalvss
+ \let\vfil = \normalvfil
+ \let\vfill = \normalvfill
+ \let\vfilneg = \normalvfilneg
+ \let\vfillneg = \normalvfillneg}
+
+\def\showboxes%
+ {\baselineruletrue
+ \let\hbox = \ruledhbox
+ \let\vbox = \ruledvbox
+ \let\vtop = \ruledvtop
+ \let\vcenter = \ruledvcenter}
+
+\def\dontshowboxes%
+ {\let\hbox = \normalhbox
+ \let\vbox = \normalvbox
+ \let\vtop = \normalvtop
+ \let\vcenter = \normalvcenter}
+
+\def\showskips%
+ {\let\hskip = \ruledhskip
+ \let\vskip = \ruledvskip
+ \let\kern = \ruledkern
+ \let\mskip = \ruledmskip
+ \let\mkern = \ruledmkern
+ \let\hglue = \ruledhglue
+ \let\vglue = \ruledvglue}
+
+\def\dontshowskips%
+ {\let\hskip = \normalhskip
+ \let\vskip = \normalvskip
+ \let\kern = \normalkern
+ \let\mskip = \normalmskip
+ \let\mkern = \normalmkern
+ \let\hglue = \normalhglue
+ \let\vglue = \normalvglue}
+
+\def\showpenalties%
+ {\let\penalty = \ruledpenalty}
+
+\def\dontshowpenalties%
+ {\let\penalty = \normalpenalty}
+
+%D \macros
+%D {showingcomposition,
+%D showcomposition,dontshowcomposition,}
+%D {}
+%D
+%D All these nice options come together in two macros. The
+%D first one turns the options on, the second turnes them off.
+%D Both macros only do their job when we are actually showing
+%D the composition.
+%D
+%D \starttypen
+%D \showingcompositiontrue
+%D \showcomposition
+%D \stoptypen
+%D
+%D Because the output routine can do tricky things, like
+%D multiple column typesetting and manipulation of the
+%D pagebody, shifting things around and so on, the macro
+%D \type{\dontshowcomposition} best can be called when we enter
+%D this routine. Too much visual cues just don't make sense. In
+%D \CONTEXT\ this has been taken care of.
+
+\newif\ifshowingcomposition
+
+\def\showcomposition%
+ {\ifshowingcomposition
+ \showfils
+ \showboxes
+ \showskips
+ \showpenalties
+ \fi}
+
+\def\dontshowcomposition%
+ {\ifshowingcomposition
+ \dontshowfils
+ \dontshowboxes
+ \dontshowskips
+ \dontshowpenalties
+ \fi}
+
+%D \macros
+%D {showmakeup,
+%D defaulttestrulewidth}
+%D {}
+%D
+%D Just to make things even more easy, we have defined:
+%D
+%D \starttypen
+%D \showmakeup
+%D \stoptypen
+%D
+%D For the sake of those who don't (yet) use \CONTEXT\ we
+%D preset \type{\defaulttestrulewidth} to the already set
+%D value. Otherwise we default to a bodyfontsize related value.
+%D
+%D \starttypen
+%D \def\defaulttestrulewidth{.2pt}
+%D \stoptypen
+%D
+%D Beware, it's a macro not a \DIMENSION.
+
+\ifx\korpsgrootte\undefined
+ \edef\defaulttestrulewidth{\the\testrulewidth}
+\else
+ \def\defaulttestrulewidth{.02\korpsgrootte} % still dutch
+\fi
+
+\def\showmakeup%
+ {\testrulewidth=\defaulttestrulewidth
+ \showingcompositiontrue
+ \showcomposition}
+
+\protect
+
+%D \ifCONTEXT \let\next=\relax \else \let\next=\endinput
+%D The documented source you have been reading was processed
+%D using some surrogate makeup. When this file is processed
+%D in \CONTEXT, a few more examples show up here, like a local
+%D table of contents and a local register.
+%D \fi \next
+
+% %D Lets end with some more advanced examples. When visualized,
+% %D the table of contents of the outer level is typeset as:
+% %D
+% %D {\showmakeup\plaatsinhoud[criterium=vorige]}
+% %D
+%D Lets end with some more advanced examples.
+%D Definitions and enumerations come in many flavors. The
+%D next one for instance is defined as:
+%D
+%D \starttypen
+%D \definedescription[test][place=left,hang=3,width=6em]
+%D \stoptypen
+%D
+%D When applied to some text, this would look like:
+%D
+%D \bgroup
+%D \showmakeup
+%D \doordefinieren[test][plaats=links,hang=3,breedte=6em]
+%D
+%D \test{visual\\debugger} I would be very pleased if \TEX\
+%D had two more primitives: \type{\vnop} and \type{\hnop}. Both
+%D should act and show up as normal boxes, but stay invisible
+%D for \TEX\ when it's doing calculations. The \type{\vnop}
+%D for instance should not interact with the internal mechanism
+%D responsible for the disappearing skips, kerns and penalties
+%D at a pagebreak. As long as we don't have these two boxtypes,
+%D visual debugging will never be perfect.
+%D
+%D \egroup
+%D
+%D The index to this section looks like:
+%D
+%D {\stelrefererenin[prefix=dummy]\showmakeup\plaatsindex[criterium=lokaal]}
+%D
+%D Although not impressive examples or typesetting, both
+%D show us how and where things happen. When somehow the last
+%D lines in this two column index don't allign, then this is
+%D due to some still unknown interference.
+
+\endinput
diff --git a/tex/context/base/syst-ext.tex b/tex/context/base/syst-ext.tex index a04670975..a5c5ee8a5 100644 --- a/tex/context/base/syst-ext.tex +++ b/tex/context/base/syst-ext.tex @@ -1,2466 +1,2467 @@ -%D \module -%D [ file=syst-ext, -%D version=1995.10.10, -%D title=\CONTEXT\ System Macros, -%D subtitle=Extras, -%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 System Macro's / Extras} - -%D In this second system module, we continue the definition of -%D some handy commands. - -\unprotect - -%D \macros -%D {doglobal, -%D redoglobal,dodoglobal,resetglobal} -%D -%D The two macros \type{\redoglobal} and \type{\dodoglobal} are -%D used in this and some other modules to enforce a user -%D specified \type{\doglobal} action. The last and often only -%D global assignment in a macro is done with -%D \type{\dodoglobal}, but all preceding ones with -%D \type{\redoglobal}. When using only alternatives, one can -%D reset this mechanism with \type{\resetglobal}. - -\def\doglobal% - {\let\redoglobal=\global - \def\dodoglobal% - {\resetglobal\global}} - -\def\resetglobal% - {\let\redoglobal=\relax - \let\dodoglobal=\relax} - -\resetglobal - -%D New: - -\def\doglobal% - {\ifx\redoglobal\relax - \let\redoglobal=\global - \def\dodoglobal{\resetglobal\global}% - \else - \writestatus{system}{global not reset, warn me!}% - \fi} - -\def\saveglobal - {\let\@@dodoglobal\dodoglobal - \let\@@redoglobal\redoglobal} - -\def\restoreglobal - {\let\dodoglobal\@@dodoglobal - \let\redoglobal\@@redoglobal} - -%D A very useful application of this macro is \type{\newif}, -%D \TEX's fake boolean type. Not being a primitive, -%D \type{\global} hopelessly fails here. But a slight -%D adaption of Knuth's original macro permits: -%D -%D \starttypen -%D \doglobal\newif\iftest -%D \stoptypen -%D -%D Of course one can still say: -%D -%D \starttypen -%D \global\testtrue -%D \global\testfalse -%D \stoptypen -%D -%D Apart from the prefixes, a few more \type{\expandafters} -%D are needed: - -\def\newif#1% - {\count@\escapechar - \escapechar\m@ne - \expandafter\expandafter\expandafter - \redoglobal\expandafter\expandafter\expandafter - \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}% - \expandafter\expandafter\expandafter - \redoglobal\expandafter\expandafter\expandafter - \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}% - \dodoglobal\@if#1{false}% - \escapechar\count@} - -%D \macros -%D {newcounter, -%D increment,decrement} -%D {} -%D -%D Unfortunately the number of \COUNTERS\ in \TEX\ is limited, -%D but fortunately we can store numbers in a macro. We can -%D increment such pseudo \COUNTERS\ with \type{\increment}. -%D -%D \starttypen -%D \increment(\counter,20) -%D \increment(\counter,-4) -%D \increment(\counter) -%D \increment\counter -%D \stoptypen -%D -%D After this sequence of commands, the value of -%D \type{\counter} is 20, 16, 17 and~18. Of course there is -%D also the complementary command \type{\decrement}. -%D -%D Global assignments are possible too, using \type{\doglobal}: -%D -%D \starttypen -%D \doglobal\increment\counter -%D \stoptypen -%D -%D When \type{\counter} is undefined, it's value is initialized -%D at~0. It is nevertheless better to define a \COUNTER\ -%D explicitly. One reason could be that the \COUNTER\ can be -%D part of a test with \type{\ifnum} and this conditional does -%D not accept undefined macro's. The \COUNTER\ in our example -%D can for instance be defined with: -%D -%D \starttypen -%D \newcounter\counter -%D \stoptypen -%D -%D The command \type{\newcounter} must not be confused with -%D \type{\newcount}! Of course this mechanism is much slower -%D than using \TEX's \COUNTERS\ directly. In practice -%D \COUNTERS\ (and therefore our pseudo counters too) are -%D seldom the bottleneck in the processing of a text. Apart -%D from some other incompatilities we want to mention a pitfal -%D when using \type{\ifnum}. -%D -%D \starttypen -%D \ifnum\normalcounter=\pseudocounter \doif \else \doelse \fi -%D \ifnum\pseudocounter=\normalcounter \doif \else \doelse \fi -%D \stoptypen -%D -%D In the first test, \TEX\ continues it's search for the -%D second number after reading \type{\pseudocounter}, while -%D in the second test, it stops reading after having -%D encountered a real one. Tests like the first one therefore -%D can give unexpected results, for instance execution -%D of \type{\doif} even if both numbers are unequal. - -\def\newcounter#1% - {\dodoglobal\def#1{0}} - -\def\dodododoincrement(#1,#2)% - {\ifx#1\undefined - \redoglobal\def#1{0}% - \fi - \scratchcounter=#2\relax - \scratchcounter=\incrementsign\scratchcounter - \advance\scratchcounter by #1\relax - \dodoglobal\edef#1{\the\scratchcounter}} - -\def\dododoincrement#1% - {\dodododoincrement(#1,1)} - -\def\dodoincrement(#1% - {\doifnextcharelse{,} - {\dodododoincrement(#1} - {\dodododoincrement(#1,1}} - -\def\doincrement#1% - {\def\incrementsign{#1}% - \doifnextcharelse{(} - {\dodoincrement} - {\dododoincrement}} - -\def\increment% - {\doincrement+} - -\def\decrement% - {\doincrement-} - -%D \macros -%D {newsignal} -%D -%D When writing advanced macros, we cannot do without -%D signaling. A signal is a small (invisible) kern or penalty -%D that signals the next macro that something just happened. -%D This macro can take any action depending onthe previous -%D signal. Signals must be unique and the next macro takes care -%D of that. -%D -%D \starttypen -%D \newsignal\somesignal -%D \stoptypen -%D -%D Signals old dimensions and can be used in skips, kerns and -%D tests like \type{\ifdim}. - -\newdimen\currentsignal - -\def\newsignal#1% - {\advance\currentsignal by 0.00025pt - \edef#1{\the\currentsignal}} - -%D \macros -%D {newskimen} -%D -%D \TEX\ offers 256 \DIMENSIONS\ and \SKIPS. Unfortunately this -%D amount is too small to suit certain packages. Therfore when -%D possible one should use -%D -%D \starttypen -%D \newskimen\tempskimen -%D \stoptypen -%D -%D This commands allocates a \DIMENSION\ or a \SKIP, depending -%D on the availability. One should be aware of the difference -%D between both. When searching for some glue \TEX\ goes on -%D searching till it's sure that no other glue component if -%D found. This search can be canceled by using \type{\relax} -%D when possible and needed. - -\def\newskimen#1% - {\ifx#1\undefined - \ifnum\count11>\count12 - \newskip#1\relax - \else - \newdimen#1\relax - \fi - \fi} - -%D \macros -%D {strippedcsname} -%D {} -%D -%D The next macro can be very useful when using \type{\csname} -%D like in: -%D -%D \starttypen -%D \csname if\strippedcsname\something\endcsname -%D \stoptypen -%D -%D This expands to \type{\ifsomething}. - -\def\strippedcsname% - {\expandafter\gobbleoneargument\string} - -%D \macros -%D {newconditional, -%D settrue, setfalse, -%D ifconditional} -%D {} -%D -%D \TEX's lacks boolean variables, although the \PLAIN\ format -%D implements \type{\newif}. The main disadvantage of this -%D scheme is that it takes three hash table entries. A more -%D memory saving alternative is presented here. A conditional -%D is defined by: -%D -%D \starttypen -%D \newconditional\doublesided -%D \setfalse -%D -%D Setting a conditional is done by \type{\settrue} and -%D \type{\setfalse}: -%D -%D \starttypen -%D \settrue\doublesided -%D \setfalse -%D -%D while testing is accomplished by: -%D -%D \starttypen -%D \ifconditional\doublesided ... \else ... \fi -%D \setfalse -%D -%D We cannot use the simple scheme: -%D -%D \starttypen -%D \def\settrue#1{\let#1=\iftrue} -%D \def\settrue#1{\let#1=\iffalse} -%D \stoptypen -%D -%D Such an implementation gives problems with nested -%D conditionals. The next implementation is abaou as fast -%D and just as straightforward: - -\def\settrue#1% - {\chardef#1=0 } - -\def\setfalse#1% - {\chardef#1=1 } - -\let\newconditional = \setfalse -\let\ifconditional = \ifcase - -%D \macros -%D {dorecurse,recurselevel,recursedepth -%D dostepwiserecurse, -%D for} -%D -%D \TEX\ does not offer us powerfull for||loop mechanisms. On -%D the other hand its recursion engine is quite unique. We -%D therefore identify the for||looping macros by this method. -%D The most simple alternative is the one that only needs a -%D number. -%D -%D \starttypen -%D \dorecurse {n} {whatever we want} -%D \stoptypen -%D -%D This macro can be nested without problems and therefore be -%D used in situations where \PLAIN\ \TEX's \type{\loop} macro -%D ungracefully fails. The current value of the counter is -%D available in \type{\recurselevel}, before as well as after -%D the \typ{whatever we wat} stuff. -%D -%D \starttypen -%D \dorecurse % inner loop -%D {10} -%D {\recurselevel: % outer value -%D \dorecurse % inner loop -%D {\recurselevel} % outer value -%D {\recurselevel} % inner value -%D \dorecurse % inner loop -%D {\recurselevel} % outer value -%D {\recurselevel} % inner value -%D \endgraf} -%D \stoptypen -%D -%D In this example the first, second and fourth -%D \type{\recurselevel} concern the outer loop, while the third -%D and fifth one concern the inner loop. The depth of the -%D nesting is available for inspection in \type{\recursedepth}. -%D -%D Both \type{\recurselevel} and \type{\recursedepth} are -%D macros. The real \COUNTERS\ are hidden from the user because -%D we don't want any interference. - -\def\@@irecurse{@@irecurse} % stepper -\def\@@nrecurse{@@nrecurse} % number of steps -\def\@@srecurse{@@srecurse} % step -\def\@@drecurse{@@drecurse} % direction, < or > -\def\@@arecurse{@@arecurse} % action - -\newcount\outerrecurse -\newcount\innerrecurse - -\def\recursedepth% - {\the\outerrecurse} - -\long\def\dostepwiserecurse#1#2#3#4% - {\ifnum#2=0 - \def\recurselevel{0}% - \let\next=\relax - \else - \global\advance\outerrecurse by 1 - \innerrecurse=#1\setevalue{\@@irecurse\recursedepth}{\the\innerrecurse}% - \innerrecurse=#2\setevalue{\@@nrecurse\recursedepth}{\the\innerrecurse}% - \innerrecurse=#3\setevalue{\@@srecurse\recursedepth}{\the\innerrecurse}% - \ifnum#3>0\relax\ifnum#2<#1\relax - \else - \setevalue{\@@drecurse\recursedepth}{>}% - \long\setvalue{\@@arecurse\recursedepth}{#4}% - \let\next=\dodorecurse - \fi\fi - \ifnum#3<0\relax\ifnum#1<#2\relax - \else - \setevalue{\@@drecurse\recursedepth}{<}% - \long\setvalue{\@@arecurse\recursedepth}{#4}% - \let\next=\dodorecurse - \fi\fi - \fi - \next} - -\def\donorecurse% - {} - -\def\dodonorecurse% - {\global\advance\outerrecurse by -1\relax} - -\def\dododorecurse% - {\edef\recurselevel{\getvalue{\@@irecurse\recursedepth}}% - \getvalue{\@@arecurse\recursedepth}% - \edef\recurselevel{\getvalue{\@@irecurse\recursedepth}}% - \innerrecurse=\recurselevel - \advance\innerrecurse by \getvalue{\@@srecurse\recursedepth}\relax - \setevalue{\@@irecurse\recursedepth}{\the\innerrecurse}% - \dodorecurse} - -\def\dodorecurse% - {\ifnum\getvalue{\@@irecurse\recursedepth} - \getvalue{\@@drecurse\recursedepth} - \getvalue{\@@nrecurse\recursedepth}\relax - \expandafter\dodonorecurse - \else - \expandafter\dododorecurse - \fi} - -\def\dorecurse#1% - {\dostepwiserecurse{1}{#1}{1}} - -%D For those we like to offer visual beauty for efficiency we -%D say however:\voetnoot{In this kind of macro's we tend to -%D minimalize the overhead.} - -\def\dodorecurse% - {\ifnum\getvalue{\@@irecurse\recursedepth} - \getvalue{\@@drecurse\recursedepth} - \getvalue{\@@nrecurse\recursedepth}\relax - \global\advance\outerrecurse by -1 - \else - \expandafter\dododorecurse - \fi} - -%D As we can see here, the simple command \type{\dorecurse} is -%D a special case of the more general: -%D -%D \starttypen -%D \dostepwiserecurse {from} {to} {step} {action} -%D \stoptypen -%D -%D This commands accepts positive and negative steps. Illegal -%D values are handles as good as possible and the macro accepts -%D numbers and \COUNTERS. -%D -%D \starttypen -%D \dostepwiserecurse {1} {10} {2} {...} -%D \dostepwiserecurse {10} {1} {-2} {...} -%D \stoptypen -%D -%D The third alternative looks a bit different and uses a -%D pseudo counter. When this macro is nested, we have to use -%D different counters. This time we use keywords. -%D -%D \starttypen -%D \def\alfa{2} \def\beta{100} \def\gamma{3} -%D -%D \for \n=55 \to 100 \step 1 \do {... \n ...} -%D \for \n=\alfa \to \beta \step \gamma \do {... \n ...} -%D \for \n=\n \to 120 \step 1 \do {... \n ...} -%D \for \n=120 \to 100 \step -3 \do {... \n ...} -%D \for \n=55 \to 100 \step 2 \do {... \n ...} -%D \stoptypen -%D -%D Only in the third example we need to predefine \type{\n}. -%D The use of \type{\od} as a dilimiter would have made nested -%D use more problematic. - -\def\for#1=#2\to#3\step#4\do#5% - {\dostepwiserecurse{#2}{#3}{#4} - {\edef#1{\recurselevel}% - #5% - \edef#1{\recurselevel}}} - -%D \macros -%D {doloop,exitloop} -%D {} -%D -%D Sometimes loops are not determined by counters, but by -%D (a combinations of) conditions. We therefore implement a -%D straightforward loop, which can only be left when we -%D explictly exit it. Nesting is supported. First we present -%D a more extensive alternative. -%D -%D \starttypen -%D \doloop -%D {Some kind of typesetting punishment \par -%D \ifnum\pageno>100 \exitloop \fi} -%D \stoptypen -%D -%D When needed, one can call for \type{\looplevel} and -%D \type{\loopdepth}. -%D -%D If we write this macros from scratch, we end up with -%D something like the ones described above: -%D -%D \starttypen -%D \def\@@eloop{@@eloop} % exit -%D \def\@@iloop{@@iloop} % stepper -%D \def\@@aloop{@@aloop} % action -%D -%D \newcount\outerloop -%D -%D \def\loopdepth% -%D {\the\outerloop} -%D -%D \def\exitloop% -%D {\setevalue{\@@eloop\loopdepth}{0}} -%D -%D \long\def\doloop#1% -%D {\global\advance\outerloop by 1 -%D \setevalue{\@@iloop\loopdepth}{1}% -%D \setevalue{\@@eloop\loopdepth}{1}% -%D \long\setvalue{\@@aloop\loopdepth}{#1}% -%D \dodoloop} -%D -%D \def\dodonoloop% -%D {\global\advance\outerloop by -1\relax} -%D -%D \def\dododoloop% -%D {\edef\looplevel{\getvalue{\@@iloop\loopdepth}}% -%D \innerrecurse=\looplevel -%D \advance\innerrecurse by 1 -%D \setevalue{\@@iloop\loopdepth}{\the\innerrecurse}% -%D \getvalue{\@@aloop\loopdepth}% -%D \edef\looplevel{\getvalue{\@@iloop\loopdepth}}% -%D \dodoloop} -%D -%D \def\dodoloop% -%D {\ifnum\getvalue{\@@eloop\loopdepth}=0 -%D \expandafter\dodonoloop -%D \else -%D \expandafter\dododoloop -%D \fi} -%D -%D \def\doloop% -%D {\dostepwiserecurse{1}{\maxdimen}{1}} -%D -%D \def\exitloop -%D {\setvalue{\@@irecurse\recursedepth}{\maxdimen}} -%D -%D \def\looplevel{\recurselevel} -%D \def\loopdepth{\recursedepth} -%D \stoptypen -%D -%D We prefer however a more byte saving implementation, that -%D executes of course a bit slower. - -\def\doloop% - {\dostepwiserecurse{1}{\maxdimen}{1}} - -\def\exitloop - {\setvalue{\@@irecurse\recursedepth}{\maxdimen}} - -%D We don't declare new counters for \type{\looplevel} and -%D \type{\loopdepth} because one can use \type{\recurselevel} -%D and \type{\recursedepth}. -%D -%D The loop is executed at least once, so beware of situations -%D like: -%D -%D \starttypen -%D \doloop {\exitloop some commands} -%D \stoptypen -%D -%D It's just a matter of putting the text into the \type{\if} -%D statement that should be there anyway, like in: -%D -%D \starttypen -%D \doloop {\ifwhatever \exitloop \else some commands\fi} -%D \stoptypen - -%D \macros -%D {newevery,everyline,EveryLine,EveryPar} -%D {} -%D -%D Lets skip to something quite different. It's common use -%D to use \type{\everypar} for special purposes. In \CONTEXT\ -%D we use this primitive for locating sidefloats. This means -%D that when user assignments to \type{\everypar} can interfere -%D with those of the package. We therefore introduce -%D \type{\EveryPar}. -%D -%D The same goes for \type{\EveryLine}. Because \TEX\ offers -%D no \type{\everyline} primitive, we have to call for -%D \type{\everyline} when we are working on a line by line -%D basis. Just by calling \type{\EveryPar{}} and -%D \type{\EveryLine{}} we restore the old situation. -%D -%D The definition command \type{\DoWithEvery} will be quite -%D unreadable, so let's first show an implementation that -%D shows how things are done: -%D -%D \starttypen -%D \newtoks \everyline -%D \newtoks \oldeveryline -%D \newif \ifeveryline -%D -%D \def\DoWithEvery#1#2#3#4% -%D {#3\else\edef\next{\noexpand#2={\the#1}}\next\fi -%D \edef\next{\noexpand#1={\the#2\the\scratchtoks}}\next -%D #4} -%D -%D \def\doEveryLine% -%D {\DoWithEvery\everyline\oldeveryline\ifeveryline\everylinetrue} -%D -%D \def\EveryLine% -%D {\afterassignment\doEveryLine\scratchtoks} -%D -%D The real implementation is a bit more complicated but we -%D prefer something more versatile. - -\def\DoWithEvery#1% - {\csname if\strippedcsname#1\endcsname \else - \edef\next% - {\@EA\noexpand\csname old\strippedcsname#1\endcsname= - {\the#1}}% - \next - \fi - \edef\next% - {\noexpand#1= - {\@EA\the\csname old\strippedcsname#1\endcsname\the\scratchtoks}}% - \next - \csname\strippedcsname#1true\endcsname} - -\def\dowithevery#1% - {\@EA\afterassignment\csname do\strippedcsname#1\endcsname\scratchtoks} - -\def\newevery#1#2% - {\ifx#2\undefined - \ifx#1\undefined\newtoks#1\fi - \@EA\newtoks\csname old\strippedcsname#1\endcsname - \@EA\newif \csname if\strippedcsname#1\endcsname - \@EA\def \csname do\strippedcsname#2\endcsname{\DoWithEvery#1}% - \def#2{\dowithevery#2}% - \fi} - -%D This one permits definitions like: - -\newevery \everypar \EveryPar -\newevery \everyline \EveryLine - -%D and how about: - -\newevery \neverypar \NeveryPar - -%D Which indeed we're going to use indeed! - -%D Technically spoken we could have used the method we are -%D going to present in the visual debugger. First we save -%D the primitive \type{\everypar}: -%D -%D \starttypen -%D \let\normaleverypar=\everypar -%D \stoptypen -%D -%D Next we allocate a \TOKENLIST\ named \type{\everypar}, -%D which means that \type{\everypar} is no longer a primitive -%D but something like \type{\toks44}. -%D -%D \starttypen -%D \newtoks\everypar -%D \stoptypen -%D -%D Because \TEX\ now executes \type{\normaleverypar} instead -%D of \type{\everypar}, we are ready to assign some tokens to -%D this internally known and used \TOKENLIST. -%D -%D \starttypen -%D \normaleverypar={all the things the system wants to do \the\everypar} -%D \stoptypen -%D -%D Where the user can provide his own tokens to be expanded -%D every time he expects them to expand. -%D -%D \starttypen -%D \everypar={something the user wants to do} -%D \stoptypen -%D -%D We don't use this method because it undoubtly leads to -%D confusing situations, especially when other packages are -%D used, but it's this kind of tricks that make \TEX\ so -%D powerful. - -%D \macros -%D {convertargument,convertcommand} -%D {} -%D -%D Some persistent experimenting led us to the next macro. This -%D macro converts a parameter or an expanded macro to it's -%D textual meaning. -%D -%D \starttypen -%D \convertargument ... \to \command -%D \stoptypen -%D -%D For example, -%D -%D \starttypen -%D \convertargument{one \two \three{four}}\to\ascii -%D \stoptypen -%D -%D The resulting macro \type{\ascii} can be written to a file -%D or the terminal without problems. In \CONTEXT\ we use this -%D macro for generating registers and tables of contents. -%D -%D The second conversion alternative accepts a command: -%D -%D \starttypen -%D \convertcommand\command\to\ascii -%D \stoptypen -%D -%D Both commands accept the prefix \type{\doglobal} for global -%D assignments. - -\def\doconvertargument#1>{} - -\def\convertedcommand% - {\expandafter\doconvertargument\meaning} - -\long\def\convertargument#1\to#2% - {\long\def\convertedargument{#1}% - \dodoglobal\edef#2% - {\convertedcommand\convertedargument}} - -\long\def\convertcommand#1\to#2% - {\dodoglobal\edef#2% - {\convertedcommand#1}} - -%D This is typically a macro that one comes to after reading -%D the \TEX book carefully. Even then, the definite solution -%D was found after rereading the \TEX book. The first -%D implementation was: -%D -%D \starttypen -%D \def\doconvertargument#1->#2\\\\{#2} -%D \stoptypen -%D -%D The \type{-}, the delimiter \type{\\\\} and the the second -%D argument are completely redundant. - -%D \macros -%D {ExpandFirstAfter,ExpandSecondAfter,ExpandBothAfter} -%D {} -%D -%D These three commands support expansion of arguments before -%D executing the commands that uses them. We can best -%D illustrate this with an example. -%D -%D \starttypen -%D \def\first {alfa,beta,gamma} -%D \def\second {alfa,epsilon,zeta} -%D -%D \ExpandFirstAfter \doifcommon {\first} {alfa} {\message{OK}} -%D \ExpandSecondAfter \doifcommon {alfa} {\second} {\message{OK}} -%D \ExpandBothAfter \doifcommon {\first} {\second} {\message{OK}} -%D -%D \ExpandFirstAfter\processcommalist[\first]\message -%D -%D \ExpandAfter \doifcommon {\first} {alfa} {\message{OK}} -%D \stoptypen -%D -%D The first three calls result in the threefold message -%D \type{OK}, the fourth one shows the three elements of -%D \type{\first}. The command \type{\ExpandFirstAfter} takes -%D care of (first) arguments that are delimited by \type{[ ]}, -%D but the faster \type{\ExpandAfter} does not. - -%D RECONSIDER - -\def\simpleExpandFirstAfter#1% - {\edef\!!stringa{#1}% - \@EA\ExpandCommand\@EA{\!!stringa}} - -\def\complexExpandFirstAfter[#1]% - {\edef\!!stringa{#1}% - \@EA\ExpandCommand\@EA[\!!stringa]} - -\def\ExpandFirstAfter#1% - {\def\ExpandCommand{#1}% - \complexorsimple{ExpandFirstAfter}} - -\def\ExpandSecondAfter#1#2#3% - {\def\!!stringa{#2}% - \edef\!!stringb{#3}% - \@EA#1\@EA{\@EA\!!stringa\@EA}\@EA{\!!stringb}} - -% \def\ExpandSecondAfter#1#2#3% -% {\toks0={#2}% -% \edef\!!stringa{#3}% -% \@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA\the\@EA\toks0\@EA}\@EA{\!!stringa}} - -\def\ExpandBothAfter#1#2#3% - {\edef\!!stringa{#2}% - \edef\!!stringb{#3}% - \@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA\!!stringa\@EA}\@EA{\!!stringb}} - -\def\ExpandAfter#1#2% - {\edef\!!stringa{#2}% - \@EA#1\@EA{\!!stringa}} - -%D Now we can for instance redefine \type{\ifinstringelse} as: - -\def\ifinstringelse% - {\ExpandBothAfter\v!ifinstringelse} - -%D \macros -%D {ConvertToConstant,ConvertConstantAfter} -%D {} -%D -%D When comparing arguments with a constant, we can get into -%D trouble when this argument consists of tricky expandable -%D commands. One solution for this is converting the -%D argument to a string of unexpandable characters. To make -%D comparison possible, we have to convert the constant too -%D -%D \starttypen -%D \ConvertToConstant\doifelse {...} {...} {then ...} {else ...} -%D \stoptypen -%D -%D This construction is only needed when the first argument -%D can give troubles. Misuse can slow down processing. -%D -%D \starttypen -%D \ConvertToConstant\doifelse{\c!alfa} {\c!alfa}{...}{...} -%D \ConvertToConstant\doifelse{alfa} {\c!alfa}{...}{...} -%D \ConvertToConstant\doifelse{alfa} {alfa} {...}{...} -%D \ConvertToConstant\doifelse{alfa \alfa test}{\c!alfa}{...}{...} -%D \stoptypen -%D -%D In examples~2 and~3 both arguments equal, in~1 and~4 -%D they differ. - -\def\ConvertToConstant#1#2#3% - {\expandafter\convertargument\expandafter{#2}\to\!!stringa - \expandafter\convertargument\expandafter{#3}\to\!!stringb - #1{\!!stringa}{\!!stringb}} - -%D When the argument \type{#1} consists of commands, we had -%D better use -%D -%D \starttypen -%D \ConvertConstantAfter\processaction[#1][...] -%D \ConvertConstantAfter\doifelse{#1}{\v!iets}{}{} -%D \stoptypen -%D -%D This commands accepts things like: -%D -%D \starttypen -%D \v!constant -%D constant -%D \hbox to \hsize{\rubish} -%D \stoptypen -%D -%D As we will see in the core moudles, this macro permits -%D constructions like: -%D -%D \starttypen -%D \setupfoottexts[...][...] -%D \setupfoottexts[margin][...][...] -%D \setupfoottexts[\v!margin][...][...] -%D \stoptypen -%D -%D where \type{...} can be anything legally \TEX. - -\def\CheckConstantAfter#1#2% - {\@EA\convertargument\v!prefix!\to\ascii - \convertargument#1\to#2\relax - \doifinstringelse{\ascii}{#2} - {\expandafter\convertargument#1\to#2} - {}} - -\def\simpleConvertConstantAfter#1#2% - {\CheckConstantAfter{#1}\asciiA - \CheckConstantAfter{#2}\asciiB - \ConvertCommand{\asciiA}{\asciiB}} - -\def\complexConvertConstantAfter[#1]% - {\doConvertConstantAfter{#1}% - \@EA\ConvertCommand\@EA[\!!stringa]} - -\def\ConvertConstantAfter#1% - {\def\ConvertCommand{#1}% - \complexorsimple{ConvertConstantAfter}} - -%D \macros -%D {assignifempty} -%D {} -%D -%D We can assign a default value to an empty macro using: -%D -%D \starttypen -%D \assignifempty \macros {default value} -%D \stoptypen -%D -%D We don't explicitly test if the macro is defined. - -\def\assignifempty#1#2% - {\doifnot{#1}{} - {\def#1{#2}}} - -%D \macros -%D {gobbleuntil,grabuntil,processbetween} -%D {} -%D -%D In \TEX\ gobbling usually stand for skipping arguments, so -%D here are our gobbling macros. -%D -%D In \CONTEXT\ we use a lot of \type{\start}||\type{\stop} -%D like constructions. Sometimes, the \type{\stop} is used as a -%D hard coded delimiter like in: -%D -%D \starttypen -%D \def\startcommand#1\stopcommand% -%D {... #1 ...} -%D \stoptypen -%D -%D In many cases the \type{\start}||\type{\stop} pair is -%D defined at format generation time or during a job. This -%D means that we cannot hardcode the \type{\stop} criterium. -%D Only after completely understanding \type{\csname} and -%D \type{\expandafter} I was able to to implement a solution, -%D starting with: -%D -%D \starttypen -%D \grabuntil{stop}\command -%D \stoptypen -%D -%D This commands executed, after having encountered -%D \type{\stop} the command \type{\command}. This command -%D receives as argument the text preceding the \type{\stop}. -%D This means that: -%D -%D \starttypen -%D \def\starthello% -%D {\grabuntil{stophello}\message} -%D -%D \starthello Hello world!\stophello -%D \stoptypen -%D -%D results in: \type{\message{Hello world!}}. - -\def\dograbuntil#1#2% - {\long\def\next##1#1{#2{##1}}\next} - -\def\grabuntil#1% - {\expandafter\dograbuntil\expandafter{\csname#1\endcsname}} - -%D The next command build on this mechanism: -%D -%D \starttypen -%D \processbetween{string}\command -%D \stoptypen -%D -%D Here: -%D -%D \starttypen -%D \processbetween{hello}\message -%D \starthello Hello again!\stophello -%D \stoptypen -%D -%D leads to: \type{\message{Hello again!}}. The command -%D -%D \starttypen -%D \gobbleuntil\command -%D \stoptypen -%D -%D is related to these commands. This one simply throws away -%D everything preceding \type{\command}. - -\long\def\processbetween#1#2% - {\setvalue{\s!start#1}% - {\grabuntil{\s!stop#1}{#2}}} - -\def\gobbleuntil#1% - {\long\def\next##1#1{}\next} - -%D \macros -%D {groupedcommand} -%D {} -%D -%D Commands often manipulate argument as in: -%D -%D \starttypen -%D \def\doezomaarwat#1{....#1....} -%D \stoptypen -%D -%D A disadvantage of this approach is that the tokens that -%D form \type{#1} are fixed the the moment the argument is read -%D in. Normally this is no problem, but for instance verbatim -%D environments adapt the \CATCODES\ of characters and therefore -%D are not always happy with already fixed tokens. -%D -%D Another problem arises when the argument is grouped not by -%D \type{{}} but by \type{\bgroup} and \type{\egroup}. Such an -%D argument fails, because the \type{\bgroup} is een as the -%D argument (which is quite normal). -%D -%D The next macro offers a solution for both unwanted -%D situations: -%D -%D \starttypen -%D \groupedcommand {before} {after} -%D \stoptypen -%D -%D Which can be used like: -%D -%D \starttypen -%D \def\cite% -%D {\groupedcommand{\rightquote\rightquote}{\leftquote\leftquote}} -%D \stoptypen -%D -%D This command is equivalent to, but more 'robust' than: -%D -%D \starttypen -%D \def\cite#1% -%D {\rightquote\rightquote#1\leftquote\leftquote} -%D \stoptypen -%D -%D One should say that the next implementation would suffice: -%D -%D \starttypen -%D \def\groupedcommand#1#2% -%D {\def\BeforeGroup{#1\ignorespaces}% -%D \def\AfterGroup{\unskip#2\egroup}% -%D \bgroup\bgroup -%D \aftergroup\AfterGroup -%D \afterassignment\BeforeGroup -%D \let\next=} -%D \stoptypen -%D -%D It did indeed, but one day we decided to support the -%D processing of boxes too: -%D -%D \starttypen -%D \def\rightword% -%D {\groupedcommand{\hfill\hbox}{\parfillskip\!!zeropoint}} -%D -%D .......... \rightword{the right way} -%D \stoptypen -%D -%D Here \TEX\ typesets \type{\bf the right way} unbreakable -%D at the end of the line. The solution mentioned before does -%D not work here. -%D -%D \starttypen -%D \long\unexpanded\def\groupedcommand#1#2% -%D {\bgroup -%D \long\def\BeforeGroup% -%D {\bgroup#1\bgroup\aftergroup\AfterGroup}% -%D \long\def\AfterGroup% -%D {#2\egroup\egroup}% -%D \afterassignment\BeforeGroup -%D \let\next=} -%D \stoptypen -%D -%D We used this method some time until the next alternative -%D was needed. From now on we support both -%D -%D \starttypen -%D to be \bold{bold} or not, that's the question -%D \stoptypen -%D -%D and -%D -%D \starttypen -%D to be {\bold bold} or not, that's the question -%D \stoptypen -%D -%D This alternative checks for a \type{\bgroup} token first. -%D The internal alternative does not accept the box handling -%D mentioned before, but further nesting works all right. The -%D extra \type{\bgroup}||\type{\egroup} is needed to keep -%D \type{\AfterGroup} both into sight and local. - -\long\def\HandleGroup#1#2% - {\bgroup - \long\def\BeforeGroup% - {\bgroup#1\bgroup\aftergroup\AfterGroup}% - \long\def\AfterGroup% - {#2\egroup\egroup}% - \afterassignment\BeforeGroup - \let\next=} - -\long\def\HandleNoGroup#1#2% - {\long\def\AfterGroup{#2\egroup}% - \bgroup\aftergroup\AfterGroup#1} - -%D These macros come together in: -%D -%D \starttypen -%D \long\unexpanded\def\groupedcommand#1#2% -%D {\def\dogroupedcommand% -%D {\ifx\next\bgroup -%D \let\next=\HandleGroup -%D \else -%D \let\next=\HandleNoGroup -%D \fi -%D \next{#1}{#2}}% -%D \futurelet\next\dogroupedcommand} -%D \stoptypen -%D -%D From the missing paragraph number one can deduce that the -%D last macro is not the real one yet. I considered it a -%D nuisance that -%D -%D \starttypen -%D \kleur[groen] -%D {as gras} -%D \stoptypen -%D -%D was not interpreted as one would expect. This is due to the -%D fact that \type{\futurelet} obeys blank spaces, and a -%D line||ending token is treated as a blank space. So the final -%D implementation became: - -\long\unexpanded\def\groupedcommand#1#2% - {\bgroup - \def\dogroupedcommand% - {\ifx\next\bgroup - \def\\{\egroup\HandleGroup{#1}{#2}}% - \else\ifx\next\blankspace - \def\\ {\egroup\groupedcommand{#1}{#2}}% - \else - \def\\{\egroup\HandleNoGroup{#1}{#2}}% - \fi\fi - \\}% - \futurelet\next\dogroupedcommand} - -%D Users should be aware of the fact that grouping can -%D interfere with ones paragraph settings that are executed -%D after the paragraph is closed. One should therefore -%D explictly close the paragraph with \type{\par}, else the -%D settings will be forgotten and not applied. So it's: -%D -%D \starttypen -%D \def\BoldRaggedCenter% -%D {\groupedcommand{\raggedcenter\bf}{\par}} -%D \stoptypen - -%D \macros -%D {checkdefined} -%D {} -%D -%D The bigger the system, the greater the change that -%D user defined commands collide with those that are part of -%D the system. The next macro gives a warning when a command is -%D already defined. We considered blocking the definition, but -%D this is not always what we want. -%D -%D \starttypen -%D \checkdefined {category} {class} {command} -%D \stoptypen -%D -%D The user is warned with the suggestion to use -%D \type{CAPITALS}. This suggestion is feasible, because -%D \CONTEXT only defines lowcased macros. - -\def\checkdefined#1#2#3% redefined in mult-ini - {\doifdefined{#3} - {\writestatus{#1}{#2 #3 replaces a macro, use CAPITALS!}}} - -%D \macros -%D {GotoPar,GetPar} -%D {} -%D -%D Typesetting a paragraph in a special way can be done by -%D first grabbing the contents of the paragraph and processing -%D this contents grouped. The next macro for instance typesets -%D a paragraph in boldface. -%D -%D \starttypen -%D \def\remark#1\par% -%D {\bgroup\bf#1\egroup} -%D \stoptypen -%D -%D This macro has to be called like -%D -%D \starttypen -%D \remark some text ... ending with \par -%D \stoptypen -%D -%D Instead of \type{\par} we can of course use an empty line. -%D When we started typesetting with \TEX, we already had -%D produced lots of text in plain \ASCII. In producing such -%D simple formatted texts, we adopted an open layout, and when -%D switching to \TEX, we continued this open habit. Although -%D \TEX\ permits a cramped and badly formatted source, it adds -%D to confusion and sometimes introduces errors. So we prefer: -%D -%D \starttypen -%D \remark -%D -%D some text ... ending with an empty line -%D \stoptypen -%D -%D We are going to implement a mechanism that allows such open -%D specifications. The definition of the macro handling -%D \type{\remark} becomes: -%D -%D \starttypen -%D \def\remark% -%D {\BeforePar{\bgroup\bf}% -%D \AfterPar{\egroup}% -%D \GetPar} -%D \stoptypen -%D -%D A macro like \type{\GetPar} can be defined in several -%D ways. The recent version, the fourth one in a row, -%D originally was far more complicated, but some functionality -%D has been moved to other macros. -%D -%D We start with the more simple but in some cases more -%D appropriate alternative is \type{\GotoPar}. This one leaves -%D \type{\par} unchanged and is therefore more robust. On the -%D other hand, \type{\AfterPar} is not supported. - -\newtoks\BeforePar -\newtoks\AfterPar - -\def\doGotoPar% - {\ifx\nextchar\blankspace - \let\donext=\GotoPar - \else\ifx\nextchar\endoflinetoken - \let\donext=\GotoPar - \else - \def\donext% - {\the\BeforePar - \BeforePar{}% - \nextchar}% - \fi\fi - \donext} - -\def\GotoPar% - {\afterassignment\doGotoPar\let\nextchar=} - -%D Its big brother \type{\GetPar} redefines the \type{\par} -%D primitive, which can lead to unexpected results, depending -%D in the context. - -\def\GetPar% - {\edef\next% - {\BeforePar - {\the\BeforePar - \BeforePar{}% - \bgroup - \def\par% - {\egroup - \par - \the\AfterPar - \BeforePar{}% - \AfterPar{}}}}% - \next - \GotoPar} - -%D \macros -%D {dowithpargument,dowithwargument} -%D {} -%D -%D The next macros are a variation on \type{\GetPar}. When -%D macros expect an argument, it interprets a grouped sequence -%D of characters a one token. While this adds to robustness and -%D less ambiguous situations, we sometimes want to be a bit -%D more flexible, or at least want to be a bit more tolerant -%D to user input. -%D -%D We start with a commands that acts on paragraphs. This -%D command is called as: -%D -%D \starttypen -%D \dowithpargument\command -%D \dowithpargument{\command ... } -%D \stoptypen -%D -%D In \CONTEXT\ we use this one to read in the titles of -%D chapters, sections etc. The commands responsible for these -%D activities accept several alternative ways of argument -%D passing. In these examples, the \type{\par} can be omitted -%D when an empty line is present. -%D -%D \starttypen -%D \command{...} -%D \command ... \par -%D \command -%D {...} -%D \command -%D ... \par -%D \stoptypen -%D -%D We show two implementations, of which for the moment the -%D we prefier to use the second one: -%D -%D \starttypen -%D \def\dowithpargument#1% -%D {\def\dodowithpargument% -%D {\ifx\next\bgroup -%D \def\next{#1}% -%D \else -%D \def\next####1 \par{#1{####1}}% -%D \fi -%D \next}% -%D \futurelet\next\dodowithpargument} -%D \stoptypen -%D -%D A second and better implementation was: -%D -%D \starttypen -%D \def\dowithpargument#1% -%D {\def\nextpar##1 \par{#1{##1}}% -%D \def\nextarg##1{#1{##1}}% -%D \doifnextcharelse{\bgroup} -%D {\nextarg} -%D {\nextpar}} -%D \stoptypen -%D -%D We ended up with an alternative that also accepts en empty -%D argument. This command permits for instance chapters to -%D have no title. - -\def\dowithpargument#1% - {\def\nextpar##1 \par{#1{##1}}% - \def\nextarg##1{#1{##1}}% - \doifnextcharelse{\bgroup} - {\nextarg} - {\doifnextcharelse{\par} - {#1{}} - {\nextpar}}} - -%D The \type{p} in the previous command stands for paragraph. -%D When we want to act upon words we can use the \type{w} -%D alternative. -%D -%D \starttypen -%D \dowithwargument\command -%D \dowithwargument{... \command ...} -%D \stoptypen -%D -%D The main difference bwteen two alternatives is in the -%D handling of \type{\par}'s. This time the space token acts -%D as a delimiter. -%D -%D \starttypen -%D \command{...} -%D \command ... -%D \command -%D {...} -%D \command -%D ... -%D \stoptypen -%D -%D Again there are two implementations possible: -%D -%D \starttypen -%D \def\dowithwargument#1% -%D {\def\dodowithwargument% -%D {\ifx\next\bgroup -%D \def\next{#1}% -%D \else -%D \def\next####1 {#1{####1}}% -%D \fi -%D \next}% -%D \futurelet\next\dodowithwargument} -%D \stoptypen -%D -%D We've chosen: - -\def\dowithwargument#1% - {\def\nextwar##1 {#1{##1}}% - \def\nextarg##1{#1{##1}}% - \doifnextcharelse{\bgroup} - {\nextarg} - {\nextwar}} - -%D \macros -%D {dorepeat,dorepeatwithcommand} -%D {} -%D -%D When doing repetitive tasks, we stromgly advice to use -%D \type{\dorecurse}. The next alternative however, suits -%D better some of the \CONTEXT\ interface commands. -%D -%D \starttypen -%D \dorepeat[n*\command] -%D \stoptypen -%D -%D The value of the used \COUNTER\ can be called within -%D \type{\command} by \type{\repeater}. -%D -%D A slightly different alternative is: -%D -%D \starttypen -%D \dorepeatwithcommand[n*{...}]\command -%D \stoptypen -%D -%D When we call for something like: -%D -%D \starttypen -%D \dorepeatwithcommand[3*{Hello}]\message -%D \stoptypen -%D -%D we get ourselves three \type{\message{Hello}} messages in -%D a row. In both commands, the \type{n*} is optional. When this -%D specification is missing, the command executes once. - -\long\def\dodorepeat[#1*#2*#3*]% - {\doifelse{#3}{} - {#1} - {\dorecurse{#1}{#2}}} - -\long\def\dorepeat[#1]% - {\dodorepeat[#1***]} - -\def\repeater% - {\recurselevel} - -\def\dorepeatwithcommand[#1]#2% - {\def\p!dorepeatnot% - {#2{#1}}% - \def\p!dorepeatyes[##1*##2]% - {\dorecurse{##1}{#2{##2}}}% - \doifinstringelse{*}{#1} - {\doifnumberelse{#1}{\p!dorepeatyes[#1]}{\p!dorepeatnot}}% - {\p!dorepeatnot}} - -%D \macros -%D {appendtoks,prependtoks,flushtoks,dotoks} -%D {} -%D -%D We use \TOKENLISTS\ sparsely within \CONTEXT, because the -%D comma separated lists are more suitable for the user -%D interface. Nevertheless we have: -%D -%D \starttypen -%D (\doglobal) \appendtoks ... \to\tokenlist -%D (\doglobal) \prependtoks ... \to\tokenlist -%D (\doglobal) \flushtoks\tokenlist -%D \dotoks\tokenlist -%D \stoptypen -%D -%D Er worden eerst enkele klad||registers gedefinieerd. These -%D macros are clones of the ones implemented in page~378 of -%D Knuth's \TeX book. - -\def\appendtoks#1\to#2% - {\scratchtoks={#1}% - \edef\next{\noexpand#2={\the#2\the\scratchtoks}}% - \next - \dodoglobal#2=#2} - -\def\prependtoks#1\to#2% - {\scratchtoks={#1}% - \edef\next{\noexpand#2={\the\scratchtoks\the#2}}% - \next - \dodoglobal#2=#2} - -\def\flushtoks#1% - {\scratchtoks=#1\relax - \dodoglobal#1={}% - \the\scratchtoks\relax} - -\let\dotoks=\the - -%D \macros -%D {makecounter,pluscounter,minuscounter, -%D resetcounter,setcounter,countervalue} -%D {} -%D -%D Declaring, setting and resetting \COUNTERS\ can be doen -%D with the next set of commands. -%D -%D \starttypen -%D \makecounter {name} -%D \pluscounter {name} -%D \minuscounter {name} -%D \resetcounter {name} -%D \setcounter {name} {value} -%D \countervalue {name} -%D \stoptypen -%D -%D We prefer the use of global counters. This means that we -%D have to load \PLAIN\ \TEX\ in a bit different way: -%D -%D \starttypen -%D \let\oldouter=\outer -%D \let\outer=\relax -%D \input plain.tex -%D \let\outer=\oldouter -%D -%D \def\newcount% -%D {\alloc@0\count\countdef\insc@unt} -%D \stoptypen -%D -%D First we show a solution in which we use real \COUNTERS. -%D Apart from some expansion, nothing special is done. -%D -%D \starttypen -%D \def\makecounter#1% -%D {\expandafter\newcount\csname#1\endcsname} -%D -%D \def\pluscounter#1% -%D {\expandafter\global\expandafter\advance\csname#1\endcsname by 1 } -%D -%D \def\minuscounter#1% -%D {\expandafter\global\expandafter\advance\csname#1\endcsname by -1 } -%D -%D \def\resetcounter#1% -%D {\expandafter\global\csname#1\endcsname=0 } -%D -%D \def\setcounter#1#2% -%D {\expandafter\global\csname#1\endcsname=#2 } -%D -%D \def\countervalue#1% -%D {\the\getvalue{#1}} -%D \stoptypen -%D -%D Because these macros are already an indirect way of working -%D with counters, there is no harm in using pseudo \COUNTERS\ -%D here: - -\def\makecounter#1% - {\setxvalue{#1}{0}} - -\def\pluscounter#1% - {\scratchcounter=\getvalue{#1}\relax - \advance\scratchcounter by 1\relax - \setxvalue{#1}{\the\scratchcounter}} - -\def\minuscounter#1% - {\scratchcounter=\getvalue{#1}\relax - \advance\scratchcounter by -1\relax - \setxvalue{#1}{\the\scratchcounter}} - -\def\resetcounter#1% - {\setxvalue{#1}{0}} - -\def\setcounter#1#2% - {\scratchcounter=#2\relax - \setxvalue{#1}{\the\scratchcounter}} - -\def\countervalue#1% - {\getvalue{#1}} - -%D \macros -%D {savecounter,restorecounter} -%D -%D These two commands can be used to save and restore counter -%D values. Only one level is saved. - -\def\savecounter#1% - {\expanded{\setgvalue{!#1}{\getvalue{#1}}}} - -\def\restorecounter#1% - {\expanded{\setgvalue{#1}{\getvalue{!#1}}}} - -%D \macros -%D {beforesplitstring,aftersplitstring} -%D {} -%D -%D These both commands split a string at a given point in two -%D parts, so \type{x.y} becomes \type{x} or \type{y}. -%D -%D \starttypen -%D \beforesplitstring test.tex\at.\to\filename -%D \aftersplitstring test.tex\at.\to\extension -%D \stoptypen -%D -%D The first routine looks (and is indeed) a bit simpler than -%D the second one. The alternative looking more or less like -%D the first one did not always give the results we needed. -%D Both implementations show some insight in the manipulation -%D of arguments. - -\def\beforesplitstring#1\at#2\to#3% - {\def\dosplitstring##1#2##2#2##3\\% - {\def#3{##1}}% - \@EA\dosplitstring#1#2#2\\} - -\def\aftersplitstring#1\at#2\to#3% - {\def\dosplitstring##1#2##2@@@##3\\% - {\def#3{##2}}% - \@EA\dosplitstring#1@@@#2@@@\\} - -%D \macros -%D {removesubstring} -%D {} -%D -%D A first application of the two routines defined above is: -%D -%D \starttypen -%D \removesubstringtest-\from first-last\to\nothyphenated -%D \stoptypen -%D -%D Which in terms of \TEX\ looks like: - -\def\removesubstring#1\from#2\to#3% - {\doifinstringelse{#1}{#2} - {\beforesplitstring#2\at#1\to\!!stringa - \aftersplitstring #2\at#1\to\!!stringb - \edef#3{\!!stringa\!!stringb}% - \def\next{\removesubstring#1\from#3\to#3}} - {\let\next=\relax}% - \next} - -%D \macros -%D {addtocommalist,removefromcommalist} -%D {} -%D -%D When working with comma separated lists, oen sooner or -%D later want the tools to append or remove items from such a -%D list. When we add an item, we first check if it's already -%D there. This means that every item in the list is unique. -%D -%D \starttypen -%D \addtocommalist {alfa} \naam -%D \addtocommalist {beta} \naam -%D \addtocommalist {gamma} \naam -%D \removefromcommalist {beta} \naam -%D \stoptypen -%D -%D These commands can be prefixed with \type{\doglobal}. The -%D implementation of the second command is more complecated, -%D because we have to take leading spaces into account. Keep in -%D mind that useres may provide lists with spaces after the -%D commas. When one item is left, we also have to get rid of -%D trailing spaces. -%D -%D \starttypen -%D \def\words{alfa, beta, gamma, delta} -%D \def\words{alfa,beta,gamma,delta} -%D \stoptypen -%D -%D Removing an item takes more time than adding one. - -\def\addtocommalist#1#2% - {\doifelse{#2}{} - {\dodoglobal\edef#2{#1}} - {\edef\!!stringa{#2,,}% - \beforesplitstring#2\at,,\to#2\relax - \ExpandBothAfter\doifinsetelse{#1}{#2} - {\resetglobal} - {\dodoglobal\edef#2{#2,#1}}}} - -\def\doremovefromcommalist#1#2#3% nog \doglobal - {\edef\!!stringa{,,#3,,}% - \beforesplitstring\!!stringa\at,#1#2,\to\!!stringb - \aftersplitstring\!!stringa\at,#1#2,\to\!!stringc - \edef#3{\!!stringb,\!!stringc}% - \aftersplitstring#3\at,,\to#3\relax - \beforesplitstring#3\at,,\to#3} - -\def\dodofrontstrip[#1#2]#3% - {\ifx#1\space - \def#3{#2}% - \else - \def#3{#1#2}% - \fi}% - -\def\dofrontstrip#1% - {\edef\!!stringa{#1}% - \ifx\!!stringa\empty - \else - \@EA\dodofrontstrip\@EA[#1]#1% - \fi} - -\def\removefromcommalist#1#2% - {\doremovefromcommalist{ }{#1}{#2}% - \doremovefromcommalist{}{#1}{#2}% - \dofrontstrip#2% - \dodoglobal\edef#2{#2}} - -%D \macros -%D {globalprocesscommalist} -%D -%D The commalist processing commands are characterized by the -%D fact that the way they handle expansion as well as the fact -%D that they can be nested. This makes them kind of useless for -%D handling comma lists in alignments. In these situations the -%D next macro can be of use. - -\def\globalprocesscommaitem#1,% - {\if]#1\else - \globalcommacommand{#1}% - \expandafter\globalprocesscommaitem - \fi} - -\def\globalprocesscommalist[#1]#2% - {\global\let\globalcommacommand=#2% - \expandafter\globalprocesscommaitem#1,],} - -%D \macros -%D {withoutunit,withoutpt, -%D PtToCm, -%D numberofpoints,dimensiontocount} -%D {} -%D -%D We can convert point into centimeters with: -%D -%D \starttypen -%D \PtToCm{dimension} -%D \stoptypen -%D -%D Splitting the value and the unit is done by: - -\def\withoutunit#1#2% - {\bgroup - \dimen0=#1\relax - \@EA\convertargument\the\dimen0\to\asciiA - \@EA\convertargument#2\to\asciiB - \@EA\@EA\@EA\beforesplitstring\@EA\asciiA\@EA\at\asciiB\to\!!stringa% - \!!stringa - \egroup} - -\def\withoutpt#1% - {\withoutunit{#1}{pt}} - -\def\withoutcm#1% - {\withoutunit{#1}{cm}} - -%D A bit faster and more robust alternative is one that -%D manipulates the \CATCODES. - -{\catcode`\.=\@@other - \catcode`\p=\@@other - \catcode`\t=\@@other - \gdef\WITHOUTPT#1pt{#1}} - -\def\withoutpt#1% - {\expandafter\WITHOUTPT#1} - -%D The capitals are needed because \type{p} and \type{t} have -%D \CATCODE~12, while macronames only permit tokens with the -%D \CATCODE~11. As a result we cannot use the \type{.group} -%D primitives. Those who want to know more about this kind of -%D manipulations, we advice to study the \TEX book in detail. -%D Because this macro does not do any assignment, we can use it -%D in the following way too. - -\def\PtToCm#1% - {\bgroup - \scratchdimen=#1\relax - \scratchdimen=0.0351459804\scratchdimen % 2.54/72.27 - \withoutpt{\the\scratchdimen}cm% - \egroup} - -%D We also support: -%D -%D \starttypen -%D \numberofpoints {dimension} -%D \dimensiontocount {dimension} {\count} -%D \stoptypen -%D -%D Both macros return a rounded number. - -\def\numberofpoints#1% - {\scratchdimen=#1\relax - \advance\scratchdimen by .5pt\relax - \withoutpt{\the\scratchdimen}} - -\def\dimensiontocount#1#2% - {\scratchdimen=#1\relax - \advance\scratchdimen by .5pt\relax - #2=\scratchdimen - \divide#2 by \!!maxcard\relax} - -%D \macros -%D {swapdimens,swapmacros} -%D {} -%D -%D Simple but effective are the next two macros. There name -%D exactly states their purpose. The \type{\scratchdimen} and -%D \type{\!!stringa} can only be swapped when being the first -%D argument. - -\def\swapdimens#1#2% - {\scratchdimen=#1\relax - \redoglobal#1=#2\relax - \dodoglobal#2=\scratchdimen} - -\def\swapmacros#1#2% - {\let\!!stringa=#1\relax - \let#1=#2\relax - \let#2=\!!stringa\relax} - -%D \macros -%D {setlocalhsize} -%D {} -%D -%D Sometimes we need to work with the \type{\hsize} that is -%D corrected for indentation and left and right skips. The -%D corrected value is available in \type{\localhsize}, which -%D needs to be calculated with \type{\setlocalhsize} first. -%D -%D \starttypen -%D \setlocalhsize \hbox to \localhsize{...} -%D \setlocalhsize[-1em] \hbox to \localhsize{...} -%D \setlocalhsize[.5ex] \hbox to \localhsize{...} -%D \stoptypen -%D -%D These examples show us that an optional can be used. The -%D value provided is added to \type{\localhsize}. - -\newdimen\localhsize - -\def\complexsetlocalhsize[#1]% - {\localhsize=\hsize - \advance\localhsize by -\parindent - \advance\localhsize by -\leftskip - \advance\localhsize by -\rightskip - \advance\localhsize by #1\relax} - -\def\simplesetlocalhsize% - {\complexsetlocalhsize[\!!zeropoint]} - -\definecomplexorsimple\setlocalhsize - -%D \macros -%D {processtokens} -%D {} -%D -%D We fully agree with (most) typogaphers that inter||letter -%D spacing is only permitted in fancy titles, we provide a -%D macro that can be used to do so. Because this is -%D (definitely and fortunately) no feature of \TEX, we have to -%D step through the token list ourselves. -%D -%D \starttypen -%D \processtokens {before} {between} {after} {space} {tokens} -%D \stoptypen -%D -%D An example of a call is: -%D -%D \startbuffer -%D \processtokens {[} {+} {]} {\space} {hello world} -%D \stopbuffer -%D -%D \typebuffer -%D -%D This results in: -%D -%D \haalbuffer -%D -%D The list of tokens may contain spaces, while \type{\\}, -%D \type{{}} and \type{\ } are handled as space too. - -\def\dodoprocesstokens% - {\ifx\next\lastcharacter - \after - \let\next=\relax - \else\ifx\next\bgroup - \def\next% - {\dowithnextbox - {\before\box\nextbox - \let\before=\between - \doprocesstokens} - \hbox\bgroup}% - \else - \expandafter\if\space\next - \before\white - \else - \before\next - \fi - \let\before=\between - \let\next=\doprocesstokens - \fi\fi - \next} - -\def\doprocesstokens% the space after = is essential - {\afterassignment\dodoprocesstokens\let\next= } - -\def\processtokens#1#2#3#4#5% - {\bgroup - \def\lastcharacter{\lastcharacter}% - \def\space{ }% - \let\\=\space - \def\before{#1}% - \def\between{#2}% - \def\after{#3}% - \def\white{#4}% - \doprocesstokens#5\lastcharacter - \egroup} - -%D \macros -%D {doifvalue,doifnotvalue,doifelsevalue, -%D doifnothing,doifsomething,doifelsenothing, -%D doifvaluenothing,doifvaluesomething,doifelsevaluenothing} -%D {} -%D -%D These long named \type{\if} commands can be used to access -%D macros (or variables) that are normally accessed by using -%D \type{\getvalue}. Using these alternatives safes us three -%D tokens per call. Anyone familiar with the not||values -%D ones, can derive their meaning from the definitions. - - \def\doifvalue#1{\doif{\getvalue{#1}}} - \def\doifnotvalue#1{\doifnot{\getvalue{#1}}} - \def\doifelsevalue#1{\doifelse{\getvalue{#1}}} - - \def\doifnothing#1{\doif{#1}{}} - \def\doifsomething#1{\doifnot{#1}{}} - \def\doifelsenothing#1{\doifelse{#1}{}} - - \def\doifvaluenothing#1{\doif{\getvalue{#1}}{}} - \def\doifvaluesomething#1{\doifnot{\getvalue{#1}}{}} -\def\doifelsevaluenothing#1{\doifelse{\getvalue{#1}}{}} - -%D \macros -%D {DOIF,DOIFELSE,DOIFNOT} -%D {} -%D -%D \TEX\ is case sensitive. When comparing arguments, this -%D feature sometimes is less desirable, for instance when we -%D compare filenames. The next three alternatives upcase their -%D arguments before comparing them. -%D -%D \starttypen -%D \DOIF {string1} {string2} {...} -%D \DOIFNOT {string1} {string2} {...} -%D \DOIFELSE {string1} {string2} {then ...}{else ...} -%D \stoptypen -%D -%D We have to use a two||step implementation, because the -%D expansion has to take place outside \type{\uppercase}. - -\def\p!DOIF#1#2#3% - {\uppercase{\ifinstringelse{$#1$}{$#2$}}% - #3% - \fi} - -\def\p!DOIFNOT#1#2#3% - {\uppercase{\ifinstringelse{$#1$}{$#2$}}% - \else - #3% - \fi} - -\def\p!DOIFELSE#1#2#3#4% - {\uppercase{\ifinstringelse{$#1$}{$#2$}}% - #3% - \else - #4% - \fi} - -\def\DOIF {\ExpandBothAfter\p!DOIF} -\def\DOIFNOT {\ExpandBothAfter\p!DOIFNOT} -\def\DOIFELSE {\ExpandBothAfter\p!DOIFELSE} - -%D \macros -%D {stripcharacters,stripspaces} -%D {} -%D -%D The next command was needed first when we implemented -%D the \CONTEXT\ interactivity macros. When we use labeled -%D destinations, we often cannot use all the characters we -%D want. We therefore strip some of the troublemakers, like -%D spaces, from the labels before we write them to the -%D \DVI||file, which passes them to for instance a PostScript -%D file. -%D -%D \starttypen -%D \stripspaces\from\one\to\two -%D \stoptypen -%D -%D Both the old string \type{\one} and the new one \type{\two} -%D are expanded. This command is a special case of: -%D -%D \starttypen -%D \stripcharacter\char\from\one\to\two -%D \stoptypen -%D -%D As we can see below, spaces following a control sequence are -%D to enclosed in \type{{}}. - -\def\stripcharacter#1\from#2\to#3% - {\def\dostripcharacter##1#1##2\end% - {\edef\p!strippedstring{\p!strippedstring##1}% - \doifemptyelse{##2} - {\let\next=\relax} - {\def\next{\dostripcharacter##2\end}}% - \next}% - \let\p!strippedstring=\empty - \edef\!!stringa{#2}% - \@EA\dostripcharacter\!!stringa#1\end - \let#3=\p!strippedstring} - -\def\stripspaces\from#1\to#2% - {\stripcharacter{ }\from#1\to#2} - -%D \macros -%D {executeifdefined} -%D {} -%D -%D \CONTEXT\ uses one auxiliary file for all data concerning -%D tables of contents, references, two||pass optimizations, -%D sorted lists etc. This file is loaded as many times as -%D needed. During such a pass we skip the commands thate are of -%D no use at that moment. Because we don't want to come into -%D trouble with undefined auxiliary commands, we call the -%D macros in a way similar to \type{\getvalue}. The next macro -%D take care of such executions and when not defined, gobbles -%D the unwanted arguments. -%D -%D \starttypen -%D \executeifdefined{name}\gobbleoneargument -%D \stoptypen -%D -%D We can of course globble more arguments using the -%D appropriate globbling command. - -\def\executeifdefined#1#2% - {\ifundefined{#1}% - \def\next{#2}% - \else - \def\next{\getvalue{#1}}% - \fi - \next} - -%D We considered an alternative imlementation accepting -%D commands directly, like: -%D -%D \starttypen -%D \executeifdefined\naam\gobblefivearguments -%D \stoptypen -%D -%D For the moment we don't need this one, so we stick to the -%D faster one. The more versatile alternative is: -%D -%D \starttypen -%D \def\executeifdefined#1#2% -%D {\setnameofcommand{#1}% -%D \@EA\ifundefined\@EA{\nameofcommand} -%D \def\next{#2}% -%D \else -%D \def\next{\getvalue{\nameofcommand}}% -%D \fi -%D \next} -%D \stoptypen - -%D \macros -%D {doifsomespaceelse} -%D {} -%D -%D The next command checks a string on the presence of a space -%D and executed a command accordingly. -%D -%D \starttypen -%D \doifsomespaceelse {tekst} {then ...} {else ...} -%D \stoptypen -%D -%D We use this command in \CONTEXT\ for determing if an -%D argument must be broken into words when made interactive. -%D Watch the use of \type{\noexpand}. - -\long\def\doifsomespaceelse#1#2#3% - {\def\c!doifsomespaceelse##1 ##2##3\war% - {\if\noexpand##2@% - #3% - \else - #2% - \fi}% - \c!doifsomespaceelse#1 @ @\war} - -%D \macros -%D {adaptdimension,balancedimensions} -%D {} -%D -%D Again we introduce some macros that are closely related to -%D an interface aspect of \CONTEXT. The first command can be -%D used to adapt a \DIMENSION. -%D -%D \starttypen -%D \adaptdimension {dimension} {value} -%D \stoptypen -%D -%D When the value is preceed by a \type{+} or minus, the -%D dimension is advanced accordingly, otherwise it gets the -%D value. - -\def\doadaptdimension#1#2\\#3\\% - {\if#1+% - \dodoglobal\advance#3 by #1#2\relax - \else\if##1-% - \dodoglobal\advance#3 by #1#2\relax - \else - \dodoglobal#3=#1#2\relax - \fi\fi} - -\def\adaptdimension#1#2% - {\expandafter\doadaptdimension#2\\#1\\} - -%D A second command takes two \DIMENSIONS. Both are adapted, -%D depending on the sign of the given value. -%D maat. This time we take the value as it is, and don't look -%D explicitly at the preceding sign. -%D -%D \starttypen -%D \balancedimensions {dimension 1} {dimension 2} {value} -%D \stoptypen -%D -%D When a positive value is given, the first dimension is -%D incremented, the second ond is decremented. A negative value -%D has the opposite result. - -\def\balancedimensions#1#2#3% - {\scratchdimen=#3\relax - \redoglobal\advance#1 by \scratchdimen\relax - \dodoglobal\advance#2 by -\scratchdimen\relax} - -%D Both commands can be preceded by \type{\doglobal}. Here we -%D use \type{\redo} first, because \type{\dodo} resets the -%D global character. - -%D \macros -%D {processconcanatedlist} -%D {} -%D -%D Maybe a bit late, but here is a more general version of the -%D \type{\processcommalist} command. This time we don't handle -%D nesting but accept arbitrary seperators. -%D -%D \starttypen -%D \processconcanatedlist[list][separator]\command -%D \stoptypen -%D -%D One can think of things like: -%D -%D \starttypen -%D \processconcanatedlist[alfa+beta+gamma][+]\message -%D \stoptypen - -\def\processconcanatedlist[#1][#2]#3% - {\def\doprocessconcanatedlist##1##2#2% - {\if]##1% - \let\next=\relax - \else\if]##2% - \let\next=\relax - \else\ifx\blankspace##2% - #3{##1}% - \let\next=\doprocessconcanatedlist - \else - #3{##1##2}% - \let\next=\doprocessconcanatedlist - \fi\fi\fi - \next}% - \doprocessconcanatedlist#1#2]#2} - -%D \macros -%D {processassignlist} -%D {} -%D -%D Is possible to combine an assignment list with one -%D containing keywords. Assignments are treated accordingly, -%D keywords are treated by \type{\command}. -%D -%D \starttypen -%D \processassignlist[...=...,...=...,...]\commando -%D \stoptypen -%D -%D This command can be integrated in \type{\getparameters}, but -%D we decided best not to do so. - -\def\processassignlist#1[#2]#3% - {\def\p!dodogetparameter[##1=##2=##3]% - {\doifnot{##3}{\relax}{#3{##1}}}% - \def\p!dogetparameter##1% - {\p!dodogetparameter[##1==\relax]}% - \processcommalist[#2]\p!dogetparameter} - -%D \macros -%D {DoAfterFi,DoAfterFiFi} -%D {} -%D -%D Sometimes \type{\fi}'s can get into the way. We can reach -%D over such a troublemaker with: -%D -%D \starttypen -%D \DoAfterFi{some commands} -%D \DoAfterFiFi{some commands} -%D \stoptypen -%D -%D It saves us a \type{\next} construction. Skipping -%D \type{\else...\fi} is more tricky, so this one is not -%D provided. - -\def\DoAfterFi#1\fi{\fi#1} -\def\DoAfterFiFi#1\fi#2\fi{\fi\fi#1} - -%D \macros -%D {untextargument -%D untexcommand} -%D -%D When manipulating data(bases) and for instance generating -%D index entries, the next three macros can be of help: -%D -%D \starttypen -%D \untextargument{...}\to\name -%D \untexcommand {...}\to\name -%D \stoptypen -%D -%D They remove braces and backslashes and give us something to -%D sort. - -\def\untexsomething% - {\bgroup - \catcode`\{=\@@ignore - \catcode`\}=\@@ignore - \escapechar=-1 - \dountexsomething} - -\long\def\dountexsomething#1#2\to#3% - {\doglobal#1#2\to\untexedargument - \egroup - \let#3=\untexedargument} - -\def\untexargument% - {\untexsomething\convertargument} - -\def\untexcommand% - {\untexsomething\convertcommand} - -%D \macros -%D {ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints} -%D -%D One characteristic of \POSTSCRIPT\ and \PDF\ is that both -%D used big points (\TEX's bp). The next macros convert points -%D and scaled points into big points. -%D -%D \starttypen -%D \ScaledPointsToBigPoints {number} \target -%D \ScaledPointsToWholeBigPoints {number} \target -%D \stoptypen -%D -%D The magic factor $72/72.27$ can be found in most \TEX\ -%D related books. - -\def\ScaledPointsToBigPoints#1#2% - {\scratchdimen=#1sp\relax - \scratchdimen=.996264\scratchdimen - \edef#2{\withoutpt{\the\scratchdimen}}} - -\def\ScaledPointsToWholeBigPoints#1#2% - {\scratchdimen=#1sp\relax - \scratchdimen=.996264\scratchdimen - \scratchcounter=\scratchdimen - \advance\scratchcounter by \!!medcard - \divide\scratchcounter by \!!maxcard - \edef#2{\the\scratchcounter}} - -%D \macros -%D {PointsToReal} -%D -%D Points can be stripped from their suffix by using -%D \type{\withoutpt}. The next macro enveloppes this macro. -%D -%D \starttypen -%D \PointsToReal {dimension} \target -%D \stoptypen - -\def\PointsToReal#1#2% - {\scratchdimen=#1% - \edef#2{\withoutpt{\the\scratchdimen}}} - -%D \macros -%D {dontleavehmode} -%D -%D Sometimes when we enter a paragraph with some command, the -%D first token gets the whole first line. We can prevent this -%D by saying: -%D -%D \starttypen -%D \dontleavehmode -%D \stoptypen -%D -%D This command is used in for instance the language module -%D \type{lang-ini}. - -\def\dontleavehmode{\ifmmode\else$ $\fi} - -%D \macros -%D {handletokens} -%D -%D With the next macro we enter a critical area of macro -%D expansion. What we want is a macro that looks like: -%D -%D \starttypen -%D \handletokens some tokens\with \somemacro -%D \stoptypen -%D -%D At first sight the next implementation will suffice, but -%D running this one shows that we loose the spaces. This is no -%D surprise because we grab arguments and spaces preceding those -%D are just ignored. -%D -%D \starttypen -%D \def\nohandletokens#1\end% -%D {} -%D -%D \def\dohandletokens#1#2\end% -%D {\ifx#1\endoftoken -%D \expandafter\nohandletokens -%D \else -%D \docommando{#1}% -%D \expandafter\dohandletokens -%D \fi -%D #2\end} -%D -%D \long\def\handletokens#1\with#2% -%D {\let\docommando=#2\relax -%D \dohandletokens#1\endoftoken\end} -%D \stoptypen -%D -%D A second approach therefore grabs the indicidual characters -%D by using \type{\afterassignment}, in which case the space is -%D read in as space. -%D -%D \starttypen -%D \def\dodohandletokens% -%D {\ifx\next\end \else -%D \docommando\next -%D \expandafter\dohandletokens -%D \fi} -%D -%D \def\dohandletokens% -%D {\afterassignment\dodohandletokens\let\next= } -%D -%D \long\def\handletokens#1\with#2% -%D {\let\docommando=#2% -%D \dohandletokens#1\end} -%D \stoptypen - -%D \macros -%D {counttoken} -%D -%D For the few occasion sthat we want to know the number of -%D specific tokens in a string, we can use: -%D -%D \starttypen -%D \counttoken token\in string\to \count -%D \stoptypen -%D -%D This macro, that for instance is used in \type{cont-tab}, -%D takes a real counter. The macro can be preceded by \type -%D {\doglobal}. - -\def\counttoken#1\in#2\to#3% - {\redoglobal#3=0 - \def\!!stringa{#1}% - \def\!!stringb{\end}% - \def\docounttoken##1% obeys {} - {\def\!!stringc{##1}% - \ifx\!!stringb\!!stringc \else - \ifx\!!stringa\!!stringc - \dodoglobal\advance#3 by 1 - \fi - \expandafter\docounttoken - \fi}% - \docounttoken#2\end - \resetglobal} - -%D \macros -%D {splitofftokens} -%D -%D Running this one not always gives the expected results. -%D Consider for instance the macro for which I originally -%D wrote this token handler. - -\long\def\splitofftokens#1\from#2\to#3% - {\ifnum#1>0 - \scratchcounter=#1\relax - \def\dosplitofftokens##1% - {\ifnum\scratchcounter>0 - \advance\scratchcounter by -1 - \edef#3{#3##1}% - \fi}% - % \let#3=\empty % #3 can be #2, so: - \@EA\let\@EA#3\@EA\empty - \@EA\handletokens#2\with\dosplitofftokens - \else - \edef#3{#2}% - \fi} - -%D This macro can be called like: -%D -%D \startbuffer[example] -%D \splitofftokens10\from01234567 890123456789\to\test [\test] -%D \stopbuffer -%D -%D However, the characters that we expect to find in -%D \type{\test} just don;t show up there. The reason for this -%D is not that logical but follows from \TEX's sometimes -%D mysterious way of expanding. Look at this: -%D -%D \startbuffer[next] -%D \def\next{a} \edef\test{\next} [\test] -%D \let\next=b \edef\test{\test\next} [\test] -%D \let\next=c \edef\test{\next} [\test] -%D \let\next=d \edef\test{\test\next} [\test] -%D \let\next=e \@EA\edef\@EA\test\@EA{\test\next} [\test] -%D \stopbuffer -%D -%D \typebuffer[next] -%D -%D Careful reading shows that inside an \type{\edef} macro's -%D that are \type{\let} are not expanded! -%D -%D \unprotect\haalbuffer[next]\protect -%D -%D That's why we finally end up with a macro that looks ahead -%D by using an assignment, this time by using -%D \type{\futurelet}, and grabbing an argument as well. That -%D way we can handle both the sentinal and the blank space. - -\def\dodohandletokens#1% - {\ifx\next\blankspace - \dododohandletokens{ }% - \fi - \ifx#1\end \else - \dododohandletokens{#1}% - \expandafter\dohandletokens - \fi} - -\def\dohandletokens% - {\futurelet\next\dodohandletokens} - -\long\def\handletokens#1\with#2% - {\global\let\dododohandletokens=#2% - \dohandletokens#1\end} - -%D A previous version said \type{\docommando=#2}, but to enable -%D use in alignments, I decided to use another placeholder, one -%D that is not sensitive to the global assignment. - -%D So our example finaly shows up as: -%D -%D \haalbuffer[example] - -% %D \macros -% %D {iftrialtypesetting} -% %D -% %D The next boolean is at first sight a strange one. Sometimes -% %D one does a trial typesetting run, for instance to determine -% %D dimensions. Some mechanisms, like object inclusion, can fail -% %D on such trials. Temporary setting the next boolean to true, -% %D helps a lot. -% -% \newif\iftrialtypesetting - -%D \macros -%D {startlocal, startglobal} -%D -%D The next four macros are rather self explaining: -%D -%D \starttypen -%D \startlocal -%D whatever assignments -%D \stoplocal -%D -%D \startglobal -%D whatever assignments -%D \stopglobal -%D \stoptypen -%D -%D These macros are meant for those who know the difference -%D between local and global assignments and are aware of the -%D possible unwanted side effect - -\def\dostartglobaldefs#1#2% - {\edef\!!stringa{\the\globaldefs}% - \ifnum\globaldefs#10 - \globaldefs=-\globaldefs - \fi - \advance\globaldefs by #21 - \setevalue{@gd@\the\globaldefs}{\!!stringa}} - -\def\dostopglobaldefs% - {\doifdefinedelse{@gd@\the\globaldefs} - {\globaldefs=\getvalue{@gd@\the\globaldefs}\relax} - {\globaldefs=0\relax}} - -\def\startlocal {\dostartglobaldefs>-} -\def\stoplocal {\dostopglobaldefs} -\def\startglobal {\dostartglobaldefs<+} -\def\stopglobal {\dostopglobaldefs} - -\protect - -\endinput +%D \module
+%D [ file=syst-ext,
+%D version=1995.10.10,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Extras,
+%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 System Macro's / Extras}
+
+%D In this second system module, we continue the definition of
+%D some handy commands.
+
+\unprotect
+
+%D \macros
+%D {doglobal,
+%D redoglobal,dodoglobal,resetglobal}
+%D
+%D The two macros \type{\redoglobal} and \type{\dodoglobal} are
+%D used in this and some other modules to enforce a user
+%D specified \type{\doglobal} action. The last and often only
+%D global assignment in a macro is done with
+%D \type{\dodoglobal}, but all preceding ones with
+%D \type{\redoglobal}. When using only alternatives, one can
+%D reset this mechanism with \type{\resetglobal}.
+
+\def\doglobal%
+ {\let\redoglobal\global
+ \def\dodoglobal%
+ {\resetglobal\global}}
+
+\def\resetglobal%
+ {\let\redoglobal\relax
+ \let\dodoglobal\relax}
+
+\resetglobal
+
+%D New:
+
+\def\doglobal%
+ {\ifx\redoglobal\relax
+ \let\redoglobal\global
+ \def\dodoglobal{\resetglobal\global}%
+ \else
+ \writestatus{system}{global not reset, warn me!}%
+ \fi}
+
+\def\saveglobal
+ {\let\@@dodoglobal\dodoglobal
+ \let\@@redoglobal\redoglobal}
+
+\def\restoreglobal
+ {\let\dodoglobal\@@dodoglobal
+ \let\redoglobal\@@redoglobal}
+
+%D A very useful application of this macro is \type{\newif},
+%D \TEX's fake boolean type. Not being a primitive,
+%D \type{\global} hopelessly fails here. But a slight
+%D adaption of Knuth's original macro permits:
+%D
+%D \starttypen
+%D \doglobal\newif\iftest
+%D \stoptypen
+%D
+%D Of course one can still say:
+%D
+%D \starttypen
+%D \global\testtrue
+%D \global\testfalse
+%D \stoptypen
+%D
+%D Apart from the prefixes, a few more \type{\expandafters}
+%D are needed:
+
+\def\newif#1%
+ {\count@\escapechar
+ \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \redoglobal\expandafter\expandafter\expandafter
+ \edef\@if#1{true}{\let\noexpand#1\noexpand\iftrue}%
+ \expandafter\expandafter\expandafter
+ \redoglobal\expandafter\expandafter\expandafter
+ \edef\@if#1{false}{\let\noexpand#1\noexpand\iffalse}%
+ \dodoglobal\@if#1{false}%
+ \escapechar\count@}
+
+%D \macros
+%D {newcounter,
+%D increment,decrement}
+%D {}
+%D
+%D Unfortunately the number of \COUNTERS\ in \TEX\ is limited,
+%D but fortunately we can store numbers in a macro. We can
+%D increment such pseudo \COUNTERS\ with \type{\increment}.
+%D
+%D \starttypen
+%D \increment(\counter,20)
+%D \increment(\counter,-4)
+%D \increment(\counter)
+%D \increment\counter
+%D \stoptypen
+%D
+%D After this sequence of commands, the value of
+%D \type{\counter} is 20, 16, 17 and~18. Of course there is
+%D also the complementary command \type{\decrement}.
+%D
+%D Global assignments are possible too, using \type{\doglobal}:
+%D
+%D \starttypen
+%D \doglobal\increment\counter
+%D \stoptypen
+%D
+%D When \type{\counter} is undefined, it's value is initialized
+%D at~0. It is nevertheless better to define a \COUNTER\
+%D explicitly. One reason could be that the \COUNTER\ can be
+%D part of a test with \type{\ifnum} and this conditional does
+%D not accept undefined macro's. The \COUNTER\ in our example
+%D can for instance be defined with:
+%D
+%D \starttypen
+%D \newcounter\counter
+%D \stoptypen
+%D
+%D The command \type{\newcounter} must not be confused with
+%D \type{\newcount}! Of course this mechanism is much slower
+%D than using \TEX's \COUNTERS\ directly. In practice
+%D \COUNTERS\ (and therefore our pseudo counters too) are
+%D seldom the bottleneck in the processing of a text. Apart
+%D from some other incompatilities we want to mention a pitfal
+%D when using \type{\ifnum}.
+%D
+%D \starttypen
+%D \ifnum\normalcounter=\pseudocounter \doif \else \doelse \fi
+%D \ifnum\pseudocounter=\normalcounter \doif \else \doelse \fi
+%D \stoptypen
+%D
+%D In the first test, \TEX\ continues it's search for the
+%D second number after reading \type{\pseudocounter}, while
+%D in the second test, it stops reading after having
+%D encountered a real one. Tests like the first one therefore
+%D can give unexpected results, for instance execution
+%D of \type{\doif} even if both numbers are unequal.
+
+\def\newcounter#1%
+ {\dodoglobal\def#1{0}}
+
+\def\dodododoincrement(#1,#2)%
+ {\ifx#1\undefined
+ \redoglobal\def#1{0}%
+ \fi
+ \scratchcounter=#2\relax
+ \scratchcounter=\incrementsign\scratchcounter
+ \advance\scratchcounter by #1\relax
+ \dodoglobal\edef#1{\the\scratchcounter}}
+
+\def\dododoincrement#1%
+ {\dodododoincrement(#1,1)}
+
+\def\dodoincrement(#1%
+ {\doifnextcharelse{,}
+ {\dodododoincrement(#1}
+ {\dodododoincrement(#1,1}}
+
+\def\doincrement#1%
+ {\def\incrementsign{#1}%
+ \doifnextcharelse{(}
+ {\dodoincrement}
+ {\dododoincrement}}
+
+\def\increment%
+ {\doincrement+}
+
+\def\decrement%
+ {\doincrement-}
+
+%D \macros
+%D {newsignal}
+%D
+%D When writing advanced macros, we cannot do without
+%D signaling. A signal is a small (invisible) kern or penalty
+%D that signals the next macro that something just happened.
+%D This macro can take any action depending onthe previous
+%D signal. Signals must be unique and the next macro takes care
+%D of that.
+%D
+%D \starttypen
+%D \newsignal\somesignal
+%D \stoptypen
+%D
+%D Signals old dimensions and can be used in skips, kerns and
+%D tests like \type{\ifdim}.
+
+\newdimen\currentsignal
+
+\def\newsignal#1%
+ {\advance\currentsignal by 0.00025pt
+ \edef#1{\the\currentsignal}}
+
+%D \macros
+%D {newskimen}
+%D
+%D \TEX\ offers 256 \DIMENSIONS\ and \SKIPS. Unfortunately this
+%D amount is too small to suit certain packages. Therfore when
+%D possible one should use
+%D
+%D \starttypen
+%D \newskimen\tempskimen
+%D \stoptypen
+%D
+%D This commands allocates a \DIMENSION\ or a \SKIP, depending
+%D on the availability. One should be aware of the difference
+%D between both. When searching for some glue \TEX\ goes on
+%D searching till it's sure that no other glue component if
+%D found. This search can be canceled by using \type{\relax}
+%D when possible and needed.
+
+\def\newskimen#1%
+ {\ifx#1\undefined
+ \ifnum\count11>\count12
+ \newskip#1\relax
+ \else
+ \newdimen#1\relax
+ \fi
+ \fi}
+
+%D \macros
+%D {strippedcsname}
+%D {}
+%D
+%D The next macro can be very useful when using \type{\csname}
+%D like in:
+%D
+%D \starttypen
+%D \csname if\strippedcsname\something\endcsname
+%D \stoptypen
+%D
+%D This expands to \type{\ifsomething}.
+
+\def\strippedcsname%
+ {\expandafter\gobbleoneargument\string}
+
+%D \macros
+%D {newconditional,
+%D settrue, setfalse,
+%D ifconditional}
+%D {}
+%D
+%D \TEX's lacks boolean variables, although the \PLAIN\ format
+%D implements \type{\newif}. The main disadvantage of this
+%D scheme is that it takes three hash table entries. A more
+%D memory saving alternative is presented here. A conditional
+%D is defined by:
+%D
+%D \starttypen
+%D \newconditional\doublesided
+%D \setfalse
+%D
+%D Setting a conditional is done by \type{\settrue} and
+%D \type{\setfalse}:
+%D
+%D \starttypen
+%D \settrue\doublesided
+%D \setfalse
+%D
+%D while testing is accomplished by:
+%D
+%D \starttypen
+%D \ifconditional\doublesided ... \else ... \fi
+%D \setfalse
+%D
+%D We cannot use the simple scheme:
+%D
+%D \starttypen
+%D \def\settrue#1{\let#1=\iftrue}
+%D \def\settrue#1{\let#1=\iffalse}
+%D \stoptypen
+%D
+%D Such an implementation gives problems with nested
+%D conditionals. The next implementation is abaou as fast
+%D and just as straightforward:
+
+\def\settrue#1%
+ {\chardef#1=0 }
+
+\def\setfalse#1%
+ {\chardef#1=1 }
+
+\let\newconditional = \setfalse
+\let\ifconditional = \ifcase
+
+%D \macros
+%D {dorecurse,recurselevel,recursedepth
+%D dostepwiserecurse,
+%D for}
+%D
+%D \TEX\ does not offer us powerfull for||loop mechanisms. On
+%D the other hand its recursion engine is quite unique. We
+%D therefore identify the for||looping macros by this method.
+%D The most simple alternative is the one that only needs a
+%D number.
+%D
+%D \starttypen
+%D \dorecurse {n} {whatever we want}
+%D \stoptypen
+%D
+%D This macro can be nested without problems and therefore be
+%D used in situations where \PLAIN\ \TEX's \type{\loop} macro
+%D ungracefully fails. The current value of the counter is
+%D available in \type{\recurselevel}, before as well as after
+%D the \typ{whatever we wat} stuff.
+%D
+%D \starttypen
+%D \dorecurse % inner loop
+%D {10}
+%D {\recurselevel: % outer value
+%D \dorecurse % inner loop
+%D {\recurselevel} % outer value
+%D {\recurselevel} % inner value
+%D \dorecurse % inner loop
+%D {\recurselevel} % outer value
+%D {\recurselevel} % inner value
+%D \endgraf}
+%D \stoptypen
+%D
+%D In this example the first, second and fourth
+%D \type{\recurselevel} concern the outer loop, while the third
+%D and fifth one concern the inner loop. The depth of the
+%D nesting is available for inspection in \type{\recursedepth}.
+%D
+%D Both \type{\recurselevel} and \type{\recursedepth} are
+%D macros. The real \COUNTERS\ are hidden from the user because
+%D we don't want any interference.
+
+\def\@@irecurse{@@irecurse} % stepper
+\def\@@nrecurse{@@nrecurse} % number of steps
+\def\@@srecurse{@@srecurse} % step
+\def\@@drecurse{@@drecurse} % direction, < or >
+\def\@@arecurse{@@arecurse} % action
+
+\newcount\outerrecurse
+\newcount\innerrecurse
+
+\def\recursedepth%
+ {\the\outerrecurse}
+
+\long\def\dostepwiserecurse#1#2#3#4%
+ {\ifnum#2=0
+ \def\recurselevel{0}%
+ \let\next\relax
+ \else
+ \global\advance\outerrecurse by 1
+ \innerrecurse=#1\setevalue{\@@irecurse\recursedepth}{\the\innerrecurse}%
+ \innerrecurse=#2\setevalue{\@@nrecurse\recursedepth}{\the\innerrecurse}%
+ \innerrecurse=#3\setevalue{\@@srecurse\recursedepth}{\the\innerrecurse}%
+ \ifnum#3>0\relax\ifnum#2<#1\relax
+ \else
+ \setevalue{\@@drecurse\recursedepth}{>}%
+ \long\setvalue{\@@arecurse\recursedepth}{#4}%
+ \let\next\dodorecurse
+ \fi\fi
+ \ifnum#3<0\relax\ifnum#1<#2\relax
+ \else
+ \setevalue{\@@drecurse\recursedepth}{<}%
+ \long\setvalue{\@@arecurse\recursedepth}{#4}%
+ \let\next\dodorecurse
+ \fi\fi
+ \fi
+ \next}
+
+\def\donorecurse%
+ {}
+
+\def\dodonorecurse%
+ {\global\advance\outerrecurse by -1\relax}
+
+\def\dododorecurse%
+ {\edef\recurselevel{\getvalue{\@@irecurse\recursedepth}}%
+ \getvalue{\@@arecurse\recursedepth}%
+ \edef\recurselevel{\getvalue{\@@irecurse\recursedepth}}%
+ \innerrecurse=\recurselevel
+ \advance\innerrecurse by \getvalue{\@@srecurse\recursedepth}\relax
+ \setevalue{\@@irecurse\recursedepth}{\the\innerrecurse}%
+ \dodorecurse}
+
+\def\dodorecurse%
+ {\ifnum\getvalue{\@@irecurse\recursedepth}
+ \getvalue{\@@drecurse\recursedepth}
+ \getvalue{\@@nrecurse\recursedepth}\relax
+ \expandafter\dodonorecurse
+ \else
+ \expandafter\dododorecurse
+ \fi}
+
+\def\dorecurse#1%
+ {\dostepwiserecurse{1}{#1}{1}}
+
+%D For those we like to offer visual beauty for efficiency we
+%D say however:\voetnoot{In this kind of macro's we tend to
+%D minimalize the overhead.}
+
+\def\dodorecurse%
+ {\ifnum\getvalue{\@@irecurse\recursedepth}
+ \getvalue{\@@drecurse\recursedepth}
+ \getvalue{\@@nrecurse\recursedepth}\relax
+ \global\advance\outerrecurse by -1
+ \else
+ \expandafter\dododorecurse
+ \fi}
+
+%D As we can see here, the simple command \type{\dorecurse} is
+%D a special case of the more general:
+%D
+%D \starttypen
+%D \dostepwiserecurse {from} {to} {step} {action}
+%D \stoptypen
+%D
+%D This commands accepts positive and negative steps. Illegal
+%D values are handles as good as possible and the macro accepts
+%D numbers and \COUNTERS.
+%D
+%D \starttypen
+%D \dostepwiserecurse {1} {10} {2} {...}
+%D \dostepwiserecurse {10} {1} {-2} {...}
+%D \stoptypen
+%D
+%D The third alternative looks a bit different and uses a
+%D pseudo counter. When this macro is nested, we have to use
+%D different counters. This time we use keywords.
+%D
+%D \starttypen
+%D \def\alfa{2} \def\beta{100} \def\gamma{3}
+%D
+%D \for \n=55 \to 100 \step 1 \do {... \n ...}
+%D \for \n=\alfa \to \beta \step \gamma \do {... \n ...}
+%D \for \n=\n \to 120 \step 1 \do {... \n ...}
+%D \for \n=120 \to 100 \step -3 \do {... \n ...}
+%D \for \n=55 \to 100 \step 2 \do {... \n ...}
+%D \stoptypen
+%D
+%D Only in the third example we need to predefine \type{\n}.
+%D The use of \type{\od} as a dilimiter would have made nested
+%D use more problematic.
+
+\def\for#1=#2\to#3\step#4\do#5%
+ {\dostepwiserecurse{#2}{#3}{#4}
+ {\edef#1{\recurselevel}%
+ #5%
+ \edef#1{\recurselevel}}}
+
+%D \macros
+%D {doloop,exitloop}
+%D {}
+%D
+%D Sometimes loops are not determined by counters, but by
+%D (a combinations of) conditions. We therefore implement a
+%D straightforward loop, which can only be left when we
+%D explictly exit it. Nesting is supported. First we present
+%D a more extensive alternative.
+%D
+%D \starttypen
+%D \doloop
+%D {Some kind of typesetting punishment \par
+%D \ifnum\pageno>100 \exitloop \fi}
+%D \stoptypen
+%D
+%D When needed, one can call for \type{\looplevel} and
+%D \type{\loopdepth}.
+%D
+%D If we write this macros from scratch, we end up with
+%D something like the ones described above:
+%D
+%D \starttypen
+%D \def\@@eloop{@@eloop} % exit
+%D \def\@@iloop{@@iloop} % stepper
+%D \def\@@aloop{@@aloop} % action
+%D
+%D \newcount\outerloop
+%D
+%D \def\loopdepth%
+%D {\the\outerloop}
+%D
+%D \def\exitloop%
+%D {\setevalue{\@@eloop\loopdepth}{0}}
+%D
+%D \long\def\doloop#1%
+%D {\global\advance\outerloop by 1
+%D \setevalue{\@@iloop\loopdepth}{1}%
+%D \setevalue{\@@eloop\loopdepth}{1}%
+%D \long\setvalue{\@@aloop\loopdepth}{#1}%
+%D \dodoloop}
+%D
+%D \def\dodonoloop%
+%D {\global\advance\outerloop by -1\relax}
+%D
+%D \def\dododoloop%
+%D {\edef\looplevel{\getvalue{\@@iloop\loopdepth}}%
+%D \innerrecurse=\looplevel
+%D \advance\innerrecurse by 1
+%D \setevalue{\@@iloop\loopdepth}{\the\innerrecurse}%
+%D \getvalue{\@@aloop\loopdepth}%
+%D \edef\looplevel{\getvalue{\@@iloop\loopdepth}}%
+%D \dodoloop}
+%D
+%D \def\dodoloop%
+%D {\ifnum\getvalue{\@@eloop\loopdepth}=0
+%D \expandafter\dodonoloop
+%D \else
+%D \expandafter\dododoloop
+%D \fi}
+%D
+%D \def\doloop%
+%D {\dostepwiserecurse{1}{\maxdimen}{1}}
+%D
+%D \def\exitloop
+%D {\setvalue{\@@irecurse\recursedepth}{\maxdimen}}
+%D
+%D \def\looplevel{\recurselevel}
+%D \def\loopdepth{\recursedepth}
+%D \stoptypen
+%D
+%D We prefer however a more byte saving implementation, that
+%D executes of course a bit slower.
+
+\def\doloop%
+ {\dostepwiserecurse{1}{\maxdimen}{1}}
+
+\def\exitloop
+ {\setvalue{\@@irecurse\recursedepth}{\maxdimen}}
+
+%D We don't declare new counters for \type{\looplevel} and
+%D \type{\loopdepth} because one can use \type{\recurselevel}
+%D and \type{\recursedepth}.
+%D
+%D The loop is executed at least once, so beware of situations
+%D like:
+%D
+%D \starttypen
+%D \doloop {\exitloop some commands}
+%D \stoptypen
+%D
+%D It's just a matter of putting the text into the \type{\if}
+%D statement that should be there anyway, like in:
+%D
+%D \starttypen
+%D \doloop {\ifwhatever \exitloop \else some commands\fi}
+%D \stoptypen
+
+%D \macros
+%D {newevery,everyline,EveryLine,EveryPar}
+%D {}
+%D
+%D Lets skip to something quite different. It's common use
+%D to use \type{\everypar} for special purposes. In \CONTEXT\
+%D we use this primitive for locating sidefloats. This means
+%D that when user assignments to \type{\everypar} can interfere
+%D with those of the package. We therefore introduce
+%D \type{\EveryPar}.
+%D
+%D The same goes for \type{\EveryLine}. Because \TEX\ offers
+%D no \type{\everyline} primitive, we have to call for
+%D \type{\everyline} when we are working on a line by line
+%D basis. Just by calling \type{\EveryPar{}} and
+%D \type{\EveryLine{}} we restore the old situation.
+%D
+%D The definition command \type{\DoWithEvery} will be quite
+%D unreadable, so let's first show an implementation that
+%D shows how things are done:
+%D
+%D \starttypen
+%D \newtoks \everyline
+%D \newtoks \oldeveryline
+%D \newif \ifeveryline
+%D
+%D \def\DoWithEvery#1#2#3#4%
+%D {#3\else\edef\next{\noexpand#2={\the#1}}\next\fi
+%D \edef\next{\noexpand#1={\the#2\the\scratchtoks}}\next
+%D #4}
+%D
+%D \def\doEveryLine%
+%D {\DoWithEvery\everyline\oldeveryline\ifeveryline\everylinetrue}
+%D
+%D \def\EveryLine%
+%D {\afterassignment\doEveryLine\scratchtoks}
+%D
+%D The real implementation is a bit more complicated but we
+%D prefer something more versatile.
+
+\def\DoWithEvery#1%
+ {\csname if\strippedcsname#1\endcsname \else
+ \edef\next%
+ {\@EA\noexpand\csname old\strippedcsname#1\endcsname=
+ {\the#1}}%
+ \next
+ \fi
+ \edef\next%
+ {\noexpand#1=
+ {\@EA\the\csname old\strippedcsname#1\endcsname\the\scratchtoks}}%
+ \next
+ \csname\strippedcsname#1true\endcsname}
+
+\def\dowithevery#1%
+ {\@EA\afterassignment\csname do\strippedcsname#1\endcsname\scratchtoks}
+
+\def\newevery#1#2%
+ {\ifx#2\undefined
+ \ifx#1\undefined\newtoks#1\fi
+ \@EA\newtoks\csname old\strippedcsname#1\endcsname
+ \@EA\newif \csname if\strippedcsname#1\endcsname
+ \@EA\def \csname do\strippedcsname#2\endcsname{\DoWithEvery#1}%
+ \def#2{\dowithevery#2}%
+ \fi}
+
+%D This one permits definitions like:
+
+\newevery \everypar \EveryPar
+\newevery \everyline \EveryLine
+
+%D and how about:
+
+\newevery \neverypar \NeveryPar
+
+%D Which indeed we're going to use indeed!
+
+%D Technically spoken we could have used the method we are
+%D going to present in the visual debugger. First we save
+%D the primitive \type{\everypar}:
+%D
+%D \starttypen
+%D \let\normaleverypar=\everypar
+%D \stoptypen
+%D
+%D Next we allocate a \TOKENLIST\ named \type{\everypar},
+%D which means that \type{\everypar} is no longer a primitive
+%D but something like \type{\toks44}.
+%D
+%D \starttypen
+%D \newtoks\everypar
+%D \stoptypen
+%D
+%D Because \TEX\ now executes \type{\normaleverypar} instead
+%D of \type{\everypar}, we are ready to assign some tokens to
+%D this internally known and used \TOKENLIST.
+%D
+%D \starttypen
+%D \normaleverypar={all the things the system wants to do \the\everypar}
+%D \stoptypen
+%D
+%D Where the user can provide his own tokens to be expanded
+%D every time he expects them to expand.
+%D
+%D \starttypen
+%D \everypar={something the user wants to do}
+%D \stoptypen
+%D
+%D We don't use this method because it undoubtly leads to
+%D confusing situations, especially when other packages are
+%D used, but it's this kind of tricks that make \TEX\ so
+%D powerful.
+
+%D \macros
+%D {convertargument,convertcommand}
+%D {}
+%D
+%D Some persistent experimenting led us to the next macro. This
+%D macro converts a parameter or an expanded macro to it's
+%D textual meaning.
+%D
+%D \starttypen
+%D \convertargument ... \to \command
+%D \stoptypen
+%D
+%D For example,
+%D
+%D \starttypen
+%D \convertargument{one \two \three{four}}\to\ascii
+%D \stoptypen
+%D
+%D The resulting macro \type{\ascii} can be written to a file
+%D or the terminal without problems. In \CONTEXT\ we use this
+%D macro for generating registers and tables of contents.
+%D
+%D The second conversion alternative accepts a command:
+%D
+%D \starttypen
+%D \convertcommand\command\to\ascii
+%D \stoptypen
+%D
+%D Both commands accept the prefix \type{\doglobal} for global
+%D assignments.
+
+\def\doconvertargument#1>{}
+
+\def\convertedcommand%
+ {\expandafter\doconvertargument\meaning}
+
+\long\def\convertargument#1\to#2%
+ {\long\def\convertedargument{#1}%
+ \dodoglobal\edef#2%
+ {\convertedcommand\convertedargument}}
+
+\long\def\convertcommand#1\to#2%
+ {\dodoglobal\edef#2%
+ {\convertedcommand#1}}
+
+%D This is typically a macro that one comes to after reading
+%D the \TEX book carefully. Even then, the definite solution
+%D was found after rereading the \TEX book. The first
+%D implementation was:
+%D
+%D \starttypen
+%D \def\doconvertargument#1->#2\\\\{#2}
+%D \stoptypen
+%D
+%D The \type{-}, the delimiter \type{\\\\} and the the second
+%D argument are completely redundant.
+
+%D \macros
+%D {ExpandFirstAfter,ExpandSecondAfter,ExpandBothAfter}
+%D {}
+%D
+%D These three commands support expansion of arguments before
+%D executing the commands that uses them. We can best
+%D illustrate this with an example.
+%D
+%D \starttypen
+%D \def\first {alfa,beta,gamma}
+%D \def\second {alfa,epsilon,zeta}
+%D
+%D \ExpandFirstAfter \doifcommon {\first} {alfa} {\message{OK}}
+%D \ExpandSecondAfter \doifcommon {alfa} {\second} {\message{OK}}
+%D \ExpandBothAfter \doifcommon {\first} {\second} {\message{OK}}
+%D
+%D \ExpandFirstAfter\processcommalist[\first]\message
+%D
+%D \ExpandAfter \doifcommon {\first} {alfa} {\message{OK}}
+%D \stoptypen
+%D
+%D The first three calls result in the threefold message
+%D \type{OK}, the fourth one shows the three elements of
+%D \type{\first}. The command \type{\ExpandFirstAfter} takes
+%D care of (first) arguments that are delimited by \type{[ ]},
+%D but the faster \type{\ExpandAfter} does not.
+
+%D RECONSIDER
+
+\def\simpleExpandFirstAfter#1%
+ {\edef\!!stringa{#1}%
+ \@EA\ExpandCommand\@EA{\!!stringa}}
+
+\def\complexExpandFirstAfter[#1]%
+ {\edef\!!stringa{#1}%
+ \@EA\ExpandCommand\@EA[\!!stringa]}
+
+\def\ExpandFirstAfter#1%
+ {\def\ExpandCommand{#1}%
+ \complexorsimple{ExpandFirstAfter}}
+
+\def\ExpandSecondAfter#1#2#3%
+ {\def\!!stringa{#2}%
+ \edef\!!stringb{#3}%
+ \@EA#1\@EA{\@EA\!!stringa\@EA}\@EA{\!!stringb}}
+
+% \def\ExpandSecondAfter#1#2#3%
+% {\toks0={#2}%
+% \edef\!!stringa{#3}%
+% \@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA\the\@EA\toks0\@EA}\@EA{\!!stringa}}
+
+\def\ExpandBothAfter#1#2#3%
+ {\edef\!!stringa{#2}%
+ \edef\!!stringb{#3}%
+ \@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA\!!stringa\@EA}\@EA{\!!stringb}}
+
+\def\ExpandAfter#1#2%
+ {\edef\!!stringa{#2}%
+ \@EA#1\@EA{\!!stringa}}
+
+%D Now we can for instance redefine \type{\ifinstringelse} as:
+
+\def\ifinstringelse%
+ {\ExpandBothAfter\v!ifinstringelse}
+
+%D \macros
+%D {ConvertToConstant,ConvertConstantAfter}
+%D {}
+%D
+%D When comparing arguments with a constant, we can get into
+%D trouble when this argument consists of tricky expandable
+%D commands. One solution for this is converting the
+%D argument to a string of unexpandable characters. To make
+%D comparison possible, we have to convert the constant too
+%D
+%D \starttypen
+%D \ConvertToConstant\doifelse {...} {...} {then ...} {else ...}
+%D \stoptypen
+%D
+%D This construction is only needed when the first argument
+%D can give troubles. Misuse can slow down processing.
+%D
+%D \starttypen
+%D \ConvertToConstant\doifelse{\c!alfa} {\c!alfa}{...}{...}
+%D \ConvertToConstant\doifelse{alfa} {\c!alfa}{...}{...}
+%D \ConvertToConstant\doifelse{alfa} {alfa} {...}{...}
+%D \ConvertToConstant\doifelse{alfa \alfa test}{\c!alfa}{...}{...}
+%D \stoptypen
+%D
+%D In examples~2 and~3 both arguments equal, in~1 and~4
+%D they differ.
+
+\def\ConvertToConstant#1#2#3%
+ {\expandafter\convertargument\expandafter{#2}\to\!!stringa
+ \expandafter\convertargument\expandafter{#3}\to\!!stringb
+ #1{\!!stringa}{\!!stringb}}
+
+%D When the argument \type{#1} consists of commands, we had
+%D better use
+%D
+%D \starttypen
+%D \ConvertConstantAfter\processaction[#1][...]
+%D \ConvertConstantAfter\doifelse{#1}{\v!iets}{}{}
+%D \stoptypen
+%D
+%D This commands accepts things like:
+%D
+%D \starttypen
+%D \v!constant
+%D constant
+%D \hbox to \hsize{\rubish}
+%D \stoptypen
+%D
+%D As we will see in the core moudles, this macro permits
+%D constructions like:
+%D
+%D \starttypen
+%D \setupfoottexts[...][...]
+%D \setupfoottexts[margin][...][...]
+%D \setupfoottexts[\v!margin][...][...]
+%D \stoptypen
+%D
+%D where \type{...} can be anything legally \TEX.
+
+\def\CheckConstantAfter#1#2%
+ {\@EA\convertargument\v!prefix!\to\ascii
+ \convertargument#1\to#2\relax
+ \doifinstringelse{\ascii}{#2}
+ {\expandafter\convertargument#1\to#2}
+ {}}
+
+\def\simpleConvertConstantAfter#1#2%
+ {\CheckConstantAfter{#1}\asciiA
+ \CheckConstantAfter{#2}\asciiB
+ \ConvertCommand{\asciiA}{\asciiB}}
+
+\def\complexConvertConstantAfter[#1]%
+ {\doConvertConstantAfter{#1}%
+ \@EA\ConvertCommand\@EA[\!!stringa]}
+
+\def\ConvertConstantAfter#1%
+ {\def\ConvertCommand{#1}%
+ \complexorsimple{ConvertConstantAfter}}
+
+%D \macros
+%D {assignifempty}
+%D {}
+%D
+%D We can assign a default value to an empty macro using:
+%D
+%D \starttypen
+%D \assignifempty \macros {default value}
+%D \stoptypen
+%D
+%D We don't explicitly test if the macro is defined.
+
+\def\assignifempty#1#2%
+ {\doifnot{#1}{}
+ {\def#1{#2}}}
+
+%D \macros
+%D {gobbleuntil,grabuntil,processbetween}
+%D {}
+%D
+%D In \TEX\ gobbling usually stand for skipping arguments, so
+%D here are our gobbling macros.
+%D
+%D In \CONTEXT\ we use a lot of \type{\start}||\type{\stop}
+%D like constructions. Sometimes, the \type{\stop} is used as a
+%D hard coded delimiter like in:
+%D
+%D \starttypen
+%D \def\startcommand#1\stopcommand%
+%D {... #1 ...}
+%D \stoptypen
+%D
+%D In many cases the \type{\start}||\type{\stop} pair is
+%D defined at format generation time or during a job. This
+%D means that we cannot hardcode the \type{\stop} criterium.
+%D Only after completely understanding \type{\csname} and
+%D \type{\expandafter} I was able to to implement a solution,
+%D starting with:
+%D
+%D \starttypen
+%D \grabuntil{stop}\command
+%D \stoptypen
+%D
+%D This commands executed, after having encountered
+%D \type{\stop} the command \type{\command}. This command
+%D receives as argument the text preceding the \type{\stop}.
+%D This means that:
+%D
+%D \starttypen
+%D \def\starthello%
+%D {\grabuntil{stophello}\message}
+%D
+%D \starthello Hello world!\stophello
+%D \stoptypen
+%D
+%D results in: \type{\message{Hello world!}}.
+
+\def\dograbuntil#1#2%
+ {\long\def\next##1#1{#2{##1}}\next}
+
+\def\grabuntil#1%
+ {\expandafter\dograbuntil\expandafter{\csname#1\endcsname}}
+
+%D The next command build on this mechanism:
+%D
+%D \starttypen
+%D \processbetween{string}\command
+%D \stoptypen
+%D
+%D Here:
+%D
+%D \starttypen
+%D \processbetween{hello}\message
+%D \starthello Hello again!\stophello
+%D \stoptypen
+%D
+%D leads to: \type{\message{Hello again!}}. The command
+%D
+%D \starttypen
+%D \gobbleuntil\command
+%D \stoptypen
+%D
+%D is related to these commands. This one simply throws away
+%D everything preceding \type{\command}.
+
+\long\def\processbetween#1#2%
+ {\setvalue{\s!start#1}%
+ {\grabuntil{\s!stop#1}{#2}}}
+
+\def\gobbleuntil#1%
+ {\long\def\next##1#1{}\next}
+
+%D \macros
+%D {groupedcommand}
+%D {}
+%D
+%D Commands often manipulate argument as in:
+%D
+%D \starttypen
+%D \def\doezomaarwat#1{....#1....}
+%D \stoptypen
+%D
+%D A disadvantage of this approach is that the tokens that
+%D form \type{#1} are fixed the the moment the argument is read
+%D in. Normally this is no problem, but for instance verbatim
+%D environments adapt the \CATCODES\ of characters and therefore
+%D are not always happy with already fixed tokens.
+%D
+%D Another problem arises when the argument is grouped not by
+%D \type{{}} but by \type{\bgroup} and \type{\egroup}. Such an
+%D argument fails, because the \type{\bgroup} is een as the
+%D argument (which is quite normal).
+%D
+%D The next macro offers a solution for both unwanted
+%D situations:
+%D
+%D \starttypen
+%D \groupedcommand {before} {after}
+%D \stoptypen
+%D
+%D Which can be used like:
+%D
+%D \starttypen
+%D \def\cite%
+%D {\groupedcommand{\rightquote\rightquote}{\leftquote\leftquote}}
+%D \stoptypen
+%D
+%D This command is equivalent to, but more 'robust' than:
+%D
+%D \starttypen
+%D \def\cite#1%
+%D {\rightquote\rightquote#1\leftquote\leftquote}
+%D \stoptypen
+%D
+%D One should say that the next implementation would suffice:
+%D
+%D \starttypen
+%D \def\groupedcommand#1#2%
+%D {\def\BeforeGroup{#1\ignorespaces}%
+%D \def\AfterGroup{\unskip#2\egroup}%
+%D \bgroup\bgroup
+%D \aftergroup\AfterGroup
+%D \afterassignment\BeforeGroup
+%D \let\next=}
+%D \stoptypen
+%D
+%D It did indeed, but one day we decided to support the
+%D processing of boxes too:
+%D
+%D \starttypen
+%D \def\rightword%
+%D {\groupedcommand{\hfill\hbox}{\parfillskip\!!zeropoint}}
+%D
+%D .......... \rightword{the right way}
+%D \stoptypen
+%D
+%D Here \TEX\ typesets \type{\bf the right way} unbreakable
+%D at the end of the line. The solution mentioned before does
+%D not work here.
+%D
+%D \starttypen
+%D \long\unexpanded\def\groupedcommand#1#2%
+%D {\bgroup
+%D \long\def\BeforeGroup%
+%D {\bgroup#1\bgroup\aftergroup\AfterGroup}%
+%D \long\def\AfterGroup%
+%D {#2\egroup\egroup}%
+%D \afterassignment\BeforeGroup
+%D \let\next=}
+%D \stoptypen
+%D
+%D We used this method some time until the next alternative
+%D was needed. From now on we support both
+%D
+%D \starttypen
+%D to be \bold{bold} or not, that's the question
+%D \stoptypen
+%D
+%D and
+%D
+%D \starttypen
+%D to be {\bold bold} or not, that's the question
+%D \stoptypen
+%D
+%D This alternative checks for a \type{\bgroup} token first.
+%D The internal alternative does not accept the box handling
+%D mentioned before, but further nesting works all right. The
+%D extra \type{\bgroup}||\type{\egroup} is needed to keep
+%D \type{\AfterGroup} both into sight and local.
+
+\long\def\HandleGroup#1#2%
+ {\bgroup
+ \long\def\BeforeGroup%
+ {\bgroup#1\bgroup\aftergroup\AfterGroup}%
+ \long\def\AfterGroup%
+ {#2\egroup\egroup}%
+ \afterassignment\BeforeGroup
+ \let\next=}
+
+\long\def\HandleNoGroup#1#2%
+ {\long\def\AfterGroup{#2\egroup}%
+ \bgroup\aftergroup\AfterGroup#1}
+
+%D These macros come together in:
+%D
+%D \starttypen
+%D \long\unexpanded\def\groupedcommand#1#2%
+%D {\def\dogroupedcommand%
+%D {\ifx\next\bgroup
+%D \let\next=\HandleGroup
+%D \else
+%D \let\next=\HandleNoGroup
+%D \fi
+%D \next{#1}{#2}}%
+%D \futurelet\next\dogroupedcommand}
+%D \stoptypen
+%D
+%D From the missing paragraph number one can deduce that the
+%D last macro is not the real one yet. I considered it a
+%D nuisance that
+%D
+%D \starttypen
+%D \kleur[groen]
+%D {as gras}
+%D \stoptypen
+%D
+%D was not interpreted as one would expect. This is due to the
+%D fact that \type{\futurelet} obeys blank spaces, and a
+%D line||ending token is treated as a blank space. So the final
+%D implementation became:
+
+\long\unexpanded\def\groupedcommand#1#2%
+ {\bgroup
+ \def\dogroupedcommand%
+ {\ifx\next\bgroup
+ \def\\{\egroup\HandleGroup{#1}{#2}}%
+ \else\ifx\next\blankspace
+ \def\\ {\egroup\groupedcommand{#1}{#2}}%
+ \else
+ \def\\{\egroup\HandleNoGroup{#1}{#2}}%
+ \fi\fi
+ \\}%
+ \futurelet\next\dogroupedcommand}
+
+%D Users should be aware of the fact that grouping can
+%D interfere with ones paragraph settings that are executed
+%D after the paragraph is closed. One should therefore
+%D explictly close the paragraph with \type{\par}, else the
+%D settings will be forgotten and not applied. So it's:
+%D
+%D \starttypen
+%D \def\BoldRaggedCenter%
+%D {\groupedcommand{\raggedcenter\bf}{\par}}
+%D \stoptypen
+
+%D \macros
+%D {checkdefined}
+%D {}
+%D
+%D The bigger the system, the greater the change that
+%D user defined commands collide with those that are part of
+%D the system. The next macro gives a warning when a command is
+%D already defined. We considered blocking the definition, but
+%D this is not always what we want.
+%D
+%D \starttypen
+%D \checkdefined {category} {class} {command}
+%D \stoptypen
+%D
+%D The user is warned with the suggestion to use
+%D \type{CAPITALS}. This suggestion is feasible, because
+%D \CONTEXT only defines lowcased macros.
+
+\def\checkdefined#1#2#3% redefined in mult-ini
+ {\doifdefined{#3}
+ {\writestatus{#1}{#2 #3 replaces a macro, use CAPITALS!}}}
+
+%D \macros
+%D {GotoPar,GetPar}
+%D {}
+%D
+%D Typesetting a paragraph in a special way can be done by
+%D first grabbing the contents of the paragraph and processing
+%D this contents grouped. The next macro for instance typesets
+%D a paragraph in boldface.
+%D
+%D \starttypen
+%D \def\remark#1\par%
+%D {\bgroup\bf#1\egroup}
+%D \stoptypen
+%D
+%D This macro has to be called like
+%D
+%D \starttypen
+%D \remark some text ... ending with \par
+%D \stoptypen
+%D
+%D Instead of \type{\par} we can of course use an empty line.
+%D When we started typesetting with \TEX, we already had
+%D produced lots of text in plain \ASCII. In producing such
+%D simple formatted texts, we adopted an open layout, and when
+%D switching to \TEX, we continued this open habit. Although
+%D \TEX\ permits a cramped and badly formatted source, it adds
+%D to confusion and sometimes introduces errors. So we prefer:
+%D
+%D \starttypen
+%D \remark
+%D
+%D some text ... ending with an empty line
+%D \stoptypen
+%D
+%D We are going to implement a mechanism that allows such open
+%D specifications. The definition of the macro handling
+%D \type{\remark} becomes:
+%D
+%D \starttypen
+%D \def\remark%
+%D {\BeforePar{\bgroup\bf}%
+%D \AfterPar{\egroup}%
+%D \GetPar}
+%D \stoptypen
+%D
+%D A macro like \type{\GetPar} can be defined in several
+%D ways. The recent version, the fourth one in a row,
+%D originally was far more complicated, but some functionality
+%D has been moved to other macros.
+%D
+%D We start with the more simple but in some cases more
+%D appropriate alternative is \type{\GotoPar}. This one leaves
+%D \type{\par} unchanged and is therefore more robust. On the
+%D other hand, \type{\AfterPar} is not supported.
+
+\newtoks\BeforePar
+\newtoks\AfterPar
+
+\def\doGotoPar%
+ {\ifx\nextchar\blankspace
+ \let\donext\GotoPar
+ \else\ifx\nextchar\endoflinetoken
+ \let\donext\GotoPar
+ \else
+ \def\donext%
+ {\the\BeforePar
+ \BeforePar{}%
+ \nextchar}%
+ \fi\fi
+ \donext}
+
+\def\GotoPar%
+ {\afterassignment\doGotoPar\let\nextchar=}
+
+%D Its big brother \type{\GetPar} redefines the \type{\par}
+%D primitive, which can lead to unexpected results, depending
+%D in the context.
+
+\def\GetPar%
+ {\edef\next%
+ {\BeforePar
+ {\the\BeforePar
+ \BeforePar{}%
+ \bgroup
+ \def\par%
+ {\egroup
+ \par
+ \the\AfterPar
+ \BeforePar{}%
+ \AfterPar{}}}}%
+ \next
+ \GotoPar}
+
+%D \macros
+%D {dowithpargument,dowithwargument}
+%D {}
+%D
+%D The next macros are a variation on \type{\GetPar}. When
+%D macros expect an argument, it interprets a grouped sequence
+%D of characters a one token. While this adds to robustness and
+%D less ambiguous situations, we sometimes want to be a bit
+%D more flexible, or at least want to be a bit more tolerant
+%D to user input.
+%D
+%D We start with a commands that acts on paragraphs. This
+%D command is called as:
+%D
+%D \starttypen
+%D \dowithpargument\command
+%D \dowithpargument{\command ... }
+%D \stoptypen
+%D
+%D In \CONTEXT\ we use this one to read in the titles of
+%D chapters, sections etc. The commands responsible for these
+%D activities accept several alternative ways of argument
+%D passing. In these examples, the \type{\par} can be omitted
+%D when an empty line is present.
+%D
+%D \starttypen
+%D \command{...}
+%D \command ... \par
+%D \command
+%D {...}
+%D \command
+%D ... \par
+%D \stoptypen
+%D
+%D We show two implementations, of which for the moment the
+%D we prefier to use the second one:
+%D
+%D \starttypen
+%D \def\dowithpargument#1%
+%D {\def\dodowithpargument%
+%D {\ifx\next\bgroup
+%D \def\next{#1}%
+%D \else
+%D \def\next####1 \par{#1{####1}}%
+%D \fi
+%D \next}%
+%D \futurelet\next\dodowithpargument}
+%D \stoptypen
+%D
+%D A second and better implementation was:
+%D
+%D \starttypen
+%D \def\dowithpargument#1%
+%D {\def\nextpar##1 \par{#1{##1}}%
+%D \def\nextarg##1{#1{##1}}%
+%D \doifnextcharelse{\bgroup}
+%D {\nextarg}
+%D {\nextpar}}
+%D \stoptypen
+%D
+%D We ended up with an alternative that also accepts en empty
+%D argument. This command permits for instance chapters to
+%D have no title.
+
+\def\dowithpargument#1%
+ {\def\nextpar##1 \par{#1{##1}}%
+ \def\nextarg##1{#1{##1}}%
+ \doifnextcharelse{\bgroup}
+ {\nextarg}
+ {\doifnextcharelse{\par}
+ {#1{}}
+ {\nextpar}}}
+
+%D The \type{p} in the previous command stands for paragraph.
+%D When we want to act upon words we can use the \type{w}
+%D alternative.
+%D
+%D \starttypen
+%D \dowithwargument\command
+%D \dowithwargument{... \command ...}
+%D \stoptypen
+%D
+%D The main difference bwteen two alternatives is in the
+%D handling of \type{\par}'s. This time the space token acts
+%D as a delimiter.
+%D
+%D \starttypen
+%D \command{...}
+%D \command ...
+%D \command
+%D {...}
+%D \command
+%D ...
+%D \stoptypen
+%D
+%D Again there are two implementations possible:
+%D
+%D \starttypen
+%D \def\dowithwargument#1%
+%D {\def\dodowithwargument%
+%D {\ifx\next\bgroup
+%D \def\next{#1}%
+%D \else
+%D \def\next####1 {#1{####1}}%
+%D \fi
+%D \next}%
+%D \futurelet\next\dodowithwargument}
+%D \stoptypen
+%D
+%D We've chosen:
+
+\def\dowithwargument#1%
+ {\def\nextwar##1 {#1{##1}}%
+ \def\nextarg##1{#1{##1}}%
+ \doifnextcharelse{\bgroup}
+ {\nextarg}
+ {\nextwar}}
+
+%D \macros
+%D {dorepeat,dorepeatwithcommand}
+%D {}
+%D
+%D When doing repetitive tasks, we stromgly advice to use
+%D \type{\dorecurse}. The next alternative however, suits
+%D better some of the \CONTEXT\ interface commands.
+%D
+%D \starttypen
+%D \dorepeat[n*\command]
+%D \stoptypen
+%D
+%D The value of the used \COUNTER\ can be called within
+%D \type{\command} by \type{\repeater}.
+%D
+%D A slightly different alternative is:
+%D
+%D \starttypen
+%D \dorepeatwithcommand[n*{...}]\command
+%D \stoptypen
+%D
+%D When we call for something like:
+%D
+%D \starttypen
+%D \dorepeatwithcommand[3*{Hello}]\message
+%D \stoptypen
+%D
+%D we get ourselves three \type{\message{Hello}} messages in
+%D a row. In both commands, the \type{n*} is optional. When this
+%D specification is missing, the command executes once.
+
+\long\def\dodorepeat[#1*#2*#3*]%
+ {\doifelse{#3}{}
+ {#1}
+ {\dorecurse{#1}{#2}}}
+
+\long\def\dorepeat[#1]%
+ {\dodorepeat[#1***]}
+
+\def\repeater%
+ {\recurselevel}
+
+\def\dorepeatwithcommand[#1]#2%
+ {\def\p!dorepeatnot%
+ {#2{#1}}%
+ \def\p!dorepeatyes[##1*##2]%
+ {\dorecurse{##1}{#2{##2}}}%
+ \doifinstringelse{*}{#1}
+ {\doifnumberelse{#1}{\p!dorepeatyes[#1]}{\p!dorepeatnot}}%
+ {\p!dorepeatnot}}
+
+%D \macros
+%D {appendtoks,prependtoks,flushtoks,dotoks}
+%D {}
+%D
+%D We use \TOKENLISTS\ sparsely within \CONTEXT, because the
+%D comma separated lists are more suitable for the user
+%D interface. Nevertheless we have:
+%D
+%D \starttypen
+%D (\doglobal) \appendtoks ... \to\tokenlist
+%D (\doglobal) \prependtoks ... \to\tokenlist
+%D (\doglobal) \flushtoks\tokenlist
+%D \dotoks\tokenlist
+%D \stoptypen
+%D
+%D Er worden eerst enkele klad||registers gedefinieerd. These
+%D macros are clones of the ones implemented in page~378 of
+%D Knuth's \TeX book.
+
+\def\appendtoks#1\to#2%
+ {\scratchtoks={#1}%
+ \edef\next{\noexpand#2={\the#2\the\scratchtoks}}%
+ \next
+ \dodoglobal#2=#2}
+
+\def\prependtoks#1\to#2%
+ {\scratchtoks={#1}%
+ \edef\next{\noexpand#2={\the\scratchtoks\the#2}}%
+ \next
+ \dodoglobal#2=#2}
+
+\def\flushtoks#1%
+ {\scratchtoks=#1\relax
+ \dodoglobal#1={}%
+ \the\scratchtoks\relax}
+
+\let\dotoks=\the
+
+%D \macros
+%D {makecounter,pluscounter,minuscounter,
+%D resetcounter,setcounter,countervalue}
+%D {}
+%D
+%D Declaring, setting and resetting \COUNTERS\ can be doen
+%D with the next set of commands.
+%D
+%D \starttypen
+%D \makecounter {name}
+%D \pluscounter {name}
+%D \minuscounter {name}
+%D \resetcounter {name}
+%D \setcounter {name} {value}
+%D \countervalue {name}
+%D \stoptypen
+%D
+%D We prefer the use of global counters. This means that we
+%D have to load \PLAIN\ \TEX\ in a bit different way:
+%D
+%D \starttypen
+%D \let\oldouter=\outer
+%D \let\outer=\relax
+%D \input plain.tex
+%D \let\outer=\oldouter
+%D
+%D \def\newcount%
+%D {\alloc@0\count\countdef\insc@unt}
+%D \stoptypen
+%D
+%D First we show a solution in which we use real \COUNTERS.
+%D Apart from some expansion, nothing special is done.
+%D
+%D \starttypen
+%D \def\makecounter#1%
+%D {\expandafter\newcount\csname#1\endcsname}
+%D
+%D \def\pluscounter#1%
+%D {\expandafter\global\expandafter\advance\csname#1\endcsname by 1 }
+%D
+%D \def\minuscounter#1%
+%D {\expandafter\global\expandafter\advance\csname#1\endcsname by -1 }
+%D
+%D \def\resetcounter#1%
+%D {\expandafter\global\csname#1\endcsname=0 }
+%D
+%D \def\setcounter#1#2%
+%D {\expandafter\global\csname#1\endcsname=#2 }
+%D
+%D \def\countervalue#1%
+%D {\the\getvalue{#1}}
+%D \stoptypen
+%D
+%D Because these macros are already an indirect way of working
+%D with counters, there is no harm in using pseudo \COUNTERS\
+%D here:
+
+\def\makecounter#1%
+ {\setxvalue{#1}{0}}
+
+\def\pluscounter#1%
+ {\scratchcounter=\getvalue{#1}\relax
+ \advance\scratchcounter by 1\relax
+ \setxvalue{#1}{\the\scratchcounter}}
+
+\def\minuscounter#1%
+ {\scratchcounter=\getvalue{#1}\relax
+ \advance\scratchcounter by -1\relax
+ \setxvalue{#1}{\the\scratchcounter}}
+
+\def\resetcounter#1%
+ {\setxvalue{#1}{0}}
+
+\def\setcounter#1#2%
+ {\scratchcounter=#2\relax
+ \setxvalue{#1}{\the\scratchcounter}}
+
+\def\countervalue#1%
+ {\getvalue{#1}}
+
+%D \macros
+%D {savecounter,restorecounter}
+%D
+%D These two commands can be used to save and restore counter
+%D values. Only one level is saved.
+
+\def\savecounter#1%
+ {\expanded{\setgvalue{!#1}{\getvalue{#1}}}}
+
+\def\restorecounter#1%
+ {\expanded{\setgvalue{#1}{\getvalue{!#1}}}}
+
+%D \macros
+%D {beforesplitstring,aftersplitstring}
+%D {}
+%D
+%D These both commands split a string at a given point in two
+%D parts, so \type{x.y} becomes \type{x} or \type{y}.
+%D
+%D \starttypen
+%D \beforesplitstring test.tex\at.\to\filename
+%D \aftersplitstring test.tex\at.\to\extension
+%D \stoptypen
+%D
+%D The first routine looks (and is indeed) a bit simpler than
+%D the second one. The alternative looking more or less like
+%D the first one did not always give the results we needed.
+%D Both implementations show some insight in the manipulation
+%D of arguments.
+
+\def\beforesplitstring#1\at#2\to#3%
+ {\def\dosplitstring##1#2##2#2##3\\%
+ {\def#3{##1}}%
+ \@EA\dosplitstring#1#2#2\\}
+
+\def\aftersplitstring#1\at#2\to#3%
+ {\def\dosplitstring##1#2##2@@@##3\\%
+ {\def#3{##2}}%
+ \@EA\dosplitstring#1@@@#2@@@\\}
+
+%D \macros
+%D {removesubstring}
+%D {}
+%D
+%D A first application of the two routines defined above is:
+%D
+%D \starttypen
+%D \removesubstringtest-\from first-last\to\nothyphenated
+%D \stoptypen
+%D
+%D Which in terms of \TEX\ looks like:
+
+\def\removesubstring#1\from#2\to#3%
+ {\doifinstringelse{#1}{#2}
+ {\beforesplitstring#2\at#1\to\!!stringa
+ \aftersplitstring #2\at#1\to\!!stringb
+ \edef#3{\!!stringa\!!stringb}%
+ \def\next{\removesubstring#1\from#3\to#3}}
+ {\let\next=\relax}%
+ \next}
+
+%D \macros
+%D {addtocommalist,removefromcommalist}
+%D {}
+%D
+%D When working with comma separated lists, oen sooner or
+%D later want the tools to append or remove items from such a
+%D list. When we add an item, we first check if it's already
+%D there. This means that every item in the list is unique.
+%D
+%D \starttypen
+%D \addtocommalist {alfa} \naam
+%D \addtocommalist {beta} \naam
+%D \addtocommalist {gamma} \naam
+%D \removefromcommalist {beta} \naam
+%D \stoptypen
+%D
+%D These commands can be prefixed with \type{\doglobal}. The
+%D implementation of the second command is more complecated,
+%D because we have to take leading spaces into account. Keep in
+%D mind that useres may provide lists with spaces after the
+%D commas. When one item is left, we also have to get rid of
+%D trailing spaces.
+%D
+%D \starttypen
+%D \def\words{alfa, beta, gamma, delta}
+%D \def\words{alfa,beta,gamma,delta}
+%D \stoptypen
+%D
+%D Removing an item takes more time than adding one.
+
+\def\addtocommalist#1#2%
+ {\doifelse{#2}{}
+ {\dodoglobal\edef#2{#1}}
+ {\edef\!!stringa{#2,,}%
+ \beforesplitstring#2\at,,\to#2\relax
+ \ExpandBothAfter\doifinsetelse{#1}{#2}
+ {\resetglobal}
+ {\dodoglobal\edef#2{#2,#1}}}}
+
+\def\doremovefromcommalist#1#2#3% nog \doglobal
+ {\edef\!!stringa{,,#3,,}%
+ \beforesplitstring\!!stringa\at,#1#2,\to\!!stringb
+ \aftersplitstring\!!stringa\at,#1#2,\to\!!stringc
+ \edef#3{\!!stringb,\!!stringc}%
+ \aftersplitstring#3\at,,\to#3\relax
+ \beforesplitstring#3\at,,\to#3}
+
+\def\dodofrontstrip[#1#2]#3%
+ {\ifx#1\space
+ \def#3{#2}%
+ \else
+ \def#3{#1#2}%
+ \fi}%
+
+\def\dofrontstrip#1%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \else
+ \@EA\dodofrontstrip\@EA[#1]#1%
+ \fi}
+
+\def\removefromcommalist#1#2%
+ {\doremovefromcommalist{ }{#1}{#2}%
+ \doremovefromcommalist{}{#1}{#2}%
+ \dofrontstrip#2%
+ \dodoglobal\edef#2{#2}}
+
+%D \macros
+%D {globalprocesscommalist}
+%D
+%D The commalist processing commands are characterized by the
+%D fact that the way they handle expansion as well as the fact
+%D that they can be nested. This makes them kind of useless for
+%D handling comma lists in alignments. In these situations the
+%D next macro can be of use.
+
+\def\globalprocesscommaitem#1,%
+ {\if]#1\else
+ \globalcommacommand{#1}%
+ \expandafter\globalprocesscommaitem
+ \fi}
+
+\def\globalprocesscommalist[#1]#2%
+ {\global\let\globalcommacommand=#2%
+ \expandafter\globalprocesscommaitem#1,],}
+
+%D \macros
+%D {withoutunit,withoutpt,
+%D PtToCm,
+%D numberofpoints,dimensiontocount}
+%D {}
+%D
+%D We can convert point into centimeters with:
+%D
+%D \starttypen
+%D \PtToCm{dimension}
+%D \stoptypen
+%D
+%D Splitting the value and the unit is done by:
+
+\def\withoutunit#1#2%
+ {\bgroup
+ \dimen0=#1\relax
+ \@EA\convertargument\the\dimen0\to\asciiA
+ \@EA\convertargument#2\to\asciiB
+ \@EA\@EA\@EA\beforesplitstring\@EA\asciiA\@EA\at\asciiB\to\!!stringa%
+ \!!stringa
+ \egroup}
+
+\def\withoutpt#1%
+ {\withoutunit{#1}{pt}}
+
+\def\withoutcm#1%
+ {\withoutunit{#1}{cm}}
+
+%D A bit faster and more robust alternative is one that
+%D manipulates the \CATCODES.
+
+{\catcode`\.=\@@other
+ \catcode`\p=\@@other
+ \catcode`\t=\@@other
+ \gdef\WITHOUTPT#1pt{#1}}
+
+\def\withoutpt#1%
+ {\expandafter\WITHOUTPT#1}
+
+%D The capitals are needed because \type{p} and \type{t} have
+%D \CATCODE~12, while macronames only permit tokens with the
+%D \CATCODE~11. As a result we cannot use the \type{.group}
+%D primitives. Those who want to know more about this kind of
+%D manipulations, we advice to study the \TEX book in detail.
+%D Because this macro does not do any assignment, we can use it
+%D in the following way too.
+
+\def\PtToCm#1%
+ {\bgroup
+ \scratchdimen=#1\relax
+ \scratchdimen=0.0351459804\scratchdimen % 2.54/72.27
+ \withoutpt{\the\scratchdimen}cm%
+ \egroup}
+
+%D We also support:
+%D
+%D \starttypen
+%D \numberofpoints {dimension}
+%D \dimensiontocount {dimension} {\count}
+%D \stoptypen
+%D
+%D Both macros return a rounded number.
+
+\def\numberofpoints#1%
+ {\scratchdimen=#1\relax
+ \advance\scratchdimen by .5pt\relax
+ \withoutpt{\the\scratchdimen}}
+
+\def\dimensiontocount#1#2%
+ {\scratchdimen=#1\relax
+ \advance\scratchdimen by .5pt\relax
+ #2=\scratchdimen
+ \divide#2 by \!!maxcard\relax}
+
+%D \macros
+%D {swapdimens,swapmacros}
+%D {}
+%D
+%D Simple but effective are the next two macros. There name
+%D exactly states their purpose. The \type{\scratchdimen} and
+%D \type{\!!stringa} can only be swapped when being the first
+%D argument.
+
+\def\swapdimens#1#2%
+ {\scratchdimen=#1\relax
+ \redoglobal#1=#2\relax
+ \dodoglobal#2=\scratchdimen}
+
+\def\swapmacros#1#2%
+ {\let\!!stringa=#1\relax
+ \let#1=#2\relax
+ \let#2=\!!stringa\relax}
+
+%D \macros
+%D {setlocalhsize}
+%D {}
+%D
+%D Sometimes we need to work with the \type{\hsize} that is
+%D corrected for indentation and left and right skips. The
+%D corrected value is available in \type{\localhsize}, which
+%D needs to be calculated with \type{\setlocalhsize} first.
+%D
+%D \starttypen
+%D \setlocalhsize \hbox to \localhsize{...}
+%D \setlocalhsize[-1em] \hbox to \localhsize{...}
+%D \setlocalhsize[.5ex] \hbox to \localhsize{...}
+%D \stoptypen
+%D
+%D These examples show us that an optional can be used. The
+%D value provided is added to \type{\localhsize}.
+
+\newdimen\localhsize
+
+\def\complexsetlocalhsize[#1]%
+ {\localhsize=\hsize
+ \advance\localhsize by -\parindent
+ \advance\localhsize by -\leftskip
+ \advance\localhsize by -\rightskip
+ \advance\localhsize by #1\relax}
+
+\def\simplesetlocalhsize%
+ {\complexsetlocalhsize[\!!zeropoint]}
+
+\definecomplexorsimple\setlocalhsize
+
+%D \macros
+%D {processtokens}
+%D {}
+%D
+%D We fully agree with (most) typogaphers that inter||letter
+%D spacing is only permitted in fancy titles, we provide a
+%D macro that can be used to do so. Because this is
+%D (definitely and fortunately) no feature of \TEX, we have to
+%D step through the token list ourselves.
+%D
+%D \starttypen
+%D \processtokens {before} {between} {after} {space} {tokens}
+%D \stoptypen
+%D
+%D An example of a call is:
+%D
+%D \startbuffer
+%D \processtokens {[} {+} {]} {\space} {hello world}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This results in:
+%D
+%D \haalbuffer
+%D
+%D The list of tokens may contain spaces, while \type{\\},
+%D \type{{}} and \type{\ } are handled as space too.
+
+\def\dodoprocesstokens%
+ {\ifx\next\lastcharacter
+ \after
+ \let\next=\relax
+ \else\ifx\next\bgroup
+ \def\next%
+ {\dowithnextbox
+ {\before\box\nextbox
+ \let\before=\between
+ \doprocesstokens}
+ \hbox\bgroup}%
+ \else
+ \expandafter\if\space\next
+ \before\white
+ \else
+ \before\next
+ \fi
+ \let\before=\between
+ \let\next=\doprocesstokens
+ \fi\fi
+ \next}
+
+\def\doprocesstokens% the space after = is essential
+ {\afterassignment\dodoprocesstokens\let\next= }
+
+\def\processtokens#1#2#3#4#5%
+ {\bgroup
+ \def\lastcharacter{\lastcharacter}%
+ \def\space{ }%
+ \let\\=\space
+ \def\before{#1}%
+ \def\between{#2}%
+ \def\after{#3}%
+ \def\white{#4}%
+ \doprocesstokens#5\lastcharacter
+ \egroup}
+
+%D \macros
+%D {doifvalue,doifnotvalue,doifelsevalue,
+%D doifnothing,doifsomething,doifelsenothing,
+%D doifvaluenothing,doifvaluesomething,doifelsevaluenothing}
+%D {}
+%D
+%D These long named \type{\if} commands can be used to access
+%D macros (or variables) that are normally accessed by using
+%D \type{\getvalue}. Using these alternatives safes us three
+%D tokens per call. Anyone familiar with the not||values
+%D ones, can derive their meaning from the definitions.
+
+ \def\doifvalue#1{\doif{\getvalue{#1}}}
+ \def\doifnotvalue#1{\doifnot{\getvalue{#1}}}
+ \def\doifelsevalue#1{\doifelse{\getvalue{#1}}}
+
+ \def\doifnothing#1{\doif{#1}{}}
+ \def\doifsomething#1{\doifnot{#1}{}}
+ \def\doifelsenothing#1{\doifelse{#1}{}}
+
+ \def\doifvaluenothing#1{\doif{\getvalue{#1}}{}}
+ \def\doifvaluesomething#1{\doifnot{\getvalue{#1}}{}}
+\def\doifelsevaluenothing#1{\doifelse{\getvalue{#1}}{}}
+
+%D \macros
+%D {DOIF,DOIFELSE,DOIFNOT}
+%D {}
+%D
+%D \TEX\ is case sensitive. When comparing arguments, this
+%D feature sometimes is less desirable, for instance when we
+%D compare filenames. The next three alternatives upcase their
+%D arguments before comparing them.
+%D
+%D \starttypen
+%D \DOIF {string1} {string2} {...}
+%D \DOIFNOT {string1} {string2} {...}
+%D \DOIFELSE {string1} {string2} {then ...}{else ...}
+%D \stoptypen
+%D
+%D We have to use a two||step implementation, because the
+%D expansion has to take place outside \type{\uppercase}.
+
+\def\p!DOIF#1#2#3%
+ {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+ #3%
+ \fi}
+
+\def\p!DOIFNOT#1#2#3%
+ {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+ \else
+ #3%
+ \fi}
+
+\def\p!DOIFELSE#1#2#3#4%
+ {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+ #3%
+ \else
+ #4%
+ \fi}
+
+\def\DOIF {\ExpandBothAfter\p!DOIF}
+\def\DOIFNOT {\ExpandBothAfter\p!DOIFNOT}
+\def\DOIFELSE {\ExpandBothAfter\p!DOIFELSE}
+
+%D \macros
+%D {stripcharacters,stripspaces}
+%D {}
+%D
+%D The next command was needed first when we implemented
+%D the \CONTEXT\ interactivity macros. When we use labeled
+%D destinations, we often cannot use all the characters we
+%D want. We therefore strip some of the troublemakers, like
+%D spaces, from the labels before we write them to the
+%D \DVI||file, which passes them to for instance a PostScript
+%D file.
+%D
+%D \starttypen
+%D \stripspaces\from\one\to\two
+%D \stoptypen
+%D
+%D Both the old string \type{\one} and the new one \type{\two}
+%D are expanded. This command is a special case of:
+%D
+%D \starttypen
+%D \stripcharacter\char\from\one\to\two
+%D \stoptypen
+%D
+%D As we can see below, spaces following a control sequence are
+%D to enclosed in \type{{}}.
+
+\def\stripcharacter#1\from#2\to#3%
+ {\def\dostripcharacter##1#1##2\end%
+ {\edef\p!strippedstring{\p!strippedstring##1}%
+ \doifemptyelse{##2}
+ {\let\next=\relax}
+ {\def\next{\dostripcharacter##2\end}}%
+ \next}%
+ \let\p!strippedstring=\empty
+ \edef\!!stringa{#2}%
+ \@EA\dostripcharacter\!!stringa#1\end
+ \let#3=\p!strippedstring}
+
+\def\stripspaces\from#1\to#2%
+ {\stripcharacter{ }\from#1\to#2}
+
+%D \macros
+%D {executeifdefined}
+%D {}
+%D
+%D \CONTEXT\ uses one auxiliary file for all data concerning
+%D tables of contents, references, two||pass optimizations,
+%D sorted lists etc. This file is loaded as many times as
+%D needed. During such a pass we skip the commands thate are of
+%D no use at that moment. Because we don't want to come into
+%D trouble with undefined auxiliary commands, we call the
+%D macros in a way similar to \type{\getvalue}. The next macro
+%D take care of such executions and when not defined, gobbles
+%D the unwanted arguments.
+%D
+%D \starttypen
+%D \executeifdefined{name}\gobbleoneargument
+%D \stoptypen
+%D
+%D We can of course globble more arguments using the
+%D appropriate globbling command.
+
+\def\executeifdefined#1#2%
+ {\ifundefined{#1}%
+ \def\next{#2}%
+ \else
+ \def\next{\getvalue{#1}}%
+ \fi
+ \next}
+
+%D We considered an alternative imlementation accepting
+%D commands directly, like:
+%D
+%D \starttypen
+%D \executeifdefined\naam\gobblefivearguments
+%D \stoptypen
+%D
+%D For the moment we don't need this one, so we stick to the
+%D faster one. The more versatile alternative is:
+%D
+%D \starttypen
+%D \def\executeifdefined#1#2%
+%D {\setnameofcommand{#1}%
+%D \@EA\ifundefined\@EA{\nameofcommand}
+%D \def\next{#2}%
+%D \else
+%D \def\next{\getvalue{\nameofcommand}}%
+%D \fi
+%D \next}
+%D \stoptypen
+
+%D \macros
+%D {doifsomespaceelse}
+%D {}
+%D
+%D The next command checks a string on the presence of a space
+%D and executed a command accordingly.
+%D
+%D \starttypen
+%D \doifsomespaceelse {tekst} {then ...} {else ...}
+%D \stoptypen
+%D
+%D We use this command in \CONTEXT\ for determing if an
+%D argument must be broken into words when made interactive.
+%D Watch the use of \type{\noexpand}.
+
+\long\def\doifsomespaceelse#1#2#3%
+ {\def\c!doifsomespaceelse##1 ##2##3\war%
+ {\if\noexpand##2@%
+ #3%
+ \else
+ #2%
+ \fi}%
+ \c!doifsomespaceelse#1 @ @\war}
+
+%D \macros
+%D {adaptdimension,balancedimensions}
+%D {}
+%D
+%D Again we introduce some macros that are closely related to
+%D an interface aspect of \CONTEXT. The first command can be
+%D used to adapt a \DIMENSION.
+%D
+%D \starttypen
+%D \adaptdimension {dimension} {value}
+%D \stoptypen
+%D
+%D When the value is preceed by a \type{+} or minus, the
+%D dimension is advanced accordingly, otherwise it gets the
+%D value.
+
+\def\doadaptdimension#1#2\\#3\\%
+ {\if#1+%
+ \dodoglobal\advance#3 by #1#2\relax
+ \else\if##1-%
+ \dodoglobal\advance#3 by #1#2\relax
+ \else
+ \dodoglobal#3=#1#2\relax
+ \fi\fi}
+
+\def\adaptdimension#1#2%
+ {\expandafter\doadaptdimension#2\\#1\\}
+
+%D A second command takes two \DIMENSIONS. Both are adapted,
+%D depending on the sign of the given value.
+%D maat. This time we take the value as it is, and don't look
+%D explicitly at the preceding sign.
+%D
+%D \starttypen
+%D \balancedimensions {dimension 1} {dimension 2} {value}
+%D \stoptypen
+%D
+%D When a positive value is given, the first dimension is
+%D incremented, the second ond is decremented. A negative value
+%D has the opposite result.
+
+\def\balancedimensions#1#2#3%
+ {\scratchdimen=#3\relax
+ \redoglobal\advance#1 by \scratchdimen\relax
+ \dodoglobal\advance#2 by -\scratchdimen\relax}
+
+%D Both commands can be preceded by \type{\doglobal}. Here we
+%D use \type{\redo} first, because \type{\dodo} resets the
+%D global character.
+
+%D \macros
+%D {processconcanatedlist}
+%D {}
+%D
+%D Maybe a bit late, but here is a more general version of the
+%D \type{\processcommalist} command. This time we don't handle
+%D nesting but accept arbitrary seperators.
+%D
+%D \starttypen
+%D \processconcanatedlist[list][separator]\command
+%D \stoptypen
+%D
+%D One can think of things like:
+%D
+%D \starttypen
+%D \processconcanatedlist[alfa+beta+gamma][+]\message
+%D \stoptypen
+
+\def\processconcanatedlist[#1][#2]#3%
+ {\def\doprocessconcanatedlist##1##2#2%
+ {\if]##1%
+ \let\next=\relax
+ \else\if]##2%
+ \let\next=\relax
+ \else\ifx\blankspace##2%
+ #3{##1}%
+ \let\next=\doprocessconcanatedlist
+ \else
+ #3{##1##2}%
+ \let\next=\doprocessconcanatedlist
+ \fi\fi\fi
+ \next}%
+ \doprocessconcanatedlist#1#2]#2}
+
+%D \macros
+%D {processassignlist}
+%D {}
+%D
+%D Is possible to combine an assignment list with one
+%D containing keywords. Assignments are treated accordingly,
+%D keywords are treated by \type{\command}.
+%D
+%D \starttypen
+%D \processassignlist[...=...,...=...,...]\commando
+%D \stoptypen
+%D
+%D This command can be integrated in \type{\getparameters}, but
+%D we decided best not to do so.
+
+\def\processassignlist#1[#2]#3%
+ {\def\p!dodogetparameter[##1=##2=##3]%
+ {\doifnot{##3}{\relax}{#3{##1}}}%
+ \def\p!dogetparameter##1%
+ {\p!dodogetparameter[##1==\relax]}%
+ \processcommalist[#2]\p!dogetparameter}
+
+%D \macros
+%D {DoAfterFi,DoAfterFiFi}
+%D {}
+%D
+%D Sometimes \type{\fi}'s can get into the way. We can reach
+%D over such a troublemaker with:
+%D
+%D \starttypen
+%D \DoAfterFi{some commands}
+%D \DoAfterFiFi{some commands}
+%D \stoptypen
+%D
+%D It saves us a \type{\next} construction. Skipping
+%D \type{\else...\fi} is more tricky, so this one is not
+%D provided.
+
+\def\DoAfterFi#1\fi{\fi#1}
+\def\DoAfterFiFi#1\fi#2\fi{\fi\fi#1}
+
+%D \macros
+%D {untextargument
+%D untexcommand}
+%D
+%D When manipulating data(bases) and for instance generating
+%D index entries, the next three macros can be of help:
+%D
+%D \starttypen
+%D \untextargument{...}\to\name
+%D \untexcommand {...}\to\name
+%D \stoptypen
+%D
+%D They remove braces and backslashes and give us something to
+%D sort.
+
+\def\untexsomething%
+ {\bgroup
+ \catcode`\{=\@@ignore
+ \catcode`\}=\@@ignore
+ \escapechar=-1
+ \dountexsomething}
+
+\long\def\dountexsomething#1#2\to#3%
+ {\doglobal#1#2\to\untexedargument
+ \egroup
+ \let#3=\untexedargument}
+
+\def\untexargument%
+ {\untexsomething\convertargument}
+
+\def\untexcommand%
+ {\untexsomething\convertcommand}
+
+%D \macros
+%D {ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints}
+%D
+%D One characteristic of \POSTSCRIPT\ and \PDF\ is that both
+%D used big points (\TEX's bp). The next macros convert points
+%D and scaled points into big points.
+%D
+%D \starttypen
+%D \ScaledPointsToBigPoints {number} \target
+%D \ScaledPointsToWholeBigPoints {number} \target
+%D \stoptypen
+%D
+%D The magic factor $72/72.27$ can be found in most \TEX\
+%D related books.
+
+\def\ScaledPointsToBigPoints#1#2%
+ {\scratchdimen=#1sp\relax
+ \scratchdimen=.996264\scratchdimen
+ \edef#2{\withoutpt{\the\scratchdimen}}}
+
+\def\ScaledPointsToWholeBigPoints#1#2%
+ {\scratchdimen=#1sp\relax
+ \scratchdimen=.996264\scratchdimen
+ \scratchcounter=\scratchdimen
+ \advance\scratchcounter by \!!medcard
+ \divide\scratchcounter by \!!maxcard
+ \edef#2{\the\scratchcounter}}
+
+%D \macros
+%D {PointsToReal}
+%D
+%D Points can be stripped from their suffix by using
+%D \type{\withoutpt}. The next macro enveloppes this macro.
+%D
+%D \starttypen
+%D \PointsToReal {dimension} \target
+%D \stoptypen
+
+\def\PointsToReal#1#2%
+ {\scratchdimen=#1%
+ \edef#2{\withoutpt{\the\scratchdimen}}}
+
+%D \macros
+%D {dontleavehmode}
+%D
+%D Sometimes when we enter a paragraph with some command, the
+%D first token gets the whole first line. We can prevent this
+%D by saying:
+%D
+%D \starttypen
+%D \dontleavehmode
+%D \stoptypen
+%D
+%D This command is used in for instance the language module
+%D \type{lang-ini}.
+
+\def\dontleavehmode{\ifmmode\else$ $\fi}
+
+%D \macros
+%D {handletokens}
+%D
+%D With the next macro we enter a critical area of macro
+%D expansion. What we want is a macro that looks like:
+%D
+%D \starttypen
+%D \handletokens some tokens\with \somemacro
+%D \stoptypen
+%D
+%D At first sight the next implementation will suffice, but
+%D running this one shows that we loose the spaces. This is no
+%D surprise because we grab arguments and spaces preceding those
+%D are just ignored.
+%D
+%D \starttypen
+%D \def\nohandletokens#1\end%
+%D {}
+%D
+%D \def\dohandletokens#1#2\end%
+%D {\ifx#1\endoftoken
+%D \expandafter\nohandletokens
+%D \else
+%D \docommando{#1}%
+%D \expandafter\dohandletokens
+%D \fi
+%D #2\end}
+%D
+%D \long\def\handletokens#1\with#2%
+%D {\let\docommando=#2\relax
+%D \dohandletokens#1\endoftoken\end}
+%D \stoptypen
+%D
+%D A second approach therefore grabs the indicidual characters
+%D by using \type{\afterassignment}, in which case the space is
+%D read in as space.
+%D
+%D \starttypen
+%D \def\dodohandletokens%
+%D {\ifx\next\end \else
+%D \docommando\next
+%D \expandafter\dohandletokens
+%D \fi}
+%D
+%D \def\dohandletokens%
+%D {\afterassignment\dodohandletokens\let\next= }
+%D
+%D \long\def\handletokens#1\with#2%
+%D {\let\docommando=#2%
+%D \dohandletokens#1\end}
+%D \stoptypen
+
+%D \macros
+%D {counttoken}
+%D
+%D For the few occasion sthat we want to know the number of
+%D specific tokens in a string, we can use:
+%D
+%D \starttypen
+%D \counttoken token\in string\to \count
+%D \stoptypen
+%D
+%D This macro, that for instance is used in \type{cont-tab},
+%D takes a real counter. The macro can be preceded by \type
+%D {\doglobal}.
+
+\def\counttoken#1\in#2\to#3%
+ {\redoglobal#3=0
+ \def\!!stringa{#1}%
+ \def\!!stringb{\end}%
+ \def\docounttoken##1% obeys {}
+ {\def\!!stringc{##1}%
+ \ifx\!!stringb\!!stringc \else
+ \ifx\!!stringa\!!stringc
+ \dodoglobal\advance#3 by 1
+ \fi
+ \expandafter\docounttoken
+ \fi}%
+ \docounttoken#2\end
+ \resetglobal}
+
+%D \macros
+%D {splitofftokens}
+%D
+%D Running this one not always gives the expected results.
+%D Consider for instance the macro for which I originally
+%D wrote this token handler.
+
+\long\def\splitofftokens#1\from#2\to#3%
+ {\ifnum#1>0
+ \scratchcounter=#1\relax
+ \def\dosplitofftokens##1%
+ {\ifnum\scratchcounter>0
+ \advance\scratchcounter by -1
+ \edef#3{#3##1}%
+ \fi}%
+ % \let#3=\empty % #3 can be #2, so:
+ \@EA\let\@EA#3\@EA\empty
+ \@EA\handletokens#2\with\dosplitofftokens
+ \else
+ \edef#3{#2}%
+ \fi}
+
+%D This macro can be called like:
+%D
+%D \startbuffer[example]
+%D \splitofftokens10\from01234567 890123456789\to\test [\test]
+%D \stopbuffer
+%D
+%D However, the characters that we expect to find in
+%D \type{\test} just don;t show up there. The reason for this
+%D is not that logical but follows from \TEX's sometimes
+%D mysterious way of expanding. Look at this:
+%D
+%D \startbuffer[next]
+%D \def\next{a} \edef\test{\next} [\test]
+%D \let\next=b \edef\test{\test\next} [\test]
+%D \let\next=c \edef\test{\next} [\test]
+%D \let\next=d \edef\test{\test\next} [\test]
+%D \let\next=e \@EA\edef\@EA\test\@EA{\test\next} [\test]
+%D \stopbuffer
+%D
+%D \typebuffer[next]
+%D
+%D Careful reading shows that inside an \type{\edef} macro's
+%D that are \type{\let} are not expanded!
+%D
+%D \unprotect\haalbuffer[next]\protect
+%D
+%D That's why we finally end up with a macro that looks ahead
+%D by using an assignment, this time by using
+%D \type{\futurelet}, and grabbing an argument as well. That
+%D way we can handle both the sentinal and the blank space.
+
+\def\dodohandletokens#1%
+ {\ifx\next\blankspace
+ \dododohandletokens{ }%
+ \fi
+ \ifx#1\end \else
+ \dododohandletokens{#1}%
+ \expandafter\dohandletokens
+ \fi}
+
+\def\dohandletokens%
+ {\futurelet\next\dodohandletokens}
+
+\long\def\handletokens#1\with#2%
+ {\global\let\dododohandletokens=#2%
+ \dohandletokens#1\end}
+
+%D A previous version said \type{\docommando=#2}, but to enable
+%D use in alignments, I decided to use another placeholder, one
+%D that is not sensitive to the global assignment.
+
+%D So our example finaly shows up as:
+%D
+%D \haalbuffer[example]
+
+% %D \macros
+% %D {iftrialtypesetting}
+% %D
+% %D The next boolean is at first sight a strange one. Sometimes
+% %D one does a trial typesetting run, for instance to determine
+% %D dimensions. Some mechanisms, like object inclusion, can fail
+% %D on such trials. Temporary setting the next boolean to true,
+% %D helps a lot.
+%
+% \newif\iftrialtypesetting
+
+%D \macros
+%D {startlocal, startglobal}
+%D
+%D The next four macros are rather self explaining:
+%D
+%D \starttypen
+%D \startlocal
+%D whatever assignments
+%D \stoplocal
+%D
+%D \startglobal
+%D whatever assignments
+%D \stopglobal
+%D \stoptypen
+%D
+%D These macros are meant for those who know the difference
+%D between local and global assignments and are aware of the
+%D possible unwanted side effect
+
+\def\dostartglobaldefs#1#2%
+ {\edef\!!stringa{\the\globaldefs}%
+ \ifnum\globaldefs#10
+ \globaldefs=-\globaldefs
+ \fi
+ \advance\globaldefs by #21
+ \setevalue{@gd@\the\globaldefs}{\!!stringa}}
+
+\def\dostopglobaldefs%
+ {\doifdefinedelse{@gd@\the\globaldefs}
+ {\globaldefs=\getvalue{@gd@\the\globaldefs}\relax}
+ {\globaldefs=0\relax}}
+
+\def\startlocal {\dostartglobaldefs>-}
+\def\stoplocal {\dostopglobaldefs}
+\def\startglobal {\dostartglobaldefs<+}
+\def\stopglobal {\dostopglobaldefs}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/syst-gen.tex b/tex/context/base/syst-gen.tex index 9cdc8dd62..b4dd69fed 100644 --- a/tex/context/base/syst-gen.tex +++ b/tex/context/base/syst-gen.tex @@ -1,2719 +1,2723 @@ -%D \module -%D [ file=syst-gen, -%D version=1996.3.20, -%D title=\CONTEXT\ System Macros, -%D subtitle=General, -%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. - -%D The following macros are responsible for the interaction -%D with \CONTEXT. These macros have proven their use. These -%D macros are optimized as far as possible within of course, -%D the know how of the author. -%D -%D In this module we also show some of the optimizations, -%D mainly because we don't want to forget them and start doing -%D things over and over again. If showing them has a learing -%D effect for others too, we've surved another purpose too. - -%D \macros -%D {abortinputifdefined} -%D {} -%D -%D Because this module can be used in a different context, we -%D want to prevent it being loaded more than once. This can be -%D done using: -%D -%D \starttypen -%D \abortinputifdefined\command -%D \stoptypen -%D -%D where \type{\command} is a command defined in the module -%D to be loaded only once. -%D -%D \starttypen -%D \def\abortinputifdefined#1% -%D {\ifx#1\undefined -%D \let\next=\relax -%D \else -%D \let\next=\endinput -%D \fi -%D \next} -%D \stoptypen -%D -%D This macro can be speed up in terms of speed as well as -%D memory. Because this is a nice example of a bit strange -%D command (\type{\endinput}), we spend some more lines on this. -%D -%D If we perform such actions directly, we can say: -%D -%D \starttypen -%D \ifx\somecommand\undefined -%D \let\next=\relax -%D \else -%D \let\next=\endinput -%D \fi -%D \next -%D \stoptypen -%D -%D We need the \type{\next} because we need to end the -%D \type{\fi}. The efficient one is: -%D -%D \starttypen -%D \ifx\somecommand\undefined -%D \else -%D \expandafter\endinput -%D \fi -%D \stoptypen -%D -%D Because \type{\endinput} comes into action after the current -%D line, we can also say: -%D -%D \starttypen -%D \ifx\somecommand\undefined \else \endinput \fi -%D \stoptypen -%D -%D When we define a macro, we tend to use a format which -%D shows as besat as can how things are done. \TEX\ however -%D stores the definitions as a sequence of tokens, so in fact -%D we can use a formatted definition: - -\def\abortinputifdefined#1% - {\ifx#1\undefined \else - \endinput - \fi} - -%D which also works. Keep in mind that this is entirely due to -%D the fact that \type{\endinput} after the line, i.e. at the -%D end of the macro. We therefore can burry this primitive quite -%D deep in code. - -%D And because this module implements \type{\writestatus}, we -%D just say: - -\abortinputifdefined\writestatus - -%D Normally we tell the users what module is being loaded. -%D However, the command that is needed for this is not yet -%D defined. -%D -%D \starttypen -%D \writestatus{laden}{Context Systeem Macro's (a)} -%D \stoptypen - -%D \macros -%D [beschermen] -%D {protect,unprotect} -%D {} -%D -%D We can shield macros from users by using some special -%D characters in their names. Some characters that are normally -%D no letters and therefore often used are: \type{@}, \type{!} -%D and \type{?}. Before and after the definition of protected -%D macros, we have to change the \CATCODE\ of these characters. -%D This is done by \type{\unprotect} and \type{\protect}, for -%D instance: -%D -%D \starttypen -%D \unprotect -%D \def\!test{test} -%D \protect -%D \stoptypen -%D -%D The defined command \type{\!test} can of course only be -%D called upon when we are in the \type{\unprotect}'ed state, -%D otherwise \TEX\ reads \type{\!} and probably complains -%D loudly about not being in math mode. -%D -%D Both commands can be used nested, but only the \CATCODE\ -%D of the outermost level is saved. We make use of -%D an auxilary macro \type{\doprotect} to prevent us from -%D conflicts with existing macro's \type{\protect}. When -%D nesting deeper than one level, the system shows the -%D protection level. - -\newcount\protectionlevel - -\ifx\protect\undefined - \def\protect{\message{<too much protection>}} -\fi - -\let\normalprotect=\protect - -%D Although we don't need the \type{%} after commands that -%D don't take arguments, unless lines are obeyed, I decided -%D to put it there as a reminder. I only mention this once. - -\def\unprotect% - {\ifnum\protectionlevel=0 - \edef\doprotectcharacters% - {\catcode`@=\the\catcode`@\relax - \catcode`!=\the\catcode`!\relax - \catcode`?=\the\catcode`?\relax}% - \catcode`@=11 - \catcode`!=11 - \catcode`?=11 - \let\protect=\doprotect - \fi - \advance\protectionlevel by 1 - \ifnum\protectionlevel>1 - \message{<unprotect \the\protectionlevel>}% - \fi} - -\def\doprotect% - {\ifnum\protectionlevel=1 - \doprotectcharacters - \let\protect=\normalprotect - \fi - \ifnum\protectionlevel>1 - \message{<protect \the\protectionlevel>}% - \fi - \advance\protectionlevel by -1\relax} - -%D Now it is defined, we can make use of this very useful -%D macro. - -\unprotect - -%D \macros -%D {@@escape,@@begingroup,@@endgroup,@@mathshift,@@alignment, -%D @@endofline,@@parameter,@@superscript,@@subscript, -%D @@ignore,@@space,@@letter,@@other,@@active,@@comment} -%D {} -%D -%D In \CONTEXT\ we sometimes manipulate the \CATCODES\ of -%D certain characters. Because we are not that good at numbers, -%D we introduce some symbolic names. - -\chardef\@@escape = 0 -\chardef\@@begingroup = 1 -\chardef\@@endgroup = 2 -\chardef\@@mathshift = 3 -\chardef\@@alignment = 4 -\chardef\@@endofline = 5 -\chardef\@@parameter = 6 -\chardef\@@superscript = 7 -\chardef\@@subscript = 8 -\chardef\@@ignore = 9 -\chardef\@@space = 10 -\chardef\@@letter = 11 -\chardef\@@other = 12 \chardef\other = 12 -\chardef\@@active = 13 \chardef\active = 13 -\chardef\@@comment = 14 - -%D \macros -%D {normalspace} -%D {} -%D -%D We often need a space as defined in \PLAIN\ \TEX. Because -%D we cannot be sure of \type{\space} is redefined, we define: - -\def\normalspace{ } - -%D \macros -%D {scratchcounter, -%D scratchdimen,scratchskip,scratchmuskip, -%D scratchbox, -%D scratchtoks -%D ifdone} -%D {} -%D -%D Because we often need counters on a temporary basis, we -%D define the \COUNTER\ \type{\scratchcounter}. This is a -%D real \COUNTER, and not a pseudo one, as we will meet -%D further on. We also define some other scratch registers. - -\newcount \scratchcounter -\newdimen \scratchdimen -\newskip \scratchskip -\newmuskip \scratchmuskip -\newbox \scratchbox -\newtoks \scratchtoks -\newif \ifdone - -%D \macros -%D {ifCONTEXT} -%D {} -%D -%D In the system and support modules we sometimes show examples -%D that make use of core commands. We can skip those parts of -%D the documentation when we use another macropackage. Of -%D course we default to false. - -\newif \ifCONTEXT - -%D \macros -%D {!!count, !!toks, !!dimen, !!box, -%D !!width, !!height, !!depth, !!string, !!done} -%D {} -%D -%D We define some more \COUNTERS\ and \DIMENSIONS. We also -%D define some shortcuts to the local scatchregisters~0, 2, 4, -%D 6 and~8. - -\newcount\!!counta \toksdef\!!toksa=0 \dimendef\!!dimena=0 \chardef\!!boxa=0 -\newcount\!!countb \toksdef\!!toksb=2 \dimendef\!!dimenb=2 \chardef\!!boxb=2 -\newcount\!!countc \toksdef\!!toksc=4 \dimendef\!!dimenc=4 \chardef\!!boxc=4 -\newcount\!!countd \toksdef\!!toksd=6 \dimendef\!!dimend=6 \chardef\!!boxd=6 -\newcount\!!counte \toksdef\!!tokse=8 \dimendef\!!dimene=8 \chardef\!!boxe=8 -\newcount\!!countf - -\def\!!stringa{} \def\!!stringb{} \def\!!stringc{} -\def\!!stringd{} \def\!!stringe{} \def\!!stringf{} - -\newdimen\!!widtha \newdimen\!!heighta \newdimen\!!deptha \newif\if!!donea -\newdimen\!!widthb \newdimen\!!heightb \newdimen\!!depthb \newif\if!!doneb - -%D \macros -%D {s!,c!,e!,p!,v!,@@,??} -%D {} -%D -%D To save memory, we use constants (sometimes called -%D variables). Redefining these constants can have desastrous -%D results. - -\def\v!prefix! {v!} \def\c!prefix! {c!} -\def\s!prefix! {s!} \def\p!prefix! {p!} - -\def\s!next {next} \def\s!default {default} -\def\s!dummy {dummy} \def\s!unknown {unknown} - -\def\s!do {do} \def\s!dodo {dodo} - -\def\s!complex {complex} \def\s!start {start} -\def\s!simple {simple} \def\s!stop {stop} - -%D \macros -%D {@EA,expanded} -%D {} -%D -%D When in unprotected mode, to be entered with -%D \type{\unprotect}, one can use \type{\@EA} as equivalent -%D of \type{\expandafter}. - -\let\@EA=\expandafter - -%D Sometimes we pass macros as arguments to commands that -%D don't expand them before interpretation. Such commands can -%D be enclosed with \type{\expanded}, like: -%D -%D \starttypen -%D \expanded{\setupsomething[\alfa]} -%D \stoptypen -%D -%D Such situations occur for instance when \type{\alfa} is a -%D commalist or when data stored in macros is fed to index of -%D list commands. If needed, one should use \type{\noexpand} -%D inside the argument. Later on we will meet some more clever -%D alternatives to this command. - -\def\expanded#1% - {\edef\@@expanded{\noexpand#1}\@@expanded} - -%D \macros -%D {gobbleoneargument,gobble...arguments} -%D {} -%D -%D The next set of macros just do nothing, except that they -%D get rid of a number of arguments. - -\long\def\gobbleoneargument #1{} -\long\def\gobbletwoarguments #1#2{} -\long\def\gobblethreearguments #1#2#3{} -\long\def\gobblefourarguments #1#2#3#4{} -\long\def\gobblefivearguments #1#2#3#4#5{} -\long\def\gobblesixarguments #1#2#3#4#5#6{} -\long\def\gobblesevenarguments #1#2#3#4#5#6#7{} -\long\def\gobbleeightarguments #1#2#3#4#5#6#7#8{} -\long\def\gobbleninearguments #1#2#3#4#5#6#7#8#9{} - -%D \macros -%D {doifnextcharelse} -%D {} -%D -%D When we started using \TEX\ in the late eighties, our -%D first experiences with programming concerned a simple shell -%D around \LATEX. The commands probably use most at \PRAGMA, -%D are the itemizing ones. One of those few shell commands took -%D care of an optional argument, that enabled us to specify -%D what kind of item symbol we wanted. Without understanding -%D anything we were able to locate a \LATEX\ macro that could -%D be used to inspect the next character. -%D -%D It's this macro that the ancester of the next one presented -%D here. It executes one of two actions, dependant of the next -%D character. Disturbing spaces and line endings, which are -%D normally interpreted as spaces too, are skipped. -%D -%D \starttypen -%D \doifnextcharelse {karakter} {then ...} {else ...} -%D \stoptypen -%D -%D This macro differs from the original in testing on -%D \type{\endoflinetoken}, which of course we have to define -%D first. We also use \type{\localnext} because we don't want -%D clashes with \type{\next}. - -\let\endoflinetoken=^^M - -\long\def\doifnextcharelse#1#2#3% - {\let\charactertoken=#1% - \def\!!stringa{#2}% - \def\!!stringb{#3}% - \futurelet\nexttoken\inspectnextcharacter} - -\def\inspectnextcharacter% - {\ifx\nexttoken\blankspace - \let\localnext\reinspectnextcharacter - \else\ifx\!!stringc\endoflinetoken - \let\localnext\reinspectnextcharacter - \else\ifx\nexttoken\charactertoken - \let\localnext\!!stringa - \else - \let\localnext\!!stringb - \fi\fi\fi - \localnext} - -%D This macro uses some auxiliary macros. Although we were able -%D to program quite complicated things, I only understood these -%D after rereading the \TEX book. The trick is in using a -%D command with a one character name. Such commands differ from -%D the longer ones in the fact that trailing spaces are {\em -%D not} skipped. This enables us to indirectly define a long -%D named macro that gobbles a space. -%D -%D In the first line we define \type{\blankspace}. Next we -%D make \type{\:} equivalent to \type{\reinspect...}. This -%D one||character command is expanded before the next -%D \type{\def} comes into action. This way the space after -%D \type{\:} becomes a delimiter of the longer named -%D \type{\reinspectnextcharacter}. The chain reaction is -%D visually compatible with the next sequence: -%D -%D \starttypen -%D \expandafter\def\reinspectnextcharacter % -%D {\futurelet\nexttoken\inspectnextcharacter} -%D \stoptypen -%D -%D However complicated it may look, I'm still glad I stumbled -%D into this construction. - -\def\:{\let\blankspace= } \: - -\def\:{\reinspectnextcharacter} - -\expandafter\def\: {\futurelet\nexttoken\inspectnextcharacter} - -%D \macros -%D {setvalue,setgvalue,setevalue,setxvalue, -%D letvalue, -%D getvalue, -%D resetvalue} -%D {} -%D -%D \TEX's primitive \type{\csname} can be used to construct -%D all kind of commands that cannot be defined with -%D \type{\def} and \type{\let}. Every macro programmer sooner -%D or later wants macros like these. -%D -%D \starttypen -%D \setvalue {naam}{...} = \def\naam{...} -%D \setgvalue {naam}{...} = \gdef\naam{...} -%D \setevalue {naam}{...} = \edef\naam{...} -%D \setxvalue {naam}{...} = \xdef\naam{...} -%D \letvalue {naam}=\... = \let\naam=\... -%D \getvalue {naam} = \naam -%D \resetvalue {naam} = \def\naam{} -%D \stoptypen -%D -%D As we will see, \CONTEXT\ uses these commands many times, -%D which is mainly due to its object oriented and parameter -%D driven character. - -\def\setvalue#1% - {\expandafter\def\csname#1\endcsname} - -\def\setgvalue#1% - {\expandafter\gdef\csname#1\endcsname} - -\def\setevalue#1% - {\expandafter\edef\csname#1\endcsname} - -\def\setxvalue#1% - {\expandafter\xdef\csname#1\endcsname} - -\def\getvalue#1% - {\csname#1\endcsname} - -\def\letvalue#1% - {\expandafter\let\csname#1\endcsname} - -\def\resetvalue#1% - {\setvalue{#1}{}} - -%D \macros -%D {donottest,unexpanded} -%D {} -%D -%D When expansion of a macro gives problems, we can precede it -%D by \type{\donottest}. It seems that protection is one of the -%D burdens of developers of packages, so maybe that's why in -%D \ETEX\ protection is solved in a more robust way. -%D -%D Sometimes prefixing the macro with \type{\donottest} leads -%D to defining an auxiliary macro, like -%D -%D \starttypen -%D \def\dosomecommand {... ... ...} -%D \def\somecommand {\donottest\dosomecommand} -%D \stoptypen -%D -%D This double definition can be made transparant by using -%D \type{\protecte}, as in: -%D -%D \starttypen -%D \unexpanded\def\somecommand{... ... ...} -%D \stoptypen -%D -%D The protection mechanism uses: - -\def\dontprocesstest#1% - {==} - -\def\doprocesstest#1% - {#1} - -\let\donottest=\doprocesstest - -%D By the way, we use a placeholder because we don't want -%D interference when testing on empty strings. Using a -%D placeholder of 8~characters increases the processing time -%D of simple \type{\doifelse} tests by about 10 \%. When we -%D process the test, we have to remove the braces and -%D therefore explictly gobble \type{#1}. - -%D The fact that many macros have the same prefix, could have -%D a negative impact on searching in the hash table. Because -%D some simple testing does not show differences, we just use: -%D -%D \starttypen -%D \def\unexpanded#1#2% -%D {\@EA#1\@EA#2\@EA{\@EA\donottest\csname\s!do\string#2\endcsname}% -%D \@EA#1\csname\s!do\string#2\endcsname} -%D \stoptypen -%D -%D Well, in fact we use the bit more versaatile alternative: - -\ifnoETEX \def\dosetunexpanded#1#2% - {\@EA#1\@EA{\@EA#2\@EA}% - \@EA{\@EA\donottest\csname\s!do\@EA\string\csname#2\endcsname\endcsname}% - \@EA#1{\s!do\@EA\string\csname#2\endcsname}} - -\ifnoETEX \def\docomunexpanded#1#2% - {\@EA#1\@EA#2\@EA{\@EA\donottest\csname\s!do\string#2\endcsname}% - \@EA#1\csname\s!do\string#2\endcsname} - -\ifnoETEX \def\unexpanded#1% - {\def\dounexpanded% - {\ifx\next\bgroup - \@EA\dosetunexpanded - \else - \@EA\docomunexpanded - \fi#1}% - \futurelet\next\dounexpanded} - -\doifETEX \let\unexpanded=\normalprotected - -%D This one accepts the more direct \type{\def} and cousins -%D as well as the \CONTEXT\ specific \type{\setvalue} ones. -%D -%D And so the definition in our example turns out to be: -%D -%D \starttypen -%D \def\csname do\somecommand\endcsname{... ... ...} -%D \def\somecommand{\donottest\csname do\somecommand\endcsname} -%D \stoptypen -%D -%D In which \type{do\somecommand} is hidden from the user and -%D cannot lead to confusion. It's still permitted to define -%D auxiliary macros like \type{\dosomecommand}. -%D -%D When we are going to use e-\TEX, we'll probably end up -%D redefining some commands, but we can probably keep the -%D \type{\unexpanded} ones unchanged. - -%D \macros -%D {doifundefined,doifdefined, -%D doifundefinedelse,doifdefinedelse, -%D doifalldefinedelse} -%D {} -%D -%D The standard way of testing if a macro is defined is -%D comparing its meaning with another undefined one, usually -%D \type{\undefined}. To garantee correct working of the next -%D set of macros, \type{\undefined} may never be defined! -%D -%D \starttypen -%D \doifundefined {string} {...} -%D \doifdefined {string} {...} -%D \doifundefinedelse {string} {then ...} {else ...} -%D \doifdefinedelse {string} {then ...} {else ...} -%D \doifalldefinedelse {commalist} {then ...} {else ...} -%D \stoptypen -%D -%D Every macroname that \TEX\ builds gets an entry in the hash -%D table, which is of limited size. It is expected that e-\TeX\ -%D will offer a less memory||consuming alternative. - -%D Although it will probably never be a big problem, it is good -%D to be aware of the difference between testing on a macro -%D name to be build by using \type{\csname} and -%D \type{\endcsname} and testing the \type{\name} directly. -%D -%D \starttypen -%D \expandafter\ifx\csname NameA\endcsname\relax ... \else ... \fi -%D -%D \ifx\NameB\undefined ... \else ... \fi -%D \stoptypen -%D -%D I became aware of this when I mistakenly testen the first -%D one against \type{\undefined}. When \TEX\ build a name using -%D \type{\csname} it automatically sets it to \type{\relax}, -%D which is definitely not the same as \type{\undefined}. The -%D quickest way to check these things is asking \TEX\ to show -%D the meaning of the names: -%D -%D \starttypen -%D \expandafter\show\csname NameA\endcsname -%D -%D \show\NameB -%D \stoptypen -%D -%D The main reason why this never will be a big problem is that -%D when one uses the \type{\csname} way, one probably has to do -%D with some macroname that always is dealt with that way. -%D Confusion can however arise when one applies both testing -%D methods to the same macroname. By the way, the assignment -%D of \type{\relax} obeys grouping. - -%D The first one gets rid of \type{#1}, but still expands to -%D something and the second one expands to \type{#1}. Because -%D we accept arguments between \type{{}}, we have to get rid -%D of one level of braces. -%D -%D Our first implementation of \type{\ifundefined} was -%D straightforward and readable: -%D -%D \starttypen -%D \def\ifundefined#1% -%D {\expandafter\ifx\csname#1\endcsname\relax}% -%D -%D \def\doifundefinedelse#1#2#3% -%D {\let\donottest=\dontprocesstest -%D \ifundefined{#1}% -%D \let\donottest=\doprocesstest#2% -%D \else -%D \let\donottest=\doprocesstest#3% -%D \fi} -%D -%D \def\doifdefinedelse#1#2#3% -%D {\doifundefinedelse{#1}{#3}{#2}} -%D -%D \def\doifundefined#1#2% -%D {\doifundefinedelse{#1}{#2}{}} -%D -%D \def\doifdefined#1#2% -%D {\doifundefinedelse{#1}{}{#2}} -%D -%D \def\doifalldefinedelse#1#2#3% -%D {\bgroup -%D \donetrue -%D \def\checkcommand##1% -%D {\doifundefined{##1}{\donefalse}}% -%D \processcommalist[#1]\checkcommand -%D \ifdone -%D \egroup#2% -%D \else -%D \egroup#3% -%D \fi} -%D \stoptypen -%D -%D When this module was optimized, timing showed that the -%D next alternative can be upto twice as fast, especially when -%D longer arguments are used. - -\def\ifundefined#1% - {\expandafter\ifx\csname#1\endcsname\relax} - -\def\p!doifundefined#1% - {\let\donottest=\dontprocesstest - \expandafter\ifx\csname#1\endcsname\relax} - -\def\doifundefinedelse#1#2#3% - {\p!doifundefined{#1}% - \let\donottest=\doprocesstest#2% - \else - \let\donottest=\doprocesstest#3% - \fi} - -\def\doifdefinedelse#1#2#3% - {\p!doifundefined{#1}% - \let\donottest=\doprocesstest#3% - \else - \let\donottest=\doprocesstest#2% - \fi} - -\def\doifundefined#1#2% - {\p!doifundefined{#1}% - \let\donottest=\doprocesstest#2% - \else - \let\donottest=\doprocesstest - \fi} - -\def\doifdefined#1#2% - {\p!doifundefined{#1}% - \let\donottest=\doprocesstest - \else - \let\donottest=\doprocesstest#2% - \fi} - -\doifETEX \def\ifundefined#1% - {\unless\ifcsname#1\endcsname} - -\doifETEX \def\p!doifundefined#1% - {\let\donottest=\dontprocesstest - \unless\ifcsname#1\endcsname} - -%D Before we start using this variant, we used another one, -%D which is even a bit faster. This one looked like: -%D -%D \starttypen -%D \def\p!doifundefined% -%D {\begingroup -%D \let\donottest=\dontprocesstest -%D \ifundefined} -%D -%D \def\doifundefinedelse#1#2#3% -%D {\p!doifundefined{#1}% -%D \endgroup#2% -%D \else -%D \endgroup#3% -%D \fi} -%D \stoptypen -%D -%D A even more previous version used \type{\bgroup} and -%D \type{\egroup}. In math mode however, \type{$1{x}2$} differs -%D from \type{$1x2$}. This can been seen when one compares the -%D output of: -%D -%D \starttypen -%D $\kern10pt\showthe\lastkern$ -%D $\kern10pt{\showthe\lastkern}$ -%D $\kern10pt\begingroup\showthe\lastkern\endgroup$ -%D \stoptypen -%D -%D When we were developing the scientific units module, we -%D encountered different behavior in text and math mode, which -%D was due to this grouping subtilities. We therefore decided -%D to use \type{\begingroup} instead of \type{\bgroup}. -%D Later, when we had optimized some macro's the grouped -%D solution turned out to be unsafe when typesetting this -%D documentation, especially when using \type{\globaldefs}. -%D -%D We still have to define \type{\doifalldefinedelse}. Watch -%D the use of grouping, which garantees local use of the -%D boolean \type{\ifdone}. - -\def\docheckonedefined#1% - {\ifundefined{#1}% - \donefalse - \fi} - -\def\doifalldefinedelse#1#2#3% - {\begingroup - \let\donottest=\dontprocesstest - \donetrue - \processcommalist[#1]\docheckonedefined - \ifdone - \endgroup\let\donottest=\doprocesstest#2% - \else - \endgroup\let\donottest=\doprocesstest#3% - \fi} - -%D \macros -%D {doif,doifelse,doifnot, -%D donottest} -%D {} -%D -%D Programming in \TEX\ differs from programming in procedural -%D languages like \MODULA. This means that one --- well, let me -%D speek for myself --- tries to do the things in the well -%D known way. Therefore the next set of \type{\ifthenelse} -%D commands were between the first ones we needed. A few years -%D later, the opposite became true: when programming in -%D \MODULA, I sometimes miss handy things like grouping, -%D runtime redefinition, expansion etc. While \MODULA\ taught -%D me to structure, \TEX\ taught me to think recursive. -%D -%D \starttypen -%D \doif {string1} {string2} {...} -%D \doifnot {string1} {string2} {...} -%D \doifelse {string1} {string2} {then ...}{else ...} -%D \stoptypen -%D -%D When expansion gives problems, we can precede the -%D troublemaker with \type{\donottest}. -%D -%D This implementatie does not use the construction which is -%D more robust for nested conditionals. -%D -%D \starttypen -%D \ifx\!!stringa\!!stringb -%D \def\next{#3}% -%D \else -%D \def\next{#4}% -%D \fi -%D \next -%D \stoptypen -%D -%D In practice, this alternative is at least 20\% slower than -%D the alternative used here. The few cases in which we -%D really need the \type{\next} construction, often need some -%D other precautions and or adaptions too. - -\long\def\doif#1#2#3% - {\let\donottest=\dontprocesstest - \edef\!!stringa{#1}% - \edef\!!stringb{#2}% - \let\donottest=\doprocesstest - \ifx\!!stringa\!!stringb - #3% - \fi} - -\long\def\doifnot#1#2#3% - {\let\donottest=\dontprocesstest - \edef\!!stringa{#1}% - \edef\!!stringb{#2}% - \let\donottest=\doprocesstest - \ifx\!!stringa\!!stringb - \else - #3% - \fi} - -\long\def\doifelse#1#2#3#4% - {\let\donottest=\dontprocesstest - \edef\!!stringa{#1}% - \edef\!!stringb{#2}% - \let\donottest=\doprocesstest - \ifx\!!stringa\!!stringb - #3% - \else - #4% - \fi} - -%D One could wonder why we don't follow the the same approach -%D as in \type{\doifdefined} c.s.\ and use \type{\begingroup} -%D and \type{\endgroup}. In this case, this alternative is -%D slower, which is probably due to the fact that more meanings -%D need to be restored. -%D -%D The in terms of memory more efficient alternative using a -%D auxiliary macro also proved to be slower, so we definitely -%D did not choose for: -%D -%D \starttypen -%D \def\p!doifelse#1#2% -%D {\let\donottest=\dontprocesstest -%D \edef\!!stringa{#1}% -%D \edef\!!stringb{#2}% -%D \let\donottest=\doprocesstest -%D \ifx\!!stringa\!!stringb} -%D -%D \long\def\doif#1#2#3% -%D {\p!doifelse{#1}{#2}#3\fi} -%D -%D \long\def\doifnot#1#2#3% -%D {\p!doifelse{#1}{#2}\else#3\fi} -%D -%D \long\def\doifelse#1#2#3#4% -%D {\p!doifelse{#1}{#2}#3\else#4\fi} -%D \stoptypen -%D -%D Optimizations like this are related of course to the -%D bottlenecks in \TEX. It seems that restoring saved meanings -%D and passing arguments takes some time. - -%D \macros -%D {doifempty,doifemptyelse,doifnotempty} -%D {} -%D -%D We complete our set of conditionals with: -%D -%D \starttypen -%D \doifempty {string} {...} -%D \doifnot {string} {...} -%D \doifemptyelse {string} {then ...} {else ...} -%D \stoptypen -%D -%D This time, the string is not expanded. - -\long\def\doifemptyelse#1#2#3% - {\def\!!stringa{#1}% - \ifx\!!stringa\empty - #2% - \else - #3% - \fi} - -\long\def\doifempty#1#2% - {\def\!!stringa{#1}% - \ifx\!!stringa\empty - #2% - \fi} - -\long\def\doifnotempty#1#2% - {\def\!!stringa{#1}% - \ifx\!!stringa\empty - \else - #2% - \fi} - -%D \macros -%D {doifinset,doifnotinset,doifinsetelse} -%D {} -%D -%D We can check if a string is present in a comma separated -%D set of strings. Depending on the result, some action is -%D taken. -%D -%D \starttypen -%D \doifinset {string} {string,...} {...} -%D \doifnotinset {string} {string,...} {...} -%D \doifinsetelse {string} {string,...} {then ...} {else ...} -%D \stoptypen -%D -%D The second argument is the comma separated set of strings. -%D -%D \starttypen -%D \long\def\doifinsetelse#1#2#3#4% -%D {\doifelse{#1}{} -%D {#4} -%D {\donefalse -%D \def\v!checkiteminset##1% -%D {\doif{#1}{##1} -%D {\donetrue -%D \let\v!checkiteminset=\gobbleoneargument}}% -%D \processcommalist[#2]\v!checkiteminset -%D \ifdone -%D #3% -%D \else -%D #4% -%D \fi}} -%D -%D \long\def\doifinset#1#2#3% -%D {\doifinsetelse{#1}{#2}{#3}{}} -%D -%D \long\def\doifnotinset#1#2#3% -%D {\doifinsetelse{#1}{#2}{}{#3}} -%D \stoptypen -%D -%D Because this macro is called quite often we've spent some -%D time optimizing it. This time, the gain in speed is due to -%D (1)~defining an external auxiliary macro, (2)~not calling -%D any other macros and (3)~minimizing the passing of -%D arguments. The gain in speed is impressive. - -\def\p!dodocheckiteminset#1% - {\edef\!!stringb{#1}% - \ifx\!!stringa\!!stringb - \donetrue - \let\p!docheckiteminset=\gobbleoneargument - \fi} - -\def\p!doifinsetelse#1#2% - {\let\donottest=\dontprocesstest - \donefalse - \edef\!!stringa{#1}% - \ifx\!!stringa\empty - \else - \let\p!docheckiteminset=\p!dodocheckiteminset - \processcommalist[#2]\p!docheckiteminset - \fi - \let\donottest=\doprocesstest - \ifdone} - -\long\def\doifinsetelse#1#2#3#4% - {\p!doifinsetelse{#1}{#2}% - #3% - \else - #4% - \fi} - -\long\def\doifinset#1#2#3% - {\p!doifinsetelse{#1}{#2}% - #3% - \fi} - -\long\def\doifnotinset#1#2#3% - {\p!doifinsetelse{#1}{#2}% - \else - #3% - \fi} - -%D \macros -%D {doifcommon,doifnotcommon,doifcommonelse} -%D {} -%D -%D Probably the most time consuming tests are those that test -%D for overlap in sets of strings. -%D -%D \starttypen -%D \doifcommon {string,...} {string,...} {...} -%D \doifnotcommon {string,...} {string,...} {...} -%D \doifcommonelse {string,...} {string,...} {then ...} {else ...} -%D \stoptypen -%D -%D We show the slower alternative first, because it shows us -%D how things are done. -%D -%D \starttypen -%D \long\def\doifcommonelse#1#2#3#4% -%D {\donefalse -%D \def\p!docommoncheck##1% -%D {\def\p!dodocommoncheck####1% -%D {\doif{####1}{##1} -%D {\donetrue -%D \def\commalistelement{##1}% -%D \let\p!docommoncheck=\gobbleoneargument -%D \let\p!dodocommoncheck=\gobbleoneargument}}% -%D \processcommalist[#2]\p!dodocommoncheck}% -%D \processcommalist[#1]\p!docommoncheck -%D \ifdone -%D #3% -%D \else -%D #4% -%D \fi} -%D -%D \long\def\doifcommon#1#2#3% -%D {\doifcommonelse{#1}{#2}{#3}{}} -%D -%D \long\def\doifnotcommon#1#2#3% -%D {\doifcommonelse{#1}{#2}{}{#3}} -%D \stoptypen -%D -%D The processing time is shortened by getting the auxiliary -%D macro to the outermost level and using less \type{\edef}'s. -%D Sometimes it makes more sence to define local macro's not -%D only because this way we can be sure that they are not -%D redefined, but also because it shows the dependance. In -%D compiled languages, this is no problem at all. It can even -%D save us bytes and processing time. In interpreted languages -%D like \TEX\ it nearly always slows down processing. - -\def\p!dododocommoncheck#1% - {\edef\!!stringb{#1}% - \ifx\!!stringa\!!stringb - \donetrue - \let\p!docommoncheck\gobbleoneargument - \let\p!dodocommoncheck\gobbleoneargument - \fi} - -\def\p!doifcommonelse#1#2% - {\donefalse - \let\donottest\dontprocesstest - \let\p!dodocommoncheck\p!dododocommoncheck - \def\p!docommoncheck##1% - {\edef\!!stringa{##1}% - \def\commalistelement{##1}% - \processcommalist[#2]\p!dodocommoncheck}% - \processcommalist[#1]\p!docommoncheck - \let\donottest\doprocesstest - \ifdone} - -\long\def\doifcommonelse#1#2#3#4% - {\p!doifcommonelse{#1}{#2}% - #3% - \else - #4% - \fi} - -\long\def\doifcommon#1#2#3% - {\p!doifcommonelse{#1}{#2}% - #3% - \fi} - -\long\def\doifnotcommon#1#2#3% - {\p!doifcommonelse{#1}{#2}% - \else - #3% - \fi} - -%D \macros -%D {processcommalist,processcommacommand, -%D processcommalistwithparameters} -%D {} -%D -%D We've already seen some macros that take care of comma -%D separated lists. Such list can be processed with -%D -%D \starttypen -%D \processcommalist[string,string,...]\commando -%D \stoptypen -%D -%D The user supplied command \type{\commando} receives one -%D argument: the string. This command permits nesting and -%D spaces after commas are skipped. Empty sets are no problem. -%D -%D \startbuffer -%D \def\dosomething#1{(#1)} -%D -%D \processcommalist [\hbox{$a,b,c,d,e,f$}] \dosomething \par -%D \processcommalist [{a,b,c,d,e,f}] \dosomething \par -%D \processcommalist [{a,b,c},d,e,f] \dosomething \par -%D \processcommalist [a,b,{c,d,e},f] \dosomething \par -%D \processcommalist [a{b,c},d,e,f] \dosomething \par -%D \processcommalist [{a,b}c,d,e,f] \dosomething \par -%D \processcommalist [] \dosomething \par -%D \processcommalist [{[}] \dosomething \par -%D \stopbuffer -%D -%D \typebuffer -%D -%D Before we show the result, we present the macro's: - -\newcount\commalevel - -\def\dododoprocesscommaitem% - {\csname\s!next\the\commalevel\endcsname} - -\def\dodoprocesscommaitem% - {\ifx\nexttoken\blankspace - \let\nextcommaitem\redoprocesscommaitem - %\else\ifx\nexttoken\endoflinetoken - %\let\nextcommaitem\redoprocesscommaitem - \else\ifx\nexttoken]% - \let\nextcommaitem=\gobbleoneargument - \else - \let\nextcommaitem=\dododoprocesscommaitem - \fi\fi%\fi - \nextcommaitem} - -\def\doprocesscommaitem% - {\futurelet\nexttoken\dodoprocesscommaitem} - -\def\doprocesscommalist#1]#2% - {\advance\commalevel by 1\relax - \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,% - {#2{##1}\doprocesscommaitem}% - \doprocesscommaitem#1,]\relax - \advance\commalevel by -1\relax} - -%D Empty arguments are not processed. Empty items (\type{,,}) -%D however are treated. - -\def\docheckcommaitem% - {\ifx\nexttoken]% - \let\nextcommaitem=\gobbletwoarguments - \else - \let\nextcommaitem=\doprocesscommalist - \fi - \nextcommaitem} - -\def\processcommalist[% - {\futurelet\nexttoken\docheckcommaitem} - -%D We use the same hack for checking the next character, that -%D we use in \type{\doifnextcharelse}. - -\def\:{\redoprocesscommaitem} - -\expandafter\def\: {\futurelet\nexttoken\dodoprocesscommaitem} - -%D The previous examples lead to: -%D -%D \haalbuffer - -%D When a list is saved in a macro, we can use a construction -%D like: -%D -%D \starttypen -%D \expandafter\processcommalist\expandafter[\list]\command -%D \stoptypen -%D -%D Such solutions suit most situations, but we wanted a bit -%D more. -%D -%D \starttypen -%D \processcommacommand[string,\stringset,string]\commando -%D \stoptypen -%D -%D where \type{\stringset} is a predefined set, like: -%D -%D \starttypen -%D \def\first{aap,noot,mies} -%D \def\second{laatste} -%D -%D \processcommacommand[\first]\message -%D \processcommacommand[\first,second,third]\message -%D \processcommacommand[\first,between,\second]\message -%D \stoptypen -%D -%D Commands that are part of the list are expanded, so the -%D use of this macro has it slimits. - -\def\processcommacommand[#1]% - {\edef\commacommand{#1}% - \toks0=\expandafter{\expandafter[\commacommand]}% - \expandafter\processcommalist\the\toks0 } - -%D The argument to \type{\command} is not delimited. Because -%D we often use \type{[]} as delimiters, we also have: -%D -%D \starttypen -%D \processcommalistwithparameters[string,string,...]\command -%D \stoptypen -%D -%D where \type{\command} looks like: -%D -%D \starttypen -%D \def\command[#1]{... #1 ...} -%D \stoptypen - -\def\processcommalistwithparameters[#1]#2% - {\def\docommand##1{#2[##1]}% - \processcommalist[#1]\docommand} - -%D \macros -%D {processaction, -%D processfirstactioninset, -%D processallactionsinset} -%D {} -%D -%D \CONTEXT\ makes extensive use of a sort of case or switch -%D command. Depending of the presence of one or more provided -%D items, some actions is taken. These macros can be nested -%D without problems. -%D -%D \starttypen -%D \processaction [x] [a=>\a,b=>\b,c=>\c] -%D \processfirstactioninset [x,y,z] [a=>\a,b=>\b,c=>\c] -%D \processallactionsinset [x,y,z] [a=>\a,b=>\b,c=>\c] -%D \stoptypen -%D -%D We can supply both a \type{default} action and an action -%D to be undertaken when an \type{unknown} value is met: -%D -%D \starttypen -%D \processallactionsinset -%D [x,y,z] -%D [ a=>\a, -%D b=>\b, -%D c=>\c, -%D default=>\default, -%D unknown=>\unknown{... \commalistelement ...}] -%D \stoptypen -%D -%D When \type{#1} is empty, this macro scans list \type{#2} for -%D the keyword \type{default} and executed the related action -%D if present. When \type{#1} is non empty and not in the list, -%D the action related to \type{unknown} is executed. Both -%D keywords must be at the end of list \type{#2}. Afterwards, -%D the actually found keyword is available in -%D \type{\commalistelement}. An advanced example of the use of -%D this macro can be found in \PPCHTEX, where we completely -%D rely on \TEX\ for interpreting user supplied keywords like -%D \type{SB}, \type{SB1..6}, \type{SB125} etc. -%D -%D Even a quick glance at the macros below show some overlap, -%D which means that more efficient alternatives are possible. -%D Because these macro's are very sensitive to subtle changes, -%D we've decided to present the readable originals first -%D Maybe these these macros look complicated, but this is a -%D direct result of the support of nesting. Protection is only -%D applied in \type{\processaction}. -%D -%D \starttypen -%D \newcount\processlevel -%D -%D \def\processaction[#1]#2[#3]% -%D {\doifelse{#1}{} -%D {\def\c!compareprocessaction[##1=>##2]% -%D {\edef\!!stringa{##1}% -%D \ifx\!!stringa\s!default -%D \def\commalistelement{#1}% -%D ##2% -%D \fi}} -%D {\let\donottest=\dontprocesstest -%D \edef\!!stringb{#1}% -%D \let\donottest=\doprocesstest -%D \def\c!compareprocessaction[##1=>##2]% -%D {\edef\!!stringa{##1}% -%D \ifx\!!stringa\!!stringb -%D \def\commalistelement{#1}% -%D ##2% -%D \let\c!doprocessaction=\gobbleoneargument -%D \else\ifx\!!stringa\s!unknown -%D \def\commalistelement{#1}% -%D ##2% -%D \fi\fi}}% -%D \def\c!doprocessaction##1% -%D {\c!compareprocessaction[##1]}% -%D \processcommalist[#3]\c!doprocessaction} -%D -%D \def\processfirstactioninset[#1]#2[#3]% -%D {\doifelse{#1}{} -%D {\processaction[][#3]} -%D {\def\c!compareprocessaction[##1=>##2][##3]% -%D {\edef\!!stringa{##1}% -%D \edef\!!stringb{##3}% -%D \ifx\!!stringa\!!stringb -%D \def\commalistelement{##3}% -%D ##2% -%D \let\c!doprocessaction=\gobbleoneargument -%D \let\c!dodoprocessaction=\gobbleoneargument -%D \else\ifx\!!stringa\s!unknown -%D \def\commalistelement{##3}% -%D ##2% -%D \fi\fi}% -%D \def\c!doprocessaction##1% -%D {\def\c!dodoprocessaction####1% -%D {\c!compareprocessaction[####1][##1]}% -%D \processcommalist[#3]\c!dodoprocessaction}% -%D \processcommalist[#1]\c!doprocessaction}} -%D -%D \def\processallactionsinset[#1]#2[#3]% -%D {\doifelse{#1}{} -%D {\processaction[][#3]} -%D {\advance\processlevel by 1\relax -%D \def\c!compareprocessaction[##1=>##2][##3]% -%D {\edef\!!stringa{##1}% -%D \edef\!!stringb{##3}% -%D \ifx\!!stringa\!!stringb -%D \def\commalistelement{##3}% -%D ##2% -%D \let\c!dodoprocessaction=\gobbleoneargument -%D \else\ifx\!!stringa\s!unknown -%D \def\commalistelement{##3}% -%D ##2% -%D \fi\fi}% -%D \setvalue{\s!do\the\processlevel}##1% -%D {\def\c!dodoprocessaction####1% -%D {\c!compareprocessaction[####1][##1]}% -%D \processcommalist[#3]\c!dodoprocessaction}% -%D \processcommalist[#1]{\getvalue{\s!do\the\processlevel}}% -%D \advance\processlevel by -1\relax}} -%D \stoptypen -%D -%D The gain of speed in the final implementation is around -%D 20\%, depending on the application. - -\newcount\processlevel - -\def\v!compareprocessactionA[#1=>#2][#3]% - {\edef\!!stringb{#1}% - \ifx\!!stringb\s!default - \let\commalistelement=\empty - #2% - \fi} - -\def\v!compareprocessactionB[#1=>#2][#3]% - {\expandedaction\!!stringb{#1}% - \ifx\!!stringa\!!stringb - \def\commalistelement{#3}% - #2% - \let\p!doprocessaction=\gobbleoneargument - \else - \edef\!!stringb{#1}% - \ifx\!!stringb\s!unknown - \def\commalistelement{#3}% beware of loops - #2% - \fi - \fi} - -\def\processaction[#1]#2[#3]% - {\let\donottest=\dontprocesstest - \expandedaction\!!stringa{#1}% - \let\donottest=\doprocesstest - \ifx\!!stringa\empty - \let\v!compareprocessaction=\v!compareprocessactionA - \else - \let\v!compareprocessaction=\v!compareprocessactionB - \fi - \def\p!doprocessaction##1% - {\v!compareprocessaction[##1][#1]}% - \processcommalist[#3]\p!doprocessaction - \expandactions} - -\def\v!compareprocessactionC[#1=>#2][#3]% - {\expandedaction\!!stringa{#1}% - \expandedaction\!!stringb{#3}% - \ifx\!!stringa\!!stringb - \def\commalistelement{#3}% - #2% - \let\p!doprocessaction=\gobbleoneargument - \let\p!dodoprocessaction=\gobbleoneargument - \else - \edef\!!stringa{#1}% - \ifx\!!stringa\s!unknown - \def\commalistelement{#3}% - #2% - \fi - \fi} - -\def\processfirstactioninset[#1]#2[#3]% - {\expandedaction\!!stringa{#1}% - \ifx\!!stringa\empty - \processaction[][#3]% - \else - \def\p!doprocessaction##1% - {\def\p!dodoprocessaction####1% - {\v!compareprocessactionC[####1][##1]}% - \processcommalist[#3]\p!dodoprocessaction}% - \processcommalist[#1]\p!doprocessaction - \fi - \expandactions} - -\def\v!compareprocessactionD[#1=>#2][#3]% - {\expandedaction\!!stringa{#1}% - \expandedaction\!!stringb{#3}% - \ifx\!!stringa\!!stringb - \def\commalistelement{#3}% - #2% - \let\p!dodoprocessaction=\gobbleoneargument - \else - \edef\!!stringa{#1}% - \ifx\!!stringa\s!unknown - \def\commalistelement{#3}% - #2% - \fi - \fi} - -\def\processallactionsinset[#1]#2[#3]% - {\expandedaction\!!stringa{#1}% - \ifx\!!stringa\empty - \processaction[][#3]% - \else - \advance\processlevel by 1\relax - \setvalue{\s!do\the\processlevel}##1% - {\def\p!dodoprocessaction####1% - {\v!compareprocessactionD[####1][##1]}% - \processcommalist[#3]\p!dodoprocessaction}% - \processcommalist[#1]{\getvalue{\s!do\the\processlevel}}% - \advance\processlevel by -1\relax - \fi - \expandactions} - -%D \macros -%D {unexpandedprocessaction, -%D unexpandedprocessfirstactioninset, -%D unexpandedprocessallactionsinset} -%D {} -%D -%D Now what are those expansion commands doing there. Well, -%D sometimes we want to compare actions that may consist off -%D commands (i.e. are no constants). In such occasions we can -%D use the a bit slower alternatives: - -\def\unexpandedprocessfirstactioninset{\dontexpandactions\processfirstactioninset} -\def\unexpandedprocessaction {\dontexpandactions\processaction} -\def\unexpandedprocessallactionsinset {\dontexpandactions\processallactionsinset} - -%D By default we expand actions: - -\def\expandactions% - {\let\expandedaction=\edef} - -\expandactions - -%D But when needed we convert the strings to meaningful -%D sequences of characters. - -\def\unexpandedaction#1>{} - -\def\noexpandedaction#1#2% - {\def\convertedargument{#2}% - \@EA\edef\@EA#1\@EA{\@EA\unexpandedaction\meaning\convertedargument}} - -\def\dontexpandactions% - {\let\expandedaction=\noexpandedaction} - -%D \macros -%D {getfirstcharacter,firstcharacter} -%D {} -%D -%D Sometimes the action to be undertaken depends on the -%D next character. This macro get this character and puts it in -%D \type{\firstcharacter}. -%D -%D \starttypen -%D \getfirstcharacter {string} -%D \stoptypen -%D -%D A two step expansion is used to prevent problems with -%D complicated arguments, for instance arguments that -%D consist of two or more expandable tokens. - -\def\dogetfirstcharacter#1#2\\% - {\def\firstcharacter{#1}} - -\def\getfirstcharacter#1% - {\edef\!!stringa{#1}% - \expandafter\dogetfirstcharacter\!!stringa\\} - -%D \macros -%D {doifinstringelse, doifincsnameelse} -%D {} -%D -%D We can check for the presence of a substring in a given -%D sequence of characters. -%D -%D \starttypen -%D \doifinsetelse {substring} {string} {then ...} {else ...} -%D \stoptypen -%D -%D An application of this command can be found further on. -%D Like before, we first show some alternatives, like the one -%D we started with: -%D -%D \starttypen -%D \long\def\p!doifinstringelse#1#2#3#4% -%D {\def\c!doifinstringelse##1#1##2##3\war% -%D {\if##2@% -%D #4% -%D \else -%D #3% -%D \fi}% -%D \c!doifinstringelse#2#1@@\war} -%D -%D \def\doifinstringelse% -%D {\ExpandBothAfter\p!doifinstringelse} -%D \stoptypen -%D -%D After this we came to: -%D -%D \starttypen -%D \def\p!doifinstringelse#1#2% -%D {\def\c!doifinstringelse##1#1##2##3\war% -%D {\if##2@}% -%D \c!doifinstringelse#2#1@@\war} -%D -%D \def\doifinstringelse#1#2#3#4% -%D {\ExpandBothAfter\p!doifinstringelse{#1}{#2}% -%D #4% -%D \else -%D #3% -%D \fi} -%D \stoptypen -%D -%D Sometimes the second argument is passed as a macro. By -%D postponing the expansion of this macro, we gain quite some -%D run time, simply because the less tokens we pass, the faster -%D \TEX\ runs. So finally the definition became: - -\def\v!ifinstringelse#1#2% - {\def\c!ifinstringelse##1#1##2##3\war% - {\csname\if##2@iffalse\else iftrue\fi\endcsname}% - \expanded{\c!ifinstringelse#2#1@@\noexpand\war}} % expand #2 here - -\long\def\doifinstringelse#1#2#3#4% - {\edef\@@instring{#1}% expand #1 here - \@EA\v!ifinstringelse\@EA{\@@instring}{#2}% - #3% - \else - #4% - \fi} - -%D The next alternative proved to be upto twice as fast on -%D tasks like checking reserved words in pretty verbatim -%D typesetting! This is mainly due to the fact that passing -%D (expanded) strings is much slower that passing a macro. -%D -%D \starttypen -%D \doifincsnameelse {substring} {\string} {then ...} {else ...} -%D \stoptypen -%D -%D Where \type{\doifinstringelse} does as much expansion as -%D possible, the latter alternative does minimal (one level) -%D expansion. - -\def\v!ifincsnameelse#1#2% - {\def\c!ifincsnameelse##1#1##2##3\war% - {\csname\if##2@iffalse\else iftrue\fi\endcsname}% - \@EA\c!ifincsnameelse#2#1@@\war} - -\long\def\doifincsnameelse#1#2#3#4% - {\edef\@@instring{#1}% - \@EA\v!ifincsnameelse\@EA{\@@instring}{#2}% - #3% - \else - #4% - \fi} - -%D \macros -%D {doifnumberelse} -%D {} -%D -%D The next macro executes a command depending of the outcome -%D of a test on numerals. This is probably one of the fastest -%D test possible, exept from a less robust 10||step -%D \type{\if}||ladder or some tricky \type{\lcode} checking. -%D -%D \starttypen -%D \doifnumberelse {string} {then ...} {else ...} -%D \stoptypen -%D -%D The macro accepts \type{123}, \type{abc}, \type{{}}, -%D \type{\getal} and \type{\the\count...}. - -\long\def\doifnumberelse#1#2#3% - {\getfirstcharacter{#1}% - \@EA\ifinstringelse\firstcharacter{1234567890}% - #2% - \else - #3% - \fi} - -%D Before we had \type{\ifinstringelse} available, we used: -%D -%D \starttypen -%D \def\doifnumberelse#1% -%D {\getfirstcharacter{#1}% -%D \rawdoifinsetelse{\firstcharacter}{1,2,3,4,5,6,7,8,9,0}} -%D \stoptypen - -%D A faster but less fail safe alternative is: -%D -%D \starttypen -%D \dostepwiserecurse{0}{9}{1} -%D {\@EA\uccode\@EA`\recurselevel=1} -%D -%D \long\def\doifnumberelse#1#2#3% -%D {\getfirstcharacter{#1}% -%D \@EA\ifnum\@EA\uccode\@EA`\firstcharacter=1 -%D #2% -%D \else -%D #3% -%D \fi} -%D \stoptypen -%D -%D This one only works when the \type{\firstcharacter} is -%D indeed a character. Numbers and strings of characters go -%D all right, but arguments like \type{\relax} let things -%D go wrong. - -%D \macros -%D {makerawcommalist, -%D rawdoinsetelse, -%D rawprocesscommalist, -%D rawprocessaction} -%D {} -%D -%D Some of the commands mentioned earlier are effective but -%D slow. When one is desperately in need of faster alternatives -%D and when the conditions are predictable safe, the \type{\raw} -%D alternatives come into focus. A major drawback is that -%D they do not take \type{\c!constants} into account, simply -%D because no expansion is done. This is no problem with -%D \type{\rawprocesscommalist}, because this macro does not -%D compare anything. Expandable macros are permitted as search -%D string. -%D -%D \starttypen -%D \makerawcommalist[string,string,...]\stringlist -%D \rawdoifinsetelse{string}{string,...}{...}{...} -%D \rawprocesscommalist[string,string,...]\commando -%D \rawprocessaction[x][a=>\a,b=>\b,c=>\c] -%D \stoptypen -%D -%D Spaces embedded in the list, for instance after commas, -%D spoil the search process. The gain in speed depends on the -%D length of the argument (the longer the argument, the less -%D we gain). - -\def\makerawcommalist[#1]#2% - {\def\appendtocommalist##1% - {\doifelse{#2}{} - {\edef#2{##1}} - {\edef#2{#2,##1}}}% - \def#2{}% - \processcommalist[#1]\appendtocommalist} - -\def\rawprocesscommaitem#1,% - {\if]#1\else - \csname\s!next\the\commalevel\endcsname{#1}% - \expandafter\rawprocesscommaitem - \fi} - -\def\rawprocesscommalist[#1]#2% - {\advance\commalevel by 1\relax - \expandafter\let\csname\s!next\the\commalevel\endcsname=#2% - \expandafter\rawprocesscommaitem#1,],% \relax - \advance\commalevel by -1\relax} - -\def\rawdoifinsetelse#1#2% - {\doifinstringelse{,#1,}{,#2,}} - -\def\v!rawprocessaction[#1][#2]% - {\def\c!rawprocessaction##1,#1=>##2,##3\war% - {\if##3@\else - \def\v!processaction{##2}% - \fi}% - \c!rawprocessaction,#2,#1=>,@\war} - -\def\rawprocessaction[#1]#2[#3]% - {\edef\!!stringa{#1}% - \edef\!!stringb{undefined}% - \let\v!processaction=\!!stringb - \ifx\!!stringa\empty - \@EA\v!rawprocessaction\@EA[\s!default][#3]% - \else - \expandafter\v!rawprocessaction\expandafter[\!!stringa][#3]% - \ifx\v!processaction\!!stringb - \@EA\v!rawprocessaction\@EA[\s!unknown][#3]% - \fi - \fi - \ifx\v!processaction\!!stringb - \else - \v!processaction - \fi} - -%D When we process the list \type{a,b,c,d,e}, the raw routine -%D takes over 30\% less time, when we feed $20+$ character -%D strings we gain about 20\%. Alternatives which use -%D \type{\futurelet} perform worse. Part of the speedup is -%D due to the \type{\let} and \type{\expandafter} in the test. - -%D \macros -%D {processunexpandedcommalist} -%D {} -%D -%D When processing commalists, the arguments are expanded. The -%D main reason for doing so lays in the fact that these -%D macros are used for interfacing. The next alternative can be used -%D for -%D -%D \starttypen -%D \processunexpandedcommalist -%D [\alfa\beta,\gamma,\delta\epsilon] -%D \handleitem -%D \stoptypen -%D -%D This time nesting is not supported. - -\def\processunexpandedcommaitem#1,% - {\if]\noexpand#1% - \let\nextcommaitem=\relax - \else - \handleunexpandedcommaitem{#1}% - \let\nextcommaitem=\processunexpandedcommaitem - \fi - \nextcommaitem} - -\def\processunexpandedcommalist[#1]#2% - {\def\handleunexpandedcommaitem{#2}% - \processunexpandedcommaitem#1,],}% \relax} - -%D Or faster: - -\def\processunexpandedcommaitem#1,% - {\if]\noexpand#1\else - \handleunexpandedcommaitem{#1}% - \expandafter\processunexpandedcommaitem - \fi} - -%D \macros -%D {dosetvalue,dosetevalue,docopyvalue,doresetvalue, -%D dogetvalue} -%D {} -%D -%D When we are going to do assignments, we have to take -%D multi||linguality into account. For the moment we keep -%D things simple and single||lingual. -%D -%D \starttypen -%D \dosetvalue {label} {variable} {value} -%D \dosetevalue {label} {variable} {value} -%D \docopyvalue {to label} {from label} {variable} -%D \doresetvalue {label} {variable} -%D \stoptypen -%D -%D These macros are in fact auxiliary ones and are not meant -%D for use outside the assignment macros. - -\def\dosetvalue#1#2% #3 - {\@EA\def\csname#1#2\endcsname} % {#3}} - -\def\dosetevalue#1#2% #3 - {\@EA\edef\csname#1#2\endcsname} % {#3}} - -\def\doresetvalue#1#2% - {\@EA\def\csname#1#2\endcsname{}} - -\def\docopyvalue#1#2#3% - {\@EA\def\csname#1#3\endcsname{\csname#2#3\endcsname}} - -%D \macros -%D {doassign,undoassign,doassignempty} -%D {} -%D -%D Assignments are the backbone of \CONTEXT. Abhorred by the -%D concept of style file hacking, we took a considerable effort -%D in building a parameterized system. Unfortunately there is a -%D price to pay in terms of speed. Compared to other packages -%D and taking the functionality of \CONTEXT\ into account, the -%D total size of the format file is still very acceptable. Now -%D how are these assignments done. -%D -%D Assignments can be realized with: -%D -%D \starttypen -%D \doassign[label][variable=value] -%D \undoassign[label][variable=value] -%D \stoptypen -%D -%D and: -%D -%D \starttypen -%D \doassignempty[label][variable=value] -%D \stoptypen -%D -%D Assignments like \type{\doassign} are compatible with: -%D -%D \starttypen -%D \def\labelvariable{value} -%D \stoptypen -%D -%D We do check for the presence of an \type{=} and loudly -%D complain of it's missed. We will redefine this macro later -%D on, when a more advanced message mechanism is implemented. - -%\def\p!doassign#1[#2][#3=#4=#5]% -% {\let\donottest=\dontprocesstest -% \edef\!!stringa{#5}% -% \let\!!stringb=\relax -% \let\donottest=\doprocesstest -% \ifx\!!stringa\!!stringb -% \writestatus -% {setup} -% {missing '=' after '#3' in line \the\inputlineno}% -% \else -% #1{#2}{#3}{#4}% -% \fi} - -\def\p!doassign#1[#2][#3=#4=#5]% redefined in mult-ini - {\ifx\empty#3\else % and definitely not \ifx#3\empty - \ifx\relax#5% - \writestatus - {setup} - {missing '=' after '#3' in line \the\inputlineno}% - \else - #1{#2}{#3}{#4}% - \fi - \fi} - -\def\doassign[#1][#2]% - {\p!doassign\dosetvalue[#1][#2==\relax]} - -\def\doeassign[#1][#2]% - {\p!doassign\dosetevalue[#1][#2==\relax]} - -\def\undoassign[#1][#2]% - {\p!doassign\doresetvalue[#1][#2==\relax]} - -\def\doassignempty[#1][#2=#3]% - {\doifundefined{#1#2} - {\dosetvalue{#1}{#2}{#3}}} - -%D \macros -%D {getparameters,geteparameters,forgetparameters} -%D {} -%D -%D Using the assignment commands directly is not our -%D ideal of user friendly interfacing, so we take some further -%D steps. -%D -%D \starttypen -%D \getparameters [label] [...=...,...=...] -%D \forgetparameters [label] [...=...,...=...] -%D \stoptypen -%D -%D Again, the label identifies the category a variable -%D belongs to. The second argument can be a comma separated -%D list of assignments. -%D -%D \starttypen -%D \getparameters -%D [demo] -%D [alfa=1, -%D beta=2] -%D \stoptypen -%D -%D is equivalent to -%D -%D \starttypen -%D \def\demoalfa{1} -%D \def\demobeta{2} -%D \stoptypen -%D -%D -%D In the pre||multi||lingual stadium \CONTEXT\ took the next -%D approach. With -%D -%D \starttypen -%D \def\??demo {@@demo} -%D \def\!!alfa {alfa} -%D \def\!!beta {beta} -%D \stoptypen -%D -%D calling -%D -%D \starttypen -%D \getparameters -%D [\??demo] -%D [\!!alfa=1, -%D \!!beta=2] -%D \stoptypen -%D -%D lead to: -%D -%D \starttypen -%D \def\@@demoalfa{1} -%D \def\@@demobeta{2} -%D \stoptypen -%D -%D Because we want to be able to distinguish the \type{!!} -%D pre||tagged user supplied variables from internal -%D counterparts, we will introduce a slightly different tag in -%D the multi||lingual modules. There we will use \type{c!} or -%D \type{v!}, depending on the context. -%D -%D By calling \type{\p!doassign} directly, we save ourselves -%D some argument passing and gain some speed. Whatever -%D optimizations we do, this command will always be one of the -%D bigger bottlenecks. -%D -%D The alternative \type{\geteparameters} --- it's funny to -%D see that this alternative saw the light so lately --- can be -%D used to do expanded assigments. - -\def\dogetparameters#1[#2]#3[#4]% - {\def\p!dogetparameter##1% - {\p!doassign#1[#2][##1==\relax]}% - \processcommalist[#4]\p!dogetparameter} - -\def\getparameters% - {\dogetparameters\dosetvalue} - -\def\geteparameters% - {\dogetparameters\dosetevalue} - -\def\forgetparameters% - {\dogetparameters\doresetvalue} - -\let\getexpandedparameters=\geteparameters - -%D \macros -%D {getemptyparameters} -%D {} -%D -%D Sometimes we explicitly want variables to default to an -%D empty string, so we welcome: -%D -%D \starttypen -%D \getemptyparameters [label] [...=...,...=...] -%D \stoptypen - -\def\getemptyparameters[#1]#2[#3]% - {\def\p!dogetemptyparameter##1% - {\doassignempty[#1][##1]}% - \processcommalist[#3]\p!dogetemptyparameter} - -%D \macros -%D {copyparameters} -%D {} -%D -%D Some \CONTEXT\ commands take their default setups from -%D others. All commands that are able to provide backgounds -%D or rules around some content, for instance default to the -%D standard command for ruled boxes. Is situations like this -%D we can use: -%D -%D \starttypen -%D \copyparameters [to-label] [from-label] [name1,name2,...] -%D \stoptypen -%D -%D For instance -%D -%D \starttypen -%D \copyparameters -%D [internal][external] -%D [alfa,beta] -%D \stoptypen -%D -%D Leads to: -%D -%D \starttypen -%D \def\internalalfa {\externalalfa} -%D \def\internalbeta {\externalbeta} -%D \stoptypen -%D -%D By using \type{\docopyvalue} we've prepared this command -%D for use in a multi||lingual environment. - -\def\copyparameters[#1]#2[#3]#4[#5]% - {\doifnot{#1}{#3} - {\def\docopyparameter##1% - {\docopyvalue{#1}{#3}{##1}}% - \processcommalist[#5]\docopyparameter}} - -%D \macros -%D {doifassignmentelse} -%D {} -%D -%D A lot of \CONTEXT\ commands take optional arguments, for -%D instance: -%D -%D \starttypen -%D \dothisorthat[alfa,beta] -%D \dothisorthat[first=foo,second=bar] -%D \dothisorthat[alfa,beta][first=foo,second=bar] -%D \stoptypen -%D -%D Although a combined solution is possible, we prefer a -%D seperation. The next command takes care of propper -%D handling of such multi||faced commands. -%D -%D \starttypen -%D \doifassignmentelse {...} {then ...} {else ...} -%D \stoptypen - -\def\doifassignmentelse% - {\doifinstringelse{=}} - -%D \macros -%D {ifparameters,checkparameters} -%D {} -%D -%D A slightly different one is \type{\checkparameters}, which -%D also checks on the presence of a~\type{=}. -%D -%D The boolean \type{\ifparameters} can be used afterwards. -%D Combining both in one \type{\if}||macro would lead to -%D problems with nested \type{\if}'s. -%D -%D \starttypen -%D \checkparameters[argument] -%D \stoptypen - -\newif\ifparameters - -\def\c!checkparameters#1=#2#3\war% - {\if#2@\parametersfalse\else\parameterstrue\fi} - -\def\checkparameters[#1]% - {\c!checkparameters#1=@@\war} - -%D \macros -%D {getfromcommalist,getfromcommacommand, -%D commalistelement, -%D getcommalistsize,getcommacommandsize} -%D {} -%D -%D It's possible to get an element from a commalist or a -%D command representing a commalist. -%D -%D \starttypen -%D \getfromcommalist [string] [n] -%D \getfromcommacommand [string,\strings,string,...] [n] -%D \stoptypen -%D -%D The difference betwee the two of them is the same as the -%D difference between \type{\processcomma...}. The found string -%D is stored in \type{\commalistelement}. -%D -%D We can calculate the size of a comma separated list by -%D using: -%D -%D \starttypen -%D \getcommalistsize [string,string,...] -%D \getcommacommandsize [string,\strings,string,...] -%D \stoptypen -%D -%D Afterwards, the length is available in the macro -%D \type{\commalistsize} (not a \COUNTER). - -\def\commalistsize{0} - -\def\p!dogetcommalistsize#1[#2]% - {\scratchcounter=0\relax - \def\p!dodogetcommalistsize##1% - {\advance\scratchcounter by 1\relax}% - #1[#2]\p!dodogetcommalistsize % was [{#2}] - \edef\commalistsize{\the\scratchcounter}} - -\def\getcommalistsize% - {\p!dogetcommalistsize\processcommalist} - -\def\getcommacommandsize% - {\p!dogetcommalistsize\processcommacommand} - -\def\p!dodogetfromcommalist#1% - {\advance\scratchcounter by -1\relax - \ifnum\scratchcounter=0\relax - \gdef\globalcommalistelement{#1}% - \def\doprocesscommaitem##1]{}% - \fi} - -\def\p!dogetfromcommalist#1[#2]#3[#4]% - {\global\let\globalcommalistelement=\empty - \bgroup - \scratchcounter=#4\relax - #1[#2]\p!dodogetfromcommalist - \egroup - \let\commalistelement=\globalcommalistelement} - -\def\getfromcommalist% - {\p!dogetfromcommalist\processcommalist} - -\def\getfromcommacommand% - {\p!dogetfromcommalist\processcommacommand} - -%D Watertight (and efficient) solutions are hard to find, due -%D to the handling of braces during parameters passing and -%D scanning. Nevertheless: -%D -%D \startbuffer -%D \def\dosomething#1{(#1=\commalistsize) } -%D -%D \getcommalistsize [\hbox{$a,b,c,d,e,f$}] \dosomething 1 -%D \getcommalistsize [{a,b,c,d,e,f}] \dosomething 1 -%D \getcommalistsize [{a,b,c},d,e,f] \dosomething 4 -%D \getcommalistsize [a,b,{c,d,e},f] \dosomething 4 -%D \getcommalistsize [a{b,c},d,e,f] \dosomething 4 -%D \getcommalistsize [{a,b}c,d,e,f] \dosomething 4 -%D \getcommalistsize [] \dosomething 0 -%D \getcommalistsize [{[}] \dosomething 1 -%D \stopbuffer -%D -%D \typebuffer -%D -%D reports: -%D -%D \haalbuffer - -%D \macros -%D {dosingleargument,dodoubleargument,dotripleargument, -%D doquadrupleargument,doquintupleargument,dosixtupleargument} -%D {} -%D -%D When working with delimited arguments, spaces and -%D lineendings can interfere. The next set of macros uses -%D \TEX' internal scanner for grabbing everything between -%D arguments. -%D -%D \starttypen -%D \dosingleargument\commando = \commando[#1] -%D \dodoubleargument\commando = \commando[#1][#2] -%D \dotripleargument\commando = \commando[#1][#2][#3] -%D \doquadrupleargument\commando = \commando[#1][#2][#3][#4] -%D \doquintupleargument\commando = \commando[#1][#2][#3][#4][#5] -%D \dosixtupleargument\commando = \commando[#1][#2][#3][#4][#5][#6] -%D \stoptypen -%D -%D These macros are used in the following way: -%D -%D \starttypen -%D \def\dosetupsomething[#1][#2]% -%D {... #1 ... #2 ...} -%D -%D \def\setupsomething% -%D {\dodoubleargument\dosetupsomething} -%D \stoptypen -%D -%D The implementation can be surprisingly simple and needs no -%D further explanation, like: -%D -%D \starttypen -%D \def\dosingleargument#1[#2]% -%D {#1[#2]} -%D \def\dotripleargument#1[#2]#3[#4]#5[#6]% -%D {#1[#2][#4][#6]} -%D \def\doquintupleargument#1% -%D {\def\dodoquintupleargument[##1]##2[##3]##4[##5]##6[##7]##8[##9]% -%D {#1[##1][##3][##5][##7][##9]}% -%D \dodoquintupleargument} -%D \stoptypen -%D -%D Because \TEX\ accepts 9~arguments at most, we have to use -%D two||step solution when getting five or more arguments. -%D -%D When developing more and more of the real \CONTEXT, we -%D started using some alternatives that provided empty -%D arguments (in fact optional ones) whenever the user failed -%D to supply them. Because this more complicated macros enable -%D us to do some checking, we reimplemented the non||empty -%D ones. - -\def\dosingleargument% - {\chardef\expectedarguments=1 - \dosingleempty} - -\def\dodoubleargument% - {\chardef\expectedarguments=2 - \dodoubleempty} - -\def\dotripleargument% - {\chardef\expectedarguments=3 - \dotripleempty} - -\def\doquadrupleargument% - {\chardef\expectedarguments=4 - \doquadrupleempty} - -\def\doquintupleargument% - {\chardef\expectedarguments=5 - \doquintupleempty} - -\def\doquintupleargument% - {\chardef\expectedarguments=6 - \dosixtupleempty} - -%D \macros -%D {iffirstagument,ifsecondargument,ifthirdargument, -%D iffourthargument,iffifthargument,ifsixthargument} -%D {} -%D -%D We use some signals for telling the calling macros if all -%D wanted arguments are indeed supplied by the user. - -\newif\iffirstargument -\newif\ifsecondargument -\newif\ifthirdargument -\newif\iffourthargument -\newif\iffifthargument -\newif\ifsixthargument - -%D \macros -%D {dosingleempty,dodoubleempty,dotripleempty, -%D doquadrupleempty,doquintupleempty} -%D {} -%D -%D The empty argument supplying macros mentioned before, look -%D like: -%D -%D \starttypen -%D \dosingleempty \command -%D \dodoubleempty \command -%D \dotripleempty \command -%D \doquadrupleempty \command -%D \doquintupleempty \command -%D \dosixtupleempty \command -%D \stoptypen -%D -%D So \type{\dodoubleempty} leades to: -%D -%D \starttypen -%D \command[#1][#2] -%D \command[#1][] -%D \command[][] -%D \stoptypen -%D -%D Depending of the generousity of the user. Afterwards one can -%D use the \type{\if...argument} boolean. For novice: watch -%D the stepwise doubling of \type{#}'s - -\chardef\noexpectedarguments=0 -\chardef\expectedarguments =0 - -\def\dogetargument#1#2#3#4% redefined in mult-ini - {\doifnextcharelse{#1} - {\let\expectedarguments=\noexpectedarguments - #3\dodogetargument} - {\ifnum\expectedarguments>\noexpectedarguments - \writestatus - {setup} - {\expectedarguments\space argument(s) expected - in line \the\inputlineno\space}% - \fi - \let\expectedarguments=\noexpectedarguments - #4\dodogetargument#1#2}} - -\def\getsingleempty#1#2#3% - {\def\dodogetargument% - {#3}% - \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -\def\getdoubleempty#1#2#3% - {\def\dodogetargument#1##1#2% - {\def\dodogetargument% - {#3#1##1#2}% - \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% - \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -\def\gettripleempty#1#2#3% - {\def\dodogetargument#1##1#2% - {\def\dodogetargument#1####1#2% - {\def\dodogetargument% - {#3#1##1#2#1####1#2}% - \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}% - \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% - \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -\def\getquadrupleempty#1#2#3% - {\def\dodogetargument#1##1#2% - {\def\dodogetargument#1####1#2% - {\def\dodogetargument#1########1#2% - {\def\dodogetargument% - {#3#1##1#2#1####1#2#1########1#2}% - \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}% - \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}% - \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% - \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -\def\getquintupleempty#1#2#3% - {\def\dodogetargument#1##1#2% - {\def\dodogetargument#1####1#2% - {\def\dodogetargument#1########1#2% - {\def\dodogetargument#1################1#2% - {\def\dodogetargument% - {#3#1##1#2#1####1#2#1########1#2#1################1#2}% - \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}% - \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}% - \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}% - \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% - \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -\def\getsixtupleempty#1#2#3% - {\def\dodogetargument#1##1#2% - {\def\dodogetargument#1####1#2% - {\def\dodogetargument#1########1#2% - {\def\dodogetargument#1################1#2% - {\def\dodogetargument#1################################1#2% - {\def\dodogetargument% - {#3#1##1#2#1####1#2#1########1#2#1################1% - #2#1################################1#2}% - \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}% - \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}% - \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}% - \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}% - \dogetargument#1#2\secondargumenttrue\secondargumentfalse}% - \dogetargument#1#2\firstargumenttrue\firstargumentfalse} - -\def\dosingleempty {\getsingleempty []} -\def\dodoubleempty {\getdoubleempty []} -\def\dotripleempty {\gettripleempty []} -\def\doquadrupleempty {\getquadrupleempty []} -\def\doquintupleempty {\getquintupleempty []} -\def\dosixtupleempty {\getsixtupleempty []} - -%D \macros -%D {dosingleargumentwithset, -%D dodoubleargumentwithset,dodoubleemptywithset, -%D dotripleargumentwithset,dotripleemptywithset} -%D {} -%D -%D These maybe too mysterious macros enable us to handle more -%D than one setup at once. -%D -%D \starttypen -%D \dosingleargumentwithset \command[#1] -%D \dodoubleargumentwithset \command[#1][#2] -%D \dotripleargumentwithset \command[#1][#2][#3] -%D \dodoubleemptywithset \command[#1][#2] -%D \dotripleemptywithset \command[#1][#2][#3] -%D \stoptypen -%D -%D The first macro calls \type{\command[##1]} for each string -%D in the set~\type{#1}. The second one calls for -%D \type{\commando[##1][#2]} and the third, well one may guess. -%D These commands support constructions like: -%D -%D \starttypen -%D \def\dodefinesomething[#1][#2]% -%D {\getparameters[\??xx#1][#2]} -%D -%D \def\definesomething% -%D {\dodoubleargumentwithset\dodefinesomething} -%D \stoptypen -%D -%D Which accepts calls like: -%D -%D \starttypen -%D \definesomething[alfa,beta,...][variable=...,...] -%D \stoptypen -%D -%D Now a whole bunch of variables like \type{\@@xxalfavariable} -%D and \type{\@@xxbetavariable} is defined. - -\def\dosingleargumentwithset#1% - {\def\dodosinglewithset[##1]% - {\def\dododosinglewithset####1% - {#1[####1]}% - \processcommalist[##1]\dododosinglewithset}% - \dosingleargument\dodosinglewithset}% - -\def\dodoublewithset#1#2% - {\def\dododoublewithset[##1][##2]% - {\doifnot{##1}{} - {\def\dodododoublewithset####1% - {#2[####1][##2]}% - \processcommalist[##1]\dodododoublewithset}}% - #1\dododoublewithset}% - -\def\dodoubleemptywithset% - {\dodoublewithset\dodoubleempty} - -\def\dodoubleargumentwithset% - {\dodoublewithset\dodoubleargument} - -\def\dotriplewithset#1#2% - {\def\dodotriplewithset[##1][##2][##3]% - {\doifnot{##1}{} - {\def\dododotriplewithset####1% - {#2[####1][##2][##3]}% - \processcommalist[##1]\dododotriplewithset}}% - #1\dodotriplewithset}% - -\def\dotripleemptywithset% - {\dotriplewithset\dotripleempty} - -\def\dotripleargumentwithset% - {\dotriplewithset\dotripleargument} - -%D \macros -%D {complexorsimple,complexorsimpleempty} -%D {} -%D -%D Setups can be optional. A command expecting a setup is -%D prefixed by \type{\complex}, a command without one gets the -%D prefix \type{\simple}. Commands like this can be defined by: -%D -%D \starttypen -%D \complexorsimple {command} -%D \stoptypen -%D -%D When \type{\command} is followed by a \type{[setup]}, then -%D -%D \starttypen -%D \complexcommand [setup] -%D \stoptypen -%D -%D executes, else we get -%D -%D \starttypen -%D \simplecommand -%D \stoptypen -%D -%D An alternative for \type{\complexorsimple} is: -%D -%D \starttypen -%D \complexorsimpleempty {command} -%D \stoptypen -%D -%D Depending on the presence of \type{[setup]}, this one -%D leads to one of: -%D -%D \starttypen -%D \complexcommando [setup] -%D \complexcommando [] -%D \stoptypen -%D -%D Many \CONTEXT\ commands started as complex or simple ones, -%D but changed into more versatile (more object oriented) ones -%D using the \type{\get..argument} commands. - -\def\complexorsimple#1% - {\doifnextcharelse{[} - {\firstargumenttrue\getvalue{\s!complex#1}} - {\firstargumentfalse\getvalue{\s!simple#1}}} - -\def\complexorsimpleempty#1% - {\doifnextcharelse{[} - {\firstargumenttrue\getvalue{\s!complex#1}} - {\firstargumentfalse\getvalue{\s!complex#1}[]}} - -%D \macros -%D {definecomplexorsimple,definecomplexorsimpleempty} -%D {} -%D -%D The previous commands are used that often that we found it -%D worthwile to offer two more alternatives. - -\def\setnameofcommand#1% - {\bgroup - \escapechar=-1\relax - \xdef\nameofcommand{\string#1}% - \egroup} - -\def\definewithnameofcommand#1#2% watch the \donottest - {\setnameofcommand{#2}% - \@EA\def\@EA#2\@EA{\@EA\donottest\@EA#1\@EA{\nameofcommand}}} - -\def\definecomplexorsimple% - {\definewithnameofcommand\complexorsimple} - -\def\definecomplexorsimpleempty% - {\definewithnameofcommand\complexorsimpleempty} - -%D These commands are called as: -%D -%D \starttypen -%D \definecomplexorsimple\command -%D \stoptypen -%D -%D Of course, we must have available -%D -%D \starttypen -%D \def\complexcommand[#1]{...} -%D \def\simplecommand {...} -%D \stoptypen -%D -%D Using this construction saves a few string now and then. - -%D \macros -%D {definestartstopcommand} -%D {} -%D -%D Those who get the creeps of expansion may skip the next -%D one. It's one of the most recent additions and concerns -%D \type{\start}||\type{\stop} pairs with complicated -%D arguments. -%D -%D We won't go into details here, but the general form of -%D this using this command is: -%D -%D \starttypen -%D \definestartstopcommand\somecommand\v!specifier{arg}{arg}% -%D {do something with arg} -%D \stoptypen -%D -%D This expands to something like: -%D -%D \starttypen -%D \def\somecommand arg \startspecifier arg \stopspecifier% -%D {do something with arg} -%D \stoptypen -%D -%D The argumentss can be anything reasonable, but double -%D \type{#}'s are needed in the specification part, like: -%D -%D \starttypen -%D \definestartstopcommand\somecommand\v!specifier{[##1][##2]}{##3}% -%D {do #1 something #2 with #3 arg} -%D \stoptypen -%D -%D which becomes: -%D -%D \starttypen -%D \def\somecommand[#1][#2]\startspecifier#3\stopspecifier% -%D {do #1 something #2 with #3 arg} -%D \stoptypen -%D -%D We will see some real applications of this command in the -%D core modules. - -\def\definestartstopcommand#1#2#3#4% - {\def\!stringa{#3}% - \def\!stringb{\e!start#2}% - \def\!stringc{#4}% - \def\!stringd{\e!stop#2}% - \@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA - \def\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA - #1\@EA\@EA\@EA\@EA\@EA\@EA\@EA - \!stringa\@EA\@EA\@EA - \csname\@EA\@EA\@EA\!stringb\@EA\@EA\@EA\endcsname\@EA - \!stringc - \csname\!stringd\endcsname} - -%D \macros -%D {dosinglegroupempty,dodoublegroupempty,dotriplegroupempty, -%D doquadruplegroupempty} -%D {} -%D -%D We've already seen some commands that take care of -%D optional arguments between \type{[]}. The next two commands -%D handle the ones with \type{{}}. They are called as: -%D -%D \starttypen -%D \dosinglegroupempty \IneedONEargument -%D \dodoublegroupempty \IneedTWOarguments -%D \dotriplegroupempty \IneedTHREEarguments -%D \dotriplegroupempty \IneedFOURarguments -%D \stoptypen -%D -%D where \type{\IneedONEargument} takes one and the others -%D two and three arguments. These macro's were first needed in -%D \PPCHTEX. - -\def\dogetgroupargument#1#2% redefined in mult-ini - {\def\nextnextargument% - {\ifx\nextargument\bgroup - \let\expectedarguments=\noexpectedarguments - \def\nextargument{#1\dodogetargument}% - %\else\ifx\nextargument\lineending % this can be an option - % \def\nextargument{\bgroup\def\\ {\egroup\dogetgroupargument#1#2}\\}% - %\else\ifx\nextargument\blankspace % but it may never be default - % \def\nextargument{\bgroup\def\\ {\egroup\dogetgroupargument#1#2}\\}% - \else - \ifnum\expectedarguments>\noexpectedarguments - \writestatus - {setup} - {\the\expectedarguments\space argument(s) expected - in line \the\inputlineno\space}% - \fi - \let\expectedarguments=\noexpectedarguments - \def\nextargument{#2\dodogetargument{}}% - \fi%\fi\fi % so let's get rid of it - \nextargument}% - \futurelet\nextargument\nextnextargument} - -\def\dosinglegroupempty#1% - {\def\dodogetargument% - {#1}% - \dogetgroupargument\firstargumenttrue\firstargumentfalse} - -\def\dodoublegroupempty#1% - {\def\dodogetargument##1% - {\def\dodogetargument% - {#1{##1}}% - \dogetgroupargument\secondargumenttrue\secondargumentfalse}% - \dogetgroupargument\firstargumenttrue\firstargumentfalse} - -\def\dotriplegroupempty#1% - {\def\dodogetargument##1% - {\def\dodogetargument####1% - {\def\dodogetargument% - {#1{##1}{####1}}% - \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}% - \dogetgroupargument\secondargumenttrue\secondargumentfalse}% - \dogetgroupargument\firstargumenttrue\firstargumentfalse} - -\def\doquadruplegroupempty#1% - {\def\dodogetargument##1% - {\def\dodogetargument####1% - {\def\dodogetargument########1% - {\def\dodogetargument% - {#1{##1}{####1}{########1}}% - \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}% - \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}% - \dogetgroupargument\secondargumenttrue\secondargumentfalse}% - \dogetgroupargument\firstargumenttrue\firstargumentfalse} - - -%D These macros explictly take care of spaces, which means -%D that the next definition and calls are valid: -%D -%D \starttypen -%D \def\test#1#2#3{[#1#2#3]} -%D -%D \dotriplegroupempty\test {a}{b}{c} -%D \dotriplegroupempty\test {a}{b} -%D \dotriplegroupempty\test {a} -%D \dotriplegroupempty\test -%D \dotriplegroupempty\test {a} {b} {c} -%D \dotriplegroupempty\test {a} {b} -%D \dotriplegroupempty\test -%D {a} -%D {b} -%D \stoptypen -%D -%D And alike. - -%D \macros -%D {wait} -%D {} -%D -%D The next macro hardly needs explanation. Because no -%D nesting is to be expected, we can reuse \type{\wait} within -%D \type{\wait} itself. - -\def\wait% - {\bgroup - \read16 to \wait - \egroup} - -%D \macros -%D {writestring,writeline, -%D writestatus,statuswidth} -%D {} -%D -%D Maybe one didn't notice, but we've already introduced a -%D macro for showing messages. In the multi||lingual modules, -%D we will also introduce a mechanism for message passing. For -%D the moment we stick to the core macros: -%D -%D \starttypen -%D \writestring {string} -%D \writeline -%D \writestatus {category} {message} -%D \stoptypen -%D -%D Messages are formatted. One can provide the maximum with -%D of the identification string with the macro -%D \type{\statuswidth}. - -\def\statuswidth {15} - -\def\writestring% - {\immediate\write16} - -\def\writeline% - {\writestring{}} - -\def\dosplitstatus#1#2\end% - {\ifx#1?% - \loop - \advance\scratchcounter by 1 - \ifnum\scratchcounter<\statuswidth\relax - \edef\messagecontentA{\messagecontentA\space}% - \repeat - \else - \advance\scratchcounter by 1 - \ifnum\scratchcounter<\statuswidth\relax - \edef\messagecontentA{\messagecontentA#1}% - \fi - \dosplitstatus#2\end - \fi} - -\def\writestatus#1#2% - {\bgroup - \edef\messagecontentA{}% - \edef\messagecontentB{#2}% maybe it's \the\scratchcounter - \scratchcounter=0 - \expandafter\dosplitstatus#1?\end - \writestring{\messagecontentA\space:\space\messagecontentB}% - \egroup} - -%D \macros -%D {debuggerinfo} -%D {} -%D -%D For debugging purposes we can enhance macros with the -%D next alternative. Here \type{debuggerinfo} stands for both -%D a macro accepting two arguments and a boolean (in fact a -%D few macro's too). - -\newif\ifdebuggerinfo - -\def\debuggerinfo#1#2% - {\ifdebuggerinfo - \writestatus{debugger}{#1:: #2}% - \fi} - -%D Finally we do what from now on will be done at the top of -%D the files: we tell the user what we are loading. - -\writestatus{loading}{Context System Macros / General} - -%D Well, the real final command is the one that resets the -%D unprotected characters \type{@}, \type{?} and \type{!}. - -\protect - -\endinput - +%D \module
+%D [ file=syst-gen,
+%D version=1996.3.20,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=General,
+%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.
+
+%D The following macros are responsible for the interaction
+%D with \CONTEXT. These macros have proven their use. These
+%D macros are optimized as far as possible within of course,
+%D the know how of the author.
+%D
+%D In this module we also show some of the optimizations,
+%D mainly because we don't want to forget them and start doing
+%D things over and over again. If showing them has a learing
+%D effect for others too, we've surved another purpose too.
+
+%D First we make sure that some important prefix is defined:
+
+\ifx\doifETEX\undefined \long\def\doifETEX#1\par{} \fi
+\ifx\ifnoETEX\undefined \let\ifnoETEX=\empty \fi
+
+%D \macros
+%D {abortinputifdefined}
+%D
+%D Because this module can be used in a different context, we
+%D want to prevent it being loaded more than once. This can be
+%D done using:
+%D
+%D \starttypen
+%D \abortinputifdefined\command
+%D \stoptypen
+%D
+%D where \type{\command} is a command defined in the module
+%D to be loaded only once.
+%D
+%D \starttypen
+%D \def\abortinputifdefined#1%
+%D {\ifx#1\undefined
+%D \let\next=\relax
+%D \else
+%D \let\next=\endinput
+%D \fi
+%D \next}
+%D \stoptypen
+%D
+%D This macro can be speed up in terms of speed as well as
+%D memory. Because this is a nice example of a bit strange
+%D command (\type{\endinput}), we spend some more lines on this.
+%D
+%D If we perform such actions directly, we can say:
+%D
+%D \starttypen
+%D \ifx\somecommand\undefined
+%D \let\next=\relax
+%D \else
+%D \let\next=\endinput
+%D \fi
+%D \next
+%D \stoptypen
+%D
+%D We need the \type{\next} because we need to end the
+%D \type{\fi}. The efficient one is:
+%D
+%D \starttypen
+%D \ifx\somecommand\undefined
+%D \else
+%D \expandafter\endinput
+%D \fi
+%D \stoptypen
+%D
+%D Because \type{\endinput} comes into action after the current
+%D line, we can also say:
+%D
+%D \starttypen
+%D \ifx\somecommand\undefined \else \endinput \fi
+%D \stoptypen
+%D
+%D When we define a macro, we tend to use a format which
+%D shows as besat as can how things are done. \TEX\ however
+%D stores the definitions as a sequence of tokens, so in fact
+%D we can use a formatted definition:
+
+\def\abortinputifdefined#1%
+ {\ifx#1\undefined \else
+ \endinput
+ \fi}
+
+%D which also works. Keep in mind that this is entirely due to
+%D the fact that \type{\endinput} after the line, i.e. at the
+%D end of the macro. We therefore can burry this primitive quite
+%D deep in code.
+
+%D And because this module implements \type{\writestatus}, we
+%D just say:
+
+\abortinputifdefined\writestatus
+
+%D Normally we tell the users what module is being loaded.
+%D However, the command that is needed for this is not yet
+%D defined.
+%D
+%D \starttypen
+%D \writestatus{laden}{Context Systeem Macro's (a)}
+%D \stoptypen
+
+%D \macros
+%D [beschermen]
+%D {protect,unprotect}
+%D
+%D We can shield macros from users by using some special
+%D characters in their names. Some characters that are normally
+%D no letters and therefore often used are: \type{@}, \type{!}
+%D and \type{?}. Before and after the definition of protected
+%D macros, we have to change the \CATCODE\ of these characters.
+%D This is done by \type{\unprotect} and \type{\protect}, for
+%D instance:
+%D
+%D \starttypen
+%D \unprotect
+%D \def\!test{test}
+%D \protect
+%D \stoptypen
+%D
+%D The defined command \type{\!test} can of course only be
+%D called upon when we are in the \type{\unprotect}'ed state,
+%D otherwise \TEX\ reads \type{\!} and probably complains
+%D loudly about not being in math mode.
+%D
+%D Both commands can be used nested, but only the \CATCODE\
+%D of the outermost level is saved. We make use of
+%D an auxilary macro \type{\doprotect} to prevent us from
+%D conflicts with existing macro's \type{\protect}. When
+%D nesting deeper than one level, the system shows the
+%D protection level.
+
+\newcount\protectionlevel
+
+\ifx\protect\undefined
+ \def\protect{\message{<too much protection>}}
+\fi
+
+\let\normalprotect=\protect
+
+%D Although we don't need the \type{%} after commands that
+%D don't take arguments, unless lines are obeyed, I decided
+%D to put it there as a reminder. I only mention this once.
+
+\def\unprotect%
+ {\ifnum\protectionlevel=0
+ \edef\doprotectcharacters%
+ {\catcode`@=\the\catcode`@\relax
+ \catcode`!=\the\catcode`!\relax
+ \catcode`?=\the\catcode`?\relax}%
+ \catcode`@=11
+ \catcode`!=11
+ \catcode`?=11
+ \let\protect=\doprotect
+ \fi
+ \advance\protectionlevel by 1
+ \ifnum\protectionlevel>1
+ \message{<unprotect \the\protectionlevel>}%
+ \fi}
+
+\def\doprotect%
+ {\ifnum\protectionlevel=1
+ \doprotectcharacters
+ \let\protect=\normalprotect
+ \fi
+ \ifnum\protectionlevel>1
+ \message{<protect \the\protectionlevel>}%
+ \fi
+ \advance\protectionlevel by -1\relax}
+
+%D Now it is defined, we can make use of this very useful
+%D macro.
+
+\unprotect
+
+%D \macros
+%D {@@escape,@@begingroup,@@endgroup,@@mathshift,@@alignment,
+%D @@endofline,@@parameter,@@superscript,@@subscript,
+%D @@ignore,@@space,@@letter,@@other,@@active,@@comment}
+%D
+%D In \CONTEXT\ we sometimes manipulate the \CATCODES\ of
+%D certain characters. Because we are not that good at numbers,
+%D we introduce some symbolic names.
+
+\chardef\@@escape = 0
+\chardef\@@begingroup = 1
+\chardef\@@endgroup = 2
+\chardef\@@mathshift = 3
+\chardef\@@alignment = 4
+\chardef\@@endofline = 5
+\chardef\@@parameter = 6
+\chardef\@@superscript = 7
+\chardef\@@subscript = 8
+\chardef\@@ignore = 9
+\chardef\@@space = 10
+\chardef\@@letter = 11
+\chardef\@@other = 12 \chardef\other = 12
+\chardef\@@active = 13 \chardef\active = 13
+\chardef\@@comment = 14
+
+%D \macros
+%D {normalspace}
+%D
+%D We often need a space as defined in \PLAIN\ \TEX. Because
+%D we cannot be sure of \type{\space} is redefined, we define:
+
+\def\normalspace{ }
+
+%D \macros
+%D {scratchcounter,
+%D scratchdimen,scratchskip,scratchmuskip,
+%D scratchbox,
+%D scratchtoks
+%D ifdone}
+%D
+%D Because we often need counters on a temporary basis, we
+%D define the \COUNTER\ \type{\scratchcounter}. This is a
+%D real \COUNTER, and not a pseudo one, as we will meet
+%D further on. We also define some other scratch registers.
+
+\newcount \scratchcounter
+\newdimen \scratchdimen
+\newskip \scratchskip
+\newmuskip \scratchmuskip
+\newbox \scratchbox
+\newtoks \scratchtoks
+\newif \ifdone
+
+%D \macros
+%D {ifCONTEXT}
+%D
+%D In the system and support modules we sometimes show examples
+%D that make use of core commands. We can skip those parts of
+%D the documentation when we use another macropackage. Of
+%D course we default to false.
+
+\newif \ifCONTEXT
+
+%D \macros
+%D {!!count, !!toks, !!dimen, !!box,
+%D !!width, !!height, !!depth, !!string, !!done}
+%D
+%D We define some more \COUNTERS\ and \DIMENSIONS. We also
+%D define some shortcuts to the local scatchregisters~0, 2, 4,
+%D 6 and~8.
+
+\newcount\!!counta \toksdef\!!toksa=0 \dimendef\!!dimena=0 \chardef\!!boxa=0
+\newcount\!!countb \toksdef\!!toksb=2 \dimendef\!!dimenb=2 \chardef\!!boxb=2
+\newcount\!!countc \toksdef\!!toksc=4 \dimendef\!!dimenc=4 \chardef\!!boxc=4
+\newcount\!!countd \toksdef\!!toksd=6 \dimendef\!!dimend=6 \chardef\!!boxd=6
+\newcount\!!counte \toksdef\!!tokse=8 \dimendef\!!dimene=8 \chardef\!!boxe=8
+\newcount\!!countf
+
+\let\!!stringa=\empty \let\!!stringb=\empty \let\!!stringc=\empty
+\let\!!stringd=\empty \let\!!stringe=\empty \let\!!stringf=\empty
+
+\newdimen\!!widtha \newdimen\!!heighta \newdimen\!!deptha \newif\if!!donea
+\newdimen\!!widthb \newdimen\!!heightb \newdimen\!!depthb \newif\if!!doneb
+
+%D \macros
+%D {s!,c!,e!,p!,v!,@@,??}
+%D
+%D To save memory, we use constants (sometimes called
+%D variables). Redefining these constants can have desastrous
+%D results.
+
+\def\v!prefix! {v!} \def\c!prefix! {c!}
+\def\s!prefix! {s!} \def\p!prefix! {p!}
+
+\def\s!next {next} \def\s!default {default}
+\def\s!dummy {dummy} \def\s!unknown {unknown}
+
+\def\s!do {do} \def\s!dodo {dodo}
+
+\def\s!complex {complex} \def\s!start {start}
+\def\s!simple {simple} \def\s!stop {stop}
+
+%D \macros
+%D {@EA,expanded}
+%D
+%D When in unprotected mode, to be entered with
+%D \type{\unprotect}, one can use \type{\@EA} as equivalent
+%D of \type{\expandafter}.
+
+\let\@EA=\expandafter
+
+%D Sometimes we pass macros as arguments to commands that
+%D don't expand them before interpretation. Such commands can
+%D be enclosed with \type{\expanded}, like:
+%D
+%D \starttypen
+%D \expanded{\setupsomething[\alfa]}
+%D \stoptypen
+%D
+%D Such situations occur for instance when \type{\alfa} is a
+%D commalist or when data stored in macros is fed to index of
+%D list commands. If needed, one should use \type{\noexpand}
+%D inside the argument. Later on we will meet some more clever
+%D alternatives to this command.
+
+\def\expanded#1%
+ {\edef\@@expanded{\noexpand#1}\@@expanded}
+
+%D \macros
+%D {gobbleoneargument,gobble...arguments}
+%D
+%D The next set of macros just do nothing, except that they
+%D get rid of a number of arguments.
+
+\long\def\gobbleoneargument #1{}
+\long\def\gobbletwoarguments #1#2{}
+\long\def\gobblethreearguments #1#2#3{}
+\long\def\gobblefourarguments #1#2#3#4{}
+\long\def\gobblefivearguments #1#2#3#4#5{}
+\long\def\gobblesixarguments #1#2#3#4#5#6{}
+\long\def\gobblesevenarguments #1#2#3#4#5#6#7{}
+\long\def\gobbleeightarguments #1#2#3#4#5#6#7#8{}
+\long\def\gobbleninearguments #1#2#3#4#5#6#7#8#9{}
+
+%D \macros
+%D {doifnextcharelse}
+%D
+%D When we started using \TEX\ in the late eighties, our
+%D first experiences with programming concerned a simple shell
+%D around \LATEX. The commands probably use most at \PRAGMA,
+%D are the itemizing ones. One of those few shell commands took
+%D care of an optional argument, that enabled us to specify
+%D what kind of item symbol we wanted. Without understanding
+%D anything we were able to locate a \LATEX\ macro that could
+%D be used to inspect the next character.
+%D
+%D It's this macro that the ancester of the next one presented
+%D here. It executes one of two actions, dependant of the next
+%D character. Disturbing spaces and line endings, which are
+%D normally interpreted as spaces too, are skipped.
+%D
+%D \starttypen
+%D \doifnextcharelse {karakter} {then ...} {else ...}
+%D \stoptypen
+%D
+%D This macro differs from the original in testing on
+%D \type{\endoflinetoken}, which of course we have to define
+%D first. We also use \type{\localnext} because we don't want
+%D clashes with \type{\next}.
+
+\let\endoflinetoken=^^M
+
+\long\def\doifnextcharelse#1#2#3%
+ {\let\charactertoken=#1%
+ \def\!!stringa{#2}%
+ \def\!!stringb{#3}%
+ \futurelet\nexttoken\inspectnextcharacter}
+
+\def\inspectnextcharacter%
+ {\ifx\nexttoken\blankspace
+ \let\localnext\reinspectnextcharacter
+ \else\ifx\!!stringc\endoflinetoken
+ \let\localnext\reinspectnextcharacter
+ \else\ifx\nexttoken\charactertoken
+ \let\localnext\!!stringa
+ \else
+ \let\localnext\!!stringb
+ \fi\fi\fi
+ \localnext}
+
+%D This macro uses some auxiliary macros. Although we were able
+%D to program quite complicated things, I only understood these
+%D after rereading the \TEX book. The trick is in using a
+%D command with a one character name. Such commands differ from
+%D the longer ones in the fact that trailing spaces are {\em
+%D not} skipped. This enables us to indirectly define a long
+%D named macro that gobbles a space.
+%D
+%D In the first line we define \type{\blankspace}. Next we
+%D make \type{\:} equivalent to \type{\reinspect...}. This
+%D one||character command is expanded before the next
+%D \type{\def} comes into action. This way the space after
+%D \type{\:} becomes a delimiter of the longer named
+%D \type{\reinspectnextcharacter}. The chain reaction is
+%D visually compatible with the next sequence:
+%D
+%D \starttypen
+%D \expandafter\def\reinspectnextcharacter %
+%D {\futurelet\nexttoken\inspectnextcharacter}
+%D \stoptypen
+%D
+%D However complicated it may look, I'm still glad I stumbled
+%D into this construction.
+
+\def\:{\let\blankspace= } \:
+
+\def\:{\reinspectnextcharacter}
+
+\expandafter\def\: {\futurelet\nexttoken\inspectnextcharacter}
+
+%D \macros
+%D {setvalue,setgvalue,setevalue,setxvalue,
+%D letvalue,
+%D getvalue,
+%D resetvalue}
+%D
+%D \TEX's primitive \type{\csname} can be used to construct
+%D all kind of commands that cannot be defined with
+%D \type{\def} and \type{\let}. Every macro programmer sooner
+%D or later wants macros like these.
+%D
+%D \starttypen
+%D \setvalue {naam}{...} = \def\naam{...}
+%D \setgvalue {naam}{...} = \gdef\naam{...}
+%D \setevalue {naam}{...} = \edef\naam{...}
+%D \setxvalue {naam}{...} = \xdef\naam{...}
+%D \letvalue {naam}=\... = \let\naam=\...
+%D \getvalue {naam} = \naam
+%D \resetvalue {naam} = \def\naam{}
+%D \stoptypen
+%D
+%D As we will see, \CONTEXT\ uses these commands many times,
+%D which is mainly due to its object oriented and parameter
+%D driven character.
+
+\def\setvalue#1%
+ {\expandafter\def\csname#1\endcsname}
+
+\def\setgvalue#1%
+ {\expandafter\gdef\csname#1\endcsname}
+
+\def\setevalue#1%
+ {\expandafter\edef\csname#1\endcsname}
+
+\def\setxvalue#1%
+ {\expandafter\xdef\csname#1\endcsname}
+
+\def\getvalue#1%
+ {\csname#1\endcsname}
+
+\def\letvalue#1%
+ {\expandafter\let\csname#1\endcsname}
+
+\def\resetvalue#1%
+ {\expandafter\let\csname#1\endcsname=\empty}
+
+%D \macros
+%D {donottest,unexpanded}
+%D
+%D When expansion of a macro gives problems, we can precede it
+%D by \type{\donottest}. It seems that protection is one of the
+%D burdens of developers of packages, so maybe that's why in
+%D \ETEX\ protection is solved in a more robust way.
+%D
+%D Sometimes prefixing the macro with \type{\donottest} leads
+%D to defining an auxiliary macro, like
+%D
+%D \starttypen
+%D \def\dosomecommand {... ... ...}
+%D \def\somecommand {\donottest\dosomecommand}
+%D \stoptypen
+%D
+%D This double definition can be made transparant by using
+%D \type{\protecte}, as in:
+%D
+%D \starttypen
+%D \unexpanded\def\somecommand{... ... ...}
+%D \stoptypen
+%D
+%D The protection mechanism uses:
+
+\def\dontprocesstest#1%
+ {==}
+
+\def\doprocesstest#1%
+ {#1}
+
+\let\donottest=\doprocesstest
+
+%D By the way, we use a placeholder because we don't want
+%D interference when testing on empty strings. Using a
+%D placeholder of 8~characters increases the processing time
+%D of simple \type{\doifelse} tests by about 10 \%. When we
+%D process the test, we have to remove the braces and
+%D therefore explictly gobble \type{#1}.
+
+%D The fact that many macros have the same prefix, could have
+%D a negative impact on searching in the hash table. Because
+%D some simple testing does not show differences, we just use:
+%D
+%D \starttypen
+%D \def\unexpanded#1#2%
+%D {\@EA#1\@EA#2\@EA{\@EA\donottest\csname\s!do\string#2\endcsname}%
+%D \@EA#1\csname\s!do\string#2\endcsname}
+%D \stoptypen
+%D
+%D Well, in fact we use the bit more versaatile alternative:
+
+\ifnoETEX \def\dosetunexpanded#1#2%
+ {\@EA#1\@EA{\@EA#2\@EA}%
+ \@EA{\@EA\donottest\csname\s!do\@EA\string\csname#2\endcsname\endcsname}%
+ \@EA#1{\s!do\@EA\string\csname#2\endcsname}}
+
+\ifnoETEX \def\docomunexpanded#1#2%
+ {\@EA#1\@EA#2\@EA{\@EA\donottest\csname\s!do\string#2\endcsname}%
+ \@EA#1\csname\s!do\string#2\endcsname}
+
+\ifnoETEX \def\unexpanded#1%
+ {\def\dounexpanded%
+ {\ifx\next\bgroup
+ \@EA\dosetunexpanded
+ \else
+ \@EA\docomunexpanded
+ \fi#1}%
+ \futurelet\next\dounexpanded}
+
+\doifETEX \let\unexpanded=\normalprotected
+
+%D This one accepts the more direct \type{\def} and cousins
+%D as well as the \CONTEXT\ specific \type{\setvalue} ones.
+%D
+%D And so the definition in our example turns out to be:
+%D
+%D \starttypen
+%D \def\csname do\somecommand\endcsname{... ... ...}
+%D \def\somecommand{\donottest\csname do\somecommand\endcsname}
+%D \stoptypen
+%D
+%D In which \type{do\somecommand} is hidden from the user and
+%D cannot lead to confusion. It's still permitted to define
+%D auxiliary macros like \type{\dosomecommand}.
+%D
+%D When we are going to use e-\TEX, we'll probably end up
+%D redefining some commands, but we can probably keep the
+%D \type{\unexpanded} ones unchanged.
+
+%D \macros
+%D {doifundefined,doifdefined,
+%D doifundefinedelse,doifdefinedelse,
+%D doifalldefinedelse}
+%D
+%D The standard way of testing if a macro is defined is
+%D comparing its meaning with another undefined one, usually
+%D \type{\undefined}. To garantee correct working of the next
+%D set of macros, \type{\undefined} may never be defined!
+%D
+%D \starttypen
+%D \doifundefined {string} {...}
+%D \doifdefined {string} {...}
+%D \doifundefinedelse {string} {then ...} {else ...}
+%D \doifdefinedelse {string} {then ...} {else ...}
+%D \doifalldefinedelse {commalist} {then ...} {else ...}
+%D \stoptypen
+%D
+%D Every macroname that \TEX\ builds gets an entry in the hash
+%D table, which is of limited size. It is expected that e-\TeX\
+%D will offer a less memory||consuming alternative.
+
+%D Although it will probably never be a big problem, it is good
+%D to be aware of the difference between testing on a macro
+%D name to be build by using \type{\csname} and
+%D \type{\endcsname} and testing the \type{\name} directly.
+%D
+%D \starttypen
+%D \expandafter\ifx\csname NameA\endcsname\relax ... \else ... \fi
+%D
+%D \ifx\NameB\undefined ... \else ... \fi
+%D \stoptypen
+%D
+%D I became aware of this when I mistakenly testen the first
+%D one against \type{\undefined}. When \TEX\ build a name using
+%D \type{\csname} it automatically sets it to \type{\relax},
+%D which is definitely not the same as \type{\undefined}. The
+%D quickest way to check these things is asking \TEX\ to show
+%D the meaning of the names:
+%D
+%D \starttypen
+%D \expandafter\show\csname NameA\endcsname
+%D
+%D \show\NameB
+%D \stoptypen
+%D
+%D The main reason why this never will be a big problem is that
+%D when one uses the \type{\csname} way, one probably has to do
+%D with some macroname that always is dealt with that way.
+%D Confusion can however arise when one applies both testing
+%D methods to the same macroname. By the way, the assignment
+%D of \type{\relax} obeys grouping.
+
+%D The first one gets rid of \type{#1}, but still expands to
+%D something and the second one expands to \type{#1}. Because
+%D we accept arguments between \type{{}}, we have to get rid
+%D of one level of braces.
+%D
+%D Our first implementation of \type{\ifundefined} was
+%D straightforward and readable:
+%D
+%D \starttypen
+%D \def\ifundefined#1%
+%D {\expandafter\ifx\csname#1\endcsname\relax}%
+%D
+%D \def\doifundefinedelse#1#2#3%
+%D {\let\donottest=\dontprocesstest
+%D \ifundefined{#1}%
+%D \let\donottest=\doprocesstest#2%
+%D \else
+%D \let\donottest=\doprocesstest#3%
+%D \fi}
+%D
+%D \def\doifdefinedelse#1#2#3%
+%D {\doifundefinedelse{#1}{#3}{#2}}
+%D
+%D \def\doifundefined#1#2%
+%D {\doifundefinedelse{#1}{#2}{}}
+%D
+%D \def\doifdefined#1#2%
+%D {\doifundefinedelse{#1}{}{#2}}
+%D
+%D \def\doifalldefinedelse#1#2#3%
+%D {\bgroup
+%D \donetrue
+%D \def\checkcommand##1%
+%D {\doifundefined{##1}{\donefalse}}%
+%D \processcommalist[#1]\checkcommand
+%D \ifdone
+%D \egroup#2%
+%D \else
+%D \egroup#3%
+%D \fi}
+%D \stoptypen
+%D
+%D When this module was optimized, timing showed that the
+%D next alternative can be upto twice as fast, especially when
+%D longer arguments are used.
+
+\def\ifundefined#1%
+ {\expandafter\ifx\csname#1\endcsname\relax}
+
+\def\p!doifundefined#1%
+ {\let\donottest\dontprocesstest
+ \expandafter\ifx\csname#1\endcsname\relax}
+
+\def\doifundefinedelse#1#2#3%
+ {\p!doifundefined{#1}%
+ \let\donottest\doprocesstest#2%
+ \else
+ \let\donottest\doprocesstest#3%
+ \fi}
+
+\def\doifdefinedelse#1#2#3%
+ {\p!doifundefined{#1}%
+ \let\donottest\doprocesstest#3%
+ \else
+ \let\donottest\doprocesstest#2%
+ \fi}
+
+\def\doifundefined#1#2%
+ {\p!doifundefined{#1}%
+ \let\donottest\doprocesstest#2%
+ \else
+ \let\donottest\doprocesstest
+ \fi}
+
+\def\doifdefined#1#2%
+ {\p!doifundefined{#1}%
+ \let\donottest\doprocesstest
+ \else
+ \let\donottest\doprocesstest#2%
+ \fi}
+
+% NEW:
+
+\doifETEX \def\ifundefined#1%
+ {\unless\ifcsname#1\endcsname}
+
+\doifETEX \def\p!doifundefined#1%
+ {\let\donottest\dontprocesstest
+ \unless\ifcsname#1\endcsname}
+
+%D Before we start using this variant, we used another one,
+%D which is even a bit faster. This one looked like:
+%D
+%D \starttypen
+%D \def\p!doifundefined%
+%D {\begingroup
+%D \let\donottest=\dontprocesstest
+%D \ifundefined}
+%D
+%D \def\doifundefinedelse#1#2#3%
+%D {\p!doifundefined{#1}%
+%D \endgroup#2%
+%D \else
+%D \endgroup#3%
+%D \fi}
+%D \stoptypen
+%D
+%D A even more previous version used \type{\bgroup} and
+%D \type{\egroup}. In math mode however, \type{$1{x}2$} differs
+%D from \type{$1x2$}. This can been seen when one compares the
+%D output of:
+%D
+%D \starttypen
+%D $\kern10pt\showthe\lastkern$
+%D $\kern10pt{\showthe\lastkern}$
+%D $\kern10pt\begingroup\showthe\lastkern\endgroup$
+%D \stoptypen
+%D
+%D When we were developing the scientific units module, we
+%D encountered different behavior in text and math mode, which
+%D was due to this grouping subtilities. We therefore decided
+%D to use \type{\begingroup} instead of \type{\bgroup}.
+%D Later, when we had optimized some macro's the grouped
+%D solution turned out to be unsafe when typesetting this
+%D documentation, especially when using \type{\globaldefs}.
+%D
+%D We still have to define \type{\doifalldefinedelse}. Watch
+%D the use of grouping, which garantees local use of the
+%D boolean \type{\ifdone}.
+
+\def\docheckonedefined#1%
+ {\ifundefined{#1}%
+ \donefalse
+ \fi}
+
+\def\doifalldefinedelse#1#2#3%
+ {\begingroup
+ \let\donottest\dontprocesstest
+ \donetrue
+ \processcommalist[#1]\docheckonedefined
+ \ifdone
+ \endgroup\let\donottest\doprocesstest#2%
+ \else
+ \endgroup\let\donottest\doprocesstest#3%
+ \fi}
+
+%D \macros
+%D {doif,doifelse,doifnot,
+%D donottest}
+%D
+%D Programming in \TEX\ differs from programming in procedural
+%D languages like \MODULA. This means that one --- well, let me
+%D speek for myself --- tries to do the things in the well
+%D known way. Therefore the next set of \type{\ifthenelse}
+%D commands were between the first ones we needed. A few years
+%D later, the opposite became true: when programming in
+%D \MODULA, I sometimes miss handy things like grouping,
+%D runtime redefinition, expansion etc. While \MODULA\ taught
+%D me to structure, \TEX\ taught me to think recursive.
+%D
+%D \starttypen
+%D \doif {string1} {string2} {...}
+%D \doifnot {string1} {string2} {...}
+%D \doifelse {string1} {string2} {then ...}{else ...}
+%D \stoptypen
+%D
+%D When expansion gives problems, we can precede the
+%D troublemaker with \type{\donottest}.
+%D
+%D This implementatie does not use the construction which is
+%D more robust for nested conditionals.
+%D
+%D \starttypen
+%D \ifx\!!stringa\!!stringb
+%D \def\next{#3}%
+%D \else
+%D \def\next{#4}%
+%D \fi
+%D \next
+%D \stoptypen
+%D
+%D In practice, this alternative is at least 20\% slower than
+%D the alternative used here. The few cases in which we
+%D really need the \type{\next} construction, often need some
+%D other precautions and or adaptions too.
+
+\long\def\doif#1#2#3%
+ {\let\donottest\dontprocesstest
+ \edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\!!stringb
+ #3%
+ \fi}
+
+\long\def\doifnot#1#2#3%
+ {\let\donottest\dontprocesstest
+ \edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\!!stringb
+ \else
+ #3%
+ \fi}
+
+\long\def\doifelse#1#2#3#4%
+ {\let\donottest\dontprocesstest
+ \edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\!!stringb
+ #3%
+ \else
+ #4%
+ \fi}
+
+%D One could wonder why we don't follow the the same approach
+%D as in \type{\doifdefined} c.s.\ and use \type{\begingroup}
+%D and \type{\endgroup}. In this case, this alternative is
+%D slower, which is probably due to the fact that more meanings
+%D need to be restored.
+%D
+%D The in terms of memory more efficient alternative using a
+%D auxiliary macro also proved to be slower, so we definitely
+%D did not choose for:
+%D
+%D \starttypen
+%D \def\p!doifelse#1#2%
+%D {\let\donottest=\dontprocesstest
+%D \edef\!!stringa{#1}%
+%D \edef\!!stringb{#2}%
+%D \let\donottest=\doprocesstest
+%D \ifx\!!stringa\!!stringb}
+%D
+%D \long\def\doif#1#2#3%
+%D {\p!doifelse{#1}{#2}#3\fi}
+%D
+%D \long\def\doifnot#1#2#3%
+%D {\p!doifelse{#1}{#2}\else#3\fi}
+%D
+%D \long\def\doifelse#1#2#3#4%
+%D {\p!doifelse{#1}{#2}#3\else#4\fi}
+%D \stoptypen
+%D
+%D Optimizations like this are related of course to the
+%D bottlenecks in \TEX. It seems that restoring saved meanings
+%D and passing arguments takes some time.
+
+%D \macros
+%D {doifempty,doifemptyelse,doifnotempty}
+%D
+%D We complete our set of conditionals with:
+%D
+%D \starttypen
+%D \doifempty {string} {...}
+%D \doifnot {string} {...}
+%D \doifemptyelse {string} {then ...} {else ...}
+%D \stoptypen
+%D
+%D This time, the string is not expanded.
+
+\long\def\doifemptyelse#1#2#3%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ #2%
+ \else
+ #3%
+ \fi}
+
+\long\def\doifempty#1#2%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ #2%
+ \fi}
+
+\long\def\doifnotempty#1#2%
+ {\def\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \else
+ #2%
+ \fi}
+
+%D \macros
+%D {doifinset,doifnotinset,doifinsetelse}
+%D
+%D We can check if a string is present in a comma separated
+%D set of strings. Depending on the result, some action is
+%D taken.
+%D
+%D \starttypen
+%D \doifinset {string} {string,...} {...}
+%D \doifnotinset {string} {string,...} {...}
+%D \doifinsetelse {string} {string,...} {then ...} {else ...}
+%D \stoptypen
+%D
+%D The second argument is the comma separated set of strings.
+%D
+%D \starttypen
+%D \long\def\doifinsetelse#1#2#3#4%
+%D {\doifelse{#1}{}
+%D {#4}
+%D {\donefalse
+%D \def\v!checkiteminset##1%
+%D {\doif{#1}{##1}
+%D {\donetrue
+%D \let\v!checkiteminset=\gobbleoneargument}}%
+%D \processcommalist[#2]\v!checkiteminset
+%D \ifdone
+%D #3%
+%D \else
+%D #4%
+%D \fi}}
+%D
+%D \long\def\doifinset#1#2#3%
+%D {\doifinsetelse{#1}{#2}{#3}{}}
+%D
+%D \long\def\doifnotinset#1#2#3%
+%D {\doifinsetelse{#1}{#2}{}{#3}}
+%D \stoptypen
+%D
+%D Because this macro is called quite often we've spent some
+%D time optimizing it. This time, the gain in speed is due to
+%D (1)~defining an external auxiliary macro, (2)~not calling
+%D any other macros and (3)~minimizing the passing of
+%D arguments. The gain in speed is impressive.
+
+\def\p!dodocheckiteminset#1%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringa\!!stringb
+ \donetrue
+ \let\p!docheckiteminset\gobbleoneargument
+ \fi}
+
+\def\p!doifinsetelse#1#2%
+ {\let\donottest\dontprocesstest
+ \donefalse
+ \edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \else
+ \let\p!docheckiteminset=\p!dodocheckiteminset
+ \processcommalist[#2]\p!docheckiteminset
+ \fi
+ \let\donottest\doprocesstest
+ \ifdone}
+
+\long\def\doifinsetelse#1#2#3#4%
+ {\p!doifinsetelse{#1}{#2}%
+ #3%
+ \else
+ #4%
+ \fi}
+
+\long\def\doifinset#1#2#3%
+ {\p!doifinsetelse{#1}{#2}%
+ #3%
+ \fi}
+
+\long\def\doifnotinset#1#2#3%
+ {\p!doifinsetelse{#1}{#2}%
+ \else
+ #3%
+ \fi}
+
+%D \macros
+%D {doifcommon,doifnotcommon,doifcommonelse}
+%D
+%D Probably the most time consuming tests are those that test
+%D for overlap in sets of strings.
+%D
+%D \starttypen
+%D \doifcommon {string,...} {string,...} {...}
+%D \doifnotcommon {string,...} {string,...} {...}
+%D \doifcommonelse {string,...} {string,...} {then ...} {else ...}
+%D \stoptypen
+%D
+%D We show the slower alternative first, because it shows us
+%D how things are done.
+%D
+%D \starttypen
+%D \long\def\doifcommonelse#1#2#3#4%
+%D {\donefalse
+%D \def\p!docommoncheck##1%
+%D {\def\p!dodocommoncheck####1%
+%D {\doif{####1}{##1}
+%D {\donetrue
+%D \def\commalistelement{##1}%
+%D \let\p!docommoncheck=\gobbleoneargument
+%D \let\p!dodocommoncheck=\gobbleoneargument}}%
+%D \processcommalist[#2]\p!dodocommoncheck}%
+%D \processcommalist[#1]\p!docommoncheck
+%D \ifdone
+%D #3%
+%D \else
+%D #4%
+%D \fi}
+%D
+%D \long\def\doifcommon#1#2#3%
+%D {\doifcommonelse{#1}{#2}{#3}{}}
+%D
+%D \long\def\doifnotcommon#1#2#3%
+%D {\doifcommonelse{#1}{#2}{}{#3}}
+%D \stoptypen
+%D
+%D The processing time is shortened by getting the auxiliary
+%D macro to the outermost level and using less \type{\edef}'s.
+%D Sometimes it makes more sence to define local macro's not
+%D only because this way we can be sure that they are not
+%D redefined, but also because it shows the dependance. In
+%D compiled languages, this is no problem at all. It can even
+%D save us bytes and processing time. In interpreted languages
+%D like \TEX\ it nearly always slows down processing.
+
+\def\p!dododocommoncheck#1%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringa\!!stringb
+ \donetrue
+ \let\p!docommoncheck\gobbleoneargument
+ \let\p!dodocommoncheck\gobbleoneargument
+ \fi}
+
+\def\p!doifcommonelse#1#2%
+ {\donefalse
+ \let\donottest\dontprocesstest
+ \let\p!dodocommoncheck\p!dododocommoncheck
+ \def\p!docommoncheck##1%
+ {\edef\!!stringa{##1}%
+ \def\commalistelement{##1}%
+ \processcommalist[#2]\p!dodocommoncheck}%
+ \processcommalist[#1]\p!docommoncheck
+ \let\donottest\doprocesstest
+ \ifdone}
+
+\long\def\doifcommonelse#1#2#3#4%
+ {\p!doifcommonelse{#1}{#2}%
+ #3%
+ \else
+ #4%
+ \fi}
+
+\long\def\doifcommon#1#2#3%
+ {\p!doifcommonelse{#1}{#2}%
+ #3%
+ \fi}
+
+\long\def\doifnotcommon#1#2#3%
+ {\p!doifcommonelse{#1}{#2}%
+ \else
+ #3%
+ \fi}
+
+%D \macros
+%D {processcommalist,processcommacommand,
+%D processcommalistwithparameters}
+%D
+%D We've already seen some macros that take care of comma
+%D separated lists. Such list can be processed with
+%D
+%D \starttypen
+%D \processcommalist[string,string,...]\commando
+%D \stoptypen
+%D
+%D The user supplied command \type{\commando} receives one
+%D argument: the string. This command permits nesting and
+%D spaces after commas are skipped. Empty sets are no problem.
+%D
+%D \startbuffer
+%D \def\dosomething#1{(#1)}
+%D
+%D \processcommalist [\hbox{$a,b,c,d,e,f$}] \dosomething \par
+%D \processcommalist [{a,b,c,d,e,f}] \dosomething \par
+%D \processcommalist [{a,b,c},d,e,f] \dosomething \par
+%D \processcommalist [a,b,{c,d,e},f] \dosomething \par
+%D \processcommalist [a{b,c},d,e,f] \dosomething \par
+%D \processcommalist [{a,b}c,d,e,f] \dosomething \par
+%D \processcommalist [] \dosomething \par
+%D \processcommalist [{[}] \dosomething \par
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Before we show the result, we present the macro's:
+
+\newcount\commalevel
+
+\def\dododoprocesscommaitem%
+ {\csname\s!next\the\commalevel\endcsname}
+
+\def\dodoprocesscommaitem%
+ {\ifx\nexttoken\blankspace
+ \let\nextcommaitem\redoprocesscommaitem
+ %\else\ifx\nexttoken\endoflinetoken
+ %\let\nextcommaitem\redoprocesscommaitem
+ \else\ifx\nexttoken]%
+ \let\nextcommaitem\gobbleoneargument
+ \else
+ \let\nextcommaitem\dododoprocesscommaitem
+ \fi\fi%\fi
+ \nextcommaitem}
+
+\def\doprocesscommaitem%
+ {\futurelet\nexttoken\dodoprocesscommaitem}
+
+\def\doprocesscommalist#1]#2%
+ {\advance\commalevel by 1\relax
+ \long\expandafter\def\csname\s!next\the\commalevel\endcsname##1,%
+ {#2{##1}\doprocesscommaitem}%
+ \doprocesscommaitem#1,]\relax
+ \advance\commalevel by -1\relax}
+
+%D Empty arguments are not processed. Empty items (\type{,,})
+%D however are treated.
+
+\def\docheckcommaitem%
+ {\ifx\nexttoken]%
+ \let\nextcommaitem\gobbletwoarguments
+ \else
+ \let\nextcommaitem\doprocesscommalist
+ \fi
+ \nextcommaitem}
+
+\def\processcommalist[%
+ {\futurelet\nexttoken\docheckcommaitem}
+
+%D We use the same hack for checking the next character, that
+%D we use in \type{\doifnextcharelse}.
+
+\def\:{\redoprocesscommaitem}
+
+\expandafter\def\: {\futurelet\nexttoken\dodoprocesscommaitem}
+
+%D The previous examples lead to:
+%D
+%D \haalbuffer
+
+%D When a list is saved in a macro, we can use a construction
+%D like:
+%D
+%D \starttypen
+%D \expandafter\processcommalist\expandafter[\list]\command
+%D \stoptypen
+%D
+%D Such solutions suit most situations, but we wanted a bit
+%D more.
+%D
+%D \starttypen
+%D \processcommacommand[string,\stringset,string]\commando
+%D \stoptypen
+%D
+%D where \type{\stringset} is a predefined set, like:
+%D
+%D \starttypen
+%D \def\first{aap,noot,mies}
+%D \def\second{laatste}
+%D
+%D \processcommacommand[\first]\message
+%D \processcommacommand[\first,second,third]\message
+%D \processcommacommand[\first,between,\second]\message
+%D \stoptypen
+%D
+%D Commands that are part of the list are expanded, so the
+%D use of this macro has it slimits.
+
+\def\processcommacommand[#1]%
+ {\edef\commacommand{#1}%
+ \toks0=\expandafter{\expandafter[\commacommand]}%
+ \expandafter\processcommalist\the\toks0 }
+
+%D The argument to \type{\command} is not delimited. Because
+%D we often use \type{[]} as delimiters, we also have:
+%D
+%D \starttypen
+%D \processcommalistwithparameters[string,string,...]\command
+%D \stoptypen
+%D
+%D where \type{\command} looks like:
+%D
+%D \starttypen
+%D \def\command[#1]{... #1 ...}
+%D \stoptypen
+
+\def\processcommalistwithparameters[#1]#2%
+ {\def\docommand##1{#2[##1]}%
+ \processcommalist[#1]\docommand}
+
+%D \macros
+%D {processaction,
+%D processfirstactioninset,
+%D processallactionsinset}
+%D
+%D \CONTEXT\ makes extensive use of a sort of case or switch
+%D command. Depending of the presence of one or more provided
+%D items, some actions is taken. These macros can be nested
+%D without problems.
+%D
+%D \starttypen
+%D \processaction [x] [a=>\a,b=>\b,c=>\c]
+%D \processfirstactioninset [x,y,z] [a=>\a,b=>\b,c=>\c]
+%D \processallactionsinset [x,y,z] [a=>\a,b=>\b,c=>\c]
+%D \stoptypen
+%D
+%D We can supply both a \type{default} action and an action
+%D to be undertaken when an \type{unknown} value is met:
+%D
+%D \starttypen
+%D \processallactionsinset
+%D [x,y,z]
+%D [ a=>\a,
+%D b=>\b,
+%D c=>\c,
+%D default=>\default,
+%D unknown=>\unknown{... \commalistelement ...}]
+%D \stoptypen
+%D
+%D When \type{#1} is empty, this macro scans list \type{#2} for
+%D the keyword \type{default} and executed the related action
+%D if present. When \type{#1} is non empty and not in the list,
+%D the action related to \type{unknown} is executed. Both
+%D keywords must be at the end of list \type{#2}. Afterwards,
+%D the actually found keyword is available in
+%D \type{\commalistelement}. An advanced example of the use of
+%D this macro can be found in \PPCHTEX, where we completely
+%D rely on \TEX\ for interpreting user supplied keywords like
+%D \type{SB}, \type{SB1..6}, \type{SB125} etc.
+%D
+%D Even a quick glance at the macros below show some overlap,
+%D which means that more efficient alternatives are possible.
+%D Because these macro's are very sensitive to subtle changes,
+%D we've decided to present the readable originals first
+%D Maybe these these macros look complicated, but this is a
+%D direct result of the support of nesting. Protection is only
+%D applied in \type{\processaction}.
+%D
+%D \starttypen
+%D \newcount\processlevel
+%D
+%D \def\processaction[#1]#2[#3]%
+%D {\doifelse{#1}{}
+%D {\def\c!compareprocessaction[##1=>##2]%
+%D {\edef\!!stringa{##1}%
+%D \ifx\!!stringa\s!default
+%D \def\commalistelement{#1}%
+%D ##2%
+%D \fi}}
+%D {\let\donottest=\dontprocesstest
+%D \edef\!!stringb{#1}%
+%D \let\donottest=\doprocesstest
+%D \def\c!compareprocessaction[##1=>##2]%
+%D {\edef\!!stringa{##1}%
+%D \ifx\!!stringa\!!stringb
+%D \def\commalistelement{#1}%
+%D ##2%
+%D \let\c!doprocessaction=\gobbleoneargument
+%D \else\ifx\!!stringa\s!unknown
+%D \def\commalistelement{#1}%
+%D ##2%
+%D \fi\fi}}%
+%D \def\c!doprocessaction##1%
+%D {\c!compareprocessaction[##1]}%
+%D \processcommalist[#3]\c!doprocessaction}
+%D
+%D \def\processfirstactioninset[#1]#2[#3]%
+%D {\doifelse{#1}{}
+%D {\processaction[][#3]}
+%D {\def\c!compareprocessaction[##1=>##2][##3]%
+%D {\edef\!!stringa{##1}%
+%D \edef\!!stringb{##3}%
+%D \ifx\!!stringa\!!stringb
+%D \def\commalistelement{##3}%
+%D ##2%
+%D \let\c!doprocessaction=\gobbleoneargument
+%D \let\c!dodoprocessaction=\gobbleoneargument
+%D \else\ifx\!!stringa\s!unknown
+%D \def\commalistelement{##3}%
+%D ##2%
+%D \fi\fi}%
+%D \def\c!doprocessaction##1%
+%D {\def\c!dodoprocessaction####1%
+%D {\c!compareprocessaction[####1][##1]}%
+%D \processcommalist[#3]\c!dodoprocessaction}%
+%D \processcommalist[#1]\c!doprocessaction}}
+%D
+%D \def\processallactionsinset[#1]#2[#3]%
+%D {\doifelse{#1}{}
+%D {\processaction[][#3]}
+%D {\advance\processlevel by 1\relax
+%D \def\c!compareprocessaction[##1=>##2][##3]%
+%D {\edef\!!stringa{##1}%
+%D \edef\!!stringb{##3}%
+%D \ifx\!!stringa\!!stringb
+%D \def\commalistelement{##3}%
+%D ##2%
+%D \let\c!dodoprocessaction=\gobbleoneargument
+%D \else\ifx\!!stringa\s!unknown
+%D \def\commalistelement{##3}%
+%D ##2%
+%D \fi\fi}%
+%D \setvalue{\s!do\the\processlevel}##1%
+%D {\def\c!dodoprocessaction####1%
+%D {\c!compareprocessaction[####1][##1]}%
+%D \processcommalist[#3]\c!dodoprocessaction}%
+%D \processcommalist[#1]{\getvalue{\s!do\the\processlevel}}%
+%D \advance\processlevel by -1\relax}}
+%D \stoptypen
+%D
+%D The gain of speed in the final implementation is around
+%D 20\%, depending on the application.
+
+\newcount\processlevel
+
+\def\v!compareprocessactionA[#1=>#2][#3]%
+ {\edef\!!stringb{#1}%
+ \ifx\!!stringb\s!default
+ \let\commalistelement\empty
+ #2%
+ \fi}
+
+\def\v!compareprocessactionB[#1=>#2][#3]%
+ {\expandedaction\!!stringb{#1}%
+ \ifx\!!stringa\!!stringb
+ \def\commalistelement{#3}%
+ #2%
+ \let\p!doprocessaction\gobbleoneargument
+ \else
+ \edef\!!stringb{#1}%
+ \ifx\!!stringb\s!unknown
+ \def\commalistelement{#3}% beware of loops
+ #2%
+ \fi
+ \fi}
+
+\def\processaction[#1]#2[#3]%
+ {\let\donottest\dontprocesstest
+ \expandedaction\!!stringa{#1}%
+ \let\donottest\doprocesstest
+ \ifx\!!stringa\empty
+ \let\v!compareprocessaction=\v!compareprocessactionA
+ \else
+ \let\v!compareprocessaction=\v!compareprocessactionB
+ \fi
+ \def\p!doprocessaction##1%
+ {\v!compareprocessaction[##1][#1]}%
+ \processcommalist[#3]\p!doprocessaction
+ \expandactions}
+
+\def\v!compareprocessactionC[#1=>#2][#3]%
+ {\expandedaction\!!stringa{#1}%
+ \expandedaction\!!stringb{#3}%
+ \ifx\!!stringa\!!stringb
+ \def\commalistelement{#3}%
+ #2%
+ \let\p!doprocessaction=\gobbleoneargument
+ \let\p!dodoprocessaction=\gobbleoneargument
+ \else
+ \edef\!!stringa{#1}%
+ \ifx\!!stringa\s!unknown
+ \def\commalistelement{#3}%
+ #2%
+ \fi
+ \fi}
+
+\def\processfirstactioninset[#1]#2[#3]%
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \processaction[][#3]%
+ \else
+ \def\p!doprocessaction##1%
+ {\def\p!dodoprocessaction####1%
+ {\v!compareprocessactionC[####1][##1]}%
+ \processcommalist[#3]\p!dodoprocessaction}%
+ \processcommalist[#1]\p!doprocessaction
+ \fi
+ \expandactions}
+
+\def\v!compareprocessactionD[#1=>#2][#3]%
+ {\expandedaction\!!stringa{#1}%
+ \expandedaction\!!stringb{#3}%
+ \ifx\!!stringa\!!stringb
+ \def\commalistelement{#3}%
+ #2%
+ \let\p!dodoprocessaction=\gobbleoneargument
+ \else
+ \edef\!!stringa{#1}%
+ \ifx\!!stringa\s!unknown
+ \def\commalistelement{#3}%
+ #2%
+ \fi
+ \fi}
+
+\def\processallactionsinset[#1]#2[#3]%
+ {\expandedaction\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ \processaction[][#3]%
+ \else
+ \advance\processlevel by 1
+ \setvalue{\s!do\the\processlevel}##1%
+ {\def\p!dodoprocessaction####1%
+ {\v!compareprocessactionD[####1][##1]}%
+ \processcommalist[#3]\p!dodoprocessaction}%
+ \processcommalist[#1]{\getvalue{\s!do\the\processlevel}}%
+ \advance\processlevel by -1
+ \fi
+ \expandactions}
+
+%D \macros
+%D {unexpandedprocessaction,
+%D unexpandedprocessfirstactioninset,
+%D unexpandedprocessallactionsinset}
+%D
+%D Now what are those expansion commands doing there. Well,
+%D sometimes we want to compare actions that may consist off
+%D commands (i.e. are no constants). In such occasions we can
+%D use the a bit slower alternatives:
+
+\def\unexpandedprocessfirstactioninset{\dontexpandactions\processfirstactioninset}
+\def\unexpandedprocessaction {\dontexpandactions\processaction}
+\def\unexpandedprocessallactionsinset {\dontexpandactions\processallactionsinset}
+
+%D By default we expand actions:
+
+\def\expandactions%
+ {\let\expandedaction\edef}
+
+\expandactions
+
+%D But when needed we convert the strings to meaningful
+%D sequences of characters.
+
+\def\unexpandedaction#1>{}
+
+\def\noexpandedaction#1#2%
+ {\def\convertedargument{#2}%
+ \@EA\edef\@EA#1\@EA{\@EA\unexpandedaction\meaning\convertedargument}}
+
+\def\dontexpandactions%
+ {\let\expandedaction\noexpandedaction}
+
+%D \macros
+%D {getfirstcharacter,firstcharacter}
+%D
+%D Sometimes the action to be undertaken depends on the
+%D next character. This macro get this character and puts it in
+%D \type{\firstcharacter}.
+%D
+%D \starttypen
+%D \getfirstcharacter {string}
+%D \stoptypen
+%D
+%D A two step expansion is used to prevent problems with
+%D complicated arguments, for instance arguments that
+%D consist of two or more expandable tokens.
+
+\def\dogetfirstcharacter#1#2\\%
+ {\def\firstcharacter{#1}}
+
+\def\getfirstcharacter#1%
+ {\edef\!!stringa{#1}%
+ \expandafter\dogetfirstcharacter\!!stringa\\}
+
+%D \macros
+%D {doifinstringelse, doifincsnameelse}
+%D
+%D We can check for the presence of a substring in a given
+%D sequence of characters.
+%D
+%D \starttypen
+%D \doifinsetelse {substring} {string} {then ...} {else ...}
+%D \stoptypen
+%D
+%D An application of this command can be found further on.
+%D Like before, we first show some alternatives, like the one
+%D we started with:
+%D
+%D \starttypen
+%D \long\def\p!doifinstringelse#1#2#3#4%
+%D {\def\c!doifinstringelse##1#1##2##3\war%
+%D {\if##2@%
+%D #4%
+%D \else
+%D #3%
+%D \fi}%
+%D \c!doifinstringelse#2#1@@\war}
+%D
+%D \def\doifinstringelse%
+%D {\ExpandBothAfter\p!doifinstringelse}
+%D \stoptypen
+%D
+%D After this we came to:
+%D
+%D \starttypen
+%D \def\p!doifinstringelse#1#2%
+%D {\def\c!doifinstringelse##1#1##2##3\war%
+%D {\if##2@}%
+%D \c!doifinstringelse#2#1@@\war}
+%D
+%D \def\doifinstringelse#1#2#3#4%
+%D {\ExpandBothAfter\p!doifinstringelse{#1}{#2}%
+%D #4%
+%D \else
+%D #3%
+%D \fi}
+%D \stoptypen
+%D
+%D Sometimes the second argument is passed as a macro. By
+%D postponing the expansion of this macro, we gain quite some
+%D run time, simply because the less tokens we pass, the faster
+%D \TEX\ runs. So finally the definition became:
+
+\def\v!ifinstringelse#1#2%
+ {\def\c!ifinstringelse##1#1##2##3\war%
+ {\csname\if##2@iffalse\else iftrue\fi\endcsname}%
+ \expanded{\c!ifinstringelse#2#1@@\noexpand\war}} % expand #2 here
+
+\long\def\doifinstringelse#1#2#3#4%
+ {\edef\@@instring{#1}% expand #1 here
+ \@EA\v!ifinstringelse\@EA{\@@instring}{#2}%
+ #3%
+ \else
+ #4%
+ \fi}
+
+%D The next alternative proved to be upto twice as fast on
+%D tasks like checking reserved words in pretty verbatim
+%D typesetting! This is mainly due to the fact that passing
+%D (expanded) strings is much slower that passing a macro.
+%D
+%D \starttypen
+%D \doifincsnameelse {substring} {\string} {then ...} {else ...}
+%D \stoptypen
+%D
+%D Where \type{\doifinstringelse} does as much expansion as
+%D possible, the latter alternative does minimal (one level)
+%D expansion.
+
+\def\v!ifincsnameelse#1#2%
+ {\def\c!ifincsnameelse##1#1##2##3\war%
+ {\csname\if##2@iffalse\else iftrue\fi\endcsname}%
+ \@EA\c!ifincsnameelse#2#1@@\war}
+
+\long\def\doifincsnameelse#1#2#3#4%
+ {\edef\@@instring{#1}%
+ \@EA\v!ifincsnameelse\@EA{\@@instring}{#2}%
+ #3%
+ \else
+ #4%
+ \fi}
+
+%D \macros
+%D {doifnumberelse}
+%D
+%D The next macro executes a command depending of the outcome
+%D of a test on numerals. This is probably one of the fastest
+%D test possible, exept from a less robust 10||step
+%D \type{\if}||ladder or some tricky \type{\lcode} checking.
+%D
+%D \starttypen
+%D \doifnumberelse {string} {then ...} {else ...}
+%D \stoptypen
+%D
+%D The macro accepts \type{123}, \type{abc}, \type{{}},
+%D \type{\getal} and \type{\the\count...}.
+
+\long\def\doifnumberelse#1#2#3%
+ {\getfirstcharacter{#1}%
+ \@EA\v!ifinstringelse\@EA{\firstcharacter}{1234567890}%
+ #2%
+ \else
+ #3%
+ \fi}
+
+%D Before we had \type{\v!ifinstringelse} available, we used:
+%D
+%D \starttypen
+%D \def\doifnumberelse#1%
+%D {\getfirstcharacter{#1}%
+%D \rawdoifinsetelse{\firstcharacter}{1,2,3,4,5,6,7,8,9,0}}
+%D \stoptypen
+
+%D A faster but less fail safe alternative is:
+%D
+%D \starttypen
+%D \dostepwiserecurse{0}{9}{1}
+%D {\@EA\uccode\@EA`\recurselevel=1}
+%D
+%D \long\def\doifnumberelse#1#2#3%
+%D {\getfirstcharacter{#1}%
+%D \@EA\ifnum\@EA\uccode\@EA`\firstcharacter=1
+%D #2%
+%D \else
+%D #3%
+%D \fi}
+%D \stoptypen
+%D
+%D This one only works when the \type{\firstcharacter} is
+%D indeed a character. Numbers and strings of characters go
+%D all right, but arguments like \type{\relax} let things
+%D go wrong.
+
+%D \macros
+%D {makerawcommalist,
+%D rawdoinsetelse,
+%D rawprocesscommalist,
+%D rawprocessaction}
+%D
+%D Some of the commands mentioned earlier are effective but
+%D slow. When one is desperately in need of faster alternatives
+%D and when the conditions are predictable safe, the \type{\raw}
+%D alternatives come into focus. A major drawback is that
+%D they do not take \type{\c!constants} into account, simply
+%D because no expansion is done. This is no problem with
+%D \type{\rawprocesscommalist}, because this macro does not
+%D compare anything. Expandable macros are permitted as search
+%D string.
+%D
+%D \starttypen
+%D \makerawcommalist[string,string,...]\stringlist
+%D \rawdoifinsetelse{string}{string,...}{...}{...}
+%D \rawprocesscommalist[string,string,...]\commando
+%D \rawprocessaction[x][a=>\a,b=>\b,c=>\c]
+%D \stoptypen
+%D
+%D Spaces embedded in the list, for instance after commas,
+%D spoil the search process. The gain in speed depends on the
+%D length of the argument (the longer the argument, the less
+%D we gain).
+%D
+%D The slow alternative looks like:
+%D
+%D \starttypen
+%D \def\makerawcommalist[#1]#2%
+%D {\def\appendtocommalist##1%
+%D {\doifelse{#2}{}
+%D {\edef#2{##1}}
+%D {\edef#2{#2,##1}}}%
+%D \def#2{}%
+%D \processcommalist[#1]\appendtocommalist}
+%D \stoptypen
+%D
+%D But we prefer:
+
+\def\makerawcommalist[#1]#2%
+ {\def\appendtocommalist##1%
+ {\edef#2{##1}\def\appendtocommalist####1{\edef#2{#2,####1}}}%
+ \let#2\empty
+ \processcommalist[#1]\appendtocommalist}
+
+\def\rawprocesscommaitem#1,%
+ {\if]#1\else
+ \csname\s!next\the\commalevel\endcsname{#1}%
+ \expandafter\rawprocesscommaitem
+ \fi}
+
+\def\rawprocesscommalist[#1]#2%
+ {\advance\commalevel by 1\relax
+ \expandafter\let\csname\s!next\the\commalevel\endcsname#2%
+ \expandafter\rawprocesscommaitem#1,],% \relax
+ \advance\commalevel by -1\relax}
+
+\def\rawdoifinsetelse#1#2%
+ {\doifinstringelse{,#1,}{,#2,}}
+
+\def\v!rawprocessaction[#1][#2]%
+ {\def\c!rawprocessaction##1,#1=>##2,##3\war%
+ {\if##3@\else
+ \def\v!processaction{##2}%
+ \fi}%
+ \c!rawprocessaction,#2,#1=>,@\war}
+
+\def\rawprocessaction[#1]#2[#3]%
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{undefined}%
+ \let\v!processaction=\!!stringb
+ \ifx\!!stringa\empty
+ \@EA\v!rawprocessaction\@EA[\s!default][#3]%
+ \else
+ \expandafter\v!rawprocessaction\expandafter[\!!stringa][#3]%
+ \ifx\v!processaction\!!stringb
+ \@EA\v!rawprocessaction\@EA[\s!unknown][#3]%
+ \fi
+ \fi
+ \ifx\v!processaction\!!stringb
+ \else
+ \v!processaction
+ \fi}
+
+%D When we process the list \type{a,b,c,d,e}, the raw routine
+%D takes over 30\% less time, when we feed $20+$ character
+%D strings we gain about 20\%. Alternatives which use
+%D \type{\futurelet} perform worse. Part of the speedup is
+%D due to the \type{\let} and \type{\expandafter} in the test.
+
+%D \macros
+%D {processunexpandedcommalist}
+%D
+%D When processing commalists, the arguments are expanded. The
+%D main reason for doing so lays in the fact that these
+%D macros are used for interfacing. The next alternative can be used
+%D for
+%D
+%D \starttypen
+%D \processunexpandedcommalist
+%D [\alfa\beta,\gamma,\delta\epsilon]
+%D \handleitem
+%D \stoptypen
+%D
+%D This time nesting is not supported.
+
+\def\processunexpandedcommaitem#1,%
+ {\if]\noexpand#1%
+ \let\nextcommaitem\relax
+ \else
+ \handleunexpandedcommaitem{#1}%
+ \let\nextcommaitem\processunexpandedcommaitem
+ \fi
+ \nextcommaitem}
+
+\def\processunexpandedcommalist[#1]#2%
+ {\def\handleunexpandedcommaitem{#2}%
+ \processunexpandedcommaitem#1,],}% \relax}
+
+%D Or faster:
+
+\def\processunexpandedcommaitem#1,%
+ {\if]\noexpand#1\else
+ \handleunexpandedcommaitem{#1}%
+ \expandafter\processunexpandedcommaitem
+ \fi}
+
+%D \macros
+%D {dosetvalue,dosetevalue,docopyvalue,doresetvalue,
+%D dogetvalue}
+%D
+%D When we are going to do assignments, we have to take
+%D multi||linguality into account. For the moment we keep
+%D things simple and single||lingual.
+%D
+%D \starttypen
+%D \dosetvalue {label} {variable} {value}
+%D \dosetevalue {label} {variable} {value}
+%D \docopyvalue {to label} {from label} {variable}
+%D \doresetvalue {label} {variable}
+%D \stoptypen
+%D
+%D These macros are in fact auxiliary ones and are not meant
+%D for use outside the assignment macros.
+
+\def\dosetvalue#1#2% #3
+ {\@EA\def\csname#1#2\endcsname} % {#3}}
+
+\def\dosetevalue#1#2% #3
+ {\@EA\edef\csname#1#2\endcsname} % {#3}}
+
+\def\doresetvalue#1#2%
+ {\@EA\def\csname#1#2\endcsname{}}
+
+\def\docopyvalue#1#2#3%
+ {\@EA\def\csname#1#3\endcsname{\csname#2#3\endcsname}}
+
+%D \macros
+%D {doassign,undoassign,doassignempty}
+%D
+%D Assignments are the backbone of \CONTEXT. Abhorred by the
+%D concept of style file hacking, we took a considerable effort
+%D in building a parameterized system. Unfortunately there is a
+%D price to pay in terms of speed. Compared to other packages
+%D and taking the functionality of \CONTEXT\ into account, the
+%D total size of the format file is still very acceptable. Now
+%D how are these assignments done.
+%D
+%D Assignments can be realized with:
+%D
+%D \starttypen
+%D \doassign[label][variable=value]
+%D \undoassign[label][variable=value]
+%D \stoptypen
+%D
+%D and:
+%D
+%D \starttypen
+%D \doassignempty[label][variable=value]
+%D \stoptypen
+%D
+%D Assignments like \type{\doassign} are compatible with:
+%D
+%D \starttypen
+%D \def\labelvariable{value}
+%D \stoptypen
+%D
+%D We do check for the presence of an \type{=} and loudly
+%D complain of it's missed. We will redefine this macro later
+%D on, when a more advanced message mechanism is implemented.
+
+%\def\p!doassign#1[#2][#3=#4=#5]%
+% {\let\donottest\dontprocesstest
+% \edef\!!stringa{#5}%
+% \let\!!stringb\relax
+% \let\donottest\doprocesstest
+% \ifx\!!stringa\!!stringb
+% \writestatus
+% {setup}
+% {missing '=' after '#3' in line \the\inputlineno}%
+% \else
+% #1{#2}{#3}{#4}%
+% \fi}
+
+\def\p!doassign#1[#2][#3=#4=#5]% redefined in mult-ini
+ {\ifx\empty#3\else % and definitely not \ifx#3\empty
+ \ifx\relax#5%
+ \writestatus
+ {setup}
+ {missing '=' after '#3' in line \the\inputlineno}%
+ \else
+ #1{#2}{#3}{#4}%
+ \fi
+ \fi}
+
+\def\doassign[#1][#2]%
+ {\p!doassign\dosetvalue[#1][#2==\relax]}
+
+\def\doeassign[#1][#2]%
+ {\p!doassign\dosetevalue[#1][#2==\relax]}
+
+\def\undoassign[#1][#2]%
+ {\p!doassign\doresetvalue[#1][#2==\relax]}
+
+\def\doassignempty[#1][#2=#3]%
+ {\doifundefined{#1#2}
+ {\dosetvalue{#1}{#2}{#3}}}
+
+%D \macros
+%D {getparameters,geteparameters,forgetparameters}
+%D
+%D Using the assignment commands directly is not our
+%D ideal of user friendly interfacing, so we take some further
+%D steps.
+%D
+%D \starttypen
+%D \getparameters [label] [...=...,...=...]
+%D \forgetparameters [label] [...=...,...=...]
+%D \stoptypen
+%D
+%D Again, the label identifies the category a variable
+%D belongs to. The second argument can be a comma separated
+%D list of assignments.
+%D
+%D \starttypen
+%D \getparameters
+%D [demo]
+%D [alfa=1,
+%D beta=2]
+%D \stoptypen
+%D
+%D is equivalent to
+%D
+%D \starttypen
+%D \def\demoalfa{1}
+%D \def\demobeta{2}
+%D \stoptypen
+%D
+%D
+%D In the pre||multi||lingual stadium \CONTEXT\ took the next
+%D approach. With
+%D
+%D \starttypen
+%D \def\??demo {@@demo}
+%D \def\!!alfa {alfa}
+%D \def\!!beta {beta}
+%D \stoptypen
+%D
+%D calling
+%D
+%D \starttypen
+%D \getparameters
+%D [\??demo]
+%D [\!!alfa=1,
+%D \!!beta=2]
+%D \stoptypen
+%D
+%D lead to:
+%D
+%D \starttypen
+%D \def\@@demoalfa{1}
+%D \def\@@demobeta{2}
+%D \stoptypen
+%D
+%D Because we want to be able to distinguish the \type{!!}
+%D pre||tagged user supplied variables from internal
+%D counterparts, we will introduce a slightly different tag in
+%D the multi||lingual modules. There we will use \type{c!} or
+%D \type{v!}, depending on the context.
+%D
+%D By calling \type{\p!doassign} directly, we save ourselves
+%D some argument passing and gain some speed. Whatever
+%D optimizations we do, this command will always be one of the
+%D bigger bottlenecks.
+%D
+%D The alternative \type{\geteparameters} --- it's funny to
+%D see that this alternative saw the light so lately --- can be
+%D used to do expanded assigments.
+
+\def\dogetparameters#1[#2]#3[#4]%
+ {\def\p!dogetparameter##1%
+ {\p!doassign#1[#2][##1==\relax]}%
+ \processcommalist[#4]\p!dogetparameter}
+
+\def\getparameters%
+ {\dogetparameters\dosetvalue}
+
+\def\geteparameters%
+ {\dogetparameters\dosetevalue}
+
+\def\forgetparameters%
+ {\dogetparameters\doresetvalue}
+
+\let\getexpandedparameters=\geteparameters
+
+%D \macros
+%D {getemptyparameters}
+%D
+%D Sometimes we explicitly want variables to default to an
+%D empty string, so we welcome:
+%D
+%D \starttypen
+%D \getemptyparameters [label] [...=...,...=...]
+%D \stoptypen
+
+\def\getemptyparameters[#1]#2[#3]%
+ {\def\p!dogetemptyparameter##1%
+ {\doassignempty[#1][##1]}%
+ \processcommalist[#3]\p!dogetemptyparameter}
+
+%D \macros
+%D {copyparameters}
+%D
+%D Some \CONTEXT\ commands take their default setups from
+%D others. All commands that are able to provide backgounds
+%D or rules around some content, for instance default to the
+%D standard command for ruled boxes. Is situations like this
+%D we can use:
+%D
+%D \starttypen
+%D \copyparameters [to-label] [from-label] [name1,name2,...]
+%D \stoptypen
+%D
+%D For instance
+%D
+%D \starttypen
+%D \copyparameters
+%D [internal][external]
+%D [alfa,beta]
+%D \stoptypen
+%D
+%D Leads to:
+%D
+%D \starttypen
+%D \def\internalalfa {\externalalfa}
+%D \def\internalbeta {\externalbeta}
+%D \stoptypen
+%D
+%D By using \type{\docopyvalue} we've prepared this command
+%D for use in a multi||lingual environment.
+
+\def\copyparameters[#1]#2[#3]#4[#5]%
+ {\doifnot{#1}{#3}
+ {\def\docopyparameter##1%
+ {\docopyvalue{#1}{#3}{##1}}%
+ \processcommalist[#5]\docopyparameter}}
+
+%D \macros
+%D {doifassignmentelse}
+%D
+%D A lot of \CONTEXT\ commands take optional arguments, for
+%D instance:
+%D
+%D \starttypen
+%D \dothisorthat[alfa,beta]
+%D \dothisorthat[first=foo,second=bar]
+%D \dothisorthat[alfa,beta][first=foo,second=bar]
+%D \stoptypen
+%D
+%D Although a combined solution is possible, we prefer a
+%D seperation. The next command takes care of propper
+%D handling of such multi||faced commands.
+%D
+%D \starttypen
+%D \doifassignmentelse {...} {then ...} {else ...}
+%D \stoptypen
+
+\def\doifassignmentelse%
+ {\doifinstringelse{=}}
+
+%D \macros
+%D {ifparameters,checkparameters}
+%D
+%D A slightly different one is \type{\checkparameters}, which
+%D also checks on the presence of a~\type{=}.
+%D
+%D The boolean \type{\ifparameters} can be used afterwards.
+%D Combining both in one \type{\if}||macro would lead to
+%D problems with nested \type{\if}'s.
+%D
+%D \starttypen
+%D \checkparameters[argument]
+%D \stoptypen
+
+\newif\ifparameters
+
+\def\c!checkparameters#1=#2#3\war%
+ {\if#2@\parametersfalse\else\parameterstrue\fi}
+
+\def\checkparameters[#1]%
+ {\c!checkparameters#1=@@\war}
+
+%D \macros
+%D {getfromcommalist,getfromcommacommand,
+%D commalistelement,
+%D getcommalistsize,getcommacommandsize}
+%D
+%D It's possible to get an element from a commalist or a
+%D command representing a commalist.
+%D
+%D \starttypen
+%D \getfromcommalist [string] [n]
+%D \getfromcommacommand [string,\strings,string,...] [n]
+%D \stoptypen
+%D
+%D The difference betwee the two of them is the same as the
+%D difference between \type{\processcomma...}. The found string
+%D is stored in \type{\commalistelement}.
+%D
+%D We can calculate the size of a comma separated list by
+%D using:
+%D
+%D \starttypen
+%D \getcommalistsize [string,string,...]
+%D \getcommacommandsize [string,\strings,string,...]
+%D \stoptypen
+%D
+%D Afterwards, the length is available in the macro
+%D \type{\commalistsize} (not a \COUNTER).
+
+\def\commalistsize{0}
+
+\def\p!dogetcommalistsize#1[#2]%
+ {\scratchcounter=0
+ \def\p!dodogetcommalistsize##1%
+ {\advance\scratchcounter by 1 }%
+ #1[#2]\p!dodogetcommalistsize % was [{#2}]
+ \edef\commalistsize{\the\scratchcounter}}
+
+\def\getcommalistsize%
+ {\p!dogetcommalistsize\processcommalist}
+
+\def\getcommacommandsize%
+ {\p!dogetcommalistsize\processcommacommand}
+
+\def\p!dodogetfromcommalist#1%
+ {\advance\scratchcounter by -1
+ \ifnum\scratchcounter=0\relax
+ \gdef\globalcommalistelement{#1}%
+ \def\doprocesscommaitem##1]{}%
+ \fi}
+
+\def\p!dogetfromcommalist#1[#2]#3[#4]%
+ {\global\let\globalcommalistelement\empty
+ \bgroup
+ \scratchcounter=#4\relax
+ #1[#2]\p!dodogetfromcommalist
+ \egroup
+ \let\commalistelement\globalcommalistelement}
+
+\def\getfromcommalist%
+ {\p!dogetfromcommalist\processcommalist}
+
+\def\getfromcommacommand%
+ {\p!dogetfromcommalist\processcommacommand}
+
+%D Watertight (and efficient) solutions are hard to find, due
+%D to the handling of braces during parameters passing and
+%D scanning. Nevertheless:
+%D
+%D \startbuffer
+%D \def\dosomething#1{(#1=\commalistsize) }
+%D
+%D \getcommalistsize [\hbox{$a,b,c,d,e,f$}] \dosomething 1
+%D \getcommalistsize [{a,b,c,d,e,f}] \dosomething 1
+%D \getcommalistsize [{a,b,c},d,e,f] \dosomething 4
+%D \getcommalistsize [a,b,{c,d,e},f] \dosomething 4
+%D \getcommalistsize [a{b,c},d,e,f] \dosomething 4
+%D \getcommalistsize [{a,b}c,d,e,f] \dosomething 4
+%D \getcommalistsize [] \dosomething 0
+%D \getcommalistsize [{[}] \dosomething 1
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D reports:
+%D
+%D \haalbuffer
+
+%D \macros
+%D {dosingleargument,dodoubleargument,dotripleargument,
+%D doquadrupleargument,doquintupleargument,dosixtupleargument}
+%D
+%D When working with delimited arguments, spaces and
+%D lineendings can interfere. The next set of macros uses
+%D \TEX' internal scanner for grabbing everything between
+%D arguments.
+%D
+%D \starttypen
+%D \dosingleargument\commando = \commando[#1]
+%D \dodoubleargument\commando = \commando[#1][#2]
+%D \dotripleargument\commando = \commando[#1][#2][#3]
+%D \doquadrupleargument\commando = \commando[#1][#2][#3][#4]
+%D \doquintupleargument\commando = \commando[#1][#2][#3][#4][#5]
+%D \dosixtupleargument\commando = \commando[#1][#2][#3][#4][#5][#6]
+%D \stoptypen
+%D
+%D These macros are used in the following way:
+%D
+%D \starttypen
+%D \def\dosetupsomething[#1][#2]%
+%D {... #1 ... #2 ...}
+%D
+%D \def\setupsomething%
+%D {\dodoubleargument\dosetupsomething}
+%D \stoptypen
+%D
+%D The implementation can be surprisingly simple and needs no
+%D further explanation, like:
+%D
+%D \starttypen
+%D \def\dosingleargument#1[#2]%
+%D {#1[#2]}
+%D \def\dotripleargument#1[#2]#3[#4]#5[#6]%
+%D {#1[#2][#4][#6]}
+%D \def\doquintupleargument#1%
+%D {\def\dodoquintupleargument[##1]##2[##3]##4[##5]##6[##7]##8[##9]%
+%D {#1[##1][##3][##5][##7][##9]}%
+%D \dodoquintupleargument}
+%D \stoptypen
+%D
+%D Because \TEX\ accepts 9~arguments at most, we have to use
+%D two||step solution when getting five or more arguments.
+%D
+%D When developing more and more of the real \CONTEXT, we
+%D started using some alternatives that provided empty
+%D arguments (in fact optional ones) whenever the user failed
+%D to supply them. Because this more complicated macros enable
+%D us to do some checking, we reimplemented the non||empty
+%D ones.
+
+\def\dosingleargument%
+ {\chardef\expectedarguments=1
+ \dosingleempty}
+
+\def\dodoubleargument%
+ {\chardef\expectedarguments=2
+ \dodoubleempty}
+
+\def\dotripleargument%
+ {\chardef\expectedarguments=3
+ \dotripleempty}
+
+\def\doquadrupleargument%
+ {\chardef\expectedarguments=4
+ \doquadrupleempty}
+
+\def\doquintupleargument%
+ {\chardef\expectedarguments=5
+ \doquintupleempty}
+
+\def\doquintupleargument%
+ {\chardef\expectedarguments=6
+ \dosixtupleempty}
+
+%D \macros
+%D {iffirstagument,ifsecondargument,ifthirdargument,
+%D iffourthargument,iffifthargument,ifsixthargument}
+%D
+%D We use some signals for telling the calling macros if all
+%D wanted arguments are indeed supplied by the user.
+
+\newif\iffirstargument
+\newif\ifsecondargument
+\newif\ifthirdargument
+\newif\iffourthargument
+\newif\iffifthargument
+\newif\ifsixthargument
+
+%D \macros
+%D {dosingleempty,dodoubleempty,dotripleempty,
+%D doquadrupleempty,doquintupleempty}
+%D
+%D The empty argument supplying macros mentioned before, look
+%D like:
+%D
+%D \starttypen
+%D \dosingleempty \command
+%D \dodoubleempty \command
+%D \dotripleempty \command
+%D \doquadrupleempty \command
+%D \doquintupleempty \command
+%D \dosixtupleempty \command
+%D \stoptypen
+%D
+%D So \type{\dodoubleempty} leades to:
+%D
+%D \starttypen
+%D \command[#1][#2]
+%D \command[#1][]
+%D \command[][]
+%D \stoptypen
+%D
+%D Depending of the generousity of the user. Afterwards one can
+%D use the \type{\if...argument} boolean. For novice: watch
+%D the stepwise doubling of \type{#}'s
+
+\chardef\noexpectedarguments=0
+\chardef\expectedarguments =0
+
+\def\dogetargument#1#2#3#4% redefined in mult-ini
+ {\doifnextcharelse{#1}
+ {\let\expectedarguments\noexpectedarguments
+ #3\dodogetargument}
+ {\ifnum\expectedarguments>\noexpectedarguments
+ \writestatus
+ {setup}
+ {\expectedarguments\space argument(s) expected
+ in line \the\inputlineno\space}%
+ \fi
+ \let\expectedarguments\noexpectedarguments
+ #4\dodogetargument#1#2}}
+
+\def\getsingleempty#1#2#3%
+ {\def\dodogetargument%
+ {#3}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getdoubleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument%
+ {#3#1##1#2}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\gettripleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument%
+ {#3#1##1#2#1####1#2}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getquadrupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument%
+ {#3#1##1#2#1####1#2#1########1#2}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getquintupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument#1################1#2%
+ {\def\dodogetargument%
+ {#3#1##1#2#1####1#2#1########1#2#1################1#2}%
+ \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\getsixtupleempty#1#2#3%
+ {\def\dodogetargument#1##1#2%
+ {\def\dodogetargument#1####1#2%
+ {\def\dodogetargument#1########1#2%
+ {\def\dodogetargument#1################1#2%
+ {\def\dodogetargument#1################################1#2%
+ {\def\dodogetargument%
+ {#3#1##1#2#1####1#2#1########1#2#1################1%
+ #2#1################################1#2}%
+ \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}%
+ \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+ \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+ \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+ \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+ \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+\def\dosingleempty {\getsingleempty []}
+\def\dodoubleempty {\getdoubleempty []}
+\def\dotripleempty {\gettripleempty []}
+\def\doquadrupleempty {\getquadrupleempty []}
+\def\doquintupleempty {\getquintupleempty []}
+\def\dosixtupleempty {\getsixtupleempty []}
+
+%D \macros
+%D {dosingleargumentwithset,
+%D dodoubleargumentwithset,dodoubleemptywithset,
+%D dotripleargumentwithset,dotripleemptywithset}
+%D
+%D These maybe too mysterious macros enable us to handle more
+%D than one setup at once.
+%D
+%D \starttypen
+%D \dosingleargumentwithset \command[#1]
+%D \dodoubleargumentwithset \command[#1][#2]
+%D \dotripleargumentwithset \command[#1][#2][#3]
+%D \dodoubleemptywithset \command[#1][#2]
+%D \dotripleemptywithset \command[#1][#2][#3]
+%D \stoptypen
+%D
+%D The first macro calls \type{\command[##1]} for each string
+%D in the set~\type{#1}. The second one calls for
+%D \type{\commando[##1][#2]} and the third, well one may guess.
+%D These commands support constructions like:
+%D
+%D \starttypen
+%D \def\dodefinesomething[#1][#2]%
+%D {\getparameters[\??xx#1][#2]}
+%D
+%D \def\definesomething%
+%D {\dodoubleargumentwithset\dodefinesomething}
+%D \stoptypen
+%D
+%D Which accepts calls like:
+%D
+%D \starttypen
+%D \definesomething[alfa,beta,...][variable=...,...]
+%D \stoptypen
+%D
+%D Now a whole bunch of variables like \type{\@@xxalfavariable}
+%D and \type{\@@xxbetavariable} is defined.
+
+\def\dosingleargumentwithset#1%
+ {\def\dodosinglewithset[##1]%
+ {\def\dododosinglewithset####1%
+ {#1[####1]}%
+ \processcommalist[##1]\dododosinglewithset}%
+ \dosingleargument\dodosinglewithset}%
+
+\def\dodoublewithset#1#2%
+ {\def\dododoublewithset[##1][##2]%
+ {\doifnot{##1}{}
+ {\def\dodododoublewithset####1%
+ {#2[####1][##2]}%
+ \processcommalist[##1]\dodododoublewithset}}%
+ #1\dododoublewithset}%
+
+\def\dodoubleemptywithset%
+ {\dodoublewithset\dodoubleempty}
+
+\def\dodoubleargumentwithset%
+ {\dodoublewithset\dodoubleargument}
+
+\def\dotriplewithset#1#2%
+ {\def\dodotriplewithset[##1][##2][##3]%
+ {\doifnot{##1}{}
+ {\def\dododotriplewithset####1%
+ {#2[####1][##2][##3]}%
+ \processcommalist[##1]\dododotriplewithset}}%
+ #1\dodotriplewithset}%
+
+\def\dotripleemptywithset%
+ {\dotriplewithset\dotripleempty}
+
+\def\dotripleargumentwithset%
+ {\dotriplewithset\dotripleargument}
+
+%D \macros
+%D {complexorsimple,complexorsimpleempty}
+%D
+%D Setups can be optional. A command expecting a setup is
+%D prefixed by \type{\complex}, a command without one gets the
+%D prefix \type{\simple}. Commands like this can be defined by:
+%D
+%D \starttypen
+%D \complexorsimple {command}
+%D \stoptypen
+%D
+%D When \type{\command} is followed by a \type{[setup]}, then
+%D
+%D \starttypen
+%D \complexcommand [setup]
+%D \stoptypen
+%D
+%D executes, else we get
+%D
+%D \starttypen
+%D \simplecommand
+%D \stoptypen
+%D
+%D An alternative for \type{\complexorsimple} is:
+%D
+%D \starttypen
+%D \complexorsimpleempty {command}
+%D \stoptypen
+%D
+%D Depending on the presence of \type{[setup]}, this one
+%D leads to one of:
+%D
+%D \starttypen
+%D \complexcommando [setup]
+%D \complexcommando []
+%D \stoptypen
+%D
+%D Many \CONTEXT\ commands started as complex or simple ones,
+%D but changed into more versatile (more object oriented) ones
+%D using the \type{\get..argument} commands.
+
+\def\complexorsimple#1%
+ {\doifnextcharelse{[}
+ {\firstargumenttrue\getvalue{\s!complex#1}}
+ {\firstargumentfalse\getvalue{\s!simple#1}}}
+
+\def\complexorsimpleempty#1%
+ {\doifnextcharelse{[}
+ {\firstargumenttrue\getvalue{\s!complex#1}}
+ {\firstargumentfalse\getvalue{\s!complex#1}[]}}
+
+%D \macros
+%D {definecomplexorsimple,definecomplexorsimpleempty}
+%D
+%D The previous commands are used that often that we found it
+%D worthwile to offer two more alternatives.
+
+\def\setnameofcommand#1%
+ {\bgroup
+ \escapechar=-1\relax
+ \xdef\nameofcommand{\string#1}%
+ \egroup}
+
+\def\definewithnameofcommand#1#2% watch the \donottest
+ {\setnameofcommand{#2}%
+ \@EA\def\@EA#2\@EA{\@EA\donottest\@EA#1\@EA{\nameofcommand}}}
+
+\def\definecomplexorsimple%
+ {\definewithnameofcommand\complexorsimple}
+
+\def\definecomplexorsimpleempty%
+ {\definewithnameofcommand\complexorsimpleempty}
+
+%D These commands are called as:
+%D
+%D \starttypen
+%D \definecomplexorsimple\command
+%D \stoptypen
+%D
+%D Of course, we must have available
+%D
+%D \starttypen
+%D \def\complexcommand[#1]{...}
+%D \def\simplecommand {...}
+%D \stoptypen
+%D
+%D Using this construction saves a few string now and then.
+
+%D \macros
+%D {definestartstopcommand}
+%D
+%D Those who get the creeps of expansion may skip the next
+%D one. It's one of the most recent additions and concerns
+%D \type{\start}||\type{\stop} pairs with complicated
+%D arguments.
+%D
+%D We won't go into details here, but the general form of
+%D this using this command is:
+%D
+%D \starttypen
+%D \definestartstopcommand\somecommand\v!specifier{arg}{arg}%
+%D {do something with arg}
+%D \stoptypen
+%D
+%D This expands to something like:
+%D
+%D \starttypen
+%D \def\somecommand arg \startspecifier arg \stopspecifier%
+%D {do something with arg}
+%D \stoptypen
+%D
+%D The argumentss can be anything reasonable, but double
+%D \type{#}'s are needed in the specification part, like:
+%D
+%D \starttypen
+%D \definestartstopcommand\somecommand\v!specifier{[##1][##2]}{##3}%
+%D {do #1 something #2 with #3 arg}
+%D \stoptypen
+%D
+%D which becomes:
+%D
+%D \starttypen
+%D \def\somecommand[#1][#2]\startspecifier#3\stopspecifier%
+%D {do #1 something #2 with #3 arg}
+%D \stoptypen
+%D
+%D We will see some real applications of this command in the
+%D core modules.
+
+\def\definestartstopcommand#1#2#3#4%
+ {\def\!stringa{#3}%
+ \def\!stringb{\e!start#2}%
+ \def\!stringc{#4}%
+ \def\!stringd{\e!stop#2}%
+ \@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA
+ \def\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA\@EA
+ #1\@EA\@EA\@EA\@EA\@EA\@EA\@EA
+ \!stringa\@EA\@EA\@EA
+ \csname\@EA\@EA\@EA\!stringb\@EA\@EA\@EA\endcsname\@EA
+ \!stringc
+ \csname\!stringd\endcsname}
+
+%D \macros
+%D {dosinglegroupempty,dodoublegroupempty,dotriplegroupempty,
+%D doquadruplegroupempty}
+%D
+%D We've already seen some commands that take care of
+%D optional arguments between \type{[]}. The next two commands
+%D handle the ones with \type{{}}. They are called as:
+%D
+%D \starttypen
+%D \dosinglegroupempty \IneedONEargument
+%D \dodoublegroupempty \IneedTWOarguments
+%D \dotriplegroupempty \IneedTHREEarguments
+%D \dotriplegroupempty \IneedFOURarguments
+%D \stoptypen
+%D
+%D where \type{\IneedONEargument} takes one and the others
+%D two and three arguments. These macro's were first needed in
+%D \PPCHTEX.
+
+\def\dogetgroupargument#1#2% redefined in mult-ini
+ {\def\nextnextargument%
+ {\ifx\nextargument\bgroup
+ \let\expectedarguments\noexpectedarguments
+ \def\nextargument{#1\dodogetargument}%
+ %\else\ifx\nextargument\lineending % this can be an option
+ % \def\nextargument{\bgroup\def\\ {\egroup\dogetgroupargument#1#2}\\}%
+ %\else\ifx\nextargument\blankspace % but it may never be default
+ % \def\nextargument{\bgroup\def\\ {\egroup\dogetgroupargument#1#2}\\}%
+ \else
+ \ifnum\expectedarguments>\noexpectedarguments
+ \writestatus
+ {setup}
+ {\the\expectedarguments\space argument(s) expected
+ in line \the\inputlineno\space}%
+ \fi
+ \let\expectedarguments\noexpectedarguments
+ \def\nextargument{#2\dodogetargument{}}%
+ \fi%\fi\fi % so let's get rid of it
+ \nextargument}%
+ \futurelet\nextargument\nextnextargument}
+
+\def\dosinglegroupempty#1%
+ {\def\dodogetargument%
+ {#1}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\dodoublegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument%
+ {#1{##1}}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\dotriplegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument####1%
+ {\def\dodogetargument%
+ {#1{##1}{####1}}%
+ \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+\def\doquadruplegroupempty#1%
+ {\def\dodogetargument##1%
+ {\def\dodogetargument####1%
+ {\def\dodogetargument########1%
+ {\def\dodogetargument%
+ {#1{##1}{####1}{########1}}%
+ \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}%
+ \dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
+ \dogetgroupargument\secondargumenttrue\secondargumentfalse}%
+ \dogetgroupargument\firstargumenttrue\firstargumentfalse}
+
+%D These macros explictly take care of spaces, which means
+%D that the next definition and calls are valid:
+%D
+%D \starttypen
+%D \def\test#1#2#3{[#1#2#3]}
+%D
+%D \dotriplegroupempty\test {a}{b}{c}
+%D \dotriplegroupempty\test {a}{b}
+%D \dotriplegroupempty\test {a}
+%D \dotriplegroupempty\test
+%D \dotriplegroupempty\test {a} {b} {c}
+%D \dotriplegroupempty\test {a} {b}
+%D \dotriplegroupempty\test
+%D {a}
+%D {b}
+%D \stoptypen
+%D
+%D And alike.
+
+%D \macros
+%D {wait}
+%D
+%D The next macro hardly needs explanation. Because no
+%D nesting is to be expected, we can reuse \type{\wait} within
+%D \type{\wait} itself.
+
+\def\wait%
+ {\bgroup
+ \read16 to \wait
+ \egroup}
+
+%D \macros
+%D {writestring,writeline,
+%D writestatus,statuswidth}
+%D
+%D Maybe one didn't notice, but we've already introduced a
+%D macro for showing messages. In the multi||lingual modules,
+%D we will also introduce a mechanism for message passing. For
+%D the moment we stick to the core macros:
+%D
+%D \starttypen
+%D \writestring {string}
+%D \writeline
+%D \writestatus {category} {message}
+%D \stoptypen
+%D
+%D Messages are formatted. One can provide the maximum with
+%D of the identification string with the macro
+%D \type{\statuswidth}.
+
+% \chardef\statuswidth=15
+%
+% \def\writestring%
+% {\immediate\write16}
+%
+% \def\writeline%
+% {\writestring{}}
+%
+% \def\dosplitstatus#1#2\end%
+% {\ifx#1?%
+% \loop
+% \advance\scratchcounter by 1
+% \ifnum\scratchcounter<\statuswidth
+% \edef\messagecontentA{\messagecontentA\space}%
+% \repeat
+% \else
+% \advance\scratchcounter by 1
+% \ifnum\scratchcounter<\statuswidth
+% \edef\messagecontentA{\messagecontentA#1}%
+% \fi
+% \dosplitstatus#2\end
+% \fi}
+%
+% \def\writestatus#1#2%
+% {\bgroup
+% \let\messagecontentA=\empty
+% \edef\messagecontentB{#2}% maybe it's \the\scratchcounter
+% \scratchcounter=0
+% \expandafter\dosplitstatus#1?\end
+% \writestring{\messagecontentA\space:\space\messagecontentB}%
+% \egroup}
+
+\chardef\statuswidth=15
+
+\def\writestring%
+ {\immediate\write16}
+
+\def\writeline%
+ {\writestring{}}
+
+\def\dosplitstatus#1%
+ {\advance\scratchcounter by 1
+ \ifnum\scratchcounter<\statuswidth
+ \edef\messagecontentA{\messagecontentA#1}%
+ \expandafter\dosplitstatus
+ \else
+ \expandafter\nosplitstatus
+ \fi}
+
+\def\nosplitstatus#1\end%
+ {}
+
+\gdef\writestatus#1#2%
+ {\bgroup
+ \let\messagecontentA=\empty
+ \edef\messagecontentB{#2}% maybe it's \the\scratchcounter
+ \scratchcounter=0
+ \expandafter\dosplitstatus#1%
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\space
+ \space\space\space\space\space\space\end
+ \writestring{\messagecontentA\space:\space\messagecontentB}%
+ \egroup}
+
+%D \macros
+%D {debuggerinfo}
+%D
+%D For debugging purposes we can enhance macros with the
+%D next alternative. Here \type{debuggerinfo} stands for both
+%D a macro accepting two arguments and a boolean (in fact a
+%D few macro's too).
+
+\newif\ifdebuggerinfo
+
+\def\debuggerinfo#1#2%
+ {\ifdebuggerinfo
+ \writestatus{debugger}{#1:: #2}%
+ \fi}
+
+%D Finally we do what from now on will be done at the top of
+%D the files: we tell the user what we are loading.
+
+\writestatus{loading}{Context System Macros / General}
+
+%D Well, the real final command is the one that resets the
+%D unprotected characters \type{@}, \type{?} and \type{!}.
+
+\protect
+
+\endinput
diff --git a/tex/context/base/syst-new.tex b/tex/context/base/syst-new.tex index cd77b5dc6..c5be8c2c1 100644 --- a/tex/context/base/syst-new.tex +++ b/tex/context/base/syst-new.tex @@ -1,156 +1,157 @@ -%D \module -%D [ file=supp-new, -%D version=1997.01.03, -%D title=\CONTEXT\ Support Macros, -%D subtitle=New Ones, -%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. - -\unprotect - -% \def\doifnonzeropositiveelse#1#2#3% -% {\bgroup -% \setbox\scratchbox=\hbox{\scratchcounter=0#1}% -% \ifdim\wd\scratchbox=\!!zeropoint\egroup#2\else\egroup#3\fi} -% -% \def\dodoifnonzeropositiveelse#1#2\end#3#4% -% {\egroup -% \ifx#1\relax#3\else#4\fi} -% -% \def\doifnonzeropositiveelse#1% -% {\bgroup -% \afterassignment\dodoifnonzeropositiveelse\scratchcounter=0#1\relax\empty\end} - -\def\dodoifnonzeropositiveelse#1#2\end#3#4% - {\ifx#1\relax\ifcase\scratchcounter\egroup#4\else\egroup#3\fi\else\egroup#4\fi} - -\def\doifnonzeropositiveelse#1% - {\bgroup\afterassignment\dodoifnonzeropositiveelse\scratchcounter=0#1\relax\empty\end} - -\def\splitskip#1% - {\scratchskip=0pt plus 1pt minus 1pt - \advance\scratchskip by #1 - \expandafter\SPLITSKIP\the\scratchskip} - -{\catcode`\.=\@@other - \catcode`\p=\@@other - \catcode`\l=\@@other - \catcode`\u=\@@other - \catcode`\s=\@@other - \catcode`\m=\@@other - \catcode`\i=\@@other - \catcode`\n=\@@other - \catcode`\t=\@@other - \gdef\SPLITSKIP#1pt plus #2pt minus #3pt% - {\DOSPLITSKIP#1 #2 #3 }} - -\def\DOSPLITSKIP#1 #2 #3 - {\dimen0=#1pt\dimen2=#2pt\dimen4=#3pt - \advance\dimen2 by -1pt% - \advance\dimen4 by -1pt} - -% \def\minimaxskip#1#2% -% {\splitskip#2\relax -% \scratchdimen=#2\relax -% #2=\scratchdimen -% \advance#2 by #1\relax} -% -% \def\maximizeskip% -% {\minimaxskip{-\dimen4}} -% -% \def\maximizeskip% -% {\minimaxskip{\dimen2}} -% -% \def\maximizespacing% -% {\maximizeskip\blankoskipamount -% \maximizeskip\parskip -% \maximizeskip\tussenwit -% \maximizeskip\baselineskip -% \maximizeskip\bigskipamount -% \maximizeskip\medskipamount -% \maximizeskip\smallskipamount} - -\def\DoMod #1by#2to#3% - {\scratchcounter=#1\relax - \divide\scratchcounter by #2\relax - \multiply\scratchcounter by #2\relax - #3=#1\relax - \advance#3 by -\scratchcounter} - -\def\DoDiv #1by#2to#3% - {#3=#1\relax - \divide#3 by #2\relax} - -\def\dounprotected#1\par% - {#1\protect} - -\def\unprotected% - {\unprotect\dounprotected} - -%D \pagina -%D \starttypen -%D \def\obeyhyphens% % after fontswitch -%D {\def\obeyedspace% -%D {\hyphenchar\font=45 -%D \spaceskip.5em\!!plus.25em\!!minus.25em\relax% -%D \def\obeyedspace{ }}} -%D \stoptypen - -%D Standaard kan een spatie (zoals ~) uitrekken. Dit is in -%D overzichten niet altijd de bedoeling, vandaar: - -\def\fixedspace% - {\hskip\fontdimen2\font\relax} - -%\def\ExpandSecondAfter#1#2#3% -% {\!!toksa={#2}% -% \edef\!!stringa{#3}% -% \edef\expanded% -% {\noexpand#1{\the\!!toksa}{\!!stringa}}% -% \expanded} -% -%\def\ExpandThirdAfter#1#2#3#4% -% {\!!toksa={#2}% -% \!!toksb={#3}% -% \edef\!!stringa{#4}% -% \edef\expanded% -% {\noexpand#1{\the\!!toksa}{\the\!!toksb}{\!!stringa}}% -% \expanded} - -%\def\indirect#1#2#3% -% {\@EA#1\@EA#2\@EA{\@EA#3\csname\s!do\string#2\endcsname}% -% \@EA#1\csname\s!do\string#2\endcsname} -% -%\def\doubleemptied#1#2#3% -% {\indirect#1#2\dodoublempty} -% -%\indirect\def\stelietsin\dodoubleempty[#1][#2]% -% {...} -% -%\doubleemptied\def\stelietsin[#1][#2]% -% {...} - -% in mult-set -% -%\def\defaultsetup{def} -% -%\def\selectdefaultsetup#1#2% -% {\writestatus{setup}{choose #1 setupfile}% -% \bgroup -% \endlinechar=-1 -% \global\read16 to \usersetup -% \egroup -% \ifx\usersetup\empty -% \let\usersetup=\defaultsetup -% \fi -% \readfile{#2\usersetup}{}{}% -% \writestatus{setup}{loading #1 setupfile #2\usersetup}} - -\protect - -\endinput +%D \module
+%D [ file=supp-new,
+%D version=1997.01.03,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=New Ones,
+%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.
+
+\unprotect
+
+% \def\doifnonzeropositiveelse#1#2#3%
+% {\bgroup
+% \setbox\scratchbox=\hbox{\scratchcounter=0#1}%
+% \ifdim\wd\scratchbox=\!!zeropoint\egroup#2\else\egroup#3\fi}
+%
+% \def\dodoifnonzeropositiveelse#1#2\end#3#4%
+% {\egroup
+% \ifx#1\relax#3\else#4\fi}
+%
+% \def\doifnonzeropositiveelse#1%
+% {\bgroup
+% \afterassignment\dodoifnonzeropositiveelse\scratchcounter=0#1\relax\empty\end}
+
+\def\dodoifnonzeropositiveelse#1#2\end#3#4%
+ {\ifx#1\relax\ifcase\scratchcounter\egroup#4\else\egroup#3\fi\else\egroup#4\fi}
+
+\def\doifnonzeropositiveelse#1%
+ {\bgroup\afterassignment\dodoifnonzeropositiveelse\scratchcounter=0#1\relax\empty\end}
+
+\def\splitskip#1%
+ {\scratchskip=0pt plus 1pt minus 1pt
+ \advance\scratchskip by #1
+ \expandafter\SPLITSKIP\the\scratchskip}
+
+{\catcode`\.=\@@other
+ \catcode`\p=\@@other
+ \catcode`\l=\@@other
+ \catcode`\u=\@@other
+ \catcode`\s=\@@other
+ \catcode`\m=\@@other
+ \catcode`\i=\@@other
+ \catcode`\n=\@@other
+ \catcode`\t=\@@other
+ \gdef\SPLITSKIP#1pt plus #2pt minus #3pt%
+ {\DOSPLITSKIP#1 #2 #3 }}
+
+\def\DOSPLITSKIP#1 #2 #3
+ {\dimen0=#1pt\dimen2=#2pt\dimen4=#3pt
+ \advance\dimen2 by -1pt%
+ \advance\dimen4 by -1pt}
+
+% \def\minimaxskip#1#2%
+% {\splitskip#2\relax
+% \scratchdimen=#2\relax
+% #2=\scratchdimen
+% \advance#2 by #1\relax}
+%
+% \def\maximizeskip%
+% {\minimaxskip{-\dimen4}}
+%
+% \def\maximizeskip%
+% {\minimaxskip{\dimen2}}
+%
+% \def\maximizespacing%
+% {\maximizeskip\blankoskipamount
+% \maximizeskip\parskip
+% \maximizeskip\tussenwit
+% \maximizeskip\baselineskip
+% \maximizeskip\bigskipamount
+% \maximizeskip\medskipamount
+% \maximizeskip\smallskipamount}
+
+\def\DoMod #1by#2to#3%
+ {\scratchcounter=#1\relax
+ \divide\scratchcounter by #2\relax
+ \multiply\scratchcounter by #2\relax
+ #3=#1\relax
+ \advance#3 by -\scratchcounter}
+
+\def\DoDiv #1by#2to#3%
+ {#3=#1\relax
+ \divide#3 by #2\relax}
+
+\def\dounprotected#1\par%
+ {#1\protect}
+
+\def\unprotected%
+ {\unprotect\dounprotected}
+
+%D \pagina
+%D \starttypen
+%D \def\obeyhyphens% % after fontswitch
+%D {\def\obeyedspace%
+%D {\hyphenchar\font=45
+%D \spaceskip.5em\!!plus.25em\!!minus.25em\relax%
+%D \def\obeyedspace{ }}}
+%D \stoptypen
+
+%D Standaard kan een spatie (zoals ~) uitrekken. Dit is in
+%D overzichten niet altijd de bedoeling, vandaar:
+
+\def\fixedspace%
+ {\hskip\fontdimen2\font\relax}
+
+%\def\ExpandSecondAfter#1#2#3%
+% {\!!toksa={#2}%
+% \edef\!!stringa{#3}%
+% \edef\expanded%
+% {\noexpand#1{\the\!!toksa}{\!!stringa}}%
+% \expanded}
+%
+%\def\ExpandThirdAfter#1#2#3#4%
+% {\!!toksa={#2}%
+% \!!toksb={#3}%
+% \edef\!!stringa{#4}%
+% \edef\expanded%
+% {\noexpand#1{\the\!!toksa}{\the\!!toksb}{\!!stringa}}%
+% \expanded}
+
+%\def\indirect#1#2#3%
+% {\@EA#1\@EA#2\@EA{\@EA#3\csname\s!do\string#2\endcsname}%
+% \@EA#1\csname\s!do\string#2\endcsname}
+%
+%\def\doubleemptied#1#2#3%
+% {\indirect#1#2\dodoublempty}
+%
+%\indirect\def\stelietsin\dodoubleempty[#1][#2]%
+% {...}
+%
+%\doubleemptied\def\stelietsin[#1][#2]%
+% {...}
+
+% in mult-set
+%
+%\def\defaultsetup{def}
+%
+%\def\selectdefaultsetup#1#2%
+% {\writestatus{setup}{choose #1 setupfile}%
+% \bgroup
+% \endlinechar=-1
+% \global\read16 to \usersetup
+% \egroup
+% \ifx\usersetup\empty
+% \let\usersetup=\defaultsetup
+% \fi
+% \readfile{#2\usersetup}{}{}%
+% \writestatus{setup}{loading #1 setupfile #2\usersetup}}
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/syst-tex.tex b/tex/context/base/syst-tex.tex index 2a34cc100..75da46332 100644 --- a/tex/context/base/syst-tex.tex +++ b/tex/context/base/syst-tex.tex @@ -1,170 +1,170 @@ -%D \module -%D [ file=syst-tex, -%D version=1995.10.10, -%D title=\CONTEXT\ System Macros, -%D subtitle=Efficient \PLAIN\ \TEX\ loading, -%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. - -%D We've build \CONTEXT\ on top of \PLAIN\ \TEX. Because we -%D want to make the format file as independant as possible of -%D machine dependant font encodings, we have to bypass the -%D loading of fonts. -%D -%D Let's start at the beginning. Because \PLAIN\ is not yet -%D loaded we have to define some \CATCODES\ ourselves. - -\catcode`\{=1 % left brace is begin-group character -\catcode`\}=2 % right brace is end-group character -\catcode`\#=6 % hash mark is macro parameter character - -%D We are going to report to the user what we are skipping. - -\def\skipmessage#1{\immediate\write16{skipping #1 in plain}} - -%D We want to be able to use the \type{\newsomething} -%D declarations not only on the \type{\outer} level. This can -%D be done by redefining \type{\outer} so we have to save its -%D original meaning. - -\let\normalouter = \outer -\let\outer = \relax - -%D We also want to postpone the loading of hyphenation patters, -%D so we redefine and therefore save \type{\input}. - -\let\normalinput = \input -\def\input #1 {\skipmessage{\string\input}} - -%D Finaly are going to we redefine some font specification -%D commands and that's why we save them too. The redefinitions -%D are straightforward because the macros have to do nothing -%D but skipping. - -\let\normalskewchar = \skewchar -\def\skewchar #1=#2 {\skipmessage{\string\skewchar}} - -\let\normaltextfont = \textfont -\let\normalscriptfont = \scriptfont -\let\normalscriptscriptfont = \scriptscriptfont - -\def\textfont #1=#2{\skipmessage{\string\textfont}} -\def\scriptfont #1=#2{\skipmessage{\string\scriptfont}} -\def\scriptscriptfont #1=#2{\skipmessage{\string\scriptscriptfont}} - -%D The redefinition of \type{\font} is a bit more complicated, -%D because in version 3.14159 a scaled specification was -%D introduced. - -\let\normalfont = \font - -\def\skipscaled scaled #1 {} - -\long\def\font#1=#2 #3% - {\ifx#3s% - \skipmessage{scaled \string\font}% - \let\next=\skipscaled - \else - \skipmessage{\string\font}% - \let\next=\relax - \fi - \next#3} - -%D Relaxing some font switching macros is needed because we -%D don't want any error messages during loading. These -%D unharmfull messages could be ingored. -%D -%D The next substitution is needed for determining -%D \type{\p@renwd} in the macro \type{\bordermatrix}. - -\def\tenex#1% - {\skipmessage{used \string\tenex}\hskip8.75002pt} - -%D We need to define \type{\tenrm} for switching to -%D \type{\rm}. - -\def\tenrm% - {\skipmessage{\string\tenrm}} - -%D In \CONTEXT\ all \PLAIN\ \TEX\ fonts are available, just -%D like \type{\p@renwd}. We only postpone loading them until -%D they are actually needed. - -%D By bypassing fonts, some definitions become less valid so -%D we have to redefine them afterwards. -%D -%D \starttypen -%D \let\normalbordermatrix=\bordermatrix -%D -%D \def\bordermatrix% -%D {\bgroup -%D \setbox0=\hbox{\getvalue{\textface\c!mm\c!ex}B}% -%D \global\p@renwd=\wd0\relax -%D \egroup -%D \normalbordermatrix} -%D \stoptypen - -%D Now we are ready for loading \PLAIN\ \TEX. Of couse we use -%D \type{\normalinput} and not \type{\input}. - -\normalinput plain.tex - -%D We have to take care of unwanted \PDFTEX\ -%D initializations. We just want to default to \DVI\ output. - -\ifx\pdftexversion\undefined - \chardef\pdfoutput=0 -\else - \pdfoutput=0 -\fi - -%D When applicable, we also load the \ETEX\ source and -%D defintion files. - -\def\gobbleETEX#1\par{} -\def\doifETEX{\ifx\eTeXversion\undefined \expandafter\gobbleETEX\fi} -\def\ifnoETEX{\ifx\eTeXversion\undefined\else\expandafter\gobbleETEX\fi} - -\doifETEX \normalinput etex.src \relax -\doifETEX \normalinput etexdefs.lib \relax - -\let\normalprotected = \protected -\let\normalunexpanded = \unexpanded - -%D We restore some redefined primitives to their old meaning. - -\let\font = \normalfont -\let\skewchar = \normalskewchar -\let\textfont = \normaltextfont -\let\scriptfont = \normalscriptfont -\let\scriptscriptfont = \normalscriptscriptfont -\let\input = \normalinput -\let\outer = \normalouter - -%D We reset some of the used auxiliary macro's to -%D \type{\undefined}. One never knows what testing on them is -%D done elsewhere. - -\let\skipmessage = \undefined -\let\skipscaled = \undefined -\let\normalfont = \undefined -\let\normalskewchar = \undefined -\let\normaltextfont = \undefined -\let\normalscriptfont = \undefined -\let\normalscriptscriptfont = \undefined -\let\normalinput = \undefined -\let\normalouter = \undefined - -%D We want a bit more statistics and some less logging info -%D in the \type{log} file. - -\def\wlog#1{} - -\tracingstats=1 - -\endinput +%D \module
+%D [ file=syst-tex,
+%D version=1995.10.10,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Efficient \PLAIN\ \TEX\ loading,
+%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.
+
+%D We've build \CONTEXT\ on top of \PLAIN\ \TEX. Because we
+%D want to make the format file as independant as possible of
+%D machine dependant font encodings, we have to bypass the
+%D loading of fonts.
+%D
+%D Let's start at the beginning. Because \PLAIN\ is not yet
+%D loaded we have to define some \CATCODES\ ourselves.
+
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\#=6 % hash mark is macro parameter character
+
+%D We are going to report to the user what we are skipping.
+
+\def\skipmessage#1{\immediate\write16{skipping #1 in plain}}
+
+%D We want to be able to use the \type{\newsomething}
+%D declarations not only on the \type{\outer} level. This can
+%D be done by redefining \type{\outer} so we have to save its
+%D original meaning.
+
+\let\normalouter = \outer
+\let\outer = \relax
+
+%D We also want to postpone the loading of hyphenation patters,
+%D so we redefine and therefore save \type{\input}.
+
+\let\normalinput = \input
+\def\input #1 {\skipmessage{\string\input}}
+
+%D Finaly are going to we redefine some font specification
+%D commands and that's why we save them too. The redefinitions
+%D are straightforward because the macros have to do nothing
+%D but skipping.
+
+\let\normalskewchar = \skewchar
+\def\skewchar #1=#2 {\skipmessage{\string\skewchar}}
+
+\let\normaltextfont = \textfont
+\let\normalscriptfont = \scriptfont
+\let\normalscriptscriptfont = \scriptscriptfont
+
+\def\textfont #1=#2{\skipmessage{\string\textfont}}
+\def\scriptfont #1=#2{\skipmessage{\string\scriptfont}}
+\def\scriptscriptfont #1=#2{\skipmessage{\string\scriptscriptfont}}
+
+%D The redefinition of \type{\font} is a bit more complicated,
+%D because in version 3.14159 a scaled specification was
+%D introduced.
+
+\let\normalfont = \font
+
+\def\skipscaled scaled #1 {}
+
+\long\def\font#1=#2 #3%
+ {\ifx#3s%
+ \skipmessage{scaled \string\font}%
+ \let\next=\skipscaled
+ \else
+ \skipmessage{\string\font}%
+ \let\next=\relax
+ \fi
+ \next#3}
+
+%D Relaxing some font switching macros is needed because we
+%D don't want any error messages during loading. These
+%D unharmfull messages could be ingored.
+%D
+%D The next substitution is needed for determining
+%D \type{\p@renwd} in the macro \type{\bordermatrix}.
+
+\def\tenex#1%
+ {\skipmessage{used \string\tenex}\hskip8.75002pt}
+
+%D We need to define \type{\tenrm} for switching to
+%D \type{\rm}.
+
+\def\tenrm%
+ {\skipmessage{\string\tenrm}}
+
+%D In \CONTEXT\ all \PLAIN\ \TEX\ fonts are available, just
+%D like \type{\p@renwd}. We only postpone loading them until
+%D they are actually needed.
+
+%D By bypassing fonts, some definitions become less valid so
+%D we have to redefine them afterwards.
+%D
+%D \starttypen
+%D \let\normalbordermatrix=\bordermatrix
+%D
+%D \def\bordermatrix%
+%D {\bgroup
+%D \setbox0=\hbox{\getvalue{\textface\c!mm\c!ex}B}%
+%D \global\p@renwd=\wd0\relax
+%D \egroup
+%D \normalbordermatrix}
+%D \stoptypen
+
+%D Now we are ready for loading \PLAIN\ \TEX. Of couse we use
+%D \type{\normalinput} and not \type{\input}.
+
+\normalinput plain.tex
+
+%D We have to take care of unwanted \PDFTEX\
+%D initializations. We just want to default to \DVI\ output.
+
+\ifx\pdftexversion\undefined
+ \chardef\pdfoutput=0
+\else
+ \pdfoutput=0
+\fi
+
+%D When applicable, we also load the \ETEX\ source and
+%D defintion files.
+
+\def\gobbleETEX#1\par{}
+\def\doifETEX{\ifx\eTeXversion\undefined \expandafter\gobbleETEX\fi}
+\def\ifnoETEX{\ifx\eTeXversion\undefined\else\expandafter\gobbleETEX\fi}
+
+\doifETEX \normalinput etex.src \relax
+\doifETEX \normalinput etexdefs.lib \relax
+
+\let\normalprotected = \protected
+\let\normalunexpanded = \unexpanded
+
+%D We restore some redefined primitives to their old meaning.
+
+\let\font = \normalfont
+\let\skewchar = \normalskewchar
+\let\textfont = \normaltextfont
+\let\scriptfont = \normalscriptfont
+\let\scriptscriptfont = \normalscriptscriptfont
+\let\input = \normalinput
+\let\outer = \normalouter
+
+%D We reset some of the used auxiliary macro's to
+%D \type{\undefined}. One never knows what testing on them is
+%D done elsewhere.
+
+\let\skipmessage = \undefined
+\let\skipscaled = \undefined
+\let\normalfont = \undefined
+\let\normalskewchar = \undefined
+\let\normaltextfont = \undefined
+\let\normalscriptfont = \undefined
+\let\normalscriptscriptfont = \undefined
+\let\normalinput = \undefined
+\let\normalouter = \undefined
+
+%D We want a bit more statistics and some less logging info
+%D in the \type{log} file.
+
+\def\wlog#1{}
+
+\tracingstats=1
+
+\endinput
diff --git a/tex/context/base/table.tex b/tex/context/base/table.tex index 87086b349..764ffaa42 100644 --- a/tex/context/base/table.tex +++ b/tex/context/base/table.tex @@ -1,1960 +1,1960 @@ -% TABLE 1.0 -% Copyright Michael J. Wichura August 1988 - -%% The following three lines were inserted by C.E.K. of Personal TeX on 9-6-89 -%% \input nine -%% \input eight -%% \font\csc=cmcsc10 - - - -% The TABLE macros are divided into sections, roughly according to -% function: - -% Section Name Function -% a Allocation Allocates storage registers for parameters. -% f Format Reads format section; builds preamble for \halign; -% processes \ReFormat command. -% g Get Value Converts "spec"'s (as in spec_{LT}) to -% corresponding "values"'s (as in value_{LT}). -% h Hacks Utility macros; error messages; miscellaneous commands. -% k Keys Definition and scanning of format keys. -% n Numeric Macros for TABLE's numeric format. -% s Struts Macros for struts. -% t Tables Sets up \halign for table; end-of-row processing; -% alternate vertical rules; spanning; horizontal -% lines; stretching and shrinking; repositioning -% commands. - -% The name of each internal macro begins with the prefix "\!t", the -% "!" having category code 11, followed by the letter of the section -% in which the macro is defined. For example, a macro beginning "\!th" -% is defined in Section h (Hacks). There a few exceptions: -% the general purpose macros "\!ttemp", "\!ttempa", "\!ttempb", and -% "\!tnext" are repeatedly defined on the spot as the need arises. - -% External macros (and active characters) are defined in the following -% sections: -% Macro Section -% " t -% \- t -% \= t -% \ActivateBarAndQuote h -% \AugmentedTableStrut s -% \BackSpace h -% \BeginFormat f -% \BeginTable t -% \BeginTableParBox a -% \Center t -% \ColumnWidthFactor a -% \ColumnWidthUnit a -% \DQuote h -% \EndFormat k (\EndFormat is actually a key) -% \EndTable t -% \EndTableParBox a -% \Enlarge s -% \enlarge s -% \EveryTable a -% \EveryTableParBox a -% \Expand t -% \InterColumnSpaceFactor a -% \InterColumnSpaceUnit a -% \JustCenter t -% \JustLeft t -% \JustRight t -% \KernFactor a -% \KernUnit a -% \Left t -% \LeftTabskip a -% \LineThicknessFactor a -% \LineThicknessUnit a -% \LongLines t -% \Lower h -% \MakeStrut s -% \NewFormatKey k -% \NormalCWU a -% \NormalICSU a -% \NormalKU a -% \NormalLTU a -% \NormalSU a -% \NormalTableUnits a -% \OpenUp s -% \PseudoVrule t -% \Raise h -% \ReadFormatKeys k -% \ReFormat f -% \Right t -% \RightTabskip a -% \SetTableToWidth t -% \Smash h -% \StandardTableStrut s -% \StrutDepthFactor a -% \StrutHeightFactor a -% \StrutUnit a -% \TaBlE h -% \TracingFormats a -% \TracingKeys a -% \Use t -% \use t -% \VBar h -% \Vspace h -% \VspaceFactor a -% \WidenTableBy t -% \\ t -% \_ t -% \| t -% | t -% ~ t -% -\catcode `\!=11 -\catcode `\@=11 - -% Don't try to read the TABLE macros until after you've read the -% TABLE manual. The internal documentation of the macros is -% sketchy; you need the manual to understand what's going on. -% You should also review the material on \halign s in the TeXbook, -% since TABLE uses an \halign to perform its alignments. - -% In studying the TABLE macros, you should start by skimming the -% macros in the "miscellaneous hacks", "error messages", and "loops" -% subsections of Section h, as well as the "\GetValue" macro in -% Section g; these macros are called many times by the other macros. -% To continue with a "bottom-up" approach, read next Sections k, -% f, and t. (Top-downers should reverse the order.) The other -% Sections can be looked at as the need arises. - - - -% ********************************************************************* -% SECTION A: ALLOCATION -% ********************************************************************* - -\let\!tacr=\\ % Save meaning of \\ (Needed if TABLE is used with LaTeX - -% ********************************************************************* -% TABLE PARAMETERS: Units -% ********************************************************************* - -\newdimen\LineThicknessUnit -\newdimen\StrutUnit -\newskip \InterColumnSpaceUnit -\newdimen\ColumnWidthUnit -\newdimen\KernUnit - -\let\!taLTU=\LineThicknessUnit % Used in preamble -\let\!taCWU=\ColumnWidthUnit % Used in preamble -\let\!taKU =\KernUnit % Used in preamble - -\newtoks\NormalTLTU -\newtoks\NormalTSU -\newtoks\NormalTICSU -\newtoks\NormalTCWU -\newtoks\NormalTKU - -% NOTE: The user should modify the following DEFAULTS to suit his/her -% taste, and output device: -%\def\PixelsPerInch{300} -\NormalTLTU={1in \divide \LineThicknessUnit by 300 } -\NormalTSU ={\normalbaselineskip - \divide \StrutUnit by 11 } % 11 = 8+3 = NormalT Height+Depth Factors -\NormalTICSU={.5em plus 1fil minus .25em} % .5em = width of a digit -\NormalTCWU ={.5em} -\NormalTKU ={.5em} - -\def\NormalTableUnits{% - \LineThicknessUnit =\the\NormalTLTU - \StrutUnit =\the\NormalTSU - \InterColumnSpaceUnit=\the\NormalTICSU - \ColumnWidthUnit =\the\NormalTCWU - \KernUnit =\the\NormalTKU} - -\NormalTableUnits - -% The user should issue \NormalTableUnits when setting a table -% in a different point size, since the Table...Units themselves -% are static while the Normal...Units vary with the point size. - - -% ********************************************************************* -% TABLE PARAMETERS: Factors -% ********************************************************************* - -\newcount\LineThicknessFactor -\newcount\StrutHeightFactor -\newcount\StrutDepthFactor -\newcount\InterColumnSpaceFactor -\newcount\ColumnWidthFactor -\newcount\KernFactor -\newcount\VspaceFactor - -% DEFAULTS: -\LineThicknessFactor =2 -\StrutHeightFactor =8 -\StrutDepthFactor =3 -\InterColumnSpaceFactor =3 -\ColumnWidthFactor =10 -\KernFactor =1 -\VspaceFactor =2 - - -% ********************************************************************* -% DIAGNOSTIC PARAMETERS -% ********************************************************************* - -\newcount\TracingKeys % >=1 reports new keys, >=2 reports key usage -\newcount\TracingFormats % >=1 reports templates for columns - % >=2 reports \halign preamble - - -% ********************************************************************* -% PARBLOCK PARAMETERS -% ********************************************************************* - -\def\BeginTableParBox#1{% - \vtop\bgroup - \hsize=#1 - \normalbaselines - \let~=\!ttTie - \let\-=\!ttDH - \the\EveryTableParBox} - -\def\EndTableParBox{% - \MakeStrut{0pt}{\StrutDepthFactor\StrutUnit} - \egroup} % finishes the \vtop begun by \BeginTableParbox - -\newtoks\EveryTableParBox -\EveryTableParBox={% - \parindent=0pt - \raggedright - \rightskip=0pt plus 4em % Provide more stretch - \relax} - - -% ********************************************************************* -% EVERY TABLE TOKENS -% ********************************************************************* - -\newtoks\EveryTable -\newtoks\!taTableSpread - - -% ********************************************************************* -% Extreme left- and right- tabskips -% ********************************************************************* - -\newskip\LeftTabskip -\newskip\RightTabskip - - -% ********************************************************************* -% INTERNAL VARIABLES -% ********************************************************************* - -\newcount\!taCountA -\newcount\!taColumnNumber -\newcount\!taRecursionLevel % (Initially 0) - -\newdimen\!taDimenA % used by \Enlarge -\newdimen\!taDimenB % used by \Enlarge -\newdimen\!taDimenC % used by numeric.tex -\newdimen\!taMinimumColumnWidth - -\newtoks\!taToksA - -\newtoks\!taPreamble -\newtoks\!taDataColumnTemplate -\newtoks\!taRuleColumnTemplate -\newtoks\!taOldRuleColumnTemplate -\newtoks\!taLeftGlue -\newtoks\!taRightGlue - -\newskip\!taLastRegularTabskip - -\newif\if!taDigit -\newif\if!taBeginFormat -\newif\if!taOnceOnlyTabskip - - - -% ********************************************************************* -% SECTION H: HACKS -% ********************************************************************* - -% **************************************************************** -% TABLE LOGO -% **************************************************************** -\def\TaBlE{% - T\kern-.27em\lower.5ex\hbox{A}\kern-.18em B\kern-.1em - \lower.5ex\hbox{L}\kern-.075em E} - - -% **************************************************************** -% ACTIVE CHARACTERS -% **************************************************************** - -% ACTIVATE BAR AND QUOTE: Makes | and " active if they aren't -% already active (in which case the user will probably have given -% them special meanings); definitions are provided which effectively -% undoes the activeness outside a Table. - -{\catcode`\|=13 \catcode`\"=13 - \gdef\ActivateBarAndQuote{% - \ifnum \catcode`\|=13 - \else - \catcode`\|=13 - \def|{% - \ifmmode - \vert - \else - \char`\| - \fi}% - \fi - \ifnum \catcode`\"=13 - \else - \catcode`\"=13 - \def"{\char`\"}% - \fi}} - -% **************************************************************** -% Macros for | and " having category code 12. -% **************************************************************** -{\catcode `\|=12 \catcode `\"=12 -\gdef\VBar{|} -\gdef\DQuote{"}} - - -% **************************************************************** -% MISCELANEOUS HACKS -% **************************************************************** - -% MESSAGE <Message>: Writes out <Message> to terminal and log file. -\def\!thMessage#1{\immediate\write16{#1}\ignorespaces} - -% X: Abbreviation for expandafter -\let\!thx=\expandafter - -% GOBBLE: Eats next token -\def\!thGobble#1{} - -% SPACE TOKEN -\def\\{\let\!thSpaceToken= }\\ - -% HEIGHT, DEPTH, AND WIDTH -\def\!thHeight{height} -\def\!thDepth{depth} -\def\!thWidth{width} - -% TOKSEDEF <token register>=<replacement text>: Places <replacement -% text>, fully expanded a la \edef, in the specified <token register>. -\def\!thToksEdef#1=#2{% - \edef\!ttemp{#2}% - #1\!thx{\!ttemp}% - \ignorespaces} - - -% **************************************************************** -% ERROR MESSAGES -% **************************************************************** - -% STORE ERROR MSG <Control Sequence> <Message> -% Replacement text of <Control Sequence> is a macro with Message -% as its name. E.g., after \StoreErrorMsg\Help{Type <CR>}, -% \Help expands to "\Type <CR>" -\def\!thStoreErrorMsg#1#2{% - \toks0 =\!thx{\csname #2\endcsname}% - \edef#1{\the\toks0 }} - -% READ ERROR MSG <Control sequence> -% Continuing the above example, \ReadErrorMsg\Help produces "Type <CR>" -\def\!thReadErrorMsg#1{% - \!thx\!thx\!thx\!thGobble\!thx\string #1} - -% ERROR <Error Message> <Error Help> -\def\!thError#1#2{% - \begingroup - \newlinechar=`\^^J% - \edef\!ttemp{#2}% - \errhelp=\!thx{\!ttemp}% - \!thMessage{% - ^^J\!thReadErrorMsg\!thErrorMsgA - ^^J\!thReadErrorMsg\!thErrorMsgB}% - \errmessage{#1}% - \endgroup} - -% TEXT FOR ERROR MESSAGE -\!thStoreErrorMsg\!thErrorMsgA{% - TABLE error; see manual for explanation.} -\!thStoreErrorMsg\!thErrorMsgB{% - Type \space H <return> \space for immediate help.} - -% GET REPLACEMENT <Prompt Message> <Replacement Value> -% <Replacement Vale> must be a control sequence -\def\!thGetReplacement#1#2{% - \begingroup - \!thMessage{#1} - \endlinechar=-1 - \global\read16 to#2% - \endgroup} - - -% **************************************************************** -% LOOP MACRO -% **************************************************************** - -% LOOP ... REPEAT macro from TUGboat Vol 8 #2: 1987 -% Syntax is like that of plain TeX's \loop ... \repeat macro -\def\!thLoop#1\repeat{% - \def\!thIterate{% - #1% - \!thx \!thIterate - \fi}% - \!thIterate - \let\!thIterate\relax} - - -% *************************************************************** -% VERTICALLY-CENTERED SMASH -% *************************************************************** - -% SMASH: Like TeX's \smash, only the argument -% is centered vertically before its height and depth are smashed to 0pt. -\def\Smash{% - \relax - \ifmmode - \expandafter\mathpalette - \expandafter\!thDoMathVCS - \else - \expandafter\!thDoVCS - \fi} - -% DO VCS -\def\!thDoVCS#1{% - \setbox\z@\hbox{#1}% - \!thFinishVCS} - -% DO MATH VCS -\def\!thDoMathVCS#1#2{% - \setbox\z@\hbox{$\m@th#1{#2}$}% - \!thFinishVCS} - -% FINISH VCS -\def\!thFinishVCS{% - \vbox to\z@{\vss\box\z@\vss}} - - -% *************************************************************** -% RAISE AND LOWER -% *************************************************************** - -% Like TeX's \raise and \lower, except: (1) The first argument -% to these commands is a dimension expressed in TABLE's usual conventions; -% the default is (StrutHeightFactor+StrutDepthFactor)*StrutUnit/2 -% (2) like \smash, these commands function in math mode as well -% as horizontal mode; (3) again like \smash, the result is declared -% to have height and depth 0pt - -% Examples \Raise2{Stuff}: "Stuff" is raised 2*StrutUnit -% \Raise {Stuff}: "Stuff" is raised a half-line -% $\Lower(10pt){\alpha}$: "$\alpha$" is lowered 10 points - -% RAISE -\def\Raise{% - \def\!thSign{+}% - \!tgGetValue\!thSetDimen} - -% LOWER -\def\Lower{% - \def\!thSign{-}% - \!tgGetValue\!thSetDimen} - -% SET DIMEN -\def\!thSetDimen{% - \ifnum \!tgCode=1 - \ifx \!tgValue\empty - \!taDimenA \StrutHeightFactor\StrutUnit - \advance \!taDimenA \StrutDepthFactor\StrutUnit - \divide \!taDimenA 2 - \else - \!taDimenA \!tgValue\StrutUnit - \fi - \else - \!taDimenA \!tgValue - \fi - \!taDimenA=\!thSign\!taDimenA\relax - % - % BRANCH ON MODE - \ifmmode - \expandafter\mathpalette - \expandafter\!thDoMathRaise - \else - \expandafter\!thDoSimpleRaise - \fi} - -% DO SIMPLE RAISE -\def\!thDoSimpleRaise#1{% - \setbox\z@\hbox{\raise \!taDimenA\hbox{#1}}% - \!thFinishRaise} % From Plain TeX: \ht0=0pt \dp0=0pt \box0 - -% DO MATH RAISE -\def\!thDoMathRaise#1#2{% - \setbox\z@\hbox{\raise \!taDimenA\hbox{$\m@th#1{#2}$}}% - \!thFinishRaise} - -% FINISH RAISE. This is the same as Plain's \finsm@sh; some macro -% packages redefine \finsm@sh. -\def\!thFinishRaise{% - \ht\z@\z@ - \dp\z@\z@ - \box\z@} - - -% *************************************************************** -% BACK SPACE -% *************************************************************** -\def\BackSpace{% - \!tgGetValue\!thKernBack} - -\def\!thKernBack{% - \kern - - \ifnum \!tgCode=1 - \ifx \!tgValue\empty - \the\KernFactor - \else - \!tgValue % user-specified integer - \fi - \KernUnit - \else - \!tgValue % user-specified dimension - \fi - \ignorespaces}% - - -% *************************************************************** -% Vspace -% *************************************************************** -\def\Vspace{% - \noalign - \bgroup - \!tgGetValue\!thVspace} - -\def\!thVspace{% - \vskip - \ifnum \!tgCode=1 - \ifx \!tgValue\empty - \the\VspaceFactor - \else - \!tgValue % user-specified integer - \fi - \StrutUnit - \else - \!tgValue % user-specified skip - \fi - \egroup} % Ends the \noalign - -% ********************************************************************* -% SECTION F: FORMAT -% ********************************************************************* - -% As explained in Section 3.3 of the manual, TABLE alternates each -% of the user's "data" columns with a "rule" column; moreover, TABLE -% places a "dummy data" column at the left and right of a table. -% A table with n nominal data columns therefore actually has a -% total of -% n (nominal data columns) -% +(n+1) (rule columns) -% + 2 (dummy data columns) -% ____ -% 2n+3 -% columns. - -% FORMATs job is to create an \halign preamble for the alignment -% of these (2n+3) columns. The preamble consists of templates -% for the various columns, strung together with &'s and interlaced -% with \tabskip glue specifications. - -% FORMAT constructs the template for a nomimal data column according -% to the user-specified format keys. As the keys are read from left -% to right, the template is built up "from the inside out" (as -% illustrated in Section 3.1.9 of the manual), the inner-most part -% being the "#" sign. A "|" in the format terminates template -% building; the completed template is adjoined to preamble along -% with the template for the following rule column. - -% Minimum column widths, if specified, are implemented by creating -% an "artificial row" with data entries of the form -% \hskip <minimum column width>. -% This row has zero height and depth and is completely invisible. - - -% BEGIN FORMAT -\def\BeginFormat{% - \catcode`\|=12 % Inhibit expansion if | immediately follows a <number> - \catcode`\"=12 % read by \getvalue. - \!taPreamble={}% - \!taColumnNumber=0 - \skip0 =\InterColumnSpaceUnit - \multiply\skip0 \InterColumnSpaceFactor - \divide\skip0 2 - \!taRuleColumnTemplate=\!thx{% - \!thx\tabskip\the\skip0 }% - \!taLastRegularTabskip=\skip0 - \!taOnceOnlyTabskipfalse - \!taBeginFormattrue % Used to intercept key "]" - \def\!tfRowOfWidths{}% Artificial Table Row with horizontal struts - % to enforce specified minimum column widths - \ReadFormatKeys} - -% SET (MINIMUM COLUMN) WIDTH: Invoked by the key "w". -\def\!tfSetWidth{% - \ifx \!tfRowOfWidths \empty % true if no prior "w" keys - \ifnum \!taColumnNumber>0 % true if "w" key is to right of first "|" - \begingroup % RowOfWidths={&\omit || n copies of - % &\omit&\omit}, where n = number of columns - \!taCountA=1 % to the left of this one - \aftergroup \edef \aftergroup \!tfRowOfWidths \aftergroup {% - \aftergroup &\aftergroup \omit - \!thLoop - \ifnum \!taCountA<\!taColumnNumber - \advance\!taCountA 1 - \aftergroup \!tfAOAO - \repeat - \aftergroup }% - \endgroup - \fi - \fi - \ifx [\!ttemp % \!tgGetValue sets \!ttemp = token after w - \!thx\!tfSetWidthText - \else - \!thx\!tfSetWidthValue - \fi} - -% AOAO = (Apersand Omit Ampersand Omit) -\def\!tfAOAO{% - &\omit&\omit} - -% SET WIDTH TEXT -\def\!tfSetWidthText [#1]{% #1 = specified text - \def\!tfWidthText{#1}% - \ReadFormatKeys} - -% SET WIDTH VALUE -\def\!tfSetWidthValue{% - \!taMinimumColumnWidth = - \ifnum \!tgCode=1 - \ifx\!tgValue\empty % Use default multiplier if user didn't specify one - \ColumnWidthFactor - \else - \!tgValue - \fi - \ColumnWidthUnit - \else - \!tgValue - \fi - \def\!tfWidthText{}% Override possible prior `w[sample entry]' - \ReadFormatKeys} - - -% SET TABSKIP: Invoked by the tabskip keys "t" and "o" -\def\!tfSetTabskip{% - \ifnum \!tgCode=1 - \skip0 =\InterColumnSpaceUnit - \multiply\skip0 - \ifx \!tgValue\empty - \InterColumnSpaceFactor % Default integer - \else - \!tgValue % User-specified integer - \fi - \else - \skip0 =\!tgValue % User-specified <skip> - \fi - \divide\skip0 by 2 - \ifnum\!taColumnNumber=0 - \!thToksEdef\!taRuleColumnTemplate={% - \the\!taRuleColumnTemplate - \tabskip \the\skip0 } - \else - \!thToksEdef\!taDataColumnTemplate={% - \the\!taDataColumnTemplate - \tabskip \the\skip0 } - \fi - \if!taOnceOnlyTabskip - % % Tabskip used at right of this col only - \else - \!taLastRegularTabskip=\skip0 % Remember this Tabskip, for possible - \fi % restoration after a subsequent"OnceOnly" - \ReadFormatKeys} - - -% SET VRULE: Invoked by the key "|" -\def\!tfSetVrule{% - \!thToksEdef\!taRuleColumnTemplate={% - \noexpand\hfil - \noexpand\vrule - \noexpand\!thWidth - \ifnum \!tgCode=1 - \ifx \!tgValue\empty - \the\LineThicknessFactor % Default integer - \else - \!tgValue % User-specified integer - \fi - \!taLTU % \LineThicknessUnit - \else - \!tgValue % User-specified dimension - \fi - ####% - \noexpand\hfil - \the\!taRuleColumnTemplate} % has \tabskips, when column number=0 - \!tfAdjoinPriorColumn} - -% SET ALTERNATE VRULE: Invoked by the key "\|", in the form -% \|{<template for (rule) column>}. The "{" and "}" are mandatory, -% and the <template for column> must contain a "#". The key system -% CAN'T be used to set up this template. The <template> can have the -% form "\span\macro". -\def\!tfSetAlternateVrule{% - \afterassignment\!tfSetAlternateA - \toks0 =} % Put template into \toks0 - -\def\!tfSetAlternateA{% - \!thToksEdef\!taRuleColumnTemplate={% - \the\toks0 \the\!taRuleColumnTemplate} % RCT may have \tabskips - \!tfAdjoinPriorColumn} - -% ADJOIN PRIOR COLUMN -\def\!tfAdjoinPriorColumn{% - \ifnum \!taColumnNumber=0 - \!taPreamble=\!taRuleColumnTemplate % New \tabskip may have been added - \ifnum \TracingFormats>0 - \!tfShowRuleTemplate - \fi - \else - \ifx\!tfRowOfWidths\empty % no "w" keys specified yet, not even this col - \else - \!tfUpdateRowOfWidths - \fi - % Adjoin positioning glues to left and right of template - \!thToksEdef\!taDataColumnTemplate={% - \the \!taLeftGlue - \the \!taDataColumnTemplate - \the \!taRightGlue} - \ifnum \TracingFormats>0 - \!tfShowTemplates - \fi - % Adjoin data- and rule-column templates to preamble - \!thToksEdef\!taPreamble={% - \the\!taPreamble - & - \the\!taDataColumnTemplate - & - \the\!taRuleColumnTemplate} - \fi -% -% START NEW COLUMN - \advance \!taColumnNumber 1 - % Initialize data-column template, restoring last "regular" tabskip - % after a "once only" tabskip - \if!taOnceOnlyTabskip - \!thToksEdef\!taDataColumnTemplate={% - ####\tabskip \the\!taLastRegularTabskip} - \else - \!taDataColumnTemplate{##}% - \fi - % Remaining initializations - \!taRuleColumnTemplate{}% # is inserted by \SetVrule, or \SetAlternateVrule - \!taLeftGlue{\hfil}% % Default positioning is "center" - \!taRightGlue{\hfil}% - \!taMinimumColumnWidth=0pt - \def\!tfWidthText{}% - \!taOnceOnlyTabskipfalse % Set true by key "o" - \ReadFormatKeys} - -% UPDATE ROW OF WIDTHS -\def\!tfUpdateRowOfWidths{% - % If user had a "w[<Text>]" key, set <Text> according to the - % template for this column, and find the width of the result - \ifx \!tfWidthText\empty - \else % set specified text according to current template & find width - \!tfComputeMinColWidth - \fi - \edef\!tfRowOfWidths{% - \!tfRowOfWidths - &% - \omit % Data Column - \ifdim \!taMinimumColumnWidth>0pt - \hskip \the\!taMinimumColumnWidth - \fi - & - \omit}} % Rule Column - -% COMPUTE MINIMUM COLUMN WIDTH (from specified WidthText) -\def\!tfComputeMinColWidth{% - \setbox0 =\vbox{% - \ialign{% Plain's initialized \halign; \tabskip=0pt \everycr={} - \span\the\!taDataColumnTemplate\cr - \!tfWidthText\cr}}% - \!taMinimumColumnWidth=\wd0 } - -% SHOW (INITIAL) RULE TEMPLATE -\def\!tfShowRuleTemplate{% - \!thMessage{} - \!thMessage{TABLE FORMAT} - \!thMessage{Column: Template} - \!thMessage{% - \space *c: ##\tabskip \the\LeftTabskip} - \!taOldRuleColumnTemplate=\!taRuleColumnTemplate} - -% SHOW TEMPLATES -\def\!tfShowTemplates{% - \!thMessage{% - \space \space r: \the\!taOldRuleColumnTemplate} - \!taOldRuleColumnTemplate=\!taRuleColumnTemplate - \!thMessage{% - \ifnum \!taColumnNumber<10 - \space - \fi - \the\!taColumnNumber c: \the\!taDataColumnTemplate} - \ifdim\!taMinimumColumnWidth>0pt - \!thMessage{% - \space \space w: \the\!taMinimumColumnWidth} - \fi} - - -% FINISH UP: Invoked by the keys "." and \EndFormat -\def\!tfFinishFormat{% - \ifnum \TracingFormats>0 - \!thMessage{% - \space \space r: \the\!taOldRuleColumnTemplate - \tabskip \the\RightTabskip}% - \!thMessage{% - \space *c: ##\tabskip 0pt} - \fi - \ifnum \!taColumnNumber<2 - \!thError{% - \ifnum \!taColumnNumber=0 - No - \else - Only 1 - \fi - "|"}% - {\!thReadErrorMsg\!tfTooFewBarsA - ^^J\!thReadErrorMsg\!tfTooFewBarsB - ^^J\!thReadErrorMsg\!tkFixIt}% - \fi - \!thToksEdef\!taPreamble={% - ####\tabskip\LeftTabskip - & - \the\!taPreamble \tabskip\RightTabskip - & - ####\tabskip 0pt \cr} - \ifnum \TracingFormats>1 - \!thMessage{Preamble=\the\!taPreamble} - \fi - \ifnum \TracingFormats>2 - \!thMessage{Row Of Widths="\!tfRowOfWidths"} - \fi - \!taBeginFormatfalse % Intercepts "|", tabskips, and "." - \catcode`\|=13 - \catcode`\"=13 - \!ttDoHalign} - -% ERROR MESSAGE FOR NOT ENOUGH "|"'s -\!thStoreErrorMsg\!tfTooFewBarsA{% - There must be at least 2 "|"'s (and/or "\string \|"'s)} -\!thStoreErrorMsg\!tfTooFewBarsB{% - between \string\BeginFormat\space and \string\EndFormat\space (or ".").} - - -% REFORMAT [<key letters>]{<text>}: Formats <text> according to -% <key letters>. Used to override the template for a column, -% or columns when used after \use. -\def\ReFormat[{% - \omit - \!taDataColumnTemplate{##}% - \!taLeftGlue{}% - \!taRightGlue{}% - \catcode`\|=12 % Inhibit expansion if | immediately follows a <number> - \catcode`\"=12 % read by \getvalue. Actually, '|' and '"' shouldn't - \ReadFormatKeys}% appear in a \ReFormat cmd; this is here as a safeguard. - -% END REFORMAT: Invoked by the key "]" -\def\!tfEndReFormat{% - \ifnum \TracingFormats>0 - \!thMessage{ReF: - \the\!taLeftGlue - \hbox{\the\!taDataColumnTemplate}% White lie - \the\!taRightGlue} - \fi - \catcode`\|=13 - \catcode`\"=13 - \!tfReFormat} - -\def\!tfReFormat#1{% - \the \!taLeftGlue - \vbox{% - \ialign{% - \span\the\!taDataColumnTemplate\cr - #1\cr}}% - \the \!taRightGlue} - - - -% ********************************************************************* -% SECTION G: GET VALUE -% ********************************************************************* - -% GET_VALUE{<return macro>}<tokens> functions as follows: - -% If <tokens> has the form <(stuff)>, then -% code=2 and value=<stuff> - -% Otherwise <tokens> has the form <DDDXYZ> where <DDD> denotes (a possibly -% empty) string of consecutive digits (0,1,2,...,9) terminated by the first -% character <X> (possibly a blank) that is not a digit. In this case -% code=1 and value=<DDD> (= <null>, if <DDD> is non-empty). - -% Examples: Code Value -% "\GetValue{\macro} 3" 1 null -% "\GetValue{\macro}A " 1 null -% "\GetValue{\macro}1 " 1 1 -% "\GetValue{\macro}25A" 1 25 -% "\GetValue{\macro}25012 " 1 25012 -% "\GetValue{\macro}(10pt)" 2 10pt -% "\GetValue{\macro}(1in)" 2 1in -% "\GetValue{\macro} (1in)" 1 null - - -% GET_VALUE{<macro to execute after value is found>} -\def\!tgGetValue#1{% - \def\!tgReturn{#1}% Set return - \futurelet\!ttemp\!tgCheckForParen}% Now \!ttemp is the token - % immediately after {} - -% CHECK_PAREN: See if \!ttemp is a ( -\def\!tgCheckForParen{% - \ifx\!ttemp (% - \!thx \!tgDoParen - \else - \!thx \!tgCheckForSpace - \fi} - -% DO_PAREN: Set code to 2, value to stuff inside ( )'s -\def\!tgDoParen(#1){% - \def\!tgCode{2}% - \def\!tgValue{#1}% NOTE #1 MUST BE A LEGITIMATE VALUE - \!tgReturn} - -% CHECK_SPACE: See if \!ttemp is a <blank space> -\def\!tgCheckForSpace{% - \def\!tgCode{1}% - \def\!tgValue{}% Initialize value to <null> - \ifx\!ttemp\!thSpaceToken - \!thx \!tgReturn % <blank space> means no value was specified - \else - \!thx \!tgCheckForDigit - \fi} - -% CHECK_DIGIT: \!ttemp is not a <blank space>; if its a digit (0,1,...,9) -% get the <number> starting with that digit. -\def\!tgCheckForDigit{% - \!taDigitfalse - \ifx 0\!ttemp - \!taDigittrue - \else - \ifx 1\!ttemp - \!taDigittrue - \else - \ifx 2\!ttemp - \!taDigittrue - \else - \ifx 3\!ttemp - \!taDigittrue - \else - \ifx 4\!ttemp - \!taDigittrue - \else - \ifx 5\!ttemp - \!taDigittrue - \else - \ifx 6\!ttemp - \!taDigittrue - \else - \ifx 7\!ttemp - \!taDigittrue - \else - \ifx 8\!ttemp - \!taDigittrue - \else - \ifx 9\!ttemp - \!taDigittrue - \fi - \fi - \fi - \fi - \fi - \fi - \fi - \fi - \fi - \fi - \if!taDigit - \!thx \!tgGetNumber - \else - \!thx \!tgReturn - \fi} - -% GET_NUMBER -\def\!tgGetNumber{% - \afterassignment\!tgGetNumberA - \!taCountA=} -\def\!tgGetNumberA{% - \edef\!tgValue{\the\!taCountA}% - \!tgReturn} - - -% ******************************************************************** -% MISCELANEOUS "RETURNS" FROM \getvalue -% ******************************************************************** - -% SET UP PAR BOX: Puts \BeginTableParBox{<user-specified \hsize>} -% to the left of "#" and \EndTableParBox to the right of "#". -\def\!tgSetUpParBox{% - \edef\!ttemp{% - \noexpand \ReadFormatKeys - b{\noexpand \BeginTableParBox{% - \ifnum \!tgCode=1 - \ifx \!tgValue\empty - \the\ColumnWidthFactor - \else - \!tgValue % user-specified integer - \fi - \!taCWU % \ColumnWidthUnit - \else - \!tgValue % user-specified dimension - \fi}}}% - \!ttemp - a{\EndTableParBox}} - -% SET KERNS -\def\!tgInsertKern{% - \edef\!ttemp{% - \kern - \ifnum \!tgCode=1 - \ifx \!tgValue\empty - \the\KernFactor - \else - \!tgValue % user-specified integer - \fi - \!taKU % \KernUnit - \else - \!tgValue % user-specified dimension - \fi}% - \edef\!ttemp{% - \noexpand\ReadFormatKeys - \ifh@ % true if kern goes to left of "#" - b{\!ttemp} - \fi - \ifv@ % true if kern goes to right of "#" - a{\!ttemp} - \fi}% - \!ttemp} - -% ********************************************************************* -% SECTION K: KEYS -% ********************************************************************* - -% **************************************************************** -% DEFINING NEW KEYS -% **************************************************************** - -% NEW FORMAT KEY <Key Letter>: Must be followed by -% <Parameter Text> <Replacement Text> -% Sets up a new key letter command by expanding (essentially) to -% \expandafter \def \csname !tk<Key Letter>\endcsname -% <Parameter Text>{<Replacement Text>} -% A warning message is issued if <Key Letter> is already in use. -\def\NewFormatKey#1{% - \!thx\def\!thx\!ttempa\!thx{\string #1}% - \!thx\def\!thx\!ttempb\!thx{\csname !tk<\!ttempa>\endcsname}% - \ifnum \TracingKeys>0 - \!tkReportNewKey - \fi - \!thx\ifx \!ttempb \relax - \!thx\!tkDefineKey - \else - \!thx\!tkRejectKey - \fi} - -% REPORT NEW KEY -\def\!tkReportNewKey{% - \!taToksA\!thx{\!ttempa}% - \!thMessage{NEW KEY: "\the\!taToksA"}} - -% DEFINE KEY -\def\!tkDefineKey{% - \!thx\def\!ttempb}% - -% DUPLICATE KEY -\def\!tkRejectKey{% - \!taToksA\!thx{\!ttempa}% - \!thError{Key letter "\the\!taToksA" already used} - {\!thReadErrorMsg\!tkFixIt} - \def\!tkGarbage}% - -% ERROR MESSAGE FOR DUPLICATE KEY -\!thStoreErrorMsg\!tkFixIt{% - You'd better type \space 'E' \space and fix your file.} - - -% **************************************************************** -% READING FORMAT KEYS -% **************************************************************** - -% READ FORMAT KEYS -\def\ReadFormatKeys#1{% - \!thx\def\!thx\!ttempa\!thx{\string #1}% - \!thx\def\!thx\!ttempb\!thx{\csname !tk<\!ttempa>\endcsname}% - \ifnum \TracingKeys>1 - \!tkReportKey - \fi - \!thx\ifx \!ttempb\relax - \!thx\!tkReplaceKey - \else - \!thx\!ttempb - \fi} - -% REPORT KEY -\def\!tkReportKey{% - \!taToksA\!thx{\!ttempa}% - \!thMessage{KEY: "\the\!taToksA"}} - -% REPLACE KEY -\def\!tkReplaceKey{% - \!taToksA\!thx{\!ttempa}% - \!thError {Undefined format key "\the\!taToksA"} - {\!thReadErrorMsg\!tkUndefined ^^J\!thReadErrorMsg\!tkBadKey} - \!tkReplaceKeyA} - -\def\!tkReplaceKeyA{% - \!thGetReplacement{\!thReadErrorMsg\!tkReplace}\!tkReplacement - \!thx\ReadFormatKeys\!tkReplacement} - -% ERROR MESSAGES FOR KEY RELACEMENT -\!thStoreErrorMsg\!tkUndefined{% - The format key in " "'s on the next to top line is undefined.} -\!thStoreErrorMsg\!tkBadKey{% - Type \space E \space to quit now, or - \space<CR> \space and respond to next prompt.} -\!thStoreErrorMsg\!tkReplace{% - Type \space<replacement key><CR> \space, - or simply \space<CR> \space to skip offending key:} - - -% **************************************************************** -% PRIMITIVE KEYS -% **************************************************************** - -% Key "b": b{TOKENS} adds TOKENS to the left of (before) the template -\NewFormatKey b#1{% - \!thx\!tkJoin\!thx{\the\!taDataColumnTemplate}{#1}% - \ReadFormatKeys} - -\def\!tkJoin#1#2{% - \!taDataColumnTemplate{#2#1}}% - -% Key "a": a{TOKENS} adds TOKENS to the right of (after) the template -\NewFormatKey a#1{% - \!taDataColumnTemplate\!thx{\the\!taDataColumnTemplate #1}% - \ReadFormatKeys} - -% Key "\{": Enclose template in braces. -\NewFormatKey \{{% - \!taDataColumnTemplate=\!thx{\!thx{\the\!taDataColumnTemplate}}% - \ReadFormatKeys} - -% Key "*": "*{N}{KEY LETTERS}" is equivalent to specifying -% <KEY LETTERS> N times. -% KEY LETTERS may contain further * specifications -\NewFormatKey *#1#2{% - \!taCountA=#1\relax - \!taToksA={}% - \!thLoop - \ifnum \!taCountA > 0 - \!taToksA\!thx{\the\!taToksA #2}% - \advance\!taCountA -1 - \repeat - \!thx\ReadFormatKeys\the\!taToksA} - - -% **************************************************************** -% POSITIONING KEYS -% **************************************************************** - -% Key "\LeftGlue": Specifies the glue (usually \hfil, or nothing) to be -% added to extreme left of the template to position a column -\NewFormatKey \LeftGlue#1{% - \!taLeftGlue{#1}% - \ReadFormatKeys} - -% Key "\RightGlue": Specifies the glue (usually \hfil, or nothing) to be -% added to the extreme right of the template to position a column -\NewFormatKey \RightGlue#1{% - \!taRightGlue{#1}% - \ReadFormatKeys} - -% Key "c": Centered column. -\NewFormatKey c{% - \ReadFormatKeys - \LeftGlue\hfil - \RightGlue\hfil} - -% Key "l": Left-adjusted column. -\NewFormatKey l{% - \ReadFormatKeys - \LeftGlue{} % In case more than one positioning key is specified. - \RightGlue\hfil} - -% Key "r": Right-adjusted column. -\NewFormatKey r{% - \ReadFormatKeys - \LeftGlue\hfil - \RightGlue{}} - -% Key "k": Adds kerns to left and right of "#" -% This key and the two below use Plain TeX's \if@h as if it were \if@left, -% and \if@v as if it were \if@right. Table making goes on in a group, -% so even in the unlikely circumstance that a \phantom is currently under -% construction, there's no problem. -\NewFormatKey k{% - \h@true - \v@true - \!tgGetValue{\!tgInsertKern}} - -% Key "i": Adds a kern to the left of "#" -\NewFormatKey i{% - \h@true - \v@false - \!tgGetValue{\!tgInsertKern}} - -% Key "j": Adds a kern to the right of "#" -\NewFormatKey j{% - \h@false - \v@true - \!tgGetValue{\!tgInsertKern}} - - -% **************************************************************** -% NUMERIC ITEM KEYS -% **************************************************************** - -% Key "n": numeric item , non-math mode. -\NewFormatKey n{% - \def\!tnStyle{}% - \futurelet\!tnext\!tnTestForBracket} - -% Key "N": numeric item, math mode. -\NewFormatKey N{% - \def\!tnStyle{$}% - \futurelet\!tnext\!tnTestForBracket} - - -% **************************************************************** -% ATTRIBUTE KEYS -% **************************************************************** - -% Key "m": Math mode. -\NewFormatKey m{% - \ReadFormatKeys b$ a$} - -% Key "M": Displaymath mode. -\NewFormatKey M{% - \ReadFormatKeys \{ b{$\displaystyle} a$} - -% Key "\m": Template ${}#\hfil$ -\NewFormatKey \m{% - \ReadFormatKeys l b{{}} m} - -% Key "\M": Template $\displaystyle{{}#\hfil}$ -\NewFormatKey \M{% - \ReadFormatKeys l b{{}} M} - -% Key "f": Set font (E.g., f\it sets up italic font (assuming \it -% has its usual meaning) -\NewFormatKey f#1{% - \ReadFormatKeys b{#1}} - -% Key "B": abbreviation for f\bf -\NewFormatKey B{% - \ReadFormatKeys f\bf} - -% Key "I": abbreviation for f\it -\NewFormatKey I{% - \ReadFormatKeys f\it} - -% Key "S": abbreviation for f\sl -\NewFormatKey S{% - \ReadFormatKeys f\sl} - -% Key "R": abbreviation for f\rm -\NewFormatKey R{% - \ReadFormatKeys f\rm} - -% Key "T": abbreviation for f\tt -\NewFormatKey T{% - \ReadFormatKeys f\tt} - -% Key "p": ParBox -\NewFormatKey p{% - \!tgGetValue{\!tgSetUpParBox}} - - -% **************************************************************** -% MINIMUM COLUMN WIDTH KEY -% **************************************************************** - -% Key "w": minimum column width -\NewFormatKey w{% - \!tkTestForBeginFormat w{\!tgGetValue{\!tfSetWidth}}} - - -% **************************************************************** -% TABSKIP KEYS -% **************************************************************** - -% Key "s": Set tabskip for the inter-column space to the right -% of the current column, and all subsequent spaces, until overriden -% by a new "s" or "o" key. -\NewFormatKey s{% - \!taOnceOnlyTabskipfalse % in case same column has a prior "o" key - \!tkTestForBeginFormat t{\!tgGetValue{\!tfSetTabskip}}} - -% Key "o": Apply the \tabskip stated for this column ONLY to the -% inter-column space just to the right of this column; restore the -% the previous \tabskip for subsequent columns. -\NewFormatKey o{% - \!taOnceOnlyTabskiptrue - \!tkTestForBeginFormat o{\!tgGetValue{\!tfSetTabskip}}} - - -% **************************************************************** -% RULE KEYS -% **************************************************************** - -% Key "|": Standard rule column designator -\NewFormatKey |{% - \!tkTestForBeginFormat |{\!tgGetValue{\!tfSetVrule}}} - -% Key "\|": Non-standard rule column designator -\NewFormatKey \|{% - \!tkTestForBeginFormat \|{\!tfSetAlternateVrule}} - - -% **************************************************************** -% END-OF-FORMAT KEYS -% **************************************************************** - -% Key ".": PERIOD -- end of \BeginFormat section. -\NewFormatKey .{% - \!tkTestForBeginFormat.{\!tfFinishFormat}} - -% Key "\EndFormat": Equivalent to "." -\NewFormatKey \EndFormat{% - \!tkTestForBeginFormat\EndFormat{\!tfFinishFormat}} - -% Key "]": End of \ReFormat section -\NewFormatKey ]{% - \!tkTestForReFormat ] \!tfEndReFormat} - - -% **************************************************************** -% VALIDITY CHECKS -% **************************************************************** - -% TEST FOR BEGIN FORMAT{<Key>}{Intended Action}: This test is run -% on keys that can only be used by \BeginFormat --- "s", "o", -% "|", "\|", "w", ".", and "\EndFormat". -\def\!tkTestForBeginFormat#1#2{% - \if!taBeginFormat - \def\!ttemp{#2}% - \!thx \!ttemp - \else - \toks0={#1}% - \toks2=\!thx{\string\ReFormat}% - \!thx \!tkImproperUse - \fi} - -% TEST FOR RE FORMAT{<Key>}{Intended Action}: This test is run -% on the key "]", which can only be used by \ReFormat. -\def\!tkTestForReFormat#1#2{% - \if!taBeginFormat - \toks0={#1}% - \toks2=\!thx{\string\BeginFormat}% - \!thx \!tkImproperUse - \else - \def\!ttemp{#2}% - \!thx \!ttemp - \fi} - -% IMPROPER USE OF KEY -\def\!tkImproperUse{% - \!thError{\!thReadErrorMsg\!tkBadUseA "\the\toks0 "}% - {\!thReadErrorMsg\!tkBadUseB \the\toks2 \space command. - ^^J\!thReadErrorMsg\!tkBadKey}% - \!tkReplaceKeyA} - -% ERROR MESSAGES FOR IMPROPER USE OF KEY -\!thStoreErrorMsg\!tkBadUseA{Improper use of key } -\!thStoreErrorMsg\!tkBadUseB{% - The key mentioned above can't be used in a } - - - -% ********************************************************************* -% SECTION n: NUMERIC -% ********************************************************************* - -% NOTE: THE SPACE BETWEEN A NUMERIC ENTRY AND THE FOLLOWING '|', '"', -% OR '\|' IS MANDATORY. -% EMPTY NUMERIC ENTRIES ARE NOT ALLOWED: USE '{}' OR '\omit' INSTEAD. - -% TEST FOR BRACKET: Invoked by the keys "n" and "N". -\def\!tnTestForBracket{% - \ifx [\!tnext - \!thx\!tnGetArgument - \else - \!thx\!tnGetCode - \fi} - -% GET CODE: E.g. "4", or "4.0", "0.4", or "10.2" -\def\!tnGetCode#1 {% NOTE THE BLANK - \!tnConvertCode #1..!} - -% CONVERT CODE: E.g. converts above to [0000], [0000.], [.0000], -% [0000000000.00] -\def\!tnConvertCode #1.#2.#3!{% - \begingroup - \aftergroup\edef \aftergroup\!ttemp \aftergroup{% - \aftergroup[% - \!taCountA #1 - \!thLoop - \ifnum \!taCountA>0 - \advance\!taCountA -1 - \aftergroup0 - \repeat - \def\!ttemp{#3}% - \ifx\!ttemp \empty - \else - \aftergroup. - \!taCountA #2 - \!thLoop - \ifnum \!taCountA>0 - \advance\!taCountA -1 - \aftergroup0 - \repeat - \fi - \aftergroup]\aftergroup}% - \endgroup\relax - \!thx\!tnGetArgument\!ttemp} - -% GET ARGUMENT: [<sample left field> <optional .<sample right field>> -\def\!tnGetArgument[#1]{% - \!tnMakeNumericTemplate\!tnStyle#1..!} - -% MAKE NUMERIC TEMPLATE -\def\!tnMakeNumericTemplate#1#2.#3.#4!{% #1=<empty> or $ - \def\!ttemp{#4}% - \ifx\!ttemp\empty - \!taDimenC=0pt - \else - \setbox0=\hbox{\m@th #1.#3#1}% - \!taDimenC=\wd0 - \fi - \setbox0 =\hbox{\m@th #1#2#1}% - \!thToksEdef\!taDataColumnTemplate={% - \noexpand\!tnSetNumericItem - {\the\wd0 }% - {\the\!taDimenC}% - {#1}% - \the\!taDataColumnTemplate} % Might have tabskip glue in here - \ReadFormatKeys} - -% SET NUMERIC ITEM -\def\!tnSetNumericItem #1#2#3#4 {% NOTE THE BLANK - \!tnSetNumericItemA {#1}{#2}{#3}#4..!} - -\def\!tnSetNumericItemA #1#2#3#4.#5.#6!{% - \def\!ttemp{#6}% - \hbox to #1{\hss \m@th #3#4#3}% - \hbox to #2{% - \ifx\!ttemp\empty - \else - \m@th #3.#5#3% - \fi - \hss}} - - - -% ********************************************************************* -% SECTION S: STRUTS -% ********************************************************************* - -% The following are in ALLOCATIONS - %\newdimen\StrutUnit (normal value \normalbaselineskip / 11) - %\newcount\StrutHeightFactor (normal value 8) - %\newcount\StrutDepthFactor (normal value 3) - -% MAKE STRUT OF SPECIFIED HEIGHT AND DIMENSION -% \MakeStrut <height><depth>; height and depth are <dimen>'s -\def\MakeStrut#1#2{% - \vrule width0pt height #1 depth #2} - -% STANDARD VERTICAL STRUT -% Makes a strut of height=StrutHeightFactor*StrutUnit -% depth =StrutDepthFactor *StrutUnit -\def\StandardTableStrut{% - \MakeStrut{\StrutHeightFactor\StrutUnit} - {\StrutDepthFactor\StrutUnit}} - - -% STANDARD VERTICAL STRUT, WITH EXTRA HEIGHT/DEPTH -% \AugmentedTableStrut<multiple for extra height><multiple for extra depth> -% makes a strut of height=(StrutHeightFactor+#1)*StrutUnit -% depth =(StrutDepthFactor+#2)*StrutUnit -\def\AugmentedTableStrut#1#2{% - \dimen@=\StrutHeightFactor\StrutUnit - \advance\dimen@ #1\StrutUnit - \dimen@ii=\StrutDepthFactor\StrutUnit - \advance\dimen@ii #2\StrutUnit - \MakeStrut{\dimen@}{\dimen@ii}} - - -% ENLARGE<extra height><extra depth><original> -% Enlarges "original" by extra height and extra depth. -% Extra height and extra depth are <dimen>'s. -% Works for various math styles, and takes into account -% \spacefactor in horizontal mode -\def\Enlarge#1#2{% 3rd argument is picked up later - % #1=extra height - % #2=extra depth - \!taDimenA=#1\relax - \!taDimenB=#2\relax - \let\!TsSpaceFactor=\empty - \ifmmode - \!thx \mathpalette - \!thx \!TsEnlargeMath - \else - \!thx \!TsEnlargeOther - \fi} - -\def\!TsEnlargeOther#1{% - \ifhmode - \setbox\z@=\hbox{#1% - \xdef\!TsSpaceFactor{\spacefactor=\the\spacefactor}}% - \else - \setbox\z@=\hbox{#1}% - \fi - \!TsFinishEnlarge} - -\def\!TsEnlargeMath#1#2{% - \setbox\z@=\hbox{$\m@th#1{#2}$}% - \!TsFinishEnlarge} - -\def\!TsFinishEnlarge{% - \dimen@=\ht\z@ - \advance \dimen@ \!taDimenA - \ht\z@=\dimen@ - \dimen@=\dp\z@ - \advance \dimen@ \!taDimenB - \dp\z@=\dimen@ - \box\z@ \!TsSpaceFactor{}} - - -% ENLARGE BY MULTIPLES OF StrutUnit -% \enlarge<multiple for extra height><multiple for extra depth><original> -% Enlarges by (multiple for extra heigth)*StrutUnit -% and (multiple for extra depth) *StrutUnit -\def\enlarge#1#2{% 3rd argument is picked up later - \Enlarge{#1\StrutUnit}{#2\StrutUnit}} - - -% OPENUP#1#2: increases strut height and depth factors by #1 and #2. -\def\OpenUp#1#2{% - \advance \StrutHeightFactor #1\relax - \advance \StrutDepthFactor #2\relax} - - - -% ********************************************************************* -% SECTION T: TABLES -% ********************************************************************* - -% Table-making is initiated by \BeginTable. After processing that -% command, TeX absorbs the instructions in the prologue to the table -% until it gets to \BeginFormat. \BeginFormat sets up the preamble -% for the \halign that will be used to create the table. \EndFormat -% initiates the \halign-ment, which is terminated by \EndTable. - - -% ********************************************************************* -% BEGIN TABLE, (DO HALIGN), END TABLE -% ********************************************************************* -% BEGIN TABLE -\def\BeginTable{% - \futurelet\!tnext\!ttBeginTable} - -\def\!ttBeginTable{% - \ifx [\!tnext - \def\!tnext{\!ttBeginTableA}% - \else - \def\!tnext{\!ttBeginTableA[c]}% - \fi - \!tnext} - -\def\!ttBeginTableA[#1]{% - \if #1u% % "unboxed" table - \ifmmode - \def\!ttEndTable{% % user had better be in display math mode - \relax}% % and have only one table at the outer level - \else % user had better be in vertical mode - \bgroup - \def\!ttEndTable{% - \egroup}% - \fi - \else - \hbox\bgroup $ - \def\!ttEndTable{% - \egroup % for the \vtop, \vbox, or \vcenter, yet to come - $% for math mode - \egroup}% for the \hbox - \if #1t% - \vtop - \else - \if #1b% - \vbox - \else - \vcenter % math mode was essential for this - \fi - \fi - \bgroup % for the \vtop, \vbox, or \vcenter - \fi - \advance\!taRecursionLevel 1 % RecursionLevel governs initialization - \let\!ttRightGlue=\relax % This may be changed by \JustCenter, etc - \everycr={} - \ifnum \!taRecursionLevel=1 - \!ttInitializeTable - \fi} - -% INITIALIZE TABLE -\bgroup - \catcode`\|=13 - \catcode`\"=13 - \catcode`\~=13 - \gdef\!ttInitializeTable{% - \let\!ttTie=~ % Meanings of ~ and \- are - \let\!ttDH=\- % restored by \BeginTableParBox - \catcode`\|=\active - \catcode`\"=\active - \catcode`\~=\active - \def |{\unskip\!ttRightGlue&&}% Use rule-column template - \def\|{\unskip\!ttRightGlue&\omit\!ttAlternateVrule}% - % Override rule-column template - \def"{\unskip\!ttRightGlue&\omit&}% Omit rule-column template - \def~{\kern .5em}% ~ now has the width of a digit - \def\\{\!ttEndOfRow}% - \def\-{\!ttShortHrule}% - \def\={\!ttLongHrule}% - \def\_{\!ttFullHrule}% - \def\Left##1{##1\hfill\null}% \null prevents \unskip from - \def\Center##1{\hfill##1\hfill\null}% killing the \hfill - \def\Right##1{\hfill##1}% - \def\use{\!ttuse}% - \def\Use{\!ttUse}% - \the\EveryTable} -\egroup - -\let\!ttRightGlue=\relax % This may be changed, in a group, by - % \JustCenter, etc - -% DO HALIGN: Invoked by END FORMAT (or the key ".") -\def\!ttDoHalign{% - \baselineskip=0pt \lineskiplimit=0pt \lineskip=0pt % - \tabskip=0pt - \halign \the\!taTableSpread \bgroup - \span\the\!taPreamble - \ifx \!tfRowOfWidths \empty - \else - \!tfRowOfWidths \cr % - \fi} - -% END TABLE -\def\EndTable{% - \egroup % finishes the \halign - \!ttEndTable}% closes off the table envirnoment set up by \BeginTable - - -% ********************************************************************* -% END OF ROW PROCESSING -% ********************************************************************* - -% END OF ROW: When followed by -% 0, inserts no strut -% +, inserts an AugmentedTableStrut (with <x-height> and <x-depth> -% as arguments -% anything else, inserts a StandardTableStrut, -% and finished off the row with a \cr. -\def\!ttEndOfRow{% - \futurelet\!tnext\!ttTestForBlank} - -% TEST FOR BLANK -\def\!ttTestForBlank{% -% \!thMessage{At Test For Blank: \meaning\!tnext} - \ifx \!tnext\!thSpaceToken % the "usual" case - \!thx\!ttDoStandard - \else - \!thx\!ttTestForZero - \fi} - -% TEST FOR ZERO -\def\!ttTestForZero{% - \ifx 0\!tnext - \!thx \!ttDoZero - \else - \!thx \!ttTestForPlus - \fi} - -% TEST FOR PLUS -\def\!ttTestForPlus{% - \ifx +\!tnext - \!thx \!ttDoPlus - \else - \!thx \!ttDoStandard - \fi} - -% DO ZERO: No strut -\def\!ttDoZero#1{% #1 eats the 0 - \cr} - -% DO PLUS: Insert "Extra" strut; #2=extra height, #3=extra depth, both -% as integers (units of \StrutUnit) -\def\!ttDoPlus#1#2#3{% #1 eats the + - \AugmentedTableStrut{#2}{#3}% - \cr} - -% DO STANDARD: Insert standard table strut -\def\!ttDoStandard{% - \StandardTableStrut - \cr} - - -% ********************************************************************* -% ALTERNATE VRULES -% ********************************************************************* - -% A '\|' can appear in a rule-column in place of a '|', '"', or '&'. - -% If '\|' is immediately followed by a blank, a string of digits, or -% (...) [... had better be a <dimen>], a \vrule is placed in the -% rule column; the thickness of the \vrule follows TABLE's usual -% conventions. Be sure to put a blank after a string of digits. - -% If '\|' is immediately followed by a '*', a user-specified default -% "pseudo"-rule is placed in the rule column. This P.R. is specified -% by the parameterless macro \PseudoVrule. For example, -% to place a "double rule" into a rule column, you could make the definition -% \def\PseudoVrule{\hfil\vrule \hskip1pt \vrule\hfil} - -% If none of the above cases applies, a non-space token follows '\|': -% that token is placed in the rule-column. To put a '*' in a -% rule-column, enter '\|{*}'. '\|\PseudoVrule' has the same effect -% as '\|*'. - -% ALTERNATE VRULE -\def\!ttAlternateVrule{% - \!tgGetValue{\!ttAVTestForCode}} % AV == Alternate Vrule - -% TEST FOR CODE (2) -\def\!ttAVTestForCode{% - \ifnum \!tgCode=2 % (...) follows "\|" - \!thx\!ttInsertVrule % \InsertVrule ends with "&" - \else - \!thx\!ttAVTestForEmpty - \fi} - -% TEST FOR EMPTY (VALUE) -\def\!ttAVTestForEmpty{% - \ifx \!tgValue\empty % non-digit after "\|" - \!thx\!ttAVTestForBlank - \else - \!thx\!ttInsertVrule % integer after "\|" - \fi} - -% TEST FOR BLANK -\def\!ttAVTestForBlank{% - \ifx \!ttemp\!thSpaceToken % blank after "\|" - \!thx\!ttInsertVrule - \else - \!thx\!ttAVTestForStar - \fi} - -% TEST FOR STAR -\def\!ttAVTestForStar{% - \ifx *\!ttemp % "*" after "\|" - \!thx\!ttInsertDefaultPR % PR == pseudo-rule - \else - \!thx\!ttGetPseudoVrule % "Anything else" after "\|" - \fi} - -% INSERT VRULE -\def\!ttInsertVrule{% - \hfil - \vrule \!thWidth - \ifnum \!tgCode=1 - \ifx \!tgValue\empty - \LineThicknessFactor - \else - \!tgValue - \fi - \LineThicknessUnit - \else - \!tgValue - \fi - \hfil - &} - -% INSERT DEFAULT PSEUDO-RULE -\def\!ttInsertDefaultPR*{% - \PseudoVrule % User-specified default pseudo-rule - &} - -% GET PSEUDO-RULE -\def\!ttGetPseudoVrule#1{% - \toks0={#1}% - #1&} - -% DEFAULT PSEUDO-RULE -\def\PseudoVrule{} - - -% ********************************************************************* -% USE: Version of \multispan for rule-&-column tables -% ********************************************************************* - -% USE -% \use <number> spans the next <number> data columns. -\def\!ttuse#1{% - \ifnum #1>\@ne - \omit - \mscount=#1 % \mscount is in Plain - \advance\mscount by \m@ne - \advance\mscount by \mscount - \!thLoop - \ifnum\mscount>\@ne - \sp@n % from Plain (\span\omit \advance\mscount\m@ne) - \repeat - \span - \fi} - -\def\!ttUse#1[{% - \!ttuse{#1}% - \ReFormat[} - - -% ********************************************************************* -% HRULES -% ********************************************************************* - -% FULL HORIZONTAL RULE: Draws a rule across the table, -% using \noalign{\hrule} -\def\!ttFullHrule{% - \noalign - \bgroup - \!tgGetValue{\!ttFullHruleA}} - -\def\!ttFullHruleA{% - \!ttGetHalfRuleThickness % Sets \dimen0 to half of specified thickness - \hrule \!thHeight \dimen0 \!thDepth \dimen0 - \penalty0 % so can break an ``unboxed'' table after a horizontal rule. - \egroup} % ends the \noalign - -% SHORT HORIZONTAL RULE: Draws a rule across 1 (or more) columns, -% using \leaders; this rule doesn't extend across the neighboring -% tabskip glues to join up with adjacent rule columns. By contrast -% the LONG HORIZONTAL RULE below does just that. -\def\!ttShortHrule{% - \omit - \!tgGetValue{\!ttShortHruleA}} - -\def\!ttShortHruleA{% - \!ttGetHalfRuleThickness % Sets \dimen0 to half of specified thickness - \leaders \hrule \!thHeight \dimen0 \!thDepth \dimen0 \hfill - \null % prevents an \unskip from annihilating the \leaders - \ignorespaces} - -% LONG HORIZONTAL RULE: This rule requires special coding. -% It must be preceded and followed by '&', instead of the usual -% '|' or '"'. However, '\_' can follow '\use' in the usual manner. -% And in fact, to insert long-rules in two or more contiguous columns, -% '\use' MUST be used with an argument = total number of columns involved. -\def\!ttLongHrule{% - \omit\span\omit\span \!ttShortHrule} - -% GET RULE THICKNESS -\def\!ttGetHalfRuleThickness{% - \dimen0 = - \ifnum \!tgCode=1 - \ifx \!tgValue\empty - \LineThicknessFactor - \else - \!tgValue % user-specified integer - \fi - \LineThicknessUnit - \else - \!tgValue % user-specified dimension - \fi - \divide\dimen0 2 } - - -% ********************************************************************* -% STRETCHING AND SHRINKING A TABLE -% ********************************************************************* - -% SET TABLE TO WIDTH <dimen> -\def\SetTableToWidth#1{% - \!taTableSpread={to #1}} - -% WIDEN TABLE BY <dimen> -\def\WidenTableBy#1{% - \ifdim #1=0pt - \!taTableSpread={}% - \else - \!taTableSpread={spread #1}% - \fi} - -\def\Expand{% - \SetTableToWidth{\hsize}}% - -\def\LongLines{% - \LeftTabskip =0pt plus 1fill - \RightTabskip=\LeftTabskip - \Expand} - - -% ********************************************************************* -% REPOSITIONING COMMANDS (\JUSTLEFT, etc.) -% ********************************************************************* - -\def\JustLeft{% - \omit \let\!ttRightGlue=\hfill} -\def\JustCenter{% - \omit \hfill\null \let\!ttRightGlue=\hfill} -\def\JustRight{% - \omit \hfill\null} - - -% ********************************************************************* -% Restore meaning of \\, and reset category codes -% ********************************************************************* -\let\\=\!tacr -\catcode`\!=12 -\catcode`\@=12 - - +% TABLE 1.0
+% Copyright Michael J. Wichura August 1988
+
+%% The following three lines were inserted by C.E.K. of Personal TeX on 9-6-89
+%% \input nine
+%% \input eight
+%% \font\csc=cmcsc10
+
+
+
+% The TABLE macros are divided into sections, roughly according to
+% function:
+
+% Section Name Function
+% a Allocation Allocates storage registers for parameters.
+% f Format Reads format section; builds preamble for \halign;
+% processes \ReFormat command.
+% g Get Value Converts "spec"'s (as in spec_{LT}) to
+% corresponding "values"'s (as in value_{LT}).
+% h Hacks Utility macros; error messages; miscellaneous commands.
+% k Keys Definition and scanning of format keys.
+% n Numeric Macros for TABLE's numeric format.
+% s Struts Macros for struts.
+% t Tables Sets up \halign for table; end-of-row processing;
+% alternate vertical rules; spanning; horizontal
+% lines; stretching and shrinking; repositioning
+% commands.
+
+% The name of each internal macro begins with the prefix "\!t", the
+% "!" having category code 11, followed by the letter of the section
+% in which the macro is defined. For example, a macro beginning "\!th"
+% is defined in Section h (Hacks). There a few exceptions:
+% the general purpose macros "\!ttemp", "\!ttempa", "\!ttempb", and
+% "\!tnext" are repeatedly defined on the spot as the need arises.
+
+% External macros (and active characters) are defined in the following
+% sections:
+% Macro Section
+% " t
+% \- t
+% \= t
+% \ActivateBarAndQuote h
+% \AugmentedTableStrut s
+% \BackSpace h
+% \BeginFormat f
+% \BeginTable t
+% \BeginTableParBox a
+% \Center t
+% \ColumnWidthFactor a
+% \ColumnWidthUnit a
+% \DQuote h
+% \EndFormat k (\EndFormat is actually a key)
+% \EndTable t
+% \EndTableParBox a
+% \Enlarge s
+% \enlarge s
+% \EveryTable a
+% \EveryTableParBox a
+% \Expand t
+% \InterColumnSpaceFactor a
+% \InterColumnSpaceUnit a
+% \JustCenter t
+% \JustLeft t
+% \JustRight t
+% \KernFactor a
+% \KernUnit a
+% \Left t
+% \LeftTabskip a
+% \LineThicknessFactor a
+% \LineThicknessUnit a
+% \LongLines t
+% \Lower h
+% \MakeStrut s
+% \NewFormatKey k
+% \NormalCWU a
+% \NormalICSU a
+% \NormalKU a
+% \NormalLTU a
+% \NormalSU a
+% \NormalTableUnits a
+% \OpenUp s
+% \PseudoVrule t
+% \Raise h
+% \ReadFormatKeys k
+% \ReFormat f
+% \Right t
+% \RightTabskip a
+% \SetTableToWidth t
+% \Smash h
+% \StandardTableStrut s
+% \StrutDepthFactor a
+% \StrutHeightFactor a
+% \StrutUnit a
+% \TaBlE h
+% \TracingFormats a
+% \TracingKeys a
+% \Use t
+% \use t
+% \VBar h
+% \Vspace h
+% \VspaceFactor a
+% \WidenTableBy t
+% \\ t
+% \_ t
+% \| t
+% | t
+% ~ t
+%
+\catcode `\!=11
+\catcode `\@=11
+
+% Don't try to read the TABLE macros until after you've read the
+% TABLE manual. The internal documentation of the macros is
+% sketchy; you need the manual to understand what's going on.
+% You should also review the material on \halign s in the TeXbook,
+% since TABLE uses an \halign to perform its alignments.
+
+% In studying the TABLE macros, you should start by skimming the
+% macros in the "miscellaneous hacks", "error messages", and "loops"
+% subsections of Section h, as well as the "\GetValue" macro in
+% Section g; these macros are called many times by the other macros.
+% To continue with a "bottom-up" approach, read next Sections k,
+% f, and t. (Top-downers should reverse the order.) The other
+% Sections can be looked at as the need arises.
+
+
+
+% *********************************************************************
+% SECTION A: ALLOCATION
+% *********************************************************************
+
+\let\!tacr=\\ % Save meaning of \\ (Needed if TABLE is used with LaTeX
+
+% *********************************************************************
+% TABLE PARAMETERS: Units
+% *********************************************************************
+
+\newdimen\LineThicknessUnit
+\newdimen\StrutUnit
+\newskip \InterColumnSpaceUnit
+\newdimen\ColumnWidthUnit
+\newdimen\KernUnit
+
+\let\!taLTU=\LineThicknessUnit % Used in preamble
+\let\!taCWU=\ColumnWidthUnit % Used in preamble
+\let\!taKU =\KernUnit % Used in preamble
+
+\newtoks\NormalTLTU
+\newtoks\NormalTSU
+\newtoks\NormalTICSU
+\newtoks\NormalTCWU
+\newtoks\NormalTKU
+
+% NOTE: The user should modify the following DEFAULTS to suit his/her
+% taste, and output device:
+%\def\PixelsPerInch{300}
+\NormalTLTU={1in \divide \LineThicknessUnit by 300 }
+\NormalTSU ={\normalbaselineskip
+ \divide \StrutUnit by 11 } % 11 = 8+3 = NormalT Height+Depth Factors
+\NormalTICSU={.5em plus 1fil minus .25em} % .5em = width of a digit
+\NormalTCWU ={.5em}
+\NormalTKU ={.5em}
+
+\def\NormalTableUnits{%
+ \LineThicknessUnit =\the\NormalTLTU
+ \StrutUnit =\the\NormalTSU
+ \InterColumnSpaceUnit=\the\NormalTICSU
+ \ColumnWidthUnit =\the\NormalTCWU
+ \KernUnit =\the\NormalTKU}
+
+\NormalTableUnits
+
+% The user should issue \NormalTableUnits when setting a table
+% in a different point size, since the Table...Units themselves
+% are static while the Normal...Units vary with the point size.
+
+
+% *********************************************************************
+% TABLE PARAMETERS: Factors
+% *********************************************************************
+
+\newcount\LineThicknessFactor
+\newcount\StrutHeightFactor
+\newcount\StrutDepthFactor
+\newcount\InterColumnSpaceFactor
+\newcount\ColumnWidthFactor
+\newcount\KernFactor
+\newcount\VspaceFactor
+
+% DEFAULTS:
+\LineThicknessFactor =2
+\StrutHeightFactor =8
+\StrutDepthFactor =3
+\InterColumnSpaceFactor =3
+\ColumnWidthFactor =10
+\KernFactor =1
+\VspaceFactor =2
+
+
+% *********************************************************************
+% DIAGNOSTIC PARAMETERS
+% *********************************************************************
+
+\newcount\TracingKeys % >=1 reports new keys, >=2 reports key usage
+\newcount\TracingFormats % >=1 reports templates for columns
+ % >=2 reports \halign preamble
+
+
+% *********************************************************************
+% PARBLOCK PARAMETERS
+% *********************************************************************
+
+\def\BeginTableParBox#1{%
+ \vtop\bgroup
+ \hsize=#1
+ \normalbaselines
+ \let~=\!ttTie
+ \let\-=\!ttDH
+ \the\EveryTableParBox}
+
+\def\EndTableParBox{%
+ \MakeStrut{0pt}{\StrutDepthFactor\StrutUnit}
+ \egroup} % finishes the \vtop begun by \BeginTableParbox
+
+\newtoks\EveryTableParBox
+\EveryTableParBox={%
+ \parindent=0pt
+ \raggedright
+ \rightskip=0pt plus 4em % Provide more stretch
+ \relax}
+
+
+% *********************************************************************
+% EVERY TABLE TOKENS
+% *********************************************************************
+
+\newtoks\EveryTable
+\newtoks\!taTableSpread
+
+
+% *********************************************************************
+% Extreme left- and right- tabskips
+% *********************************************************************
+
+\newskip\LeftTabskip
+\newskip\RightTabskip
+
+
+% *********************************************************************
+% INTERNAL VARIABLES
+% *********************************************************************
+
+\newcount\!taCountA
+\newcount\!taColumnNumber
+\newcount\!taRecursionLevel % (Initially 0)
+
+\newdimen\!taDimenA % used by \Enlarge
+\newdimen\!taDimenB % used by \Enlarge
+\newdimen\!taDimenC % used by numeric.tex
+\newdimen\!taMinimumColumnWidth
+
+\newtoks\!taToksA
+
+\newtoks\!taPreamble
+\newtoks\!taDataColumnTemplate
+\newtoks\!taRuleColumnTemplate
+\newtoks\!taOldRuleColumnTemplate
+\newtoks\!taLeftGlue
+\newtoks\!taRightGlue
+
+\newskip\!taLastRegularTabskip
+
+\newif\if!taDigit
+\newif\if!taBeginFormat
+\newif\if!taOnceOnlyTabskip
+
+
+
+% *********************************************************************
+% SECTION H: HACKS
+% *********************************************************************
+
+% ****************************************************************
+% TABLE LOGO
+% ****************************************************************
+\def\TaBlE{%
+ T\kern-.27em\lower.5ex\hbox{A}\kern-.18em B\kern-.1em
+ \lower.5ex\hbox{L}\kern-.075em E}
+
+
+% ****************************************************************
+% ACTIVE CHARACTERS
+% ****************************************************************
+
+% ACTIVATE BAR AND QUOTE: Makes | and " active if they aren't
+% already active (in which case the user will probably have given
+% them special meanings); definitions are provided which effectively
+% undoes the activeness outside a Table.
+
+{\catcode`\|=13 \catcode`\"=13
+ \gdef\ActivateBarAndQuote{%
+ \ifnum \catcode`\|=13
+ \else
+ \catcode`\|=13
+ \def|{%
+ \ifmmode
+ \vert
+ \else
+ \char`\|
+ \fi}%
+ \fi
+ \ifnum \catcode`\"=13
+ \else
+ \catcode`\"=13
+ \def"{\char`\"}%
+ \fi}}
+
+% ****************************************************************
+% Macros for | and " having category code 12.
+% ****************************************************************
+{\catcode `\|=12 \catcode `\"=12
+\gdef\VBar{|}
+\gdef\DQuote{"}}
+
+
+% ****************************************************************
+% MISCELANEOUS HACKS
+% ****************************************************************
+
+% MESSAGE <Message>: Writes out <Message> to terminal and log file.
+\def\!thMessage#1{\immediate\write16{#1}\ignorespaces}
+
+% X: Abbreviation for expandafter
+\let\!thx=\expandafter
+
+% GOBBLE: Eats next token
+\def\!thGobble#1{}
+
+% SPACE TOKEN
+\def\\{\let\!thSpaceToken= }\\
+
+% HEIGHT, DEPTH, AND WIDTH
+\def\!thHeight{height}
+\def\!thDepth{depth}
+\def\!thWidth{width}
+
+% TOKSEDEF <token register>=<replacement text>: Places <replacement
+% text>, fully expanded a la \edef, in the specified <token register>.
+\def\!thToksEdef#1=#2{%
+ \edef\!ttemp{#2}%
+ #1\!thx{\!ttemp}%
+ \ignorespaces}
+
+
+% ****************************************************************
+% ERROR MESSAGES
+% ****************************************************************
+
+% STORE ERROR MSG <Control Sequence> <Message>
+% Replacement text of <Control Sequence> is a macro with Message
+% as its name. E.g., after \StoreErrorMsg\Help{Type <CR>},
+% \Help expands to "\Type <CR>"
+\def\!thStoreErrorMsg#1#2{%
+ \toks0 =\!thx{\csname #2\endcsname}%
+ \edef#1{\the\toks0 }}
+
+% READ ERROR MSG <Control sequence>
+% Continuing the above example, \ReadErrorMsg\Help produces "Type <CR>"
+\def\!thReadErrorMsg#1{%
+ \!thx\!thx\!thx\!thGobble\!thx\string #1}
+
+% ERROR <Error Message> <Error Help>
+\def\!thError#1#2{%
+ \begingroup
+ \newlinechar=`\^^J%
+ \edef\!ttemp{#2}%
+ \errhelp=\!thx{\!ttemp}%
+ \!thMessage{%
+ ^^J\!thReadErrorMsg\!thErrorMsgA
+ ^^J\!thReadErrorMsg\!thErrorMsgB}%
+ \errmessage{#1}%
+ \endgroup}
+
+% TEXT FOR ERROR MESSAGE
+\!thStoreErrorMsg\!thErrorMsgA{%
+ TABLE error; see manual for explanation.}
+\!thStoreErrorMsg\!thErrorMsgB{%
+ Type \space H <return> \space for immediate help.}
+
+% GET REPLACEMENT <Prompt Message> <Replacement Value>
+% <Replacement Vale> must be a control sequence
+\def\!thGetReplacement#1#2{%
+ \begingroup
+ \!thMessage{#1}
+ \endlinechar=-1
+ \global\read16 to#2%
+ \endgroup}
+
+
+% ****************************************************************
+% LOOP MACRO
+% ****************************************************************
+
+% LOOP ... REPEAT macro from TUGboat Vol 8 #2: 1987
+% Syntax is like that of plain TeX's \loop ... \repeat macro
+\def\!thLoop#1\repeat{%
+ \def\!thIterate{%
+ #1%
+ \!thx \!thIterate
+ \fi}%
+ \!thIterate
+ \let\!thIterate\relax}
+
+
+% ***************************************************************
+% VERTICALLY-CENTERED SMASH
+% ***************************************************************
+
+% SMASH: Like TeX's \smash, only the argument
+% is centered vertically before its height and depth are smashed to 0pt.
+\def\Smash{%
+ \relax
+ \ifmmode
+ \expandafter\mathpalette
+ \expandafter\!thDoMathVCS
+ \else
+ \expandafter\!thDoVCS
+ \fi}
+
+% DO VCS
+\def\!thDoVCS#1{%
+ \setbox\z@\hbox{#1}%
+ \!thFinishVCS}
+
+% DO MATH VCS
+\def\!thDoMathVCS#1#2{%
+ \setbox\z@\hbox{$\m@th#1{#2}$}%
+ \!thFinishVCS}
+
+% FINISH VCS
+\def\!thFinishVCS{%
+ \vbox to\z@{\vss\box\z@\vss}}
+
+
+% ***************************************************************
+% RAISE AND LOWER
+% ***************************************************************
+
+% Like TeX's \raise and \lower, except: (1) The first argument
+% to these commands is a dimension expressed in TABLE's usual conventions;
+% the default is (StrutHeightFactor+StrutDepthFactor)*StrutUnit/2
+% (2) like \smash, these commands function in math mode as well
+% as horizontal mode; (3) again like \smash, the result is declared
+% to have height and depth 0pt
+
+% Examples \Raise2{Stuff}: "Stuff" is raised 2*StrutUnit
+% \Raise {Stuff}: "Stuff" is raised a half-line
+% $\Lower(10pt){\alpha}$: "$\alpha$" is lowered 10 points
+
+% RAISE
+\def\Raise{%
+ \def\!thSign{+}%
+ \!tgGetValue\!thSetDimen}
+
+% LOWER
+\def\Lower{%
+ \def\!thSign{-}%
+ \!tgGetValue\!thSetDimen}
+
+% SET DIMEN
+\def\!thSetDimen{%
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \!taDimenA \StrutHeightFactor\StrutUnit
+ \advance \!taDimenA \StrutDepthFactor\StrutUnit
+ \divide \!taDimenA 2
+ \else
+ \!taDimenA \!tgValue\StrutUnit
+ \fi
+ \else
+ \!taDimenA \!tgValue
+ \fi
+ \!taDimenA=\!thSign\!taDimenA\relax
+ %
+ % BRANCH ON MODE
+ \ifmmode
+ \expandafter\mathpalette
+ \expandafter\!thDoMathRaise
+ \else
+ \expandafter\!thDoSimpleRaise
+ \fi}
+
+% DO SIMPLE RAISE
+\def\!thDoSimpleRaise#1{%
+ \setbox\z@\hbox{\raise \!taDimenA\hbox{#1}}%
+ \!thFinishRaise} % From Plain TeX: \ht0=0pt \dp0=0pt \box0
+
+% DO MATH RAISE
+\def\!thDoMathRaise#1#2{%
+ \setbox\z@\hbox{\raise \!taDimenA\hbox{$\m@th#1{#2}$}}%
+ \!thFinishRaise}
+
+% FINISH RAISE. This is the same as Plain's \finsm@sh; some macro
+% packages redefine \finsm@sh.
+\def\!thFinishRaise{%
+ \ht\z@\z@
+ \dp\z@\z@
+ \box\z@}
+
+
+% ***************************************************************
+% BACK SPACE
+% ***************************************************************
+\def\BackSpace{%
+ \!tgGetValue\!thKernBack}
+
+\def\!thKernBack{%
+ \kern -
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\KernFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \KernUnit
+ \else
+ \!tgValue % user-specified dimension
+ \fi
+ \ignorespaces}%
+
+
+% ***************************************************************
+% Vspace
+% ***************************************************************
+\def\Vspace{%
+ \noalign
+ \bgroup
+ \!tgGetValue\!thVspace}
+
+\def\!thVspace{%
+ \vskip
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\VspaceFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \StrutUnit
+ \else
+ \!tgValue % user-specified skip
+ \fi
+ \egroup} % Ends the \noalign
+
+% *********************************************************************
+% SECTION F: FORMAT
+% *********************************************************************
+
+% As explained in Section 3.3 of the manual, TABLE alternates each
+% of the user's "data" columns with a "rule" column; moreover, TABLE
+% places a "dummy data" column at the left and right of a table.
+% A table with n nominal data columns therefore actually has a
+% total of
+% n (nominal data columns)
+% +(n+1) (rule columns)
+% + 2 (dummy data columns)
+% ____
+% 2n+3
+% columns.
+
+% FORMATs job is to create an \halign preamble for the alignment
+% of these (2n+3) columns. The preamble consists of templates
+% for the various columns, strung together with &'s and interlaced
+% with \tabskip glue specifications.
+
+% FORMAT constructs the template for a nomimal data column according
+% to the user-specified format keys. As the keys are read from left
+% to right, the template is built up "from the inside out" (as
+% illustrated in Section 3.1.9 of the manual), the inner-most part
+% being the "#" sign. A "|" in the format terminates template
+% building; the completed template is adjoined to preamble along
+% with the template for the following rule column.
+
+% Minimum column widths, if specified, are implemented by creating
+% an "artificial row" with data entries of the form
+% \hskip <minimum column width>.
+% This row has zero height and depth and is completely invisible.
+
+
+% BEGIN FORMAT
+\def\BeginFormat{%
+ \catcode`\|=12 % Inhibit expansion if | immediately follows a <number>
+ \catcode`\"=12 % read by \getvalue.
+ \!taPreamble={}%
+ \!taColumnNumber=0
+ \skip0 =\InterColumnSpaceUnit
+ \multiply\skip0 \InterColumnSpaceFactor
+ \divide\skip0 2
+ \!taRuleColumnTemplate=\!thx{%
+ \!thx\tabskip\the\skip0 }%
+ \!taLastRegularTabskip=\skip0
+ \!taOnceOnlyTabskipfalse
+ \!taBeginFormattrue % Used to intercept key "]"
+ \def\!tfRowOfWidths{}% Artificial Table Row with horizontal struts
+ % to enforce specified minimum column widths
+ \ReadFormatKeys}
+
+% SET (MINIMUM COLUMN) WIDTH: Invoked by the key "w".
+\def\!tfSetWidth{%
+ \ifx \!tfRowOfWidths \empty % true if no prior "w" keys
+ \ifnum \!taColumnNumber>0 % true if "w" key is to right of first "|"
+ \begingroup % RowOfWidths={&\omit || n copies of
+ % &\omit&\omit}, where n = number of columns
+ \!taCountA=1 % to the left of this one
+ \aftergroup \edef \aftergroup \!tfRowOfWidths \aftergroup {%
+ \aftergroup &\aftergroup \omit
+ \!thLoop
+ \ifnum \!taCountA<\!taColumnNumber
+ \advance\!taCountA 1
+ \aftergroup \!tfAOAO
+ \repeat
+ \aftergroup }%
+ \endgroup
+ \fi
+ \fi
+ \ifx [\!ttemp % \!tgGetValue sets \!ttemp = token after w
+ \!thx\!tfSetWidthText
+ \else
+ \!thx\!tfSetWidthValue
+ \fi}
+
+% AOAO = (Apersand Omit Ampersand Omit)
+\def\!tfAOAO{%
+ &\omit&\omit}
+
+% SET WIDTH TEXT
+\def\!tfSetWidthText [#1]{% #1 = specified text
+ \def\!tfWidthText{#1}%
+ \ReadFormatKeys}
+
+% SET WIDTH VALUE
+\def\!tfSetWidthValue{%
+ \!taMinimumColumnWidth =
+ \ifnum \!tgCode=1
+ \ifx\!tgValue\empty % Use default multiplier if user didn't specify one
+ \ColumnWidthFactor
+ \else
+ \!tgValue
+ \fi
+ \ColumnWidthUnit
+ \else
+ \!tgValue
+ \fi
+ \def\!tfWidthText{}% Override possible prior `w[sample entry]'
+ \ReadFormatKeys}
+
+
+% SET TABSKIP: Invoked by the tabskip keys "t" and "o"
+\def\!tfSetTabskip{%
+ \ifnum \!tgCode=1
+ \skip0 =\InterColumnSpaceUnit
+ \multiply\skip0
+ \ifx \!tgValue\empty
+ \InterColumnSpaceFactor % Default integer
+ \else
+ \!tgValue % User-specified integer
+ \fi
+ \else
+ \skip0 =\!tgValue % User-specified <skip>
+ \fi
+ \divide\skip0 by 2
+ \ifnum\!taColumnNumber=0
+ \!thToksEdef\!taRuleColumnTemplate={%
+ \the\!taRuleColumnTemplate
+ \tabskip \the\skip0 }
+ \else
+ \!thToksEdef\!taDataColumnTemplate={%
+ \the\!taDataColumnTemplate
+ \tabskip \the\skip0 }
+ \fi
+ \if!taOnceOnlyTabskip
+ % % Tabskip used at right of this col only
+ \else
+ \!taLastRegularTabskip=\skip0 % Remember this Tabskip, for possible
+ \fi % restoration after a subsequent"OnceOnly"
+ \ReadFormatKeys}
+
+
+% SET VRULE: Invoked by the key "|"
+\def\!tfSetVrule{%
+ \!thToksEdef\!taRuleColumnTemplate={%
+ \noexpand\hfil
+ \noexpand\vrule
+ \noexpand\!thWidth
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\LineThicknessFactor % Default integer
+ \else
+ \!tgValue % User-specified integer
+ \fi
+ \!taLTU % \LineThicknessUnit
+ \else
+ \!tgValue % User-specified dimension
+ \fi
+ ####%
+ \noexpand\hfil
+ \the\!taRuleColumnTemplate} % has \tabskips, when column number=0
+ \!tfAdjoinPriorColumn}
+
+% SET ALTERNATE VRULE: Invoked by the key "\|", in the form
+% \|{<template for (rule) column>}. The "{" and "}" are mandatory,
+% and the <template for column> must contain a "#". The key system
+% CAN'T be used to set up this template. The <template> can have the
+% form "\span\macro".
+\def\!tfSetAlternateVrule{%
+ \afterassignment\!tfSetAlternateA
+ \toks0 =} % Put template into \toks0
+
+\def\!tfSetAlternateA{%
+ \!thToksEdef\!taRuleColumnTemplate={%
+ \the\toks0 \the\!taRuleColumnTemplate} % RCT may have \tabskips
+ \!tfAdjoinPriorColumn}
+
+% ADJOIN PRIOR COLUMN
+\def\!tfAdjoinPriorColumn{%
+ \ifnum \!taColumnNumber=0
+ \!taPreamble=\!taRuleColumnTemplate % New \tabskip may have been added
+ \ifnum \TracingFormats>0
+ \!tfShowRuleTemplate
+ \fi
+ \else
+ \ifx\!tfRowOfWidths\empty % no "w" keys specified yet, not even this col
+ \else
+ \!tfUpdateRowOfWidths
+ \fi
+ % Adjoin positioning glues to left and right of template
+ \!thToksEdef\!taDataColumnTemplate={%
+ \the \!taLeftGlue
+ \the \!taDataColumnTemplate
+ \the \!taRightGlue}
+ \ifnum \TracingFormats>0
+ \!tfShowTemplates
+ \fi
+ % Adjoin data- and rule-column templates to preamble
+ \!thToksEdef\!taPreamble={%
+ \the\!taPreamble
+ &
+ \the\!taDataColumnTemplate
+ &
+ \the\!taRuleColumnTemplate}
+ \fi
+%
+% START NEW COLUMN
+ \advance \!taColumnNumber 1
+ % Initialize data-column template, restoring last "regular" tabskip
+ % after a "once only" tabskip
+ \if!taOnceOnlyTabskip
+ \!thToksEdef\!taDataColumnTemplate={%
+ ####\tabskip \the\!taLastRegularTabskip}
+ \else
+ \!taDataColumnTemplate{##}%
+ \fi
+ % Remaining initializations
+ \!taRuleColumnTemplate{}% # is inserted by \SetVrule, or \SetAlternateVrule
+ \!taLeftGlue{\hfil}% % Default positioning is "center"
+ \!taRightGlue{\hfil}%
+ \!taMinimumColumnWidth=0pt
+ \def\!tfWidthText{}%
+ \!taOnceOnlyTabskipfalse % Set true by key "o"
+ \ReadFormatKeys}
+
+% UPDATE ROW OF WIDTHS
+\def\!tfUpdateRowOfWidths{%
+ % If user had a "w[<Text>]" key, set <Text> according to the
+ % template for this column, and find the width of the result
+ \ifx \!tfWidthText\empty
+ \else % set specified text according to current template & find width
+ \!tfComputeMinColWidth
+ \fi
+ \edef\!tfRowOfWidths{%
+ \!tfRowOfWidths
+ &%
+ \omit % Data Column
+ \ifdim \!taMinimumColumnWidth>0pt
+ \hskip \the\!taMinimumColumnWidth
+ \fi
+ &
+ \omit}} % Rule Column
+
+% COMPUTE MINIMUM COLUMN WIDTH (from specified WidthText)
+\def\!tfComputeMinColWidth{%
+ \setbox0 =\vbox{%
+ \ialign{% Plain's initialized \halign; \tabskip=0pt \everycr={}
+ \span\the\!taDataColumnTemplate\cr
+ \!tfWidthText\cr}}%
+ \!taMinimumColumnWidth=\wd0 }
+
+% SHOW (INITIAL) RULE TEMPLATE
+\def\!tfShowRuleTemplate{%
+ \!thMessage{}
+ \!thMessage{TABLE FORMAT}
+ \!thMessage{Column: Template}
+ \!thMessage{%
+ \space *c: ##\tabskip \the\LeftTabskip}
+ \!taOldRuleColumnTemplate=\!taRuleColumnTemplate}
+
+% SHOW TEMPLATES
+\def\!tfShowTemplates{%
+ \!thMessage{%
+ \space \space r: \the\!taOldRuleColumnTemplate}
+ \!taOldRuleColumnTemplate=\!taRuleColumnTemplate
+ \!thMessage{%
+ \ifnum \!taColumnNumber<10
+ \space
+ \fi
+ \the\!taColumnNumber c: \the\!taDataColumnTemplate}
+ \ifdim\!taMinimumColumnWidth>0pt
+ \!thMessage{%
+ \space \space w: \the\!taMinimumColumnWidth}
+ \fi}
+
+
+% FINISH UP: Invoked by the keys "." and \EndFormat
+\def\!tfFinishFormat{%
+ \ifnum \TracingFormats>0
+ \!thMessage{%
+ \space \space r: \the\!taOldRuleColumnTemplate
+ \tabskip \the\RightTabskip}%
+ \!thMessage{%
+ \space *c: ##\tabskip 0pt}
+ \fi
+ \ifnum \!taColumnNumber<2
+ \!thError{%
+ \ifnum \!taColumnNumber=0
+ No
+ \else
+ Only 1
+ \fi
+ "|"}%
+ {\!thReadErrorMsg\!tfTooFewBarsA
+ ^^J\!thReadErrorMsg\!tfTooFewBarsB
+ ^^J\!thReadErrorMsg\!tkFixIt}%
+ \fi
+ \!thToksEdef\!taPreamble={%
+ ####\tabskip\LeftTabskip
+ &
+ \the\!taPreamble \tabskip\RightTabskip
+ &
+ ####\tabskip 0pt \cr}
+ \ifnum \TracingFormats>1
+ \!thMessage{Preamble=\the\!taPreamble}
+ \fi
+ \ifnum \TracingFormats>2
+ \!thMessage{Row Of Widths="\!tfRowOfWidths"}
+ \fi
+ \!taBeginFormatfalse % Intercepts "|", tabskips, and "."
+ \catcode`\|=13
+ \catcode`\"=13
+ \!ttDoHalign}
+
+% ERROR MESSAGE FOR NOT ENOUGH "|"'s
+\!thStoreErrorMsg\!tfTooFewBarsA{%
+ There must be at least 2 "|"'s (and/or "\string \|"'s)}
+\!thStoreErrorMsg\!tfTooFewBarsB{%
+ between \string\BeginFormat\space and \string\EndFormat\space (or ".").}
+
+
+% REFORMAT [<key letters>]{<text>}: Formats <text> according to
+% <key letters>. Used to override the template for a column,
+% or columns when used after \use.
+\def\ReFormat[{%
+ \omit
+ \!taDataColumnTemplate{##}%
+ \!taLeftGlue{}%
+ \!taRightGlue{}%
+ \catcode`\|=12 % Inhibit expansion if | immediately follows a <number>
+ \catcode`\"=12 % read by \getvalue. Actually, '|' and '"' shouldn't
+ \ReadFormatKeys}% appear in a \ReFormat cmd; this is here as a safeguard.
+
+% END REFORMAT: Invoked by the key "]"
+\def\!tfEndReFormat{%
+ \ifnum \TracingFormats>0
+ \!thMessage{ReF:
+ \the\!taLeftGlue
+ \hbox{\the\!taDataColumnTemplate}% White lie
+ \the\!taRightGlue}
+ \fi
+ \catcode`\|=13
+ \catcode`\"=13
+ \!tfReFormat}
+
+\def\!tfReFormat#1{%
+ \the \!taLeftGlue
+ \vbox{%
+ \ialign{%
+ \span\the\!taDataColumnTemplate\cr
+ #1\cr}}%
+ \the \!taRightGlue}
+
+
+
+% *********************************************************************
+% SECTION G: GET VALUE
+% *********************************************************************
+
+% GET_VALUE{<return macro>}<tokens> functions as follows:
+
+% If <tokens> has the form <(stuff)>, then
+% code=2 and value=<stuff>
+
+% Otherwise <tokens> has the form <DDDXYZ> where <DDD> denotes (a possibly
+% empty) string of consecutive digits (0,1,2,...,9) terminated by the first
+% character <X> (possibly a blank) that is not a digit. In this case
+% code=1 and value=<DDD> (= <null>, if <DDD> is non-empty).
+
+% Examples: Code Value
+% "\GetValue{\macro} 3" 1 null
+% "\GetValue{\macro}A " 1 null
+% "\GetValue{\macro}1 " 1 1
+% "\GetValue{\macro}25A" 1 25
+% "\GetValue{\macro}25012 " 1 25012
+% "\GetValue{\macro}(10pt)" 2 10pt
+% "\GetValue{\macro}(1in)" 2 1in
+% "\GetValue{\macro} (1in)" 1 null
+
+
+% GET_VALUE{<macro to execute after value is found>}
+\def\!tgGetValue#1{%
+ \def\!tgReturn{#1}% Set return
+ \futurelet\!ttemp\!tgCheckForParen}% Now \!ttemp is the token
+ % immediately after {}
+
+% CHECK_PAREN: See if \!ttemp is a (
+\def\!tgCheckForParen{%
+ \ifx\!ttemp (%
+ \!thx \!tgDoParen
+ \else
+ \!thx \!tgCheckForSpace
+ \fi}
+
+% DO_PAREN: Set code to 2, value to stuff inside ( )'s
+\def\!tgDoParen(#1){%
+ \def\!tgCode{2}%
+ \def\!tgValue{#1}% NOTE #1 MUST BE A LEGITIMATE VALUE
+ \!tgReturn}
+
+% CHECK_SPACE: See if \!ttemp is a <blank space>
+\def\!tgCheckForSpace{%
+ \def\!tgCode{1}%
+ \def\!tgValue{}% Initialize value to <null>
+ \ifx\!ttemp\!thSpaceToken
+ \!thx \!tgReturn % <blank space> means no value was specified
+ \else
+ \!thx \!tgCheckForDigit
+ \fi}
+
+% CHECK_DIGIT: \!ttemp is not a <blank space>; if its a digit (0,1,...,9)
+% get the <number> starting with that digit.
+\def\!tgCheckForDigit{%
+ \!taDigitfalse
+ \ifx 0\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 1\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 2\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 3\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 4\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 5\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 6\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 7\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 8\!ttemp
+ \!taDigittrue
+ \else
+ \ifx 9\!ttemp
+ \!taDigittrue
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \if!taDigit
+ \!thx \!tgGetNumber
+ \else
+ \!thx \!tgReturn
+ \fi}
+
+% GET_NUMBER
+\def\!tgGetNumber{%
+ \afterassignment\!tgGetNumberA
+ \!taCountA=}
+\def\!tgGetNumberA{%
+ \edef\!tgValue{\the\!taCountA}%
+ \!tgReturn}
+
+
+% ********************************************************************
+% MISCELANEOUS "RETURNS" FROM \getvalue
+% ********************************************************************
+
+% SET UP PAR BOX: Puts \BeginTableParBox{<user-specified \hsize>}
+% to the left of "#" and \EndTableParBox to the right of "#".
+\def\!tgSetUpParBox{%
+ \edef\!ttemp{%
+ \noexpand \ReadFormatKeys
+ b{\noexpand \BeginTableParBox{%
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\ColumnWidthFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \!taCWU % \ColumnWidthUnit
+ \else
+ \!tgValue % user-specified dimension
+ \fi}}}%
+ \!ttemp
+ a{\EndTableParBox}}
+
+% SET KERNS
+\def\!tgInsertKern{%
+ \edef\!ttemp{%
+ \kern
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \the\KernFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \!taKU % \KernUnit
+ \else
+ \!tgValue % user-specified dimension
+ \fi}%
+ \edef\!ttemp{%
+ \noexpand\ReadFormatKeys
+ \ifh@ % true if kern goes to left of "#"
+ b{\!ttemp}
+ \fi
+ \ifv@ % true if kern goes to right of "#"
+ a{\!ttemp}
+ \fi}%
+ \!ttemp}
+
+% *********************************************************************
+% SECTION K: KEYS
+% *********************************************************************
+
+% ****************************************************************
+% DEFINING NEW KEYS
+% ****************************************************************
+
+% NEW FORMAT KEY <Key Letter>: Must be followed by
+% <Parameter Text> <Replacement Text>
+% Sets up a new key letter command by expanding (essentially) to
+% \expandafter \def \csname !tk<Key Letter>\endcsname
+% <Parameter Text>{<Replacement Text>}
+% A warning message is issued if <Key Letter> is already in use.
+\def\NewFormatKey#1{%
+ \!thx\def\!thx\!ttempa\!thx{\string #1}%
+ \!thx\def\!thx\!ttempb\!thx{\csname !tk<\!ttempa>\endcsname}%
+ \ifnum \TracingKeys>0
+ \!tkReportNewKey
+ \fi
+ \!thx\ifx \!ttempb \relax
+ \!thx\!tkDefineKey
+ \else
+ \!thx\!tkRejectKey
+ \fi}
+
+% REPORT NEW KEY
+\def\!tkReportNewKey{%
+ \!taToksA\!thx{\!ttempa}%
+ \!thMessage{NEW KEY: "\the\!taToksA"}}
+
+% DEFINE KEY
+\def\!tkDefineKey{%
+ \!thx\def\!ttempb}%
+
+% DUPLICATE KEY
+\def\!tkRejectKey{%
+ \!taToksA\!thx{\!ttempa}%
+ \!thError{Key letter "\the\!taToksA" already used}
+ {\!thReadErrorMsg\!tkFixIt}
+ \def\!tkGarbage}%
+
+% ERROR MESSAGE FOR DUPLICATE KEY
+\!thStoreErrorMsg\!tkFixIt{%
+ You'd better type \space 'E' \space and fix your file.}
+
+
+% ****************************************************************
+% READING FORMAT KEYS
+% ****************************************************************
+
+% READ FORMAT KEYS
+\def\ReadFormatKeys#1{%
+ \!thx\def\!thx\!ttempa\!thx{\string #1}%
+ \!thx\def\!thx\!ttempb\!thx{\csname !tk<\!ttempa>\endcsname}%
+ \ifnum \TracingKeys>1
+ \!tkReportKey
+ \fi
+ \!thx\ifx \!ttempb\relax
+ \!thx\!tkReplaceKey
+ \else
+ \!thx\!ttempb
+ \fi}
+
+% REPORT KEY
+\def\!tkReportKey{%
+ \!taToksA\!thx{\!ttempa}%
+ \!thMessage{KEY: "\the\!taToksA"}}
+
+% REPLACE KEY
+\def\!tkReplaceKey{%
+ \!taToksA\!thx{\!ttempa}%
+ \!thError {Undefined format key "\the\!taToksA"}
+ {\!thReadErrorMsg\!tkUndefined ^^J\!thReadErrorMsg\!tkBadKey}
+ \!tkReplaceKeyA}
+
+\def\!tkReplaceKeyA{%
+ \!thGetReplacement{\!thReadErrorMsg\!tkReplace}\!tkReplacement
+ \!thx\ReadFormatKeys\!tkReplacement}
+
+% ERROR MESSAGES FOR KEY RELACEMENT
+\!thStoreErrorMsg\!tkUndefined{%
+ The format key in " "'s on the next to top line is undefined.}
+\!thStoreErrorMsg\!tkBadKey{%
+ Type \space E \space to quit now, or
+ \space<CR> \space and respond to next prompt.}
+\!thStoreErrorMsg\!tkReplace{%
+ Type \space<replacement key><CR> \space,
+ or simply \space<CR> \space to skip offending key:}
+
+
+% ****************************************************************
+% PRIMITIVE KEYS
+% ****************************************************************
+
+% Key "b": b{TOKENS} adds TOKENS to the left of (before) the template
+\NewFormatKey b#1{%
+ \!thx\!tkJoin\!thx{\the\!taDataColumnTemplate}{#1}%
+ \ReadFormatKeys}
+
+\def\!tkJoin#1#2{%
+ \!taDataColumnTemplate{#2#1}}%
+
+% Key "a": a{TOKENS} adds TOKENS to the right of (after) the template
+\NewFormatKey a#1{%
+ \!taDataColumnTemplate\!thx{\the\!taDataColumnTemplate #1}%
+ \ReadFormatKeys}
+
+% Key "\{": Enclose template in braces.
+\NewFormatKey \{{%
+ \!taDataColumnTemplate=\!thx{\!thx{\the\!taDataColumnTemplate}}%
+ \ReadFormatKeys}
+
+% Key "*": "*{N}{KEY LETTERS}" is equivalent to specifying
+% <KEY LETTERS> N times.
+% KEY LETTERS may contain further * specifications
+\NewFormatKey *#1#2{%
+ \!taCountA=#1\relax
+ \!taToksA={}%
+ \!thLoop
+ \ifnum \!taCountA > 0
+ \!taToksA\!thx{\the\!taToksA #2}%
+ \advance\!taCountA -1
+ \repeat
+ \!thx\ReadFormatKeys\the\!taToksA}
+
+
+% ****************************************************************
+% POSITIONING KEYS
+% ****************************************************************
+
+% Key "\LeftGlue": Specifies the glue (usually \hfil, or nothing) to be
+% added to extreme left of the template to position a column
+\NewFormatKey \LeftGlue#1{%
+ \!taLeftGlue{#1}%
+ \ReadFormatKeys}
+
+% Key "\RightGlue": Specifies the glue (usually \hfil, or nothing) to be
+% added to the extreme right of the template to position a column
+\NewFormatKey \RightGlue#1{%
+ \!taRightGlue{#1}%
+ \ReadFormatKeys}
+
+% Key "c": Centered column.
+\NewFormatKey c{%
+ \ReadFormatKeys
+ \LeftGlue\hfil
+ \RightGlue\hfil}
+
+% Key "l": Left-adjusted column.
+\NewFormatKey l{%
+ \ReadFormatKeys
+ \LeftGlue{} % In case more than one positioning key is specified.
+ \RightGlue\hfil}
+
+% Key "r": Right-adjusted column.
+\NewFormatKey r{%
+ \ReadFormatKeys
+ \LeftGlue\hfil
+ \RightGlue{}}
+
+% Key "k": Adds kerns to left and right of "#"
+% This key and the two below use Plain TeX's \if@h as if it were \if@left,
+% and \if@v as if it were \if@right. Table making goes on in a group,
+% so even in the unlikely circumstance that a \phantom is currently under
+% construction, there's no problem.
+\NewFormatKey k{%
+ \h@true
+ \v@true
+ \!tgGetValue{\!tgInsertKern}}
+
+% Key "i": Adds a kern to the left of "#"
+\NewFormatKey i{%
+ \h@true
+ \v@false
+ \!tgGetValue{\!tgInsertKern}}
+
+% Key "j": Adds a kern to the right of "#"
+\NewFormatKey j{%
+ \h@false
+ \v@true
+ \!tgGetValue{\!tgInsertKern}}
+
+
+% ****************************************************************
+% NUMERIC ITEM KEYS
+% ****************************************************************
+
+% Key "n": numeric item , non-math mode.
+\NewFormatKey n{%
+ \def\!tnStyle{}%
+ \futurelet\!tnext\!tnTestForBracket}
+
+% Key "N": numeric item, math mode.
+\NewFormatKey N{%
+ \def\!tnStyle{$}%
+ \futurelet\!tnext\!tnTestForBracket}
+
+
+% ****************************************************************
+% ATTRIBUTE KEYS
+% ****************************************************************
+
+% Key "m": Math mode.
+\NewFormatKey m{%
+ \ReadFormatKeys b$ a$}
+
+% Key "M": Displaymath mode.
+\NewFormatKey M{%
+ \ReadFormatKeys \{ b{$\displaystyle} a$}
+
+% Key "\m": Template ${}#\hfil$
+\NewFormatKey \m{%
+ \ReadFormatKeys l b{{}} m}
+
+% Key "\M": Template $\displaystyle{{}#\hfil}$
+\NewFormatKey \M{%
+ \ReadFormatKeys l b{{}} M}
+
+% Key "f": Set font (E.g., f\it sets up italic font (assuming \it
+% has its usual meaning)
+\NewFormatKey f#1{%
+ \ReadFormatKeys b{#1}}
+
+% Key "B": abbreviation for f\bf
+\NewFormatKey B{%
+ \ReadFormatKeys f\bf}
+
+% Key "I": abbreviation for f\it
+\NewFormatKey I{%
+ \ReadFormatKeys f\it}
+
+% Key "S": abbreviation for f\sl
+\NewFormatKey S{%
+ \ReadFormatKeys f\sl}
+
+% Key "R": abbreviation for f\rm
+\NewFormatKey R{%
+ \ReadFormatKeys f\rm}
+
+% Key "T": abbreviation for f\tt
+\NewFormatKey T{%
+ \ReadFormatKeys f\tt}
+
+% Key "p": ParBox
+\NewFormatKey p{%
+ \!tgGetValue{\!tgSetUpParBox}}
+
+
+% ****************************************************************
+% MINIMUM COLUMN WIDTH KEY
+% ****************************************************************
+
+% Key "w": minimum column width
+\NewFormatKey w{%
+ \!tkTestForBeginFormat w{\!tgGetValue{\!tfSetWidth}}}
+
+
+% ****************************************************************
+% TABSKIP KEYS
+% ****************************************************************
+
+% Key "s": Set tabskip for the inter-column space to the right
+% of the current column, and all subsequent spaces, until overriden
+% by a new "s" or "o" key.
+\NewFormatKey s{%
+ \!taOnceOnlyTabskipfalse % in case same column has a prior "o" key
+ \!tkTestForBeginFormat t{\!tgGetValue{\!tfSetTabskip}}}
+
+% Key "o": Apply the \tabskip stated for this column ONLY to the
+% inter-column space just to the right of this column; restore the
+% the previous \tabskip for subsequent columns.
+\NewFormatKey o{%
+ \!taOnceOnlyTabskiptrue
+ \!tkTestForBeginFormat o{\!tgGetValue{\!tfSetTabskip}}}
+
+
+% ****************************************************************
+% RULE KEYS
+% ****************************************************************
+
+% Key "|": Standard rule column designator
+\NewFormatKey |{%
+ \!tkTestForBeginFormat |{\!tgGetValue{\!tfSetVrule}}}
+
+% Key "\|": Non-standard rule column designator
+\NewFormatKey \|{%
+ \!tkTestForBeginFormat \|{\!tfSetAlternateVrule}}
+
+
+% ****************************************************************
+% END-OF-FORMAT KEYS
+% ****************************************************************
+
+% Key ".": PERIOD -- end of \BeginFormat section.
+\NewFormatKey .{%
+ \!tkTestForBeginFormat.{\!tfFinishFormat}}
+
+% Key "\EndFormat": Equivalent to "."
+\NewFormatKey \EndFormat{%
+ \!tkTestForBeginFormat\EndFormat{\!tfFinishFormat}}
+
+% Key "]": End of \ReFormat section
+\NewFormatKey ]{%
+ \!tkTestForReFormat ] \!tfEndReFormat}
+
+
+% ****************************************************************
+% VALIDITY CHECKS
+% ****************************************************************
+
+% TEST FOR BEGIN FORMAT{<Key>}{Intended Action}: This test is run
+% on keys that can only be used by \BeginFormat --- "s", "o",
+% "|", "\|", "w", ".", and "\EndFormat".
+\def\!tkTestForBeginFormat#1#2{%
+ \if!taBeginFormat
+ \def\!ttemp{#2}%
+ \!thx \!ttemp
+ \else
+ \toks0={#1}%
+ \toks2=\!thx{\string\ReFormat}%
+ \!thx \!tkImproperUse
+ \fi}
+
+% TEST FOR RE FORMAT{<Key>}{Intended Action}: This test is run
+% on the key "]", which can only be used by \ReFormat.
+\def\!tkTestForReFormat#1#2{%
+ \if!taBeginFormat
+ \toks0={#1}%
+ \toks2=\!thx{\string\BeginFormat}%
+ \!thx \!tkImproperUse
+ \else
+ \def\!ttemp{#2}%
+ \!thx \!ttemp
+ \fi}
+
+% IMPROPER USE OF KEY
+\def\!tkImproperUse{%
+ \!thError{\!thReadErrorMsg\!tkBadUseA "\the\toks0 "}%
+ {\!thReadErrorMsg\!tkBadUseB \the\toks2 \space command.
+ ^^J\!thReadErrorMsg\!tkBadKey}%
+ \!tkReplaceKeyA}
+
+% ERROR MESSAGES FOR IMPROPER USE OF KEY
+\!thStoreErrorMsg\!tkBadUseA{Improper use of key }
+\!thStoreErrorMsg\!tkBadUseB{%
+ The key mentioned above can't be used in a }
+
+
+
+% *********************************************************************
+% SECTION n: NUMERIC
+% *********************************************************************
+
+% NOTE: THE SPACE BETWEEN A NUMERIC ENTRY AND THE FOLLOWING '|', '"',
+% OR '\|' IS MANDATORY.
+% EMPTY NUMERIC ENTRIES ARE NOT ALLOWED: USE '{}' OR '\omit' INSTEAD.
+
+% TEST FOR BRACKET: Invoked by the keys "n" and "N".
+\def\!tnTestForBracket{%
+ \ifx [\!tnext
+ \!thx\!tnGetArgument
+ \else
+ \!thx\!tnGetCode
+ \fi}
+
+% GET CODE: E.g. "4", or "4.0", "0.4", or "10.2"
+\def\!tnGetCode#1 {% NOTE THE BLANK
+ \!tnConvertCode #1..!}
+
+% CONVERT CODE: E.g. converts above to [0000], [0000.], [.0000],
+% [0000000000.00]
+\def\!tnConvertCode #1.#2.#3!{%
+ \begingroup
+ \aftergroup\edef \aftergroup\!ttemp \aftergroup{%
+ \aftergroup[%
+ \!taCountA #1
+ \!thLoop
+ \ifnum \!taCountA>0
+ \advance\!taCountA -1
+ \aftergroup0
+ \repeat
+ \def\!ttemp{#3}%
+ \ifx\!ttemp \empty
+ \else
+ \aftergroup.
+ \!taCountA #2
+ \!thLoop
+ \ifnum \!taCountA>0
+ \advance\!taCountA -1
+ \aftergroup0
+ \repeat
+ \fi
+ \aftergroup]\aftergroup}%
+ \endgroup\relax
+ \!thx\!tnGetArgument\!ttemp}
+
+% GET ARGUMENT: [<sample left field> <optional .<sample right field>>
+\def\!tnGetArgument[#1]{%
+ \!tnMakeNumericTemplate\!tnStyle#1..!}
+
+% MAKE NUMERIC TEMPLATE
+\def\!tnMakeNumericTemplate#1#2.#3.#4!{% #1=<empty> or $
+ \def\!ttemp{#4}%
+ \ifx\!ttemp\empty
+ \!taDimenC=0pt
+ \else
+ \setbox0=\hbox{\m@th #1.#3#1}%
+ \!taDimenC=\wd0
+ \fi
+ \setbox0 =\hbox{\m@th #1#2#1}%
+ \!thToksEdef\!taDataColumnTemplate={%
+ \noexpand\!tnSetNumericItem
+ {\the\wd0 }%
+ {\the\!taDimenC}%
+ {#1}%
+ \the\!taDataColumnTemplate} % Might have tabskip glue in here
+ \ReadFormatKeys}
+
+% SET NUMERIC ITEM
+\def\!tnSetNumericItem #1#2#3#4 {% NOTE THE BLANK
+ \!tnSetNumericItemA {#1}{#2}{#3}#4..!}
+
+\def\!tnSetNumericItemA #1#2#3#4.#5.#6!{%
+ \def\!ttemp{#6}%
+ \hbox to #1{\hss \m@th #3#4#3}%
+ \hbox to #2{%
+ \ifx\!ttemp\empty
+ \else
+ \m@th #3.#5#3%
+ \fi
+ \hss}}
+
+
+
+% *********************************************************************
+% SECTION S: STRUTS
+% *********************************************************************
+
+% The following are in ALLOCATIONS
+ %\newdimen\StrutUnit (normal value \normalbaselineskip / 11)
+ %\newcount\StrutHeightFactor (normal value 8)
+ %\newcount\StrutDepthFactor (normal value 3)
+
+% MAKE STRUT OF SPECIFIED HEIGHT AND DIMENSION
+% \MakeStrut <height><depth>; height and depth are <dimen>'s
+\def\MakeStrut#1#2{%
+ \vrule width0pt height #1 depth #2}
+
+% STANDARD VERTICAL STRUT
+% Makes a strut of height=StrutHeightFactor*StrutUnit
+% depth =StrutDepthFactor *StrutUnit
+\def\StandardTableStrut{%
+ \MakeStrut{\StrutHeightFactor\StrutUnit}
+ {\StrutDepthFactor\StrutUnit}}
+
+
+% STANDARD VERTICAL STRUT, WITH EXTRA HEIGHT/DEPTH
+% \AugmentedTableStrut<multiple for extra height><multiple for extra depth>
+% makes a strut of height=(StrutHeightFactor+#1)*StrutUnit
+% depth =(StrutDepthFactor+#2)*StrutUnit
+\def\AugmentedTableStrut#1#2{%
+ \dimen@=\StrutHeightFactor\StrutUnit
+ \advance\dimen@ #1\StrutUnit
+ \dimen@ii=\StrutDepthFactor\StrutUnit
+ \advance\dimen@ii #2\StrutUnit
+ \MakeStrut{\dimen@}{\dimen@ii}}
+
+
+% ENLARGE<extra height><extra depth><original>
+% Enlarges "original" by extra height and extra depth.
+% Extra height and extra depth are <dimen>'s.
+% Works for various math styles, and takes into account
+% \spacefactor in horizontal mode
+\def\Enlarge#1#2{% 3rd argument is picked up later
+ % #1=extra height
+ % #2=extra depth
+ \!taDimenA=#1\relax
+ \!taDimenB=#2\relax
+ \let\!TsSpaceFactor=\empty
+ \ifmmode
+ \!thx \mathpalette
+ \!thx \!TsEnlargeMath
+ \else
+ \!thx \!TsEnlargeOther
+ \fi}
+
+\def\!TsEnlargeOther#1{%
+ \ifhmode
+ \setbox\z@=\hbox{#1%
+ \xdef\!TsSpaceFactor{\spacefactor=\the\spacefactor}}%
+ \else
+ \setbox\z@=\hbox{#1}%
+ \fi
+ \!TsFinishEnlarge}
+
+\def\!TsEnlargeMath#1#2{%
+ \setbox\z@=\hbox{$\m@th#1{#2}$}%
+ \!TsFinishEnlarge}
+
+\def\!TsFinishEnlarge{%
+ \dimen@=\ht\z@
+ \advance \dimen@ \!taDimenA
+ \ht\z@=\dimen@
+ \dimen@=\dp\z@
+ \advance \dimen@ \!taDimenB
+ \dp\z@=\dimen@
+ \box\z@ \!TsSpaceFactor{}}
+
+
+% ENLARGE BY MULTIPLES OF StrutUnit
+% \enlarge<multiple for extra height><multiple for extra depth><original>
+% Enlarges by (multiple for extra heigth)*StrutUnit
+% and (multiple for extra depth) *StrutUnit
+\def\enlarge#1#2{% 3rd argument is picked up later
+ \Enlarge{#1\StrutUnit}{#2\StrutUnit}}
+
+
+% OPENUP#1#2: increases strut height and depth factors by #1 and #2.
+\def\OpenUp#1#2{%
+ \advance \StrutHeightFactor #1\relax
+ \advance \StrutDepthFactor #2\relax}
+
+
+
+% *********************************************************************
+% SECTION T: TABLES
+% *********************************************************************
+
+% Table-making is initiated by \BeginTable. After processing that
+% command, TeX absorbs the instructions in the prologue to the table
+% until it gets to \BeginFormat. \BeginFormat sets up the preamble
+% for the \halign that will be used to create the table. \EndFormat
+% initiates the \halign-ment, which is terminated by \EndTable.
+
+
+% *********************************************************************
+% BEGIN TABLE, (DO HALIGN), END TABLE
+% *********************************************************************
+% BEGIN TABLE
+\def\BeginTable{%
+ \futurelet\!tnext\!ttBeginTable}
+
+\def\!ttBeginTable{%
+ \ifx [\!tnext
+ \def\!tnext{\!ttBeginTableA}%
+ \else
+ \def\!tnext{\!ttBeginTableA[c]}%
+ \fi
+ \!tnext}
+
+\def\!ttBeginTableA[#1]{%
+ \if #1u% % "unboxed" table
+ \ifmmode
+ \def\!ttEndTable{% % user had better be in display math mode
+ \relax}% % and have only one table at the outer level
+ \else % user had better be in vertical mode
+ \bgroup
+ \def\!ttEndTable{%
+ \egroup}%
+ \fi
+ \else
+ \hbox\bgroup $
+ \def\!ttEndTable{%
+ \egroup % for the \vtop, \vbox, or \vcenter, yet to come
+ $% for math mode
+ \egroup}% for the \hbox
+ \if #1t%
+ \vtop
+ \else
+ \if #1b%
+ \vbox
+ \else
+ \vcenter % math mode was essential for this
+ \fi
+ \fi
+ \bgroup % for the \vtop, \vbox, or \vcenter
+ \fi
+ \advance\!taRecursionLevel 1 % RecursionLevel governs initialization
+ \let\!ttRightGlue=\relax % This may be changed by \JustCenter, etc
+ \everycr={}
+ \ifnum \!taRecursionLevel=1
+ \!ttInitializeTable
+ \fi}
+
+% INITIALIZE TABLE
+\bgroup
+ \catcode`\|=13
+ \catcode`\"=13
+ \catcode`\~=13
+ \gdef\!ttInitializeTable{%
+ \let\!ttTie=~ % Meanings of ~ and \- are
+ \let\!ttDH=\- % restored by \BeginTableParBox
+ \catcode`\|=\active
+ \catcode`\"=\active
+ \catcode`\~=\active
+ \def |{\unskip\!ttRightGlue&&}% Use rule-column template
+ \def\|{\unskip\!ttRightGlue&\omit\!ttAlternateVrule}%
+ % Override rule-column template
+ \def"{\unskip\!ttRightGlue&\omit&}% Omit rule-column template
+ \def~{\kern .5em}% ~ now has the width of a digit
+ \def\\{\!ttEndOfRow}%
+ \def\-{\!ttShortHrule}%
+ \def\={\!ttLongHrule}%
+ \def\_{\!ttFullHrule}%
+ \def\Left##1{##1\hfill\null}% \null prevents \unskip from
+ \def\Center##1{\hfill##1\hfill\null}% killing the \hfill
+ \def\Right##1{\hfill##1}%
+ \def\use{\!ttuse}%
+ \def\Use{\!ttUse}%
+ \the\EveryTable}
+\egroup
+
+\let\!ttRightGlue=\relax % This may be changed, in a group, by
+ % \JustCenter, etc
+
+% DO HALIGN: Invoked by END FORMAT (or the key ".")
+\def\!ttDoHalign{%
+ \baselineskip=0pt \lineskiplimit=0pt \lineskip=0pt %
+ \tabskip=0pt
+ \halign \the\!taTableSpread \bgroup
+ \span\the\!taPreamble
+ \ifx \!tfRowOfWidths \empty
+ \else
+ \!tfRowOfWidths \cr %
+ \fi}
+
+% END TABLE
+\def\EndTable{%
+ \egroup % finishes the \halign
+ \!ttEndTable}% closes off the table envirnoment set up by \BeginTable
+
+
+% *********************************************************************
+% END OF ROW PROCESSING
+% *********************************************************************
+
+% END OF ROW: When followed by
+% 0, inserts no strut
+% +, inserts an AugmentedTableStrut (with <x-height> and <x-depth>
+% as arguments
+% anything else, inserts a StandardTableStrut,
+% and finished off the row with a \cr.
+\def\!ttEndOfRow{%
+ \futurelet\!tnext\!ttTestForBlank}
+
+% TEST FOR BLANK
+\def\!ttTestForBlank{%
+% \!thMessage{At Test For Blank: \meaning\!tnext}
+ \ifx \!tnext\!thSpaceToken % the "usual" case
+ \!thx\!ttDoStandard
+ \else
+ \!thx\!ttTestForZero
+ \fi}
+
+% TEST FOR ZERO
+\def\!ttTestForZero{%
+ \ifx 0\!tnext
+ \!thx \!ttDoZero
+ \else
+ \!thx \!ttTestForPlus
+ \fi}
+
+% TEST FOR PLUS
+\def\!ttTestForPlus{%
+ \ifx +\!tnext
+ \!thx \!ttDoPlus
+ \else
+ \!thx \!ttDoStandard
+ \fi}
+
+% DO ZERO: No strut
+\def\!ttDoZero#1{% #1 eats the 0
+ \cr}
+
+% DO PLUS: Insert "Extra" strut; #2=extra height, #3=extra depth, both
+% as integers (units of \StrutUnit)
+\def\!ttDoPlus#1#2#3{% #1 eats the +
+ \AugmentedTableStrut{#2}{#3}%
+ \cr}
+
+% DO STANDARD: Insert standard table strut
+\def\!ttDoStandard{%
+ \StandardTableStrut
+ \cr}
+
+
+% *********************************************************************
+% ALTERNATE VRULES
+% *********************************************************************
+
+% A '\|' can appear in a rule-column in place of a '|', '"', or '&'.
+
+% If '\|' is immediately followed by a blank, a string of digits, or
+% (...) [... had better be a <dimen>], a \vrule is placed in the
+% rule column; the thickness of the \vrule follows TABLE's usual
+% conventions. Be sure to put a blank after a string of digits.
+
+% If '\|' is immediately followed by a '*', a user-specified default
+% "pseudo"-rule is placed in the rule column. This P.R. is specified
+% by the parameterless macro \PseudoVrule. For example,
+% to place a "double rule" into a rule column, you could make the definition
+% \def\PseudoVrule{\hfil\vrule \hskip1pt \vrule\hfil}
+
+% If none of the above cases applies, a non-space token follows '\|':
+% that token is placed in the rule-column. To put a '*' in a
+% rule-column, enter '\|{*}'. '\|\PseudoVrule' has the same effect
+% as '\|*'.
+
+% ALTERNATE VRULE
+\def\!ttAlternateVrule{%
+ \!tgGetValue{\!ttAVTestForCode}} % AV == Alternate Vrule
+
+% TEST FOR CODE (2)
+\def\!ttAVTestForCode{%
+ \ifnum \!tgCode=2 % (...) follows "\|"
+ \!thx\!ttInsertVrule % \InsertVrule ends with "&"
+ \else
+ \!thx\!ttAVTestForEmpty
+ \fi}
+
+% TEST FOR EMPTY (VALUE)
+\def\!ttAVTestForEmpty{%
+ \ifx \!tgValue\empty % non-digit after "\|"
+ \!thx\!ttAVTestForBlank
+ \else
+ \!thx\!ttInsertVrule % integer after "\|"
+ \fi}
+
+% TEST FOR BLANK
+\def\!ttAVTestForBlank{%
+ \ifx \!ttemp\!thSpaceToken % blank after "\|"
+ \!thx\!ttInsertVrule
+ \else
+ \!thx\!ttAVTestForStar
+ \fi}
+
+% TEST FOR STAR
+\def\!ttAVTestForStar{%
+ \ifx *\!ttemp % "*" after "\|"
+ \!thx\!ttInsertDefaultPR % PR == pseudo-rule
+ \else
+ \!thx\!ttGetPseudoVrule % "Anything else" after "\|"
+ \fi}
+
+% INSERT VRULE
+\def\!ttInsertVrule{%
+ \hfil
+ \vrule \!thWidth
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \LineThicknessFactor
+ \else
+ \!tgValue
+ \fi
+ \LineThicknessUnit
+ \else
+ \!tgValue
+ \fi
+ \hfil
+ &}
+
+% INSERT DEFAULT PSEUDO-RULE
+\def\!ttInsertDefaultPR*{%
+ \PseudoVrule % User-specified default pseudo-rule
+ &}
+
+% GET PSEUDO-RULE
+\def\!ttGetPseudoVrule#1{%
+ \toks0={#1}%
+ #1&}
+
+% DEFAULT PSEUDO-RULE
+\def\PseudoVrule{}
+
+
+% *********************************************************************
+% USE: Version of \multispan for rule-&-column tables
+% *********************************************************************
+
+% USE
+% \use <number> spans the next <number> data columns.
+\def\!ttuse#1{%
+ \ifnum #1>\@ne
+ \omit
+ \mscount=#1 % \mscount is in Plain
+ \advance\mscount by \m@ne
+ \advance\mscount by \mscount
+ \!thLoop
+ \ifnum\mscount>\@ne
+ \sp@n % from Plain (\span\omit \advance\mscount\m@ne)
+ \repeat
+ \span
+ \fi}
+
+\def\!ttUse#1[{%
+ \!ttuse{#1}%
+ \ReFormat[}
+
+
+% *********************************************************************
+% HRULES
+% *********************************************************************
+
+% FULL HORIZONTAL RULE: Draws a rule across the table,
+% using \noalign{\hrule}
+\def\!ttFullHrule{%
+ \noalign
+ \bgroup
+ \!tgGetValue{\!ttFullHruleA}}
+
+\def\!ttFullHruleA{%
+ \!ttGetHalfRuleThickness % Sets \dimen0 to half of specified thickness
+ \hrule \!thHeight \dimen0 \!thDepth \dimen0
+ \penalty0 % so can break an ``unboxed'' table after a horizontal rule.
+ \egroup} % ends the \noalign
+
+% SHORT HORIZONTAL RULE: Draws a rule across 1 (or more) columns,
+% using \leaders; this rule doesn't extend across the neighboring
+% tabskip glues to join up with adjacent rule columns. By contrast
+% the LONG HORIZONTAL RULE below does just that.
+\def\!ttShortHrule{%
+ \omit
+ \!tgGetValue{\!ttShortHruleA}}
+
+\def\!ttShortHruleA{%
+ \!ttGetHalfRuleThickness % Sets \dimen0 to half of specified thickness
+ \leaders \hrule \!thHeight \dimen0 \!thDepth \dimen0 \hfill
+ \null % prevents an \unskip from annihilating the \leaders
+ \ignorespaces}
+
+% LONG HORIZONTAL RULE: This rule requires special coding.
+% It must be preceded and followed by '&', instead of the usual
+% '|' or '"'. However, '\_' can follow '\use' in the usual manner.
+% And in fact, to insert long-rules in two or more contiguous columns,
+% '\use' MUST be used with an argument = total number of columns involved.
+\def\!ttLongHrule{%
+ \omit\span\omit\span \!ttShortHrule}
+
+% GET RULE THICKNESS
+\def\!ttGetHalfRuleThickness{%
+ \dimen0 =
+ \ifnum \!tgCode=1
+ \ifx \!tgValue\empty
+ \LineThicknessFactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \LineThicknessUnit
+ \else
+ \!tgValue % user-specified dimension
+ \fi
+ \divide\dimen0 2 }
+
+
+% *********************************************************************
+% STRETCHING AND SHRINKING A TABLE
+% *********************************************************************
+
+% SET TABLE TO WIDTH <dimen>
+\def\SetTableToWidth#1{%
+ \!taTableSpread={to #1}}
+
+% WIDEN TABLE BY <dimen>
+\def\WidenTableBy#1{%
+ \ifdim #1=0pt
+ \!taTableSpread={}%
+ \else
+ \!taTableSpread={spread #1}%
+ \fi}
+
+\def\Expand{%
+ \SetTableToWidth{\hsize}}%
+
+\def\LongLines{%
+ \LeftTabskip =0pt plus 1fill
+ \RightTabskip=\LeftTabskip
+ \Expand}
+
+
+% *********************************************************************
+% REPOSITIONING COMMANDS (\JUSTLEFT, etc.)
+% *********************************************************************
+
+\def\JustLeft{%
+ \omit \let\!ttRightGlue=\hfill}
+\def\JustCenter{%
+ \omit \hfill\null \let\!ttRightGlue=\hfill}
+\def\JustRight{%
+ \omit \hfill\null}
+
+
+% *********************************************************************
+% Restore meaning of \\, and reset category codes
+% *********************************************************************
+\let\\=\!tacr
+\catcode`\!=12
+\catcode`\@=12
+
+
diff --git a/tex/context/base/texutil.pl b/tex/context/base/texutil.pl index d4d84e958..607268361 100644 --- a/tex/context/base/texutil.pl +++ b/tex/context/base/texutil.pl @@ -1,1547 +1,1547 @@ -#!/usr/bin/perl - -#-w - -#D \module -#D [ file=texutil.pl, -#D version=1997.12.08, -#D title=pre- and postprocessing utilities, -#D subtitle=\TEXUTIL, -#D author=Hans Hagen, -#D date=\currentdate, -#D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -#C -#C This script is part of the \CONTEXT\ macro||package and is -#C therefore copyrighted by \PRAGMA. Non||commercial use is -#C granted. - -# Thanks to Tobias Burnus for the german translations. -# Thanks to Taco Hoekwater for making the file -w proof. - -#D This is \TEXUTIL, a utility program (script) to be used -#D alongside the \CONTEXT\ macro package. This \PERL\ script is -#D derived from the \MODULA\ version and uses slightly better -#D algoritms for sanitizing \TEX\ specific (sub|)|strings. -#D This implementation is therefore not entirely compatible -#D with the original \TEXUTIL, although most users will -#D probably never notice. Now how was this program called? - -$Program = "TeXUtil 6.40 - ConTeXt / PRAGMA 1992-1998" ; - -#D By the way, this is my first \PERL\ script, which means -#D that it will be improved as soon as I find new and/or more -#D suitable solutions in the \PERL\ manuals. As can be seen in -#D the definition of \type{$program}, this program is part of -#D the \CONTEXT\ suite, and therefore can communicate with the -#D users in english as well as some other languages. One can -#D set his favourite language by saying something like: - -#D \starttypen -#D perl texutil.pl --interface=de --figures *.eps *.tif -#D \stoptypen -#D -#D Of course one can also say \type{--interface=nl}, which -#D happens to be my native language. - -#D I won't go into too much detail on the algoritms used. -#D The next few pages show the functionality as reported by the -#D helpinformation and controled by command line arguments -#D and can serve as additional documentation. - -#D \TEXUTIL\ can handle different tasks; which one is active -#D depends on the command line arguments. Most task are -#D handled by the procedures below. The one exception is the -#D handling of \TIFF\ files when collecting illustration -#D files. When needed, \TEXUTIL\ calls for \TIFFINFO\ or -#D \TIFFTAGS, but more alternatives can be added by extending -#D \type{@TiffPrograms}. - -@TiffPrograms = ("tiffinfo", "tifftags") ; - -#D Back to the command line arguments. These are handled by -#D a \PERL\ system module. This means that, at least for the -#D moment, there is no external control as provided by the -#D \PRAGMA\ environment system. - -use Getopt::Long ; - -#D We don't want error messages and accept partial switches, -#D which saves users some typing. - -$Getopt::Long::passthrough = 1 ; # no error message -$Getopt::Long::autoabbrev = 1 ; # partial switch accepted - -#D We also predefine the interface language and set a boolean -#D that keeps track of unknown options. \voetnoot {This feature -#D is still to be implemented.} - -$Interface = "en" ; -$UnknownOptions = 0 ; - -#D Here come the options: - -&GetOptions - ("references" => \$ProcessReferences, - "ij" => \$ProcessIJ, - "high" => \$ProcessHigh, - "quotes" => \$ProcessQuotes, - "documents" => \$ProcessDocuments, - "type=s" => \$ProcessType, - "sources" => \$ProcessSources, - "setups" => \$ProcessSetups, - "templates" => \$ProcessTemplates, - "infos" => \$ProcessInfos, - "figures" => \$ProcessFigures, - "tiff" =>\$ProcessTiff, - "logfile" => \$ProcessLogFile, - "box" =>\$ProcessBox, - "hbox" =>\$ProcessHBox, - "vbox" =>\$ProcessVBox, - "criterium=f" =>\$ProcessCriterium, - "unknown" =>\$ProcessUnknown, - "help" => \$ProcessHelp, - "interface=s" => \$Interface) ; - -#D By default wildcards are expanded into a list. The -#D subroutine below is therefore only needed when no file or -#D pattern is given. - -$InputFile = "@ARGV" ; - -sub CheckInputFiles - { my ($UserSuppliedPath) = @_ ; - @UserSuppliedFiles = map { split " " } sort lc $UserSuppliedPath } - -#D In order to support multiple interfaces, we save the -#D messages in a hash table. As a bonus we can get a quick -#D overview of the messages we deal with. - -sub Report - { foreach $_ (@_) - { if (! defined $MS{$_}) - { print $_ } - else - { print $MS{$_} } - print " " } - print "\n" } - -#D The messages are saved in a hash table and are called -#D by name. This contents of this table depends on the -#D interface language in use. - -#D \startcompressdefinitions - -if ($Interface eq "nl") - - { # begin of dutch section - - $MS{"ProcessingReferences"} = "commando's, lijsten en indexen verwerken" ; - $MS{"GeneratingDocumentation"} = "ConTeXt documentatie file voorbereiden" ; - $MS{"GeneratingSources"} = "ConTeXt broncode file genereren" ; - $MS{"FilteringDefinitions"} = "ConTeXt definities filteren" ; - $MS{"CopyingTemplates"} = "TeXEdit toets templates copieren" ; - $MS{"CopyingInformation"} = "TeXEdit help informatie copieren" ; - $MS{"GeneratingFigures"} = "figuur file genereren" ; - $MS{"FilteringLogFile"} = "log file filteren (poor mans version)" ; - - $MS{"SortingIJ"} = "IJ sorteren onder Y" ; - $MS{"ConvertingHigh"} = "hoge ASCII waarden converteren" ; - $MS{"ProcessingQuotes"} = "characters met accenten afhandelen" ; - $MS{"ForcingFileType"} = "filetype instellen" ; - $MS{"UsingTiff"} = "TIF files afhandelen" ; - $MS{"FilteringBoxes"} = "overfull boxes filteren" ; - $MS{"ApplyingCriterium"} = "criterium toepassen" ; - $MS{"FilteringUnknown"} = "onbekende ... filteren" ; - - $MS{"NoInputFile"} = "geen invoer file opgegeven" ; - $MS{"NoOutputFile"} = "geen uitvoer file gegenereerd" ; - $MS{"EmptyInputFile"} = "lege invoer file" ; - $MS{"NotYetImplemented"} = "nog niet beschikbaar" ; - - $MS{"Action"} = " actie :" ; - $MS{"Option"} = " optie :" ; - $MS{"Error"} = " fout :" ; - $MS{"Remark"} = " opmerking :" ; - $MS{"SystemCall"} = " systeemaanroep :" ; - $MS{"BadSystemCall"} = " foute systeemaanroep :" ; - $MS{"MissingSubroutine"} = " onbekende subroutine :" ; - - $MS{"EmbeddedFiles"} = " gebruikte files :" ; - $MS{"BeginEndError"} = " b/e fout in :" ; - $MS{"SynonymEntries"} = " aantal synoniemen :" ; - $MS{"SynonymErrors"} = " fouten :" ; - $MS{"RegisterEntries"} = " aantal ingangen :" ; - $MS{"RegisterErrors"} = " fouten :" ; - $MS{"PassedCommands"} = " aantal commando's :" ; - - $MS{"NOfDocuments"} = " documentatie blokken :" ; - $MS{"NOfDefinitions"} = " definitie blokken :" ; - $MS{"NOfSkips"} = " overgeslagen blokken :" ; - $MS{"NOfSetups"} = " gecopieerde setups :" ; - $MS{"NOfTemplates"} = " gecopieerde templates :" ; - $MS{"NOfInfos"} = " gecopieerde helpinfos :" ; - $MS{"NOfFigures"} = " verwerkte figuren :" ; - $MS{"NOfBoxes"} = " te volle boxen :" ; - $MS{"NOfUnknown"} = " onbekende ... :" ; - - $MS{"InputFile"} = " invoer file :" ; - $MS{"OutputFile"} = " outvoer file :" ; - $MS{"FileType"} = " type file :" ; - $MS{"EpsFile"} = " eps file :" ; - $MS{"TifFile"} = " tif file :" ; - $MS{"MPFile"} = " metapost file :" ; - - $MS{"Overfull"} = "te vol" ; - $MS{"Entries"} = "ingangen" ; - $MS{"References"} = "verwijzingen" ; - - } # end of dutch section - -elsif ($Interface eq "de") - - { # begin of german section - - $MS{"ProcessingReferences"} = "Verarbeiten der Befehle, Listen und Register" ; - $MS{"GeneratingDocumentation"} = "Vorbereiten der ConTeXt-Dokumentationsdatei" ; - $MS{"GeneratingSources"} = "Erstellen einer nur Quelltext ConTeXt-Datei" ; - $MS{"FilteringDefinitions"} = "Filtern der ConTeXt-Definitionen" ; - $MS{"CopyingTemplates"} = "Kopieren der TeXEdit-Test-key-templates" ; - $MS{"CopyingInformation"} = "Kopieren der TeXEdit-Hilfsinformation" ; - $MS{"GeneratingFigures"} = "Erstellen einer Abb-Uebersichtsdatei" ; - $MS{"FilteringLogFile"} = "Filtern der log-Datei" ; - - $MS{"SortingIJ"} = "Sortiere IJ nach Y" ; - $MS{"ConvertingHigh"} = "Konvertiere hohe ASCII-Werte" ; - $MS{"ProcessingQuotes"} = "Verarbeiten der Akzentzeichen" ; - $MS{"ForcingFileType"} = "Dateityp einstellen" ; - $MS{"UsingTiff"} = "TIF-Dateien verarbeite" ; - $MS{"FilteringBoxes"} = "Filtern der ueberfuellten Boxen" ; - $MS{"ApplyingCriterium"} = "Anwenden des uebervoll-Kriteriums" ; - $MS{"FilteringUnknown"} = "Filter unbekannt ..." ; - - $MS{"NoInputFile"} = "Keine Eingabedatei angegeben" ; - $MS{"NoOutputFile"} = "Keine Ausgabedatei generiert" ; # TOBIAS - $MS{"EmptyInputFile"} = "Leere Eingabedatei" ; - $MS{"NotYetImplemented"} = "Noch nicht verfuegbar" ; - - $MS{"Action"} = " Aktion :" ; - $MS{"Option"} = " Option :" ; - $MS{"Error"} = " Fehler :" ; - $MS{"Remark"} = " Anmerkung :" ; - $MS{"SystemCall"} = " system call :" ; - $MS{"BadSystemCall"} = " bad system call :" ; - $MS{"MissingSubroutine"} = " missing subroutine :" ; - $MS{"SystemCall"} = " Systemaufruf :" ; - $MS{"BadSystemCall"} = " Fehlerhafter Aufruf :" ; - $MS{"MissingSubroutine"} = " Fehlende Unterroutine :" ; - - $MS{"EmbeddedFiles"} = " Eingebettete Dateien :" ; - $MS{"BeginEndError"} = " Beg./Ende-Fehler in :" ; - $MS{"SynonymEntries"} = " Synonymeintraege :" ; - $MS{"SynonymErrors"} = " Fehlerhafte Eintraege :" ; - $MS{"RegisterEntries"} = " Registereintraege :" ; - $MS{"RegisterErrors"} = " Fehlerhafte Eintraege :" ; - $MS{"PassedCommands"} = " Verarbeite Befehle :" ; - - $MS{"NOfDocuments"} = " Dokumentbloecke :" ; - $MS{"NOfDefinitions"} = " Definitionsbloecke :" ; - $MS{"NOfSkips"} = "Uebersprungene Bloecke :" ; - $MS{"NOfSetups"} = " Kopierte setups :" ; - $MS{"NOfTemplates"} = " Kopierte templates :" ; - $MS{"NOfInfos"} = " Kopierte helpinfos :" ; - $MS{"NOfFigures"} = " Verarbeitete Abb. :" ; - $MS{"NOfBoxes"} = " Zu volle Boxen :" ; - $MS{"NOfUnknown"} = " Unbekannt ... :" ; - - $MS{"InputFile"} = " Eingabedatei :" ; - $MS{"OutputFile"} = " Ausgabedatei :" ; - $MS{"FileType"} = " Dateityp :" ; - $MS{"EpsFile"} = " eps-Datei :" ; - $MS{"TifFile"} = " tif-Datei :" ; - $MS{"MPFile"} = " metapost-Datei :" ; - - $MS{"Overfull"} = "zu voll" ; - $MS{"Entries"} = "Eintraege" ; - $MS{"References"} = "Referenzen" ; - - } # end of german section - -else - - { # begin of english section - - $MS{"ProcessingReferences"} = "processing commands, lists and registers" ; - $MS{"GeneratingDocumentation"} = "preparing ConTeXt documentation file" ; - $MS{"GeneratingSources"} = "generating ConTeXt source only file" ; - $MS{"FilteringDefinitions"} = "filtering formal ConTeXt definitions" ; - $MS{"CopyingTemplates"} = "copying TeXEdit quick key templates" ; - $MS{"CopyingInformation"} = "copying TeXEdit help information" ; - $MS{"GeneratingFigures"} = "generating figure directory file" ; - $MS{"FilteringLogFile"} = "filtering log file" ; - - $MS{"SortingIJ"} = "sorting IJ under Y" ; - $MS{"ConvertingHigh"} = "converting high ASCII values" ; - $MS{"ProcessingQuotes"} = "handling accented characters" ; - $MS{"ForcingFileType"} = "setting up filetype" ; - $MS{"UsingTiff"} = "processing TIF files" ; - $MS{"FilteringBoxes"} = "filtering overfull boxes" ; - $MS{"ApplyingCriterium"} = "applying overfull criterium" ; - $MS{"FilteringUnknown"} = "filtering unknown ..." ; - - $MS{"NoInputFile"} = "no input file given" ; - $MS{"NoOutputFile"} = "no output file generated" ; - $MS{"EmptyInputFile"} = "empty input file" ; - $MS{"NotYetImplemented"} = "not yet available" ; - - $MS{"Action"} = " action :" ; - $MS{"Option"} = " option :" ; - $MS{"Error"} = " error :" ; - $MS{"Remark"} = " remark :" ; - $MS{"SystemCall"} = " system call :" ; - $MS{"BadSystemCall"} = " bad system call :" ; - $MS{"MissingSubroutine"} = " missing subroutine :" ; - - $MS{"EmbeddedFiles"} = " embedded files :" ; - $MS{"BeginEndError"} = " b/e error in :" ; - $MS{"SynonymEntries"} = " synonym entries :" ; - $MS{"SynonymErrors"} = " bad entries :" ; - $MS{"RegisterEntries"} = " register entries :" ; - $MS{"RegisterErrors"} = " bad entries :" ; - $MS{"PassedCommands"} = " passed commands :" ; - - $MS{"NOfDocuments"} = " document blocks :" ; - $MS{"NOfDefinitions"} = " definition blocks :" ; - $MS{"NOfSkips"} = " skipped blocks :" ; - $MS{"NOfSetups"} = " copied setups :" ; - $MS{"NOfTemplates"} = " copied templates :" ; - $MS{"NOfInfos"} = " copied helpinfos :" ; - $MS{"NOfFigures"} = " processed figures :" ; - $MS{"NOfBoxes"} = " overfull boxes :" ; - $MS{"NOfUnknown"} = " unknown ... :" ; - - $MS{"InputFile"} = " input file :" ; - $MS{"OutputFile"} = " output file :" ; - $MS{"FileType"} = " file type :" ; - $MS{"EpsFile"} = " eps file :" ; - $MS{"TifFile"} = " tif file :" ; - $MS{"MPFile"} = " metapost file :" ; - - $MS{"Overfull"} = "overfull" ; - $MS{"Entries"} = "entries" ; - $MS{"References"} = "references" ; - - } # end of english section - -#D \stopcompressdefinitions - -#D Showing the banner (name and version of the program) and -#D offering helpinfo is rather straightforward. - -sub ShowBanner - { Report("\n$Program\n") } - -sub ShowHelpInfo - { Report("HelpInfo") } - -#D The helpinfo is also saved in the hash table. This looks -#D like a waste of energy and space, but the program gains -#D readability. - -#D \startcompressdefinitions - -if ($Interface eq "nl") - - { # begin of dutch section - - $MS{"HelpInfo"} = - - " --references hulp file verwerken / tui->tuo \n" . - " --ij : IJ als Y sorteren \n" . - " --high : hoge ASCII waarden converteren \n" . - " --quotes : quotes converteren \n" . - " \n" . - " --documents documentatie file genereren / tex->ted \n" . - " --sources broncode file genereren / tex->tes \n" . - " --setups ConTeXt definities filteren / tex->texutil.tus \n". - " --templates TeXEdit templates filteren / tex->tud \n" . - " --infos TeXEdit helpinfo filteren / tex->tud \n" . - " \n" . - " --figures eps figuren lijst genereren / eps->texutil.tuf \n". - " --tiff : ook tif files verwerken \n" . - " \n" . - " --logfile logfile filteren / log->texutil.log \n" . - " --box : overfull boxes controleren \n" . - " --criterium : overfull criterium in pt \n" . - " --unknown :onbekende ... controleren \n" ; - - } # end of dutch section - -elsif ($Interface eq "de") - - { # begin of german section - - $MS{"HelpInfo"} = - - " --references Verarbeiten der Hilfsdatei / tui->tuo \n" . - " --ij : Sortiere IJ als Y \n" . - " --high : Konvertiere hohe ASCII-Werte \n" . - " --quotes : Konvertiere akzentuierte Buchstaben \n" . - " \n" . - " --documents Erstelle Dokumentationsdatei / tex->ted \n" . - " --sources Erstelle reine Quelltextdateien / tex->tes \n" . - " --setups Filtere ConTeXt-Definitionen / tex->texutil.tus\n" . - " --templates Filtere TeXEdit-templates / tex->tud \n" . - " --infos Filtere TeXEdit-helpinfo / tex->tud \n" . - " \n" . - " --figures Erstelle eps-Abbildungsliste / eps->texutil.tuf\n" . - " --tiff : Verarbeite auch tif-Dateien \n" . - " \n" . - " --logfile Filtere log-Datei / log->texutil.log \n" . - " --box : Ueberpruefe uebervolle Boxen \n" . - " --criterium : Uebervoll-Kriterium in pt \n" . - " --unknown : Ueberpruefe auf unbekannte ... \n" ; - - } # end of german section - - -else - - { # begin of english section - - $MS{"HelpInfo"} = - - " --references process auxiliary file / tui->tuo \n" . - " --ij : sort IJ as Y \n" . - " --high : convert high ASCII values \n" . - " --quotes : convert quotes characters \n" . - " \n" . - " --documents generate documentation file / tex->ted \n" . - " --sources generate source only file / tex->tes \n" . - " --setups filter ConTeXt definitions / tex->texutil.tus \n" . - " --templates filter TeXEdit templates / tex->tud \n" . - " --infos filter TeXEdit helpinfo / tex->tud \n" . - " \n" . - " --figures generate eps figure list / eps->texutil.tuf \n" . - " --tiff : also process tif files \n" . - " \n" . - " --logfile filter logfile / log->texutil.log \n" . - " --box : check overful boxes \n" . - " --criterium : overfull criterium in pt \n" . - " --unknown : check unknown ... \n" ; - - } # end of english section - -#D \stopcompressdefinitions - -#D In order to sort strings correctly, we have to sanitize -#D them. This is especially needed when we include \TEX\ -#D commands, quotes characters and compound word placeholders. -#D -#D \startopsomming[opelkaar] -#D \som \type{\name}: csnames are stripped -#D \som \type{{}}: are removed -#D \som \type{\"e}: and alike are translated into \type{"e} etc. -#D \som \type{"e}: is translated into an \type{e} and \type{b} etc. -#D \som \type{||}: becomes \type{-} -#D \som \type{\-}: also becomes \type{-} -#D \stopopsomming -#D -#D Of course other accented characters are handled too. The -#D appended string is responsible for decent sorting. -#D -#D \startPL -#D $TargetString = SanitizedString ( $SourceString ) ; -#D \stopPL -#D -#D The sort order depends on the ordering in array -#D \type{$ASCII}: - -$ASCII{"^"} = "a" ; $ASCII{'"'} = "b" ; $ASCII{"`"} = "c" ; -$ASCII{"'"} = "d" ; $ASCII{"~"} = "e" ; $ASCII{","} = "f" ; - -sub SanitizedString - { my ($string) = $_[0] ; - if ($ProcessQuotes) - { $string =~ s/\\([\^\"\`\'\~\,])/$1/gio ; - $copied = $string ; - $copied =~ s/([\^\"\`\'\~\,])([a-zA-Z])/$ASCII{$1}/gio ; - $string =~ s/([\^\"\`\'\~\,])([a-zA-Z])/$2/gio ; - $string=$string.$copied } - $string =~ s/\\-|\|\|/\-/gio ; - $string =~ s/\\[a-zA-Z]*| |\{|\}//gio ; - return $string } - -#D This subroutine looks a bit complicated, which is due to the -#D fact that we want to sort for instance an accented \type{e} -#D after the plain \type{e}, so the imaginary words -#D -#D \starttypen -#D eerste -#D \"eerste -#D \"e\"erste -#D eerst\"e -#D \stoptypen -#D -#D come out in an acceptable order. - -#D We also have to deal with the typical \TEX\ sequences with -#D the double \type{^}'s, like \type{^^45}. These hexadecimal -#D coded characters are just converted. -#D -#D \startPL -#D $TargetString = HighConverted ( $SourceString ) ; -#D \stopPL - -sub HighConverted - { my ($string) = $_[0] ; - $string =~ s/\^\^([a-f0-9][a-f0-9])/chr hex($1)/geo ; - return $string } - -#D \extras -#D {references} -#D -#D \CONTEXT\ can handle many lists, registers (indexes), -#D tables of whatever and references. This data is collected -#D in one pass and processed in a second one. In between, -#D relevant data is saved in the file \type{\jobname.tui}. -#D This file also holds some additional information concerning -#D second pass optimizations. -#D -#D The main task of \TEXUTIL\ is to sort lists and registers -#D (indexes). The results are stored in again one file called -#D \type{\jobname.tuo}. -#D -#D Just for debugging purposes the nesting of files loaded -#D during the \CONTEXT\ run is stored. Of course this only -#D applies to files that are handled by the \CONTEXT\ file -#D structuring commands (projects, products, components and -#D environments). -#D -#D We have to handle the entries: -#D -#D \starttypen -#D f b {test} -#D f e {test} -#D \stoptypen -#D -#D and only report some status info at the end of the run. - -sub InitializeFiles - { $NOfFiles = 0 ; - $NOfBadFiles = 0 } - -sub HandleFile - { $RestOfLine =~ s/.*\{(.*)\}/$1/gio ; - ++$Files{$RestOfLine} } - -sub FlushFiles - { print TUO "%\n" . "% Files\n" . "%\n" ; - foreach $File (keys %Files) - { print TUO "% $File ($Files{$File})\n" } - print TUO "%\n" ; - $NOfFiles = keys %Files ; - Report("EmbeddedFiles", $NOfFiles) ; - foreach $File (keys %Files) - { unless (($Files{$File} % 2) eq 0) - { ++$NOfBadFiles ; - Report("BeginEndError", $File) } } } - -#D Commands don't need a special treatment. They are just -#D copied. Such commands are tagged by a \type{c}, like: -#D -#D \starttypen -#D c \thisisutilityversion{year.month.day} -#D c \twopassentry{class}{key}{value} -#D c \mainreference{prefix}{entry}{pagenumber}{realpage}{tag} -#D c \listentry{category}{tag}{number}{title}{pagenumber}{realpage} -#D c \realnumberofpages{number} -#D \stoptypen -#D -#D For historic reasons we check for the presense of the -#D backslash. - -sub InitializeCommands - { print TUO "%\n" . "% Commands\n" . "%\n" ; - $NOfCommands = 0 } - -sub HandleCommand - { ++$NOfCommands ; - $RestOfLine =~ s/^\\//go ; - print TUO "\\$RestOfLine\n" } - -sub FlushCommands - { Report ("PassedCommands", $NOfCommands) } - -#D Synonyms are a sort of key||value pairs and are used for -#D ordered lists like abbreviations and units. -#D -#D \starttypen -#D s e {class}{sanitized key}{key}{associated data} -#D \stoptypen -#D -#D The sorted lists are saved as (surprise): -#D -#D \starttypen -#D \synonymentry{class}{sanitized key}{key}{associated data} -#D \stoptypen - -sub InitializeSynonyms - { $NOfSynonyms = 0 ; - $NOfBadSynonyms = 0 } - -#M \definieersynoniem [testname] [testnames] [\testmeaning] -#M -#M \stelsynoniemenin [testname] [criterium=alles] - -#D Let's first make clear what we can expect. Synonym -#D entries look like: -#D -#D \startbuffer -#D \testname [alpha] {\sl alpha} {a greek letter a} -#D \testname {alpha} {another a} -#D \testname [Beta] {\kap{beta}} {a greek letter b} -#D \testname {beta} {indeed another b} -#D \testname {gamma} {something alike g} -#D \testname {delta} {just a greek d} -#D \stopbuffer -#D -#D \typebuffer -#D -#D This not that spectacular list is to be sorted according -#D to the keys (names). \haalbuffer - -sub HandleSynonym - { ++$NOfSynonyms ; - ($SecondTag, $RestOfLine) = split(/ /, $RestOfLine, 2) ; - ($Class, $Key, $Entry, $Meaning) = split(/} \{/, $RestOfLine) ; - chop $Meaning ; - $Class = substr $Class, 1 ; - if ($Entry eq "") - { ++$NOfBadSynonyms } - else - { $SynonymEntry[$NOfSynonyms] = - $Class . $JOIN . - $Key . $JOIN . - $Entry . $JOIN . - $Meaning ; - $SynonymEntry[$NOfSynonyms+1] = "" ; } } - -#D Depending on the settings\voetnoot{One can call for -#D all defined entries, call only the used ones, change -#D layout, attach (funny) commands etc.} a list of -#D {\em testnames} looks like: -#D -#D \plaatslijstmettestnames -#D -#D Watch the order in which these entries are sorted. - -$SynonymEntry[0] = ("") ; # TH: initalize - -sub FlushSynonyms - { print TUO "%\n" . "% Synonyms\n" . "%\n" ; - @SynonymEntry = sort @SynonymEntry ; - $NOfSaneSynonyms = 0 ; - for ($n=1; $n<=$NOfSynonyms; ++$n) - { # check normally not needed - if ($SynonymEntry[$n] ne $SynonymEntry[$n-1]) - { ($Class, $Key, $Entry, $Meaning) = - split(/$JOIN/, $SynonymEntry[$n]) ; - ++$NOfSaneSynonyms ; - print TUO "\\synonymentry{$Class}{$Key}{$Entry}{$Meaning}\n" } } - Report("SynonymEntries", $NOfSynonyms, "->", $NOfSaneSynonyms, "Entries") ; - if ($NOfBadSynonyms>0) - { Report("SynonymErrors", $NOfBadSynonyms) } } - -#D Register entries need a bit more care, especially when they -#D are nested. In the near future we will also handle page -#D ranges. -#D -#D \starttypen -#D r e {class}{tag}{sanitized key}{key}{pagenumber}{realpage} -#D r s {class}{tag}{sanitized key}{key}{string}{pagenumber} -#D \stoptypen - -#D The first one is the normal entry, the second one concerns -#D {\em see this or that} entries. Keys are sanitized, unless -#D the user supplies a sanitized key. To save a lot of -#D programming, all data concerning an entry is stored in one -#D string. Subentries are specified as: -#D -#D \starttypen -#D first&second&third -#D first+second+third -#D \stoptypen -#D -#D When these characters are needed for typesetting purposes, we -#D can also use the first character to specify the separator: -#D -#D \starttypen -#D &$x^2+y^2=r^2$ -#D +this \& that -#D \stoptypen -#D -#D Subentries are first unpacked and next stored in a -#D consistent way, which means that we can use both separators -#D alongside each other. We leave it to the reader to sort -#D out the dirty tricks. - -$SPLIT ="%%" ; -$JOIN ="__" ; - -sub InitializeRegisters - { $NOfEntries = 0 ; - $NOfBadEntries = 0 } - -$ProcessType = "" ; # TH: initialize - -sub HandleRegister - { ($SecondTag, $RestOfLine) = split(/ /, $RestOfLine, 2) ; - ++$NOfEntries ; - if ($SecondTag eq "s") - { ($Class, $Location, $Key, $Entry, $SeeToo, $Page ) = - split(/} \{/, $RestOfLine) ; - chop $Page ; - $Class = substr $Class, 1 ; - $RealPage = 0 } - else - { ($Class, $Location, $Key, $Entry, $Page, $RealPage ) = - split(/} \{/, $RestOfLine) ; - chop $RealPage ; - $Class = substr $Class, 1 ; - $SeeToo = "" } - if ($Key eq "") - { $Key = SanitizedString($Entry) } - if ($ProcessHigh) - { $Key = HighConverted($Key) } - $KeyTag = substr $Key, 0, 1 ; - if ($KeyTag eq "&") - { $Key =~ s/^\&//go ; - $Key =~ s/([^\\])\&/$1$SPLIT/go } - elsif ($KeyTag eq "+") - { $Key =~ s/^\+//go ; - $Key =~ s/([^\\])\+/$1$SPLIT/go } - else - { $Key =~ s/([^\\])\&/$1$SPLIT/go ; - $Key =~ s/([^\\])\+/$1$SPLIT/go } - $EntryTag = substr $Entry, 0, 1 ; - if ($EntryTag eq "&") - { $Entry =~ s/^\&//go ; - $Entry =~ s/([^\\])\&/$1$SPLIT/go } - elsif ($EntryTag eq "+") - { $Entry =~ s/^\+//go ; - $Entry =~ s/([^\\])\+/$1$SPLIT/go } - else - { $Entry =~ s/([^\\])\&/$1$SPLIT/go ; - $Entry =~ s/([^\\])\+/$1$SPLIT/go } - $Key =~ s/^([^a-zA-Z])/ $1/go ; - if ($ProcessIJ) - { $Key =~ s/ij/yy/go } - $LCKey = lc $Key ; - $RegisterEntry[$NOfEntries] = - $Class . $JOIN . - $LCKey . $JOIN . - $Key . $JOIN . - $Entry . $JOIN . - $RealPage . $JOIN . - $Location . $JOIN . - $Page . $JOIN . - $SeeToo } - -#M \definieerregister [testentry] [testentries] - -#D The previous routine deals with entries like: -#D -#D \startbuffer -#D \testentry {alpha} -#D \testentry {beta} -#D \testentry {gamma} -#D \testentry {gamma} -#D \testentry {delta} -#D \testentry {epsilon} -#D \testentry {alpha+first} -#D \testentry {alpha+second} -#D \testentry {alpha+second} -#D \testentry {alpha+third} -#D \testentry {alpha+second+one} -#D \testentry {alpha+second+one} -#D \testentry {alpha+second+two} -#D \testentry {alpha+second+three} -#D \testentry {gamma+first+one} -#D \testentry {gamma+second} -#D \testentry {gamma+second+one} -#D -#D \testentry {alpha+fourth} -#D \testentry {&alpha&fourth} -#D \testentry {+alpha+fourth} -#D -#D \testentry [alpha+fourth] {alpha+fourth} -#D \testentry [&alpha&fourth&one] {&alpha&fourth&one} -#D \testentry [+alpha+fourth+two] {&alpha&fourth&two} -#D -#D \testentry {\kap{alpha}+fifth} -#D \testentry {\kap{alpha}+f\'ifth} -#D \testentry {\kap{alpha}+f"ifth} -#D -#D \testentry [&betaformula] {&$a^2+b^2=c^2$} -#D -#D \testentry {zeta \& more} -#D \stopbuffer -#D -#D \typebuffer -#D -#D \haalbuffer After being sorted, these entries are -#D turned into something \TEX\ using: - -$RegisterEntry[0] = ("") ; # TH: initialize - -sub FlushRegisters - { print TUO "%\n" . "% Registers\n" . "%\n" ; - @RegisterEntry = sort @RegisterEntry ; - $NOfSaneEntries = 0 ; - $NOfSanePages = 0 ; - $LastPage = "" ; - $LastRealPage = "" ; - $AlfaClass = "" ; - $Alfa = "" ; - $PreviousA = "" ; - $PreviousB = "" ; - $PreviousC = "" ; - $ActualA = "" ; - $ActualB = "" ; - $ActualC = "" ; - for ($n=1 ; $n<=$NOfEntries ; ++$n) - { ($Class, $LCKey, $Key, $Entry, $RealPage, $Location, $Page, $SeeToo) = - split(/$JOIN/, $RegisterEntry[$n]) ; - if (((lc substr $Key, 0, 1) ne lc $Alfa) or ($AlfaClass ne $Class)) - { $Alfa= lc substr $Key, 0, 1 ; - $AlfaClass = $Class ; - if ($Alfa ne " ") - { print TUO "\\registerentry{$Class}{$Alfa}\n" } } - ($ActualA, $ActualB, $ActualC ) = - split(/$SPLIT/, $Entry, 3) ; - unless ($ActualA) { $ActualA = "" } # TH: this would be an error - unless ($ActualB) { $ActualB = "" } # TH: might become undef through split() - unless ($ActualC) { $ActualC = "" } # TH: might become undef through split() - if ($ActualA eq $PreviousA) - { $ActualA = "" } - else - { $PreviousA = $ActualA ; - $PreviousB = "" ; - $PreviousC = "" } - if ($ActualB eq $PreviousB) - { $ActualB = "" } - else - { $PreviousB = $ActualB ; - $PreviousC = "" } - if ($ActualC eq $PreviousC) - { $ActualC = "" } - else - { $PreviousC = $ActualC } - $Copied = 0 ; - if ($ActualA ne "") - { print TUO "\\registerentrya{$Class}{$ActualA}\n" ; - $Copied = 1 } - if ($ActualB ne "") - { print TUO "\\registerentryb{$Class}{$ActualB}\n" ; - $Copied = 1 } - if ($ActualC ne "") - { print TUO "\\registerentryc{$Class}{$ActualC}\n" ; - $Copied = 1 } - if ($Copied) - { $NOfSaneEntries++ } - if ($RealPage eq 0) - { print TUO "\\registersee{$Class}{$SeeToo}{$Page}\n" ; - $LastPage = $Page ; - $LastRealPage = $RealPage } - elsif (($Copied) || - ! (($LastPage eq $Page) and ($LastRealPage eq $RealPage))) - { print TUO "\\registerpage{$Class}{$Location}{$Page}{$RealPage}\n" ; - ++$NOfSanePages ; - $LastPage = $Page ; - $LastRealPage = $RealPage } } - Report("RegisterEntries", $NOfEntries, "->", $NOfSaneEntries, "Entries", - $NOfSanePages, "References") ; - if ($NOfBadEntries>0) - { Report("RegisterErrors", $NOfBadEntries) } } - -#D As promised, we show the results: -#D -#D \plaatstestentry - -#D For debugging purposes we flush some status information. The -#D faster machines become, the more important this section will -#D be. - -sub FlushData - { print TUO - "% This Session\n" . - "% \n" . - "% embedded files : $NOfFiles ($NOfBadFiles errors)\n" . - "% passed commands : $NOfCommands\n" . - "% synonym entries : $NOfSynonyms ($NOfBadSynonyms errors)\n" . - "% register entries : $NOfEntries ($NOfBadEntries errors)" } - -#D The functionallity described on the previous few pages is -#D called upon in the main routine: - -sub HandleReferences - { Report("Action", "ProcessingReferences") ; - if ($ProcessIJ ) - { Report("Option", "SortingIJ") } - if ($ProcessHigh) - { Report("Option", "ConvertingHigh") } - if ($ProcessQuotes) - { Report("Option", "ProcessingQuotes") } - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { unless (open (TUI, "$InputFile.tui")) - { Report("Error", "EmptyInputFile", $InputFile) } - else - { Report("InputFile", "$InputFile.tui" ) ; - InitializeCommands ; - InitializeRegisters ; - InitializeSynonyms ; - InitializeFiles ; - $ValidOutput = 1 ; - unlink "$InputFile.tmp" ; - rename "$InputFile.tuo", "$InputFile.tmp" ; - Report("OutputFile", "$InputFile.tuo" ) ; - open (TUO, ">$InputFile.tuo") ; - while ($SomeLine=<TUI>) - { chop $SomeLine ; - ($FirstTag, $RestOfLine) = split ' ', $SomeLine, 2 ; - if ($FirstTag eq "c") - { HandleCommand } - elsif ($FirstTag eq "s") - { HandleSynonym } - elsif ($FirstTag eq "r") - { HandleRegister } - elsif ($FirstTag eq "f") - { HandleFile } - elsif ($FirstTag eq "q") - { $ValidOutput = 0 ; - last } } - if ($ValidOutput) - { FlushCommands ; # already done during pass - FlushRegisters ; - FlushSynonyms ; - FlushFiles ; - FlushData } - else - { unlink "$InputFile.tuo" ; - rename "$InputFile.tmp", "$InputFile.tuo" ; - Report ("Error", "NoOutputFile") } } } } - -#D \extras -#D {documents} -#D -#D Documentation can be woven into a source file. The next -#D routine generates a new, \TEX\ ready file with the -#D documentation and source fragments properly tagged. The -#D documentation is included as comment: -#D -#D \starttypen -#D %D ...... some kind of documentation -#D %M ...... macros needed for documenation -#D %S B begin skipping -#D %S E end skipping -#D \stoptypen -#D -#D The most important tag is \type{%D}. Both \TEX\ and -#D \METAPOST\ files use \type{%} as a comment chacacter, while -#D \PERL\ uses \type{#}. Therefore \type{#D} is also handled. -#D -#D The generated file gets the suffix \type{ted} and is -#D structured as: -#D -#D \starttypen -#D \startmodule[type=suffix] -#D \startdocumentation -#D \stopdocumentation -#D \startdefinition -#D \stopdefinition -#D \stopmodule -#D \stoptypen -#D -#D Macro definitions specific to the documentation are not -#D surrounded by start||stop commands. The suffix specifaction -#D can be overruled at runtime, but defaults to the file -#D extension. This specification can be used for language -#D depended verbatim typesetting. - -sub HandleDocuments - { Report("Action", "HandlingDocuments") ; - if ($ProcessType ne "") - { Report("Option", "ForcingFileType", $ProcessType) } - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { CheckInputFiles ($InputFile) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ; - unless ($FileSuffix) - { $FileSuffix = "tex" } - unless (-f "$FileName.$FileSuffix") - { next } - unless (open (TEX, "$FileName.$FileSuffix")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - else - { Report("InputFile", "$FileName.$FileSuffix") ; - Report("OutputFile", "$FileName.ted") ; - open (TED, ">$FileName.ted") ; - $NOfDocuments = 0 ; - $NOfDefinitions = 0 ; - $NOfSkips = 0 ; - $SkipLevel = 0 ; - $InDocument = 0 ; - $InDefinition = 0 ; - if ($ProcessType eq "") - { $FileType=lc $FileSuffix } - else - { $FileType=lc $ProcessType } - Report("FileType", $FileType) ; - print TED "\\startmodule[type=$FileType]\n" ; - while (<TEX>) # TH: $SomeLines replaced by $_ - { chop; - if (/^[%\#]D/) - { if ($SkipLevel == 0) - { if (length $_ < 3) # TH: empty #D comment - {$SomeLine = "" } - else # HH: added after that - {$SomeLine = substr ($_, 3) } - if ($InDocument) - { print TED "$SomeLine\n" } - else - { if ($InDefinition) - { print TED "\\stopdefinition\n" ; - $InDefinition = 0 } - unless ($InDocument) - { print TED "\n\\startdocumentation\n" } - print TED "$SomeLine\n" ; - $InDocument = 1 ; - ++$NOfDocuments } } } - elsif (/^[%\#]M/) - { if ($SkipLevel == 0) - { $SomeLine = substr $_, 3 ; - print TED "$SomeLine\n" } } - elsif (/^[%\%]S B]/) - { ++$SkipLevel ; - ++$NOfSkips } - elsif (/^[%\%]S E]/) - { --$SkipLevel } - elsif (/^[%\#]/) - { } - elsif ($SkipLevel == 0) - { $InLocalDocument = $InDocument ; - $SomeLine = $_ ; - if ($InDocument) - { print TED "\\stopdocumentation\n" ; - $InDocument = 0 } - if (($SomeLine eq "") && ($InDefinition)) - { print TED "\\stopdefinition\n" ; - $InDefinition = 0 } - else - { if ($InDefinition) - { print TED "$SomeLine\n" } - elsif ($SomeLine ne "") - { print TED "\n" . "\\startdefinition\n" ; - $InDefinition = 1 ; - unless ($InLocalDocument) - { ++$NOfDefinitions } - print TED "$SomeLine\n" } } } } - if ($InDocument) - { print TED "\\stopdocumentation\n" } - if ($InDefinition) - { print TED "\\stopdefinition\n" } - print TED "\\stopmodule\n" ; - close (TED) ; - unless (($NOfDocuments) || ($NOfDefinitions)) - { unlink "$FileName.ted" } - Report ("NOfDocuments", $NOfDocuments) ; - Report ("NOfDefinitions", $NOfDefinitions) ; - Report ("NOfSkips", $NOfSkips) } } } } - -#D \extras -#D {sources} -#D -#D Documented sources can be stripped of documentation and -#D comments, although at the current processing speeds the -#D overhead of skipping the documentation at run time is -#D neglectable. Only lines beginning with a \type{%} are -#D stripped. The stripped files gets the suffix \type{tes}. - -sub HandleSources - { Report("Action", "GeneratingSources") ; - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { CheckInputFiles ($InputFile) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ; - unless ($FileSuffix) - { $FileSuffix = "tex" } - unless (-f "$FileName.$FileSuffix") - { next } - unless (open (TEX, "$FileName.$FileSuffix")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - else - { Report("InputFile", "$FileName.$FileSuffix") ; - Report("OutputFile", "$FileName.tes") ; - open (TES, ">$FileName.tes") ; - $EmptyLineDone = 1 ; - $FirstCommentDone = 0 ; - while ($SomeLine=<TEX>) - { chop $SomeLine ; - if ($SomeLine eq "") - { unless ($FirstCommentDone) - { $FirstCommentDone = 1 ; - print TES - "\n% further documentation is removed\n\n" ; - $EmptyLineDone = 1 } - unless ($EmptyLineDone) - { print TES "\n" ; - $EmptyLineDone = 1 } } - elsif ($SomeLine =~ /^%/) - { unless ($FirstCommentDone) - { print TES "$SomeLine\n" ; - $EmptyLineDone = 0 } } - else - { print TES "$SomeLine\n" ; - $EmptyLineDone = 0 } } - close (TES) ; # TH: repaired - unless ($FirstCommentDone) - { unlink "$FileName.tes" } } } } } - -#D \extras -#D {setups} -#D -#D All \CONTEXT\ commands are specified in a compact format -#D that can be used to generate quick reference tables and -#D cards. Such setups are preceded by \type{%S}. The setups -#D are collected in the file \type{texutil.tus}. - -sub HandleSetups - { Report("Action", "FilteringDefinitions" ) ; - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { Report("OutputFile", "texutil.tus") ; - open (TUS, ">texutil.tus") ; # this file is always reset! - $NOfSetups = 0 ; - CheckInputFiles ($InputFile) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ; - unless ($FileSuffix) - { $FileSuffix = "tex" } - unless (-f "$FileName.$FileSuffix") - { next } - unless (open (TEX, "$FileName.$FileSuffix")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - else - { Report("InputFile", "$FileName.$FileSuffix") ; - print TUS "%\n" . "% File : $FileName.$FileSuffix\n" . "%\n" ; - while ($SomeLine=<TEX>) - { chomp ; - chop $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) ; - if ($Tag eq "%S") - { ++$NOfSetups ; - while ($Tag eq "%S") - { print TUS "$RestOfLine\n" ; - $SomeLine = <TEX> ; - chomp ; - chop $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) } - print TUS "\n" } } } } - close (TUS) ; - unless ($NOfSetups) - { unlink "texutil.tus" } - Report("NOfSetups", $NOfSetups) } } - -#D \extras -#D {templates, infos} -#D -#D From the beginning, the \CONTEXT\ source files contained -#D helpinfo and key||templates for \TEXEDIT. In fact, for a -#D long time, this was the only documentation present. More -#D and more typeset (interactive) documentation is replacing -#D this helpinfo, but we still support the traditional method. -#D This information is formatted like: -#D -#D \starttypen -#D %I n=Struts -#D %I c=\strut,\setnostrut,\setstrut,\toonstruts -#D %I -#D %I text -#D %I .... -#D %P -#D %I text -#D %I .... -#D \stoptypen -#D -#D Templates look like: -#D -#D \starttypen -#D %T n=kap -#D %T m=kap -#D %T a=k -#D %T -#D %T \kap{?} -#D \stoptypen -#D -#D The key||value pairs stand for {\em name}, {\em mnemonic}, -#D {\em key}. This information is copied to files with the -#D extension \type{tud}. - -sub HandleEditorCues - { if ($ProcessTemplates) - { Report("Action", "CopyingTemplates" ) } - if ($ProcessInfos) - {Report("Action", "CopyingInformation" ) } - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { CheckInputFiles ($InputFile) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ; - if ($FileSuffix eq "") - { $FileSuffix = "tex" } - unless (-f "$FileName.$FileSuffix") - { next } - unless (open (TEX, "$FileName.$FileSuffix")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - else - { Report("InputFile", "$FileName.$FileSuffix") ; - Report("OutputFile", "$FileName.tud") ; - open (TUD, ">$FileName.tud") ; - $NOfTemplates = 0 ; - $NOfInfos = 0 ; - while ($SomeLine=<TEX>) - { chomp ; - chop $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) ; - if (($Tag eq "%T") && ($ProcessTemplates)) - { ++$NOfTemplates ; - while ($Tag eq "%T") - { print TUD "$SomeLine\n" ; - $SomeLine = <TEX> ; - chomp ; - chop $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) } - print TUD "\n" } - elsif (($Tag eq "%I") && ($ProcessInfos)) - { ++$NOfInfos ; - while (($Tag eq "%I") || ($Tag eq "%P")) - { print TUD "$SomeLine\n" ; - $SomeLine = <TEX> ; - chomp ; - chop $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) } - print TUD "\n" } } - close (TUD) ; - unless (($NOfTemplates) || ($NOfInfos)) - { unlink "$FileName.tud" } - if ($ProcessTemplates) - { Report("NOfTemplates", $NOfTemplates) } - if ($ProcessInfos) - { Report("NOfInfos", $NOfInfos) } } } } } - -#D \extras -#D {figures} -#D -#D Directories can be scanned for illustrations in \EPS\ or -#D \TIFF\ format. The later type of graphics is prescanned by -#D dedicated programs, whose data is used here. The resulting -#D file \type{texutil.tuf} contains entries like: -#D -#D \starttypen -#D \thisisfigureversion{year.month.day} -#D \presetfigure[file][...specifications...] -#D \stoptypen -#D -#D where the specifications are: -#D -#D \starttypen -#D [e=suffix,x=xoffset,y=yoffset,w=width,h=height,t=title,c=creator,s=size] -#D \stoptypen -#D -#D This data can be used when determining dimensions (although -#D \CONTEXT\ is able to scan \EPS\ illustrations directly) and -#D to generate directories of illustrations. - -$PTtoCM = 2.54/72.0 ; -$INtoCM = 2.54 ; - -sub HandleEpsFigure - { my ( $SuppliedFileName ) = @_ ; - ($FileName, $FileSuffix) = split ( /\./, $SuppliedFileName, 2) ; - $Temp = $FileSuffix; - $Temp =~ s/[0-9]//go; - if ($Temp eq "") - { $EpsFileName = $SuppliedFileName; - Report ( "MPFile", "$SuppliedFileName" ) } - elsif (lc $FileSuffix ne "eps") - { return } - else - { $EpsFileName = $FileName; - Report ( "EpsFile", "$SuppliedFileName" ) } - $HiResBBOX = "" ; - $LoResBBOX = "" ; - $EpsTitle = "" ; - $EpsCreator = "" ; - open ( EPS , $SuppliedFileName ) ; - $EpsSize = -s EPS ; - while ( $SomeLine = <EPS> ) - { chop ($SomeLine) ; - unless ($HiResBBOX) - { if ($SomeLine =~ /^%%BoundingBox:/i) - { ($Tag, $LoResBBOX) = split (/ /, $SomeLine, 2) ; - next } - elsif ($SomeLine =~ /^%%HiResBoundingBox:/i) - { ($Tag, $HiResBBOX) = split (/ /, $SomeLine, 2) ; - next } - elsif ($SomeLine =~ /^%%ExactBoundingBox:/i) - { ($Tag, $HiResBBOX) = split (/ /, $SomeLine, 2) ; - next } } - if ($SomeLine =~ /^%%Creator:/i) - { ($Tag, $EpsCreator) = split (/ /, $SomeLine, 2) } - elsif ($SomeLine =~ /^%%Title:/i) - { ($Tag, $EpsTitle) = split (/ /, $SomeLine, 2) } } - if ($HiResBBOX) - { $EpsBBOX = $HiResBBOX } - else - { $EpsBBOX = $LoResBBOX } - if ($EpsBBOX) - { ($LLX, $LLY, $URX, $URY, $RestOfLine) = split (/ /, $EpsBBOX, 5 ) ; - $EpsHeight = ($URY-$LLY)*$PTtoCM ; - $EpsWidth = ($URX-$LLX)*$PTtoCM ; - $EpsXOffset = $LLX*$PTtoCM ; - $EpsYOffset = $LLY*$PTtoCM ; - $Figures[++$NOfFigures] = - "\\presetfigure[$EpsFileName][e=eps" . - (sprintf ",x=%5.3fcm,y=%5.3fcm", $EpsXOffset, $EpsYOffset) . - (sprintf ",w=%5.3fcm,h=%5.3fcm", $EpsWidth, $EpsHeight) . - ",t=$EpsTitle,c=$EpsCreator,s=$EpsSize]\n" } } - -sub HandleEpsFigures - { if ($InputFile eq "") - { $InputFile = "*.eps" } - CheckInputFiles ($InputFile) ; - foreach $FileName (@UserSuppliedFiles) - { HandleEpsFigure ( $FileName ) } } - -#D Here we call the programs that generate information on -#D the \TIFF\ files. The names of the programs are defined -#D earlier. - -if ($ProcessTiff) - { $FindTiffFigure = "" ; - $UsedTiffProgram = "" ; - unlink "tiffdata.tmp" ; - foreach $TiffProgram (@TiffPrograms) - { if ((system ("$TiffProgram *.tif > tiffdata.tmp") == 0) - && (-s "tiffdata.tmp")) - { $UsedTiffProgram = $TiffProgram ; - $FindTiffFigure = "FindTiffFigure_$UsedTiffProgram" ; - last } } } - -#D The scanning routines use filehandle \type{TMP} and call for -#D \type{ReportTifFigure} with the arguments \type{Name}, -#D \type{Width} and \type{Height}. - -sub ReportTifFigure - { my ($Name, $Width, $Height) = @_ ; - $Name = lc $Name ; - # - # if ($InputFile ne "") - # { $Ok = 0 ; - # foreach $IFile (@UserSuppliedFiles) - # { $Ok = ($Ok || ($IFile eq "$Name.tif" )) } - # else - # { $Ok = 1 } - # - $Ok = 1 ; - # - if ($Ok) - { $Size = -s "$Name.tif" ; - Report ( "TifFile", "$Name.tif") ; - $Figures[++$NOfFigures] = - "\\presetfigure[$Name][e=tif" . - (sprintf ",w=%5.3fcm,h=%5.3fcm", $Width, $Height) . - ",s=$Size]\n" } } - -sub HandleTifFigures - { if ($ProcessTiff) - { if (-s "tiffdata.tmp") - { Report ( "SystemCall", "$UsedTiffProgram -> tiffdata.tmp" ) ; - if ((defined &$FindTiffFigure) && (open(TMP, "tiffdata.tmp"))) - { &$FindTiffFigure } - else - { Report ( "MissingSubroutine", $FindTiffFigure ) } } - else - { Report ( "BadSystemCall", "@TiffPrograms" ) } } } - -#D The next few routines are program specific. Let's cross our -#D fingers on the stability off their output. As one can -#D see, we have to work a bit harder when we use \TIFFINFO\ -#D instead of \TIFFTAGS. - -sub FindTiffFigure_tiffinfo - { while ( $TifName = <TMP> ) - { chomp ; - chop $TifName ; - if (($TifName =~ s/^(.*)\.tif\:.*/$1/i) && - ($SomeLineA = <TMP>) && ($SomeLineA = <TMP>) && - ($SomeLineA = <TMP>) && ($SomeLineB = <TMP>)) - { chop $SomeLineA ; - $TifWidth = $SomeLineA ; - $TifWidth =~ s/.*Image Width: (.*) .*/$1/i ; - $TifHeight = $SomeLineA ; - $TifHeight =~ s/.*Image Length: (.*).*/$1/i ; - $TifWRes = $SomeLineB ; - $TifWRes =~ s/.*Resolution: (.*)\,.*/$1/i ; - $TifHRes = $SomeLineB ; - $TifHRes =~ s/.*Resolution: .*\, (.*).*/$1/i ; - $TifWidth = ($TifWidth/$TifWRes)*$INtoCM ; - $TifHeight = ($TifHeight/$TifHRes)*$INtoCM ; - ReportTifFigure ($TifName, $TifWidth, $TifHeight) } } } - -sub FindTiffFigure_tifftags - { while ( $TifName = <TMP> ) - { chomp ; - chop $TifName ; - if (($TifName =~ s/.*\`(.*)\.tif\'.*/$1/i) && - ($SomeLine = <TMP>) && ($SomeLine = <TMP>)) - { chop $SomeLine ; - $TifWidth = $SomeLine ; - $TifWidth =~ s/.*\((.*) pt.*\((.*) pt.*/$1/ ; - $TifHeight = $SomeLine ; - $TifHeight =~ s/.*\((.*) pt.*\((.*) pt.*/$2/ ; - $TifWidth = $TifWidth*$PTtoCM ; - $TifHeight = $TifHeight*$PTtoCM ; - ReportTifFigure ($TifName, $TifWidth, $TifHeight) } } } - -sub InitializeFigures - { $NOfFigures = 0 } - -sub FlushFigures - { $Figures = sort $Figures ; - open ( TUF, ">texutil.tuf" ) ; - print TUF "%\n" . "% Figures\n" . "%\n" ; - print TUF "\\thisisfigureversion\{1996.06.01\}\n" . "%\n" ; - for ($n=1 ; $n<=$NOfFigures ; ++$n) - { print TUF $Figures[$n] } - close (TUF) ; - unless ($NOfFigures) - { unlink "texutil.tuf" } - Report ( "NOfFigures", $NOfFigures ) } - -sub HandleFigures - { Report("Action", "GeneratingFigures" ) ; - if ($ProcessTiff) - { Report("Option", "UsingTiff") } - InitializeFigures ; - HandleEpsFigures ; - HandleTifFigures ; - FlushFigures } - -#D \extras -#D {logfiles} -#D -#D This (poor man's) log file scanning routine filters -#D overfull box messages from a log file (\type{\hbox}, -#D \type{\vbox} or both). The collected problems are saved -#D in \type{texutil.log}. One can specify a selection -#D criterium. -#D -#D \CONTEXT\ reports unknown entities. These can also be -#D filtered. When using fast computers, or when processing -#D files in batch, one has to rely on the log files and/or -#D this filter. - -$Unknown = "onbekend|unknown|unbekant" ; - -sub FlushLogTopic - { unless ($TopicFound) - { $TopicFound = 1 ; - print ALL "\n% File: $FileName.log\n\n" } } - -sub HandleLogFile - { if ($ProcessBox) - { Report("Option", "FilteringBoxes", "(\\vbox & \\hbox)") ; - $Key = "[h|v]box" } - elsif ($ProcessHBox) - { Report("Option", "FilteringBoxes", "(\\hbox)") ; - $Key = "hbox" ; - $ProcessBox = 1 } - elsif ($ProcessVBox) - { Report("Option", "FilteringBoxes", "(\\vbox)") ; - $Key = "vbox" ; - $ProcessBox = 1 } - if (($ProcessBox) && ($ProcessCriterium)) - { Report("Option", "ApplyingCriterium") } - if ($ProcessUnknown) - { Report("Option", "FilteringUnknown") } - unless (($ProcessBox) || ($ProcessUnknown)) - { ShowHelpInfo ; - return } - Report("Action", "FilteringLogFile" ) ; - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { $NOfBoxes = 0 ; - $NOfMatching = 0 ; - $NOfUnknown = 0 ; - Report("OutputFile", "texutil.log") ; - CheckInputFiles ($InputFile) ; - open ( ALL, ">texutil.log" ) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ; - if (! open (LOG, "$FileName.log")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - elsif (-e "$FileName.tex") - { $TopicFound = 0 ; - Report("InputFile", "$FileName.log") ; - while ($SomeLine=<LOG>) - { chomp ; - if (($ProcessBox) && ($SomeLine =~ /Overfull \\$Key/)) - { ++$NOfBoxes ; - $SomePoints = $SomeLine ; - $SomePoints =~ s/.*\((.*)pt.*/$1/ ; - if ($SomePoints>=$ProcessCriterium) - { ++$NOfMatching ; - FlushLogTopic ; - print ALL "$SomeLine" ; - $SomeLine=<LOG> ; - print ALL $SomeLine } } - if (($ProcessUnknown) && ($SomeLine =~ /$Unknown/io)) - { ++$NOfUnknown ; - FlushLogTopic ; - print ALL "$SomeLine" } } } } - close (ALL) ; - unless (($NOfBoxes) ||($NOfUnknown)) - { unlink "texutil.log" } - if ($ProcessBox) - { Report ( "NOfBoxes" , "$NOfBoxes", "->", $NOfMatching, "Overfull") } - if ($ProcessUnknown) - { Report ( "NOfUnknown", "$NOfUnknown") } } } - -#D We're done! All this actions and options are organized in -#D one large conditional: - - ShowBanner ; - -if ($UnknownOptions ) { ShowHelpInfo } # not yet done -elsif ($ProcessReferences) { HandleReferences } -elsif ($ProcessDocuments ) { HandleDocuments } -elsif ($ProcessSources ) { HandleSources } -elsif ($ProcessSetups ) { HandleSetups } -elsif ($ProcessTemplates ) { HandleEditorCues } -elsif ($ProcessInfos ) { HandleEditorCues } -elsif ($ProcessFigures ) { HandleFigures } -elsif ($ProcessLogFile ) { HandleLogFile } -elsif ($ProcessHelp ) { ShowHelpInfo } # redundant -else { ShowHelpInfo } - -#D So far. +#!/usr/bin/perl
+
+#-w
+
+#D \module
+#D [ file=texutil.pl,
+#D version=1997.12.08,
+#D title=pre- and postprocessing utilities,
+#D subtitle=\TEXUTIL,
+#D author=Hans Hagen,
+#D date=\currentdate,
+#D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+#C
+#C This script is part of the \CONTEXT\ macro||package and is
+#C therefore copyrighted by \PRAGMA. Non||commercial use is
+#C granted.
+
+# Thanks to Tobias Burnus for the german translations.
+# Thanks to Taco Hoekwater for making the file -w proof.
+
+#D This is \TEXUTIL, a utility program (script) to be used
+#D alongside the \CONTEXT\ macro package. This \PERL\ script is
+#D derived from the \MODULA\ version and uses slightly better
+#D algoritms for sanitizing \TEX\ specific (sub|)|strings.
+#D This implementation is therefore not entirely compatible
+#D with the original \TEXUTIL, although most users will
+#D probably never notice. Now how was this program called?
+
+$Program = "TeXUtil 6.40 - ConTeXt / PRAGMA 1992-1998" ;
+
+#D By the way, this is my first \PERL\ script, which means
+#D that it will be improved as soon as I find new and/or more
+#D suitable solutions in the \PERL\ manuals. As can be seen in
+#D the definition of \type{$program}, this program is part of
+#D the \CONTEXT\ suite, and therefore can communicate with the
+#D users in english as well as some other languages. One can
+#D set his favourite language by saying something like:
+
+#D \starttypen
+#D perl texutil.pl --interface=de --figures *.eps *.tif
+#D \stoptypen
+#D
+#D Of course one can also say \type{--interface=nl}, which
+#D happens to be my native language.
+
+#D I won't go into too much detail on the algoritms used.
+#D The next few pages show the functionality as reported by the
+#D helpinformation and controled by command line arguments
+#D and can serve as additional documentation.
+
+#D \TEXUTIL\ can handle different tasks; which one is active
+#D depends on the command line arguments. Most task are
+#D handled by the procedures below. The one exception is the
+#D handling of \TIFF\ files when collecting illustration
+#D files. When needed, \TEXUTIL\ calls for \TIFFINFO\ or
+#D \TIFFTAGS, but more alternatives can be added by extending
+#D \type{@TiffPrograms}.
+
+@TiffPrograms = ("tiffinfo", "tifftags") ;
+
+#D Back to the command line arguments. These are handled by
+#D a \PERL\ system module. This means that, at least for the
+#D moment, there is no external control as provided by the
+#D \PRAGMA\ environment system.
+
+use Getopt::Long ;
+
+#D We don't want error messages and accept partial switches,
+#D which saves users some typing.
+
+$Getopt::Long::passthrough = 1 ; # no error message
+$Getopt::Long::autoabbrev = 1 ; # partial switch accepted
+
+#D We also predefine the interface language and set a boolean
+#D that keeps track of unknown options. \voetnoot {This feature
+#D is still to be implemented.}
+
+$Interface = "en" ;
+$UnknownOptions = 0 ;
+
+#D Here come the options:
+
+&GetOptions
+ ("references" => \$ProcessReferences,
+ "ij" => \$ProcessIJ,
+ "high" => \$ProcessHigh,
+ "quotes" => \$ProcessQuotes,
+ "documents" => \$ProcessDocuments,
+ "type=s" => \$ProcessType,
+ "sources" => \$ProcessSources,
+ "setups" => \$ProcessSetups,
+ "templates" => \$ProcessTemplates,
+ "infos" => \$ProcessInfos,
+ "figures" => \$ProcessFigures,
+ "tiff" =>\$ProcessTiff,
+ "logfile" => \$ProcessLogFile,
+ "box" =>\$ProcessBox,
+ "hbox" =>\$ProcessHBox,
+ "vbox" =>\$ProcessVBox,
+ "criterium=f" =>\$ProcessCriterium,
+ "unknown" =>\$ProcessUnknown,
+ "help" => \$ProcessHelp,
+ "interface=s" => \$Interface) ;
+
+#D By default wildcards are expanded into a list. The
+#D subroutine below is therefore only needed when no file or
+#D pattern is given.
+
+$InputFile = "@ARGV" ;
+
+sub CheckInputFiles
+ { my ($UserSuppliedPath) = @_ ;
+ @UserSuppliedFiles = map { split " " } sort lc $UserSuppliedPath }
+
+#D In order to support multiple interfaces, we save the
+#D messages in a hash table. As a bonus we can get a quick
+#D overview of the messages we deal with.
+
+sub Report
+ { foreach $_ (@_)
+ { if (! defined $MS{$_})
+ { print $_ }
+ else
+ { print $MS{$_} }
+ print " " }
+ print "\n" }
+
+#D The messages are saved in a hash table and are called
+#D by name. This contents of this table depends on the
+#D interface language in use.
+
+#D \startcompressdefinitions
+
+if ($Interface eq "nl")
+
+ { # begin of dutch section
+
+ $MS{"ProcessingReferences"} = "commando's, lijsten en indexen verwerken" ;
+ $MS{"GeneratingDocumentation"} = "ConTeXt documentatie file voorbereiden" ;
+ $MS{"GeneratingSources"} = "ConTeXt broncode file genereren" ;
+ $MS{"FilteringDefinitions"} = "ConTeXt definities filteren" ;
+ $MS{"CopyingTemplates"} = "TeXEdit toets templates copieren" ;
+ $MS{"CopyingInformation"} = "TeXEdit help informatie copieren" ;
+ $MS{"GeneratingFigures"} = "figuur file genereren" ;
+ $MS{"FilteringLogFile"} = "log file filteren (poor mans version)" ;
+
+ $MS{"SortingIJ"} = "IJ sorteren onder Y" ;
+ $MS{"ConvertingHigh"} = "hoge ASCII waarden converteren" ;
+ $MS{"ProcessingQuotes"} = "characters met accenten afhandelen" ;
+ $MS{"ForcingFileType"} = "filetype instellen" ;
+ $MS{"UsingTiff"} = "TIF files afhandelen" ;
+ $MS{"FilteringBoxes"} = "overfull boxes filteren" ;
+ $MS{"ApplyingCriterium"} = "criterium toepassen" ;
+ $MS{"FilteringUnknown"} = "onbekende ... filteren" ;
+
+ $MS{"NoInputFile"} = "geen invoer file opgegeven" ;
+ $MS{"NoOutputFile"} = "geen uitvoer file gegenereerd" ;
+ $MS{"EmptyInputFile"} = "lege invoer file" ;
+ $MS{"NotYetImplemented"} = "nog niet beschikbaar" ;
+
+ $MS{"Action"} = " actie :" ;
+ $MS{"Option"} = " optie :" ;
+ $MS{"Error"} = " fout :" ;
+ $MS{"Remark"} = " opmerking :" ;
+ $MS{"SystemCall"} = " systeemaanroep :" ;
+ $MS{"BadSystemCall"} = " foute systeemaanroep :" ;
+ $MS{"MissingSubroutine"} = " onbekende subroutine :" ;
+
+ $MS{"EmbeddedFiles"} = " gebruikte files :" ;
+ $MS{"BeginEndError"} = " b/e fout in :" ;
+ $MS{"SynonymEntries"} = " aantal synoniemen :" ;
+ $MS{"SynonymErrors"} = " fouten :" ;
+ $MS{"RegisterEntries"} = " aantal ingangen :" ;
+ $MS{"RegisterErrors"} = " fouten :" ;
+ $MS{"PassedCommands"} = " aantal commando's :" ;
+
+ $MS{"NOfDocuments"} = " documentatie blokken :" ;
+ $MS{"NOfDefinitions"} = " definitie blokken :" ;
+ $MS{"NOfSkips"} = " overgeslagen blokken :" ;
+ $MS{"NOfSetups"} = " gecopieerde setups :" ;
+ $MS{"NOfTemplates"} = " gecopieerde templates :" ;
+ $MS{"NOfInfos"} = " gecopieerde helpinfos :" ;
+ $MS{"NOfFigures"} = " verwerkte figuren :" ;
+ $MS{"NOfBoxes"} = " te volle boxen :" ;
+ $MS{"NOfUnknown"} = " onbekende ... :" ;
+
+ $MS{"InputFile"} = " invoer file :" ;
+ $MS{"OutputFile"} = " outvoer file :" ;
+ $MS{"FileType"} = " type file :" ;
+ $MS{"EpsFile"} = " eps file :" ;
+ $MS{"TifFile"} = " tif file :" ;
+ $MS{"MPFile"} = " metapost file :" ;
+
+ $MS{"Overfull"} = "te vol" ;
+ $MS{"Entries"} = "ingangen" ;
+ $MS{"References"} = "verwijzingen" ;
+
+ } # end of dutch section
+
+elsif ($Interface eq "de")
+
+ { # begin of german section
+
+ $MS{"ProcessingReferences"} = "Verarbeiten der Befehle, Listen und Register" ;
+ $MS{"GeneratingDocumentation"} = "Vorbereiten der ConTeXt-Dokumentationsdatei" ;
+ $MS{"GeneratingSources"} = "Erstellen einer nur Quelltext ConTeXt-Datei" ;
+ $MS{"FilteringDefinitions"} = "Filtern der ConTeXt-Definitionen" ;
+ $MS{"CopyingTemplates"} = "Kopieren der TeXEdit-Test-key-templates" ;
+ $MS{"CopyingInformation"} = "Kopieren der TeXEdit-Hilfsinformation" ;
+ $MS{"GeneratingFigures"} = "Erstellen einer Abb-Uebersichtsdatei" ;
+ $MS{"FilteringLogFile"} = "Filtern der log-Datei" ;
+
+ $MS{"SortingIJ"} = "Sortiere IJ nach Y" ;
+ $MS{"ConvertingHigh"} = "Konvertiere hohe ASCII-Werte" ;
+ $MS{"ProcessingQuotes"} = "Verarbeiten der Akzentzeichen" ;
+ $MS{"ForcingFileType"} = "Dateityp einstellen" ;
+ $MS{"UsingTiff"} = "TIF-Dateien verarbeite" ;
+ $MS{"FilteringBoxes"} = "Filtern der ueberfuellten Boxen" ;
+ $MS{"ApplyingCriterium"} = "Anwenden des uebervoll-Kriteriums" ;
+ $MS{"FilteringUnknown"} = "Filter unbekannt ..." ;
+
+ $MS{"NoInputFile"} = "Keine Eingabedatei angegeben" ;
+ $MS{"NoOutputFile"} = "Keine Ausgabedatei generiert" ; # TOBIAS
+ $MS{"EmptyInputFile"} = "Leere Eingabedatei" ;
+ $MS{"NotYetImplemented"} = "Noch nicht verfuegbar" ;
+
+ $MS{"Action"} = " Aktion :" ;
+ $MS{"Option"} = " Option :" ;
+ $MS{"Error"} = " Fehler :" ;
+ $MS{"Remark"} = " Anmerkung :" ;
+ $MS{"SystemCall"} = " system call :" ;
+ $MS{"BadSystemCall"} = " bad system call :" ;
+ $MS{"MissingSubroutine"} = " missing subroutine :" ;
+ $MS{"SystemCall"} = " Systemaufruf :" ;
+ $MS{"BadSystemCall"} = " Fehlerhafter Aufruf :" ;
+ $MS{"MissingSubroutine"} = " Fehlende Unterroutine :" ;
+
+ $MS{"EmbeddedFiles"} = " Eingebettete Dateien :" ;
+ $MS{"BeginEndError"} = " Beg./Ende-Fehler in :" ;
+ $MS{"SynonymEntries"} = " Synonymeintraege :" ;
+ $MS{"SynonymErrors"} = " Fehlerhafte Eintraege :" ;
+ $MS{"RegisterEntries"} = " Registereintraege :" ;
+ $MS{"RegisterErrors"} = " Fehlerhafte Eintraege :" ;
+ $MS{"PassedCommands"} = " Verarbeite Befehle :" ;
+
+ $MS{"NOfDocuments"} = " Dokumentbloecke :" ;
+ $MS{"NOfDefinitions"} = " Definitionsbloecke :" ;
+ $MS{"NOfSkips"} = "Uebersprungene Bloecke :" ;
+ $MS{"NOfSetups"} = " Kopierte setups :" ;
+ $MS{"NOfTemplates"} = " Kopierte templates :" ;
+ $MS{"NOfInfos"} = " Kopierte helpinfos :" ;
+ $MS{"NOfFigures"} = " Verarbeitete Abb. :" ;
+ $MS{"NOfBoxes"} = " Zu volle Boxen :" ;
+ $MS{"NOfUnknown"} = " Unbekannt ... :" ;
+
+ $MS{"InputFile"} = " Eingabedatei :" ;
+ $MS{"OutputFile"} = " Ausgabedatei :" ;
+ $MS{"FileType"} = " Dateityp :" ;
+ $MS{"EpsFile"} = " eps-Datei :" ;
+ $MS{"TifFile"} = " tif-Datei :" ;
+ $MS{"MPFile"} = " metapost-Datei :" ;
+
+ $MS{"Overfull"} = "zu voll" ;
+ $MS{"Entries"} = "Eintraege" ;
+ $MS{"References"} = "Referenzen" ;
+
+ } # end of german section
+
+else
+
+ { # begin of english section
+
+ $MS{"ProcessingReferences"} = "processing commands, lists and registers" ;
+ $MS{"GeneratingDocumentation"} = "preparing ConTeXt documentation file" ;
+ $MS{"GeneratingSources"} = "generating ConTeXt source only file" ;
+ $MS{"FilteringDefinitions"} = "filtering formal ConTeXt definitions" ;
+ $MS{"CopyingTemplates"} = "copying TeXEdit quick key templates" ;
+ $MS{"CopyingInformation"} = "copying TeXEdit help information" ;
+ $MS{"GeneratingFigures"} = "generating figure directory file" ;
+ $MS{"FilteringLogFile"} = "filtering log file" ;
+
+ $MS{"SortingIJ"} = "sorting IJ under Y" ;
+ $MS{"ConvertingHigh"} = "converting high ASCII values" ;
+ $MS{"ProcessingQuotes"} = "handling accented characters" ;
+ $MS{"ForcingFileType"} = "setting up filetype" ;
+ $MS{"UsingTiff"} = "processing TIF files" ;
+ $MS{"FilteringBoxes"} = "filtering overfull boxes" ;
+ $MS{"ApplyingCriterium"} = "applying overfull criterium" ;
+ $MS{"FilteringUnknown"} = "filtering unknown ..." ;
+
+ $MS{"NoInputFile"} = "no input file given" ;
+ $MS{"NoOutputFile"} = "no output file generated" ;
+ $MS{"EmptyInputFile"} = "empty input file" ;
+ $MS{"NotYetImplemented"} = "not yet available" ;
+
+ $MS{"Action"} = " action :" ;
+ $MS{"Option"} = " option :" ;
+ $MS{"Error"} = " error :" ;
+ $MS{"Remark"} = " remark :" ;
+ $MS{"SystemCall"} = " system call :" ;
+ $MS{"BadSystemCall"} = " bad system call :" ;
+ $MS{"MissingSubroutine"} = " missing subroutine :" ;
+
+ $MS{"EmbeddedFiles"} = " embedded files :" ;
+ $MS{"BeginEndError"} = " b/e error in :" ;
+ $MS{"SynonymEntries"} = " synonym entries :" ;
+ $MS{"SynonymErrors"} = " bad entries :" ;
+ $MS{"RegisterEntries"} = " register entries :" ;
+ $MS{"RegisterErrors"} = " bad entries :" ;
+ $MS{"PassedCommands"} = " passed commands :" ;
+
+ $MS{"NOfDocuments"} = " document blocks :" ;
+ $MS{"NOfDefinitions"} = " definition blocks :" ;
+ $MS{"NOfSkips"} = " skipped blocks :" ;
+ $MS{"NOfSetups"} = " copied setups :" ;
+ $MS{"NOfTemplates"} = " copied templates :" ;
+ $MS{"NOfInfos"} = " copied helpinfos :" ;
+ $MS{"NOfFigures"} = " processed figures :" ;
+ $MS{"NOfBoxes"} = " overfull boxes :" ;
+ $MS{"NOfUnknown"} = " unknown ... :" ;
+
+ $MS{"InputFile"} = " input file :" ;
+ $MS{"OutputFile"} = " output file :" ;
+ $MS{"FileType"} = " file type :" ;
+ $MS{"EpsFile"} = " eps file :" ;
+ $MS{"TifFile"} = " tif file :" ;
+ $MS{"MPFile"} = " metapost file :" ;
+
+ $MS{"Overfull"} = "overfull" ;
+ $MS{"Entries"} = "entries" ;
+ $MS{"References"} = "references" ;
+
+ } # end of english section
+
+#D \stopcompressdefinitions
+
+#D Showing the banner (name and version of the program) and
+#D offering helpinfo is rather straightforward.
+
+sub ShowBanner
+ { Report("\n$Program\n") }
+
+sub ShowHelpInfo
+ { Report("HelpInfo") }
+
+#D The helpinfo is also saved in the hash table. This looks
+#D like a waste of energy and space, but the program gains
+#D readability.
+
+#D \startcompressdefinitions
+
+if ($Interface eq "nl")
+
+ { # begin of dutch section
+
+ $MS{"HelpInfo"} =
+
+ " --references hulp file verwerken / tui->tuo \n" .
+ " --ij : IJ als Y sorteren \n" .
+ " --high : hoge ASCII waarden converteren \n" .
+ " --quotes : quotes converteren \n" .
+ " \n" .
+ " --documents documentatie file genereren / tex->ted \n" .
+ " --sources broncode file genereren / tex->tes \n" .
+ " --setups ConTeXt definities filteren / tex->texutil.tus \n".
+ " --templates TeXEdit templates filteren / tex->tud \n" .
+ " --infos TeXEdit helpinfo filteren / tex->tud \n" .
+ " \n" .
+ " --figures eps figuren lijst genereren / eps->texutil.tuf \n".
+ " --tiff : ook tif files verwerken \n" .
+ " \n" .
+ " --logfile logfile filteren / log->texutil.log \n" .
+ " --box : overfull boxes controleren \n" .
+ " --criterium : overfull criterium in pt \n" .
+ " --unknown :onbekende ... controleren \n" ;
+
+ } # end of dutch section
+
+elsif ($Interface eq "de")
+
+ { # begin of german section
+
+ $MS{"HelpInfo"} =
+
+ " --references Verarbeiten der Hilfsdatei / tui->tuo \n" .
+ " --ij : Sortiere IJ als Y \n" .
+ " --high : Konvertiere hohe ASCII-Werte \n" .
+ " --quotes : Konvertiere akzentuierte Buchstaben \n" .
+ " \n" .
+ " --documents Erstelle Dokumentationsdatei / tex->ted \n" .
+ " --sources Erstelle reine Quelltextdateien / tex->tes \n" .
+ " --setups Filtere ConTeXt-Definitionen / tex->texutil.tus\n" .
+ " --templates Filtere TeXEdit-templates / tex->tud \n" .
+ " --infos Filtere TeXEdit-helpinfo / tex->tud \n" .
+ " \n" .
+ " --figures Erstelle eps-Abbildungsliste / eps->texutil.tuf\n" .
+ " --tiff : Verarbeite auch tif-Dateien \n" .
+ " \n" .
+ " --logfile Filtere log-Datei / log->texutil.log \n" .
+ " --box : Ueberpruefe uebervolle Boxen \n" .
+ " --criterium : Uebervoll-Kriterium in pt \n" .
+ " --unknown : Ueberpruefe auf unbekannte ... \n" ;
+
+ } # end of german section
+
+
+else
+
+ { # begin of english section
+
+ $MS{"HelpInfo"} =
+
+ " --references process auxiliary file / tui->tuo \n" .
+ " --ij : sort IJ as Y \n" .
+ " --high : convert high ASCII values \n" .
+ " --quotes : convert quotes characters \n" .
+ " \n" .
+ " --documents generate documentation file / tex->ted \n" .
+ " --sources generate source only file / tex->tes \n" .
+ " --setups filter ConTeXt definitions / tex->texutil.tus \n" .
+ " --templates filter TeXEdit templates / tex->tud \n" .
+ " --infos filter TeXEdit helpinfo / tex->tud \n" .
+ " \n" .
+ " --figures generate eps figure list / eps->texutil.tuf \n" .
+ " --tiff : also process tif files \n" .
+ " \n" .
+ " --logfile filter logfile / log->texutil.log \n" .
+ " --box : check overful boxes \n" .
+ " --criterium : overfull criterium in pt \n" .
+ " --unknown : check unknown ... \n" ;
+
+ } # end of english section
+
+#D \stopcompressdefinitions
+
+#D In order to sort strings correctly, we have to sanitize
+#D them. This is especially needed when we include \TEX\
+#D commands, quotes characters and compound word placeholders.
+#D
+#D \startopsomming[opelkaar]
+#D \som \type{\name}: csnames are stripped
+#D \som \type{{}}: are removed
+#D \som \type{\"e}: and alike are translated into \type{"e} etc.
+#D \som \type{"e}: is translated into an \type{e} and \type{b} etc.
+#D \som \type{||}: becomes \type{-}
+#D \som \type{\-}: also becomes \type{-}
+#D \stopopsomming
+#D
+#D Of course other accented characters are handled too. The
+#D appended string is responsible for decent sorting.
+#D
+#D \startPL
+#D $TargetString = SanitizedString ( $SourceString ) ;
+#D \stopPL
+#D
+#D The sort order depends on the ordering in array
+#D \type{$ASCII}:
+
+$ASCII{"^"} = "a" ; $ASCII{'"'} = "b" ; $ASCII{"`"} = "c" ;
+$ASCII{"'"} = "d" ; $ASCII{"~"} = "e" ; $ASCII{","} = "f" ;
+
+sub SanitizedString
+ { my ($string) = $_[0] ;
+ if ($ProcessQuotes)
+ { $string =~ s/\\([\^\"\`\'\~\,])/$1/gio ;
+ $copied = $string ;
+ $copied =~ s/([\^\"\`\'\~\,])([a-zA-Z])/$ASCII{$1}/gio ;
+ $string =~ s/([\^\"\`\'\~\,])([a-zA-Z])/$2/gio ;
+ $string=$string.$copied }
+ $string =~ s/\\-|\|\|/\-/gio ;
+ $string =~ s/\\[a-zA-Z]*| |\{|\}//gio ;
+ return $string }
+
+#D This subroutine looks a bit complicated, which is due to the
+#D fact that we want to sort for instance an accented \type{e}
+#D after the plain \type{e}, so the imaginary words
+#D
+#D \starttypen
+#D eerste
+#D \"eerste
+#D \"e\"erste
+#D eerst\"e
+#D \stoptypen
+#D
+#D come out in an acceptable order.
+
+#D We also have to deal with the typical \TEX\ sequences with
+#D the double \type{^}'s, like \type{^^45}. These hexadecimal
+#D coded characters are just converted.
+#D
+#D \startPL
+#D $TargetString = HighConverted ( $SourceString ) ;
+#D \stopPL
+
+sub HighConverted
+ { my ($string) = $_[0] ;
+ $string =~ s/\^\^([a-f0-9][a-f0-9])/chr hex($1)/geo ;
+ return $string }
+
+#D \extras
+#D {references}
+#D
+#D \CONTEXT\ can handle many lists, registers (indexes),
+#D tables of whatever and references. This data is collected
+#D in one pass and processed in a second one. In between,
+#D relevant data is saved in the file \type{\jobname.tui}.
+#D This file also holds some additional information concerning
+#D second pass optimizations.
+#D
+#D The main task of \TEXUTIL\ is to sort lists and registers
+#D (indexes). The results are stored in again one file called
+#D \type{\jobname.tuo}.
+#D
+#D Just for debugging purposes the nesting of files loaded
+#D during the \CONTEXT\ run is stored. Of course this only
+#D applies to files that are handled by the \CONTEXT\ file
+#D structuring commands (projects, products, components and
+#D environments).
+#D
+#D We have to handle the entries:
+#D
+#D \starttypen
+#D f b {test}
+#D f e {test}
+#D \stoptypen
+#D
+#D and only report some status info at the end of the run.
+
+sub InitializeFiles
+ { $NOfFiles = 0 ;
+ $NOfBadFiles = 0 }
+
+sub HandleFile
+ { $RestOfLine =~ s/.*\{(.*)\}/$1/gio ;
+ ++$Files{$RestOfLine} }
+
+sub FlushFiles
+ { print TUO "%\n" . "% Files\n" . "%\n" ;
+ foreach $File (keys %Files)
+ { print TUO "% $File ($Files{$File})\n" }
+ print TUO "%\n" ;
+ $NOfFiles = keys %Files ;
+ Report("EmbeddedFiles", $NOfFiles) ;
+ foreach $File (keys %Files)
+ { unless (($Files{$File} % 2) eq 0)
+ { ++$NOfBadFiles ;
+ Report("BeginEndError", $File) } } }
+
+#D Commands don't need a special treatment. They are just
+#D copied. Such commands are tagged by a \type{c}, like:
+#D
+#D \starttypen
+#D c \thisisutilityversion{year.month.day}
+#D c \twopassentry{class}{key}{value}
+#D c \mainreference{prefix}{entry}{pagenumber}{realpage}{tag}
+#D c \listentry{category}{tag}{number}{title}{pagenumber}{realpage}
+#D c \realnumberofpages{number}
+#D \stoptypen
+#D
+#D For historic reasons we check for the presense of the
+#D backslash.
+
+sub InitializeCommands
+ { print TUO "%\n" . "% Commands\n" . "%\n" ;
+ $NOfCommands = 0 }
+
+sub HandleCommand
+ { ++$NOfCommands ;
+ $RestOfLine =~ s/^\\//go ;
+ print TUO "\\$RestOfLine\n" }
+
+sub FlushCommands
+ { Report ("PassedCommands", $NOfCommands) }
+
+#D Synonyms are a sort of key||value pairs and are used for
+#D ordered lists like abbreviations and units.
+#D
+#D \starttypen
+#D s e {class}{sanitized key}{key}{associated data}
+#D \stoptypen
+#D
+#D The sorted lists are saved as (surprise):
+#D
+#D \starttypen
+#D \synonymentry{class}{sanitized key}{key}{associated data}
+#D \stoptypen
+
+sub InitializeSynonyms
+ { $NOfSynonyms = 0 ;
+ $NOfBadSynonyms = 0 }
+
+#M \definieersynoniem [testname] [testnames] [\testmeaning]
+#M
+#M \stelsynoniemenin [testname] [criterium=alles]
+
+#D Let's first make clear what we can expect. Synonym
+#D entries look like:
+#D
+#D \startbuffer
+#D \testname [alpha] {\sl alpha} {a greek letter a}
+#D \testname {alpha} {another a}
+#D \testname [Beta] {\kap{beta}} {a greek letter b}
+#D \testname {beta} {indeed another b}
+#D \testname {gamma} {something alike g}
+#D \testname {delta} {just a greek d}
+#D \stopbuffer
+#D
+#D \typebuffer
+#D
+#D This not that spectacular list is to be sorted according
+#D to the keys (names). \haalbuffer
+
+sub HandleSynonym
+ { ++$NOfSynonyms ;
+ ($SecondTag, $RestOfLine) = split(/ /, $RestOfLine, 2) ;
+ ($Class, $Key, $Entry, $Meaning) = split(/} \{/, $RestOfLine) ;
+ chop $Meaning ;
+ $Class = substr $Class, 1 ;
+ if ($Entry eq "")
+ { ++$NOfBadSynonyms }
+ else
+ { $SynonymEntry[$NOfSynonyms] =
+ $Class . $JOIN .
+ $Key . $JOIN .
+ $Entry . $JOIN .
+ $Meaning ;
+ $SynonymEntry[$NOfSynonyms+1] = "" ; } }
+
+#D Depending on the settings\voetnoot{One can call for
+#D all defined entries, call only the used ones, change
+#D layout, attach (funny) commands etc.} a list of
+#D {\em testnames} looks like:
+#D
+#D \plaatslijstmettestnames
+#D
+#D Watch the order in which these entries are sorted.
+
+$SynonymEntry[0] = ("") ; # TH: initalize
+
+sub FlushSynonyms
+ { print TUO "%\n" . "% Synonyms\n" . "%\n" ;
+ @SynonymEntry = sort @SynonymEntry ;
+ $NOfSaneSynonyms = 0 ;
+ for ($n=1; $n<=$NOfSynonyms; ++$n)
+ { # check normally not needed
+ if ($SynonymEntry[$n] ne $SynonymEntry[$n-1])
+ { ($Class, $Key, $Entry, $Meaning) =
+ split(/$JOIN/, $SynonymEntry[$n]) ;
+ ++$NOfSaneSynonyms ;
+ print TUO "\\synonymentry{$Class}{$Key}{$Entry}{$Meaning}\n" } }
+ Report("SynonymEntries", $NOfSynonyms, "->", $NOfSaneSynonyms, "Entries") ;
+ if ($NOfBadSynonyms>0)
+ { Report("SynonymErrors", $NOfBadSynonyms) } }
+
+#D Register entries need a bit more care, especially when they
+#D are nested. In the near future we will also handle page
+#D ranges.
+#D
+#D \starttypen
+#D r e {class}{tag}{sanitized key}{key}{pagenumber}{realpage}
+#D r s {class}{tag}{sanitized key}{key}{string}{pagenumber}
+#D \stoptypen
+
+#D The first one is the normal entry, the second one concerns
+#D {\em see this or that} entries. Keys are sanitized, unless
+#D the user supplies a sanitized key. To save a lot of
+#D programming, all data concerning an entry is stored in one
+#D string. Subentries are specified as:
+#D
+#D \starttypen
+#D first&second&third
+#D first+second+third
+#D \stoptypen
+#D
+#D When these characters are needed for typesetting purposes, we
+#D can also use the first character to specify the separator:
+#D
+#D \starttypen
+#D &$x^2+y^2=r^2$
+#D +this \& that
+#D \stoptypen
+#D
+#D Subentries are first unpacked and next stored in a
+#D consistent way, which means that we can use both separators
+#D alongside each other. We leave it to the reader to sort
+#D out the dirty tricks.
+
+$SPLIT ="%%" ;
+$JOIN ="__" ;
+
+sub InitializeRegisters
+ { $NOfEntries = 0 ;
+ $NOfBadEntries = 0 }
+
+$ProcessType = "" ; # TH: initialize
+
+sub HandleRegister
+ { ($SecondTag, $RestOfLine) = split(/ /, $RestOfLine, 2) ;
+ ++$NOfEntries ;
+ if ($SecondTag eq "s")
+ { ($Class, $Location, $Key, $Entry, $SeeToo, $Page ) =
+ split(/} \{/, $RestOfLine) ;
+ chop $Page ;
+ $Class = substr $Class, 1 ;
+ $RealPage = 0 }
+ else
+ { ($Class, $Location, $Key, $Entry, $Page, $RealPage ) =
+ split(/} \{/, $RestOfLine) ;
+ chop $RealPage ;
+ $Class = substr $Class, 1 ;
+ $SeeToo = "" }
+ if ($Key eq "")
+ { $Key = SanitizedString($Entry) }
+ if ($ProcessHigh)
+ { $Key = HighConverted($Key) }
+ $KeyTag = substr $Key, 0, 1 ;
+ if ($KeyTag eq "&")
+ { $Key =~ s/^\&//go ;
+ $Key =~ s/([^\\])\&/$1$SPLIT/go }
+ elsif ($KeyTag eq "+")
+ { $Key =~ s/^\+//go ;
+ $Key =~ s/([^\\])\+/$1$SPLIT/go }
+ else
+ { $Key =~ s/([^\\])\&/$1$SPLIT/go ;
+ $Key =~ s/([^\\])\+/$1$SPLIT/go }
+ $EntryTag = substr $Entry, 0, 1 ;
+ if ($EntryTag eq "&")
+ { $Entry =~ s/^\&//go ;
+ $Entry =~ s/([^\\])\&/$1$SPLIT/go }
+ elsif ($EntryTag eq "+")
+ { $Entry =~ s/^\+//go ;
+ $Entry =~ s/([^\\])\+/$1$SPLIT/go }
+ else
+ { $Entry =~ s/([^\\])\&/$1$SPLIT/go ;
+ $Entry =~ s/([^\\])\+/$1$SPLIT/go }
+ $Key =~ s/^([^a-zA-Z])/ $1/go ;
+ if ($ProcessIJ)
+ { $Key =~ s/ij/yy/go }
+ $LCKey = lc $Key ;
+ $RegisterEntry[$NOfEntries] =
+ $Class . $JOIN .
+ $LCKey . $JOIN .
+ $Key . $JOIN .
+ $Entry . $JOIN .
+ $RealPage . $JOIN .
+ $Location . $JOIN .
+ $Page . $JOIN .
+ $SeeToo }
+
+#M \definieerregister [testentry] [testentries]
+
+#D The previous routine deals with entries like:
+#D
+#D \startbuffer
+#D \testentry {alpha}
+#D \testentry {beta}
+#D \testentry {gamma}
+#D \testentry {gamma}
+#D \testentry {delta}
+#D \testentry {epsilon}
+#D \testentry {alpha+first}
+#D \testentry {alpha+second}
+#D \testentry {alpha+second}
+#D \testentry {alpha+third}
+#D \testentry {alpha+second+one}
+#D \testentry {alpha+second+one}
+#D \testentry {alpha+second+two}
+#D \testentry {alpha+second+three}
+#D \testentry {gamma+first+one}
+#D \testentry {gamma+second}
+#D \testentry {gamma+second+one}
+#D
+#D \testentry {alpha+fourth}
+#D \testentry {&alpha&fourth}
+#D \testentry {+alpha+fourth}
+#D
+#D \testentry [alpha+fourth] {alpha+fourth}
+#D \testentry [&alpha&fourth&one] {&alpha&fourth&one}
+#D \testentry [+alpha+fourth+two] {&alpha&fourth&two}
+#D
+#D \testentry {\kap{alpha}+fifth}
+#D \testentry {\kap{alpha}+f\'ifth}
+#D \testentry {\kap{alpha}+f"ifth}
+#D
+#D \testentry [&betaformula] {&$a^2+b^2=c^2$}
+#D
+#D \testentry {zeta \& more}
+#D \stopbuffer
+#D
+#D \typebuffer
+#D
+#D \haalbuffer After being sorted, these entries are
+#D turned into something \TEX\ using:
+
+$RegisterEntry[0] = ("") ; # TH: initialize
+
+sub FlushRegisters
+ { print TUO "%\n" . "% Registers\n" . "%\n" ;
+ @RegisterEntry = sort @RegisterEntry ;
+ $NOfSaneEntries = 0 ;
+ $NOfSanePages = 0 ;
+ $LastPage = "" ;
+ $LastRealPage = "" ;
+ $AlfaClass = "" ;
+ $Alfa = "" ;
+ $PreviousA = "" ;
+ $PreviousB = "" ;
+ $PreviousC = "" ;
+ $ActualA = "" ;
+ $ActualB = "" ;
+ $ActualC = "" ;
+ for ($n=1 ; $n<=$NOfEntries ; ++$n)
+ { ($Class, $LCKey, $Key, $Entry, $RealPage, $Location, $Page, $SeeToo) =
+ split(/$JOIN/, $RegisterEntry[$n]) ;
+ if (((lc substr $Key, 0, 1) ne lc $Alfa) or ($AlfaClass ne $Class))
+ { $Alfa= lc substr $Key, 0, 1 ;
+ $AlfaClass = $Class ;
+ if ($Alfa ne " ")
+ { print TUO "\\registerentry{$Class}{$Alfa}\n" } }
+ ($ActualA, $ActualB, $ActualC ) =
+ split(/$SPLIT/, $Entry, 3) ;
+ unless ($ActualA) { $ActualA = "" } # TH: this would be an error
+ unless ($ActualB) { $ActualB = "" } # TH: might become undef through split()
+ unless ($ActualC) { $ActualC = "" } # TH: might become undef through split()
+ if ($ActualA eq $PreviousA)
+ { $ActualA = "" }
+ else
+ { $PreviousA = $ActualA ;
+ $PreviousB = "" ;
+ $PreviousC = "" }
+ if ($ActualB eq $PreviousB)
+ { $ActualB = "" }
+ else
+ { $PreviousB = $ActualB ;
+ $PreviousC = "" }
+ if ($ActualC eq $PreviousC)
+ { $ActualC = "" }
+ else
+ { $PreviousC = $ActualC }
+ $Copied = 0 ;
+ if ($ActualA ne "")
+ { print TUO "\\registerentrya{$Class}{$ActualA}\n" ;
+ $Copied = 1 }
+ if ($ActualB ne "")
+ { print TUO "\\registerentryb{$Class}{$ActualB}\n" ;
+ $Copied = 1 }
+ if ($ActualC ne "")
+ { print TUO "\\registerentryc{$Class}{$ActualC}\n" ;
+ $Copied = 1 }
+ if ($Copied)
+ { $NOfSaneEntries++ }
+ if ($RealPage eq 0)
+ { print TUO "\\registersee{$Class}{$SeeToo}{$Page}\n" ;
+ $LastPage = $Page ;
+ $LastRealPage = $RealPage }
+ elsif (($Copied) ||
+ ! (($LastPage eq $Page) and ($LastRealPage eq $RealPage)))
+ { print TUO "\\registerpage{$Class}{$Location}{$Page}{$RealPage}\n" ;
+ ++$NOfSanePages ;
+ $LastPage = $Page ;
+ $LastRealPage = $RealPage } }
+ Report("RegisterEntries", $NOfEntries, "->", $NOfSaneEntries, "Entries",
+ $NOfSanePages, "References") ;
+ if ($NOfBadEntries>0)
+ { Report("RegisterErrors", $NOfBadEntries) } }
+
+#D As promised, we show the results:
+#D
+#D \plaatstestentry
+
+#D For debugging purposes we flush some status information. The
+#D faster machines become, the more important this section will
+#D be.
+
+sub FlushData
+ { print TUO
+ "% This Session\n" .
+ "% \n" .
+ "% embedded files : $NOfFiles ($NOfBadFiles errors)\n" .
+ "% passed commands : $NOfCommands\n" .
+ "% synonym entries : $NOfSynonyms ($NOfBadSynonyms errors)\n" .
+ "% register entries : $NOfEntries ($NOfBadEntries errors)" }
+
+#D The functionallity described on the previous few pages is
+#D called upon in the main routine:
+
+sub HandleReferences
+ { Report("Action", "ProcessingReferences") ;
+ if ($ProcessIJ )
+ { Report("Option", "SortingIJ") }
+ if ($ProcessHigh)
+ { Report("Option", "ConvertingHigh") }
+ if ($ProcessQuotes)
+ { Report("Option", "ProcessingQuotes") }
+ if ($InputFile eq "")
+ { Report("Error", "NoInputFile") }
+ else
+ { unless (open (TUI, "$InputFile.tui"))
+ { Report("Error", "EmptyInputFile", $InputFile) }
+ else
+ { Report("InputFile", "$InputFile.tui" ) ;
+ InitializeCommands ;
+ InitializeRegisters ;
+ InitializeSynonyms ;
+ InitializeFiles ;
+ $ValidOutput = 1 ;
+ unlink "$InputFile.tmp" ;
+ rename "$InputFile.tuo", "$InputFile.tmp" ;
+ Report("OutputFile", "$InputFile.tuo" ) ;
+ open (TUO, ">$InputFile.tuo") ;
+ while ($SomeLine=<TUI>)
+ { chop $SomeLine ;
+ ($FirstTag, $RestOfLine) = split ' ', $SomeLine, 2 ;
+ if ($FirstTag eq "c")
+ { HandleCommand }
+ elsif ($FirstTag eq "s")
+ { HandleSynonym }
+ elsif ($FirstTag eq "r")
+ { HandleRegister }
+ elsif ($FirstTag eq "f")
+ { HandleFile }
+ elsif ($FirstTag eq "q")
+ { $ValidOutput = 0 ;
+ last } }
+ if ($ValidOutput)
+ { FlushCommands ; # already done during pass
+ FlushRegisters ;
+ FlushSynonyms ;
+ FlushFiles ;
+ FlushData }
+ else
+ { unlink "$InputFile.tuo" ;
+ rename "$InputFile.tmp", "$InputFile.tuo" ;
+ Report ("Error", "NoOutputFile") } } } }
+
+#D \extras
+#D {documents}
+#D
+#D Documentation can be woven into a source file. The next
+#D routine generates a new, \TEX\ ready file with the
+#D documentation and source fragments properly tagged. The
+#D documentation is included as comment:
+#D
+#D \starttypen
+#D %D ...... some kind of documentation
+#D %M ...... macros needed for documenation
+#D %S B begin skipping
+#D %S E end skipping
+#D \stoptypen
+#D
+#D The most important tag is \type{%D}. Both \TEX\ and
+#D \METAPOST\ files use \type{%} as a comment chacacter, while
+#D \PERL\ uses \type{#}. Therefore \type{#D} is also handled.
+#D
+#D The generated file gets the suffix \type{ted} and is
+#D structured as:
+#D
+#D \starttypen
+#D \startmodule[type=suffix]
+#D \startdocumentation
+#D \stopdocumentation
+#D \startdefinition
+#D \stopdefinition
+#D \stopmodule
+#D \stoptypen
+#D
+#D Macro definitions specific to the documentation are not
+#D surrounded by start||stop commands. The suffix specifaction
+#D can be overruled at runtime, but defaults to the file
+#D extension. This specification can be used for language
+#D depended verbatim typesetting.
+
+sub HandleDocuments
+ { Report("Action", "HandlingDocuments") ;
+ if ($ProcessType ne "")
+ { Report("Option", "ForcingFileType", $ProcessType) }
+ if ($InputFile eq "")
+ { Report("Error", "NoInputFile") }
+ else
+ { CheckInputFiles ($InputFile) ;
+ foreach $FullName (@UserSuppliedFiles)
+ { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ;
+ unless ($FileSuffix)
+ { $FileSuffix = "tex" }
+ unless (-f "$FileName.$FileSuffix")
+ { next }
+ unless (open (TEX, "$FileName.$FileSuffix"))
+ { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) }
+ else
+ { Report("InputFile", "$FileName.$FileSuffix") ;
+ Report("OutputFile", "$FileName.ted") ;
+ open (TED, ">$FileName.ted") ;
+ $NOfDocuments = 0 ;
+ $NOfDefinitions = 0 ;
+ $NOfSkips = 0 ;
+ $SkipLevel = 0 ;
+ $InDocument = 0 ;
+ $InDefinition = 0 ;
+ if ($ProcessType eq "")
+ { $FileType=lc $FileSuffix }
+ else
+ { $FileType=lc $ProcessType }
+ Report("FileType", $FileType) ;
+ print TED "\\startmodule[type=$FileType]\n" ;
+ while (<TEX>) # TH: $SomeLines replaced by $_
+ { chop;
+ if (/^[%\#]D/)
+ { if ($SkipLevel == 0)
+ { if (length $_ < 3) # TH: empty #D comment
+ {$SomeLine = "" }
+ else # HH: added after that
+ {$SomeLine = substr ($_, 3) }
+ if ($InDocument)
+ { print TED "$SomeLine\n" }
+ else
+ { if ($InDefinition)
+ { print TED "\\stopdefinition\n" ;
+ $InDefinition = 0 }
+ unless ($InDocument)
+ { print TED "\n\\startdocumentation\n" }
+ print TED "$SomeLine\n" ;
+ $InDocument = 1 ;
+ ++$NOfDocuments } } }
+ elsif (/^[%\#]M/)
+ { if ($SkipLevel == 0)
+ { $SomeLine = substr $_, 3 ;
+ print TED "$SomeLine\n" } }
+ elsif (/^[%\%]S B]/)
+ { ++$SkipLevel ;
+ ++$NOfSkips }
+ elsif (/^[%\%]S E]/)
+ { --$SkipLevel }
+ elsif (/^[%\#]/)
+ { }
+ elsif ($SkipLevel == 0)
+ { $InLocalDocument = $InDocument ;
+ $SomeLine = $_ ;
+ if ($InDocument)
+ { print TED "\\stopdocumentation\n" ;
+ $InDocument = 0 }
+ if (($SomeLine eq "") && ($InDefinition))
+ { print TED "\\stopdefinition\n" ;
+ $InDefinition = 0 }
+ else
+ { if ($InDefinition)
+ { print TED "$SomeLine\n" }
+ elsif ($SomeLine ne "")
+ { print TED "\n" . "\\startdefinition\n" ;
+ $InDefinition = 1 ;
+ unless ($InLocalDocument)
+ { ++$NOfDefinitions }
+ print TED "$SomeLine\n" } } } }
+ if ($InDocument)
+ { print TED "\\stopdocumentation\n" }
+ if ($InDefinition)
+ { print TED "\\stopdefinition\n" }
+ print TED "\\stopmodule\n" ;
+ close (TED) ;
+ unless (($NOfDocuments) || ($NOfDefinitions))
+ { unlink "$FileName.ted" }
+ Report ("NOfDocuments", $NOfDocuments) ;
+ Report ("NOfDefinitions", $NOfDefinitions) ;
+ Report ("NOfSkips", $NOfSkips) } } } }
+
+#D \extras
+#D {sources}
+#D
+#D Documented sources can be stripped of documentation and
+#D comments, although at the current processing speeds the
+#D overhead of skipping the documentation at run time is
+#D neglectable. Only lines beginning with a \type{%} are
+#D stripped. The stripped files gets the suffix \type{tes}.
+
+sub HandleSources
+ { Report("Action", "GeneratingSources") ;
+ if ($InputFile eq "")
+ { Report("Error", "NoInputFile") }
+ else
+ { CheckInputFiles ($InputFile) ;
+ foreach $FullName (@UserSuppliedFiles)
+ { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ;
+ unless ($FileSuffix)
+ { $FileSuffix = "tex" }
+ unless (-f "$FileName.$FileSuffix")
+ { next }
+ unless (open (TEX, "$FileName.$FileSuffix"))
+ { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) }
+ else
+ { Report("InputFile", "$FileName.$FileSuffix") ;
+ Report("OutputFile", "$FileName.tes") ;
+ open (TES, ">$FileName.tes") ;
+ $EmptyLineDone = 1 ;
+ $FirstCommentDone = 0 ;
+ while ($SomeLine=<TEX>)
+ { chop $SomeLine ;
+ if ($SomeLine eq "")
+ { unless ($FirstCommentDone)
+ { $FirstCommentDone = 1 ;
+ print TES
+ "\n% further documentation is removed\n\n" ;
+ $EmptyLineDone = 1 }
+ unless ($EmptyLineDone)
+ { print TES "\n" ;
+ $EmptyLineDone = 1 } }
+ elsif ($SomeLine =~ /^%/)
+ { unless ($FirstCommentDone)
+ { print TES "$SomeLine\n" ;
+ $EmptyLineDone = 0 } }
+ else
+ { print TES "$SomeLine\n" ;
+ $EmptyLineDone = 0 } }
+ close (TES) ; # TH: repaired
+ unless ($FirstCommentDone)
+ { unlink "$FileName.tes" } } } } }
+
+#D \extras
+#D {setups}
+#D
+#D All \CONTEXT\ commands are specified in a compact format
+#D that can be used to generate quick reference tables and
+#D cards. Such setups are preceded by \type{%S}. The setups
+#D are collected in the file \type{texutil.tus}.
+
+sub HandleSetups
+ { Report("Action", "FilteringDefinitions" ) ;
+ if ($InputFile eq "")
+ { Report("Error", "NoInputFile") }
+ else
+ { Report("OutputFile", "texutil.tus") ;
+ open (TUS, ">texutil.tus") ; # this file is always reset!
+ $NOfSetups = 0 ;
+ CheckInputFiles ($InputFile) ;
+ foreach $FullName (@UserSuppliedFiles)
+ { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ;
+ unless ($FileSuffix)
+ { $FileSuffix = "tex" }
+ unless (-f "$FileName.$FileSuffix")
+ { next }
+ unless (open (TEX, "$FileName.$FileSuffix"))
+ { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) }
+ else
+ { Report("InputFile", "$FileName.$FileSuffix") ;
+ print TUS "%\n" . "% File : $FileName.$FileSuffix\n" . "%\n" ;
+ while ($SomeLine=<TEX>)
+ { chomp ;
+ chop $SomeLine ;
+ ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) ;
+ if ($Tag eq "%S")
+ { ++$NOfSetups ;
+ while ($Tag eq "%S")
+ { print TUS "$RestOfLine\n" ;
+ $SomeLine = <TEX> ;
+ chomp ;
+ chop $SomeLine ;
+ ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) }
+ print TUS "\n" } } } }
+ close (TUS) ;
+ unless ($NOfSetups)
+ { unlink "texutil.tus" }
+ Report("NOfSetups", $NOfSetups) } }
+
+#D \extras
+#D {templates, infos}
+#D
+#D From the beginning, the \CONTEXT\ source files contained
+#D helpinfo and key||templates for \TEXEDIT. In fact, for a
+#D long time, this was the only documentation present. More
+#D and more typeset (interactive) documentation is replacing
+#D this helpinfo, but we still support the traditional method.
+#D This information is formatted like:
+#D
+#D \starttypen
+#D %I n=Struts
+#D %I c=\strut,\setnostrut,\setstrut,\toonstruts
+#D %I
+#D %I text
+#D %I ....
+#D %P
+#D %I text
+#D %I ....
+#D \stoptypen
+#D
+#D Templates look like:
+#D
+#D \starttypen
+#D %T n=kap
+#D %T m=kap
+#D %T a=k
+#D %T
+#D %T \kap{?}
+#D \stoptypen
+#D
+#D The key||value pairs stand for {\em name}, {\em mnemonic},
+#D {\em key}. This information is copied to files with the
+#D extension \type{tud}.
+
+sub HandleEditorCues
+ { if ($ProcessTemplates)
+ { Report("Action", "CopyingTemplates" ) }
+ if ($ProcessInfos)
+ {Report("Action", "CopyingInformation" ) }
+ if ($InputFile eq "")
+ { Report("Error", "NoInputFile") }
+ else
+ { CheckInputFiles ($InputFile) ;
+ foreach $FullName (@UserSuppliedFiles)
+ { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ;
+ if ($FileSuffix eq "")
+ { $FileSuffix = "tex" }
+ unless (-f "$FileName.$FileSuffix")
+ { next }
+ unless (open (TEX, "$FileName.$FileSuffix"))
+ { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) }
+ else
+ { Report("InputFile", "$FileName.$FileSuffix") ;
+ Report("OutputFile", "$FileName.tud") ;
+ open (TUD, ">$FileName.tud") ;
+ $NOfTemplates = 0 ;
+ $NOfInfos = 0 ;
+ while ($SomeLine=<TEX>)
+ { chomp ;
+ chop $SomeLine ;
+ ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) ;
+ if (($Tag eq "%T") && ($ProcessTemplates))
+ { ++$NOfTemplates ;
+ while ($Tag eq "%T")
+ { print TUD "$SomeLine\n" ;
+ $SomeLine = <TEX> ;
+ chomp ;
+ chop $SomeLine ;
+ ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) }
+ print TUD "\n" }
+ elsif (($Tag eq "%I") && ($ProcessInfos))
+ { ++$NOfInfos ;
+ while (($Tag eq "%I") || ($Tag eq "%P"))
+ { print TUD "$SomeLine\n" ;
+ $SomeLine = <TEX> ;
+ chomp ;
+ chop $SomeLine ;
+ ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) }
+ print TUD "\n" } }
+ close (TUD) ;
+ unless (($NOfTemplates) || ($NOfInfos))
+ { unlink "$FileName.tud" }
+ if ($ProcessTemplates)
+ { Report("NOfTemplates", $NOfTemplates) }
+ if ($ProcessInfos)
+ { Report("NOfInfos", $NOfInfos) } } } } }
+
+#D \extras
+#D {figures}
+#D
+#D Directories can be scanned for illustrations in \EPS\ or
+#D \TIFF\ format. The later type of graphics is prescanned by
+#D dedicated programs, whose data is used here. The resulting
+#D file \type{texutil.tuf} contains entries like:
+#D
+#D \starttypen
+#D \thisisfigureversion{year.month.day}
+#D \presetfigure[file][...specifications...]
+#D \stoptypen
+#D
+#D where the specifications are:
+#D
+#D \starttypen
+#D [e=suffix,x=xoffset,y=yoffset,w=width,h=height,t=title,c=creator,s=size]
+#D \stoptypen
+#D
+#D This data can be used when determining dimensions (although
+#D \CONTEXT\ is able to scan \EPS\ illustrations directly) and
+#D to generate directories of illustrations.
+
+$PTtoCM = 2.54/72.0 ;
+$INtoCM = 2.54 ;
+
+sub HandleEpsFigure
+ { my ( $SuppliedFileName ) = @_ ;
+ ($FileName, $FileSuffix) = split ( /\./, $SuppliedFileName, 2) ;
+ $Temp = $FileSuffix;
+ $Temp =~ s/[0-9]//go;
+ if ($Temp eq "")
+ { $EpsFileName = $SuppliedFileName;
+ Report ( "MPFile", "$SuppliedFileName" ) }
+ elsif (lc $FileSuffix ne "eps")
+ { return }
+ else
+ { $EpsFileName = $FileName;
+ Report ( "EpsFile", "$SuppliedFileName" ) }
+ $HiResBBOX = "" ;
+ $LoResBBOX = "" ;
+ $EpsTitle = "" ;
+ $EpsCreator = "" ;
+ open ( EPS , $SuppliedFileName ) ;
+ $EpsSize = -s EPS ;
+ while ( $SomeLine = <EPS> )
+ { chop ($SomeLine) ;
+ unless ($HiResBBOX)
+ { if ($SomeLine =~ /^%%BoundingBox:/i)
+ { ($Tag, $LoResBBOX) = split (/ /, $SomeLine, 2) ;
+ next }
+ elsif ($SomeLine =~ /^%%HiResBoundingBox:/i)
+ { ($Tag, $HiResBBOX) = split (/ /, $SomeLine, 2) ;
+ next }
+ elsif ($SomeLine =~ /^%%ExactBoundingBox:/i)
+ { ($Tag, $HiResBBOX) = split (/ /, $SomeLine, 2) ;
+ next } }
+ if ($SomeLine =~ /^%%Creator:/i)
+ { ($Tag, $EpsCreator) = split (/ /, $SomeLine, 2) }
+ elsif ($SomeLine =~ /^%%Title:/i)
+ { ($Tag, $EpsTitle) = split (/ /, $SomeLine, 2) } }
+ if ($HiResBBOX)
+ { $EpsBBOX = $HiResBBOX }
+ else
+ { $EpsBBOX = $LoResBBOX }
+ if ($EpsBBOX)
+ { ($LLX, $LLY, $URX, $URY, $RestOfLine) = split (/ /, $EpsBBOX, 5 ) ;
+ $EpsHeight = ($URY-$LLY)*$PTtoCM ;
+ $EpsWidth = ($URX-$LLX)*$PTtoCM ;
+ $EpsXOffset = $LLX*$PTtoCM ;
+ $EpsYOffset = $LLY*$PTtoCM ;
+ $Figures[++$NOfFigures] =
+ "\\presetfigure[$EpsFileName][e=eps" .
+ (sprintf ",x=%5.3fcm,y=%5.3fcm", $EpsXOffset, $EpsYOffset) .
+ (sprintf ",w=%5.3fcm,h=%5.3fcm", $EpsWidth, $EpsHeight) .
+ ",t=$EpsTitle,c=$EpsCreator,s=$EpsSize]\n" } }
+
+sub HandleEpsFigures
+ { if ($InputFile eq "")
+ { $InputFile = "*.eps" }
+ CheckInputFiles ($InputFile) ;
+ foreach $FileName (@UserSuppliedFiles)
+ { HandleEpsFigure ( $FileName ) } }
+
+#D Here we call the programs that generate information on
+#D the \TIFF\ files. The names of the programs are defined
+#D earlier.
+
+if ($ProcessTiff)
+ { $FindTiffFigure = "" ;
+ $UsedTiffProgram = "" ;
+ unlink "tiffdata.tmp" ;
+ foreach $TiffProgram (@TiffPrograms)
+ { if ((system ("$TiffProgram *.tif > tiffdata.tmp") == 0)
+ && (-s "tiffdata.tmp"))
+ { $UsedTiffProgram = $TiffProgram ;
+ $FindTiffFigure = "FindTiffFigure_$UsedTiffProgram" ;
+ last } } }
+
+#D The scanning routines use filehandle \type{TMP} and call for
+#D \type{ReportTifFigure} with the arguments \type{Name},
+#D \type{Width} and \type{Height}.
+
+sub ReportTifFigure
+ { my ($Name, $Width, $Height) = @_ ;
+ $Name = lc $Name ;
+ #
+ # if ($InputFile ne "")
+ # { $Ok = 0 ;
+ # foreach $IFile (@UserSuppliedFiles)
+ # { $Ok = ($Ok || ($IFile eq "$Name.tif" )) }
+ # else
+ # { $Ok = 1 }
+ #
+ $Ok = 1 ;
+ #
+ if ($Ok)
+ { $Size = -s "$Name.tif" ;
+ Report ( "TifFile", "$Name.tif") ;
+ $Figures[++$NOfFigures] =
+ "\\presetfigure[$Name][e=tif" .
+ (sprintf ",w=%5.3fcm,h=%5.3fcm", $Width, $Height) .
+ ",s=$Size]\n" } }
+
+sub HandleTifFigures
+ { if ($ProcessTiff)
+ { if (-s "tiffdata.tmp")
+ { Report ( "SystemCall", "$UsedTiffProgram -> tiffdata.tmp" ) ;
+ if ((defined &$FindTiffFigure) && (open(TMP, "tiffdata.tmp")))
+ { &$FindTiffFigure }
+ else
+ { Report ( "MissingSubroutine", $FindTiffFigure ) } }
+ else
+ { Report ( "BadSystemCall", "@TiffPrograms" ) } } }
+
+#D The next few routines are program specific. Let's cross our
+#D fingers on the stability off their output. As one can
+#D see, we have to work a bit harder when we use \TIFFINFO\
+#D instead of \TIFFTAGS.
+
+sub FindTiffFigure_tiffinfo
+ { while ( $TifName = <TMP> )
+ { chomp ;
+ chop $TifName ;
+ if (($TifName =~ s/^(.*)\.tif\:.*/$1/i) &&
+ ($SomeLineA = <TMP>) && ($SomeLineA = <TMP>) &&
+ ($SomeLineA = <TMP>) && ($SomeLineB = <TMP>))
+ { chop $SomeLineA ;
+ $TifWidth = $SomeLineA ;
+ $TifWidth =~ s/.*Image Width: (.*) .*/$1/i ;
+ $TifHeight = $SomeLineA ;
+ $TifHeight =~ s/.*Image Length: (.*).*/$1/i ;
+ $TifWRes = $SomeLineB ;
+ $TifWRes =~ s/.*Resolution: (.*)\,.*/$1/i ;
+ $TifHRes = $SomeLineB ;
+ $TifHRes =~ s/.*Resolution: .*\, (.*).*/$1/i ;
+ $TifWidth = ($TifWidth/$TifWRes)*$INtoCM ;
+ $TifHeight = ($TifHeight/$TifHRes)*$INtoCM ;
+ ReportTifFigure ($TifName, $TifWidth, $TifHeight) } } }
+
+sub FindTiffFigure_tifftags
+ { while ( $TifName = <TMP> )
+ { chomp ;
+ chop $TifName ;
+ if (($TifName =~ s/.*\`(.*)\.tif\'.*/$1/i) &&
+ ($SomeLine = <TMP>) && ($SomeLine = <TMP>))
+ { chop $SomeLine ;
+ $TifWidth = $SomeLine ;
+ $TifWidth =~ s/.*\((.*) pt.*\((.*) pt.*/$1/ ;
+ $TifHeight = $SomeLine ;
+ $TifHeight =~ s/.*\((.*) pt.*\((.*) pt.*/$2/ ;
+ $TifWidth = $TifWidth*$PTtoCM ;
+ $TifHeight = $TifHeight*$PTtoCM ;
+ ReportTifFigure ($TifName, $TifWidth, $TifHeight) } } }
+
+sub InitializeFigures
+ { $NOfFigures = 0 }
+
+sub FlushFigures
+ { $Figures = sort $Figures ;
+ open ( TUF, ">texutil.tuf" ) ;
+ print TUF "%\n" . "% Figures\n" . "%\n" ;
+ print TUF "\\thisisfigureversion\{1996.06.01\}\n" . "%\n" ;
+ for ($n=1 ; $n<=$NOfFigures ; ++$n)
+ { print TUF $Figures[$n] }
+ close (TUF) ;
+ unless ($NOfFigures)
+ { unlink "texutil.tuf" }
+ Report ( "NOfFigures", $NOfFigures ) }
+
+sub HandleFigures
+ { Report("Action", "GeneratingFigures" ) ;
+ if ($ProcessTiff)
+ { Report("Option", "UsingTiff") }
+ InitializeFigures ;
+ HandleEpsFigures ;
+ HandleTifFigures ;
+ FlushFigures }
+
+#D \extras
+#D {logfiles}
+#D
+#D This (poor man's) log file scanning routine filters
+#D overfull box messages from a log file (\type{\hbox},
+#D \type{\vbox} or both). The collected problems are saved
+#D in \type{texutil.log}. One can specify a selection
+#D criterium.
+#D
+#D \CONTEXT\ reports unknown entities. These can also be
+#D filtered. When using fast computers, or when processing
+#D files in batch, one has to rely on the log files and/or
+#D this filter.
+
+$Unknown = "onbekend|unknown|unbekant" ;
+
+sub FlushLogTopic
+ { unless ($TopicFound)
+ { $TopicFound = 1 ;
+ print ALL "\n% File: $FileName.log\n\n" } }
+
+sub HandleLogFile
+ { if ($ProcessBox)
+ { Report("Option", "FilteringBoxes", "(\\vbox & \\hbox)") ;
+ $Key = "[h|v]box" }
+ elsif ($ProcessHBox)
+ { Report("Option", "FilteringBoxes", "(\\hbox)") ;
+ $Key = "hbox" ;
+ $ProcessBox = 1 }
+ elsif ($ProcessVBox)
+ { Report("Option", "FilteringBoxes", "(\\vbox)") ;
+ $Key = "vbox" ;
+ $ProcessBox = 1 }
+ if (($ProcessBox) && ($ProcessCriterium))
+ { Report("Option", "ApplyingCriterium") }
+ if ($ProcessUnknown)
+ { Report("Option", "FilteringUnknown") }
+ unless (($ProcessBox) || ($ProcessUnknown))
+ { ShowHelpInfo ;
+ return }
+ Report("Action", "FilteringLogFile" ) ;
+ if ($InputFile eq "")
+ { Report("Error", "NoInputFile") }
+ else
+ { $NOfBoxes = 0 ;
+ $NOfMatching = 0 ;
+ $NOfUnknown = 0 ;
+ Report("OutputFile", "texutil.log") ;
+ CheckInputFiles ($InputFile) ;
+ open ( ALL, ">texutil.log" ) ;
+ foreach $FullName (@UserSuppliedFiles)
+ { ($FileName, $FileSuffix) = split (/\./, $FullName, 2) ;
+ if (! open (LOG, "$FileName.log"))
+ { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) }
+ elsif (-e "$FileName.tex")
+ { $TopicFound = 0 ;
+ Report("InputFile", "$FileName.log") ;
+ while ($SomeLine=<LOG>)
+ { chomp ;
+ if (($ProcessBox) && ($SomeLine =~ /Overfull \\$Key/))
+ { ++$NOfBoxes ;
+ $SomePoints = $SomeLine ;
+ $SomePoints =~ s/.*\((.*)pt.*/$1/ ;
+ if ($SomePoints>=$ProcessCriterium)
+ { ++$NOfMatching ;
+ FlushLogTopic ;
+ print ALL "$SomeLine" ;
+ $SomeLine=<LOG> ;
+ print ALL $SomeLine } }
+ if (($ProcessUnknown) && ($SomeLine =~ /$Unknown/io))
+ { ++$NOfUnknown ;
+ FlushLogTopic ;
+ print ALL "$SomeLine" } } } }
+ close (ALL) ;
+ unless (($NOfBoxes) ||($NOfUnknown))
+ { unlink "texutil.log" }
+ if ($ProcessBox)
+ { Report ( "NOfBoxes" , "$NOfBoxes", "->", $NOfMatching, "Overfull") }
+ if ($ProcessUnknown)
+ { Report ( "NOfUnknown", "$NOfUnknown") } } }
+
+#D We're done! All this actions and options are organized in
+#D one large conditional:
+
+ ShowBanner ;
+
+if ($UnknownOptions ) { ShowHelpInfo } # not yet done
+elsif ($ProcessReferences) { HandleReferences }
+elsif ($ProcessDocuments ) { HandleDocuments }
+elsif ($ProcessSources ) { HandleSources }
+elsif ($ProcessSetups ) { HandleSetups }
+elsif ($ProcessTemplates ) { HandleEditorCues }
+elsif ($ProcessInfos ) { HandleEditorCues }
+elsif ($ProcessFigures ) { HandleFigures }
+elsif ($ProcessLogFile ) { HandleLogFile }
+elsif ($ProcessHelp ) { ShowHelpInfo } # redundant
+else { ShowHelpInfo }
+
+#D So far.
diff --git a/tex/context/base/thrd-ran.tex b/tex/context/base/thrd-ran.tex index db0b5f650..b26e4594a 100644 --- a/tex/context/base/thrd-ran.tex +++ b/tex/context/base/thrd-ran.tex @@ -1,70 +1,71 @@ -%D \module -%D [ file=thrd-ran, -%D version=1998.01.21, -%D title=\CONTEXT\ Support Macros, -%D subtitle=Random Number Generation, -%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}{Third Party Macros / Random Number Generation} - -%D \macros -%D {getrandomcount, getrandomdimen, -%D getrandomfloat, getrandomnumber} -%D -%D This module load Donald Arseneau's generic file -%D \type{random.tex}. A small shell is needed because we -%D redefine some \TEX\ primitives. We also use different names -%D for the two generators and add an extra one. -%D -%D \starttypen -%D \getrandomcount \countregister {minimum} {maximum} -%D \getrandomdimen \dimenregister {minimum} {maximum} -%D \getrandomnumber \macroname {minimum} {maximum} -%D \getrandomfloat \macroname {minimum} {maximum} -%D \stoptypen -%D -%D Of course the file \type{random.tex} needs to be present. - -\readfile{random.tex} - {\writestatus{loading}{Donald Arseneau's 'random.tex' (found)}} - {\writestatus{loading}{Donald Arseneau's 'random.tex' (not found)}} - -\ifx\nextrandom\undefined - - \def\setrannum#1#2#3{#1=1 } - \def\setrandim#1#2#3{#1=1pt} - -\else - - \let\normalnextrandom=\nextrandom - - \def\nextrandom% - {\bgroup - \let\time =\normaltime - \let\day =\normalday - \let\month=\normalmonth - \let\year =\normalyear - \normalnextrandom - \global\let\nextrandom=\normalnextrandom - \egroup} - -\fi - -\let\getrandomcount = \setrannum -\let\getrandomdimen = \setrandim - -\def\getrandomnumber#1#2#3% - {\getrandomcount{\scratchcounter}{#2}{#3}% - \edef#1{\the\scratchcounter}} - -\def\getrandomfloat#1#2#3% - {\getrandomdimen{\scratchdimen}{#2pt}{#3pt}% - \edef#1{\withoutpt\the\scratchdimen}} - -\endinput +%D \module
+%D [ file=thrd-ran,
+%D version=1998.01.21,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Random Number Generation,
+%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}{Third Party Macros / Random Number Generation}
+
+%D \macros
+%D {getrandomcount, getrandomdimen,
+%D getrandomfloat, getrandomnumber}
+%D
+%D This module load Donald Arseneau's generic file
+%D \type{random.tex}. A small shell is needed because we
+%D redefine some \TEX\ primitives. We also use different names
+%D for the two generators and add an extra one.
+%D
+%D \starttypen
+%D \getrandomcount \countregister {minimum} {maximum}
+%D \getrandomdimen \dimenregister {minimum} {maximum}
+%D \getrandomnumber \macroname {minimum} {maximum}
+%D \getrandomfloat \macroname {minimum} {maximum}
+%D \stoptypen
+%D
+%D Of course the file \type{random.tex} needs to be present.
+
+\readfile{random.tex}
+ {\writestatus{loading}{Donald Arseneau's 'random.tex' (found)}}
+ {\writestatus{loading}{Donald Arseneau's 'random.tex' (not found)}}
+
+\ifx\nextrandom\undefined
+
+ \def\setrannum#1#2#3{#1=1 }
+ \def\setrandim#1#2#3{#1=1pt}
+
+\else
+
+ \let\normalnextrandom=\nextrandom
+
+ \def\nextrandom%
+ {\bgroup
+ \let\time =\normaltime
+ \let\day =\normalday
+ \let\month=\normalmonth
+ \let\year =\normalyear
+ \normalnextrandom
+ \global\let\nextrandom=\normalnextrandom
+ \egroup}
+
+\fi
+
+\let\getrandomcount = \setrannum
+\let\getrandomdimen = \setrandim
+
+\def\getrandomnumber#1#2#3%
+ {\getrandomcount{\scratchcounter}{#2}{#3}%
+ \edef#1{\the\scratchcounter}}
+
+\def\getrandomfloat#1#2#3%
+ {\getrandomdimen{\scratchdimen}{#2pt}{#3pt}%
+ \edef#1{\withoutpt\the\scratchdimen}}
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/verb-ini.tex b/tex/context/base/verb-ini.tex index 4b76a30eb..02dcaf8cc 100644 --- a/tex/context/base/verb-ini.tex +++ b/tex/context/base/verb-ini.tex @@ -1,1557 +1,1562 @@ -%D \module -%D [ file=verb-ini, -%D version=1997.12.22, -%D title=\CONTEXT\ Verbatim 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. - -%D Because this module is quite independant of system macros, -%D it can be used as a stand||alone verbatim environment. -%D -%D This is a sort of second release of \type{supp-ver} and -%D therefore differs in some aspects from the implementation -%D published in the \MAPS. The first change concern -%D optimization of breaks, that is, the first and last two -%D lines of verbatim blocks are kept together. The second -%D adaption is due to the fact that I wanted to support pretty -%D printing not only for \TEX\ sources, but also for \PERL, -%D \METAPOST\ and probably more. The \JAVASCRIPT\ module is -%D closely related to \PERL, so we will not mention that one -%D again. - -\ifx \undefined \writestatus \input supp-mis.tex \fi - -%D Verbatim typesetting, especially of \TEX\ sources, is a -%D non||trivial task. This is a direct results of the fact that -%D characters can have \CATCODES\ other than~11 and such -%D characters needs a special treatment. What for instance is -%D \TEX\ supposed to do when it encounters a \type{$} or an -%D \type{#}? This module deals with these matters. - -\writestatus{loading}{Context Verbatim Macros / Initialization} - -%D The verbatim environment has some features, like coloring -%D \TEX\ text, seldom found in other environments. Especially -%D when the output of \TEX\ is viewed on an electronic medium, -%D coloring has a positive influence on the readability of -%D \TEX\ sources, so we found it very acceptable to dedicate -%D half of this module to typesetting \TEX\ specific character -%D sequences in color. In this module we'll also present some -%D macro's for typesetting inline, display and file verbatim. -%D The macro's are capable of handling \TAB\ too. -%D -%D This module shows a few tricks that are often overseen by -%D novice, like the use of the \TEX\ primitive \type{\meaning}. -%D First I'll show in what way the users are confronted with -%D verbatim typesetting. Because we want to be able to test for -%D symmetry and because we hate the method of closing down the -%D verbatim mode with some strange active character, we will -%D use the following construction for display verbatim: -%D -%D \starttypen -%D \starttyping -%D The Dutch word 'typen' stands for 'typing', therefore in the Dutch version -%D one will not find the word 'verbatim'. -%D \stoptyping -%D \stoptypen -%D -%D In \CONTEXT\ files can be typed with \type{\typefile} and -%D inline verbatim can be accomplished with \type{\type}. This -%D last command comes in many flavors: -%D -%D \starttypen -%D We can say \type<<something>> or \type{something}. The first one is a bit -%D longer but also supports slanted typing, which accomplished by typing -%D \type<<a <<slanted>> word>>. We can also use commands to enhance the text -%D \type<<with <</bf boldfaced>> text>>. Just to be complete, we decided -%D to accept also \LaTeX\ alike verbatim, which means that \type+something+ -%D and \type|something| are valid commands too. Of course we want the grouped -%D alternatives to process \type{hello {\bf big} world} with braces. -%D \stoptypen -%D -%D In the core modules, we will build this support on top of -%D this module. There these commands can be tuned with -%D accompanying setup commands. There we can enable commands, -%D slanted typing, control spaces, \TAB||handling and (here we -%D are:) coloring. We can also setup surrounding white space -%D and indenting. Here we'll only show some examples. - -\unprotect - -%D \macros -%D {verbatimfont} -%D {} -%D -%D When we are typesetting verbatim we use a non||proportional -%D (mono spaced) font. Normally this font is available by -%D calling \type{\tt}. In \CONTEXT\ this command does a -%D complete font||style switch. There we could have stuck with -%D \type{\tttf}. - -\ifx \undefined \verbatimfont \def\verbatimfont {\tt} \fi - -%D \macros -%D {obeyedspace, obeyedtab, obeyedline, obeyedpage} -%D {} -%D -%D We have followed Knuth in naming macros that make \SPACE, -%D \NEWLINE\ and \NEWPAGE\ active and assigning them -%D \type{\obeysomething}, but first we set some default values. - -\def\obeyedspace {\hbox{ }} -\def\obeyedtab {\obeyedspace} -\def\obeyedline {\par} -\def\obeyedpage {\vfill\eject} - -%D \macros -%D {controlspace,setcontrolspaces} -%D {} -%D -%D First we define \type{\obeyspaces}. When we want visible -%D spaces (control spaces) we only have to adapt the definition -%D of \type{\obeyedspace} to: - -\def\controlspace {\hbox{\char32}} - -\bgroup -\catcode`\ =\@@active -\gdef\obeyspaces{\catcode`\ =\@@active\def {\obeyedspace}} -\gdef\setcontrolspaces{\catcode`\ =\@@active\def {\controlspace}} -\egroup - -%D \macros -%D {obeytabs, obeylines, obeypages, -%D ignoretabs, ignorelines, ignorepages} -%D {} -%D -%D Next we take care of \NEWLINE\ and \NEWPAGE\ and because we -%D want to be able to typeset listings that contain \TAB, we -%D have to handle those too. Because we have to redefine the -%D \NEWPAGE\ character locally, we redefine the meaning of -%D this (often already) active character. - -\catcode`\^^L=\@@active \def^^L{\par} - -%D The following indirect definitions enable us to implement -%D all kind of \type{\obeyed} handlers. - -\bgroup - -\catcode`\^^I=\@@active -\catcode`\^^M=\@@active -\catcode`\^^L=\@@active - -\gdef\obeytabs {\catcode`\^^I=\@@active\def^^I{\obeyedtab}} -\gdef\obeylines {\catcode`\^^M=\@@active\def^^M{\obeyedline}} -\gdef\obeypages {\catcode`\^^L=\@@active\def^^L{\obeyedpage}} - -\gdef\ignoretabs {\catcode`\^^I=\@@active\def^^I{\obeyedspace}} -\gdef\ignorelines {\catcode`\^^M=\@@active\def^^M{\obeyedspace}} -\gdef\ignorepages {\catcode`\^^L=\@@active\def^^L{\obeyedline}} - -\egroup - -%D \macros -%D {obeycharacters} -%D {} -%D -%D We also predefine \type{\obeycharacters}, which will -%D enable us to implement character||specific behavior, like -%D colored verbatim. - -\let\obeycharacters=\relax - -%D \macros -%D {settabskips} -%D {} -%D -%D The macro \type{\settabskip} can be used to enable tab -%D handling. Processing tabs is sometimes needed when one -%D processes a plain \ASCII\ listing. Tab handling slows down -%D verbatim typesetting considerably. - -\bgroup - -\catcode`\^^I=\@@active - -\gdef\settabskips% - {\let\processverbatimline=\doprocesstabskipline - \catcode`\^^I=\@@active - \let^^I=\doprocesstabskip} - -\egroup - -%D \macros -%D {processinlineverbatim} -%D {} -%D -%D Although the inline verbatim commands presented here will be -%D extended and embedded in the core modules of \CONTEXT, -%D they can be used separately. Both grouped and character -%D alternatives are provided but \type{<<} and nested -%D braces are implemented in the core module. This commands -%D takes one argument: the closing command. -%D -%D \starttypen -%D \processinlineverbatim{\closingcommand} -%D \stoptypen -%D -%D One can define his own verbatim commands, which can be very -%D simple: -%D -%D \starttypen -%D \def\Verbatim {\processinlineverbatim\relax} -%D \stoptypen -%D -%D or a bit more more complex: -%D -%D \starttypen -%D \def\GroupedVerbatim% -%D {\bgroup -%D \dosomeusefullthings -%D \processinlineverbatim\egroup} -%D \stoptypen -%D -%D Before entering inline verbatim mode, we take care of the -%D unwanted \TAB, \NEWLINE\ and \NEWPAGE\ characters and -%D turn them into \SPACE. We need the double \type{\bgroup} -%D construction to keep the closing command local. - -\def\setupinlineverbatim% - {\verbatimfont - \let\obeytabs=\ignoretabs - \let\obeylines=\ignorelines - \let\obeypages=\ignorepages - \setupcopyverbatim} - -\def\doprocessinlineverbatim% - {\ifx\next\bgroup - \setupinlineverbatim - \catcode`\{=\@@begingroup - \catcode`\}=\@@endgroup - \def\next{\let\next=}% - \else - \setupinlineverbatim - \def\next##1{\catcode`##1=\@@endgroup}% - \fi - \next} - -\def\processinlineverbatim#1% - {\bgroup - \localcatcodestrue % TeX processes paragraph's - \def\endofverbatimcommand{#1\egroup}% - \bgroup - \aftergroup\endofverbatimcommand - \futurelet\next\doprocessinlineverbatim} - -%D The closing command is executed afterwards as an internal -%D command and therefore should not be given explicitly when -%D typesetting inline verbatim. - -%D \macros -%D {processingverbatim} -%D {} -%D -%D Typesetting a file in most cases results in more than one -%D page. Because we don't want problems with files that are -%D read in during the construction of the page, we set -%D \type{\ifprocessingverbatim}, so the output routine can -%D adapt its behavior. Originally we used -%D \type{\scratchread}, but because we want to support nesting, -%D we decided to use a separate input file. - -\newif\ifprocessingverbatim - -%D \macros -%D {optimizeverbatim} -%D -%D One day, a collegue asked me why I didn't prevent breaking -%D after a first or before a last verbatim line. At first sight -%D I thought of using the two pass mechanism, but because we're -%D already keeping track of individual lines, a more direct -%D solution is possible: we just keep track of in what line -%D we are. One can turn this feature off. - -\newif\ifoptimizeverbatim \optimizeverbatimtrue - -%D Before we implement display and file verbatim, we define -%D some macros that deal with typesetting the individual lines. -%D We keep track of the status by means of a character -%D specification. This status variable tells us if we're -%D skipping a first line or placing a first or last line. -%D The next few examples show us where breaks are inserted. -%D -%D \bgroup -%D -%D \def\doverbatimnobreak% -%D {\nobreak\hrule width 10cm\par\penalty500} % == \nobreak -%D -%D \def\doverbatimgoodbreak% -%D {\nobreak\hrule width 3cm \par\penalty100} % >> \goodbreak -%D -%D \starttypen -%D test -%D test -%D \stoptypen -%D -%D or -%D -%D \starttypen -%D test -%D test -%D test -%D test -%D \stoptypen -%D -%D or -%D -%D \starttypen -%D test -%D -%D test -%D test -%D test -%D \stoptypen -%D -%D \egroup -%D -%D The long ones are \type{\nobreaks} and the short ones -%D \type{\goodbreaks}. And this is how it's done: - -\def\doverbatimnobreak% - {\ifoptimizeverbatim\par\penalty500\fi} - -\def\doverbatimgoodbreak% - {\ifoptimizeverbatim\par\penalty100\fi} - -\def\doflushverbatimline% - {\expandafter\dodoverbatimline\expandafter{\savedverbatimline}} - -\let\handleverbatimline=\relax - -\def\initializeverbatimline% - {\global\let\savedverbatimline=\empty - \ifskipfirstverbatimline - \global\chardef\verbatimstatus=0 - \else - \global\chardef\verbatimstatus=1 - \fi} - -\def\presetemptyverbatimline% - {\ifcase\verbatimstatus - \global\chardef\verbatimstatus=1 - \or - \or - % \ifoptimizeverbatim\else\doemptyverbatimline\fi - \or - \doflushverbatimline - \global\let\savedverbatimline=\empty - \doemptyverbatimline - \global\chardef\verbatimstatus=2 - \else - \doverbatimnobreak - \doflushverbatimline - \global\let\savedverbatimline=\empty - \doemptyverbatimline - \global\chardef\verbatimstatus=2 - \fi} - -\def\presetnormalverbatimline% - {\ifcase\verbatimstatus - \global\chardef\verbatimstatus=2 - \or - \global\chardef\verbatimstatus=3 - \or - \global\chardef\verbatimstatus=3 - \or - \doflushverbatimline - \global\chardef\verbatimstatus=4 - \or - \doverbatimnobreak - \doflushverbatimline - \global\chardef\verbatimstatus=5 - \or - \doverbatimgoodbreak - \doflushverbatimline - \fi - \global\let\savedverbatimline=\verbatimline} - -\def\presetlastverbatimline% - {\ifcase\verbatimstatus \or \or \or - \doflushverbatimline - \else - \doverbatimnobreak - \doflushverbatimline - \fi} - -%D \macros -%D {skipfirstverbatimline} -%D -%D By default the rest of the first line is ignored. We can -%D turn this feature off by saying: -%D -%D \starttypen -%D \skipfirstverbatimlinefalse -%D \stoptypen - -\newif\ifskipfirstverbatimline \skipfirstverbatimlinetrue - -%D \macros -%D {processdisplayverbatim} -%D {} -%D -%D We can define a display verbatim environment with the -%D command \type{\processdisplayverbatim} in the following way: -%D -%D \starttypen -%D \processdisplayverbatim{\closingcommand} -%D \stoptypen -%D -%D \noindent For instance, we can define a simple command like: -%D -%D \starttypen -%D \def\BeginVerbatim {\processdisplayverbatim{EndVerbatim}} -%D \stoptypen -%D -%D \noindent But we can also do more advance things like: -%D -%D \starttypen -%D \def\BeginVerbatim {\bigskip \processdisplayverbatim{\EndVerbatim}} -%D \def\EndVerbatim {\bigskip} -%D \stoptypen -%D -%D When we compare these examples, we see that the backslash in -%D the closing command is optional. One is free in actually -%D defining a closing command. If one is defined, the command -%D is executed after ending verbatim mode. - -\def\processdisplayverbatim#1% - {\par - \bgroup - \escapechar=-1 - \xdef\verbatimname{\string#1}% - \egroup - \def\endofdisplayverbatim{\csname\verbatimname\endcsname}% - \bgroup - \parindent\!!zeropoint - \ifdim\lastskip<\parskip - \removelastskip - \vskip\parskip - \fi - \parskip\!!zeropoint - \processingverbatimtrue - \linepartrue - \expandafter\let\csname\verbatimname\endcsname=\relax - \edef\endofverbatimcommand{\csname\verbatimname\endcsname}% - \edef\endofverbatimcommand{\meaning\endofverbatimcommand}% - \verbatimfont - \setupcopyverbatim - \initializeverbatimline - \copyverbatimline} - -%D We save the closing sequence in \type{\endofverbatimcommand} -%D in such a way that it can be compared on a line by line -%D basis. For the conversion we use \type{\meaning}, which -%D converts the line to non||expandable tokens. We reset -%D \type{\parskip}, because we don't want inter||paragraph -%D skips to creep into the verbatim source. Furthermore we -%D \type{\relax} the line||processing macro while getting the -%D rest of the first line. The initialization command -%D \type{\setupcopyverbatim} does just what we expect it to do: -%D it assigns all characters \CATCODE~11. Next we switch to -%D french spacing and call for obeyance. - -\def\setupcopyverbatim% - {\uncatcodecharacters - \frenchspacing - \obeyspaces - \obeytabs - \obeylines - \obeypages - \obeycharacters} - -%D \macros -%D {eightbitcharacters, -%D setcatcodes,uncatcodespecials, -%D uncatcodecharacters} -%D {} -%D -%D As its name says, \type{\uncatcodecharacters} resets the -%D \CATCODE\ of characters. When we use an upper bound of -%D 127 or 255, depending in \type{\ifeightbitcharacters}. By -%D counting down, we only have to use one counter. The -%D macro \type{\setcatcodes} can be uses to set alternative -%D values. The macro \type{\resetspecialcharacters} resets -%D characters with special meanings. This macro is not used -%D in the verbatim macros, but is best defined in this module. - -\def\doprocesscatcodes#1% - {\ifeightbitcharacters - \scratchcounter=255 - \else - \scratchcounter=127 - \fi - \loop - \savecatcode - #1\relax - \advance\scratchcounter by -1 - \ifnum\scratchcounter>-1 - \repeat - \let\savecatcode=\relax - \let\restorecatcodes=\dorestorecatcodes} - -\def\uncatcodespecials% - {\doprocesscatcodes - {\ifnum\catcode\scratchcounter=\@@letter\relax\else - \catcode\scratchcounter=\@@other - \fi}% - \catcode`\ =\@@space - \catcode`\^^L=\@@ignore - \catcode`\^^M=\@@endofline - \catcode`\^^?=\@@ignore} - -\def\setcatcodes#1% - {\doprocesscatcodes - {\catcode\scratchcounter=#1}} - -\def\uncatcodecharacters% - {\setcatcodes\@@letter} - -%D \macros -%D {localcatcodes, -%D restorecatcodes, -%D beginrestorecatcodes,endrestorecatcodes} -%D {} -%D -%D We're not finished dealing \CATCODES\ yet. In \CONTEXT\ we -%D use only one auxiliary file, which deals with tables of -%D contents, registers, two pass tracking, references etc. This -%D file, as well as files concerning graphics, is processed when -%D needed, which can be in the mid of typesetting verbatim. -%D However, when reading in data in verbatim mode, we should -%D temporary restore the normal \CATCODES, and that's exactly -%D what the next macros do. Saving the catcodes can be -%D disabled by saying \type{\localcatcodestrue}. - -%D The previous macros call for \type{\savecatcode}, which is -%D implemented as: - -\newif\iflocalcatcodes - -\def\savecatcode% - {\iflocalcatcodes \else - \expandafter\chardef\csname @@cc@@\the\scratchcounter\endcsname - =\catcode\scratchcounter - \fi} - -%D It's counterpart is: - -\def\restorecatcode% - {\expandafter\catcode\expandafter\scratchcounter\expandafter= - \csname @@cc@@\the\scratchcounter\endcsname} - -%D When we want to restore \CATCODES\ we call for -%D \type{\restorecatcodes}, which default to \type{\relax} - -\let\restorecatcodes=\relax - -%D or when we've saves things calls for: - -\def\dorestorecatcodes% - {\iflocalcatcodes \else - \doprocesscatcodes\restorecatcode - \fi} - -%D We also provide an alternative, that forces grouping -%D when needed. An application of this macros can be found in -%D buffering data. - -\def\beginrestorecatcodes% - {\ifx\restorecatcodes\relax - \let\endrestorecatcodes=\relax - \else - \bgroup - \restorecatcodes - \let\beginrestorecatcodes=\bgroup - \let\endrestorecatcodes =\egroup - \fi} - -%D The main copying routine of display verbatim does an -%D ordinary string||compare on the saved closing command and -%D the current line. The space after \type{#1} in the -%D definition of \type{\next} is essential! As a result of -%D using \type{\obeylines}, we have to use \type{%}'s after -%D each line but none after the first \type{#1}. - -{\obeylines% - \long\gdef\copyverbatimline#1 - {\def\next{#1 }% - \gdef\verbatimline{#1}% - \ifx\next\emptyspace% - \presetemptyverbatimline% - \else% - \edef\next{\meaning\next}% - \ifx\next\endofverbatimcommand% - \presetlastverbatimline% - \def\copyverbatimline{\egroup\endofdisplayverbatim}% - \else% - \presetnormalverbatimline% - \fi% - \fi% - \handleverbatimline% - \copyverbatimline}} - -%D The actual typesetting of a line is done by a separate -%D macro, which enables us to implement \TAB\ handling. The -%D \type{\do} and \type{\dodo} macros take care of the -%D preceding \type{\parskip}, while skipping the rest of the -%D first line. The \type{\relax} is used as an signal. - -%D \macros -%D {iflinepar} -%D {} -%D -%D A careful reader will see that \type{\linepar} is reset. -%D This boolean can be used to determine if the current line is -%D the first line in a pseudo paragraph and this boolean is set -%D after each empty line. The \type{\relax} can be used to -%D determine the end of the line when one implements a scanner -%D routine. - -\newif\iflinepar - -\long\def\dodoverbatimline#1% - {\leavevmode\the\everyline\strut\processverbatimline{#1\relax}% - \EveryPar{}% - \lineparfalse - \obeyedline\par} - -%D \macros -%D {obeyemptylines,verbatimbaselineskip} -%D {} -%D -%D Empty lines in verbatim can lead to white space on top of -%D a new page. Because this is not what we want, we turn -%D them into vertical skips. This default behavior can be -%D overruled by: -%D -%D \starttypen -%D \obeyemptylines -%D \stoptypen -%D -%D Although it would cost us only a few lines of code, we -%D decided not to take care of multiple empty lines. When a -%D (display) verbatim text contains more successive empty -%D lines, this probably suits some purpose. When applicable, -%D one can set the verbatim baselineskip. - -\bgroup -\catcode`\^^L=\@@active \gdef\emptypage {^^L} -\catcode`\^^M=\@@active \gdef\emptyline {^^M} - \gdef\emptyspace { } -\egroup - -\def\verbatimbaselineskip% We don't use \let here! - {\baselineskip} - -\def\doemptyverbatimline% - {\vskip\verbatimbaselineskip - {\setbox0=\hbox{\the\everyline}}% - \linepartrue} - -\def\obeyemptylines% - {\def\doemptyverbatimline{\doverbatimline}} - -%D \TEX\ does not offer \type{\everyline}, which is a direct -%D result of its advanced multi||pass paragraph typesetting -%D mechanism. Because in verbatim mode paragraphs and lines are -%D more or less equal, we can easily implement our own simple -%D \type{\everyline} support. - -%D \macros -%D {EveryPar, EveryLine} -%D {} -%D -%D In this module we've reserved \type{\everypar} for the -%D things to be done with paragraphs and \type{\everyline} for -%D line specific actions. In \CONTEXT\ however, we use -%D \type{\everypar} for placing side- and columnfloats, -%D inhibiting indentation and some other purposes. In verbatim -%D mode, every line becomes a paragraph, which means that -%D \type{\everypar} is executed frequently. To be sure, the -%D user specific use of both \type{\everyline} and -%D \type{\everypar} is implemented by means of -%D \type{\EveryLine} and \type{\EveryPar}. -%D -%D We still have to take care of the \TAB. A \TAB\ takes eight -%D spaces and a \SPACE\ normally has a width of 0.5~em. Because -%D we can be halfway a tabulation, we must keep track of the -%D position. This takes time, especially when we print complete -%D files, therefore we \type{\relax} this mechanism by default. - -\def\doprocesstabskip% - {\obeyedspace % \hskip.5em or \hbox to .5em{} - \ifdone - \advance\scratchcounter by 1 - \let\next=\doprocesstabskip - \donefalse - \else\ifnum\scratchcounter>7 - \let\next=\relax - \else - \advance\scratchcounter 1 - \let\next=\doprocesstabskip - \fi\fi - \next} - -\def\dodoprocesstabskipline#1#2\endoftabskipping% - {\ifnum\scratchcounter>7 - \scratchcounter=1 - \donetrue - \else - \advance\scratchcounter 1 - \donefalse - \fi - \ifx#1\relax - \let\next=\relax - \else - \def\next{#1\dodoprocesstabskipline#2\endoftabskipping}% - \fi - \next} - -\let\endoftabskipping=\relax - -\def\processverbatimline#1{#1} % remove the fake grouping - -\def\doprocesstabskipline#1% - {\bgroup - \scratchcounter=1 - \dodoprocesstabskipline#1\relax\endoftabskipping - \egroup} - -%D \macros -%D {processfileverbatim} -%D {} -%D -%D The verbatim typesetting of files is done on a bit different -%D basis. This time we don't check for a closing command, but -%D look for \EOF\ and when we've met, we make sure it does not -%D turn into an empty line. -%D -%D \starttypen -%D \processfileverbatim{filename} -%D \stoptypen -%D -%D We reserve a dedicated file handle. - -\newread\verbatiminput - -\def\processfileverbatim#1% - {\par - \bgroup - \parindent\!!zeropoint - \ifdim\lastskip<\parskip - \removelastskip - \vskip\parskip - \fi - \parskip\!!zeropoint - \processingverbatimtrue - \linepartrue - \uncatcodecharacters - \verbatimfont - \frenchspacing - \obeyspaces - \obeytabs - \obeylines - \obeypages - \obeycharacters - \openin\verbatiminput=#1 - \skipfirstverbatimlinefalse - \initializeverbatimline - \def\readline% - {\read\verbatiminput to \verbatimline - \ifeof\verbatiminput - \presetlastverbatimline - \let\readline=\relax - \else\ifx\verbatimline\emptyline - \presetemptyverbatimline - \else\ifx\verbatimline\emptypage - \presetemptyverbatimline - \else - \presetnormalverbatimline - \fi\fi\fi - \handleverbatimline - \readline}% - \ifeof\verbatiminput \else - \expandafter\readline - \fi - \closein\verbatiminput - \egroup - \ignorespaces} - -%D One can use the different \type{\obeysomething} commands to -%D influence the behavior of these macro's. We use for instance -%D \type{\obeycharacters} for making \type{/} an active -%D character when we want to include typesetting commands. - -%D The next part of this module deals with pretty printing. The -%D best way to understand how pretty verbatim typeseting works -%D is to take a look at the output produced by the \TEX, \PERL\ -%D and \METAPOST\ modules first. Each of these modules has a -%D few setup macros that tag the individual characters with a -%D number that itself is associated to a interpretation macro. -%D A previous implementation linked characters (after making -%D them active) directly to such interpreters, but the more -%D indirect way makes it possible to inspect the next -%D character(s) without much expansion problems and/or -%D increasing run time. - -%D By the way, \TEX\ defines \type{\+} as an outer macro, so we -%D have to redefine this one to keep ourselves out of complaints. - -\def\+{\tabalign} - -%D Just to keep things consistant and to speed up some macros a -%D but, we define a few private constants. - -\def\!!PRETTY {PRETTY} - -\def\!!prettyone {prettyone} -\def\!!prettytwo {prettytwo} -\def\!!prettythree {prettythree} -\def\!!prettyfour {prettyfour} - -%D The first step in defining a pretty interpreter is to assign -%D each character that needs special attention a number, like: -%D -%D \starttypen -%D \setpretty \`A 21 -%D \stoptypen -%D -%D Here the macro \type{\setpretty} makes the character -%D \type{A} active, and sets it meaning to the auxiliary macro -%D \type{\handleprettytoken}. This auxiliary macro takes the -%D character code (a number) and the interpretation number. The -%D three step implementation uses the \TEX book \type{~} trick. - -\def\dodosetpretty% - {\!!countb=\uccode`~\relax - \catcode\!!countb=\@@active - \uppercase{\edef~{\noexpand\handleprettytoken{\the\!!counta}{\the\!!countb}}}} - -\def\dosetpretty% - {\afterassignment\dodosetpretty\!!counta} - -\def\setpretty% - {\afterassignment\dosetpretty\uccode`~=} - -%D The macro \type{\handleprettytoken} is rather trivial and -%D calls for an interpreter macro. - -\def\handleprettytoken#1% - {\getvalue{\!!PRETTY#1}} - -%D This interpreter is installed by saying -%D -%D \starttypen -%D \installprettyhandler 21 \SOMEprettyone -%D \stoptypen - -\def\installprettyhandler#1 #2% - {\letvalue{\!!PRETTY#1}#2} - -%D Such an interpreter gets the character number: -%D -%D \starttypen -%D \def\SOMEprettyone#1{...\getpretty{#1}...} -%D \stoptypen -%D -%D where \type{\getpretty} equals \type{\char}. We can't -%D use \type{\let} here because we have to get rid of the -%D braces. - -\def\getpretty#1% - {\char#1} - -%D Sometimes the action depends on the next token. This token -%D can be passed to the macro \type{\getprettydata}, that sets -%D \type{\prettytype} to the interpreter code. The character -%D code is saved in \type{\prettychar}. - -\def\getprettydata#1% - {\bgroup - \global\chardef\prettytype=0 - \global\chardef\prettychar=0 - \def\handleprettytoken##1##2% - {\global\chardef\prettytype=##1\relax - \global\chardef\prettychar=##2\relax}% - \setbox0=\hbox{\global\chardef\prettychar=0#1}% expands #1 and ignores space - \egroup} - -%D If needed the current and next token can be handled alongside: - -\def\getpretties#1#2% - {\char#1\bgroup\let\handleprettytoken=\getsecondpretty#2\egroup} - -\def\getsecondpretty#1#2% - {\char#2} - -%D When needed, one can reassign an interpreter by using -%D \type{\newpretty} and its associates. -%D -%D \bgroup -%D \steltypenin[file][optie=tex,palet=colorpretty] -%D -%D \startbuffer -%D \bgroup -%D \catcode`\|=\@@escape %%\|\ -%D \catcode`\\=\@@active %%\\+ -%D |gdef|dohandlenewpretty#1% -%D {|def|dodohandlenewpretty##1% -%D {|getprettydata{#1}% -%D |let|oldprettychar=|prettychar -%D |getprettydata{##1}% -%D |ifnum|oldprettychar=|prettychar -%D |def|dododohandlenewpretty####1% -%D {|getprettydata{\}% -%D |let|oldprettytype=|prettytype -%D |getprettydata{####1}% -%D |ifnum|prettytype=|oldprettytype -%D |let|next=|newpretty -%D |else -%D |def|next{|newprettycommand{#1}##1####1}% -%D |fi -%D |next}% -%D |let|next=|dododohandlenewpretty -%D |else -%D |def|next{|newprettycommand{#1}##1}% -%D |fi -%D |next}% -%D |def|donohandlenewpretty##1% -%D {|newprettycommand{#1}##1}% -%D |handlenextnextpretty|dodohandlenewpretty|donohandlenewpretty} -%D |egroup -%D \stopbuffer -%D -%D {\newprettytrue\typebuffer} -%D -%D In this example we see that the colors differ from what we -%D expect, but conform the definitions in the macro. This kind -%D of recoloring can be achieved by saying: -%D -%D \typebuffer -%D -%D We'll show some more examples: -%D -%D \startbuffer -%D %%\R{Red -%D %%\G\Green -%D %%\B[Blue -%D \stopbuffer -%D -%D {\newprettytrue\typebuffer} -%D -%D Watch the green \type{\Green}! This lines are specified as: -%D -%D \typebuffer -%D -%D When needed, one can use grouping. -%D -%D \startbuffer -%D {yes} %%\ B %%\{[ %%\}] -%D {no} -%D {no} %%\ E -%D {yes} -%D \stopbuffer -%D -%D \typebuffer -%D -%D This leads to: -%D -%D {\newprettytrue\typebuffer} -%D -%D I won't explain the details of this mechanism. Those who -%D want to build their own pretty interpreters have to close -%D read the source anyway. -%D -%D Last we show an example of mixed pretty typesetting: -%D -%D \startbuffer -%D \ziezo{test} %%\ P ##\ B##\ T % enter PERL mode %%\ E -%D if $test eq "test" ##\ B ##\ B##\ T % begin group (\bgroup) %%\ E -%D if $test eq "test"; ##\ T %%\ B%%\ T % enter TEX mode %%\ E -%D \ziezo{test} %%\ M %%\ B%%\ T % enter METAPOST mode %%\ E -%D draw (0,0)--(10,10); %%\ E ##\ B##\ T % end group (\egroup) %%\ E -%D if $test eq "test"; -%D \stopbuffer -%D -%D \typebuffer -%D -%D Here we use \type{%%\ T}, \type{%%\ P} and \type{%%\ M} for -%D switching between \TEX, \PERL\ and \METAPOST\ mode. -%D -%D {\newprettytrue\typebuffer} -%D -%D \egroup -%D -%D Don't forget to set: - -\newif\ifnewpretty - -\def\installnewpretty% - {\def\doinstallnewpretty##1% - {\setvalue{NP::\the\scratchcounter}{##1}}% - \afterassignment\doinstallnewpretty\scratchcounter=`} - -%D Let's define the options we used here: - -\let\prettyend =\relax -\def\prettybegin{\bgroup\let\prettyend=\egroup} - -\installnewpretty B \prettybegin -\installnewpretty E \prettyend - -\installnewpretty J \setupprettyJVtype -\installnewpretty M \setupprettyMPtype -\installnewpretty P \setupprettyPLtype -\installnewpretty T \setupprettyTEXtype - -%D This means that when the interpreter modules support this -%D mechanism, by default we have four options at available. - -\def\newpretty#1% - {\getprettydata{#1}% - \ifnum\prettytype=0 - \expandafter\nonewpretty - \else - \expandafter\donewpretty - \fi - #1} - -\def\nonewpretty#1#2% - {\getprettydata{#2}% - \getvalue{NP::\the\prettychar}} - -\def\donewpretty#1% - {\bgroup - \def\handleprettytoken##1##2##3% - {\getprettydata{##3}% - \egroup - \ifnum\prettytype>0 - \setpretty##2=\prettytype\relax - \fi}% - #1} - -%D When implementing new pretty macros, one only needs to -%D define something like: -%D -%D \starttypen -%D \def\TEXtypezero% -%D {\handlenewpretty\TEXtypethree} -%D \stoptypen -%D -%D Here the number states the category (in our examples the -%D backslash). The second argument takes care of normal -%D situations. - -\def\handlenewpretty#1% - {\let\newprettycommand=#1% - \handlenextnextpretty\dohandlenewpretty\newprettycommand} - -%D The previous shown implementation only interprets single -%D comments, but the final one also accepts double ones. The -%D main reason for this is that in \JAVA\ we have to deal with -%D \type{//}. Personally I prefer the double \type{%%} because -%D is stands out and is more symmetrical with the double -%D slash. - -\bgroup -\catcode`\|=\@@escape -\catcode`\\=\@@active -|gdef|dohandlenewpretty#1% - {|def|dodohandlenewpretty##1% - {|getprettydata{#1}% - |let|oldprettychar=|prettychar - |getprettydata{##1}% - |ifnum|oldprettychar=|prettychar - |def|dododohandlenewpretty####1% - {|getprettydata{\}% - |let|oldprettytype=|prettytype - |getprettydata{####1}% - |ifnum|prettytype=|oldprettytype - |let|next=|newpretty - |else - |def|next{|newprettycommand{#1}##1####1}% - |fi - |next}% - |let|next=|dododohandlenewpretty - |else - |def|next{|newprettycommand{#1}##1}% - |fi - |next}% - |def|donohandlenewpretty##1% - {|newprettycommand{#1}##1}% - |handlenextnextpretty|dodohandlenewpretty|donohandlenewpretty} -|egroup - -%D The `nextnext' macro we used in the previous definition -%D looks ahead. This is needed because individual lines are -%D handles by macro's and the next character can be something -%D that ends the line and/or does not belong to the verbatim -%D data. - -\def\handlenextnextpretty#1#2#3% - {\def\dohandlenextnextpretty% - {\ifx\next\bgroup % something {} - \let\next=#2% - \else\ifx\next\relax % end of line / signal - \let\next=#2% - %\else\ifx\next\egroup % end of line / no signal - % \let\next=#2% - %\else\ifx\next\par % end of line / \par - \let\next=#2% - \else - \let\next=#1% - \fi\fi%\fi\fi - \next{#3}}% - \futurelet\next\dohandlenextnextpretty} - -%D The pretty interpreters can (and will) change the meaning of -%D some controls. To enable them calling the originals we save -%D their meanings and to enable nesting we permit this only -%D once. - -\def\saveprettycontrols% - {\global\let\oldobeyedspace = \obeyedspace - \global\let\oldobeyedline = \obeyedline - \global\let\oldobeyedpage = \obeyedpage - \let\saveprettycontrols = \relax} - -%D The \PERL\ and \METAPOST\ interpreters will also handle -%D reserved words. Sets of identifiers are defined like: -%D -%D \starttypen -%D \useprettyidentifiers \MODULAidentifiers \MODULAsetspecials -%D if then else elsif case while do repeat until ... -%D \stoptypen -%D -%D New entries can be added to existing sets by repeatedly -%D using this command. - -\def\useprettyidentifiers#1#2% \variable \presetcatcodes - {\bgroup - \ifx#1\undefined - \global\let#1=\empty - \fi - \def\handleprettytoken##1##2{\char##2}% - #2\relax - \def\douseprettyidentifiers##1\par% - {\xdef#1{\space#1\space ##1}% - \egroup}% - \douseprettyidentifiers} - -%D We can test om identifiers with: - -\def\doifprettyidentifierelse#1% - {\doifincsnameelse{\space#1\space}} - -%D \macros -%D {prettyidentifierfont,prettyvariablefont} -%D -%D When one want to typeset identifiers and system variables -%D in a different typeface, one has to set the next two -%D variables. - -\let\prettyidentifierfont=\relax -\let\prettyvariablefont =\relax - -%D The interpreter macros are loaded at run time. The main -%D reason lays in the fact that we don't want to have the -%D identifier lists hard coded in the format file. To prevent -%D repetitive loading, one should load the modules before the -%D first call to the macros. -%D -%D \starttypen -%D \input verb-tex.tex -%D \input verb-pl.tex -%D \input verb-mp.tex -%D \input verb-jv.tex -%D \stoptypen -%D -%D In \CONTEXT\ we follow a different thread, and therefore all -%D macros in the additional modules use \type{\gdef}'s and -%D \type{\doglobal}'s. Manipulating \type{\globaldef} is -%D possible but leads to fuzzy situations. - -%D The rest of this module is dedicated to non \CONTEXT\ users -%D and shows an example of an verbatim environment based on the -%D previous macros. -%D -%D The macro's can be used to construct the commands we -%D mentioned in the beginning of this documentation. We leave -%D this to the fantasy of the reader and only show some \PLAIN\ -%D \TEX\ alternatives for display verbatim and listings. We -%D define three commands for typesetting inline text, display -%D text and files verbatim. The inline alternative also accepts -%D user supplied delimiters. -%D -%D \starttypen -%D \type{text} -%D -%D \starttyping -%D ... verbatim text ... -%D \stoptyping -%D -%D \typefile{filename} -%D \stoptypen -%D -%D We can turn on the options by: -%D -%D \starttypen -%D \controlspacetrue -%D \verbatimtabstrue -%D \prettyverbatimtrue -%D \stoptypen -%D -%D Here is the implementation: - -\newif\ifcontrolspace -\newif\ifverbatimtabs -\newif\ifprettyverbatim - -\ifCONTEXT \else - - \def\presettyping% - {\ifcontrolspace - \let\obeyspace=\setcontrolspace - \fi - \ifverbatimtabs - \let\obeytabs=\settabskips - \fi - \ifprettyverbatim - \let\obeycharacters=\setupprettytype - \fi} - - \def\type% - {\bgroup - \presettyping - \processinlineverbatim{\egroup}} - - \def\starttyping% - {\bgroup - \presettyping - \processdisplayverbatim{\stoptyping}} - - \def\stoptyping% - {\egroup} - - \def\typefile#1% - {\bgroup - \presettyping - \processfileverbatim{#1}% - \egroup} - -\fi - -%D In \CONTEXT\ users say things like: -%D -%D \starttypen -%D \definetyping [TEX] [option=TEX] -%D \definetyping [MP] [option=MP] -%D \definetyping [PL] [option=PL] -%D \definetyping [JV] [option=JV] -%D \stoptypen -%D -%D or -%D -%D \starttypen -%D \setuptyping[file][option=color] -%D \stoptypen -%D -%D That way \CONTEXT\ selects the appropriate interpreter -%D itself, but more on that in another module. In other -%D packages one can define: - -\ifCONTEXT \else - - \input verb-tex - \input verb-mp - \input verb-pl - \input verb-jv - - \def\startTEX% - {\bgroup \everypar{}% - \let\obeycharacters=\setupprettyTEXtype - \processdisplayverbatim{\stopTEX}} - - \def\startMP% - {\bgroup \everypar{}% - \let\obeycharacters=\setupprettyMPtype - \processdisplayverbatim{\stopMP}} - - \def\startPL% - {\bgroup \everypar{}% - \let\obeycharacters=\setupprettyPLtype - \processdisplayverbatim{\stopPL}} - - \def\startJV% - {\bgroup \everypar{}% - \let\obeycharacters=\setupprettyJVtype - \processdisplayverbatim{\stopJV}} - - \let\stopTEX=\egroup - \let\stopMP =\egroup - \let\stopPL =\egroup - \let\stopJV =\egroup - -\fi - -%D This following poor mans implementation of color is based on -%D PostScript. One can of course use grayscales too. In the -%D core modules these macros are redefined to using the color -%D mechanism present in \CONTEXT. - -\ifCONTEXT \else - - \def\setcolorverbatim% - {\def\prettyone {.9 .0 .0 } % red - \def\prettytwo {.0 .8 .0 } % green - \def\prettythree {.0 .0 .9 } % blue - \def\prettyfour {.8 .8 .6 } % yellow - \def\beginofpretty[##1]% - {\special{ps:: \csname##1\endcsname setrgbcolor}} - \def\endofpretty% - {\special{ps:: 0 0 0 setrgbcolor}}} % black - - \def\setgrayverbatim% - {\def\prettyone {.30 } % gray - \def\prettytwo {.45 } % gray - \def\prettythree {.60 } % gray - \def\prettyfour {.75 } % gray - \def\beginofpretty[##1]% - {\special{ps:: \csname##1\endcsname setgray}} - \def\endofpretty% - {\special{ps:: 0 setgray}}} % black - -\fi - -%D One can redefine these two commands after loading this -%D module. When available, one can also use appropriate -%D font||switch macro's. We default to color. - -\ifCONTEXT \else \setcolorverbatim \fi - -%D Here come the commands that are responsible for entering and -%D leaving the two states. As we can see, they've got much in -%D common. - -%D The previous version of this module was published in the -%D \MAPS\ of the dutch \TEX\ users group \NTG. In that article, -%D the verbatim part of the text was typeset with the following -%D commands for the examples: -%D -%D \starttypen -%D \def\starttypen% We simplify the \ConTeXt\ macro. -%D {\bgroup -%D \everypar{} % We disable some troublesome mechanisms. -%D \advance\leftskip by 1em -%D \processdisplayverbatim{\stoptypen}} -%D -%D \let\stoptypen=\egroup -%D \stoptypen -%D -%D We also used: -%D -%D \starttypen -%D \def\startdefinition% -%D {\bgroup -%D \everypar{} % Again we disable some troublesome mechanisms. -%D \let\obeycharacters=\setupprettyTEXtype % See verb-tex.tex! -%D \EveryPar{\showparagraphcounter}% -%D \EveryLine{\showlinecounter}% -%D \verbatimbodyfont -%D \processdisplayverbatim{\stopdefinition}} -%D -%D \def\stopdefinition% -%D {\egroup} -%D \stoptypen -%D -%D And because we have both \type{\EveryPar} and -%D \type{\EveryLine} available, we can implement a dual -%D numbering mechanism: -%D -%D \starttypen -%D \newcount\paragraphcounter -%D \newcount\linecounter -%D -%D \def\showparagraphcounter% -%D {\llap -%D {\bgroup -%D \counterfont -%D \hbox to 4em -%D {\global\advance\paragraphcounter by 1 -%D \hss \the\paragraphcounter \hskip2em}% -%D \egroup -%D \hskip1em}} -%D -%D \def\showlinecounter% -%D {\llap -%D {\bgroup -%D \counterfont -%D \hbox to 2em -%D {\global\advance\linecounter by 1 -%D \hss \the\linecounter}% -%D \egroup -%D \hskip1em}} -%D \stoptypen -%D -%D One may have noticed that the \type{\EveryPar} is only -%D executed once, because we consider each piece of verbatim -%D as one paragraph. When one wants to take the empty lines -%D into account, the following assignments are appropriate: -%D -%D \starttypen -%D \EveryLine -%D {\iflinepar -%D \showparagraphcounter -%D \fi -%D \showlinecounter} -%D \stoptypen -%D -%D In this case, nothing has to be assigned to \type{\EveryPar}, -%D maybe except of just another extra numbering scheme. The -%D macros used to typeset this documentation are a bit more -%D complicated, because we have to take take 'long' margin -%D lists into account. When such a list exceeds the previous -%D pargraph we postpone placement of the paragraph number till -%D there's room. This way so it does not clash with the margin -%D words. - -%D Normally such commands have to be embedded in a decent setup -%D structure, where options can be set at will. -%D -%D Now let's summarize the most important commands. -%D -%D \starttypen -%D \processinlineverbatim{\closingcommand} -%D \processdisplayverbatim{\closingcommand} -%D \processfileverbatim{filename} -%D \stoptypen -%D -%D We can satisfy our own specific needs with the following -%D interfacing macro's: -%D -%D \starttypen -%D \obeyspaces \obeytabs \obeylines \obeypages \obeycharacters -%D \stoptypen -%D -%D We can influence the verbatim environment with the following -%D macro: -%D -%D \starttypen -%D \obeyemptylines -%D \stoptypen -%D -%D Some needs are fulfilled already with: -%D -%D \starttypen -%D \setcontrolspace \settabskips -%D \stoptypen -%D -%D lines can be enhanced with ornaments using: -%D -%D \starttypen -%D \everypar \everyline \iflinepar -%D \stoptypen -%D -%D and pretty verbatim support is implemented by: -%D -%D \starttypen -%D \beginofpretty[#1] ... \endofpretty -%D \stoptypen -%D -%D and some setup macro, like: -%D -%D \starttypen -%D \setupprettyIDENTIFIERtype -%D \stoptypen -%D -%D The color support macro can be redefined by the user. The -%D parameter \type{#1} can be one of the four 'fixed' -%D identifiers {\em prettyone}, {\em prettytwo}, {\em -%D prettythree} and {\em prettyfour}. We have implemented a -%D more or less general PostScript color support mechanism, -%D using \type{specials}. One can toggle between color and -%D grayscale with: -%D -%D \starttypen -%D \setgrayverbatim \setcolorverbatim -%D \stoptypen - -%D \macros -%D {permitshiftedendofverbatim} -%D {} -%D -%D We did not mention one drawback of the mechanism described -%D here. The closing command must start at the first position -%D of the line. In \CONTEXT\ we will not have this drawback, -%D because we can test if the end command is a substring of the -%D current line. The testing is done by two of the support -%D macros, which of course are not available in a stand alone -%D application of this module. - -\ifCONTEXT - - \let\doifendofverbatim=\doifelse - - \def\permitshiftedendofverbatim% - {\let\doifendofverbatim=\doifinstringelse} - - \def\processdisplayverbatim#1% - {\par - \bgroup - \escapechar=-1 - \xdef\verbatimname{\string#1}% - \egroup - \def\endofdisplayverbatim{\csname\verbatimname\endcsname}% - \bgroup - \parindent\!!zeropoint - \ifdim\lastskip<\parskip - \removelastskip - \vskip\parskip - \fi - \parskip\!!zeropoint - \processingverbatimtrue - \expandafter\let\csname\verbatimname\endcsname=\relax - \expandafter\convertargument\csname\verbatimname\endcsname - \to\endofverbatimcommand - \verbatimfont - \setupcopyverbatim - \initializeverbatimline - \copyverbatimline} - - {\obeylines% - \long\gdef\copyverbatimline#1 - {\convertargument#1 \to\next% - \gdef\verbatimline{#1}% - \ifx\next\emptyspace% - \presetemptyverbatimline% - \else% - \doifendofverbatim{\endofverbatimcommand}{\next}% - {\presetlastverbatimline% - \def\copyverbatimline{\egroup\endofdisplayverbatim}}% - {\presetnormalverbatimline}% - \fi% - \handleverbatimline% - \copyverbatimline}} - -\fi - -\protect - -\endinput +%D \module
+%D [ file=verb-ini,
+%D version=1997.12.22,
+%D title=\CONTEXT\ Verbatim 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.
+
+%D Because this module is quite independant of system macros,
+%D it can be used as a stand||alone verbatim environment.
+%D
+%D This is a sort of second release of \type{supp-ver} and
+%D therefore differs in some aspects from the implementation
+%D published in the \MAPS. The first change concern
+%D optimization of breaks, that is, the first and last two
+%D lines of verbatim blocks are kept together. The second
+%D adaption is due to the fact that I wanted to support pretty
+%D printing not only for \TEX\ sources, but also for \PERL,
+%D \METAPOST\ and probably more. The \JAVASCRIPT\ module is
+%D closely related to \PERL, so we will not mention that one
+%D again.
+
+\ifx \undefined \writestatus \input supp-mis.tex \fi
+
+%D Verbatim typesetting, especially of \TEX\ sources, is a
+%D non||trivial task. This is a direct results of the fact that
+%D characters can have \CATCODES\ other than~11 and such
+%D characters needs a special treatment. What for instance is
+%D \TEX\ supposed to do when it encounters a \type{$} or an
+%D \type{#}? This module deals with these matters.
+
+\writestatus{loading}{Context Verbatim Macros / Initialization}
+
+%D The verbatim environment has some features, like coloring
+%D \TEX\ text, seldom found in other environments. Especially
+%D when the output of \TEX\ is viewed on an electronic medium,
+%D coloring has a positive influence on the readability of
+%D \TEX\ sources, so we found it very acceptable to dedicate
+%D half of this module to typesetting \TEX\ specific character
+%D sequences in color. In this module we'll also present some
+%D macro's for typesetting inline, display and file verbatim.
+%D The macro's are capable of handling \TAB\ too.
+%D
+%D This module shows a few tricks that are often overseen by
+%D novice, like the use of the \TEX\ primitive \type{\meaning}.
+%D First I'll show in what way the users are confronted with
+%D verbatim typesetting. Because we want to be able to test for
+%D symmetry and because we hate the method of closing down the
+%D verbatim mode with some strange active character, we will
+%D use the following construction for display verbatim:
+%D
+%D \starttypen
+%D \starttyping
+%D The Dutch word 'typen' stands for 'typing', therefore in the Dutch version
+%D one will not find the word 'verbatim'.
+%D \stoptyping
+%D \stoptypen
+%D
+%D In \CONTEXT\ files can be typed with \type{\typefile} and
+%D inline verbatim can be accomplished with \type{\type}. This
+%D last command comes in many flavors:
+%D
+%D \starttypen
+%D We can say \type<<something>> or \type{something}. The first one is a bit
+%D longer but also supports slanted typing, which accomplished by typing
+%D \type<<a <<slanted>> word>>. We can also use commands to enhance the text
+%D \type<<with <</bf boldfaced>> text>>. Just to be complete, we decided
+%D to accept also \LaTeX\ alike verbatim, which means that \type+something+
+%D and \type|something| are valid commands too. Of course we want the grouped
+%D alternatives to process \type{hello {\bf big} world} with braces.
+%D \stoptypen
+%D
+%D In the core modules, we will build this support on top of
+%D this module. There these commands can be tuned with
+%D accompanying setup commands. There we can enable commands,
+%D slanted typing, control spaces, \TAB||handling and (here we
+%D are:) coloring. We can also setup surrounding white space
+%D and indenting. Here we'll only show some examples.
+
+\unprotect
+
+%D \macros
+%D {verbatimfont}
+%D {}
+%D
+%D When we are typesetting verbatim we use a non||proportional
+%D (mono spaced) font. Normally this font is available by
+%D calling \type{\tt}. In \CONTEXT\ this command does a
+%D complete font||style switch. There we could have stuck with
+%D \type{\tttf}.
+
+\ifx \undefined \verbatimfont \def\verbatimfont {\tt} \fi
+
+%D \macros
+%D {obeyedspace, obeyedtab, obeyedline, obeyedpage}
+%D {}
+%D
+%D We have followed Knuth in naming macros that make \SPACE,
+%D \NEWLINE\ and \NEWPAGE\ active and assigning them
+%D \type{\obeysomething}, but first we set some default values.
+
+\def\obeyedspace {\hbox{ }}
+\def\obeyedtab {\obeyedspace}
+\def\obeyedline {\par}
+\def\obeyedpage {\vfill\eject}
+
+%D \macros
+%D {controlspace,setcontrolspaces}
+%D {}
+%D
+%D First we define \type{\obeyspaces}. When we want visible
+%D spaces (control spaces) we only have to adapt the definition
+%D of \type{\obeyedspace} to:
+
+\def\controlspace {\hbox{\char32}}
+
+\bgroup
+\catcode`\ =\@@active
+\gdef\obeyspaces{\catcode`\ =\@@active\def {\obeyedspace}}
+\gdef\setcontrolspaces{\catcode`\ =\@@active\def {\controlspace}}
+\egroup
+
+%D \macros
+%D {obeytabs, obeylines, obeypages,
+%D ignoretabs, ignorelines, ignorepages}
+%D {}
+%D
+%D Next we take care of \NEWLINE\ and \NEWPAGE\ and because we
+%D want to be able to typeset listings that contain \TAB, we
+%D have to handle those too. Because we have to redefine the
+%D \NEWPAGE\ character locally, we redefine the meaning of
+%D this (often already) active character.
+
+\catcode`\^^L=\@@active \def^^L{\par}
+
+%D The following indirect definitions enable us to implement
+%D all kind of \type{\obeyed} handlers.
+
+\bgroup
+
+\catcode`\^^I=\@@active
+\catcode`\^^M=\@@active
+\catcode`\^^L=\@@active
+
+\gdef\obeytabs {\catcode`\^^I=\@@active\def^^I{\obeyedtab}}
+\gdef\obeylines {\catcode`\^^M=\@@active\def^^M{\obeyedline}}
+\gdef\obeypages {\catcode`\^^L=\@@active\def^^L{\obeyedpage}}
+
+\gdef\ignoretabs {\catcode`\^^I=\@@active\def^^I{\obeyedspace}}
+\gdef\ignorelines {\catcode`\^^M=\@@active\def^^M{\obeyedspace}}
+\gdef\ignorepages {\catcode`\^^L=\@@active\def^^L{\obeyedline}}
+
+\egroup
+
+%D \macros
+%D {obeycharacters}
+%D {}
+%D
+%D We also predefine \type{\obeycharacters}, which will
+%D enable us to implement character||specific behavior, like
+%D colored verbatim.
+
+\let\obeycharacters=\relax
+
+%D \macros
+%D {settabskips}
+%D {}
+%D
+%D The macro \type{\settabskip} can be used to enable tab
+%D handling. Processing tabs is sometimes needed when one
+%D processes a plain \ASCII\ listing. Tab handling slows down
+%D verbatim typesetting considerably.
+
+\bgroup
+
+\catcode`\^^I=\@@active
+
+\gdef\settabskips%
+ {\let\processverbatimline=\doprocesstabskipline
+ \catcode`\^^I=\@@active
+ \let^^I=\doprocesstabskip}
+
+\egroup
+
+%D \macros
+%D {processinlineverbatim}
+%D {}
+%D
+%D Although the inline verbatim commands presented here will be
+%D extended and embedded in the core modules of \CONTEXT,
+%D they can be used separately. Both grouped and character
+%D alternatives are provided but \type{<<} and nested
+%D braces are implemented in the core module. This commands
+%D takes one argument: the closing command.
+%D
+%D \starttypen
+%D \processinlineverbatim{\closingcommand}
+%D \stoptypen
+%D
+%D One can define his own verbatim commands, which can be very
+%D simple:
+%D
+%D \starttypen
+%D \def\Verbatim {\processinlineverbatim\relax}
+%D \stoptypen
+%D
+%D or a bit more more complex:
+%D
+%D \starttypen
+%D \def\GroupedVerbatim%
+%D {\bgroup
+%D \dosomeusefullthings
+%D \processinlineverbatim\egroup}
+%D \stoptypen
+%D
+%D Before entering inline verbatim mode, we take care of the
+%D unwanted \TAB, \NEWLINE\ and \NEWPAGE\ characters and
+%D turn them into \SPACE. We need the double \type{\bgroup}
+%D construction to keep the closing command local.
+
+\def\setupinlineverbatim%
+ {\verbatimfont
+ \let\obeytabs=\ignoretabs
+ \let\obeylines=\ignorelines
+ \let\obeypages=\ignorepages
+ \setupcopyverbatim}
+
+\def\doprocessinlineverbatim%
+ {\ifx\next\bgroup
+ \setupinlineverbatim
+ \catcode`\{=\@@begingroup
+ \catcode`\}=\@@endgroup
+ \def\next{\let\next=}%
+ \else
+ \setupinlineverbatim
+ \def\next##1{\catcode`##1=\@@endgroup}%
+ \fi
+ \next}
+
+\def\processinlineverbatim#1%
+ {\bgroup
+ \localcatcodestrue % TeX processes paragraph's
+ \def\endofverbatimcommand{#1\egroup}%
+ \bgroup
+ \aftergroup\endofverbatimcommand
+ \futurelet\next\doprocessinlineverbatim}
+
+%D The closing command is executed afterwards as an internal
+%D command and therefore should not be given explicitly when
+%D typesetting inline verbatim.
+
+%D \macros
+%D {processingverbatim}
+%D {}
+%D
+%D Typesetting a file in most cases results in more than one
+%D page. Because we don't want problems with files that are
+%D read in during the construction of the page, we set
+%D \type{\ifprocessingverbatim}, so the output routine can
+%D adapt its behavior. Originally we used
+%D \type{\scratchread}, but because we want to support nesting,
+%D we decided to use a separate input file.
+
+\newif\ifprocessingverbatim
+
+%D \macros
+%D {optimizeverbatim}
+%D
+%D One day, a collegue asked me why I didn't prevent breaking
+%D after a first or before a last verbatim line. At first sight
+%D I thought of using the two pass mechanism, but because we're
+%D already keeping track of individual lines, a more direct
+%D solution is possible: we just keep track of in what line
+%D we are. One can turn this feature off.
+
+\newif\ifoptimizeverbatim \optimizeverbatimtrue
+
+%D Before we implement display and file verbatim, we define
+%D some macros that deal with typesetting the individual lines.
+%D We keep track of the status by means of a character
+%D specification. This status variable tells us if we're
+%D skipping a first line or placing a first or last line.
+%D The next few examples show us where breaks are inserted.
+%D
+%D \bgroup
+%D
+%D \def\doverbatimnobreak%
+%D {\nobreak\hrule width 10cm\par\penalty500} % == \nobreak
+%D
+%D \def\doverbatimgoodbreak%
+%D {\nobreak\hrule width 3cm \par\penalty100} % >> \goodbreak
+%D
+%D \starttypen
+%D test
+%D test
+%D \stoptypen
+%D
+%D or
+%D
+%D \starttypen
+%D test
+%D test
+%D test
+%D test
+%D \stoptypen
+%D
+%D or
+%D
+%D \starttypen
+%D test
+%D
+%D test
+%D test
+%D test
+%D \stoptypen
+%D
+%D \egroup
+%D
+%D The long ones are \type{\nobreaks} and the short ones
+%D \type{\goodbreaks}. And this is how it's done:
+
+\def\doverbatimnobreak%
+ {\ifoptimizeverbatim\par\penalty500\fi}
+
+\def\doverbatimgoodbreak%
+ {\ifoptimizeverbatim\par\penalty100\fi}
+
+\def\doflushverbatimline%
+ {\expandafter\dodoverbatimline\expandafter{\savedverbatimline}}
+
+\let\handleverbatimline=\relax
+
+\def\initializeverbatimline%
+ {\global\let\savedverbatimline=\empty
+ \ifskipfirstverbatimline
+ \global\chardef\verbatimstatus=0
+ \else
+ \global\chardef\verbatimstatus=1
+ \fi}
+
+\def\presetemptyverbatimline%
+ {\ifcase\verbatimstatus
+ \global\chardef\verbatimstatus=1
+ \or
+ \or
+ % \ifoptimizeverbatim\else\doemptyverbatimline\fi
+ \or
+ \doflushverbatimline
+ \global\let\savedverbatimline=\empty
+ \doemptyverbatimline
+ \global\chardef\verbatimstatus=2
+ \else
+ \doverbatimnobreak
+ \doflushverbatimline
+ \global\let\savedverbatimline=\empty
+ \doemptyverbatimline
+ \global\chardef\verbatimstatus=2
+ \fi}
+
+\def\presetnormalverbatimline%
+ {\ifcase\verbatimstatus
+ \global\chardef\verbatimstatus=2
+ \or
+ \global\chardef\verbatimstatus=3
+ \or
+ \global\chardef\verbatimstatus=3
+ \or
+ \doflushverbatimline
+ \global\chardef\verbatimstatus=4
+ \or
+ \doverbatimnobreak
+ \doflushverbatimline
+ \global\chardef\verbatimstatus=5
+ \or
+ \doverbatimgoodbreak
+ \doflushverbatimline
+ \fi
+ \global\let\savedverbatimline=\verbatimline}
+
+\def\presetlastverbatimline%
+ {\ifcase\verbatimstatus \or \or \or
+ \doflushverbatimline
+ \else
+ \doverbatimnobreak
+ \doflushverbatimline
+ \fi}
+
+%D \macros
+%D {skipfirstverbatimline}
+%D
+%D By default the rest of the first line is ignored. We can
+%D turn this feature off by saying:
+%D
+%D \starttypen
+%D \skipfirstverbatimlinefalse
+%D \stoptypen
+
+\newif\ifskipfirstverbatimline \skipfirstverbatimlinetrue
+
+%D \macros
+%D {processdisplayverbatim}
+%D {}
+%D
+%D We can define a display verbatim environment with the
+%D command \type{\processdisplayverbatim} in the following way:
+%D
+%D \starttypen
+%D \processdisplayverbatim{\closingcommand}
+%D \stoptypen
+%D
+%D \noindent For instance, we can define a simple command like:
+%D
+%D \starttypen
+%D \def\BeginVerbatim {\processdisplayverbatim{EndVerbatim}}
+%D \stoptypen
+%D
+%D \noindent But we can also do more advance things like:
+%D
+%D \starttypen
+%D \def\BeginVerbatim {\bigskip \processdisplayverbatim{\EndVerbatim}}
+%D \def\EndVerbatim {\bigskip}
+%D \stoptypen
+%D
+%D When we compare these examples, we see that the backslash in
+%D the closing command is optional. One is free in actually
+%D defining a closing command. If one is defined, the command
+%D is executed after ending verbatim mode.
+
+\def\processdisplayverbatim#1%
+ {\par
+ \bgroup
+ \escapechar=-1
+ \xdef\verbatimname{\string#1}%
+ \egroup
+ \def\endofdisplayverbatim{\csname\verbatimname\endcsname}%
+ \bgroup
+ \parindent\!!zeropoint
+ \ifdim\lastskip<\parskip
+ \removelastskip
+ \vskip\parskip
+ \fi
+ \parskip\!!zeropoint
+ \processingverbatimtrue
+ \linepartrue
+ \expandafter\let\csname\verbatimname\endcsname=\relax
+ \edef\endofverbatimcommand{\csname\verbatimname\endcsname}%
+ \edef\endofverbatimcommand{\meaning\endofverbatimcommand}%
+ \verbatimfont
+ \setupcopyverbatim
+ \initializeverbatimline
+ \copyverbatimline}
+
+%D We save the closing sequence in \type{\endofverbatimcommand}
+%D in such a way that it can be compared on a line by line
+%D basis. For the conversion we use \type{\meaning}, which
+%D converts the line to non||expandable tokens. We reset
+%D \type{\parskip}, because we don't want inter||paragraph
+%D skips to creep into the verbatim source. Furthermore we
+%D \type{\relax} the line||processing macro while getting the
+%D rest of the first line. The initialization command
+%D \type{\setupcopyverbatim} does just what we expect it to do:
+%D it assigns all characters \CATCODE~11. Next we switch to
+%D french spacing and call for obeyance.
+
+\def\setupcopyverbatim%
+ {\uncatcodecharacters
+ \frenchspacing
+ \obeyspaces
+ \obeytabs
+ \obeylines
+ \obeypages
+ \obeycharacters}
+
+%D \macros
+%D {eightbitcharacters,
+%D setcatcodes,uncatcodespecials,
+%D uncatcodecharacters}
+%D {}
+%D
+%D As its name says, \type{\uncatcodecharacters} resets the
+%D \CATCODE\ of characters. When we use an upper bound of
+%D 127 or 255, depending in \type{\ifeightbitcharacters}. By
+%D counting down, we only have to use one counter. The
+%D macro \type{\setcatcodes} can be uses to set alternative
+%D values. The macro \type{\resetspecialcharacters} resets
+%D characters with special meanings. This macro is not used
+%D in the verbatim macros, but is best defined in this module.
+
+\def\doprocesscatcodes#1%
+ {\ifeightbitcharacters
+ \scratchcounter=255
+ \else
+ \scratchcounter=127
+ \fi
+ \loop
+ \savecatcode
+ #1\relax
+ \advance\scratchcounter by -1
+ \ifnum\scratchcounter>-1
+ \repeat
+ \let\savecatcode=\relax
+ \let\restorecatcodes=\dorestorecatcodes}
+
+\def\uncatcodespecials%
+ {\doprocesscatcodes
+ {\ifnum\catcode\scratchcounter=\@@letter\relax\else
+ \catcode\scratchcounter=\@@other
+ \fi}%
+ \catcode`\ =\@@space
+ \catcode`\^^L=\@@ignore
+ \catcode`\^^M=\@@endofline
+ \catcode`\^^?=\@@ignore}
+
+\def\setcatcodes#1%
+ {\doprocesscatcodes
+ {\catcode\scratchcounter=#1}}
+
+\def\uncatcodecharacters%
+ {\setcatcodes\@@letter}
+
+%D \macros
+%D {localcatcodes,
+%D restorecatcodes,
+%D beginrestorecatcodes,endrestorecatcodes}
+%D {}
+%D
+%D We're not finished dealing \CATCODES\ yet. In \CONTEXT\ we
+%D use only one auxiliary file, which deals with tables of
+%D contents, registers, two pass tracking, references etc. This
+%D file, as well as files concerning graphics, is processed when
+%D needed, which can be in the mid of typesetting verbatim.
+%D However, when reading in data in verbatim mode, we should
+%D temporary restore the normal \CATCODES, and that's exactly
+%D what the next macros do. Saving the catcodes can be
+%D disabled by saying \type{\localcatcodestrue}.
+
+%D The previous macros call for \type{\savecatcode}, which is
+%D implemented as:
+
+\newif\iflocalcatcodes
+
+\def\savecatcode%
+ {\iflocalcatcodes \else
+ \expandafter\chardef\csname @@cc@@\the\scratchcounter\endcsname
+ =\catcode\scratchcounter
+ \fi}
+
+%D It's counterpart is:
+
+\def\restorecatcode%
+ {\expandafter\catcode\expandafter\scratchcounter\expandafter=
+ \csname @@cc@@\the\scratchcounter\endcsname}
+
+%D When we want to restore \CATCODES\ we call for
+%D \type{\restorecatcodes}, which default to \type{\relax}
+
+\let\restorecatcodes=\relax
+
+%D or when we've saves things calls for:
+
+\def\dorestorecatcodes%
+ {\iflocalcatcodes \else
+ \doprocesscatcodes\restorecatcode
+ \fi}
+
+%D We also provide an alternative, that forces grouping
+%D when needed. An application of this macros can be found in
+%D buffering data.
+
+\def\beginrestorecatcodes%
+ {\ifx\restorecatcodes\relax
+ \let\endrestorecatcodes=\relax
+ \else
+ \bgroup
+ \restorecatcodes
+ \let\beginrestorecatcodes=\bgroup
+ \let\endrestorecatcodes =\egroup
+ \fi}
+
+%D The main copying routine of display verbatim does an
+%D ordinary string||compare on the saved closing command and
+%D the current line. The space after \type{#1} in the
+%D definition of \type{\next} is essential! As a result of
+%D using \type{\obeylines}, we have to use \type{%}'s after
+%D each line but none after the first \type{#1}.
+
+{\obeylines%
+ \long\gdef\copyverbatimline#1
+ {\def\next{#1 }%
+ \gdef\verbatimline{#1}%
+ \ifx\next\emptyspace%
+ \presetemptyverbatimline%
+ \else%
+ \edef\next{\meaning\next}%
+ \ifx\next\endofverbatimcommand%
+ \presetlastverbatimline%
+ \def\copyverbatimline{\egroup\endofdisplayverbatim}%
+ \else%
+ \presetnormalverbatimline%
+ \fi%
+ \fi%
+ \handleverbatimline%
+ \copyverbatimline}}
+
+%D The actual typesetting of a line is done by a separate
+%D macro, which enables us to implement \TAB\ handling. The
+%D \type{\do} and \type{\dodo} macros take care of the
+%D preceding \type{\parskip}, while skipping the rest of the
+%D first line. The \type{\relax} is used as an signal.
+
+%D \macros
+%D {iflinepar}
+%D {}
+%D
+%D A careful reader will see that \type{\linepar} is reset.
+%D This boolean can be used to determine if the current line is
+%D the first line in a pseudo paragraph and this boolean is set
+%D after each empty line. The \type{\relax} can be used to
+%D determine the end of the line when one implements a scanner
+%D routine.
+
+\newif\iflinepar
+
+\let\doopenupverbatimline=\empty
+
+\long\def\dodoverbatimline#1%
+ {\leavevmode
+ \doopenupverbatimline
+ \the\everyline\strut\processverbatimline{#1\relax}%
+ \EveryPar{}%
+ \lineparfalse
+ \obeyedline\par}
+
+%D \macros
+%D {obeyemptylines,verbatimbaselineskip}
+%D {}
+%D
+%D Empty lines in verbatim can lead to white space on top of
+%D a new page. Because this is not what we want, we turn
+%D them into vertical skips. This default behavior can be
+%D overruled by:
+%D
+%D \starttypen
+%D \obeyemptylines
+%D \stoptypen
+%D
+%D Although it would cost us only a few lines of code, we
+%D decided not to take care of multiple empty lines. When a
+%D (display) verbatim text contains more successive empty
+%D lines, this probably suits some purpose. When applicable,
+%D one can set the verbatim baselineskip.
+
+\bgroup
+\catcode`\^^L=\@@active \gdef\emptypage {^^L}
+\catcode`\^^M=\@@active \gdef\emptyline {^^M}
+ \gdef\emptyspace { }
+\egroup
+
+\def\verbatimbaselineskip% We don't use \let here!
+ {\baselineskip}
+
+\def\doemptyverbatimline%
+ {\vskip\verbatimbaselineskip
+ {\setbox0=\hbox{\the\everyline}}%
+ \linepartrue}
+
+\def\obeyemptylines%
+ {\def\doemptyverbatimline{\doverbatimline}}
+
+%D \TEX\ does not offer \type{\everyline}, which is a direct
+%D result of its advanced multi||pass paragraph typesetting
+%D mechanism. Because in verbatim mode paragraphs and lines are
+%D more or less equal, we can easily implement our own simple
+%D \type{\everyline} support.
+
+%D \macros
+%D {EveryPar, EveryLine}
+%D {}
+%D
+%D In this module we've reserved \type{\everypar} for the
+%D things to be done with paragraphs and \type{\everyline} for
+%D line specific actions. In \CONTEXT\ however, we use
+%D \type{\everypar} for placing side- and columnfloats,
+%D inhibiting indentation and some other purposes. In verbatim
+%D mode, every line becomes a paragraph, which means that
+%D \type{\everypar} is executed frequently. To be sure, the
+%D user specific use of both \type{\everyline} and
+%D \type{\everypar} is implemented by means of
+%D \type{\EveryLine} and \type{\EveryPar}.
+%D
+%D We still have to take care of the \TAB. A \TAB\ takes eight
+%D spaces and a \SPACE\ normally has a width of 0.5~em. Because
+%D we can be halfway a tabulation, we must keep track of the
+%D position. This takes time, especially when we print complete
+%D files, therefore we \type{\relax} this mechanism by default.
+
+\def\doprocesstabskip%
+ {\obeyedspace % \hskip.5em or \hbox to .5em{}
+ \ifdone
+ \advance\scratchcounter by 1
+ \let\next=\doprocesstabskip
+ \donefalse
+ \else\ifnum\scratchcounter>7
+ \let\next=\relax
+ \else
+ \advance\scratchcounter 1
+ \let\next=\doprocesstabskip
+ \fi\fi
+ \next}
+
+\def\dodoprocesstabskipline#1#2\endoftabskipping%
+ {\ifnum\scratchcounter>7
+ \scratchcounter=1
+ \donetrue
+ \else
+ \advance\scratchcounter 1
+ \donefalse
+ \fi
+ \ifx#1\relax
+ \let\next=\relax
+ \else
+ \def\next{#1\dodoprocesstabskipline#2\endoftabskipping}%
+ \fi
+ \next}
+
+\let\endoftabskipping=\relax
+
+\def\processverbatimline#1{#1} % remove the fake grouping
+
+\def\doprocesstabskipline#1%
+ {\bgroup
+ \scratchcounter=1
+ \dodoprocesstabskipline#1\relax\endoftabskipping
+ \egroup}
+
+%D \macros
+%D {processfileverbatim}
+%D {}
+%D
+%D The verbatim typesetting of files is done on a bit different
+%D basis. This time we don't check for a closing command, but
+%D look for \EOF\ and when we've met, we make sure it does not
+%D turn into an empty line.
+%D
+%D \starttypen
+%D \processfileverbatim{filename}
+%D \stoptypen
+%D
+%D We reserve a dedicated file handle.
+
+\newread\verbatiminput
+
+\def\processfileverbatim#1%
+ {\par
+ \bgroup
+ \parindent\!!zeropoint
+ \ifdim\lastskip<\parskip
+ \removelastskip
+ \vskip\parskip
+ \fi
+ \parskip\!!zeropoint
+ \processingverbatimtrue
+ \linepartrue
+ \uncatcodecharacters
+ \verbatimfont
+ \frenchspacing
+ \obeyspaces
+ \obeytabs
+ \obeylines
+ \obeypages
+ \obeycharacters
+ \openin\verbatiminput=#1
+ \skipfirstverbatimlinefalse
+ \initializeverbatimline
+ \def\readline%
+ {\read\verbatiminput to \verbatimline
+ \ifeof\verbatiminput
+ \presetlastverbatimline
+ \let\readline=\relax
+ \else\ifx\verbatimline\emptyline
+ \presetemptyverbatimline
+ \else\ifx\verbatimline\emptypage
+ \presetemptyverbatimline
+ \else
+ \presetnormalverbatimline
+ \fi\fi\fi
+ \handleverbatimline
+ \readline}%
+ \ifeof\verbatiminput \else
+ \expandafter\readline
+ \fi
+ \closein\verbatiminput
+ \egroup
+ \ignorespaces}
+
+%D One can use the different \type{\obeysomething} commands to
+%D influence the behavior of these macro's. We use for instance
+%D \type{\obeycharacters} for making \type{/} an active
+%D character when we want to include typesetting commands.
+
+%D The next part of this module deals with pretty printing. The
+%D best way to understand how pretty verbatim typeseting works
+%D is to take a look at the output produced by the \TEX, \PERL\
+%D and \METAPOST\ modules first. Each of these modules has a
+%D few setup macros that tag the individual characters with a
+%D number that itself is associated to a interpretation macro.
+%D A previous implementation linked characters (after making
+%D them active) directly to such interpreters, but the more
+%D indirect way makes it possible to inspect the next
+%D character(s) without much expansion problems and/or
+%D increasing run time.
+
+%D By the way, \TEX\ defines \type{\+} as an outer macro, so we
+%D have to redefine this one to keep ourselves out of complaints.
+
+\def\+{\tabalign}
+
+%D Just to keep things consistant and to speed up some macros a
+%D but, we define a few private constants.
+
+\def\!!PRETTY {PRETTY}
+
+\def\!!prettyone {prettyone}
+\def\!!prettytwo {prettytwo}
+\def\!!prettythree {prettythree}
+\def\!!prettyfour {prettyfour}
+
+%D The first step in defining a pretty interpreter is to assign
+%D each character that needs special attention a number, like:
+%D
+%D \starttypen
+%D \setpretty \`A 21
+%D \stoptypen
+%D
+%D Here the macro \type{\setpretty} makes the character
+%D \type{A} active, and sets it meaning to the auxiliary macro
+%D \type{\handleprettytoken}. This auxiliary macro takes the
+%D character code (a number) and the interpretation number. The
+%D three step implementation uses the \TEX book \type{~} trick.
+
+\def\dodosetpretty%
+ {\!!countb=\uccode`~\relax
+ \catcode\!!countb=\@@active
+ \uppercase{\edef~{\noexpand\handleprettytoken{\the\!!counta}{\the\!!countb}}}}
+
+\def\dosetpretty%
+ {\afterassignment\dodosetpretty\!!counta}
+
+\def\setpretty%
+ {\afterassignment\dosetpretty\uccode`~=}
+
+%D The macro \type{\handleprettytoken} is rather trivial and
+%D calls for an interpreter macro.
+
+\def\handleprettytoken#1%
+ {\getvalue{\!!PRETTY#1}}
+
+%D This interpreter is installed by saying
+%D
+%D \starttypen
+%D \installprettyhandler 21 \SOMEprettyone
+%D \stoptypen
+
+\def\installprettyhandler#1 #2%
+ {\letvalue{\!!PRETTY#1}#2}
+
+%D Such an interpreter gets the character number:
+%D
+%D \starttypen
+%D \def\SOMEprettyone#1{...\getpretty{#1}...}
+%D \stoptypen
+%D
+%D where \type{\getpretty} equals \type{\char}. We can't
+%D use \type{\let} here because we have to get rid of the
+%D braces.
+
+\def\getpretty#1%
+ {\char#1}
+
+%D Sometimes the action depends on the next token. This token
+%D can be passed to the macro \type{\getprettydata}, that sets
+%D \type{\prettytype} to the interpreter code. The character
+%D code is saved in \type{\prettychar}.
+
+\def\getprettydata#1%
+ {\bgroup
+ \global\chardef\prettytype=0
+ \global\chardef\prettychar=0
+ \def\handleprettytoken##1##2%
+ {\global\chardef\prettytype=##1\relax
+ \global\chardef\prettychar=##2\relax}%
+ \setbox0=\hbox{\global\chardef\prettychar=0#1}% expands #1 and ignores space
+ \egroup}
+
+%D If needed the current and next token can be handled alongside:
+
+\def\getpretties#1#2%
+ {\char#1\bgroup\let\handleprettytoken=\getsecondpretty#2\egroup}
+
+\def\getsecondpretty#1#2%
+ {\char#2}
+
+%D When needed, one can reassign an interpreter by using
+%D \type{\newpretty} and its associates.
+%D
+%D \bgroup
+%D \steltypenin[file][optie=tex,palet=colorpretty]
+%D
+%D \startbuffer
+%D \bgroup
+%D \catcode`\|=\@@escape %%\|\
+%D \catcode`\\=\@@active %%\\+
+%D |gdef|dohandlenewpretty#1%
+%D {|def|dodohandlenewpretty##1%
+%D {|getprettydata{#1}%
+%D |let|oldprettychar=|prettychar
+%D |getprettydata{##1}%
+%D |ifnum|oldprettychar=|prettychar
+%D |def|dododohandlenewpretty####1%
+%D {|getprettydata{\}%
+%D |let|oldprettytype=|prettytype
+%D |getprettydata{####1}%
+%D |ifnum|prettytype=|oldprettytype
+%D |let|next=|newpretty
+%D |else
+%D |def|next{|newprettycommand{#1}##1####1}%
+%D |fi
+%D |next}%
+%D |let|next=|dododohandlenewpretty
+%D |else
+%D |def|next{|newprettycommand{#1}##1}%
+%D |fi
+%D |next}%
+%D |def|donohandlenewpretty##1%
+%D {|newprettycommand{#1}##1}%
+%D |handlenextnextpretty|dodohandlenewpretty|donohandlenewpretty}
+%D |egroup
+%D \stopbuffer
+%D
+%D {\newprettytrue\typebuffer}
+%D
+%D In this example we see that the colors differ from what we
+%D expect, but conform the definitions in the macro. This kind
+%D of recoloring can be achieved by saying:
+%D
+%D \typebuffer
+%D
+%D We'll show some more examples:
+%D
+%D \startbuffer
+%D %%\R{Red
+%D %%\G\Green
+%D %%\B[Blue
+%D \stopbuffer
+%D
+%D {\newprettytrue\typebuffer}
+%D
+%D Watch the green \type{\Green}! This lines are specified as:
+%D
+%D \typebuffer
+%D
+%D When needed, one can use grouping.
+%D
+%D \startbuffer
+%D {yes} %%\ B %%\{[ %%\}]
+%D {no}
+%D {no} %%\ E
+%D {yes}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This leads to:
+%D
+%D {\newprettytrue\typebuffer}
+%D
+%D I won't explain the details of this mechanism. Those who
+%D want to build their own pretty interpreters have to close
+%D read the source anyway.
+%D
+%D Last we show an example of mixed pretty typesetting:
+%D
+%D \startbuffer
+%D \ziezo{test} %%\ P ##\ B##\ T % enter PERL mode %%\ E
+%D if $test eq "test" ##\ B ##\ B##\ T % begin group (\bgroup) %%\ E
+%D if $test eq "test"; ##\ T %%\ B%%\ T % enter TEX mode %%\ E
+%D \ziezo{test} %%\ M %%\ B%%\ T % enter METAPOST mode %%\ E
+%D draw (0,0)--(10,10); %%\ E ##\ B##\ T % end group (\egroup) %%\ E
+%D if $test eq "test";
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Here we use \type{%%\ T}, \type{%%\ P} and \type{%%\ M} for
+%D switching between \TEX, \PERL\ and \METAPOST\ mode.
+%D
+%D {\newprettytrue\typebuffer}
+%D
+%D \egroup
+%D
+%D Don't forget to set:
+
+\newif\ifnewpretty
+
+\def\installnewpretty%
+ {\def\doinstallnewpretty##1%
+ {\setvalue{NP::\the\scratchcounter}{##1}}%
+ \afterassignment\doinstallnewpretty\scratchcounter=`}
+
+%D Let's define the options we used here:
+
+\let\prettyend =\relax
+\def\prettybegin{\bgroup\let\prettyend=\egroup}
+
+\installnewpretty B \prettybegin
+\installnewpretty E \prettyend
+
+\installnewpretty J \setupprettyJVtype
+\installnewpretty M \setupprettyMPtype
+\installnewpretty P \setupprettyPLtype
+\installnewpretty T \setupprettyTEXtype
+
+%D This means that when the interpreter modules support this
+%D mechanism, by default we have four options at available.
+
+\def\newpretty#1%
+ {\getprettydata{#1}%
+ \ifnum\prettytype=0
+ \expandafter\nonewpretty
+ \else
+ \expandafter\donewpretty
+ \fi
+ #1}
+
+\def\nonewpretty#1#2%
+ {\getprettydata{#2}%
+ \getvalue{NP::\the\prettychar}}
+
+\def\donewpretty#1%
+ {\bgroup
+ \def\handleprettytoken##1##2##3%
+ {\getprettydata{##3}%
+ \egroup
+ \ifnum\prettytype>0
+ \setpretty##2=\prettytype\relax
+ \fi}%
+ #1}
+
+%D When implementing new pretty macros, one only needs to
+%D define something like:
+%D
+%D \starttypen
+%D \def\TEXtypezero%
+%D {\handlenewpretty\TEXtypethree}
+%D \stoptypen
+%D
+%D Here the number states the category (in our examples the
+%D backslash). The second argument takes care of normal
+%D situations.
+
+\def\handlenewpretty#1%
+ {\let\newprettycommand=#1%
+ \handlenextnextpretty\dohandlenewpretty\newprettycommand}
+
+%D The previous shown implementation only interprets single
+%D comments, but the final one also accepts double ones. The
+%D main reason for this is that in \JAVA\ we have to deal with
+%D \type{//}. Personally I prefer the double \type{%%} because
+%D is stands out and is more symmetrical with the double
+%D slash.
+
+\bgroup
+\catcode`\|=\@@escape
+\catcode`\\=\@@active
+|gdef|dohandlenewpretty#1%
+ {|def|dodohandlenewpretty##1%
+ {|getprettydata{#1}%
+ |let|oldprettychar=|prettychar
+ |getprettydata{##1}%
+ |ifnum|oldprettychar=|prettychar
+ |def|dododohandlenewpretty####1%
+ {|getprettydata{\}%
+ |let|oldprettytype=|prettytype
+ |getprettydata{####1}%
+ |ifnum|prettytype=|oldprettytype
+ |let|next=|newpretty
+ |else
+ |def|next{|newprettycommand{#1}##1####1}%
+ |fi
+ |next}%
+ |let|next=|dododohandlenewpretty
+ |else
+ |def|next{|newprettycommand{#1}##1}%
+ |fi
+ |next}%
+ |def|donohandlenewpretty##1%
+ {|newprettycommand{#1}##1}%
+ |handlenextnextpretty|dodohandlenewpretty|donohandlenewpretty}
+|egroup
+
+%D The `nextnext' macro we used in the previous definition
+%D looks ahead. This is needed because individual lines are
+%D handles by macro's and the next character can be something
+%D that ends the line and/or does not belong to the verbatim
+%D data.
+
+\def\handlenextnextpretty#1#2#3%
+ {\def\dohandlenextnextpretty%
+ {\ifx\next\bgroup % something {}
+ \let\next=#2%
+ \else\ifx\next\relax % end of line / signal
+ \let\next=#2%
+ %\else\ifx\next\egroup % end of line / no signal
+ % \let\next=#2%
+ %\else\ifx\next\par % end of line / \par
+ \let\next=#2%
+ \else
+ \let\next=#1%
+ \fi\fi%\fi\fi
+ \next{#3}}%
+ \futurelet\next\dohandlenextnextpretty}
+
+%D The pretty interpreters can (and will) change the meaning of
+%D some controls. To enable them calling the originals we save
+%D their meanings and to enable nesting we permit this only
+%D once.
+
+\def\saveprettycontrols%
+ {\global\let\oldobeyedspace = \obeyedspace
+ \global\let\oldobeyedline = \obeyedline
+ \global\let\oldobeyedpage = \obeyedpage
+ \let\saveprettycontrols = \relax}
+
+%D The \PERL\ and \METAPOST\ interpreters will also handle
+%D reserved words. Sets of identifiers are defined like:
+%D
+%D \starttypen
+%D \useprettyidentifiers \MODULAidentifiers \MODULAsetspecials
+%D if then else elsif case while do repeat until ...
+%D \stoptypen
+%D
+%D New entries can be added to existing sets by repeatedly
+%D using this command.
+
+\def\useprettyidentifiers#1#2% \variable \presetcatcodes
+ {\bgroup
+ \ifx#1\undefined
+ \global\let#1=\empty
+ \fi
+ \def\handleprettytoken##1##2{\char##2}%
+ #2\relax
+ \def\douseprettyidentifiers##1\par%
+ {\xdef#1{\space#1\space ##1}%
+ \egroup}%
+ \douseprettyidentifiers}
+
+%D We can test om identifiers with:
+
+\def\doifprettyidentifierelse#1%
+ {\doifincsnameelse{\space#1\space}}
+
+%D \macros
+%D {prettyidentifierfont,prettyvariablefont}
+%D
+%D When one want to typeset identifiers and system variables
+%D in a different typeface, one has to set the next two
+%D variables.
+
+\let\prettyidentifierfont=\relax
+\let\prettyvariablefont =\relax
+
+%D The interpreter macros are loaded at run time. The main
+%D reason lays in the fact that we don't want to have the
+%D identifier lists hard coded in the format file. To prevent
+%D repetitive loading, one should load the modules before the
+%D first call to the macros.
+%D
+%D \starttypen
+%D \input verb-tex.tex
+%D \input verb-pl.tex
+%D \input verb-mp.tex
+%D \input verb-jv.tex
+%D \stoptypen
+%D
+%D In \CONTEXT\ we follow a different thread, and therefore all
+%D macros in the additional modules use \type{\gdef}'s and
+%D \type{\doglobal}'s. Manipulating \type{\globaldef} is
+%D possible but leads to fuzzy situations.
+
+%D The rest of this module is dedicated to non \CONTEXT\ users
+%D and shows an example of an verbatim environment based on the
+%D previous macros.
+%D
+%D The macro's can be used to construct the commands we
+%D mentioned in the beginning of this documentation. We leave
+%D this to the fantasy of the reader and only show some \PLAIN\
+%D \TEX\ alternatives for display verbatim and listings. We
+%D define three commands for typesetting inline text, display
+%D text and files verbatim. The inline alternative also accepts
+%D user supplied delimiters.
+%D
+%D \starttypen
+%D \type{text}
+%D
+%D \starttyping
+%D ... verbatim text ...
+%D \stoptyping
+%D
+%D \typefile{filename}
+%D \stoptypen
+%D
+%D We can turn on the options by:
+%D
+%D \starttypen
+%D \controlspacetrue
+%D \verbatimtabstrue
+%D \prettyverbatimtrue
+%D \stoptypen
+%D
+%D Here is the implementation:
+
+\newif\ifcontrolspace
+\newif\ifverbatimtabs
+\newif\ifprettyverbatim
+
+\ifCONTEXT \else
+
+ \def\presettyping%
+ {\ifcontrolspace
+ \let\obeyspace=\setcontrolspace
+ \fi
+ \ifverbatimtabs
+ \let\obeytabs=\settabskips
+ \fi
+ \ifprettyverbatim
+ \let\obeycharacters=\setupprettytype
+ \fi}
+
+ \def\type%
+ {\bgroup
+ \presettyping
+ \processinlineverbatim{\egroup}}
+
+ \def\starttyping%
+ {\bgroup
+ \presettyping
+ \processdisplayverbatim{\stoptyping}}
+
+ \def\stoptyping%
+ {\egroup}
+
+ \def\typefile#1%
+ {\bgroup
+ \presettyping
+ \processfileverbatim{#1}%
+ \egroup}
+
+\fi
+
+%D In \CONTEXT\ users say things like:
+%D
+%D \starttypen
+%D \definetyping [TEX] [option=TEX]
+%D \definetyping [MP] [option=MP]
+%D \definetyping [PL] [option=PL]
+%D \definetyping [JV] [option=JV]
+%D \stoptypen
+%D
+%D or
+%D
+%D \starttypen
+%D \setuptyping[file][option=color]
+%D \stoptypen
+%D
+%D That way \CONTEXT\ selects the appropriate interpreter
+%D itself, but more on that in another module. In other
+%D packages one can define:
+
+\ifCONTEXT \else
+
+ \input verb-tex
+ \input verb-mp
+ \input verb-pl
+ \input verb-jv
+
+ \def\startTEX%
+ {\bgroup \everypar{}%
+ \let\obeycharacters=\setupprettyTEXtype
+ \processdisplayverbatim{\stopTEX}}
+
+ \def\startMP%
+ {\bgroup \everypar{}%
+ \let\obeycharacters=\setupprettyMPtype
+ \processdisplayverbatim{\stopMP}}
+
+ \def\startPL%
+ {\bgroup \everypar{}%
+ \let\obeycharacters=\setupprettyPLtype
+ \processdisplayverbatim{\stopPL}}
+
+ \def\startJV%
+ {\bgroup \everypar{}%
+ \let\obeycharacters=\setupprettyJVtype
+ \processdisplayverbatim{\stopJV}}
+
+ \let\stopTEX=\egroup
+ \let\stopMP =\egroup
+ \let\stopPL =\egroup
+ \let\stopJV =\egroup
+
+\fi
+
+%D This following poor mans implementation of color is based on
+%D PostScript. One can of course use grayscales too. In the
+%D core modules these macros are redefined to using the color
+%D mechanism present in \CONTEXT.
+
+\ifCONTEXT \else
+
+ \def\setcolorverbatim%
+ {\def\prettyone {.9 .0 .0 } % red
+ \def\prettytwo {.0 .8 .0 } % green
+ \def\prettythree {.0 .0 .9 } % blue
+ \def\prettyfour {.8 .8 .6 } % yellow
+ \def\beginofpretty[##1]%
+ {\special{ps:: \csname##1\endcsname setrgbcolor}}
+ \def\endofpretty%
+ {\special{ps:: 0 0 0 setrgbcolor}}} % black
+
+ \def\setgrayverbatim%
+ {\def\prettyone {.30 } % gray
+ \def\prettytwo {.45 } % gray
+ \def\prettythree {.60 } % gray
+ \def\prettyfour {.75 } % gray
+ \def\beginofpretty[##1]%
+ {\special{ps:: \csname##1\endcsname setgray}}
+ \def\endofpretty%
+ {\special{ps:: 0 setgray}}} % black
+
+\fi
+
+%D One can redefine these two commands after loading this
+%D module. When available, one can also use appropriate
+%D font||switch macro's. We default to color.
+
+\ifCONTEXT \else \setcolorverbatim \fi
+
+%D Here come the commands that are responsible for entering and
+%D leaving the two states. As we can see, they've got much in
+%D common.
+
+%D The previous version of this module was published in the
+%D \MAPS\ of the dutch \TEX\ users group \NTG. In that article,
+%D the verbatim part of the text was typeset with the following
+%D commands for the examples:
+%D
+%D \starttypen
+%D \def\starttypen% We simplify the \ConTeXt\ macro.
+%D {\bgroup
+%D \everypar{} % We disable some troublesome mechanisms.
+%D \advance\leftskip by 1em
+%D \processdisplayverbatim{\stoptypen}}
+%D
+%D \let\stoptypen=\egroup
+%D \stoptypen
+%D
+%D We also used:
+%D
+%D \starttypen
+%D \def\startdefinition%
+%D {\bgroup
+%D \everypar{} % Again we disable some troublesome mechanisms.
+%D \let\obeycharacters=\setupprettyTEXtype % See verb-tex.tex!
+%D \EveryPar{\showparagraphcounter}%
+%D \EveryLine{\showlinecounter}%
+%D \verbatimbodyfont
+%D \processdisplayverbatim{\stopdefinition}}
+%D
+%D \def\stopdefinition%
+%D {\egroup}
+%D \stoptypen
+%D
+%D And because we have both \type{\EveryPar} and
+%D \type{\EveryLine} available, we can implement a dual
+%D numbering mechanism:
+%D
+%D \starttypen
+%D \newcount\paragraphcounter
+%D \newcount\linecounter
+%D
+%D \def\showparagraphcounter%
+%D {\llap
+%D {\bgroup
+%D \counterfont
+%D \hbox to 4em
+%D {\global\advance\paragraphcounter by 1
+%D \hss \the\paragraphcounter \hskip2em}%
+%D \egroup
+%D \hskip1em}}
+%D
+%D \def\showlinecounter%
+%D {\llap
+%D {\bgroup
+%D \counterfont
+%D \hbox to 2em
+%D {\global\advance\linecounter by 1
+%D \hss \the\linecounter}%
+%D \egroup
+%D \hskip1em}}
+%D \stoptypen
+%D
+%D One may have noticed that the \type{\EveryPar} is only
+%D executed once, because we consider each piece of verbatim
+%D as one paragraph. When one wants to take the empty lines
+%D into account, the following assignments are appropriate:
+%D
+%D \starttypen
+%D \EveryLine
+%D {\iflinepar
+%D \showparagraphcounter
+%D \fi
+%D \showlinecounter}
+%D \stoptypen
+%D
+%D In this case, nothing has to be assigned to \type{\EveryPar},
+%D maybe except of just another extra numbering scheme. The
+%D macros used to typeset this documentation are a bit more
+%D complicated, because we have to take take 'long' margin
+%D lists into account. When such a list exceeds the previous
+%D pargraph we postpone placement of the paragraph number till
+%D there's room. This way so it does not clash with the margin
+%D words.
+
+%D Normally such commands have to be embedded in a decent setup
+%D structure, where options can be set at will.
+%D
+%D Now let's summarize the most important commands.
+%D
+%D \starttypen
+%D \processinlineverbatim{\closingcommand}
+%D \processdisplayverbatim{\closingcommand}
+%D \processfileverbatim{filename}
+%D \stoptypen
+%D
+%D We can satisfy our own specific needs with the following
+%D interfacing macro's:
+%D
+%D \starttypen
+%D \obeyspaces \obeytabs \obeylines \obeypages \obeycharacters
+%D \stoptypen
+%D
+%D We can influence the verbatim environment with the following
+%D macro:
+%D
+%D \starttypen
+%D \obeyemptylines
+%D \stoptypen
+%D
+%D Some needs are fulfilled already with:
+%D
+%D \starttypen
+%D \setcontrolspace \settabskips
+%D \stoptypen
+%D
+%D lines can be enhanced with ornaments using:
+%D
+%D \starttypen
+%D \everypar \everyline \iflinepar
+%D \stoptypen
+%D
+%D and pretty verbatim support is implemented by:
+%D
+%D \starttypen
+%D \beginofpretty[#1] ... \endofpretty
+%D \stoptypen
+%D
+%D and some setup macro, like:
+%D
+%D \starttypen
+%D \setupprettyIDENTIFIERtype
+%D \stoptypen
+%D
+%D The color support macro can be redefined by the user. The
+%D parameter \type{#1} can be one of the four 'fixed'
+%D identifiers {\em prettyone}, {\em prettytwo}, {\em
+%D prettythree} and {\em prettyfour}. We have implemented a
+%D more or less general PostScript color support mechanism,
+%D using \type{specials}. One can toggle between color and
+%D grayscale with:
+%D
+%D \starttypen
+%D \setgrayverbatim \setcolorverbatim
+%D \stoptypen
+
+%D \macros
+%D {permitshiftedendofverbatim}
+%D {}
+%D
+%D We did not mention one drawback of the mechanism described
+%D here. The closing command must start at the first position
+%D of the line. In \CONTEXT\ we will not have this drawback,
+%D because we can test if the end command is a substring of the
+%D current line. The testing is done by two of the support
+%D macros, which of course are not available in a stand alone
+%D application of this module.
+
+\ifCONTEXT
+
+ \let\doifendofverbatim=\doifelse
+
+ \def\permitshiftedendofverbatim%
+ {\let\doifendofverbatim=\doifinstringelse}
+
+ \def\processdisplayverbatim#1%
+ {\par
+ \bgroup
+ \escapechar=-1
+ \xdef\verbatimname{\string#1}%
+ \egroup
+ \def\endofdisplayverbatim{\csname\verbatimname\endcsname}%
+ \bgroup
+ \parindent\!!zeropoint
+ \ifdim\lastskip<\parskip
+ \removelastskip
+ \vskip\parskip
+ \fi
+ \parskip\!!zeropoint
+ \processingverbatimtrue
+ \expandafter\let\csname\verbatimname\endcsname=\relax
+ \expandafter\convertargument\csname\verbatimname\endcsname
+ \to\endofverbatimcommand
+ \verbatimfont
+ \setupcopyverbatim
+ \initializeverbatimline
+ \copyverbatimline}
+
+ {\obeylines%
+ \long\gdef\copyverbatimline#1
+ {\convertargument#1 \to\next%
+ \gdef\verbatimline{#1}%
+ \ifx\next\emptyspace%
+ \presetemptyverbatimline%
+ \else%
+ \doifendofverbatim{\endofverbatimcommand}{\next}%
+ {\presetlastverbatimline%
+ \def\copyverbatimline{\egroup\endofdisplayverbatim}}%
+ {\presetnormalverbatimline}%
+ \fi%
+ \handleverbatimline%
+ \copyverbatimline}}
+
+\fi
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/verb-mp.tex b/tex/context/base/verb-mp.tex index 520301915..dd9feb222 100644 --- a/tex/context/base/verb-mp.tex +++ b/tex/context/base/verb-mp.tex @@ -1,386 +1,386 @@ -%D \module -%D [ file=verb-mp, -%D version=1997.12.22, -%D title=\CONTEXT\ Verbatim Macros, -%D subtitle=Pretty \METAPOST\ Verbatim, -%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 Support Macros / Pretty METAPOST Verbatim} - -%D This module was first used when I documented our new -%D company logo. This interpreter is modeled after the \PERL\ -%D one. -%D -%D \startMP -%D beginfig(1); -%D z1 = (0,0); -%D z2 = (100,0); -%D z3 = (0,100); -%D draw z1--z2--z3--cycle; -%D endfig; -%D \stopMP -%D -%D Of course we cannot (yet) provide a nice layout, so some -%D formatting is still needed. - -\unprotect - -%D \macros -%D {prettyMPvariables} -%D -%D Identifiers and system variables are typeset in a different -%D style. One can turn of this mechanism for the variables by -%D setting th enext boolean. -%D - -\doglobal\newif\ifprettyMPvariables - -\global\prettyMPvariablestrue - -%D We support \METAFONT\ as well as \METAPOST. - -\gdef\MPsetcontrols% - {\saveprettycontrols - \def\obeyedspace% - {\endMPtypesix - \oldobeyedspace}% - \def\obeyedline% - {\endMPtypesix - \global\inMPcommentfalse - \oldobeyedline}% - \def\obeyedpage% - {\endMPtypesix - \global\inMPcommentfalse - \oldobeyedpage}% - \let\obeytabs=\ignoretabs} - -\gdef\setupprettyMPtype% - {\def\prettyidentifier{MP}% - \MPsetvariables - \MPsetcontrols - \MPsethandlers - \MPsetspecials} - -\doglobal\newif\ifinMPcomment -\doglobal\newif\ifinMPtexmode - -\gdef\MPsetvariables% - {\global\inMPcommentfalse - \global\inMPtexmodefalse - \global\let\MPsequence=\empty} - -\gdef\MPsetspecials% - {\setpretty`\;=11 \setpretty`\$=12 \setpretty`\@=12 \setpretty`\#=12 - \setpretty`\%=20 - \setpretty`\[=31 \setpretty`\]=31 \setpretty`\(=32 \setpretty`\)=32 - \setpretty`\:=33 \setpretty`\==34 \setpretty`\<=34 \setpretty`\>=34 - \setpretty`\-=41 \setpretty`\+=41 \setpretty`\/=41 \setpretty`\*=41 - \setpretty`\|=41 \setpretty`\`=41 \setpretty`\!=41 \setpretty`\?=41 - \setpretty`\^=41 \setpretty`\&=42 - \setpretty`\\=50 - \setpretty`\1=61 \setpretty`\2=61 \setpretty`\3=61 \setpretty`\4=61 - \setpretty`\5=61 \setpretty`\6=61 \setpretty`\7=61 \setpretty`\8=61 - \setpretty`\9=61 \setpretty`\0=61 - \setpretty`\A=62 \setpretty`\B=62 \setpretty`\C=62 \setpretty`\D=62 \setpretty`\E=62 - \setpretty`\F=62 \setpretty`\G=62 \setpretty`\H=62 \setpretty`\I=62 \setpretty`\J=62 - \setpretty`\K=62 \setpretty`\L=62 \setpretty`\M=62 \setpretty`\N=62 \setpretty`\O=62 - \setpretty`\P=62 \setpretty`\Q=62 \setpretty`\R=62 \setpretty`\S=62 \setpretty`\T=62 - \setpretty`\U=62 \setpretty`\V=62 \setpretty`\W=62 \setpretty`\X=62 \setpretty`\Y=62 - \setpretty`\Z=62 - \setpretty`\a=62 \setpretty`\b=62 \setpretty`\c=62 \setpretty`\d=62 \setpretty`\e=62 - \setpretty`\f=62 \setpretty`\g=62 \setpretty`\h=62 \setpretty`\i=62 \setpretty`\j=62 - \setpretty`\k=62 \setpretty`\l=62 \setpretty`\m=62 \setpretty`\n=62 \setpretty`\o=62 - \setpretty`\p=62 \setpretty`\q=62 \setpretty`\r=62 \setpretty`\s=62 \setpretty`\t=62 - \setpretty`\u=62 \setpretty`\v=62 \setpretty`\w=62 \setpretty`\x=62 \setpretty`\y=62 - \setpretty`\z=62 - \setpretty`\_=62 - \setpretty`\,=70 \setpretty`\.=70 - \setpretty`\'=81 \setpretty`\"=82 - \setpretty`\{=90 \setpretty`\}=90 } - -\gdef\MPsethandlers% - {\installprettyhandler 11 \MPtypeone - \installprettyhandler 12 \MPtypeone - \installprettyhandler 20 \MPtypetwo - \installprettyhandler 31 \MPtypethreeA - \installprettyhandler 32 \MPtypethreeA - \installprettyhandler 33 \MPtypethreeB - \installprettyhandler 34 \MPtypethreeB - \installprettyhandler 41 \MPtypefour - \installprettyhandler 42 \MPtypefour - \installprettyhandler 50 \MPtypefive - \installprettyhandler 61 \MPtypesixone - \installprettyhandler 62 \MPtypesixtwo - \installprettyhandler 70 \MPtypeseven - \installprettyhandler 81 \MPtypeeightone - \installprettyhandler 82 \MPtypeeighttwo - \installprettyhandler 90 \MPtypenine } - -\gdef\MPtypeone#1% - {\endMPtypesix - \ifinMPcomment - \getpretty{#1}% - \else\ifinMPtexmode - \getpretty{#1}% - \else - \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty% - \fi\fi} - -\gdef\doMPtypetwo#1% - {\ifinMPcomment - \getpretty{#1}% - \else - \global\inMPcommenttrue - \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty - \fi} - -\gdef\MPtypetwo% - {\endMPtypesix - \ifnewpretty\expandafter\handlenewpretty\fi\doMPtypetwo} - -\gdef\MPtypethreeA#1% - {\endMPtypesix - \ifinMPcomment - \getpretty{#1}% - \else\ifinMPtexmode - \getpretty{#1}% - \else - \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty - \fi\fi} - -\gdef\MPtypethreeB#1% - {\endMPtypesix - \ifinMPcomment - \getpretty{#1}% - \else\ifinMPtexmode - \getpretty{#1}% - \else - \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty - \fi\fi} - -\gdef\MPtypefour#1% - {\endMPtypesix - \ifinMPcomment - \getpretty{#1}% - \else\ifinMPtexmode - \getpretty{#1}% - \else - \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty - \fi\fi} - -\gdef\MPtypefive#1% - {\endMPtypesix - \ifinMPcomment - \getpretty{#1}% - \else\ifinMPtexmode - \getpretty{#1}% - \else - \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty - \fi\fi} - -\gdef\endMPtypesix% - {\ifx\MPsequence\empty\else - \doifprettyidentifierelse{\MPsequence}{\MPidentifiers} - {\doifprettyidentifierelse{\MPsequence}{\MPbtex} - {\beginofpretty[\!!prettytwo]% - {\prettyidentifierfont\MPsequence}% - \endofpretty - \global\inMPtexmodetrue} - {\ifinMPtexmode - \doifprettyidentifierelse{\MPsequence}{\MPetex} - {\global\inMPtexmodefalse}{}% - \fi - \beginofpretty[\!!prettytwo]% - {\prettyidentifierfont\MPsequence}% - \endofpretty}} - {\ifprettyMPvariables - \doifprettyidentifierelse{\MPsequence}{\MPvariables} - {\beginofpretty[\!!prettytwo]% - {\prettyvariablefont\MPsequence}% - \endofpretty} - {\MPsequence}% - \else - \MPsequence - \fi}% - \global\let\MPsequence=\empty - \fi} - -\gdef\MPtypesixone% - {\endMPtypesix - \getpretty} - -\gdef\MPtypesixtwo#1% - {\ifinMPcomment - \getpretty{#1}% - \else - \xdef\MPsequence{\MPsequence\getpretty{#1}}% - \fi} - -\gdef\MPtypeseven#1% - {\endMPtypesix - \ifinMPcomment - \getpretty{#1}% - \else\ifinMPtexmode - \getpretty{#1}% - \else - \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty - \fi\fi} - -\gdef\MPtypeeightone#1% - {\endMPtypesix - \ifinMPcomment - \getpretty{#1}% - \else\ifinMPtexmode% - \getpretty{#1}% - \else - \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty - \fi\fi} - -\gdef\MPtypeeighttwo#1% - {\endMPtypesix - \ifinMPcomment - \getpretty{#1}% - \else\ifinMPtexmode - \getpretty{#1}% - \else - \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty - \fi\fi} - -\gdef\MPtypenine#1% - {\endMPtypesix - \ifinMPcomment - \getpretty{#1}% - \else\ifinMPtexmode - \getpretty{#1}% - \else - \getpretty{#1}% - \fi\fi} - -%D \METAPOST\ \TEX||ies: - -\useprettyidentifiers \MPbtex \MPsetspecials - btex verbatimtex - -\useprettyidentifiers \MPetex \MPsetspecials - etex - -\useprettyidentifiers \MPidentifiers \MPsetspecials - btex etex verbatimtex - -%D \METAPOST\ internal variables \& predefined variables: - -\useprettyidentifiers \MPidentifiers \MPsetspecials - charcode day linecap linejoin miterlimit month pausing - prologues showstopping time tracingcapsules tracingchoices - tracingcommands tracingequations tracinglostchars - tracingmacros tracingonline tracingoutput tracingrestores - tracingspecs tracingstats tracingtitles truecorners - warningcheck year - -\useprettyidentifiers \MPvariables \MPsetspecials - ahangle ahlength bboxmargin defaultpen defaultscale - labeloffset background currentpen currentpicture cuttings - defaultfont extra_beginfig extra_endfig - -%D \METAPOST\ predefined constants: - -\useprettyidentifiers \MPidentifiers \MPsetspecials - false nullpicture pencircle true - -\useprettyidentifiers \MPvariables \MPsetspecials - beveled black blue bp butt cc cm dd ditto down epsilon - evenly fullcircle green halfcircle identity in infinity left - mitered mm origin pensquare pt quartercircle red right - rounded squared unitsquare up white withdots - -%D \METAPOST\ operators: - -\useprettyidentifiers \MPidentifiers \MPsetspecials - and angle arclength arctime ASCII bluepart boolean bot - char color cosd cycle decimal directiontime floor fontsize - greenpart hex infont intersectiontimes known length llcorner - lrcorner makepath makepen mexp mlog normaldeviate not - numeric oct odd or path pair pen penoffset picture point - postcontrol precontrol redpart reverse rotated scaled - shifted sind slanted sqrt str string subpath substring - transform transformed ulcorner uniformdeviate unknown - urcorner xpart xscaled xxpart xypart ypart yscaled yxpart - yypart zscaled - -\useprettyidentifiers \MPvariables \MPsetspecials - abs bbox ceiling center cutafter cutbefore dir - directionpoint div dotprod intersectionpoint inverse mod lft - round rt unitvector whatever - -%D \METAPOST\ commands: - -\useprettyidentifiers \MPidentifiers \MPsetspecials - addto clip input interim let newinternal save setbounds - shipout show showdependencies showtoken showvariable - special - -\useprettyidentifiers \MPvariables \MPsetspecials - cutdraw draw drawarrow drawdblarrow fill filldraw - loggingall pickup tracingall tracingnone undraw unfill - unfilldraw - -%D \METAPOST\ macro||like functions: - -\useprettyidentifiers \MPvariables \MPsetspecials - buildcycle dashpattern decr dotlabel dotlabels drawoptions - incr label labels max, min thelabel z - -%D More \METAPOST: - -\useprettyidentifiers \MPidentifiers \MPsetspecials - begingroup endgroup of curl tension and controls - reflectedabout rotatedaround interpath on off beginfig - endfig def vardef enddef epxr suffix text primary secondary - tertiary primarydef secondarydef tertiarydef top bottom - ulft urt llft lrt randomseed also contour doublepath - withcolor withpen dashed if else elseif fi for forsuffixes - forever downto upto step until - -%D \METAFONT\ stuff: - -\useprettyidentifiers \MPidentifiers \MPsetspecials - charlist extensible fontdimen headerbyte kern ligtable - boundarychar chardp charext charht charic charwd designsize - fontmaking charexists - -\useprettyidentifiers \MPvariables \MPsetspecials - beginchar blacker capsule_end change_width - define_blacker_pixels define_corrected_pixels - define_good_x_pixels define_good_y_pixels - define_horizontal_corrected_pixels define_pixels - define_whole_blacker_pixels define_whole_pixels - define_whole_vertical_blacker_pixels - define_whole_vertical_pixels endchar extra_beginchar - extra_endchar extra_setup font_coding_scheme - font_extra_space - -%D \METAFONT\ no||op stuff: - -\useprettyidentifiers \MPidentifiers \MPsetspecials - cullit currenttransform gfcorners grayfont hround - imagerules lowres_fix nodisplays notransforms openit - displaying currentwindow screen_rows screen_cols - pixels_per_inch cull display openwindow numspecial - totalweight autorounding fillin proofing tracingpens - xoffset chardx granularity smoothing turningcheck yoffset - chardy hppp tracingedges vppp - -%D \METAPOST\ goodies: - -\useprettyidentifiers \MPidentifiers \MPsetspecials - extra_beginfig extra_endfig mpxbreak - -\protect - -\endinput +%D \module
+%D [ file=verb-mp,
+%D version=1997.12.22,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \METAPOST\ Verbatim,
+%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 Support Macros / Pretty METAPOST Verbatim}
+
+%D This module was first used when I documented our new
+%D company logo. This interpreter is modeled after the \PERL\
+%D one.
+%D
+%D \startMP
+%D beginfig(1);
+%D z1 = (0,0);
+%D z2 = (100,0);
+%D z3 = (0,100);
+%D draw z1--z2--z3--cycle;
+%D endfig;
+%D \stopMP
+%D
+%D Of course we cannot (yet) provide a nice layout, so some
+%D formatting is still needed.
+
+\unprotect
+
+%D \macros
+%D {prettyMPvariables}
+%D
+%D Identifiers and system variables are typeset in a different
+%D style. One can turn of this mechanism for the variables by
+%D setting th enext boolean.
+%D
+
+\doglobal\newif\ifprettyMPvariables
+
+\global\prettyMPvariablestrue
+
+%D We support \METAFONT\ as well as \METAPOST.
+
+\gdef\MPsetcontrols%
+ {\saveprettycontrols
+ \def\obeyedspace%
+ {\endMPtypesix
+ \oldobeyedspace}%
+ \def\obeyedline%
+ {\endMPtypesix
+ \global\inMPcommentfalse
+ \oldobeyedline}%
+ \def\obeyedpage%
+ {\endMPtypesix
+ \global\inMPcommentfalse
+ \oldobeyedpage}%
+ \let\obeytabs=\ignoretabs}
+
+\gdef\setupprettyMPtype%
+ {\def\prettyidentifier{MP}%
+ \MPsetvariables
+ \MPsetcontrols
+ \MPsethandlers
+ \MPsetspecials}
+
+\doglobal\newif\ifinMPcomment
+\doglobal\newif\ifinMPtexmode
+
+\gdef\MPsetvariables%
+ {\global\inMPcommentfalse
+ \global\inMPtexmodefalse
+ \global\let\MPsequence=\empty}
+
+\gdef\MPsetspecials%
+ {\setpretty`\;=11 \setpretty`\$=12 \setpretty`\@=12 \setpretty`\#=12
+ \setpretty`\%=20
+ \setpretty`\[=31 \setpretty`\]=31 \setpretty`\(=32 \setpretty`\)=32
+ \setpretty`\:=33 \setpretty`\==34 \setpretty`\<=34 \setpretty`\>=34
+ \setpretty`\-=41 \setpretty`\+=41 \setpretty`\/=41 \setpretty`\*=41
+ \setpretty`\|=41 \setpretty`\`=41 \setpretty`\!=41 \setpretty`\?=41
+ \setpretty`\^=41 \setpretty`\&=42
+ \setpretty`\\=50
+ \setpretty`\1=61 \setpretty`\2=61 \setpretty`\3=61 \setpretty`\4=61
+ \setpretty`\5=61 \setpretty`\6=61 \setpretty`\7=61 \setpretty`\8=61
+ \setpretty`\9=61 \setpretty`\0=61
+ \setpretty`\A=62 \setpretty`\B=62 \setpretty`\C=62 \setpretty`\D=62 \setpretty`\E=62
+ \setpretty`\F=62 \setpretty`\G=62 \setpretty`\H=62 \setpretty`\I=62 \setpretty`\J=62
+ \setpretty`\K=62 \setpretty`\L=62 \setpretty`\M=62 \setpretty`\N=62 \setpretty`\O=62
+ \setpretty`\P=62 \setpretty`\Q=62 \setpretty`\R=62 \setpretty`\S=62 \setpretty`\T=62
+ \setpretty`\U=62 \setpretty`\V=62 \setpretty`\W=62 \setpretty`\X=62 \setpretty`\Y=62
+ \setpretty`\Z=62
+ \setpretty`\a=62 \setpretty`\b=62 \setpretty`\c=62 \setpretty`\d=62 \setpretty`\e=62
+ \setpretty`\f=62 \setpretty`\g=62 \setpretty`\h=62 \setpretty`\i=62 \setpretty`\j=62
+ \setpretty`\k=62 \setpretty`\l=62 \setpretty`\m=62 \setpretty`\n=62 \setpretty`\o=62
+ \setpretty`\p=62 \setpretty`\q=62 \setpretty`\r=62 \setpretty`\s=62 \setpretty`\t=62
+ \setpretty`\u=62 \setpretty`\v=62 \setpretty`\w=62 \setpretty`\x=62 \setpretty`\y=62
+ \setpretty`\z=62
+ \setpretty`\_=62
+ \setpretty`\,=70 \setpretty`\.=70
+ \setpretty`\'=81 \setpretty`\"=82
+ \setpretty`\{=90 \setpretty`\}=90 }
+
+\gdef\MPsethandlers%
+ {\installprettyhandler 11 \MPtypeone
+ \installprettyhandler 12 \MPtypeone
+ \installprettyhandler 20 \MPtypetwo
+ \installprettyhandler 31 \MPtypethreeA
+ \installprettyhandler 32 \MPtypethreeA
+ \installprettyhandler 33 \MPtypethreeB
+ \installprettyhandler 34 \MPtypethreeB
+ \installprettyhandler 41 \MPtypefour
+ \installprettyhandler 42 \MPtypefour
+ \installprettyhandler 50 \MPtypefive
+ \installprettyhandler 61 \MPtypesixone
+ \installprettyhandler 62 \MPtypesixtwo
+ \installprettyhandler 70 \MPtypeseven
+ \installprettyhandler 81 \MPtypeeightone
+ \installprettyhandler 82 \MPtypeeighttwo
+ \installprettyhandler 90 \MPtypenine }
+
+\gdef\MPtypeone#1%
+ {\endMPtypesix
+ \ifinMPcomment
+ \getpretty{#1}%
+ \else\ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty%
+ \fi\fi}
+
+\gdef\doMPtypetwo#1%
+ {\ifinMPcomment
+ \getpretty{#1}%
+ \else
+ \global\inMPcommenttrue
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\MPtypetwo%
+ {\endMPtypesix
+ \ifnewpretty\expandafter\handlenewpretty\fi\doMPtypetwo}
+
+\gdef\MPtypethreeA#1%
+ {\endMPtypesix
+ \ifinMPcomment
+ \getpretty{#1}%
+ \else\ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi\fi}
+
+\gdef\MPtypethreeB#1%
+ {\endMPtypesix
+ \ifinMPcomment
+ \getpretty{#1}%
+ \else\ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi\fi}
+
+\gdef\MPtypefour#1%
+ {\endMPtypesix
+ \ifinMPcomment
+ \getpretty{#1}%
+ \else\ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi\fi}
+
+\gdef\MPtypefive#1%
+ {\endMPtypesix
+ \ifinMPcomment
+ \getpretty{#1}%
+ \else\ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \fi\fi}
+
+\gdef\endMPtypesix%
+ {\ifx\MPsequence\empty\else
+ \doifprettyidentifierelse{\MPsequence}{\MPidentifiers}
+ {\doifprettyidentifierelse{\MPsequence}{\MPbtex}
+ {\beginofpretty[\!!prettytwo]%
+ {\prettyidentifierfont\MPsequence}%
+ \endofpretty
+ \global\inMPtexmodetrue}
+ {\ifinMPtexmode
+ \doifprettyidentifierelse{\MPsequence}{\MPetex}
+ {\global\inMPtexmodefalse}{}%
+ \fi
+ \beginofpretty[\!!prettytwo]%
+ {\prettyidentifierfont\MPsequence}%
+ \endofpretty}}
+ {\ifprettyMPvariables
+ \doifprettyidentifierelse{\MPsequence}{\MPvariables}
+ {\beginofpretty[\!!prettytwo]%
+ {\prettyvariablefont\MPsequence}%
+ \endofpretty}
+ {\MPsequence}%
+ \else
+ \MPsequence
+ \fi}%
+ \global\let\MPsequence=\empty
+ \fi}
+
+\gdef\MPtypesixone%
+ {\endMPtypesix
+ \getpretty}
+
+\gdef\MPtypesixtwo#1%
+ {\ifinMPcomment
+ \getpretty{#1}%
+ \else
+ \xdef\MPsequence{\MPsequence\getpretty{#1}}%
+ \fi}
+
+\gdef\MPtypeseven#1%
+ {\endMPtypesix
+ \ifinMPcomment
+ \getpretty{#1}%
+ \else\ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi\fi}
+
+\gdef\MPtypeeightone#1%
+ {\endMPtypesix
+ \ifinMPcomment
+ \getpretty{#1}%
+ \else\ifinMPtexmode%
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi\fi}
+
+\gdef\MPtypeeighttwo#1%
+ {\endMPtypesix
+ \ifinMPcomment
+ \getpretty{#1}%
+ \else\ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi\fi}
+
+\gdef\MPtypenine#1%
+ {\endMPtypesix
+ \ifinMPcomment
+ \getpretty{#1}%
+ \else\ifinMPtexmode
+ \getpretty{#1}%
+ \else
+ \getpretty{#1}%
+ \fi\fi}
+
+%D \METAPOST\ \TEX||ies:
+
+\useprettyidentifiers \MPbtex \MPsetspecials
+ btex verbatimtex
+
+\useprettyidentifiers \MPetex \MPsetspecials
+ etex
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ btex etex verbatimtex
+
+%D \METAPOST\ internal variables \& predefined variables:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ charcode day linecap linejoin miterlimit month pausing
+ prologues showstopping time tracingcapsules tracingchoices
+ tracingcommands tracingequations tracinglostchars
+ tracingmacros tracingonline tracingoutput tracingrestores
+ tracingspecs tracingstats tracingtitles truecorners
+ warningcheck year
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ ahangle ahlength bboxmargin defaultpen defaultscale
+ labeloffset background currentpen currentpicture cuttings
+ defaultfont extra_beginfig extra_endfig
+
+%D \METAPOST\ predefined constants:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ false nullpicture pencircle true
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ beveled black blue bp butt cc cm dd ditto down epsilon
+ evenly fullcircle green halfcircle identity in infinity left
+ mitered mm origin pensquare pt quartercircle red right
+ rounded squared unitsquare up white withdots
+
+%D \METAPOST\ operators:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ and angle arclength arctime ASCII bluepart boolean bot
+ char color cosd cycle decimal directiontime floor fontsize
+ greenpart hex infont intersectiontimes known length llcorner
+ lrcorner makepath makepen mexp mlog normaldeviate not
+ numeric oct odd or path pair pen penoffset picture point
+ postcontrol precontrol redpart reverse rotated scaled
+ shifted sind slanted sqrt str string subpath substring
+ transform transformed ulcorner uniformdeviate unknown
+ urcorner xpart xscaled xxpart xypart ypart yscaled yxpart
+ yypart zscaled
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ abs bbox ceiling center cutafter cutbefore dir
+ directionpoint div dotprod intersectionpoint inverse mod lft
+ round rt unitvector whatever
+
+%D \METAPOST\ commands:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ addto clip input interim let newinternal save setbounds
+ shipout show showdependencies showtoken showvariable
+ special
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ cutdraw draw drawarrow drawdblarrow fill filldraw
+ loggingall pickup tracingall tracingnone undraw unfill
+ unfilldraw
+
+%D \METAPOST\ macro||like functions:
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ buildcycle dashpattern decr dotlabel dotlabels drawoptions
+ incr label labels max, min thelabel z
+
+%D More \METAPOST:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ begingroup endgroup of curl tension and controls
+ reflectedabout rotatedaround interpath on off beginfig
+ endfig def vardef enddef epxr suffix text primary secondary
+ tertiary primarydef secondarydef tertiarydef top bottom
+ ulft urt llft lrt randomseed also contour doublepath
+ withcolor withpen dashed if else elseif fi for forsuffixes
+ forever downto upto step until
+
+%D \METAFONT\ stuff:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ charlist extensible fontdimen headerbyte kern ligtable
+ boundarychar chardp charext charht charic charwd designsize
+ fontmaking charexists
+
+\useprettyidentifiers \MPvariables \MPsetspecials
+ beginchar blacker capsule_end change_width
+ define_blacker_pixels define_corrected_pixels
+ define_good_x_pixels define_good_y_pixels
+ define_horizontal_corrected_pixels define_pixels
+ define_whole_blacker_pixels define_whole_pixels
+ define_whole_vertical_blacker_pixels
+ define_whole_vertical_pixels endchar extra_beginchar
+ extra_endchar extra_setup font_coding_scheme
+ font_extra_space
+
+%D \METAFONT\ no||op stuff:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ cullit currenttransform gfcorners grayfont hround
+ imagerules lowres_fix nodisplays notransforms openit
+ displaying currentwindow screen_rows screen_cols
+ pixels_per_inch cull display openwindow numspecial
+ totalweight autorounding fillin proofing tracingpens
+ xoffset chardx granularity smoothing turningcheck yoffset
+ chardy hppp tracingedges vppp
+
+%D \METAPOST\ goodies:
+
+\useprettyidentifiers \MPidentifiers \MPsetspecials
+ extra_beginfig extra_endfig mpxbreak
+
+\protect
+
+\endinput
diff --git a/tex/context/base/verb-pl.tex b/tex/context/base/verb-pl.tex index 3b13446db..54bfccb04 100644 --- a/tex/context/base/verb-pl.tex +++ b/tex/context/base/verb-pl.tex @@ -1,452 +1,453 @@ -%D \module -%D [ file=verb-pl, -%D version=1997.12.22, -%D title=\CONTEXT\ Verbatim Macros, -%D subtitle=Pretty \PERL\ Verbatim, -%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 Support Macros / Pretty PERL Verbatim} - -%D When I rewrote \TEXUTIL\ in \PERL\ I decided to write a -%D pretty \PERL\ interpreter too. In fact, this was the main -%D reason for rewriting the pretty verbatim mechanisms to -%D handle more that \TEX. -%D -%D \startPL -%D $alfa = $beta{gamma}; -%D if ($alfa="delta") -%D { print "epsilon" } -%D \stopPL -%D -%D When looking at the macros, watch the \type{\doglobal}'s! -%D They're something \CONTEXT\ specific. - -\unprotect - -%D \macros -%D {prettyPLvariables} -%D -%D Identifiers and system variables get a special treatment. -%D One can disable this option for the variables by resetting -%D the next switch. - -\doglobal\newif\ifprettyPLvariables - -\global\prettyPLvariablestrue - -%D As said before, the global assignment is needed in -%D \CONTEXT\ (for once||only loading on demand). - -\doglobal\newif\ifinPLsingle -\doglobal\newif\ifinPLdouble -\doglobal\newif\ifinPLcomment -\doglobal\newif\ifPLverbose - -\newcount\PLverboseskipped - -\gdef\PLverbosecorrection% - {\ifnum\PLverboseskipped>0 - \loop - \obeyedspace - \advance\PLverboseskipped by -1 - \ifnum\PLverboseskipped>0 - \repeat - \fi} - -\gdef\PLsetcontrols% - {\saveprettycontrols - \def\obeyedspace% - {\endPLtypesix - \ifPLverbose - \advance\PLverboseskipped by 1 - \else - \oldobeyedspace - \fi}% - \def\obeyedline% - {\endPLtypesix - \global\inPLcommentfalse - \PLverbosefalse - \PLverboseskipped=0 - \oldobeyedline}% - \def\obeyedpage% - {\endPLtypesix - \global\inPLcommentfalse - \oldobeyedpage}% - \let\obeytabs=\ignoretabs} - -\gdef\setupprettyPLtype% - {\def\prettyidentifier{PL}% - \PLsetvariables - \PLsetcontrols - \PLsethandlers - \PLsetspecials - \PLsetdiagnostics} - -\gdef\PLsetvariables% - {\global\inPLsinglefalse - \global\inPLdoublefalse - \global\inPLcommentfalse - \global\let\PLsequence=\empty - \global\let\PLprefix=\empty} - -\gdef\PLsetspecials% - {\setpretty`\{=10 \setpretty`\}=10 - \setpretty`\$=21 \setpretty`\@=21 \setpretty`\%=22 - \setpretty`\[=31 \setpretty`\]=31 \setpretty`\(=32 \setpretty`\)=32 - \setpretty`\==32 \setpretty`\~=32 \setpretty`\<=32 \setpretty`\>=32 - \setpretty`\-=41 \setpretty`\+=41 \setpretty`\/=41 \setpretty`\*=41 - \setpretty`\|=41 \setpretty`\`=41 \setpretty`\!=41 \setpretty`\?=41 - \setpretty`\^=41 \setpretty`\&=42 - \setpretty`\\=50 - \setpretty`\1=61 \setpretty`\2=61 \setpretty`\3=61 \setpretty`\4=61 - \setpretty`\5=61 \setpretty`\6=61 \setpretty`\7=61 \setpretty`\8=61 - \setpretty`\9=61 \setpretty`\0=61 \setpretty`\_=61 - \setpretty`\A=62 \setpretty`\B=62 \setpretty`\C=62 \setpretty`\D=62 \setpretty`\E=62 - \setpretty`\F=62 \setpretty`\G=62 \setpretty`\H=62 \setpretty`\I=62 \setpretty`\J=62 - \setpretty`\K=62 \setpretty`\L=62 \setpretty`\M=62 \setpretty`\N=62 \setpretty`\O=62 - \setpretty`\P=62 \setpretty`\Q=62 \setpretty`\R=62 \setpretty`\S=62 \setpretty`\T=62 - \setpretty`\U=62 \setpretty`\V=62 \setpretty`\W=62 \setpretty`\X=62 \setpretty`\Y=62 - \setpretty`\Z=62 - \setpretty`\a=62 \setpretty`\b=62 \setpretty`\c=62 \setpretty`\d=62 \setpretty`\e=62 - \setpretty`\f=62 \setpretty`\g=62 \setpretty`\h=62 \setpretty`\i=62 \setpretty`\j=62 - \setpretty`\k=62 \setpretty`\l=62 \setpretty`\m=62 \setpretty`\n=62 \setpretty`\o=62 - \setpretty`\p=62 \setpretty`\q=62 \setpretty`\r=62 \setpretty`\s=62 \setpretty`\t=62 - \setpretty`\u=62 \setpretty`\v=62 \setpretty`\w=62 \setpretty`\x=62 \setpretty`\y=62 - \setpretty`\z=62 - \setpretty`\;=71 \setpretty`\:=72 \setpretty`\,=71 \setpretty`\.=71 - \setpretty`\'=80 - \setpretty`\"=90 - \setpretty`\#= 0 } - -\gdef\PLsethandlers% - {\installprettyhandler 10 \PLtypeone - \installprettyhandler 21 \PLtypetwo - \installprettyhandler 22 \PLtypetwo - \installprettyhandler 31 \PLtypethree - \installprettyhandler 32 \PLtypethree - \installprettyhandler 41 \PLtypefourone - \installprettyhandler 42 \PLtypefourtwo - \installprettyhandler 50 \PLtypefive - \installprettyhandler 61 \PLtypesixone - \installprettyhandler 62 \PLtypesixtwo - \installprettyhandler 71 \PLtypesevenone - \installprettyhandler 72 \PLtypeseventwo - \installprettyhandler 80 \PLtypeeight - \installprettyhandler 90 \PLtypenine - \installprettyhandler 0 \PLtypezero} - -\gdef\PLtypeone#1% - {\ifinPLdouble - \PLverbosefalse - \ifx\PLprefix\empty - \endPLtypesix - \getpretty{#1}% - \else - \endPLtypesix - \xdef\PLprefix{\getpretty{#1}}% - \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty - \fi - \else - \endPLtypesix - \ifinPLcomment - \getpretty{#1}% - \else\ifinPLsingle - \getpretty{#1}% - \else - \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty - \fi\fi - \fi} - -\gdef\PLtypetwo#1% - {\endPLtypesix - \xdef\PLprefix{\getpretty{#1}}% - \ifinPLcomment - \getpretty{#1}% - \else\ifinPLsingle - \getpretty{#1}% - \else\ifinPLdouble - \getprettydata{#1}% - \ifnum\prettytype=21 - \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty - \else - \getpretty{#1}% - \fi - \else - \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty - \fi\fi\fi} - -\gdef\PLtypethree#1% - {\endPLtypesix - \ifinPLcomment - \getpretty{#1}% - \else\ifinPLsingle - \getpretty{#1}% - \else\ifinPLdouble - \getprettydata{#1}% - \ifnum\prettytype=31 - \ifx\PLprefix\empty - \getpretty{#1}% - \else - \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty - \fi - \else - \getpretty{#1}% - \fi - \else - \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty - \fi\fi\fi} - -\gdef\PLtypefourone#1% - {\endPLtypesix - \ifinPLcomment - \getpretty{#1}% - \else\ifinPLsingle - \getpretty{#1}% - \else\ifinPLdouble - \getpretty{#1}% - \else - \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty - \fi\fi\fi} - -\gdef\doPLtypefourtwo#1#2% - {\PLverbosefalse - \getprettydata{#2}% - \ifnum\prettytype=62 - \expandafter\PLtypetwo - \else - \expandafter\PLtypefourone - \fi - {#1}#2} - -\gdef\PLtypefourtwo% - {\handlenextnextpretty\doPLtypefourtwo\PLtypefourone} - -\gdef\doPLtypefiveA#1#2% - {\endPLtypesix - \ifinPLcomment - \getpretties{#1}{#2}% - \else\ifinPLsingle - \getprettydata{#2}% - \ifnum\prettytype=50 - \beginofpretty[\!!prettytwo]\getpretties{#1}{#2}\endofpretty - \else\ifnum\prettytype=80 - \beginofpretty[\!!prettytwo]\getpretties{#1}{#2}\endofpretty - \else - \getpretties{#1}{#2}% - \fi\fi - \else - \beginofpretty[\!!prettytwo]\getpretties{#1}{#2}\endofpretty - \fi\fi} - -\gdef\doPLtypefiveB#1% - {\endPLtypesix - \ifinPLcomment - \getpretty{#1}% - \else\ifinPLsingle - \getpretty{#1}% - \else - \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty - \fi\fi} - -\gdef\PLtypefive% - {\ifPLverbose - \expandafter\PLtypesixtwo - \else - \expandafter\handlenextnextpretty\expandafter\doPLtypefiveA\expandafter\doPLtypefiveB - \fi} - -\gdef\endPLtypesix% - {\ifx\PLsequence\empty\else - \ifinPLsingle - \PLsequence - \else\ifinPLdouble - \PLsequence - \else\ifPLverbose - \beginofpretty[\!!prettytwo]\PLsequence\endofpretty - \PLverbosefalse - \else\ifx\PLprefix\empty - \doifprettyidentifierelse{\PLsequence}{\PLverboses} - {\PLverbosetrue\PLverboseskipped=3 } - {\doifprettyidentifierelse{\PLsequence}{\PLidentifiers} - {\beginofpretty[\!!prettytwo]% - {\prettyidentifierfont\PLsequence}% - \endofpretty} - {\ifprettyPLvariables - \doifprettyidentifierelse{\PLsequence}{\PLvariables} - {\beginofpretty[\!!prettytwo]% - {\prettyvariablefont\PLsequence}% - \endofpretty} - {\PLsequence}% - \else - \PLsequence - \fi}}% - \else\ifprettyPLvariables - \doifprettyidentifierelse{\PLprefix\PLsequence}{\PLvariables} - {\beginofpretty[\!!prettytwo]% - {\prettyvariablefont\PLsequence}% - \endofpretty} - {\PLsequence}% - \else - \PLsequence - \fi\fi\fi\fi\fi - \global\let\PLsequence=\empty - \global\let\PLprefix=\empty - \fi} - -\gdef\PLtypesixone% - {\ifx\PLsequence\empty - \expandafter\getpretty - \else - \expandafter\PLtypesixtwo - \fi} - -\gdef\PLtypesixtwo#1% - {\ifinPLcomment - \getpretty{#1}% - \else\ifinPLsingle - \getpretty{#1}% - \else\ifinPLdouble - \ifx\PLprefix\empty - \getpretty{#1}% - \else - \xdef\PLsequence{\PLsequence\getpretty{#1}}% - \fi - \else - \xdef\PLsequence{\PLsequence\getpretty{#1}}% - \fi\fi\fi} - -\gdef\PLtypesevenone#1% - {\endPLtypesix - \getpretty{#1}} - -\gdef\PLtypeseventwo% - {\handlenextnextpretty\doPLtypeseventwo\PLtypesevenone} - -\gdef\doPLtypeseventwo#1#2% - {\getprettydata{#2}% - \ifnum\prettytype=72 - \PLtypesixtwo{#1}\PLtypesixtwo{#1}% - \else - \PLtypesevenone{#1}\expandafter#2% - \fi} - -\gdef\PLtypeeight#1% single quote - {\endPLtypesix - \ifinPLcomment - \getpretty{#1}% - \else\ifinPLdouble - \getpretty{#1}% - \else\ifinPLsingle - \global\inPLsinglefalse - \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty - \else - \global\inPLsingletrue - \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty - \fi\fi\fi} - -\gdef\PLtypenine#1% double quote - {\endPLtypesix - \ifinPLcomment - \getpretty{#1}% - \else\ifinPLsingle - \getpretty{#1}% - \else\ifinPLdouble - \global\inPLdoublefalse - \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty - \else - \global\inPLdoubletrue - \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty - \fi\fi\fi} - -% \gdef\PLtypezero% -% {\endPLtypesix -% \handlenewpretty\doPLtypezero} - -\gdef\PLtypezero% - {\endPLtypesix - \ifnewpretty\expandafter\handlenewpretty\fi\doPLtypezero} - -\gdef\doPLtypezero#1% - {\ifinPLcomment - \getpretty{#1}% - \else - \global\inPLcommenttrue - \PLverbosecorrection - \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty - \fi} - -\gdef\doreportprettyPLtype#1#2#3#4% - {#1% - [PERL \string#2 typing conflict, use \string#3 instead] - \writestatus - {PERL typing} - {use \string#3 instead of \string#2 to enable propper visualization}% - \global#4% - \expandafter\doemptyverbatimline - \fi} - -\gdef\reportprettyPLtype% - {\doreportprettyPLtype\ifinPLsingle'\'\inPLsinglefalse - \doreportprettyPLtype\ifinPLdouble"\"\inPLdoublefalse} - -\gdef\PLsetdiagnostics% - {\let\normaldoemptyverbatimline=\doemptyverbatimline - \def\doemptyverbatimline% - {\normaldoemptyverbatimline - \reportprettyPLtype}} - -%D The official \PERL\ version 5 keywords: - -\useprettyidentifiers \PLidentifiers \PLsetspecials - abs accept alarm and atan atan2 bind binmode bless caller - chdir chmod chomp chop chown chr chroot close closedir cmp - connect continue cos crypt dbmclose dbmopen defined delete - die do dump each echo else elsif endgrent endhostent - endnetent endprotoend endpwent endservent eof eq eval exec - exists exit exp fcntl fileno flock for foreach fork format - formline getc getgrent getgrgid getgrnam gethostbyaddr - gethostbyname gethostent getlogin getnetbyaddr getnetbyname - getnetent getpeername getpgrp getppid getpriority - getprotobyname getprotobynumber getprotoent getpwent - getpwnam getpwuid getservbyname getservbyport getservent - getsockname getsockopt glob gmtime goto grep gt hex if - import index int integer ioctl join keys kill last lc - lcfirst le length lib link listen local localtime log lstat - lt map method mkdir msgctl msgget msgrcv msgsnd my ne next - no not oct open opendir or ord pack package pipe pop pos - print printf process prompt push quotemeta rand read readdir - readlink recv redo ref rename require reset return reverse - rewinddir rindex rmdir scalar seek seekdir select semctl - semget semop send setgrent sethostent setnetent setpgrp - setpriority setprotoent setpwent setservent setsockopt shift - shmctl shmget shmread shmwrite shutdown sin sleep socket - socketpair sort splice split sprintf sqrt srand stat strict - study sub subs substr symlink syscall sysopen sysread system - syswrite tell telldir tie tied time times times truncate uc - ucfirst ucmask umask unary undef unless unlink unpack - unshift untie until use utime values vars vec wait waitpid - wantarray warn warn while write xor - -%D Additional module keywords (still incomplete): - -\useprettyidentifiers \PLvariables \PLsetspecials - Getopt::Long - $Getopt::Long::passthrough - $Getopt::Long::autoabbrev - &GetOptions - -%D A funny hack. When prefixes by \type{TEX}, a \type{\csname} -%D is typeset as \TEX\ sequence. - -\useprettyidentifiers \PLverboses \PLsetspecials - TEX - -\protect - -\endinput +%D \module
+%D [ file=verb-pl,
+%D version=1997.12.22,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \PERL\ Verbatim,
+%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 Support Macros / Pretty PERL Verbatim}
+
+%D When I rewrote \TEXUTIL\ in \PERL\ I decided to write a
+%D pretty \PERL\ interpreter too. In fact, this was the main
+%D reason for rewriting the pretty verbatim mechanisms to
+%D handle more that \TEX.
+%D
+%D \startPL
+%D $alfa = $beta{gamma};
+%D if ($alfa="delta")
+%D { print "epsilon" }
+%D \stopPL
+%D
+%D When looking at the macros, watch the \type{\doglobal}'s!
+%D They're something \CONTEXT\ specific.
+
+\unprotect
+
+%D \macros
+%D {prettyPLvariables}
+%D
+%D Identifiers and system variables get a special treatment.
+%D One can disable this option for the variables by resetting
+%D the next switch.
+
+\doglobal\newif\ifprettyPLvariables
+
+\global\prettyPLvariablestrue
+
+%D As said before, the global assignment is needed in
+%D \CONTEXT\ (for once||only loading on demand).
+
+\doglobal\newif\ifinPLsingle
+\doglobal\newif\ifinPLdouble
+\doglobal\newif\ifinPLcomment
+\doglobal\newif\ifPLverbose
+
+\newcount\PLverboseskipped
+
+\gdef\PLverbosecorrection%
+ {\ifnum\PLverboseskipped>0
+ \loop
+ \obeyedspace
+ \advance\PLverboseskipped by -1
+ \ifnum\PLverboseskipped>0
+ \repeat
+ \fi}
+
+\gdef\PLsetcontrols%
+ {\saveprettycontrols
+ \def\obeyedspace%
+ {\endPLtypesix
+ \ifPLverbose
+ \advance\PLverboseskipped by 1
+ \else
+ \oldobeyedspace
+ \fi}%
+ \def\obeyedline%
+ {\endPLtypesix
+ \global\inPLcommentfalse
+ \PLverbosefalse
+ \PLverboseskipped=0
+ \oldobeyedline}%
+ \def\obeyedpage%
+ {\endPLtypesix
+ \global\inPLcommentfalse
+ \oldobeyedpage}%
+ \let\obeytabs=\ignoretabs}
+
+\gdef\setupprettyPLtype%
+ {\def\prettyidentifier{PL}%
+ \PLsetvariables
+ \PLsetcontrols
+ \PLsethandlers
+ \PLsetspecials
+ \PLsetdiagnostics}
+
+\gdef\PLsetvariables%
+ {\global\inPLsinglefalse
+ \global\inPLdoublefalse
+ \global\inPLcommentfalse
+ \global\let\PLsequence=\empty
+ \global\let\PLprefix=\empty}
+
+\gdef\PLsetspecials%
+ {\setpretty`\{=10 \setpretty`\}=10
+ \setpretty`\$=21 \setpretty`\@=21 \setpretty`\%=22
+ \setpretty`\[=31 \setpretty`\]=31 \setpretty`\(=32 \setpretty`\)=32
+ \setpretty`\==32 \setpretty`\~=32 \setpretty`\<=32 \setpretty`\>=32
+ \setpretty`\-=41 \setpretty`\+=41 \setpretty`\/=41 \setpretty`\*=41
+ \setpretty`\|=41 \setpretty`\`=41 \setpretty`\!=41 \setpretty`\?=41
+ \setpretty`\^=41 \setpretty`\&=42
+ \setpretty`\\=50
+ \setpretty`\1=61 \setpretty`\2=61 \setpretty`\3=61 \setpretty`\4=61
+ \setpretty`\5=61 \setpretty`\6=61 \setpretty`\7=61 \setpretty`\8=61
+ \setpretty`\9=61 \setpretty`\0=61 \setpretty`\_=61
+ \setpretty`\A=62 \setpretty`\B=62 \setpretty`\C=62 \setpretty`\D=62 \setpretty`\E=62
+ \setpretty`\F=62 \setpretty`\G=62 \setpretty`\H=62 \setpretty`\I=62 \setpretty`\J=62
+ \setpretty`\K=62 \setpretty`\L=62 \setpretty`\M=62 \setpretty`\N=62 \setpretty`\O=62
+ \setpretty`\P=62 \setpretty`\Q=62 \setpretty`\R=62 \setpretty`\S=62 \setpretty`\T=62
+ \setpretty`\U=62 \setpretty`\V=62 \setpretty`\W=62 \setpretty`\X=62 \setpretty`\Y=62
+ \setpretty`\Z=62
+ \setpretty`\a=62 \setpretty`\b=62 \setpretty`\c=62 \setpretty`\d=62 \setpretty`\e=62
+ \setpretty`\f=62 \setpretty`\g=62 \setpretty`\h=62 \setpretty`\i=62 \setpretty`\j=62
+ \setpretty`\k=62 \setpretty`\l=62 \setpretty`\m=62 \setpretty`\n=62 \setpretty`\o=62
+ \setpretty`\p=62 \setpretty`\q=62 \setpretty`\r=62 \setpretty`\s=62 \setpretty`\t=62
+ \setpretty`\u=62 \setpretty`\v=62 \setpretty`\w=62 \setpretty`\x=62 \setpretty`\y=62
+ \setpretty`\z=62
+ \setpretty`\;=71 \setpretty`\:=72 \setpretty`\,=71 \setpretty`\.=71
+ \setpretty`\'=80
+ \setpretty`\"=90
+ \setpretty`\#= 0 }
+
+\gdef\PLsethandlers%
+ {\installprettyhandler 10 \PLtypeone
+ \installprettyhandler 21 \PLtypetwo
+ \installprettyhandler 22 \PLtypetwo
+ \installprettyhandler 31 \PLtypethree
+ \installprettyhandler 32 \PLtypethree
+ \installprettyhandler 41 \PLtypefourone
+ \installprettyhandler 42 \PLtypefourtwo
+ \installprettyhandler 50 \PLtypefive
+ \installprettyhandler 61 \PLtypesixone
+ \installprettyhandler 62 \PLtypesixtwo
+ \installprettyhandler 71 \PLtypesevenone
+ \installprettyhandler 72 \PLtypeseventwo
+ \installprettyhandler 80 \PLtypeeight
+ \installprettyhandler 90 \PLtypenine
+ \installprettyhandler 0 \PLtypezero}
+
+\gdef\PLtypeone#1%
+ {\ifinPLdouble
+ \PLverbosefalse
+ \ifx\PLprefix\empty
+ \endPLtypesix
+ \getpretty{#1}%
+ \else
+ \endPLtypesix
+ \xdef\PLprefix{\getpretty{#1}}%
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi
+ \else
+ \endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi\fi
+ \fi}
+
+\gdef\PLtypetwo#1%
+ {\endPLtypesix
+ \xdef\PLprefix{\getpretty{#1}}%
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \getprettydata{#1}%
+ \ifnum\prettytype=21
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \else
+ \getpretty{#1}%
+ \fi
+ \else
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\PLtypethree#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \getprettydata{#1}%
+ \ifnum\prettytype=31
+ \ifx\PLprefix\empty
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi
+ \else
+ \getpretty{#1}%
+ \fi
+ \else
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\PLtypefourone#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\doPLtypefourtwo#1#2%
+ {\PLverbosefalse
+ \getprettydata{#2}%
+ \ifnum\prettytype=62
+ \expandafter\PLtypetwo
+ \else
+ \expandafter\PLtypefourone
+ \fi
+ {#1}#2}
+
+\gdef\PLtypefourtwo%
+ {\handlenextnextpretty\doPLtypefourtwo\PLtypefourone}
+
+\gdef\doPLtypefiveA#1#2%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretties{#1}{#2}%
+ \else\ifinPLsingle
+ \getprettydata{#2}%
+ \ifnum\prettytype=50
+ \beginofpretty[\!!prettytwo]\getpretties{#1}{#2}\endofpretty
+ \else\ifnum\prettytype=80
+ \beginofpretty[\!!prettytwo]\getpretties{#1}{#2}\endofpretty
+ \else
+ \getpretties{#1}{#2}%
+ \fi\fi
+ \else
+ \beginofpretty[\!!prettytwo]\getpretties{#1}{#2}\endofpretty
+ \fi\fi}
+
+\gdef\doPLtypefiveB#1%
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else
+ \beginofpretty[\!!prettytwo]\getpretty{#1}\endofpretty
+ \fi\fi}
+
+\gdef\PLtypefive%
+ {\ifPLverbose
+ \expandafter\PLtypesixtwo
+ \else
+ \expandafter\handlenextnextpretty\expandafter\doPLtypefiveA\expandafter\doPLtypefiveB
+ \fi}
+
+\gdef\endPLtypesix%
+ {\ifx\PLsequence\empty\else
+ \ifinPLsingle
+ \PLsequence
+ \else\ifinPLdouble
+ \PLsequence
+ \else\ifPLverbose
+ \beginofpretty[\!!prettytwo]\PLsequence\endofpretty
+ \PLverbosefalse
+ \else\ifx\PLprefix\empty
+ \doifprettyidentifierelse{\PLsequence}{\PLverboses}
+ {\PLverbosetrue\PLverboseskipped=3 }
+ {\doifprettyidentifierelse{\PLsequence}{\PLidentifiers}
+ {\beginofpretty[\!!prettytwo]%
+ {\prettyidentifierfont\PLsequence}%
+ \endofpretty}
+ {\ifprettyPLvariables
+ \doifprettyidentifierelse{\PLsequence}{\PLvariables}
+ {\beginofpretty[\!!prettytwo]%
+ {\prettyvariablefont\PLsequence}%
+ \endofpretty}
+ {\PLsequence}%
+ \else
+ \PLsequence
+ \fi}}%
+ \else\ifprettyPLvariables
+ \doifprettyidentifierelse{\PLprefix\PLsequence}{\PLvariables}
+ {\beginofpretty[\!!prettytwo]%
+ {\prettyvariablefont\PLsequence}%
+ \endofpretty}
+ {\PLsequence}%
+ \else
+ \PLsequence
+ \fi\fi\fi\fi\fi
+ \global\let\PLsequence=\empty
+ \global\let\PLprefix=\empty
+ \fi}
+
+\gdef\PLtypesixone%
+ {\ifx\PLsequence\empty
+ \expandafter\getpretty
+ \else
+ \expandafter\PLtypesixtwo
+ \fi}
+
+\gdef\PLtypesixtwo#1%
+ {\ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \ifx\PLprefix\empty
+ \getpretty{#1}%
+ \else
+ \xdef\PLsequence{\PLsequence\getpretty{#1}}%
+ \fi
+ \else
+ \xdef\PLsequence{\PLsequence\getpretty{#1}}%
+ \fi\fi\fi}
+
+\gdef\PLtypesevenone#1%
+ {\endPLtypesix
+ \getpretty{#1}}
+
+\gdef\PLtypeseventwo%
+ {\handlenextnextpretty\doPLtypeseventwo\PLtypesevenone}
+
+\gdef\doPLtypeseventwo#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=72
+ \PLtypesixtwo{#1}\PLtypesixtwo{#1}%
+ \else
+ \PLtypesevenone{#1}\expandafter#2%
+ \fi}
+
+\gdef\PLtypeeight#1% single quote
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \global\inPLsinglefalse
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \else
+ \global\inPLsingletrue
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+\gdef\PLtypenine#1% double quote
+ {\endPLtypesix
+ \ifinPLcomment
+ \getpretty{#1}%
+ \else\ifinPLsingle
+ \getpretty{#1}%
+ \else\ifinPLdouble
+ \global\inPLdoublefalse
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \else
+ \global\inPLdoubletrue
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi\fi\fi}
+
+% \gdef\PLtypezero%
+% {\endPLtypesix
+% \handlenewpretty\doPLtypezero}
+
+\gdef\PLtypezero%
+ {\endPLtypesix
+ \ifnewpretty\expandafter\handlenewpretty\fi\doPLtypezero}
+
+\gdef\doPLtypezero#1%
+ {\ifinPLcomment
+ \getpretty{#1}%
+ \else
+ \global\inPLcommenttrue
+ \PLverbosecorrection
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\doreportprettyPLtype#1#2#3#4%
+ {#1%
+ [PERL \string#2 typing conflict, use \string#3 instead]
+ \writestatus
+ {PERL typing}
+ {use \string#3 instead of \string#2 to enable propper visualization}%
+ \global#4%
+ \expandafter\doemptyverbatimline
+ \fi}
+
+\gdef\reportprettyPLtype%
+ {\doreportprettyPLtype\ifinPLsingle'\'\inPLsinglefalse
+ \doreportprettyPLtype\ifinPLdouble"\"\inPLdoublefalse}
+
+\gdef\PLsetdiagnostics%
+ {\let\normaldoemptyverbatimline=\doemptyverbatimline
+ \def\doemptyverbatimline%
+ {\normaldoemptyverbatimline
+ \reportprettyPLtype}}
+
+%D The official \PERL\ version 5 keywords:
+
+\useprettyidentifiers \PLidentifiers \PLsetspecials
+ abs accept alarm and atan atan2 bind binmode bless caller
+ chdir chmod chomp chop chown chr chroot close closedir cmp
+ connect continue cos crypt dbmclose dbmopen defined delete
+ die do dump each echo else elsif endgrent endhostent
+ endnetent endprotoend endpwent endservent eof eq eval exec
+ exists exit exp fcntl fileno flock for foreach fork format
+ formline getc getgrent getgrgid getgrnam gethostbyaddr
+ gethostbyname gethostent getlogin getnetbyaddr getnetbyname
+ getnetent getpeername getpgrp getppid getpriority
+ getprotobyname getprotobynumber getprotoent getpwent
+ getpwnam getpwuid getservbyname getservbyport getservent
+ getsockname getsockopt glob gmtime goto grep gt hex if
+ import index int integer ioctl join keys kill last lc
+ lcfirst le length lib link listen local localtime log lstat
+ lt map method mkdir msgctl msgget msgrcv msgsnd my ne next
+ no not oct open opendir or ord pack package pipe pop pos
+ print printf process prompt push quotemeta rand read readdir
+ readlink recv redo ref rename require reset return reverse
+ rewinddir rindex rmdir scalar seek seekdir select semctl
+ semget semop send setgrent sethostent setnetent setpgrp
+ setpriority setprotoent setpwent setservent setsockopt shift
+ shmctl shmget shmread shmwrite shutdown sin sleep socket
+ socketpair sort splice split sprintf sqrt srand stat strict
+ study sub subs substr symlink syscall sysopen sysread system
+ syswrite tell telldir tie tied time times times truncate uc
+ ucfirst ucmask umask unary undef unless unlink unpack
+ unshift untie until use utime values vars vec wait waitpid
+ wantarray warn warn while write xor
+
+%D Additional module keywords (still incomplete):
+
+\useprettyidentifiers \PLvariables \PLsetspecials
+ Getopt::Long
+ $Getopt::Long::passthrough
+ $Getopt::Long::autoabbrev
+ &GetOptions
+
+%D A funny hack. When prefixes by \type{TEX}, a \type{\csname}
+%D is typeset as \TEX\ sequence.
+
+\useprettyidentifiers \PLverboses \PLsetspecials
+ TEX
+
+\protect
+
+\endinput
+
\ No newline at end of file diff --git a/tex/context/base/verb-tex.tex b/tex/context/base/verb-tex.tex index f1cfe6043..2a2a28123 100644 --- a/tex/context/base/verb-tex.tex +++ b/tex/context/base/verb-tex.tex @@ -1,284 +1,285 @@ -%D \module -%D [ file=verb-tex, -%D version=1997.12.22, -%D title=\CONTEXT\ Verbatim Macros, -%D subtitle=Pretty \TEX\ verbatim, -%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 Support Macros / Pretty TEX Verbatim} - -%D The original module \type{supp-ver} had the \TEX\ -%D interpreter built in. The current implementation is more -%D natural and less complicated. - -%D \startTEX -%D \definetyping[niceTEX][option=TEX,palet=graypretty] -%D -%D \startniceTEX -%D \message{A vivid look at TeX} -%D \stopniceTEX -%D \stopTEX - -\unprotect - -%D \macros -%D {ifsplitTEXparameters} -%D {} -%D -%D The mechanism described here, is meant to be used with -%D color. It is nevertheless possible to use different fonts -%D instead of distinctive colors. When using color, it's better -%D to end parameter mode after the \type{#}. When on the -%D other hand we use a slanted typeface for the hashmark, then -%D a slanted number looks better. - -\doglobal\newif\ifsplitTEXparameters \global\splitTEXparameterstrue - -%D \macros -%D {ifsplitTEXcontrols} -%D {} -%D -%D With \type{\splittexcontrols} we can influence the way -%D control characters are processed in macro names. By default, -%D the \type{^^} part is uncolored. When this boolean is set to -%D false, they get the same color as the other characters. - -\doglobal\newif\ifsplitTEXcontrols \global\splitTEXcontrolstrue - -%D The next boolean is used for internal purposes only and -%D keeps track of the length of the name. Because two||character -%D sequences starting with a backslash are always seen as a -%D command. - -\doglobal\newif\iffirstinTEXcommand - -%D We use a maximum of four colors because more colors will -%D distract too much. In the following table we show the -%D logical names of the colors, their color and \kap{RGB} values. -%D -%D \plaatstabel{geen} -%D \starttabel[|l|l|c|c|c|c|] -%D \HL -%D \FC\bf identifier \MC\bf color \MC\bf r \MC\bf g \MC\bf b \MC\bf bw \LC\SR -%D \HL -%D \FC prettyone \MC red \MC 0.9 \MC 0.0 \MC 0.0 \MC 0.30 \LC\FR -%D \FC prettytwo \MC green \MC 0.0 \MC 0.8 \MC 0.0 \MC 0.45 \LC\MR -%D \FC prettythree \MC yellow \MC 0.0 \MC 0.0 \MC 0.9 \MC 0.60 \LC\MR -%D \FC prettyfour \MC blue \MC 0.8 \MC 0.8 \MC 0.6 \MC 0.75 \LC\LR -%D \HL -%D \stoptabel -%D -%D Outside \CONTEXT\ these colors are defined in -%D \type{verb-ini}, in \CONTEXT\ their definitions can be found -%D in \type{core-ver}, where in fact we use the color palet -%D mechanism. That way we can use different schemes i a quite -%D natural way. - -\gdef\setupprettyTEXtype% - {\def\prettyidentifier{TEX}% - \TEXsetcontrols - \TEXsethandlers - \TEXsetspecials} - -\gdef\TEXsetcontrols% - {\saveprettycontrols - \def\obeyedspace% - {\TEXendofcommand - \TEXendofparameter - \oldobeyedspace}% - \def\obeyedline% - {\TEXendofcommand - \TEXendofparameter - \oldobeyedline}% - \def\obeyedpage% - {\TEXendofcommand - \TEXendofparameter - \oldobeyedpage}% - \let\obeytabs=\ignoretabs} - -\gdef\TEXsetspecials% - {\setpretty`\$=1 \setpretty`\{=1 \setpretty`\}=1 - \setpretty`\[=2 \setpretty`\]=2 \setpretty`\(=2 \setpretty`\)=2 - \setpretty`\==2 \setpretty`\<=2 \setpretty`\>=2 \setpretty`\"=2 - \setpretty`\-=3 \setpretty`\+=3 \setpretty`\/=3 - \setpretty`\|=3 \setpretty`\%=3 \setpretty`\'=3 \setpretty`\`=3 - \setpretty`\_=3 \setpretty`\&=3 \setpretty`\~=3 - \setpretty`\.=4 \setpretty`\,=4 \setpretty`\:=4 \setpretty`\;=4 \setpretty`\*=4 - \setpretty`\#=5 - \setpretty`\1=6 \setpretty`\2=6 \setpretty`\3=6 \setpretty`\4=6 \setpretty`\5=6 - \setpretty`\6=6 \setpretty`\7=6 \setpretty`\8=6 \setpretty`\9=6 \setpretty`\0=6 - \setpretty`\\=7 - \setpretty`\^=8 - \setpretty`\A=9 \setpretty`\B=9 \setpretty`\C=9 \setpretty`\D=9 \setpretty`\E=9 - \setpretty`\F=9 \setpretty`\G=9 \setpretty`\H=9 \setpretty`\I=9 \setpretty`\J=9 - \setpretty`\K=9 \setpretty`\L=9 \setpretty`\M=9 \setpretty`\N=9 \setpretty`\O=9 - \setpretty`\P=9 \setpretty`\Q=9 \setpretty`\R=9 \setpretty`\S=9 \setpretty`\T=9 - \setpretty`\U=9 \setpretty`\V=9 \setpretty`\W=9 \setpretty`\X=9 \setpretty`\Y=9 - \setpretty`\Z=9 - \setpretty`\a=9 \setpretty`\b=9 \setpretty`\c=9 \setpretty`\d=9 \setpretty`\e=9 - \setpretty`\f=9 \setpretty`\g=9 \setpretty`\h=9 \setpretty`\i=9 \setpretty`\j=9 - \setpretty`\k=9 \setpretty`\l=9 \setpretty`\m=9 \setpretty`\n=9 \setpretty`\o=9 - \setpretty`\p=9 \setpretty`\q=9 \setpretty`\r=9 \setpretty`\s=9 \setpretty`\t=9 - \setpretty`\u=9 \setpretty`\v=9 \setpretty`\w=9 \setpretty`\x=9 \setpretty`\y=9 - \setpretty`\z=9 - \setpretty`\?=9 \setpretty`\!=9 \setpretty`\@=9 - %\setpretty`\%=\ifnewpretty 0 \else 3 \fi} - \setpretty`\%=0 } - -\gdef\TEXsethandlers% - {\installprettyhandler 1 \TEXtypeone - \installprettyhandler 2 \TEXtypetwo - \installprettyhandler 3 \TEXtypethree - \installprettyhandler 4 \TEXtypefour - \installprettyhandler 5 \TEXtypefive - \installprettyhandler 6 \TEXtypesix - \installprettyhandler 7 \TEXtypeseven - \installprettyhandler 8 \TEXtypeeight - \installprettyhandler 9 \TEXtypenine - \installprettyhandler 0 \TEXtypezero} - -\doglobal\newif\ifinTEXcommand -\doglobal\newif\ifinTEXparameter - -\gdef\TEXbeginofcommand% - {\TEXendofparameter - \ifinTEXcommand - \else - \global\inTEXcommandtrue - \global\firstinTEXcommandtrue - \beginofpretty[\!!prettytwo]% - \fi} - -\gdef\TEXendofcommand% - {\ifinTEXcommand - \endofpretty - \global\inTEXcommandfalse - \global\firstinTEXcommandfalse - \fi} - -\gdef\TEXbeginofparameter% - {\TEXendofcommand - \ifinTEXparameter - \else - \global\inTEXparametertrue - \beginofpretty[\!!prettythree]% - \fi} - -\gdef\TEXendofparameter% - {\ifinTEXparameter - \endofpretty - \global\inTEXparameterfalse - \fi} - -\gdef\ifnotfirstinTEXcommand#1 - {\iffirstinTEXcommand - \getpretty{#1}% - \TEXendofcommand - \else} - -\gdef\TEXtypeone#1% - {\ifnotfirstinTEXcommand#1 - \TEXendofcommand - \TEXendofparameter - \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty - \fi} - -\gdef\TEXtypetwo#1% - {\ifnotfirstinTEXcommand#1 - \TEXendofcommand - \TEXendofparameter - \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty - \fi} - -\gdef\TEXtypethree#1% - {\ifnotfirstinTEXcommand#1 - \TEXendofcommand - \TEXendofparameter - \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty - \fi} - -\gdef\TEXtypefour#1% - {\ifnotfirstinTEXcommand#1 - \TEXendofcommand - \TEXendofparameter - \getpretty{#1}% - \fi} - -\gdef\TEXtypefive#1% - {\ifnotfirstinTEXcommand#1 - \TEXbeginofparameter - \getpretty{#1}% - \fi} - -\gdef\TEXtypesix#1% - {\ifnotfirstinTEXcommand#1 - \ifinTEXparameter - \ifsplitTEXparameters - \TEXendofparameter - \getpretty{#1}% - \else - \getpretty{#1}% - \TEXendofparameter - \fi - \else - \TEXendofcommand - \getpretty{#1}% - \fi - \fi} - -\gdef\TEXtypeseven#1% - {\ifnotfirstinTEXcommand#1 - \TEXbeginofcommand - \getpretty{#1}% - \fi} - -\gdef\TEXtypeeightA#1#2% - {\getprettydata{#2}% - \ifnum\prettytype=80 - \TEXendofparameter - \ifsplitTEXcontrols - \ifinTEXcommand - \def\next{\TEXendofcommand\getpretty{#1}\getpretty{#1}\TEXbeginofcommand}% - \else - \def\next{\getpretty{#1}\getpretty{#1}}% - \fi - \else - \def\next{\getpretty{#1}\getpretty{#1}}% - \fi - \else - \def\next{\TEXtypeeightB{#1}#2}% - \fi - \next} - -\gdef\TEXtypeeightB% - {\TEXendofparameter - \ifinTEXcommand - \firstinTEXcommandfalse - \expandafter\getpretty - \else - \expandafter\TEXtypethree - \fi} - -\gdef\TEXtypeeight% - {\handlenextnextpretty\TEXtypeeightA\TEXtypeeightB} - -\gdef\TEXtypenine% - {\TEXendofparameter - \global\firstinTEXcommandfalse - \getpretty} - -% \gdef\TEXtypezero% -% {\handlenewpretty\TEXtypethree} - -\gdef\TEXtypezero% - {\ifnewpretty\expandafter\handlenewpretty\fi\TEXtypethree} - -\protect - -\endinput +%D \module
+%D [ file=verb-tex,
+%D version=1997.12.22,
+%D title=\CONTEXT\ Verbatim Macros,
+%D subtitle=Pretty \TEX\ verbatim,
+%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 Support Macros / Pretty TEX Verbatim}
+
+%D The original module \type{supp-ver} had the \TEX\
+%D interpreter built in. The current implementation is more
+%D natural and less complicated.
+
+%D \startTEX
+%D \definetyping[niceTEX][option=TEX,palet=graypretty]
+%D
+%D \startniceTEX
+%D \message{A vivid look at TeX}
+%D \stopniceTEX
+%D \stopTEX
+
+\unprotect
+
+%D \macros
+%D {ifsplitTEXparameters}
+%D {}
+%D
+%D The mechanism described here, is meant to be used with
+%D color. It is nevertheless possible to use different fonts
+%D instead of distinctive colors. When using color, it's better
+%D to end parameter mode after the \type{#}. When on the
+%D other hand we use a slanted typeface for the hashmark, then
+%D a slanted number looks better.
+
+\doglobal\newif\ifsplitTEXparameters \global\splitTEXparameterstrue
+
+%D \macros
+%D {ifsplitTEXcontrols}
+%D {}
+%D
+%D With \type{\splittexcontrols} we can influence the way
+%D control characters are processed in macro names. By default,
+%D the \type{^^} part is uncolored. When this boolean is set to
+%D false, they get the same color as the other characters.
+
+\doglobal\newif\ifsplitTEXcontrols \global\splitTEXcontrolstrue
+
+%D The next boolean is used for internal purposes only and
+%D keeps track of the length of the name. Because two||character
+%D sequences starting with a backslash are always seen as a
+%D command.
+
+\doglobal\newif\iffirstinTEXcommand
+
+%D We use a maximum of four colors because more colors will
+%D distract too much. In the following table we show the
+%D logical names of the colors, their color and \kap{RGB} values.
+%D
+%D \plaatstabel{geen}
+%D \starttabel[|l|l|c|c|c|c|]
+%D \HL
+%D \FC\bf identifier \MC\bf color \MC\bf r \MC\bf g \MC\bf b \MC\bf bw \LC\SR
+%D \HL
+%D \FC prettyone \MC red \MC 0.9 \MC 0.0 \MC 0.0 \MC 0.30 \LC\FR
+%D \FC prettytwo \MC green \MC 0.0 \MC 0.8 \MC 0.0 \MC 0.45 \LC\MR
+%D \FC prettythree \MC yellow \MC 0.0 \MC 0.0 \MC 0.9 \MC 0.60 \LC\MR
+%D \FC prettyfour \MC blue \MC 0.8 \MC 0.8 \MC 0.6 \MC 0.75 \LC\LR
+%D \HL
+%D \stoptabel
+%D
+%D Outside \CONTEXT\ these colors are defined in
+%D \type{verb-ini}, in \CONTEXT\ their definitions can be found
+%D in \type{core-ver}, where in fact we use the color palet
+%D mechanism. That way we can use different schemes i a quite
+%D natural way.
+
+\gdef\setupprettyTEXtype%
+ {\def\prettyidentifier{TEX}%
+ \TEXsetcontrols
+ \TEXsethandlers
+ \TEXsetspecials}
+
+\gdef\TEXsetcontrols%
+ {\saveprettycontrols
+ \def\obeyedspace%
+ {\TEXendofcommand
+ \TEXendofparameter
+ \oldobeyedspace}%
+ \def\obeyedline%
+ {\TEXendofcommand
+ \TEXendofparameter
+ \oldobeyedline}%
+ \def\obeyedpage%
+ {\TEXendofcommand
+ \TEXendofparameter
+ \oldobeyedpage}%
+ \let\obeytabs=\ignoretabs}
+
+\gdef\TEXsetspecials%
+ {\setpretty`\$=1 \setpretty`\{=1 \setpretty`\}=1
+ \setpretty`\[=2 \setpretty`\]=2 \setpretty`\(=2 \setpretty`\)=2
+ \setpretty`\==2 \setpretty`\<=2 \setpretty`\>=2 \setpretty`\"=2
+ \setpretty`\-=3 \setpretty`\+=3 \setpretty`\/=3
+ \setpretty`\|=3 \setpretty`\%=3 \setpretty`\'=3 \setpretty`\`=3
+ \setpretty`\_=3 \setpretty`\&=3 \setpretty`\~=3
+ \setpretty`\.=4 \setpretty`\,=4 \setpretty`\:=4 \setpretty`\;=4 \setpretty`\*=4
+ \setpretty`\#=5
+ \setpretty`\1=6 \setpretty`\2=6 \setpretty`\3=6 \setpretty`\4=6 \setpretty`\5=6
+ \setpretty`\6=6 \setpretty`\7=6 \setpretty`\8=6 \setpretty`\9=6 \setpretty`\0=6
+ \setpretty`\\=7
+ \setpretty`\^=8
+ \setpretty`\A=9 \setpretty`\B=9 \setpretty`\C=9 \setpretty`\D=9 \setpretty`\E=9
+ \setpretty`\F=9 \setpretty`\G=9 \setpretty`\H=9 \setpretty`\I=9 \setpretty`\J=9
+ \setpretty`\K=9 \setpretty`\L=9 \setpretty`\M=9 \setpretty`\N=9 \setpretty`\O=9
+ \setpretty`\P=9 \setpretty`\Q=9 \setpretty`\R=9 \setpretty`\S=9 \setpretty`\T=9
+ \setpretty`\U=9 \setpretty`\V=9 \setpretty`\W=9 \setpretty`\X=9 \setpretty`\Y=9
+ \setpretty`\Z=9
+ \setpretty`\a=9 \setpretty`\b=9 \setpretty`\c=9 \setpretty`\d=9 \setpretty`\e=9
+ \setpretty`\f=9 \setpretty`\g=9 \setpretty`\h=9 \setpretty`\i=9 \setpretty`\j=9
+ \setpretty`\k=9 \setpretty`\l=9 \setpretty`\m=9 \setpretty`\n=9 \setpretty`\o=9
+ \setpretty`\p=9 \setpretty`\q=9 \setpretty`\r=9 \setpretty`\s=9 \setpretty`\t=9
+ \setpretty`\u=9 \setpretty`\v=9 \setpretty`\w=9 \setpretty`\x=9 \setpretty`\y=9
+ \setpretty`\z=9
+ \setpretty`\?=9 \setpretty`\!=9 \setpretty`\@=9
+ %\setpretty`\%=\ifnewpretty 0 \else 3 \fi}
+ \setpretty`\%=0 }
+
+\gdef\TEXsethandlers%
+ {\installprettyhandler 1 \TEXtypeone
+ \installprettyhandler 2 \TEXtypetwo
+ \installprettyhandler 3 \TEXtypethree
+ \installprettyhandler 4 \TEXtypefour
+ \installprettyhandler 5 \TEXtypefive
+ \installprettyhandler 6 \TEXtypesix
+ \installprettyhandler 7 \TEXtypeseven
+ \installprettyhandler 8 \TEXtypeeight
+ \installprettyhandler 9 \TEXtypenine
+ \installprettyhandler 0 \TEXtypezero}
+
+\doglobal\newif\ifinTEXcommand
+\doglobal\newif\ifinTEXparameter
+
+\gdef\TEXbeginofcommand%
+ {\TEXendofparameter
+ \ifinTEXcommand
+ \else
+ \global\inTEXcommandtrue
+ \global\firstinTEXcommandtrue
+ \beginofpretty[\!!prettytwo]%
+ \fi}
+
+\gdef\TEXendofcommand%
+ {\ifinTEXcommand
+ \endofpretty
+ \global\inTEXcommandfalse
+ \global\firstinTEXcommandfalse
+ \fi}
+
+\gdef\TEXbeginofparameter%
+ {\TEXendofcommand
+ \ifinTEXparameter
+ \else
+ \global\inTEXparametertrue
+ \beginofpretty[\!!prettythree]%
+ \fi}
+
+\gdef\TEXendofparameter%
+ {\ifinTEXparameter
+ \endofpretty
+ \global\inTEXparameterfalse
+ \fi}
+
+\gdef\ifnotfirstinTEXcommand#1
+ {\iffirstinTEXcommand
+ \getpretty{#1}%
+ \TEXendofcommand
+ \else}
+
+\gdef\TEXtypeone#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXendofcommand
+ \TEXendofparameter
+ \beginofpretty[\!!prettyone]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\TEXtypetwo#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXendofcommand
+ \TEXendofparameter
+ \beginofpretty[\!!prettythree]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\TEXtypethree#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXendofcommand
+ \TEXendofparameter
+ \beginofpretty[\!!prettyfour]\getpretty{#1}\endofpretty
+ \fi}
+
+\gdef\TEXtypefour#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXendofcommand
+ \TEXendofparameter
+ \getpretty{#1}%
+ \fi}
+
+\gdef\TEXtypefive#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXbeginofparameter
+ \getpretty{#1}%
+ \fi}
+
+\gdef\TEXtypesix#1%
+ {\ifnotfirstinTEXcommand#1
+ \ifinTEXparameter
+ \ifsplitTEXparameters
+ \TEXendofparameter
+ \getpretty{#1}%
+ \else
+ \getpretty{#1}%
+ \TEXendofparameter
+ \fi
+ \else
+ \TEXendofcommand
+ \getpretty{#1}%
+ \fi
+ \fi}
+
+\gdef\TEXtypeseven#1%
+ {\ifnotfirstinTEXcommand#1
+ \TEXbeginofcommand
+ \getpretty{#1}%
+ \fi}
+
+\gdef\TEXtypeeightA#1#2%
+ {\getprettydata{#2}%
+ \ifnum\prettytype=80
+ \TEXendofparameter
+ \ifsplitTEXcontrols
+ \ifinTEXcommand
+ \def\next{\TEXendofcommand\getpretty{#1}\getpretty{#1}\TEXbeginofcommand}%
+ \else
+ \def\next{\getpretty{#1}\getpretty{#1}}%
+ \fi
+ \else
+ \def\next{\getpretty{#1}\getpretty{#1}}%
+ \fi
+ \else
+ \def\next{\TEXtypeeightB{#1}#2}%
+ \fi
+ \next}
+
+\gdef\TEXtypeeightB%
+ {\TEXendofparameter
+ \ifinTEXcommand
+ \firstinTEXcommandfalse
+ \expandafter\getpretty
+ \else
+ \expandafter\TEXtypethree
+ \fi}
+
+\gdef\TEXtypeeight%
+ {\handlenextnextpretty\TEXtypeeightA\TEXtypeeightB}
+
+\gdef\TEXtypenine%
+ {\TEXendofparameter
+ \global\firstinTEXcommandfalse
+ \getpretty}
+
+% \gdef\TEXtypezero%
+% {\handlenewpretty\TEXtypethree}
+
+\gdef\TEXtypezero%
+ {\ifnewpretty\expandafter\handlenewpretty\fi\TEXtypethree}
+
+\protect
+
+\endinput
+
\ No newline at end of file |