diff options
Diffstat (limited to 'tex')
113 files changed, 94385 insertions, 85677 deletions
diff --git a/tex/context/base/colo-ini.tex b/tex/context/base/colo-ini.tex index 5f051a5d7..1ba4603db 100644 --- a/tex/context/base/colo-ini.tex +++ b/tex/context/base/colo-ini.tex @@ -1,1423 +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}{K:k}
-%D \stoptypen
-%D
-%D Gray scales are specified with the \type{k} parameter,
-%D the same as used in \kap{CMYK} specifications.
-
-\def\colorlist{}
-
-\def\@@cl@@z{0}
-\def\@@cl@@o{1}
-
-\def\definecolor%
- {\dodoubleargument\dodefinecolor}
-
-\def\dodefinecolor[#1][#2]%
- {\redoglobal\addtocommalist{#1}\colorlist
- \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
- \getparameters[\??cl @@][#2]%
- \doifelse{\@@cl@@r\@@cl@@g\@@cl@@b}{\@@cl@@z\@@cl@@z\@@cl@@z}
- {\doifelse{\@@cl@@c\@@cl@@m\@@cl@@y}{\@@cl@@z\@@cl@@z\@@cl@@z}
- {\doifelse{\@@cl@@k}{\@@cl@@z}
- {\showmessage{\m!colors}{8}{{[#2]},#1}%
- \redoglobal\setevalue{\??cr#1}{K:\@@cl@@z}}
- {\redoglobal\setevalue{\??cr#1}{K:\@@cl@@k}}}
- {\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 {\tttf \f!colorprefix}. Loading
-%D such a file is done by
-%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%
- {\readsysfile{\f!colorprefix##1}%
- {\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 \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@@k
- \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@@k
- \fi\fi\fi
- \egroup}
-
-\def\dostartcolormodeK#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@@k
-%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\convertRGBtoCMYKvalue#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@@k{\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{\@@clconversie}{\v!ja}
- {\preferGRAYtrue}
- {\preferGRAYfalse}%
- \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}%
- \ifRGBsupported
- \converttoGRAYfalse
- \else\ifCMYKsupported
- \converttoGRAYfalse
- \else
- \converttoGRAYtrue
- \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]}
-
-%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.
-
-\def\startcolorpage%
- {\bgroup
- \def\docolormark##1{}%
- \edef\savedcolorlevel{\the\colorlevel}%
- \ifnum\colorlevel>0
- \stopcolormode
- \fi
- \global\colorlevel=0\relax}
-
-\def\stopcolorpage%
- {\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\doformatcolorK#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@@k}
-
-\def\doformatgrayC#1:#2:#3:#4\od%
- {\convertCMYKtoGRAY{#1}{#2}{#3}{#4}%
- \dodoformatcolor\@@cl@@k}
-
-\def\doformatgrayK#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).
-
-\def\definepalet%
- {\dodoubleargument\dodefinepalet}
-
-\def\dodefinepalet[#1][#2]%
- {\setvalue{\??pa#1}{}%
- \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}{G:0}}}%
- \def\dododefinepalet##1%
- {\dodododefinepalet[##1]}%
- \processcommalist[#2]\dododefinepalet}
-
-%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\showhorizontalpalet[#1][#2]%
- {\localvbox
- {\offinterlineskip
- \!!widtha=\hsize
- \doifinsetelse{\v!naam}{#2}
- {\!!widthb=5em}
- {\!!widthb=\!!zeropoint}
- \advance\!!widtha by -\!!widthb
- \getcommacommandsize[\getvalue{\??pa#1}]
- \divide\!!widtha by \commalistsize
- \setuppalet[#1]
- \doifinset{\v!nummer}{#2}%
- {\def\doshowpalet##1%
- {\hbox to \!!widtha{\hss\strut##1\hss}}
- \hbox{\hskip\!!widthb\processpalet[#1]\doshowpalet}
- \endgraf}
- \def\doshowpalet##1%
- {\color[##1]{\vrule\!!width\!!widtha\!!height\ht\strutbox}}
- \hbox
- {\ifdim\!!widthb>\!!zeropoint\relax
- \hbox to \!!widthb{\hss#1\hskip.75em}%
- \fi
- \processpalet[#1]\doshowpalet}
- \endgraf
- \def\doshowpalet##1%
- {\gray[##1]{\vrule\!!width\!!widtha\!!depth\dp\strutbox}}
- \hbox{\hskip\!!widthb\processpalet[#1]\doshowpalet}
- \endgraf
- \doifinset{\v!waarde}{#2}
- {\def\doshowpalet##1%
- {\vbox
- {\hsize\!!widtha
- \vskip.25ex
- \everypar{\strut}
- \veryraggedcenter
- \let\colorformatseparator=\endgraf
- \colorvalue{##1}}}
- \hbox{\hskip\!!widthb\processpalet[#1]\doshowpalet}}}}
-
-\def\showverticalpalet[#1][#2]%
- {\localvbox
- {\offinterlineskip
- \setuppalet[#1]
- \def\rule%
- {\vrule\!!width3em\!!height\ht\strutbox\!!depth\dp\strutbox}
- \doifinsetelse{\v!nummer}{#2}
- {\!!widthb=5em}
- {\!!widthb=\!!zeropoint}
- \advance\!!widtha by \!!widthb
- \doifinset{\v!naam}{#2}
- {\hbox{\hskip\!!widthb\hbox to 6em{\hss\strut#1\hss}}
- \endgraf}
- \def\doshowpalet##1%
- {\hbox
- {\ifdim\!!widthb>\!!zeropoint
- \hbox to \!!widthb{\hss##1\hskip.75em}%
- \fi
- \color[##1]{\rule}%
- \gray[##1]{\rule}%
- \doifinset{\v!waarde}{#2}%
- {\hbox to 7em{\hskip.75em\colorvalue{##1}\hss}}}
- \endgraf}
- \processpalet[#1]\doshowpalet}}
-
-\def\processpalet[#1]%
- {\processcommacommand[\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{K},
- \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
- \!!widtha=\hsize
- \setuppalet
- \!!counta=0
- \dorecurse{15}
- {\doifdefined{\??cr#1:\recurselevel}{\advance\!!counta by 1}}
- \doifinsetelse{\v!naam}{#2}
- {\!!widthb=5em}
- {\!!widthb=\!!zeropoint}
- \advance\!!widtha by -\!!widthb
- \divide\!!widtha by \!!counta
- \doifinset{\v!nummer}{#2}
- {\hbox
- {\hskip\!!widthb
- \dorecurse{\!!counta}
- {\hbox to \!!widtha{\hss\strut\recurselevel\hss}}}
- \endgraf}
- \hbox
- {\ifdim\!!widthb>\!!zeropoint
- \hbox to \!!widthb{\hss#1\hskip.75em}%
- \fi
- \dorecurse{\!!counta}
- {\vbox
- {\hsize\!!widtha
- \color[#1:\recurselevel]
- {\vrule\!!width\!!widtha\!!height\ht\strutbox}
- \endgraf
- \gray[#1:\recurselevel]
- {\vrule\!!width\!!widtha\!!depth\dp\strutbox}}}}%
- \endgraf
- \doifinset{\v!waarde}{#2}
- {\hbox
- {\hskip\!!widthb
- \dorecurse{\!!counta}
- {\vbox
- {\hsize\!!widtha
- \vskip.25ex
- \everypar{\strut}
- \veryraggedcenter
- \let\colorformatseparator=\endgraf
- \colorvalue{#1:\recurselevel}}}}}}}
-
-\def\showverticalcolorgroup[#1][#2]%
- {\localvbox
- {\offinterlineskip
- \setuppalet
- \def\rule%
- {\vrule\!!width2.5em\!!height\ht\strutbox\!!depth\dp\strutbox}
- \doifinsetelse{\v!nummer}{#2}
- {\!!widthb=2em}
- {\!!widthb=\!!zeropoint}
- \doifinset{\v!naam}{#2}
- {\hbox{\hskip\!!widthb\hbox to 5em{\hss\strut#1\hss}}
- \endgraf}
- \dorecurse{15}
- {\doifdefined{\??cr#1:\recurselevel}
- {\hbox
- {\ifdim\!!widthb>\!!zeropoint
- \hbox to \!!widthb{\hss\recurselevel\hskip.75em}%
- \fi
- \color[#1:\recurselevel]{\rule}%
- \gray[#1:\recurselevel]{\rule}%
- \doifinset{\v!waarde}{#2}%
- {\hbox to 7em{\hskip.75em\colorvalue{#1:\recurselevel}\hss}}}
- \endgraf}}}}
-
-%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 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!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
-
\ No newline at end of file +%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 3ea42994e..717e4799d 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 df2896b08..c4a7f0ddb 100644 --- a/tex/context/base/cont-de.tex +++ b/tex/context/base/cont-de.tex @@ -1,22 +1,21 @@ -%D \module
-%D [ file=cont-en,
-%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
-
\ No newline at end of file +%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 5720142a5..eec7fa56c 100644 --- a/tex/context/base/cont-en.tex +++ b/tex/context/base/cont-en.tex @@ -1,22 +1,21 @@ -%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 +%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 diff --git a/tex/context/base/cont-fil.tex b/tex/context/base/cont-fil.tex new file mode 100644 index 000000000..b11190bea --- /dev/null +++ b/tex/context/base/cont-fil.tex @@ -0,0 +1,19 @@ +%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] diff --git a/tex/context/base/cont-log.tex b/tex/context/base/cont-log.tex index 355cd14a3..5ab8abe47 100644 --- a/tex/context/base/cont-log.tex +++ b/tex/context/base/cont-log.tex @@ -1,108 +1,128 @@ -%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=J. Hagen]
-
-\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.
-
-\unprotect
-
-\def\TeX%
- {T%
- \kern-.1667em\lower.5ex\hbox{E}%
- \kern-.125emX}
-
-\def\ConTeXt%
- {C\kern-.0333emO\kern-.0333emN\kern-.0333em\TeX\kern-.0333emT}
-
-\def\PPCHTeX%
- {PPCH\TeX}
-
-\def\LaTeX%
- {{L%
- \kern-.30em\raise.3ex\hbox{\tfxx A}%
- \kern-.18em\TeX}}
-
-\def\TaBlE%
- {T%
- \kern-.27em\lower.5ex\hbox{A}%
- \kern-.18em B%
- \kern-.1em\lower.5ex\hbox{L}%
- \kern-.075em E}
-
-\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 diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex new file mode 100644 index 000000000..9b8a2fe71 --- /dev/null +++ b/tex/context/base/cont-new.tex @@ -0,0 +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 diff --git a/tex/context/base/cont-nl.tex b/tex/context/base/cont-nl.tex index d8a2a602e..5731d81cb 100644 --- a/tex/context/base/cont-nl.tex +++ b/tex/context/base/cont-nl.tex @@ -1,22 +1,21 @@ -%D \module
-%D [ file=cont-en,
-%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
-
\ No newline at end of file +%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 8cb6d7a11..f6bc9e058 100644 --- a/tex/context/base/cont-usr.tex +++ b/tex/context/base/cont-usr.tex @@ -1,51 +1,49 @@ -%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
-
\ No newline at end of file +%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 diff --git a/tex/context/base/context.rme b/tex/context/base/context.rme deleted file mode 100644 index 553088fdc..000000000 --- a/tex/context/base/context.rme +++ /dev/null @@ -1,48 +0,0 @@ -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 b36a02f78..7e8a286c7 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -1,150 +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 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-ver.tex
-\input supp-box.tex
-\input supp-mrk.tex
-\input supp-vis.tex
-\input supp-mul.tex
-\input supp-fun.tex
-\input supp-pdf.tex
-\input supp-spe.tex
-\input supp-mps.tex
-\input supp-tpi.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 spec-ini.tex
-\input colo-ini.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 The special modules need some additional macro's:
-
-\input spec-mis.tex
-
-%D Next we load some core macro's. These implement the
-%D macros' that are seen by the users.
-
-\input core-gen.tex
-\input core-mak.tex
-\input core-fil.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-01a.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-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 Dumping the format is all that's left to be done.
-
-\dump
-
\ No newline at end of file +%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 263c6d982..0e6983f07 100644 --- a/tex/context/base/core-01a.tex +++ b/tex/context/base/core-01a.tex @@ -1,15745 +1,16242 @@ -%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.
-
-% \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
-
-% 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]
-
-% 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 \everycorps \EveryCorps % just to be sure
-
-\appendtoks \setnormalbaselines \to \everycorps
-\appendtoks \setstrut \to \everycorps
-\appendtoks \settopskip \to \everycorps
-\appendtoks \setmaxdepth \to \everycorps
-\appendtoks \stelinspringenin \to \everycorps
-\appendtoks \stelblankoin \to \everycorps
-\appendtoks \stelwitruimtein \to \everycorps
-
-% \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
-\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
-\stopmessages
-
-\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
-\stopmessages
-
-\startmessages dutch library: references
- title: verwijzingen
- 1: verwijzing -- onbekend
- 2: dubbele verwijzing -- op pagina --
-\stopmessages
-
-\startmessages english library: references
- title: references
- 1: unknown reference --
- 2: duplicate reference -- on page --
-\stopmessages
-
-\startmessages german library: references
- title: referenzen
- 1: unbekannte Referenz --
- 2: doppelte Referenz -- auf Seite --
-\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
-\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
-\stopmessages
-
-\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
-\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%
- {\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
-
-\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}
-
-\let\systemtopskipfactor = \topskipfactor
-\let\systemmaxdepthfactor = \maxdepthfactor
-
-% De onderstaande definitie wordt in de font-module overruled
-
-\ifx\globalcorpssize\undefined
- \newdimen\globalcorpssize \globalcorpssize=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%
- {\topskip=
- \systemtopskipfactor\globalcorpssize
- \ifr@ggedbottom\!!plus5\globalcorpssize\fi
- \relax}
-
-\def\setmaxdepth%
- {\maxdepth=\systemmaxdepthfactor\globalcorpssize}
-
-\def\normalbaselines%
- {\baselineskip\normalbaselineskip
- \lineskip\normallineskip
- \lineskiplimit\normallineskiplimit}
-
-\def\setnormalbaselines%
- {\lineheight=\normallineheight
- \openlineheight=\spacingfactor\lineheight
- \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%
- {\edef\spacingfactor{#1}%
- \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
- \kern-\strutwidth}}}
-
-\def\setteststrut%
- {\def\strutwidth{.8pt}%
- \setstrut}
-
-\def\begstrut%
- {\ifdim\ht\strutbox=\!!zeropoint\relax\else
- \strut
- \normalpenalty\!!tenthousand
- \normalhskip\!!zeropoint
- \ignorespaces
- \fi}
-
-\def\endstrut%
- {\ifdim\ht\strutbox=\!!zeropoint\relax\else
- \unskip
- \normalpenalty\!!tenthousand
- \normalhskip\!!zeropoint
- \strut
- \fi}
-
-\def\setnostrut%
- {\setbox\strutbox=\normalhbox{\normalhbox{}}%
- \def\strut{}%
- \def\endstrut{}%
- \def\begstrut{}}
-
-\def\resetteststrut%
- {\let\strutwidth=\!!zeropoint
- \setstrut}
-
-\def\setfontparameters%
- {\the\everycorps}
-
-% \setnormalbaselines
-% \setstrut
-% \settopskip
-% \setmaxdepth
-% \the\EveryFontSwitch
-
-\newskip\oldbaselineskip
-\newskip\oldlineskip
-\newskip\oldlineskiplimit
-
-\newif\ifinterlineskipoff
-
-\def\offinterlineskip%
- {\ifinterlineskipoff\else
- \interlineskipofftrue
- \oldbaselineskip=\baselineskip
- \oldlineskip=\lineskip
- \oldlineskiplimit=\lineskiplimit
- \fi
- \baselineskip-1000\p@ % knuth's value
- \lineskip\z@ % knuth's value
- \lineskiplimit\maxdimen} % knuth's value
-
-\def\oninterlineskip%
- {\ifinterlineskipoff
- \baselineskip=\oldbaselineskip
- \lineskip=\oldlineskip
- \lineskiplimit=\oldlineskiplimit
- \fi}
-
-\def\leaveoutervmode%
- {\ifvmode\ifinner\else
- \leavevmode
- \fi\fi}
-
-%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
-
-\def\getnoflines#1%
- {\dimen0=#1\relax
- \ifdim\dimen0=\!!zeropoint\relax
- \noflines=0\relax
- \else
- \divide\dimen0 by \openlineheight
- \noflines=\dimen0
- \advance\noflines by 1\relax
- \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\writeutilitycommand#1%
- {\write\uti{c \string#1}}
-
-\def\openutilities%
- {\immediate\openout\uti=\jobname
- \ifselecteren
- .\f!temporaryextension
- \else
- .\f!inputextension
- \fi
- \immediate\writeutilitycommand%
- {\thisisutilityversion{\utilityversion}}}
-
-\def\closeutilities%
- {\savenofsubpages
- \savenofpages
- \immediate\closeout\uti}
-
-\def\utilityresetlist{}
-
-\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}
-
-\def\doifonevenpaginaelse#1#2%
- {\ifodd\userpageno#1\else#2\fi}
-
-\def\doifbothsidesoverruled#1\orsideone#2\orsidetwo#3\od%
- {\ifdubbelzijdig
- \ifodd\userpageno#2\relax\else#3\relax\fi
- \else
- #1\relax
- \fi}
-
-\def\doifbothsides#1\orsideone#2\orsidetwo#3\od%
- {\ifdubbelzijdig
- \ifenkelzijdig
- #1\relax
- \else
- \ifodd\userpageno#2\relax\else#3\relax\fi
- \fi
- \else
- #1\relax
- \fi}
-
-%I n=Lokaliteit
-%I c=\startlokaal
-%I
-%I Een aantal instellingen hebben een globaal karakter,
-%I bijvoorbeeld die met betrekking tot de zetspiegel.
-%I Dergelijke instellingen kunnen eventueel lokaal worden
-%I gehouden door ze tussen de volgende commando's te
-%I instellingen plaatsen:
-%I
-%I \startlokaal
-%I \stoplokaal
-
-\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\startlokaal {\dostartglobaldefs>-}
-\def\stoplokaal {\dostopglobaldefs}
-\def\startglobaal {\dostartglobaldefs<+}
-\def\stopglobaal {\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]
- [\c!breedte=\@@ppbreedte,\c!hoogte=\@@pphoogte,#2]}
-
-\def\definieerpapierformaat%
- {\dodoubleargument\dodefinieerpapierformaat}
-
-\definieerpapierformaat[][\c!breedte=210mm,\c!hoogte=297mm]
-
-\def\dostelpapierformaatin[#1][#2]%
- {\doifdefined{\??pp#1\c!breedte}
- {\gdef\papierformaat{#1}%
- \global\papierbreedte=\getvalue{\??pp#1\c!breedte}%
- \global\papierhoogte=\getvalue{\??pp#1\c!hoogte}%
- \doifdefinedelse{\??pp#2\c!breedte}
- {\global\printpapierbreedte=\getvalue{\??pp#2\c!breedte}%
- \global\printpapierhoogte=\getvalue{\??pp#2\c!hoogte}}
- {\global\printpapierbreedte=\papierbreedte
- \global\printpapierhoogte=\papierhoogte}%
-\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\zetbreedte=\@@lybreedte
- %\global\zethoogte=\@@lyhoogte
- \global\rugwit=\@@lyrugwit
- \global\kopwit=\@@lykopwit
- \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{\@@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}%
- \rugoffset=\@@lyrugoffset
- \kopoffset=\@@lykopoffset
- \calculatehsizes
- \calculatevsizes
- \global\newlogostrue
- \global\newbackgroundtrue}
-
-\def\dostellayoutin[#1]%
- {\ConvertToConstant\doifnot{#1}{\v!reset}
- {\getparameters[\??ly][#1]%
- \checkforems[#1]}%
- \resetlayout}
-
-\def\stellayoutin%
- {\dosingleargument\dostellayoutin}
-
-\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
- \calculatevsizes
- \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][#1]%
- \pushpagedimensions
- \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
- \showmessage{\m!layouts}{1}{\@@zahoogte,\realfolio}%
- \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=\steluit,\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 of
-%I
-%I \steluit{...}
-%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
-
-\newbox\postponedblocks
-
-\def\douitstellen%
- {\ifnum\nofpostponedblocks>0
- \showmessage{\m!layouts}{2}{\nofpostponedblocks}%
- \unvbox\postponedblocks
- \doglobal\newcounter\nofpostponedblocks
- \fi}
-
-\def\startuitstellen%
- {\doglobal\increment\nofpostponedblocks
- \showmessage{\m!layouts}{3}{\nofpostponedblocks}%
- \global\setbox\postponedblocks=\vbox
- \bgroup
- \unvbox\postponedblocks
- \let\stopuitstellen=\egroup}
-
-\def\steluit%
- {\startuitstellen\let\next=}
-
-%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)
-
-\countdef\subpageno = 2 \subpageno = 0 % !!
-
-\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}%
- \immediate\writeutilitycommand%
- {\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
- \setdummypagereference{\v!eerste\v!sub\v!pagina}\firstsubpage
- \setdummypagereference{\v!laatste\v!sub\v!pagina}\lastsubpage
- \bgroup
- \ifnum\realpageno=\firstsubpage\relax
- \global\let\prevsubpage=\firstsubpage
- \else
- \xdef\prevsubpage{\realfolio}%
- \doglobal\decrement\prevsubpage
- \fi
- \setdummypagereference{\v!vorige\v!sub\v!pagina}\prevsubpage
- \ifnum\realpageno=\lastsubpage\relax
- \global\let\nextsubpage=\lastsubpage
- \else
- \xdef\nextsubpage{\realfolio}%
- \doglobal\increment\nextsubpage
- \fi
- \setdummypagereference{\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.
-
-% we don't want conflicts when \pageno is used by other
-% packages, like CWEB, so we redefine \pageno
-
-\countdef\realpageno = 0 \realpageno = 1
-\countdef\userpageno = 1 \userpageno = 1
-\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}
-
-\newif\ifrealpagechecked \realpagecheckedfalse
-
-\def\setdummypagereference#1#2%
- {\setreference{#1}{}{#2}{\r!page}}
-
-\def\gotonextrealpage%
- {\global\advance\realpageno by 1
- \ifnum\realpageno>\lastpage
- \gdef\lastpage{\realfolio}%
- \fi
- \setdummypagereference{\v!eerste\v!pagina}\firstpage
- \setdummypagereference{\v!laatste\v!pagina}\lastpage
- \bgroup
- \ifnum\realpageno>1
- \advance\realpageno by -1
- \xdef\prevpage{\realfolio}%
- \else
- \global\let\prevpage=\firstpage
- \fi
- \setdummypagereference{\v!vorige\v!pagina}\realfolio
- \egroup
- \bgroup
- \ifnum\realpageno<\lastpage\relax
- \advance\realpageno by 1
- \xdef\nextpage{\realfolio}%
- \else
- \global\let\nextpage=\lastpage
- \fi
- \setdummypagereference{\v!volgende\v!pagina}\realfolio
- \egroup}
-
-\def\checkrealpage%
- {\ifrealpagechecked\else
- \global\realpageno=0
- \gotonextrealpage
- \global\realpagecheckedtrue
- \fi}
-
-\def\realnumberofpages#1% meteen laden, voor andere files (met refs)
- {\gdef\lastpage{#1}%
- \global\let\realnumberofpages=\gobbleoneargument}
-
-\def\savenofpages%
- {\advance\realpageno by -1
- \immediate\writeutilitycommand{\realnumberofpages{\realfolio}}}%
-
-\def\totaalaantalpaginas%
- {\lastpage}
-
-\def\myshipout#1%
- {\voorpagina
- \dontshowcomposition
- \dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}%
-\dolocationstartup
- \shipout\vbox
- {\forgetall % needed !
- \offinterlineskip
- \vskip\kopoffset\vskip-1in
- \hskip\rugoffset\hskip-1in
- \mindermeldingen
- \thisisrealpage{\realfolio}#1}%
- \gotonextrealpage
- \napagina}
-
-\def\noshipout#1%
- {\setbox0=\hbox{\dopagebody{#1}}%
- \deadcycles=0%
- \gotonextrealpage}
-
-\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 : tekst, floats en footnotes
-% \dopagebody#1 : 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{}}
-
-\def\dopagecontents#1%
- {\dotopinsertions
- \bgroup
- \forgetall
- \boxmaxdepth=\maxdepth
- \dimen0=\dp255 % #1 komt dus nog te vervallen
- \bgroup
- #1\relax
- \pushcolor
- \dobotinsertions
- \egroup
- \ifr@ggedbottom
- \kern-\dimen0
- \vfil
- \fi
- \ifb@selinebottom
- \kern-\dimen0
- \kern\maxdepth
- \fi
- \egroup
- \placefootnotes}
-
-\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
-
-\def\plaatstekstblok#1%
- {\hbox to \zetbreedte
- {\vbox to \teksthoogte
- {\offinterlineskip
- \boxmaxdepth\maxdepth
- \dopagecontents{#1}}%
- \hss}}
-
-\def\getmainbox#1%
- {\setbox0=\vbox
- {\offinterlineskip % na \paginaletter !
- \calculatereducedvsizes
- \calculatehsizes
- \swapmargins
- \vskip\hoofdhoogte
- \vskip\hoofdafstand
- \hbox
- {\bgroup
- \swapmargins
- \goleftonpage
- \plaatslinkerrandblok
- \hskip\linkerrandafstand
- \showpageseparation
- \plaatslinkermargeblok
- \hskip\linkermargeafstand
- \egroup
- \plaatstekstblok{#1}%
- \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%
- {\processaction
- [\@@lyplaats]
- [ \v!midden=>\setbox#1=\vbox to \printpapierhoogte
- {\vss
- \hbox to \printpapierbreedte{\hss\box#1\hss}%
- \vss},
- \v!dubbelzijdig=>\setbox#1=\vbox
- {\doifbothsides
- \orsideone
- \orsidetwo
- \hskip\printpapierbreedte
- \hskip-\papierbreedte
- \hskip-2\rugoffset
- \od
- \box#1}]}
-
-\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\addpagecutmarks#1%
- {\doif{\@@lymarkering}{\v!aan}
- {\makecutbox#1}}
-
-\def\buildpagebody#1%
- {%\setpagedisplacement
- \vbox
- {\forgetall
- \mindermeldingen
- \setbox0=\vbox
- {%\paginaletter
- \doconvertfont{\@@lyletter}{}%
- \offinterlineskip
- \getbackgroundbox
- \getlogobox
- \gettextboxes
- \getgridbox
- \getmainbox{#1}}%
- \buildpagebox0
- \addpagecutmarks0
- \addpagebackground0
- \centerpagebox0
- \box0}}
-
-\def\toongrid%
- {\let\getgridbox=\dogetgridbox}
-
-\let\getgridbox=\relax
-
-\def\dogetgridbox%
- {\bgroup
- \setbox0=\vbox
- {\vskip\hoofdhoogte
- \vskip\hoofdafstand
- \setbox0=\vbox to \teksthoogte
- {\forgetall
- \scratchdimen\teksthoogte
- \divide\scratchdimen by \lineheight
- \offinterlineskip
- \vskip\topskip
- \vskip-\ht\strutbox
- \dorecurse{\number\scratchdimen}
- {\strut\vrule
- \!!height \testrulewidth
- \!!depth \testrulewidth
- \!!width \tekstbreedte
- \par}
- \vfill}%
- \setbox2=\hbox to \tekstbreedte
- {\leaders
- \hbox
- {\vrule
- \!!height \teksthoogte
- \!!width 2\testrulewidth
- \kern1em}
- \hfill}%
- \wd0=\!!zeropoint
- \startoverlay
- \box0 \box2
- \stopoverlay}%
- \smashbox0
- \box0
- \egroup}
-
-\def\dopagebody#1%
- {\getallmarks
- \restoreglobalcorps
- \startcolorpage
- \gotonextsubpage
- \dontshowboxes
- \naastpagina
- \checkreferences
- \checkmargeblokken
- \dotoks\beforeeverypage
- \flushtoks\beforepage
- \inpagebodytrue
- \buildpagebody{#1}%
- \flushtoks\afterpage
- \dotoks\aftereverypage
- \resetpagina
- \updatelistreferences
- \resetlayoutregels % mischien in shipout
- \stopcolorpage}
-
-\def\beforefinaloutput%
- {}
-
-\def\afterfinaloutput%
- {\forgetall
- \vskip\!!zeropoint\relax
- \ifvoid255
- \else
- \unvbox255
- \penalty\outputpenalty
- \fi
- \ifnum\outputpenalty>-\@MM\relax
- \else
- \dosupereject
- \fi
- \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%
- {\beforefinaloutput
- \myshipout{\hbox{\dopagebody{#1}\setpagecounters}}%
- \afterfinaloutput
- \douitstellen
- \popcolor} % ... and here ...
-
-\def\donofinaloutput#1%
- {\beforefinaloutput
- \setpagecounters
- \message{[-\the\realpageno]}%
- \noshipout{#1}%
- \douitstellen
- \afterfinaloutput
- \popcolor} % ... and here
-
-\let\checkpageversion=\relax
-
-\def\finaloutput#1%
- {\checkpageversion
- \ifverwerken
- \ifgeselecteerd
- \dofinaloutput{#1}%
- \else
- \donofinaloutput{#1}%
- \fi
- \else
- \ifgeselecteerd
- \donofinaloutput{#1}%
- \else
- \dofinaloutput{#1}%
- \fi
- \fi
- \resetselectiepagina
- \verhoogpaginanummer
- \checkpagedimensions
- \ifnum\outputpenalty>-\@MM\relax
- \else
- \dosupereject
- \fi}
-
-\def\dooutput%
- {\finaloutput{\unvbox255}}
-
-\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]}
-
-\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\dostartopelkaar[#1]%
- {\par
- \ifvmode
- \edef\lastdoneparskip{\the\lastskip}%
- \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\startopelkaar%
- {\dosingleempty\dostartopelkaar}
-
-\def\stopopelkaar%
- {\par
-\ifvmode
- \egroup
- \ifdim\lastskip=\noparskipsignal\relax
- \removelastskip
- \geenwitruimte
- \vskip-\lastdoneparskip
- \vskip+\lastdoneparskip
- \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!unknown=>{\def\dorondomregelcorrectie{\blanko[#1]}},
- \s!default=>\let\dorondomregelcorrectie=\relax]%
- \dorondomregelcorrectie
- \startbaselinecorrection}
-
-\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]%
- {\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\regelafstand{\normalskipamount}
-
-\def\deblankoskip{\skipfactor\regelafstand}
-
-\def\laatsteblankoskip%
- {\blankoskip}
-
-\def\geenblanko%
- {\removelastskip}
-
-\def\dosingleblanko#1%
- {\assigndimension{#1}{\blankoskipamount}%
- {\smallskipamount}{\medskipamount}{\bigskipamount}%
- \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\hrule \!!height \!!zeropoint\relax,
- \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]%
- {\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=>\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}
- {\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}
-
-\def\stelkoppeltekenin%
- {\dodoubleargument\getparameters[\??kp]}
-
-\def\beginofsubsentence%
- {\ifdim\lastkern=\subsentencesignal \else
- \unskip
- \fi
- \ifdim\lastkern=\subsentencesignal
- \unskip
- \hskip\subsentenceskip
- \else
- \normalspace
- \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}
-
-\def\endofsubsentence%
- {\ifodd\subsentencelevel
- \getvalue{\??la\currentlanguage\c!rightsentence}%
- \else
- \getvalue{\??la\currentlanguage\c!rightsubsentence}%
- \fi
- \doglobal\decrement\subsentencelevel
- \kern\subsentencesignal
- \normalspace}
-
-\def\endofsubsentencespacing%
- {\ifdim\lastkern=\subsentencesignal \else
- \unskip
- \fi
- \ifdim\lastkern=\subsentencesignal
- \unskip
- \hskip\subsentenceskip
- \fi}
-
-\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\tooninstelling#1#2%
- {\hbox
- {\doifelse{#2}{\??ly}
- {\dimen0=\getvalue{#2#1}}
- {\dimen0=#2}%
- \hbox to 9em{\strut#1\hfill}%
- \hbox to 5em{\hfill\PtToCm{\the\dimen0}}%
- \hbox to 6em{\hfill\the\dimen0}%
- \doifnot{#2}{\??ly}
- {\hskip 1em{\tttf\string#2}}}%
- \par}
-
-\def\tooninstellingen% % engels maken
- {\noindent
- \vbox
- {\forgetall
- \mindermeldingen
- \tooninstelling{papierhoogte}\papierhoogte
- \tooninstelling{papierbreedte}\papierbreedte
- \tooninstelling{printpapierhoogte}\printpapierhoogte
- \tooninstelling{printpapierbreedte}\printpapierbreedte
- \tooninstelling{kopwit}\kopwit
- \tooninstelling{rugwit}\rugwit
- \tooninstelling{hoogte}\zethoogte
- \tooninstelling{breedte}\zetbreedte
- \tooninstelling{teksthoogte}\teksthoogte
- \tooninstelling{tekstbreedte}\tekstbreedte
- \tooninstelling{bovenafstand}\??ly
- \tooninstelling{hoofd}\hoofdhoogte
- \tooninstelling{hoofdafstand}\??ly
- \tooninstelling{boven}\bovenhoogte
- \tooninstelling{voetafstand}\??ly
- \tooninstelling{voet}\voethoogte
- \tooninstelling{onderafstand}\??ly
- \tooninstelling{onder}\onderhoogte
- \tooninstelling{linkerrand}\linkerrandbreedte
- \tooninstelling{linkerrandafstand}\??ly
- \tooninstelling{linkermarge}\linkermargebreedte
- \tooninstelling{linkermargeafstand}\??ly
- \tooninstelling{rechtermargeafstand}\??ly
- \tooninstelling{rechtermarge}\rechtermargebreedte
- \tooninstelling{rechterrandafstand}\??ly
- \tooninstelling{rechterrand}\rechterrandbreedte}}
-
-\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%
- {\immediate\writeutilitycommand%
- {\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}}}}%
- \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]%
- \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
-
-% alternatief zonder check en ietwat verwarrend
-%
-% \bgroup
-% \setvalue{\??dd#1\c!sectienummer}{\v!ja}%
-% \protectconversion
-% \maakvoorafgaandenummer[#1]%
-% \xdef\internaldoornummer{#3{#1}}%
-% \thisissomeinternal{#1}{\internaldoornummer}%
-% \doifelsevaluenothing{\??dd#1\c!koppeling} % checken
-% {\gotosomeinternal
-% {\getvalue{\??dd#1\c!koppeling}}
-% {\internaldoornummer}
-% {\copy0}
-% {}}
-% {\box0}%
-% \egroup
-% \rawreference{\s!num}{#5}{#3{#1}}%
-
-\def\special@@definitiewoord#1#2#3#4[#5]#6%
- {\getvalue{@@dodefinitiewoord\getvalue{\??dd#2#1\c!uitlijnen}}
- {\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}
- {\strut
- \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
- \strut\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!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!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}}}%
- \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 >= 200
-% \raggedness = 2 .. 6\korpsgrootte
-
-\def\leftraggedness {2\korpsgrootte}
-\def\rightraggedness {2\korpsgrootte}
-\def\middleraggedness {6\korpsgrootte}
-
-\def\setraggedness#1%
- {\ifnum\tolerance<200\relax % kleinere waarden
- \tolerance=200\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\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
-
-\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!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
- \stelvoetin[\c!status=\v!leeg]%
- \stelhoofdin[\c!status=\v!leeg]%
- \hardespatie
- \vfill
- \ejectpage
- \od},
- \s!unknown=>\doifnumberelse{#1}
- {\ejectinsert
- \ejectpage
- \loop
- \ifnum\userpageno<#1\relax
- \hardespatie
- \vfill
- \ejectinsert
- \ejectpage
- \repeat}
- {}]}
-
-\def\simplepagina%
- {\complexpagina[\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]}
- {\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]%
- {\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}
-
-\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!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
-
-\def\dodosetpagenumberlocation#1#2%
- {\ExpandFirstAfter\processallactionsinset
- [\@@nmplaats]
- [ \v!links=>\setvalue{\??tk#1\v!tekst\c!linkertekst}{#2},
- \v!rechts=>\setvalue{\??tk#1\v!tekst\c!rechtertekst}{#2},
- \v!midden=>\setvalue{\??tk#1\v!tekst\c!middentekst}{#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%
- {\dosingleargument\dostelnummeringin}
-
-\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\paginanummer%
- {\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}%
- \paginanummer
- \@@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\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%
- {\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%
- {\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}}%
- \doif{\@@koppeling}{}
- {\edef\@@koppeling{#1}}%
- \doif{\@@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
- {\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}%
- \ifkopprefix
- \stelrefererenin[\c!prefix=-]%
- \fi
- \getvalue{\e!volgende\@@sectie}%
- \ifkopnummer
- \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}}%
- \writesection{#1}{#4}{#5}%
- \else
- \doplaatskoptekst
- {#1}
- {\setsectionlistreference{\@@sectie}{#1}%
- \ExpandFirstAfter\soortpagina[\@@koppeling]%
- \rawpagereference{\s!sec}{#2}%
- \resetsectionmarks[\@@sectie]%
- \doschrijfnaarlijst{\@@koppeling}{}{#5}{\v!kop}}
- {#5}
- {\markeer[#1]{#5}}%
- \writesection{#1}{-}{#5}%
- \fi
- \ifkopprefix
- \ExpandFirstAfter\stelrefererenin[\c!prefix=\getvalue{\??ko#1\c!prefix}]%
- \fi
- \dosomebreak\nobreak
- \getvalue{\??ko#1\c!na}%
- \else
-\dohandelpaginaafB{#1}% toegevoegd ivm subpaginanr / tug sheets
- \ifkopprefix
- \stelrefererenin[\c!prefix=-]%
- \fi
- \getvalue{\e!volgende\@@sectie}%
- \setsectionlistreference{\@@sectie}{#1}%
- \resetsectionmarks[\@@sectie]%
- \markeer[#1]{#5}%
- \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\stelrefererenin[\c!prefix=\getvalue{\??ko#1\c!prefix}]%
- \fi
- \fi
- \else
- \ifplaatskop
- \handelpaginaaf{#1}%
- \doplaatskoptekst
- {#1}
- {\rawpagereference{\s!sec}{#2}}
- {#5}
- {}%
- \writesection{#1}{-}{#5}%
- \dosomebreak\nobreak
- \getvalue{\??ko#1\c!na}%
- \else
- % do nothing
- \fi
- \fi}
-
-\def\doplaatskoptekst#1#2#3#4%
- {\bgroup
- \forgetall
- %\showcomposition
- \mindermeldingen
- \postponefootnotes
- \def\localkopsetup%
- {\dolocalkopsetup{#1}}%
- \startsynchronisatie
- \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\dp\strutbox
- \stopsynchronisatie
- \egroup
- \noindentation}
-
-% \prevdepth\dp\strutbox is belangrijk, vergelijk naast elkaar:
-%
-% \onderwerp{test} \input tufte
-% \onderwerp{test} \strut \input tufte
-% \onderwerp{test} \plaatslijst[...]
-
-\def\doplaatskopnummertekst#1#2#3#4#5%
- {\bgroup
- \forgetall
- %\showcomposition
- \mindermeldingen
- \postponefootnotes
- \def\localkopsetup%
- {\dolocalkopsetup{#1}}%
- \startsynchronisatie
- \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\dp\strutbox
- \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}
-
-\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\plaatsgeenkop#1#2%
- {}
-
-% default == instellingen
-% koppeling == koppen, breaks, marks, enz.
-% sectie == nummering
-
-\def\@@kolijst{}
-
-\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}]}}%
- \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]%
- \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!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.
-
-\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}
-
-%I n=Verwijzingen
-%I c=\in,\op,\referentie,\stelrefererenin,\gebruikreferenties
-%I
-%I In elders gedefinieerde commando's opgegeven referenties
-%I kunnen worden opgeroepen met:
-%I
-%I \in[referentie]
-%I \op[referentie]
-%I
-%I Soms kunnen ook commando's als \infiguur[referentie] en
-%I \inhoofdstuk[referentie] worden gebruikt. Bovendien is
-%I het commando \oppagina[referentie] beschikbaar.
-%I
-%I Een verwijzing naar een pagina kan worden aangemaakt met:
-%I
-%I \tekstreferentie[referentie]{nummer of tekst}
-%I \paginareferentie[referentie]
-%I \referentie[referentie]{nummer of tekst}
-%P
-%I Er kunnen tegelijk meerdere referenties worden opgegeven:
-%I
-%I \tekstreferentie[ref1,ref2,ref3]{nummer of tekst}
-%I
-%I Dit kan overigens overal waar een [referentie] kan worden
-%I meegegeven, bijvoorbeeld bij hoofdstukken.
-%P
-%I Het refereren kan (tijdelijk) worden stopgezet met het
-%I commando:
-%I
-%I \stelrefererenin[status=,<sectie>nummer=,prefix=]
-%I
-%I waarbij 'start' en 'stop' mogelijke waarden zijn voor
-%I status. Een sectienummer (deelnummer, hoofdstuknummer
-%I enz.) kan 'ja of 'nee' zijn.
-%I
-%I Om verwarring te voorkomen kunnen binnen subdocumenten die
-%I niet naar elkaar verwijzen de referenties lokaal worden
-%I gehouden door een 'prefix' in te stellen. Eventueel kan een
-%I '+' wordt gebruikt om automatisch een nieuwe prefix in te
-%I stellen. Met '-' wordt de prefix gereset.
-%P
-%I Referenties van andere teksten kunnen worden geladen met
-%I het commando:
-%I
-%I \gebruikreferenties[filenaam]
-
-% hypertext-commando's
-
-% \gotoexternal {external reference} {text}
-% \gotointernal {internal reference} {text} {real pagenumber}
-% \gotorealpage {real pagenumber} {text}
-%
-% \thisisexternal {external reference}
-% \thisisinternal {internal reference}
-% \thisisrealpage {real pagenumber}
-%
-% \executecommand {command} {text}
-
-\def\gotoexternal #1#2{#2}
-\def\gotointernal #1#2#3{#2}
-\def\gotorealpage #1#2{#2}
-
-\def\thisisexternal #1{}
-\def\thisisinternal #1{}
-\def\thisisrealpage #1{}
-
-\def\executecommand #1#2{#2}
-
-% Het onderstaande commando zoekt zelf uit of sprake is van
-% interne verwijzing, een externe verwijzing of een
-% paginaverwijzing.
-%
-% \gotolocation {reference} {text}
-%
-% Beter is: \setreference{tag}{type}{page}{realpage}{text}
-% standaard extref, intref, pagref of nog anders nu
-% \crossref:...
-
-\newif\iflocation
-
-\def\ifinteractief{\iflocation}
-
-% alternatief 1: externe verwijzingen
-
-\def\gotolocation#1#2%
- {\doifreferencefoundelse{#1}
- {\gettextreference{#1}%
- \doifelse{\currenttextreference}{\r!page}
- {\getrealreference{#1}%
- \gotorealpage{\currentrealreference}{#2}}
- {\gotoexternal{#1}{#2}}}
- {\gotointernal{#1}{#2}{}}}
-
-\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%
- {\paginareferentie[\s!lst:#1\currentsectionformat]%
- \getrealreference{\s!lst:#1\previoussectionformat}%
- \doifnothing{\currentrealreference}{\edef\currentrealreference{\realfolio}}
- \setxvalue{\v!vorige\c!lokale#1}{\currentrealreference}%
- \getrealreference{\s!lst:#1\currentsectionformat}%
- \doifnothing{\currentrealreference}{\edef\currentrealreference{\realfolio}}
- \setxvalue{\c!huidige\c!lokale#1}{\currentrealreference}%
- \setreference{\v!vorige#1}{}{\getvalue{\v!vorige\c!lokale#1}}{\r!page}%
- \def\stoplistreferences{\dostoplistreferences}}
-
-\def\dostoplistreferences#1%
- {\iflijstgeplaatst
- \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal)
- \global\let\updatedlistreferences=\updatedlistreferences % een noodverbandje
- \gdef\updatelistreferences%
- {\def\docommando####1%
- {\setreference
- {\v!vorige####1}{}
- {\getvalue{\c!huidige\c!lokale####1}}{\r!page}}%
- \processcommacommand[\updatedlistreferences]\docommando
- \global\let\updatelistreferences=\relax
- \gdef\updatedlistreferences{}}%
- \fi}
-
-\def\stoplistreferences%
- {\gobbleoneargument}
-
-% alternatief 2: interne verwijzingen
-
-\def\gotolocation#1#2%
- {\doifreferencefoundelse{#1}
- {\gettextreference{#1}%
- \doifelse{\currenttextreference}{\r!page}
- {\getrealreference{#1}%
- \gotorealpage{\currentrealreference}{#2}}
- {\doifelse{\currenttextreference}{\r!exec}
- {\getrealreference{#1}%
- \executecommand{\currentrealreference}{#2}}
- {\doifelse{\currenttextreference}{\r!list} % speciaal
- {\getrealreference{#1}% % voor
- \gotointernal{\currentrealreference}{#2}{}} % lijsten
- {\gotoexternal{#1}{#2}}}}}
- {\gotointernal{#1}{#2}{}}}
-
-\let\gotoinnerlocation=\gotolocation
-
-\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%
- {\thisisinternal{\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}{}
- {\setreference
- {\v!vorige#1}{}{\realfolio}{}}
- {\setreference
- {\v!vorige#1}{}{\getvalue{\v!vorige\c!lokale#1}}{\r!list}}%
- \def\stoplistreferences{\dostoplistreferences}}
-
-\def\dostoplistreferences#1%
- {\iflijstgeplaatst
- \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal)
- \global\let\updatedlistreferences=\updatedlistreferences % een noodverbandje
- \gdef\updatelistreferences%
- {\def\docommando####1%
- {\setreference
- {\v!vorige####1}{}
- {\getvalue{\c!huidige\c!lokale####1}}{\r!list}}%
- \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}
-
-% Interne verwijzingen worden automatisch gegenereerd met
-%
-% \thisisnextinternal {tag}
-
-\newcount\locationcount
-\locationcount=0
-
-\def\nextinternalreference%
- {\the\locationcount}
-
-\def\thisisnextinternal#1%
- {\global\advance\locationcount by 1
-% \thisisinternal{\s!aut:#1:\nextinternalreference}} debugging
- \thisisinternal{\s!aut:\nextinternalreference}}
-
-\def\gotonextinternal#1#2#3#4%
-% {\gotointernal{\s!aut:#1:#2}{#3}{#4}} debugging
- {\gotointernal{\s!aut:#2}{#3}{#4}}
-
-% Als een interne verwijzing ook vanuit elders toegankelijk
-% moet zij, gebruiken we:
-%
-% \thisissomeinternal {tag} {data}
-% \gotosomeinternal {tag} {data} {} {}
-%
-% let op: geen commalist
-
-\def\thisissomeinternal#1#2% tag data
- {\doifsomething{#2}
- {\thisisinternal{#1:#2}}}
-
-\def\gotosomeinternal#1#2#3#4%
- {\gotointernal{#1:#2}{#3}{#4}}
-
-% Om historische redenen en omdat nog niet duidelijk is welke
-% interactieprogramma's zich nog zullen aandienen, worden
-% referenties zowel op naam als op paginanummer afgehandeld.
-%
-% Verwijzingen en ingangen in een inhoudsopgave en index
-% dienen daarom beide mechanismen te ondersteunen.
-%
-% Het wellicht op het eerste gezicht redundante referentie-format
-% ziet er als volgt uit:
-%
-% [formatted page"realpage"text"]
-
-\newif\ifrefereren
-
-\def\referencepagenumber[#1]%
- {\geentest % nodig i.v.m. scannen {tekst} bij [referentie] in \op
- {\paginaprefix\??rf[#1]%
- \translatednumber[#1]}}
-
-\def\getsomereference#1#2%
- {\edef\somereference{\getvalue{\r!cross\referenceprefix#2}}%
- \expandafter#1\expandafter[\somereference""""]}
-
-\def\currentpagereference{}
-\def\currentrealreference{}
-\def\currenttextreference{}
-
-\def\dogetpagereference[#1"#2"#3"#4]%
- {\doifelsenothing{#2}
- {\def\currentpagereference{}}
- {\def\currentpagereference{\referencepagenumber[#1]}}}
-
-\def\dogetrealreference[#1"#2"#3"#4]%
- {\edef\currentrealreference{#2}}
-
-\def\dogettextreference[#1"#2"#3"#4]%
- {\def\currenttextreference{#3}}
-
-\def\getpagereference{\getsomereference\dogetpagereference}
-\def\getrealreference{\getsomereference\dogetrealreference}
-\def\gettextreference{\getsomereference\dogettextreference}
-
-\def\fileprefix{}
-
-\def\setlocalreference#1#2#3#4%
- {\setevalue{\r!cross\fileprefix#1}{#2"#3"#4}}
-
-\def\setreference%
- {\global\setlocalreference}
-
-\def\setreferences%
- {\def\mainreference##1##2##3##4##5%
- {\doifundefinedelse{\r!cross\fileprefix##1##2}
- {\setxvalue{\r!cross\fileprefix##1##2}{##3"##4"##5}}
- {\showmessage{\m!references}{2}{[##1][##2],##4}}}}
-
-\def\resetreferences%
- {\def\mainreference##1##2##3##4##5{}}
-
-\resetreferences
-
-% beetje vreemde plaats, maar ja
-
-\def\setdummycommandreference#1#2%
- {\setreference{#1}{}{#2}{\r!exec}}
-
-% nog anders
-
-\setdummycommandreference {\v!FirstPage} {first}
-\setdummycommandreference {\v!PreviousPage} {previous}
-\setdummycommandreference {\v!NextPage} {next}
-\setdummycommandreference {\v!LastPage} {last}
-\setdummycommandreference {\v!PreviousJump} {backward}
-\setdummycommandreference {\v!NextJump} {forward}
-\setdummycommandreference {\v!SwapViewer} {swap}
-\setdummycommandreference {\v!ExitViewer} {exit}
-\setdummycommandreference {\v!CloseDocument} {close}
-\setdummycommandreference {\v!ViewerHelp} {help}
-\setdummycommandreference {\v!PrintDocument} {print}
-\setdummycommandreference {\v!SearchDocument} {search}
-\setdummycommandreference {\v!SearchAgain} {searchagain}
-
-%\def\writereference#1#2#3#4%
-% {\ifrefereren%
-% \doifsomething{#1}
-% {\bgroup
-% \reassignreferenceprefix{#1}%
-% \ExpandFirstAfter\thisisexternal{\referencevalues}%
-% \edef\dowritereference%
-% {\writeutilitycommand%
-% {\mainreference%
-% {\referenceprefix}%
-% {\referencevalues}%
-% {#2}%
-% {#3}%
-% {#4}}}%
-% \dowritereference
-% \egroup
-% \@EA\referentieinfo\@EA>\@EA{#1}}%
-% \fi}
-
-\def\writereference#1#2#3#4%
- {\ifrefereren
- \doifsomething{#1}
- {\bgroup
- \def\dowritereference##1%
- {\doifinstringelse{-:}{##1}
- {\removesubstring-:\from##1\to\referencevalues
- \def\referenceprefix{}}
- {\def\referencevalues{##1}}%
- \doifsomething{\referencevalues}
- {\thisisexternal{\referenceprefix\referencevalues}%
- \edef\dodowritereference%
- {\writeutilitycommand%
- {\mainreference%
- {\referenceprefix}{\referencevalues}%
- {#2}{#3}{#4}}}%
- \dodowritereference}}%
- \processcommalist[#1]\dowritereference
- \egroup
- \@EA\referentieinfo\@EA>\@EA{#1}}%
- \fi}
-
-\let\lastreference=\empty
-
-\def\rawpagereference#1#2% #1 kan weg
- {\def\lastreference{#2}%
- \makesectionformat
- \writereference
- {#2}%
- {\sectionformat::\noexpand\paginanummer}%
- {\noexpand\realfolio}%
- {}}
-
-\def\rawtextreference#1#2#3% #1 kan weg
- {\def\lastreference{#2}%
- \writereference
- {#2}%
- {}%
- {}%
- {#3}}%
-
-\def\rawreference#1#2#3% #1 kan weg
- {\def\lastreference{#2}%
- \makesectionformat
- \writereference
- {#2}%
- {\sectionformat::\noexpand\paginanummer}%
- {\noexpand\realfolio}%
- {#3}}
-
-\def\referenceprefix {}
-\def\unharmedreferenceprefix {\referenceprefix}
-
-\newif\ifreferencefound
-
-\def\doifreferencefoundelse#1#2#3%
- {\checkreferences
- \bgroup
- \let\unharmedreferenceprefix=\referenceprefix
- \bgroup
- \doifinstringelse{::}{#1}
- {\referencefoundtrue}
- {\doifdefinedelse{\r!cross\referenceprefix#1}
- {\referencefoundtrue}
- {\def\referenceprefix{}%
- \doifdefinedelse{\r!cross#1}
- {\referencefoundtrue}
- {\referencefoundfalse}}}%
- \doifvalue{\r!cross\referenceprefix#1}{""}
- {\referencefoundfalse}%
- \ifreferencefound
- #2%
- \egroup
- \else
- #3%
- \egroup
- \setreference{\referenceprefix#1}{}{}{}% message only once, uses prefix
- \fi
- \egroup}
-
-\def\dowithreferenceprefix#1#2%
- {\doifreferencefoundelse{#1}{#2}{}}
-
-\def\gebruikreferenties[#1]%
- {\doifundefined{\??rf:#1}
- {\setgvalue{\??rf:#1}{}% signal, nog eens '\v!done'
- \doutilities{references}{#1}{}{}{}}}
-
-\def\dostelrefererenin[#1]%
- {\getparameters[\??rf][#1]%
- \preparepaginaprefix{\??rf#1}%
- \processaction
- [\@@rfstatus]
- [ \v!stop=>\refererenfalse,
- \v!start=>\refererentrue]%
- \processaction % should be in cont-01d
- [\@@rfinteractie]
- [ \v!alles=>\let\dowantedreference=\docompletereference,
- \v!label=>\let\dowantedreference=\dolabelonlyreference,
- \v!tekst=>\let\dowantedreference=\dotextonlyreference,
- \v!symbool=>\let\dowantedreference=\dosymbolreference]%
- \doifinstringelse{\@@rfprefix}{#1} % yeah
- {\doifelsenothing{\@@rfprefix}
- {\edef\referenceprefix{}}
- {\processaction
- [\@@rfprefix]
- [ +=>\advance\prefixteller by 1 %
- \edef\referenceprefix{\the\prefixteller:},
- -=>\edef\referenceprefix{},
- \s!unknown=>\edef\referenceprefix{\@@rfprefix:}]%
- \def\@@rfprefix{}}}
- {}}
-
-%\def\reassignreferenceprefix#1%
-% {\doifinsetelse{-:}{#1}%
-% {\def\referenceprefix{}%
-% \aftersplitstring#1\at-:\to\referencevalues}
-% {\def\referencevalues{#1}}}
-
-\def\stelrefererenin%
- {\dosingleargument\dostelrefererenin}
-
-\def\doreferentie[#1]#2%
- {\rawreference{\s!ref}{#1}{#2}}
-
-\def\referentie%
- {\dosingleargument\doreferentie}
-
-\def\dotekstreferentie[#1]#2%
- {\rawtextreference{\s!txt}{#1}{#2}}
-
-\def\tekstreferentie%
- {\dosingleargument\dotekstreferentie}
-
-\def\dopaginareferentie[#1]%
- {\rawpagereference{\s!pag}{#1}}
-
-\def\paginareferentie%
- {\dosingleargument\dopaginareferentie}
-
-% \def\doreferentie[#1]#2%
-% {\bgroup
-% \convertargument#2\to\ascii
-% \rawreference{\s!ref}{#1}{\ascii}%
-% \egroup}
-%
-% \def\referentie%
-% {\dosingleargument\doreferentie}
-%
-% \def\dotekstreferentie[#1]#2%
-% {\bgroup
-% \convertargument#2\to\ascii
-% \rawtextreference{\s!txt}{#1}{\ascii}%
-% \egroup}
-%
-% \def\tekstreferentie%
-% {\dosingleargument\dotekstreferentie}
-
-% \newif\ifreferencesloaded
-% \referencesloadedfalse
-%
-% \def\checkreferences%
-% {\ifreferencesloaded\else
-% \global\referencesloadedtrue
-% {\setbox0=\hbox{\gebruikreferenties[\jobname]}}% get rid of spaces
-% \checkrealpage
-% \fi}
-%
-% efficienter: (scheelt 3 if-macro's)
-
-\def\checkreferences%
- {\bgroup
- \setbox0=\hbox{\gebruikreferenties[\jobname]}% get rid of spaces
- \checkrealpage
- \global\let\checkreferences=\relax
- \egroup}
-
-% Het referentie-mechanisme zal nog worden aangepast:
-%
-% <prefix><tag><keyword>
-%
-% De gebruikte macros krijgen dan de vorm: {}{}{}
-
-\def\unknownreference#1%
- {\ifvoorlopig
- \doifsomething{#1}
- {\inlinker
- {\infofont
- \dimen0=\linkermargebreedte
- \advance\dimen0 by -2em
- \doboundtext{#1}{\dimen0}{..}->}}%
- \fi
- \doifnotvalue{\r!cross#1}{""}
- {\showmessage{\m!references}{1}{[\unharmedreferenceprefix][#1]}}}
-
-\def\dummyreference%
- {{\tttf ??}}
-
-\let\domathmodein=\in
-
-\def\dotextmodein#1[#2]%
- {\doifreferencefoundelse{#2}
- {\gettextreference{#2}%
- \gotolocation
- {#2}
- {\dotextprefix{#1}\currenttextreference}}
- {\unknownreference{#1}%
- \dotextprefix{#1}\dummyreference}%
- \referentieinfo{<}{#2}}
-
-\def\in%
- {\ifmmode % hier nog eens een macro
- \let\next=\domathmodein % voor maken; zie |
- \else
- \let\next=\dotextmodein
- \fi
- \next}
-
-\def\op#1[#2]% er is een probleempje met spaties, zie ook pragma11.tex
- {\ignorespaces
- \bgroup % !! tijdelijk
- \let\ignorespaces=\relax % !! tijdelijk
- \doifreferencefoundelse{#2}
- {\getpagereference{#2}%
- \gotolocation
- {#2}
- {\dotextprefix{#1}\currentpagereference}}
- {\unknownreference{#1}%
- \dotextprefix{#1}\dummyreference}%
- \referentieinfo{<}{#2}%
- \egroup} % !! tijdelijk
-
-\def\oppagina[#1]% kan uit de pas lopen, checken e!!
- {\doifreferencefoundelse{#1}
- {\getrealreference{#1}%
- \doifelse{\realfolio}{\currentrealreference}
- {\v!hier\v!boven}
- {\c!op\ \op{\v!pagina}[#1]}}%
- {\unknownreference{#1}%
- \v!pagina~\dummyreference}}%
-
-%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]%
-% \begingroup
-% \inregelstrue
-% \stelinspringenin[\v!geen]%
-% \ignorespaces
-% \stelwitruimtein[\v!geen]%
-% \obeylines
-% \GotoPar}
-
-\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
- \hsmash{\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\inregel#1[#2]%
- {\doifelsenothing{#1}
- {\gettextreference{\@@rnprefix#2}%
- \doifinstringelse{--}{\currenttextreference}
- {\in{\labeltext{\v!regels}}[\@@rnprefix#2]}
- {\in{\labeltext{\v!regel}}[\@@rnprefix#2]}}
- {\in{#1}[\@@rnprefix#2]}}
-
-\def\dostartnummerenPAR%
- {\beginofshapebox
- \doglobal\newcounter\linereference}
-
-\def\dostopnummerenPAR%
- {\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}}%
- \setlocalreference{\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
- \gettextreference{\linereferencename}%
- \ifnum\linereferenceline<0\currenttextreference\relax % 0 prevents error
- \edef\linereferenceline{\linereferenceline--\currenttextreference}%
- \fi
- \fi
- \setlocalreference{\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}}%
- \gettextreference{\linereferencename}%
- \beforesplitstring\currenttextreference--\at--\to\firstline
- \ifnum\firstline=\scratchline\relax
- \tekstreferentie[\linereferencename]{\currenttextreference}%
- \setlocalreference{\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%
- {\def\crlf{}%
- \def\\{}}
-
-%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
- \hsize=\getvalue{\??do#1\c!breedte}%
- \parskip=\!!zeropoint\relax
- \parindent=\!!zeropoint\relax
- \getvalue{\??do#1\c!boven}}
-
-\def\dododostopopmaak[#1]%
- {\getvalue{\??do#1\c!onder}%
- \egroup}
-
-\def\doshipoutopmaak[#1]%
- {\bgroup
- \dimen0=\getvalue{\??do#1\c!voffset}%
- \dimen2=\getvalue{\??do#1\c!hoffset}%
- \dimen4=\dimen0\advance\dimen4 by \dimen2
- \ifdim\dimen4=\!!zeropoint\relax
- \getvalue{\??do#1\c!voor}%
- \box\opmaak
- \setopmaaklayout[#1]%
- \pagina
- \getvalue{\??do#1\c!na}%
- \ifdubbelzijdig
- \doifvalue{\??do#1\c!dubbelzijdig}{\v!ja}
- {\ifodd\realpageno\else
- \null
- \pagina
- \verlaagpaginanummer
- \fi}%
- \fi
- \verlaagpaginanummer
- \else
- \kopoffset=\dimen0
- \rugoffset=\dimen2
- %\setpagedisplacement
- \myshipout{\box\opmaak}
- \fi
- \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!ja,
- \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%
- {\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]%
- {\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}%
- {\stoptextfloat{#1}}%
- \setvalue{\e!start\e!reserveer#1\e!tekst}%
- {\doquadrupleempty\docomplexstartreserveertekstblok[#1]}%
- \setvalue{\e!stop\e!reserveer#1\e!tekst}%
- {\stoptextfloat{#1}}%
- \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\relax
- \witruimte % nog cheken op interferentie
- \kern\!!heighta\relax
- \fi
- \global\sidefloatvsize=\nofloatvsize
- \floatflagfalse}
-
-\def\flushsidefloatsafterpar%
- {\xdef\oldpagetotal{\the\pagetotal}%
- \gdef\checksidefloat%
- {\dochecksidefloat
- \ifdim\oldpagetotal=\pagetotal \else
- \xdef\checksidefloat{\dochecksidefloat}%
- \flushsidefloats
- \fi}}
-
-\let\logsidefloat=\relax
-
-\def\pushpenalties%
- {\let\oldwidowpenalty=\widowpenalty
- \let\oldclubpenalty=\clubpenalty
- \let\oldbrokenpenalty=\brokenpenalty
- \widowpenalty=1
- \clubpenalty=2
- \brokenpenalty=1
- \let\pushpenalties=\relax
- \def\poppenalties%
- {\widowpenalty=\oldwidowpenalty
- \clubpenalty=\oldclubpenalty
- \brokenpenalty=\oldbrokenpenalty}}
-
-\let\poppenalties=\relax
-
-\def\restorepenalties%
- {\ifnum\outputpenalty=\!!tenthousand\relax
- \else
- \penalty\outputpenalty
- \fi}
-
-\def\sidefloatoutput%
- {\iffloatshort
- \unvbox255\relax
- \setbox\floatbottom=\lastbox
- \ifdim\wd\floatbottom>\sidefloathsize
- \penalty-201\relax
- \box\floatbottom
- \else
- \ifvoid\floatbottom
- \else
- \restoreleftindent
- \ifdim\wd\floatbottom<\sidefloathsize
- \parskip=\!!zeropoint
- %\noindent
- \vadjust{\penalty-1}%
- \iffloatlefteqo
- \global\floatlefteqofalse
- \else
- \advance\sidefloathsize by -\wd\floatbottom
- \iffloatrighteqo
- \global\floatrighteqofalse
- \else
- \divide\sidefloathsize by 2\relax
- \fi
- \hskip\sidefloathsize
- \fi
- \fi
- \box\floatbottom
- \restorepenalties
- \fi
- \fi
- \global\holdinginserts=0\relax
- \global\floatshortfalse
- \else
- \finaloutput{\unvbox255}%
- \global\sidefloatvsize=\nofloatvsize
- \poppenalties
- \fi}
-
-\def\restoreleftindent%
- {\ifrightfloat
- \else
- \parskip=\!!zeropoint
- \noindent
- \vadjust{\penalty-1}%
- \hskip\sidefloatwidth
- \fi}
-
-\def\eqno%
- {\iffloatshort
- \global\floatrighteqotrue
- \fi
- \floatrighteqo}
-
-\def\leftmarginfloat#1%
- {\rightfloatfalse\marginfloattrue\putsidefloat{#1}}
-
-\def\rightmarginfloat#1%
- {\rightfloattrue\marginfloattrue\putsidefloat{#1}}
-
-\def\leftfloat#1%
- {\rightfloatfalse\marginfloatfalse\putsidefloat{#1}}
-
-\def\rightfloat#1%
- {\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\relax
- \floatflagfalse
- \else
- \advance\!!heighta by -\pagetotal
- \fi}
-
-\def\tosssidefloat%
- {\vfill\eject}
-
-\def\measuresidefloat%
- {\floatflagtrue
- \dimen3=\pagetotal
- \ifmarginfloat
- \sidefloatwidth=\!!zeropoint
- \else
- \sidefloatwidth=\wd\floatbox
- \advance\sidefloatwidth by \floatsideskip
- \fi
- \sidefloathsize=\hsize
- \advance\sidefloathsize by -\sidefloatwidth
- \sidefloatheight=\ht\floatbox
- %\advance\sidefloatheight by \dp\floatbox % NJET
- \advance\sidefloatheight by \sidefloattopskip
- \global\sidefloatvsize=\sidefloatheight
- \global\advance\sidefloatvsize by \dimen3\relax
- \dimen0=\sidefloatvsize
- \advance\dimen0 by -\baselineskip
- \ifdim\dimen0>.99\pagegoal
- \roomforfloatfalse
- \else
- \dimen0=\pagegoal
- \advance\dimen0 by -\sidefloatvsize
- \ifdim\dimen0<\sidefloatbottomskip
- \global\advance\sidefloatvsize by \dimen0\relax
- \floatshorttrue
- \pushpenalties
- \holdinginserts=1\relax
- \else
- \global\advance\sidefloatvsize\sidefloatbottomskip
- \floatshortfalse
- \fi
- \roomforfloattrue
- \fi}
-
-\def\setsidefloat%
- {\kern\sidefloattopskip
- \oldprevdepth=\prevdepth
- \nointerlineskip
- \bgroup
- \everypar={}\relax
- \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\relax
- \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\relax
- \advance\!!heighta by \sidefloatbottomskip
- \!!counta=\!!heighta\relax
- \divide\!!counta by \baselineskip
- \ifnum\!!counta>0\relax
- \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
- \floatshortfalse
- \tosssidefloat
- \else
- \kern\!!heighta\relax
- \fi
- \fi}
-
-\def\stallsidefloat%
- {\!!counta=\pageshrink
- \divide\!!counta by \baselineskip
- \advance\!!counta by 1\relax
- \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\setboxfloatbox=\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}%
- \null\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
- \unvbox\topins
- \fi
- \global\topinserted=\!!zeropoint\relax}
-
-\def\dobotinsertions%
- {\ifvoid\botins\else
- \ifr@ggedbottom % \vfill is nieuw
- \unvbox\botins\vfill
- \else
- \vfill\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}
-
-% 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
- {\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}}
-
-\def\sometextfloat[#1]% lang, links, rechts, hoog, midden, laag, offset
- {\checkwaitingfloats{#1}%
- \global\floattextwidth=\hsize
- \global\floatwidth=\wd\floatbox
- \global\floatheight=\ht\floatbox
- \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\stoptextfloat#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{\c!offset}{#1}{\witruimte\blanko}%
- \box\floattext
- \vfill}}}%
- \doifinsetelse{\c!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=\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 {\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{\dp\strutbox}%
- \global\floatsideskip=\@@bkmarge\relax
- \global\noftopfloats=\@@bknboven\relax
- \global\nofbotfloats=\@@bknonder\relax}}
-
-\newif\ifinsidefloat
-\insidefloatfalse
-
-\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}}}
- {\def\dofloatnummer%
- {}}}
-
-\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}}}
- {\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
- \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}%
- \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
- \setbox\floatbox=\vbox{#7}%
- \dimen0=\ht\floatbox
- \advance\dimen0 by \dp\floatbox
- \ifdim\dimen0=\!!zeropoint\relax
- \showmessage{\m!floatblocks}{11}{}%
- \setbox\floatbox=\vbox{\getvalue{\e!lege#3}}%
- \fi
- \ConvertToConstant\doifelse{#6}{\v!geen}
- {\setbox\floatbox=\vbox
- {\unvbox\floatbox
- \rawpagereference{\s!flt}{#2}}%
- \dofloat{#4}{}{#6}{#1}}
- {\doifelsevalue{\??kj#1\c!nummer}{\v!ja}
- {\verhoognummer[#1]%
- \maakhetnummer[#1]%
- \setbox\floatbox=\vbox
- {\unvbox\floatbox
- \dofloatreference
- \redofloatorder{#1}%
- \rawreference{\s!flt}{#2}{\hetnummer}%
- \doschrijfnaarlijst{#3}{\hetnummer}{#6}{#3}}%
- \dofloat{#4}{#5\hetnummer}{#6}{#1}}
- {\setbox\floatbox=\vbox
- {\unvbox\floatbox
- \rawpagereference{\s!flt}{#2}}%
- \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]}
-
-\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]%
- \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}%
- $$#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\formulenummer{\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}
- {$$#4\doleqno$$}
- {$$#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}{$$}
-\setvalue{\e!stop \e!formule}{$$}
-
-\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
-\newif\iffirstpagedone \firstpagedonefalse
-
-\def\shipoutfacingpage%
- {\iffacingpages
- \iffirstpagedone
- \setbox\facingpage=\vbox to \zethoogte
- {\kern\hoofdhoogte
- \kern\ht\topins % ?
- \kern\dp\topins % ?
- \kern\dp\strutbox % checken
- \box\facingpage
- \vfill}%
- \myshipout{\box\facingpage}%
- \fi
- \fi
- \global\setbox\facingpage=\box\voidb@x
- \global\firstpagedonetrue
- \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}
-
-%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\paginanummer}}
- {\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\paginanummer}}
- {\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\doplaatslijst[#1][#2]%
- {\begingroup
- \startopelkaar[\v!blanko]%
- \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}%
- \stopopelkaar
- \endgroup}
-
-\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}{\copy0}{#6}}
- {##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}{\copy0}{#6}}
- {\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}{\copy0}{#6}}
- {\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}{\copy0}{#7}}}
-
-\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%
-% {\switchtocorps[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}{\switchtcorps[5pt]\haalbuffer[kanweg]}
-%
-% \plaatsreferentielijst
-% [externalfigure,externaltable]
-
-% algemeen
-
-\def\referentiebutton#1[#2]%
- {\bgroup
- \def\referenceprefix{}%
- \setbox0=\hbox{\ignorespaces#1}%
- \doifreferencefoundelse{#2}
- {\hbox{\gotolocation{#2}{\copy0}}}
- {\unknownreference{#2}%
- \hbox{\copy0}}%
- \egroup}
-
-\newcounter\referencecounter
-
-\def\doreferentielijstelement#1#2#3#4#5%
- {\doiftoclevelelse[#4]
- {\getvalue{\??rl#1\c!voor}%
- \referentiebutton%
- {\getvalue{\??rl#1\c!commando}{#3}%
- \paginareferentie[\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\paginanummer}}
- {\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
- \paginareferentie[\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]%
- {\startopelkaar[\v!blanko]%
- \dostellijstin[#1][#2]%
- \doutilities{#1}{\jobname}{#1}{}{\par}%
- \stopopelkaar}
-
-\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}
- {\immediate\write\uti{s e {#1} {#2} {#3} {#4}}}
- {\convertargument#3\to\asciia
- \convertargument#4\to\asciib
- \immediate\write\uti{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}{\geentest\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%
- {\geentest\getsynonymmeaning{#1}{\??sm:#1:##1}}%
- \def#3##1%
- {\geentest\getvalue{\??sm:#1:##1}}%
- \setvalue{#1}%
- {\dotripleempty\docomplexsynonym[\??sm:#1:][#1]}%
- \else
- \def#3##1%
- {\geentest\getsynonymmeaning{#1}{##1}}%
- \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}
- {\immediate\write\uti{s e {#1} {#2} {#3} {}}}
- {\convertargument#3\to\asciia
- \immediate\write\uti{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%
- {\write\uti%
- {r e %
- {\currentregister} %
- {\nextinternalreference} %
- {#1} %
- {\ascii} %
- {\sectionformat::\noexpand\paginanummer} %
- {\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%
- {\write\uti%
- {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
-
-\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
- \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
- \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}{\copy0}{##3}%
- \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}{\copy0}{##3}%
- \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}
- {\paginareferentie[#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}
- {\paginareferentie[#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
- %
- %\thisisinternal{\s!lin:\internallistreference}%
- %
- \paginareferentie[\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}{\copy0}{####2}}%
- \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}
- {\paginareferentie[#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}
- {\paginareferentie[#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}{\copy0}{##2}}%
- \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}
- {\getrealreference{\s!lin:\internallistreference}%
- \gotointernal
- {\s!lin:\internallistreference}
- {\showlocation{#3}}
- {\currentrealreference}}
- {\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\startbuffer%
- {\bgroup
- \obeylines % nodig, anders gaat 't fout als direct \starttabel (bv)
- \dodoubleempty\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\addpagebackground#1%
- {\doifvaluesomething{\??ma\v!pagina\c!achtergrond}
- {\setbox2=\vbox
- {\offinterlineskip
- \localframed
- [\??ma\v!pagina]
- [\c!breedte=\papierbreedte,\c!hoogte=\papierhoogte]%, \c!offset=\v!overlay]
- {\getvalue{\??ma\v!pagina\c!commando}}}%
- \wd2=\!!zeropoint
- \dp2=\!!zeropoint
- \setbox#1=\vbox
- {\hbox{\box2\box#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\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%
- {\doifelse{##1}{\v!pagina}
- {\getparameters[\??ma\v!pagina][#3]%
- \dosetpageseparation}
- {\def\dodocommando####1%
- {\getparameters[\??ma##1####1][#3]}
- \processcommalist[#2]\dodocommando}}%
- \processcommalist[#1]\docommando
- \else
- \doifelse{#1}{\v!pagina}
- {\getparameters[\??ma\v!pagina][#2]%
- \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]
-
-\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]
-
-\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%
- {\immediate\write\uti{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!systemfilename}
- {\showmessage{\m!systems}{2}{\f!systemfilename}}{}}
-
-% \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 \loadtwopassdata \to \everyjob
-
-\def\starttekst%
- {\ifnum\textlevel=0\relax
- \registreerfileinfo{b}{\jobname}%
- \startcopyingblocks
- \fi
- \doglobal\increment\textlevel\relax}
-
-\let\normalend=\end
-\newevery \everybye \EveryBye
-
-\def\end%
- {\the\everybye
- \normalend}
-
-\appendtoks \pagina[\v!laatste] \to \everybye
-\appendtoks \pagina \to \everybye % nodig voor \startuitstellen...\stopuitstellen
-\appendtoks \registreerfileinfo{e}{\jobname} \to \everybye
-\appendtoks \stopcopyingblocks \to \everybye
-\appendtoks \closeutilities \to \everybye
-\appendtoks \closespecialfile \to \everybye
-
-\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
- \readlocfile{#1}{}{}}
-
-\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}}
-
-%I n=Macrofiles
-%I c=\gebruikmodules
-%I
-%I Extra modules kunnen worden geladen met het commando:
-%I
-%I \gebruikmodules[file,file,...]
-
-% Why does all tex's handle 8+3 different.
-
-\def\makeshortmodulename[#1#2#3#4#5#6#7#8#9]%
- {\def\modulename{#1#2#3#4#5#6#7#8.}%
- \expandafter\beforesplitstring\modulename\at.\to\modulename}
-
-\def\dodousemodules#1%
- {\makeshortmodulename[m-#1........]%
- \doifundefinedelse{\modulename\v!aan}
- {\setgvalue{\modulename\v!aan}{}%
- \readsysfile{\modulename}%
- {\showmessage{\m!systems}{5}{#1}}%
- {\showmessage{\m!systems}{6}{#1}}}
- {\showmessage{\m!systems}{7}{#1}}}
-
-\def\dousemodules[#1]%
- {\doifsomething{#1}
- {\processcommalist[#1]\dodousemodules}}
-
-\def\usemodules%
- {\dosingleargument\dousemodules}
-
-\let\usemodule=\usemodules
-
-\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}
-
-\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\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%
- {\geentest\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
-
-\long\def\startverbergen#1\stopverbergen{}
-
-% 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=\normalizedlocalcorpssize] % 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]
-
-% 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]
-
-\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]
-
-\stelrefererenin
- [\c!status=\v!start,
- \v!deel\c!nummer=\v!ja,
- \v!hoofdstuk\c!nummer=\v!nee,
- \c!interactie=\v!alles,
- \c!prefix=]
-
-\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!ja]
-
-\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!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!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=\geentest\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]
- [\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 +%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 diff --git a/tex/context/base/core-01b.tex b/tex/context/base/core-01b.tex index ac3328f28..3ad5b2ba4 100644 --- a/tex/context/base/core-01b.tex +++ b/tex/context/base/core-01b.tex @@ -1,1380 +1,1380 @@ -%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% + {\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 diff --git a/tex/context/base/core-01c.tex b/tex/context/base/core-01c.tex index c6acfb174..a4b04a778 100644 --- a/tex/context/base/core-01c.tex +++ b/tex/context/base/core-01c.tex @@ -1,1121 +1,1232 @@ -%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 typesettinmg sources and putting eps coded logos into
-%D a heading. Temporary restoring the \CATCODES\ is done in
-%D the calling routine.
-
-\def\dogetfiguresizeeps#1#2#3#4#5%
- {\bgroup
- \openjobin{\scratchread}{#1}%
- \ifeof\scratchread
- \doifsomething{\@@exgebied}
- {\closein\scratchread
- \openfixin{\scratchread}{\@@exgebied}{#1}}%
- \fi
- \global\chardef\epsffound=0
- \ifeof\scratchread
- \else
- \uncatcodespecials
- \def\next%
- {\read\scratchread to \epsffileline
- \ifeof\scratchread
- \let\next=\relax
- \else
- \expandafter\epsfaux\epsffileline:. \\%
- \fi
- \next}%
- \next
- \fi
- \closein\scratchread
- \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\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}%
- \def\@@effullname{#2.\@@eftype}% waarom per se nodig?
- \doifelse{\@@efpreset}{\v!nee} % iets anders
- {\figurefoundtrue}
- {\doifelse{#1}{\s!figurepreset}
- {\figurefoundtrue
- \let\@@eftype=\@@epe}
- {\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
- \showmessage{\m!figures}{1}{#2.\@@eftype}%
- \else
- \doreadglobalfigurefile
- \iffigurefound
- \showmessage{\m!figures}{2}{#2.\@@eftype}%
- \else
- \doif{\@@eftype}{\s!unknown}
- {\let\@@eftype=\c!eps}%
- \doifelse{\@@efextension}{}
- {\edef\@@effullname{\@@effilename.\@@eftype}}
- {\edef\@@effullname{\@@effilename.\@@efextension}}%
- \doiffileelse{\@@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}
- {\figurefoundfalse}%
- \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}}%
- \doinsertfile
- {\@@eftype,\@@efmethode}{\@@effullname} %{\@@epf.\@@epe}
- {\scax}{\scay}
- {\figx}{\figy}
- {\number\figwid}{\number\fighei}
- {\@@efpreview}}%
- \else
- \localframed
- [\??ef]
- [\c!breedte=\figwid,
- \c!hoogte=\fighei,
- \c!kader=\v!aan]
- {#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\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~##~\hfil&
- \ifdoublelegends$##$\hfil\fi&\ifdoublelegends\hfil~##~\hfil\fi&
- ##\unskip\hfil~~&
- $\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&
- ~\hfil$##$&\hfil~##~\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}
-
-\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
- \let\next=\dodogetoverlay
- \else
- \let\next=\relax
- \fi
- \next}
-
-\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\switchtocorps[\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\framebox
- {#2\relax
- \hbox to #4\framebox
- {#5\relax
- \doif{\@@rorotatie}{}%
- {\def\@@rorotatie{90}}%
- \dostartrotation{\@@rorotatie}%
- \wd\framebox=\!!zeropoint
- \ht\framebox=\!!zeropoint
- \box\framebox\relax
- \dostoprotation
- #6}%
- #3}}
-
-\def\dostoproteer%
- {\egroup
- \!!counta=\@@rorotatie\relax
- \divide\!!counta by 90\relax
- \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
- \egroup
- \egroup}
-
-\def\complexroteer[#1]%
- {\bgroup
- \getparameters[\??ro][#1]%
- \setbox\framebox=\vbox
- \bgroup
- \localframed[\??ro][#1]%
- \bgroup
- \aftergroup\dostoproteer
- \let\next=}
-
-\def\roteer%
- {\bgroup % \roteer kan argument zijn
- \complexorsimpleempty{roteer}}
-
-% 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!geen,
- \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 +%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 diff --git a/tex/context/base/core-01d.tex b/tex/context/base/core-01d.tex index 138d0cc4b..19cd09a4f 100644 --- a/tex/context/base/core-01d.tex +++ b/tex/context/base/core-01d.tex @@ -1,3148 +1,2329 @@ -%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: references
- 21: document -- geladen
- 22: document -- is niet interactief
- 23: onduidelijke verwijzing -- (prefix=--)
-\stopmessages
-
-\startmessages english library: references
- 21: document -- loaded
- 22: document -- is not interactive
- 23: obscure reference -- (prefix=--)
-\stopmessages
-
-\startmessages german library: references
- 21: Dokument -- geladen
- 22: Dokument -- ist nicht aktiv
- 23: Obskure Referenz -- (Prefix=--)
-\stopmessages
-
-\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
-
-% \setobject{name}=\somebox{}
-% \getobject{name}
-
-% BEWARE: we have to set the page dimensions first because
-% else pdftex goes wild.
-
-\def\setobject#1%
- {\dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}%
- \dowithnextbox
- {\setxvalue{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{object:#1}}
-
-\def\locationcolor#1%
- {\iflocation#1\fi}
-
-\unprotected\def\dolocationattributes#1#2%
- {\bgroup
- \iflocation
- \doifdefinedelse{#1\c!kleur}
- {\def\colorattribute{\getvalue{#1\c!kleur}}}
- {\def\colorattribute{}}%
- \else
- \def\colorattribute{}%
- \fi
- \doifdefinedelse{#1\c!letter}
- {\def\fontattribute{\getvalue{#1\c!letter}}}
- {\def\fontattribute{}}%
- \startcolor[\colorattribute]%
- \doconvertfont{\fontattribute}{#2}%
- \stopcolor
- \egroup}
-
-\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\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}}
-
-%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}
- {\@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 / ZWOLLE NL / \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
-% \getrealreference{#1}%
-% \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}
-% {\getrealreference{#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}}
-
-% \newif\iflocation % reeds gedefinieerd
-\newif\iflocationmenu
-\newif\iflocationmenupermitted
-
-\newbox\locationbox
-
-\newdimen\buttonheight
-\newdimen\buttonwidth
-
-% \def\dopregoto#1\start#2\stop#3\doposgoto%
-% {\hbox
-% {\setbox0=\hbox{#1}%
-% \lower\dp0\hbox
-% {\ifdim\wd0<\@@iabreedte\relax
-% \wd0=\@@iabreedte\relax
-% \fi
-% \buttonwidth=\wd0\relax
-% \buttonheight=\ht0\relax
-% \advance\buttonheight by \dp0%
-% #2#3}%
-% \box0}}
-%
-% \def\dopregoto#1\start#2\stop#3\doposgoto% recently updated
-% {\hbox
-% {\setbox0=\hbox{#1}%
-% \lower\dp0\hbox
-% {\mindermeldingen
-% \ifdim\wd0<\@@iabreedte\relax
-% \buttonwidth=\@@iabreedte\relax
-% \else
-% \buttonwidth=\wd0\relax
-% \fi
-% \buttonheight=\ht0\relax
-% \advance\buttonheight by \dp0\relax
-% \dimen0=.5\wd0 % oogt mooier dan 2 maal
-% \advance\dimen0 by -.5\buttonwidth % \skip bij \ruledhskip
-% \hbox to \!!zeropoint
-% {\hskip\dimen0#2#3}}%
-% \box0}}
-
-\let\@@ia@@hoogte=\!!zeropoint
-\let\@@ia@@diepte=\!!zeropoint
-
-\def\presetgoto% wordt al in core-01a gebruikt ipv strut
- {\doifelse{\@@iastrut}{\v!ja}
- {\setstrut
- \xdef\@@ia@@hoogte{\the\ht\strutbox}%
- \xdef\@@ia@@diepte{\the\dp\strutbox}}
- {\xdef\@@ia@@hoogte{\@@iahoogte}%
- \xdef\@@ia@@diepte{\@@iadiepte}}}
-
-\def\dopregoto#1\start#2\stop#3\doposgoto% recently updated again
- {\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}}%
- \smashbox2\box2\box0
- \global\let\@@ia@@hoogte=\!!zeropoint
- \global\let\@@ia@@diepte=\!!zeropoint}}
-
-\def\gotoexternal#1#2%
- {\iflocation
- \dowithreferenceprefix{\otherprefix#1}% \otherprefix toegevoegd
- {\getrealreference{\otherprefix#1}%
- \dopregoto
- {#2}%
- \start
- \dostartgotolocation
- {\number\buttonwidth}{\number\buttonheight}
- {\otherURL}{\otherfile}
- {\referenceprefix#1}{\currentrealreference}%
- \stop
- \dostopgotolocation
- \doposgoto}%
- \else
- {#2}%
- \fi}
-
-\def\gotointernal#1#2#3%
- {\iflocation
- \dopregoto
- {#2}%
- \start
- \dostartgotolocation
- {\number\buttonwidth}{\number\buttonheight}
- {}{\otherfile}
- {#1}{#3}%
- \stop
- \dostopgotolocation
- \doposgoto
- \else
- {#2}%
- \fi}
-
-\def\gotorealpage#1#2%
- {\iflocation
- \dopregoto
- {#2}%
- \start
- \dostartgotorealpage
- {\number\buttonwidth}{\number\buttonheight}
- {\otherURL}{\otherfile}{#1}%
- \stop
- \dostopgotorealpage
- \doposgoto
- \else
- {#2}%
- \fi}
-
-\def\executecommand#1#2%
- {\iflocation
- \dopregoto
- {#2}%
- \start
- \dostartexecutecommand
- {\number\buttonwidth}{\number\buttonheight}
- {#1}{}%
- \stop
- \dostopexecutecommand
- \doposgoto
- \else
- {#2}%
- \fi}
-
-%\def\thisisoneexternal#1%
-% {\dostartthisislocation{\referenceprefix#1}}
-%
-%\def\thisisexternal#1%
-% {\iflocation
-% \@EA\processcommalist\@EA[#1]\thisisoneexternal
-% \dostopthisislocation
-% \fi}
-%
-%\def\thisisinternal#1%
-% {\iflocation
-% \@EA\processcommalist\@EA[#1]\dostartthisislocation
-% \dostopthisislocation
-% \fi}
-
-\def\thisisexternal#1%
- {\iflocation
- \dostartthisislocation{#1}%
- \dostopthisislocation
- \fi}
-
-\def\thisisinternal#1%
- {\iflocation
- \dostartthisislocation{#1}%
- \dostopthisislocation
- \fi}
-
-\def\thisisrealpage#1%
- {\iflocation
- \dostartthisisrealpage{#1}%
- \dostopthisisrealpage
- \fi}
-
-\def\dostelinteractiein[#1]%
- {\getparameters[\??ia][#1]%
- \doifelse{\@@iapagina}{\v!ja}
- {\global\usepagedestinationstrue}
- {\global\usepagedestinationsfalse}%
- \doifelse{\@@iastatus}{\v!start}
- {\iflocation\else
- \showmessage{\m!interactions}{2}{\ifusepagedestinations\space(PAGE)\fi}%
- \global\locationtrue
- %\dolocationstartup
- \fi
- \doifelse{\@@iamenu}{\v!aan}
- {\global\locationmenutrue}
- {\global\locationmenufalse}}
- {\iflocation
- \showmessage{\m!interactions}{3}{\ifusepagedestinations\space(PAGE)\fi}%
- \global\locationfalse
- \global\locationmenufalse
- \fi}}
-
-\def\stelinteractiein%
- {\dosingleargument\dostelinteractiein}
-
-\newif\iflocationstartedup \locationstartedupfalse
-
-\def\c!interactivedocument%
- {ThisIsAnInteractiveDocument}
-
-\def\dolocationstartup%
- {\iflocation
- \iflocationstartedup
- \else
- \dosetupinteraction
- \setupinteractionscreens
- \global\locationstarteduptrue
- \fi
- \fi}
-
-\def\showlocation#1%
- {\iflocation\color[\@@iakleur]{#1\presetgoto}\else#1\fi}
-
-\def\showcontrastlocation#1#2#3%
- {\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}
-
-\def\showcoloredlocation#1#2%
- {\iflocation
- \color[\getvalue{#1\c!kleur}]{#2\presetgoto}%
- \else
- #2%
- \fi}
-
-% \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
-
-\def\testinteractiemenu#1%
- {\iflocationmenu
- \doifelsevalue{\??am#1\c!status}{\v!start}
- {\global\locationmenupermittedtrue}
- {\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]%
- {\doifinstringelse{::}{#4}
- {\def\currentrealreference{}}
- {\getrealreference{#4}}%
- \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]%
- {\geentest\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)
- {\gotolocation
- {\r!viewb#7}
- {\efdomarker(#4,#5){\v!aan}{\thisisinternal{\r!viewa#7}}}}}
-
-\def\effiguur#1%
- {\positioneer(0,0){\naam{#1}}}
-
-\def\eftext#1(#2,#3)#4(#5,#6)#7[#8]%
- {\advance\efreference by 1
- \hbox
- {\thisisinternal{\r!viewb#8}%
- \gotolocation
- {\r!viewa#8}
- {\hbox to 1.5em{\the\efreference\presetgoto\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{}}%
- \doifreferencefoundelse{#4}
- {\gotolocation{#4}{\copy0}}
- {\unknownreference{#4}\box0}}
-
-\def\efthisis(#1,#2)#3[#4]%
- {\paginareferentie[#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.
-
-% Wanneer \naar aan het begin van een regel staat, wordt na
-% \naar op een nieuwe regel overgegaan, ook als de regel nog
-% niet vol is, vandaar \leaveoutervmode.
-
-\def\dodonaar#1[#2]%
- {\hbox{\gotolocation{#2}{\doattributes{\??ia}{#1\presetgoto}}}}
-
-\def\donaarspace#1[#2]%
- {{\iflocation
- \def\processword##1%
- {\dodonaar{##1}[#2]}%
- \processwords{#1}%
- \else
- #1\relax % \relax prevents #1's next macros from gobbling \fi
- \fi}}
-
-% much better:
-%
-% hallo \naar{ziezo dat is dat}[hallo] hallo \naar{ziezo dat
-% is dat}[hallo] hallo \naar{ziezo dat is dat}[hallo] hallo
-% \naar{ziezo dat is dat}[hallo] hallo \naar{ziezo dat is
-% dat}[hallo] hallo \naar{ziezo dat is dat}[hallo] hallo
-% \naar{ziezo dat is dat}[hallo] hallo \naar{ziezo dat is
-% dat}[hallo] hallo \naar{ziezo dat is dat}[hallo]
-
-\def\donaarspace#1[#2]%
- {{\iflocation
- \def\processisolatedword##1%
- {\dodonaar{##1}[#2]}%
- \processisolatedwords{#1}\processisolatedword
- \else
- #1\relax % \relax prevents #1's next macros from gobbling \fi
- \fi}}
-
-\def\donaarfixed#1[#2]%
- {{\iflocation
- \dodonaar{#1}[#2]%
- \else
- #1%
- \fi}}
-
-\def\donaar#1#2[#3]%
- {\leaveoutervmode
- \doifreferencefoundelse{#3}
- {#1{#2}[#3]}
- {\unknownreference{#3}#2}%
- \referentieinfo{<}{#3}}
-
-% beter:
-
-\def\donaar#1#2[#3]%
- {\leaveoutervmode
- \doifreferencefoundelse{#3}
- {\doifelsenothing{#2}
- {\dosymbolreference{}{}{}[#3]}
- {#1{#2}[#3]}}
- {\unknownreference{#3}#2}%
- \referentieinfo{<}{#3}}
-
-\unexpanded\def\naar%
- {\donaar\donaarspace}
-
-\unexpanded\def\naarbox#1[#2]% nog in handleiding
- {\bgroup
- \let\@@iastrut=\v!nee
- \leaveoutervmode
- \doifreferencefoundelse{#2}
- {\donaarfixed{#1}[#2]}
- {\unknownreference{#2}#1}%
- \referentieinfo{<}{#2}%
- \egroup}
-
-\unexpanded\def\donaarpage#1#2%
- {#1%
- \hbox
- {\gotorealpage{\currentrealreference}{\dolocationattributes{\??ia}{#2}}}}
-
-%\def\donaarreference#1#2#3[#4]%
-% {\leaveoutervmode
-% \doifreferencefoundelse{#4}
-% {#1{#4}%
-% \doifelsenothing{#2}
-% {\getrealreference{#4}%
-% \ifnum\currentrealreference>\realpageno
-% {\let\@@iabreedte=\!!zeropoint
-% \donaarpage{#3}{\strut$^\goforwardcharacter$}}%
-% \else\ifnum\currentrealreference<\realpageno
-% {\let\@@iabreedte=\!!zeropoint
-% \donaarpage{#3}{\strut$^\gobackwardcharacter$}}%
-% \else\ifhmode
-% \unskip
-% \fi\fi\fi}
-% {\doifsomespaceelse{#3}
-% {\doifsomething{#3}{\donaarspace{#3}[#4]~}\donaarfixed{#2}[#4]}
-% {\donaarfixed{\dotextprefix{#3}#2}[#4]}}}
-% {\unknownreference{#4}\dotextprefix{#3}\dummyreference}%
-% \referentieinfo{<}{#4}}
-
-\def\dosymbolreference#1#2#3[#4]%
- {\bgroup
- \ifhmode\unskip\fi
- \doifinstringelse{::}{#4}
- {\gotoouterlocation[#4]{\showlocation{$^\gotosomewherecharacter$}}}
- {\getrealreference{#4}%
- \ifnum\currentrealreference>\realpageno
- \donaarpage{#3}{$^\goforwardcharacter$}%
- \else\ifnum\currentrealreference<\realpageno
- \donaarpage{#3}{$^\gobackwardcharacter$}%
- \else\ifhmode
- \strut$^\bullet$% NOG DOEN: optioneel weglaten
- \fi\fi\fi}%
- \egroup}
-
-\def\dounknownreference#1#2#3[#4]%
- {\unknownreference{#4}\dotextprefix{#3}\dummyreference}%
-
-\def\docompletereference#1#2#3[#4]%
- {\doifsomespaceelse{#3}
- {\doifsomething{#3}{\donaarspace{#3}[#4]~}\donaarfixed{#2}[#4]}
- {\donaarfixed{\dotextprefix{#3}#2}[#4]}}
-
-\def\dolabelonlyreference#1#2#3[#4]%
- {\doifsomespaceelse{#3}
- {\doifsomething{#3}{\donaarspace{#3}[#4]}}
- {\donaarfixed{\dotextprefix{#3}}[#4]}}
-
-\def\dotextonlyreference#1#2#3[#4]%
- {\dotextprefix{#3}\donaarfixed{#2}[#4]}
-
-\let\dowantedreference=\docompletereference
-
-% \def\donaarreference#1#2#3[#4]%
-% {\bgroup
-% \leaveoutervmode
-% \forgetall
-% \doifreferencefoundelse{#4}
-% {#1{#4}%
-% \doifelsenothing{#2}
-% {\do\symbolreference{#1}{#2}{#3}[#4]}
-% {\dowantedreference{#1}{#2}{#3}[#4]}}
-% {\dounknownreference{#1}{#2}{#3}[#4]}%
-% \referentieinfo{<}{#4}%
-% \egroup}
-%
-% % accepts \in{eerste}{a}[ref]
-%
-% \def\donaarreference#1#2#3#4[#5]%
-% {\bgroup
-% \leaveoutervmode
-% \forgetall
-% \doifreferencefoundelse{#5}
-% {#1{#5}%
-% \doifelsenothing{#2} % #2#4
-% {\dosymbolreference{#1}{#2#4}{#3}[#5]}
-% {\dowantedreference{#1}{#2#4}{#3}[#5]}}
-% {\dounknownreference{#1}{#2#4}{#3}[#5]}%
-% \referentieinfo{<}{#5}%
-% \egroup}
-
-% accepts \in{eerste}{a}[ref] and \in eerste a[ref]
-
-\def\xxxxdonaarreference#1#2#3[#4]%
- {\bgroup
- \forgetall
- \leaveoutervmode
- \doifreferencefoundelse{#4}
- {#1{#4}%
- \doifelsenothing{#2}
- {\dosymbolreference{#1}{#2}{#3}[#4]}
- {\dowantedreference{#1}{#2}{#3}[#4]}}
- {\dounknownreference{#1}{#2}{#3}[#4]}%
- \referentieinfo{<}{#4}%
- \egroup}
-
-\def\xxxdonaarreference#1#2#3#4[#5]%
- {\ifx\next\bgroup
- \xxxxdonaarreference{#1}{#2#4}{#3}[#5]%
- \else
- \xxxxdonaarreference{#1}{#2}{#3#4}[#5]%
- \fi}
-
-\def\xdonaarreference#1#2%
- {\def\xxdonaarreference{\xxxdonaarreference{#1}{#2}}%
- \futurelet\next\xxdonaarreference}
-
-\def\donaarreference#1#2%
- {\doifnextcharelse{[}
- {\xdonaarreference{#1}{#2}{}}
- {\xdonaarreference{#1}{#2}}}
-
-\def\dotextmodein%
- {\donaarreference\gettextreference\currenttextreference}
-
-\def\op%
- {\donaarreference\getpagereference\currentpagereference}
-
-% tot hier
-
-\def\dostelbuttonsin[#1]%
- {\getparameters[\??bt][#1]%
- \dododostelinteractiemenuin{\??bt\c!onbekendeverwijzing}%
- \dododostelinteractiemenuin{\??bt\c!zelfdepagina}}
-
-\def\stelbuttonsin%
- {\dosingleargument\dostelbuttonsin}
-
-\presetlocalframed[\??bt]
-
-\def\complexbutton[#1]#2[#3]%
- {\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}}}}
-
-\unexpanded\def\button%
- {\complexorsimpleempty{button}}
-
-\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.
-
-% De commando's \setreference en \gotolocation zijn reeds
-% gedefinieerd in pragma1.tex. De aanpassing hieronder heeft
-% betrekking op het springen naar andere documenten.
-
-\let\otherlabel = \empty
-\let\fileprefix = \empty
-\def\otherfile {\jobname}
-\let\otherURL = \empty
-\let\otherprefix = \empty
-\let\dowithdocdes = \empty
-
-\def\dogebruikexterndocument[#1][#2][#3]%
- {\bgroup
- \doifelsenothing{#1}
- {\dogebruikexterndocument[#2][#2][#3]}
- {\doifelsenothing{#3}
- {\dogebruikexterndocument[#1][#2][#2]}
- {\doifsomething{#2}
- {\setgvalue{doc:url:#1}{}%
- \setgvalue{doc:fil:#1}{#2}%
- \setgvalue{doc:des:#1}{\dowithdocdes{#3}}%
- \doifparentfileelse{#2}
- {\showmessage{\m!references}{21}{#2}}
- {\bgroup % prevents wrong loading of \jobname
- \def\fileprefix{#1::}% % generates #1::
- \setreference{}{}{1}{}% % generates #1::
- \gebruikreferenties[#2]% % loads #1::references
- \egroup % within \doifreferenceload (brrrrr)
- % evt: \let\checkrerefences=\relax
- \doifreferencefoundelse{#1::\c!interactivedocument:#2}%
- {\showmessage{\m!references}{21}{#2}}%
- {\showmessage{\m!references}{22}{#2}}}}}}%
- \egroup}
-
-\def\gebruikexterndocument%
- {\dotripleargument\dogebruikexterndocument}
-
-\def\dogebruikURL[#1][#2][#3][#4]%
- {\doifelsenothing{#4}
- {\dogebruikexterndocument[#1][#2][#3][#3]}
- {\doifsomething{#1}
- {\setgvalue{doc:url:#1}{#2}%
- \setgvalue{doc:fil:#1}{#3}%
- \setgvalue{doc:des:#1}{\dowithdocdes{#4}}}}}
-
-\def\gebruikURL%
- {\doquadrupleargument\dogebruikURL}
-
-\let\gotoinnerlocation=\gotolocation
-
-\def\gotoouterlocation[#1::#2]#3%
- {\bgroup
- \def\referenceprefix{}%
- \setouterlocation{#1}%
- \doifelsenothing{#2}
- {\gotorealpage{1}{#3}}
- {\gotoexternal{#2}{#3}}%
- \egroup}
-
-\def\setouterlocation#1%
- {\doifdefinedelse{doc:fil:#1}
- {\edef\otherURL{\getvalue{doc:url:#1}}%
- \edef\otherfile{\getvalue{doc:fil:#1}}}
- {\let\otherURL=\empty
- \edef\otherfile{#1}}%
- \doifparentfileelse{\otherfile}
- {\let\otherURL=\empty
- \let\otherfile=\empty
- \global\let\otherlabel=\empty
- \let\otherprefix=\empty}
- {\gdef\otherlabel{#1}%
- \def\otherprefix{#1::}}}
-
-\def\gotolocation#1#2% predefined in Pragma1.tex
- {\doifinstringelse{::}{#1}%
- {\gotoouterlocation[#1]{#2}}%
- {\gotoinnerlocation{#1}{#2}}}
-
-\def\docomplexuit[#1::#2]%
- {{\def\dowithdocdes{\naar}%
- \doifdefinedelse{doc:des:#1}
- {\getvalue{doc:des:#1}[#1::#2]}
- {{\tttf[#1]}}%
- \referentieinfo{<}{#1::#2}}}
-
-\def\simpleuit%
- {\getvalue{doc:des:\otherlabel}}
-
-\def\complexuit[#1]%
- {\doifinstringelse{::}{#1}%
- {\docomplexuit[#1]}%
- {\docomplexuit[#1::]}}
-
-\def\simpleuit%
- {{\def\docommando{}\getvalue{doc:des:\otherlabel}}}
-
-\def\uit%
- {\complexorsimple{uit}}
-
-% 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
- \thisisinternal{\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
- \gotoouterlocation
- [#1::\syncprefix:##1]%
- {\hbox to \dimen0{\color[\locationcolor\@@bakleur]{\onder}}}}%
- \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}}%
- \gotoouterlocation
- [#1::\syncprefix:\synccounter]%
- {\color[\locationcolor\@@bakleur]{\blackrule}}%
- \egroup}
-
-\def\synchronisatiebalk[#1][#2]%
- {\iflocation\ifsynchronisation
- \bgroup
- \stelsynchronisatiebalkin
- [\c!tekst=\getvalue{doc:des:#1},#2]%
- \getvalue{synchronisatie\@@bavariant}[#1]%
- \egroup
- \fi\fi}
-
-% Bepaalde delen van een tekst kunnen (provisorisch) worden
-% afgeschermd. Ze zijn dan wel zichtbaar op het scherm, maar
-% niet als ze geprint worden. (Dit commando is in
-% ontwikkeling.)
-
-\def\dostartinteractie%
- {\setbox0=\hbox\bgroup
- \def\stopinteractie%
- {\egroup\dostarthide\box0\dostophide}}
-
-% 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!
-
-\let\startinteractie = \relax
-\let\stopinteractie = \relax
-
-%I n=Programmas
-%I c=\definieerprogramma,\programma,\stelprogrammasin
-%I
-%I Het is, bij wijze van experiment, mogelijk programma's
-%I op te starten. Een programma wordt gedefinieerd met:
-%I
-%I \definieerprogramma[naam][programma][omschrijving]
-%I
-%I Rond programma's kan een en ander worden ingesteld met:
-%I
-%I \stelprogrammasin[gebied=]
-%I
-%I terwijl daadwerkelijk wordt gesprongen met:
-%I
-%I \programma[naam]
-
-\def\stelprogrammasin%
- {\dodoubleargument\getparameters[\??pr]}
-
-\def\dodefinieerprogramma[#1][#2][#3]%
- {\setgvalue{pro:fil:#1}{#2}%
- \setgvalue{pro:des:#1}{#3}}
-
-\def\definieerprogramma%
- {\dotripleargument\dodefinieerprogramma}
-
-\def\doprogramma[#1]%
- {\iflocation
- \hbox
- {\setbox0=\hbox
- {\dolocationattributes{\??ia}{\getvalue{pro:des:#1}\presetgoto}}%
- \dopregoto
- {\copy0}%
- \start
- \dostartrunprogram
- {\number\buttonwidth}{\number\buttonheight}
- {\@@prgebied\getvalue{pro:fil:#1}}%
- \stop
- \dostoprunprogram
- \doposgoto}%
- \else
- {\getvalue{pro:des:#1}}%
- \fi}
-
-\def\programma%
- {\dosingleargument\doprogramma}
-
-% Er kan naar een pagina worden gesprongen. Let wel: het
-% betreft het volgnummer. Dit kan afwijken van het gezette
-% nummer.
-%
-% ook file::nr mogelijk
-%
-% \ganaarpagina[eerste(sub),vorige(sub),volgende(sub),laatste(sub),nummer]
-
-\def\dodoganaareenpagina#1#2#3%
- {\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\dodoganaareenfilepagina#1#2#3% tzt: \ifouterlocation en
- {\checkreferences % nodig ?? % combineren met vorige
- \iflocation
- \doifelsenothing{#1}
- {\hbox{\gotorealpage{#3}{#2}}}
- {\hbox{\gotorealpage{#3}{\dolocationattributes{#1}{#2}}}}%
- \else
- {#2}%
- \fi}
-
-\def\doganaareenpagina#1#2[#3]%
- {\bgroup
- \beforesplitstring#3\at::\to\eenfile
- \doifelsenothing{\eenfile}
- {\processaction
- [#3]
- [ \v!eerste\v!pagina=>\dodoganaareenpagina{#1}{#2}\firstpage,
- \v!vorige\v!pagina=>\dodoganaareenpagina{#1}{#2}\prevpage,
- \v!volgende\v!pagina=>\dodoganaareenpagina{#1}{#2}\nextpage,
- \v!laatste\v!pagina=>\dodoganaareenpagina{#1}{#2}\lastpage,
- \v!eerste\v!sub\v!pagina=>\dodoganaareenpagina{#1}{#2}\firstsubpage,
- \v!vorige\v!sub\v!pagina=>\dodoganaareenpagina{#1}{#2}\prevsubpage,
- \v!volgende\v!sub\v!pagina=>\dodoganaareenpagina{#1}{#2}\nextsubpage,
- \v!laatste\v!sub\v!pagina=>\dodoganaareenpagina{#1}{#2}\lastsubpage,
- \v!eerste=>\dodoganaareenpagina{#1}{#2}\firstpage,
- \v!vorige=>\dodoganaareenpagina{#1}{#2}\prevpage,
- \v!volgende=>\dodoganaareenpagina{#1}{#2}\nextpage,
- \v!laatste=>\dodoganaareenpagina{#1}{#2}\lastpage,
- \v!eerste\v!sub=>\dodoganaareenpagina{#1}{#2}\firstsubpage,
- \v!vorige\v!sub=>\dodoganaareenpagina{#1}{#2}\prevsubpage,
- \v!volgende\v!sub=>\dodoganaareenpagina{#1}{#2}\nextsubpage,
- \v!laatste\v!sub=>\dodoganaareenpagina{#1}{#2}\lastsubpage,
- \s!unknown=>\dodoganaareenpagina{#1}{#2}{#3}]}
- {\setouterlocation\eenfile
- \aftersplitstring#3\at::\to\eenpagina
- \doifelsenothing{\eenpagina}
- {\def\eenpagina{1}}
- {\doifnumberelse{\eenpagina}
- {}
- {\def\eenpagina{1}}}%
- \dodoganaareenfilepagina{#1}{#2}\eenpagina}
- \egroup}
-
-\def\ganaarpagina#1%
- {\doganaareenpagina\??ia{#1\presetgoto}}
-
-%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\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}[\v!eerste]%
- \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}[\v!vorige]%
- \fi
- \color[\@@ibcontrastkleur]{\blackrule[\c!breedte=.5em]}%
- \ifnum\realpageno<\lastpage\relax
- \doganaareenpagina{\??ib}{\blackrule}[\v!volgende]%
- \!!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}[\v!laatste]}%
- \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[##2]%
- {\doganaareenpagina{}{\blackrule[\c!breedte=##1]}[##2]}%
- \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}[\v!eerste]%
- \hss
- \goto{\!!widtha}[\v!vorige]%
- \color[\@@ibcontrastkleur]{\blackrule[\c!breedte=1em]}%
- \goto{\!!widthb}[\v!volgende]%
- \hss
- \goto{1em}[\v!laatste]%
- \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=Interactiebuttons
-%I c=\interactiebuttons
-%I
-%I Men kan zelf interactiebalken samenstellen met het
-%I commando:
-%I
-%I \interactiebuttons[logische referenties]
-%I
-%I bijvoorbeeld:
-%I
-%I \interactiebuttons[vorigepagina,SluitDocument,...]
-%I
-%I optioneel kunnen instellingen worden meegegeven:
-%I
-%I \interactiebuttons[instellingen][logische referenties]
-
-\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
- \getcommalistsize[#2]%
- \increment\commalistsize
- \divide\!!widtha by \commalistsize
- \def\goto##1##2%
- {\setnostrut
- \gotorealpage
- {##2}
- {\localframed
- [\??ib][\c!hoogte=\!!heighta,\c!breedte=\!!widtha]
- {\showcontrastlocation{\??ib}{##2}{$##1$}}}%
- \hss}%
- \def\exec##1##2%
- {\setnostrut
- \gotolocation
- {##2}
- {\localframed
- [\??ib][\c!hoogte=\!!heighta,\c!breedte=\!!widtha]
- {\showcoloredlocation{\??ib}{$##1$}}}%
- \hss}%
- \hbox to \@@ibbreedte
- {\processallactionsinset
- [#2]
- [ \v!pagina=>\goto\gotobegincharacter \firstpage
- \goto\gobackwardcharacter\prevpage
- \goto\goforwardcharacter \nextpage
- \goto\gotoendcharacter \lastpage,
- \v!sub\v!pagina=>\goto\gotobegincharacter \firstsubpage
- \goto\gobackwardcharacter\prevsubpage
- \goto\goforwardcharacter \nextsubpage
- \goto\gotoendcharacter \lastsubpage,
- \v!eerste\v!pagina=>\goto\gotobegincharacter \firstpage,
- \v!vorige\v!pagina=>\goto\gobackwardcharacter\prevpage,
- \v!volgende\v!pagina=>\goto\goforwardcharacter \nextpage,
- \v!laatste\v!pagina=>\goto\gotoendcharacter \lastpage,
- \v!eerste\v!sub\v!pagina=>\goto\gotobegincharacter \firstsubpage,
- \v!vorige\v!sub\v!pagina=>\goto\gobackwardcharacter\prevsubpage,
-\v!volgende\v!sub\v!pagina=>\goto\goforwardcharacter \nextsubpage,
- \v!laatste\v!sub\v!pagina=>\goto\gotoendcharacter \lastsubpage,
- \v!PreviousJump=>\exec\gobackjumpcharacter\v!PreviousJump,
- \v!NextJump=>\exec\goforjumpcharacter \v!NextJump,
- \v!CloseDocument=>\exec\closecharacter \v!CloseDocument,
- \s!unknown=>\commalistelement]%
- \unskip}%
- \egroup
- \else
- \interactiebuttons[][#1]%
- \fi
- \fi}
-
-\def\interactiebuttons%
- {\dodoubleempty\dointeractiebuttons}
-
-%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
- {\dopregoto
- {\dolocationattributes{\??ia}{#1\presetgoto}}%
- \start
- \dostartgotoprofile
- {\number\buttonwidth}{\number\buttonheight}
- {#2}%
- \stop
- \dostopgotoprofile
- \doposgoto}%
- \else
- {#1}%
- \fi}
-
-\def\volgprofiel#1[#2]%
- {\iflocation
- \doif{\@@pfoptie}{\v!test}{\paginareferentie[\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 dus 2.02 zijn.
-%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]}
-
-% Standaard instellingen
-
-\definecolor [interactioncontrastcolor] [r=.8, g=0, b=0]
-\definecolor [interactioncolor] [r=0, g=.6, b=0]
-
-\definecolor [interactiekleur] [interactioncolor]
-\definecolor [interactiecontrastkleur] [interactioncontrastcolor]
-
-% andere talen ook
-
-\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=\the\normalyear
- \ifnum\normalmonth<10 0\fi\the\normalmonth
- \ifnum\normalday<10 0\fi\the\normalday]
-
-\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=]
-
-\protect
-
-\endinput
-
-% Verwijzingen:
-%
-% - eerst lokaal kijken (prefix)
-% - dan globaal kijken (zonder prefix)
-% - en tot slot sequentieel lokaal kijken (alle prefixen doorlopen)
-% (van globaal naar lokaal)
-%
-% PAS OP: aangepast en dus niet meer ok
-
-\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}} + +% 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 diff --git a/tex/context/base/core-01e.tex b/tex/context/base/core-01e.tex index 70487ec8b..567c079b3 100644 --- a/tex/context/base/core-01e.tex +++ b/tex/context/base/core-01e.tex @@ -1,423 +1,422 @@ -%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 +%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 diff --git a/tex/context/base/core-02a.tex b/tex/context/base/core-02a.tex index c90f51713..5340e96a1 100644 --- a/tex/context/base/core-02a.tex +++ b/tex/context/base/core-02a.tex @@ -1,190 +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
-
-\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
-
\ No newline at end of file +%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 7931ae3c2..ea4aa7021 100644 --- a/tex/context/base/core-02b.tex +++ b/tex/context/base/core-02b.tex @@ -1,172 +1,171 @@ -%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 +%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 diff --git a/tex/context/base/core-02d.tex b/tex/context/base/core-02d.tex index 31ab3d236..caa1f7e83 100644 --- a/tex/context/base/core-02d.tex +++ b/tex/context/base/core-02d.tex @@ -1,50 +1,49 @@ -%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 +%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 diff --git a/tex/context/base/core-con.tex b/tex/context/base/core-con.tex index 68b110b15..0eaf9449a 100644 --- a/tex/context/base/core-con.tex +++ b/tex/context/base/core-con.tex @@ -1,505 +1,505 @@ -%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
- \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{\setsmallcorps\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
-
\ No newline at end of file +%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 diff --git a/tex/context/base/core-fil.tex b/tex/context/base/core-fil.tex index d687fc552..27204558d 100644 --- a/tex/context/base/core-fil.tex +++ b/tex/context/base/core-fil.tex @@ -1,48 +1,121 @@ -% NOT YET DOCUMENTED !!
-
-%D \module
-%D [ file=core-fil,
-%D version=1997.09.10,
-%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
-
-% Why does all tex's handle 8+3 different.
-
-\def\makeshortmodulename[#1#2#3#4#5#6#7#8#9]%
- {\def\modulename{#1#2#3#4#5#6#7#8.}%
- \expandafter\beforesplitstring\modulename\at.\to\modulename}
-
-\def\dodousemodules#1%
- {\makeshortmodulename[m-#1........]%
- \doifundefinedelse{\modulename\v!aan}
- {\setgvalue{\modulename\v!aan}{}%
- \readsysfile{\modulename}%
- {\showmessage{\m!systems}{5}{#1}}%
- {\showmessage{\m!systems}{6}{#1}}}
- {\showmessage{\m!systems}{7}{#1}}}
-
-\def\dousemodules[#1]%
- {\doifsomething{#1}
- {\processcommalist[#1]\dodousemodules}}
-
-\def\usemodules%
- {\dosingleargument\dousemodules}
-
-\def\usemodule%
- {\usemodules}
-
-\protect
-
-\endinput
-
\ No newline at end of file +% 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 diff --git a/tex/context/base/core-fnt.tex b/tex/context/base/core-fnt.tex index 6db6a6de1..0984781da 100644 --- a/tex/context/base/core-fnt.tex +++ b/tex/context/base/core-fnt.tex @@ -1,301 +1,330 @@ -%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\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
-
-\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\dounderbar#1#2#3%
- {\bmath
- \setbox0=\hbox{#3}%
- \setbox2=\getvalue{underbarmethod\@@onvariant}{\wd0}{#1}{#2}%
- \wd0=\!!zeropoint
- \box0\box2
- \emath}
-
-\def\underbar#1%
- {\bgroup
- \increment\underbarlevel
- \dimen0=1.5\normallineskip % was \dimen0=1.5\lineskip
- \dimen0=\underbarlevel\dimen0
- \dimen2=\dimen0
- \advance\dimen2 by \@@onlijndikte
- \dounderbar{-\dimen0}{\dimen2}{#1}%
- \egroup}
-
-\def\underbars%
- {\let\processword=\underbar\processwords}
-
-\def\overstrike#1%
- {\bgroup
- \dimen0=2.5\lineskip
- \dimen2=\dimen0
- \advance\dimen2 by \@@onlijndikte
- \dounderbar{\dimen2}{-\dimen0}{#1}%
- \egroup}
-
-\def\overstrikes%
- {\let\processword=\overstrike\processwords}
-
-\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 +%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 diff --git a/tex/context/base/core-gen.tex b/tex/context/base/core-gen.tex index 45ffad9cc..ee5c7caf9 100644 --- a/tex/context/base/core-gen.tex +++ b/tex/context/base/core-gen.tex @@ -1,179 +1,178 @@ -%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%
- {\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 1em}}%
- {#1=#2}}}%
-
-\protect
-
-\endinput
-
\ No newline at end of file +%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 diff --git a/tex/context/base/core-grd.tex b/tex/context/base/core-grd.tex new file mode 100644 index 000000000..4a91fd35a --- /dev/null +++ b/tex/context/base/core-grd.tex @@ -0,0 +1,445 @@ +%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 diff --git a/tex/context/base/core-int.tex b/tex/context/base/core-int.tex new file mode 100644 index 000000000..30ca15064 --- /dev/null +++ b/tex/context/base/core-int.tex @@ -0,0 +1,213 @@ +%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 diff --git a/tex/context/base/core-mak.tex b/tex/context/base/core-mak.tex index f1884b6c4..c1e012c17 100644 --- a/tex/context/base/core-mak.tex +++ b/tex/context/base/core-mak.tex @@ -1,62 +1,61 @@ -%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 Support 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 +%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 diff --git a/tex/context/base/core-mul.tex b/tex/context/base/core-mul.tex new file mode 100644 index 000000000..e2c291e4b --- /dev/null +++ b/tex/context/base/core-mul.tex @@ -0,0 +1,1362 @@ +%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 diff --git a/tex/context/base/core-nav.tex b/tex/context/base/core-nav.tex new file mode 100644 index 000000000..8a3333d0b --- /dev/null +++ b/tex/context/base/core-nav.tex @@ -0,0 +1,357 @@ +%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 diff --git a/tex/context/base/core-new.tex b/tex/context/base/core-new.tex new file mode 100644 index 000000000..666367e6f --- /dev/null +++ b/tex/context/base/core-new.tex @@ -0,0 +1,47 @@ +%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 diff --git a/tex/context/base/core-not.tex b/tex/context/base/core-not.tex index 13906abab..5077afab6 100644 --- a/tex/context/base/core-not.tex +++ b/tex/context/base/core-not.tex @@ -1,557 +1,626 @@ -%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}
-%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
-
-\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]%
- \bgroup
- \setbox0=\vbox
- {\vskip\parskip % still to be tested in multi-column mode
- \@@vnvoor
- \footnoterule
- \@@vnna}%
- \global\skip\footins =\ht0
- \global\count\footins=1000
- \ifnum\@@vnn=0 \chardef\@@vnn=1 \fi % temporary (grouped)
- \global\divide\count\footins by \@@vnn
- \global\dimen\footins=\@@vnhoogte
- \global\multiply\dimen\footins by \@@vnn
- \egroup
- \ifnum\@@vnn=0
- \settextfootnotes
- \else
- \setcolumnfootnotes
- \fi
- \doifelse{\@@vnplaats}{\v!pagina}
- {\global\endnotesfalse}
- {\global\endnotestrue
- \postponefootnotes}}
-
-\def\setupfootnotes%
- {\dosingleargument\dosetupfootnotes}
-
-\def\setcolumnfootnotes%
- {\def\formatfootnumber##1{\indent\llap{##1\hskip\@@vnmargeafstand}}%
- \def\startpushfootnote {\setrigidcolumnhsize\@@vnbreedte\@@vnkolomafstand\@@vnn}%
- \def\stoppushfootnote {}%
- \def\startpopfootnotes {\setbox0=\vbox\bgroup}%
- \def\stoppopfootnotes {\egroup\rigidcolumnbalance0\@@vnn}}
-
-\def\settextfootnotes%
- {\def\formatfootnumber##1{\noindent##1}%
- \def\startpushfootnote {\startvboxtohbox}%
- \def\stoppushfootnote {\hskip\@@vnkolomafstand % plus.5em minus.5em
- \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}}}%
- \let\next=\dostartfootnote
- \else
- \let\next=\gobbleoneargument
- \fi
- \next}
-
-%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
- \setfootnotecorps
- \redoconvertfont % to undo \undo calls in in headings etc
- \startpushfootnote
- \dostartattributes\??vn\relax
- \interlinepenalty=\interfootnotelinepenalty
- \splittopskip\ht\strutbox % not actually needed here
- \splitmaxdepth\dp\strutbox % not actually needed here
- \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
- \dostopattributes
- \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
- \gettextreference{#1}%
- \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
- \ifendnotes \else
- \vfill
- \witruimte % kan dit \vskip\parskip zijn? testen
- \@@vnvoor
- \footnoterule
- \bgroup
- \setfootnotecorps
- \startpopfootnotes
- \unvbox\footins
- \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\flushfootnotes%
- {\ifinpagebody \else \ifinner \else
- \ifendnotes \else \ifvoid\postponedfootnotes \else
- %\ifvmode % less interference, but also less secure
- \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
- %\fi
- \fi\fi
- \fi\fi}
-
-\def\placefootnotesintext#1%
- {\bgroup
- \@@vnvoor
- \setfootnotecorps
- \startpopfootnotes
- \unvbox#1\relax
- \stoppopfootnotes
- \@@vnna
- \egroup}
-
-%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
- \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 corps size, which is in most cases derived
-%D from the global document corps size. In the previous macros
-%D we already used a footnote specific font setting macro.
-
-\def\setfootnotecorps%
- {\restoreglobalcorps
- \switchtocorps[\@@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!na=,
- \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. + +\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 diff --git a/tex/context/base/core-obj.tex b/tex/context/base/core-obj.tex new file mode 100644 index 000000000..8a767a68e --- /dev/null +++ b/tex/context/base/core-obj.tex @@ -0,0 +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 diff --git a/tex/context/base/core-pag.tex b/tex/context/base/core-pag.tex new file mode 100644 index 000000000..52e2d478d --- /dev/null +++ b/tex/context/base/core-pag.tex @@ -0,0 +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 diff --git a/tex/context/base/core-ref.tex b/tex/context/base/core-ref.tex new file mode 100644 index 000000000..3e8d0968b --- /dev/null +++ b/tex/context/base/core-ref.tex @@ -0,0 +1,1876 @@ +% 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 diff --git a/tex/context/base/core-rul.tex b/tex/context/base/core-rul.tex index a67390ce9..a48a0f2de 100644 --- a/tex/context/base/core-rul.tex +++ b/tex/context/base/core-rul.tex @@ -1,2280 +1,2326 @@ -%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\width#1\depth#2\height#3\raster#4\radius#5\\
-%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 \startbuffer
-%D \periodgraybox\width.5\hsize\height1cm\depth0cm\raster.85\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}\width.5\hsize\height1cm\depth0cm\raster.85\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\corpssize
- \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 \macro
-%D {defineoverlay, overlaywidth, overlayheight}
-%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.
-
-\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\edef\overlayheight{\the\scratchdimen}%
- %\message{[overlay: #1\space w: \overlaywidth\space h: \overlayheight]}%
- \setbox0=\hbox{#2}%
- \wd0=\overlaywidth
- \ht0=\overlayheight
- \dp0=\!!zeropoint
- \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\dobackgroundbox#1\background#2\color#3\raster#4\offset#5\corner
- #6\radius#7\depth#8\\%
- {\vbox
- {\offinterlineskip
- \dimen0=#5\relax
- \dimen2=\dimen0
- \advance\dimen2 by #8
- \dimen4=2\dimen0
- \advance\dimen4 by \wd#1
- \dimen6=\dimen0
- \advance\dimen6 by \ht#1
- \advance\dimen6 by \dp#1
- \advance\dimen6 by \dimen2
- \setbox\extraframebox=\hbox
- {\executeifdefined{executeoverlay#2}\gobblesevenarguments
- {\dimen4}{\dimen6}{\!!zeropoint}{#3}{#4}{#6}{#7}}
- \setbox\extraframebox=\hbox
- {\lower\dimen2\vbox{\moveleft\dimen0\box\extraframebox}}
- \wd\extraframebox=\wd#1
- \ht\extraframebox=\ht#1
- \dp\extraframebox=\dp#1
- \vbox{\copy\extraframebox}
- \vskip-\ht\extraframebox
- \vbox{\box#1}}}
-
-%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
- {\offinterlineskip
- \dimen0=#3\relax
- \dimen2=\dimen0
- \advance\dimen2 by #6
- \dimen4=2\dimen0
- \advance\dimen4 by \wd#1
- \dimen6=\dimen0
- \advance\dimen6 by \ht#1
- \advance\dimen6 by \dp#1
- \advance\dimen6 by \dimen2
- \setbox\extraframebox=\hbox
- {\dostrokedbox\width\dimen4\height\dimen6\depth\!!zeropoint
- \corner#4\radius#5\toggle#7\\}
- \setbox\extraframebox=\hbox
- {\lower\dimen2\vbox{\moveleft\dimen0\box\extraframebox}}
- \wd\extraframebox=\wd#1
- \ht\extraframebox=\ht#1
- \dp\extraframebox=\dp#1
- \vbox{\box#1}
- \vskip-\ht\extraframebox
- \doifsomething{#2}
- {\color[#2]{\vbox{\box\extraframebox}}}
- {\vbox{\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\corpssize
- \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\\%
- {\vbox
- {\setbox0=\null\wd0=#1\ht0=#2\dp0=#3%
- \vbox
- {\getvalue{t\@@frame@@#4#7}%
- \hbox
- {\getvalue{l\@@frame@@#4#5}%
- \box0
- \getvalue{r\@@frame@@#4#6}}
- \getvalue{b\@@frame@@#4#8}}}}
-
-\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!dummy,
- \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!dummy}{\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!dummy} 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
-
-% gejat van Knuth (zie \copyright, p356)
-
-\def\omcirkeld#1%
- {{\ooalign{\hfil\raise0.07ex\hbox{{\tfx#1}}\hfil\crcr\mathhexbox20D}}}
-
-\def\copyright
- {\omcirkeld{c}}
-
-%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=\hfill,
- \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\corpssize,
- \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]
- [ \c!links=>\letvalue{\??kd#1\c!links}=\relax,
- \c!rechts=>\letvalue{\??kd#1\c!rechts}=\relax,
- \s!default=>\letvalue{\??kd#1\c!links}=\relax,
- \s!unknown=>]%
- \forgetparindent
- \setbox\framebox=\vbox
- \bgroup
- \expanded{\switchtocorps[\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{\switchtocorps[\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 corps switching:
-
-\def\starttextrule#1%
- {\bgroup
- \dotoptextrule{#1}
- \switchtocorps[\@@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
-
-% \setuprules
-% [\c!dikte=\v!middel]
-
-\setuplinewidth
- [\v!middel]
-
-\setupframed
- [\c!breedte=\v!passend,
- \c!hoogte=\v!ruim,
- \c!offset=0.25ex,
- \c!dummy=\v!nee,
- \c!kader=\v!aan,
- \c!bovenkader=,
- \c!onderkader=,
- \c!linkerkader=,
- \c!rechterkader=,
- \c!straal=.5\corpssize,
- \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\corpssize,
- \c!rechteroffset=\@@aglinkeroffset,
- \c!bovenoffset=\!!zeropoint,
- \c!onderoffset=\@@agbovenoffset,
- \c!status=\v!start,
- \c!straal=.5\corpssize,
- \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, + #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 diff --git a/tex/context/base/core-tab.tex b/tex/context/base/core-tab.tex index 8558044ac..c3a34bdd2 100644 --- a/tex/context/base/core-tab.tex +++ b/tex/context/base/core-tab.tex @@ -1,2037 +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{\y!starttabel}
-
-\def\starttabel%
- {\bgroup
- \ifinsidefloat\else
- \startbaselinecorrection
- \fi
- \postponefootnotes
- \firststagestartTABLE}
-
-\def\stoptabel%
- {\finishTABLE
- \ifinsidefloat\else
- \stopbaselinecorrection
- \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{\y!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
- \ifdim\prevdepth<\maxdimen\ifdim\prevdepth>\!!zeropoint
- \global\advance\TABLEmaxheight by -2\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
- \crcr
- \TABLEnoalign
- {\nobreak
- \setTABLEaction\TABLEunknown
- \setTABLEerror\TABLEunknown
- \global\let\checkTABLEautorow=\empty
- \global\let\chuckTABLEautorow=\empty
- \global\currentTABLEcolumn=0 }%
- \fi}
-
-\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 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).
-
-\let\beforeTABLEline=\empty
-\let\afterTABLEline =\empty
-
-\def\endTABLErow#1#2#3%
- {\setTABLEaction#1%
- \ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \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
- \else
- \setTABLEerror\TABLEmissingcolumn
- \handleTABLEerror
- \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 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
- \global\currentTABLEcolumn=0
- \normalTABLElineending
- \else
- \setTABLEerror\TABLEmissingcolumn
- \handleTABLEerror
- \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
-
-\def\defineTABLEbackgrounds%
- {\let\CL =\TableCL
- \let\RL =\TableRL
- \let\BC =\TableBC
- \let\BL =\TableBL
- \let\BR =\TableBR
- \let\BACKGROUND=\TableBR
- \let\RASTER =\TableRASTER
- \let\COLOR =\TableCOLOR}
-
-\def\TableCL% % much in common with \HL
- {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \chuckTABLEautorow
- \else\ifnum\currentTABLEcolumn=0
- \chuckTABLEautorow
- \else
- \setTABLEerror\TABLEmissingcolumn
- \handleTABLEerror
- \fi\fi
- \TABLEnoalign\bgroup\complexorsimpleTable{CL}}
-
-\def\simpleTableCL%
- {\complexTableCL[\@@tiachtergrondkleur]}%
-
-\def\complexTableCL[#1]#2%
- {\docomplexTableCL[#1]#2\egroup}
-
-\def\docomplexTableCL%
- {\dodocomplexTableFullGL\CL\localstartcolor\localstopcolor}
-
-\def\TableRL% % much in common with \CL
- {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \chuckTABLEautorow
- \else\ifnum\currentTABLEcolumn=0
- \chuckTABLEautorow
- \else
- \setTABLEerror\TABLEmissingcolumn
- \handleTABLEerror
- \fi\fi
- \TABLEnoalign\bgroup\complexorsimpleTable{RL}}
-
-\def\simpleTableRL%
- {\complexTableRL[\@@tiachtergrondraster]}%
-
-\def\complexTableRL[#1]#2%
- {\docomplexTableRL[#1]#2\egroup}
-
-\def\docomplexTableRL%
- {\dodocomplexTableFullGL\RL\localstartraster\localstopraster}
-
-\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\dodocomplexTableFullGL#1#2#3[#4]#5%
- {\global\let\TABLEgraylineerror =\empty
- \global\let\TABLEgraylinestatus=\empty
- \gdef\nextTABLEgrayline%
- {\TABLEnoalign
- {\let\endTABLErow=\endTABLErowGL
- \checkTABLEgrayline#5#1\TABLEendBCL
- #2[#4]%
- \hrule\!!height\TABLEgraylineHeight
- \nobreak
- \vskip-\TABLEgraylineHeight
- \nobreak
- #3%
- \doPostTableGL}}}
-
-\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}
-
-\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\docomplexTableCOLOR[#1]%
- {\dodocomplexTableGL\localstartcolor\localstopcolor
- [#1,\@@tiachtergrondkleur,,]}
-
-\gdef\docomplexTableRASTER[#1]%
- {\dodocomplexTableGL\localstartraster\localstopraster%
- [#1,\@@tiachtergrondraster,,]}
-
-% nog \= == \- als alternatief
-% nog eens
-
-\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}
-
-% \BC \BL
-% \BL \BC
-
-\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\BC=\doTableBC
- \doTableBL}
-
-\def\doTableBL%
- {\complexorsimpleTable{BL}}
-
-\def\complexTableBL[#1]#2% nodig?
- {\doprocessTableBL[#1,\@@tiachtergrond,]#2}
-
-\def\simpleTableBL#1% nodig?
- {\doprocessTableBL[1,\@@tiachtergrond,]#1}
-
-\def\dodoprocessTableBL[#1,#2,#3]%
- {\processaction
- [#2]
- [ color=>{\addtoTABLEgrayline{\complexTableCOLOR[#1,#3]}},
- c=>{\addtoTABLEgrayline{\complexTableCOLOR[#1,#3]}},
- raster=>{\addtoTABLEgrayline{\complexTableRASTER[#1,#3]}},
- r=>{\addtoTABLEgrayline{\complexTableRASTER[#1,#3]}}]}
-
-\def\doprocessTableBL[#1]%
- {\getfromcommalist[#1][1]%
- \expandafter\doifnumberelse\expandafter{\commalistelement}
- {\dodoprocessTableBL[#1]}
- {\dodoprocessTableBL[1,#1]}%
- \gobbleTableBCL}
-
-\def\TableBR#1%
- {\TABLEnoalign
- {\global\let\nextTABLEgrayline=\executeTABLEgrayline
- \checkTABLEgrayline#1\BR
- \global\TABLEgraylinetrue}}
-
-\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{\switchtocorps[\@@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\corpssize,
- \c!commandos=,
- \c!achtergrond=\v!raster,
- \c!achtergrondraster=\@@rsraster,
- \c!achtergrondkleur=]
-
-\def\ifintabel{\ifintable} % upward compatible
-
-\protect \endinput
-
\ No newline at end of file +%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 new file mode 100644 index 000000000..0c7d0a059 --- /dev/null +++ b/tex/context/base/core-var.tex @@ -0,0 +1,22 @@ +%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 diff --git a/tex/context/base/core-ver.tex b/tex/context/base/core-ver.tex index 634490aef..e2d72bf42 100644 --- a/tex/context/base/core-ver.tex +++ b/tex/context/base/core-ver.tex @@ -1,594 +1,674 @@ -%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\setupcommonverbatim#1%
- {\def\verbatimfont{\tttf}%
- \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!commandos=>\def\obeycharacters{\setupcommandsintype{#1}}%
- \let\obeytabs=\ignoretabs,
- \v!schuin=>\let\obeycharacters=\setupslantedtype
- \let\obeytabs=\ignoretabs,
- \v!normaal=>\let\obeycharacters=\setupgroupedtype,
- \v!geen=>\let\obeycharacters=\relax,
- \v!kleur=>\let\obeycharacters=\setupprettytextype
- \let\obeytabs=\ignoretabs]}
-
-%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!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]
-
-%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 [texprettyone] [r=.9, g=.0, b=.0] % red
-\definecolor [texprettytwo] [r=.0, g=.8, b=.0] % green
-\definecolor [texprettythree] [r=.0, g=.0, b=.9] % blue
-\definecolor [texprettyfour] [r=.8, g=.8, b=.6] % yellow
-
-%D We can use some core color commands. These are faster than
-%D the standard color swithing ones and work ok on a line by
-%D line basis.
-
-\def\texbeginofpretty[#1]{\startcolormode{#1}}
-\def\texendofpretty {\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
- \doifnotvalue{\??tp\v!file\c!optie}{\v!kleur}
- {\setuptyping[\v!file][\c!optie=\v!geen]}%
- \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!marge=\!!zeropoint,
- \c!blanko=\v!regel,
- \c!escape=/]
-
-\permitshiftedendofverbatim
-
-\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% + {\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 diff --git a/tex/context/base/core-vis.tex b/tex/context/base/core-vis.tex index 4d6e579a0..a9af0e2b9 100644 --- a/tex/context/base/core-vis.tex +++ b/tex/context/base/core-vis.tex @@ -1,311 +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 {\em Not yet documented!}
-
-\def\makecutbox#1%
- {\edef\ruledheight{\the\ht#1}%
- \edef\ruleddepth {\the\dp#1}%
- \edef\ruledwidth {\the\wd#1}%
- \setbox\scratchbox=\normalvbox
- {\dontcomplain
- \offinterlineskip
- \scratchdimen=12pt\relax
- \def\verrule##1##2%
- {\vrule
- \!!width\boxrulewidth
- \!!height##1\scratchdimen
- \!!depth##2\scratchdimen}%
- \def\horrule##1##2##3%
- {\normalhskip##1\scratchdimen
- \vrule
- \!!height\boxrulewidth
- \!!width##2\scratchdimen
- \normalhskip##3\scratchdimen}%
- \normalvskip-3\scratchdimen
- \normalhbox to \ruledwidth
- {\verrule{3}{-1}\normalhss\verrule{3}{-1}}%
- \normalhbox to \ruledwidth
- {\horrule{-3}{2}{1}\normalhss\horrule{1}{2}{-3}}%
- \normalvskip-\boxrulewidth
- \vskip\ruledheight
- \ifdim\ruleddepth>\!!zeropoint\relax
- \normalvskip-.5\boxrulewidth
- \normalhbox to \ruledwidth
- {\horrule{-2}{1}{1}\normalhss\horrule{1}{1}{-2}}%
- \normalvskip-.5\boxrulewidth
- \vskip\ruleddepth
- \fi
- \normalvskip-\boxrulewidth
- \normalhbox to \ruledwidth
- {\horrule{-3}{2}{1}\normalhss\horrule{1}{2}{-3}}%
- \normalhbox to \ruledwidth
- {\verrule{-1}{3}\normalhss\verrule{-1}{3}}}%
- \dp\scratchbox=\ruleddepth % This re-bounding is needed and
- \ht\scratchbox=\ruledheight % surfaced while typesetting continuous
- \setbox\scratchbox=\normalhbox % double culumns with pagecutmark
- {\lower\ruleddepth\box\scratchbox}%
- \setbox#1=\ifhbox#1\normalhbox\else\normalvbox\fi
- {\normalhbox
- {\wd#1=\!!zeropoint
- \box#1\relax
- \box\scratchbox}}%
- \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}
-
-%
-% \cutvbox
-% \cutvtop
-% \cuthbox
-%
-% \cutvbox{\ruledvbox{hello\par world \par \strut ziezo}}
-
-\protect
-
-\endinput
-
\ No newline at end of file +%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 b78dfca0f..7209db8f9 100644 --- a/tex/context/base/docs-ini.tex +++ b/tex/context/base/docs-ini.tex @@ -1,41 +1,40 @@ -%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 +%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 diff --git a/tex/context/base/font-ams.tex b/tex/context/base/font-ams.tex index 265b6d6d9..41c98d183 100644 --- a/tex/context/base/font-ams.tex +++ b/tex/context/base/font-ams.tex @@ -1,497 +1,496 @@ -%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.
-
-\definecorps [14.4pt,12pt,11pt,10pt,9pt] [mm]
- [ma=msam10 sa 1,
- mb=msbm10 sa 1]
-
-\definecorps [8pt,7pt] [mm]
- [ma=msam7 sa 1,
- mb=msbm7 sa 1]
-
-\definecorps [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 +%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 diff --git a/tex/context/base/font-cmr.tex b/tex/context/base/font-cmr.tex index f642f5ca5..3d586db8e 100644 --- a/tex/context/base/font-cmr.tex +++ b/tex/context/base/font-cmr.tex @@ -1,502 +1,501 @@ -%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.
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [12pt] [mm]
- [ex=cmex10 at 12pt,
- mi=cmmi12,
- sy=cmsy10 at 12pt]
-
-\definecorps [12pt] [hw]
- [tf=cmtt12]
-
-\definecorps [12pt] [cg]
- [tf=cmtt12]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [11pt] [tt]
- [tf=cmtt10 at 11pt,
- sl=cmsltt10 at 11pt,
- it=cmitt10 at 11pt]
-
-\definecorps [11pt] [mm]
- [ex=cmex10 at 11pt,
- mi=cmmi10 at 11pt,
- sy=cmsy10 at 11pt]
-
-\definecorps [11pt] [hw]
- [tf=cmtt10 at 11pt]
-
-\definecorps [11pt] [cg]
- [tf=cmtt10 at 11pt]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [10pt] [tt]
- [tf=cmtt10,
- sl=cmsltt10,
- it=cmitt10,
- tfa=cmtt10 scaled \magstep1,
- tfb=cmtt10 scaled \magstep2,
- tfc=cmtt10 scaled \magstep3,
- tfd=cmtt10 scaled \magstep4]
-
-\definecorps [10pt] [mm]
- [ex=cmex10,
- mi=cmmi10,
- sy=cmsy10]
-
-\definecorps [10pt] [hw]
- [tf=cmtt10]
-
-\definecorps [10pt] [cg]
- [tf=cmtt10]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [9pt] [tt]
- [tf=cmtt9,
- sl=cmsltt10 at 9pt,
- it=cmitt10 at 9pt]
-
-\definecorps [9pt] [mm]
- [ex=cmex10 at 9pt,
- mi=cmmi9,
- sy=cmsy9]
-
-\definecorps [9pt] [hw]
- [tf=cmtt9]
-
-\definecorps [9pt] [cg]
- [tf=cmtt9]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [8pt] [tt]
- [tf=cmtt8,
- sl=cmsltt10 at 8pt,
- it=cmitt10 at 8pt]
-
-\definecorps [8pt] [mm]
- [ex=cmex10 at 8pt,
- mi=cmmi8,
- sy=cmsy8]
-
-\definecorps [8pt] [hw]
- [tf=cmtt8]
-
-\definecorps [8pt] [cg]
- [tf=cmtt8]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [7pt] [tt]
- [tf=cmtt10 at 7pt,
- sl=cmsltt10 at 7pt,
- it=cmitt10 at 7pt]
-
-\definecorps [7pt] [mm]
- [ex=cmex10 at 7pt,
- mi=cmmi7,
- sy=cmsy7]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [6pt] [tt]
- [tf=cmtt10 at 6pt,
- sl=cmsltt10 at 6pt,
- it=cmitt10 at 6pt]
-
-\definecorps [6pt] [mm]
- [ex=cmex10 at 6pt,
- mi=cmmi6,
- sy=cmsy6]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [5pt] [tt]
- [tf=cmtt10 at 5pt,
- sl=cmsltt10 at 5pt,
- it=cmitt10 at 5pt]
-
-\definecorps [5pt] [mm]
- [ex=cmex10 at 5pt,
- mi=cmmi5,
- sy=cmsy5]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [4pt] [tt]
- [tf=cmtt10 at 4pt,
- sl=cmsltt10 at 4pt,
- it=cmitt10 at 4pt]
-
-\definecorps [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.
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [7pt] [rm]
- [bfa=cmbx7 scaled \magstep1,
- bfb=cmbx7 scaled \magstep2,
- bfc=cmbx7 scaled \magstep3,
- bfd=cmbx7 scaled \magstep4]
-
-\definecorps [6pt] [rm]
- [bfa=cmbx6 scaled \magstep1,
- bfb=cmbx6 scaled \magstep2,
- bfc=cmbx6 scaled \magstep3,
- bfd=cmbx6 scaled \magstep4]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [12pt] [tt]
- [sla=cmsltt10 scaled \magstep2,
- slb=cmsltt10 scaled \magstep3,
- slc=cmsltt10 scaled \magstep4,
- sld=cmsltt10 scaled \magstep5]
-
-\definecorps [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 +%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 diff --git a/tex/context/base/font-con.tex b/tex/context/base/font-con.tex index 3d4c7d5a2..bd8412750 100644 --- a/tex/context/base/font-con.tex +++ b/tex/context/base/font-con.tex @@ -1,62 +1,61 @@ -%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.
-
-\definecorps [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
-
-\definecorps [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
-
-\definecorps [10pt] [rm]
- [tf=ccr10,
- it=ccti10,
- sl=ccsl10,
- sc=cccsc10]
-
-\definecorps [9pt] [rm]
- [tf=ccr9,
- it=ccr9,
- sl=ccr9,
- sc=ccr9]
-
-\definecorps [8pt] [rm]
- [tf=ccr8,
- it=ccr8,
- sl=ccr8,
- sc=ccr8]
-
-\definecorps [7pt] [rm]
- [tf=ccr7,
- it=ccr7,
- sl=ccr7,
- sc=ccr7]
-
-\definecorps [6pt] [rm]
- [tf=ccr6,
- it=ccr6,
- sl=ccr6,
- sc=ccr6]
-
-\definecorps [5pt] [rm]
- [tf=ccr5,
- it=ccr5,
- sl=ccr5,
- sc=ccr5]
-
-\endinput
-
\ No newline at end of file +%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 diff --git a/tex/context/base/font-eul.tex b/tex/context/base/font-eul.tex index 4a219dc4c..8d356fbbe 100644 --- a/tex/context/base/font-eul.tex +++ b/tex/context/base/font-eul.tex @@ -1,174 +1,173 @@ -%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.
-
-\definecorps [12pt] [mm] % scaled \magstep1
- [mi=eurm10 at 12pt,
- ex=euex10 at 12pt,
- ma=euex10 at 12pt,
- mb=eusm10 at 12pt,
- mc=eufm10 at 12pt]
-
-\definecorps [11pt] [mm] % scaled \magstephalf
- [mi=eurm10 at 11pt,
- ex=euex10 at 11pt,
- ma=euex10 at 11pt,
- mb=eusm10 at 11pt,
- mc=eufm10 at 11pt]
-
-\definecorps [10pt] [mm]
- [mi=eurm10,
- ex=euex10,
- ma=euex10,
- mb=eusm10,
- mc=eufm10]
-
-\definecorps [9pt] [mm]
- [mi=eurm10 at 9pt,
- ex=euex10 at 9pt,
- ma=euex10 at 9pt,
- mb=eusm10 at 9pt,
- mc=eufm10 at 9pt]
-
-\definecorps [8pt] [mm]
- [mi=eurm7 at 8pt,
- ex=euex10 at 8pt,
- ma=euex10 at 8pt,
- mb=eusm7 at 8pt,
- mc=eufm7 at 8pt]
-
-\definecorps [7pt] [mm]
- [mi=eurm7,
- ex=euex10 at 7pt,
- ma=euex10 at 7pt,
- mb=eusm7,
- mc=eufm7]
-
-\definecorps [6pt] [mm]
- [mi=eurm7 at 6pt,
- ex=euex10 at 6pt,
- ma=euex10 at 6pt,
- mb=eusm7 at 6pt,
- mc=eufm7 at 6pt]
-
-\definecorps [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 +%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 diff --git a/tex/context/base/font-ibm.tex b/tex/context/base/font-ibm.tex new file mode 100644 index 000000000..95669d9d2 --- /dev/null +++ b/tex/context/base/font-ibm.tex @@ -0,0 +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 diff --git a/tex/context/base/font-ini.tex b/tex/context/base/font-ini.tex index 228fa0e39..7c28203ef 100644 --- a/tex/context/base/font-ini.tex +++ b/tex/context/base/font-ini.tex @@ -1,2548 +1,2629 @@ -%D \module
-%D [ file=font-ini,
-%D version=1995.1.1,
-%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: corps
- 1: coding --, one could use grouping
- 2: variant -- is loaded
- 3: unknown variant --
- 4: corps -- 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 calligraphy \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 specifiy 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 corps 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 corps 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) + corps (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 corps
-%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.
-
-\def\mrfam{0} % 0 (Plain TeX) Math Roman
-\def\mifam{1} % 1 (Plain TeX) Math Italic
-\def\syfam{2} % 2 (Plain TeX) Math Symbol
-\def\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 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 isn't used, at the moment we have two families left:~7
-%D and~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}
-
-%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@} % corps 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 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 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.
-
-\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 corpssize 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.
-
-\def\dodoloadfont#1#2#3%
- {\expanded{\docalculatefont\getvalue{\??ft#1#2} sa sa*#1*#2*}%
- #3\relax
- \getvalue{#1#2}}
-
-%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%
- {\debuggerinfo{\m!fonts}{loaded #1#2}%
- \dodoloadfont{#1}{#2}{}}
-
-\def\doloadttfont#1#2%
- {\debuggerinfo{\m!fonts}{loaded fixed #1#2}%
- \dodoloadfont{#1}{#2}{\expandafter\hyphenchar\csname#1#2\endcsname=-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 {definecorpsenvironment}
-%D
-%D The relationship between the several sizes of a font, is
-%D defined by:
-%D
-%D \showsetup{\y!definecorpsenvironment}
-%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 \definecorpsenvironment
-%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 corps 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\definecorpsenvironment%
- {\dodoubleempty\dodefinecorpsenvironment}
-
-\def\dodefinecorpsenvironment[#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 corps size (begin
-%D \type{#1}), so the next setup is valid too:
-%D
-%D \starttypen
-%D \definecorpsenvironment[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 {definecorps}
-%D
-%D The next step in defining a corps 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!definecorps}
-%D
-%D This commands takes three arguments, where \showparameter\
-%D takes a (series of) corps size(s) and \showparameter\
-%D the style group to which the definitions belong.
-%D
-%D Argument \showparameter\ 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 \definecorps [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 \definecorps [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\definecorps%
- {\dotripleargument\dodefinecorps}
-
-%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\dodefinecorps[#1][#2][#3]%
- {\ifthirdargument
- \def\dododefinecorps##1%
- {\dodododefinecorps[##1][#2][#3]}%
- \processcommalist[#1]\dododefinecorps
- \else
- \definecorps[#1][\c!rm][#2]%
- \fi}
-
-%D Defining a corps 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 corps size related fonts. The first step is corps
-%D independant but executed every time. This permits user
-%D definitions like \type{\tfw} or \type{\bfq} for real large
-%D alterbatives.
-
-\def\dodododefinecorps[#1][#2][#3]%
- {\geteparameters[\??ft#1#2][#3]% We expand them!
- \dodefinecorpsenvironment[#1][]% Just to be sure.
- \def\doiffamily##1##2##3\\%
- {\rawdoifinsetelse{##1##2}{\familylist}
- {\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%
- {\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}%
- \expandafter\doiffamily##1\\}%
- \processassignlist[#3]\dodefinefont}
-
-%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 {everycorps,EveryCorps}
-%D
-%D Every change in corps 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 \everycorps \EveryCorps
-
-%D At the system level one can initialize thing like:
-%D
-%D \starttypen
-%D \appendtoks \setupspacing \to \everycorps
-%D \stoptypen
-%D
-%D While users can add their own non standard commands like:
-%D
-%D \starttypen
-%D \EveryCorps{\message{changing to corps \the\corpssize}}
-%D \stoptypen
-%D
-%D Personnaly I never felt the need for such extensions, but
-%D at least its possible.
-
-%D \macros
-%D {globalcorpssize,localcorpssize}
-%D
-%D Next we'll do the tough job of font switching. Here we
-%D have to distinguish between the global (overal) corps size
-%D and the local (sometimes in the textflow) size. We store
-%D these dimensions in two \DIMENSION\ registers.
-
-\newdimen\globalcorpssize \globalcorpssize=12pt
-\newdimen\localcorpssize \localcorpssize =\globalcorpssize
-
-%D \macros
-%D {corpssize}
-%D
-%D These two registers are not to be misused in calculations.
-%D For this purpose we keep a copy:
-
-\newdimen\corpssize \corpssize=\globalcorpssize
-
-%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 {corpsfactor,corpspoints}
-%D
-%D For multiplication purposes we keep an auxiliary counter
-%D and macro (here the expansion is not explicitly needed):
-
-\newcount\corpspoints \dimensiontocount\corpssize\corpspoints
-
-\edef\corpsfactor{\withoutpt\the\corpssize}
-
-%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 specifies the corps size. Therefore
-%D we also store normalized value.
-
-\def\normalizecorpssize#1\to#2%
- {\scratchdimen=#1\relax
- \doifinstringelse{.0}{\withoutpt\the\scratchdimen}
- {\dimensiontocount\scratchdimen\scratchcounter
- \edef#2{\the\scratchcounter pt}}
- {\edef#2{\the\scratchdimen}}}
-
-\normalizecorpssize\corpssize\to\normalizedglobalcorpssize
-\normalizecorpssize\corpssize\to\normalizedlocalcorpssize
-\normalizecorpssize\corpssize\to\normalizedcorpssize
-
-%D To be internationalized:
-
-\def\korpsgrootte {\corpssize}
-\def\korpspunten {\corpspoints}
-
-%D some day.
-
-%D \macros
-%D {fontsize,fontstyle}
-%D
-%D Within a corps, 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 \expandafter\type\expandafter{\f!fontprefix cmr}.
-%D These files are loaded by:
-
-\def\doreadfontdefinitionfile#1%
- {\doifundefined{\c!file\f!fontprefix#1}%
- {\setvalue{\c!file\f!fontprefix#1}{}%
- \edef\saveddqcatcode{\the\catcode`"}%
- \catcode`\"=\@@other
- \readsysfile{\f!fontprefix#1}
- {\showmessage{\m!fonts}{2}{#1}}
- {\showmessage{\m!fonts}{3}{#1}}%
- \catcode`\"=\saveddqcatcode}}
-
-%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 inactibe 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}%
- \localcorpssize=#1\relax
- \normalizecorpssize\localcorpssize\to\normalizedcorpssize
- \the\everycorps}
- {\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{\definecorps} 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 corps 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 corps 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}{\normalizedcorpssize\normalspace\fontstyle}%
- \doswitchpoints[\normalizedcorpssize]%
- \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 corps size.
-
-\def\dosetfont[#1]%
- {\doifelse{#1}{\v!globaal}
- {\restoreglobalcorps}
- {\processcommalist[#1]\dodosetfont
- \ifloadingfonts\else
- \doswitchpoints[\normalizedcorpssize]%
- \doswitchstyle[\fontstyle]%
- \fi}}
-
-\def\dodosetfont#1%
- {\dododosetfont{#1}{\showmessage{\m!fonts}{4}{#1}}}
-
-\def\dododosetfont#1#2%
- {\doifnumberelse{#1}
- {\scratchdimen=#1\relax
- \normalizecorpssize\scratchdimen\to\normalizedsetfont
- \doifdefinedelse{\@size@\normalizedsetfont}
- {\localcorpssize=\normalizedsetfont
- \let\normalizedcorpssize=\normalizedsetfont}
- {#2\dosetsubstitutefont{#1}}}
- {\doifdefinedelse{\@style@#1}
- {\edef\fontstyle{#1}}
- {\doreadfontdefinitionfile{#1}}}}
-
-%D When users specify for instance a 13 point corps while no
-%D such corps is defined, the system automatically tries to
-%D find a best fit, that is the nearest smaller defined
-%D corpszize. 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{\normalizedcorpssize#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 corpsenvironment are
-%D used.
-
-\def\dosetsomextypeface#1%
- {\doifdefinedelse{#1}
- {\getvalue{#1}}
- {\showmessage{\m!fonts}{7}{#1}}}%
-
-\def\dosetxtypeface#1%
- {\ifmmode
- \scriptstyle
- \else
- \dosetsomextypeface
- {\getvalue{\??ft\normalizedcorpssize\c!x}% % pt
- \getvalue{\@shortstyle@\fontstyle}% % rm
- #1}% % tf
- \unexpanded\def\tx{\dosetxxtypeface{#1}}%
- \fi}
-
-\def\dosetxxtypeface#1%
- {\ifmmode
- \scriptscriptstyle
- \else
- \dosetsomextypeface
- {\getvalue{\??ft\normalizedcorpssize\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%
- {\def\setfamily##1##2%
- {\doifdefinedelse{##2#1#2}
- {\debuggerinfo{\m!fonts}{defined ##2#1#2}%
- \getvalue{##2#1#2}\relax % activate font
- \expandafter##1\getvalue{#2\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{#2\s!fam}=\getvalue{##2#1\c!tf}}
- {\debuggerinfo{\m!fonts}{not defined ##2#1#2}}}}%
- \scriptscriptfont\getvalue{#2\s!fam}=\scriptfont\getvalue{#2\s!fam}%
- \setfamily\scriptscriptfont\scriptscriptface
- \scriptfont\getvalue{#2\s!fam}=\textfont\getvalue{#2\s!fam}%
- \setfamily\scriptfont\scriptface
- \textfont\getvalue{#2\s!fam}=\textfont\tffam
- \setfamily\textfont\textface}
-
-%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%
- {\settextfamily{#2}{##1}%
- \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 When setting the \type{\skewchar} we need to test on the
-%D availability first.
-
-\def\setskewchar#1#2%
- {\doifdefined{#1}
- {\getvalue{#1}\expandafter\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 \setupcorps
-%D [ams]
-%D
-%D \definecorps [24pt] [mm]
-%D [ma=msam10 at 24pt,
-%D mb=msbm10 at 24pt]
-%D
-%D \switchtocorps
-%D [24pt]
-%D
-%D This is a 24pt $\blacktriangleleft$
-%D \stoptypen
-%D
-%D Here we didn't define the 24 point corps 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{\everycorps}
-
-\def\docompletefontswitch[#1]%
- {\corpssize=#1\relax
- \dimensiontocount\corpssize\corpspoints
- \edef\corpsfactor{\withoutpt\the\corpssize}%
- \normalizecorpssize\corpssize\to\normalizedcorpssize
- \edef\textface{\getvalue{\??ft\normalizedcorpssize\s!text}}%
- \edef\scriptface{\getvalue{\??ft\normalizedcorpssize\s!script}}%
- \edef\scriptscriptface{\getvalue{\??ft\normalizedcorpssize\s!scriptscript}}%
- \settextfonts
- \setmathfamilies
- \rmtf
- \the\everycorps}
-
-%D \macros
-%D {setupcorps,switchtocorps}
-%D
-%D The next two macros are user ones. With \type{\setupcorps}
-%D one can set the document corps size, font family, style
-%D and/or options defined in files, for example:
-%D
-%D \starttypen
-%D \setupcorps[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 \switchtocorps[10pt]
-%D \stoptypen
-%D
-%D So we've got:
-%D
-%D \showsetup{\y!setupcorps}
-%D \showsetup{\y!switchtocorps}
-%D
-%D Both macros look alike. The second one also has to take
-%D all kind of keywords into account.
-
-\def\setupcorps[#1]%
- {\doifsomething{#1}
- {\dosetfont[#1]%
- \globalcorpssize=\localcorpssize
- \normalizecorpssize\globalcorpssize\to\normalizedglobalcorpsize
- \let\globalfontstyle=\fontstyle
- \the\everycorps}}
-
-\unexpanded\def\switchtocorps[#1]%
- {\doifsomething{#1}
- {\doifdefinedelse{\??ft\normalizedcorpssize\interfaced{#1}}
- {\doswitchpoints[\getvalue{\??ft\normalizedcorpssize\interfaced{#1}}]%
- \doswitchstyle[\fontstyle]}
- {\dosetfont[#1]}%
- \the\everycorps}}
-
-%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}%
- \edef\mffam{\getvalue{#1\s!fam}}%
- \textfont\mrfam=\textfont\mffam
- \scriptfont\mrfam=\scriptfont\mffam
- \scriptscriptfont\mrfam=\scriptscriptfont\mffam}
-
-\def\dosettypeface#1#2%
- {\doifdefinedelse{@\normalizedcorpssize#1#2@}
- {\edef\charactercoding{\getvalue{@\normalizedcorpssize#1#2@}}}
- {\let\charactercoding=\@plain@}%
- \unexpanded\def\tx%
- {\dosetxtypeface{#2\fontsize}}%
- \unexpanded\def\txx%
- {\dosetxxtypeface{#2\fontsize}}%
- \expandafter\fam\getvalue{#2\s!fam}%
- \def\mf{\donottest{\dosetmathfont{#2}}}%
- \donottest\getvalue{#1#2}}
-
-%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.}
-
-\def\os%
- {\getvalue{\normalizedcorpssize\c!mm\c!mi}}
-
-%D \macros
-%D {definecorpsswitch}
-%D
-%D \PLAIN\ \TEX\ defines some macro's like \type{\tenpoint}
-%D to switch to a specific corpssize. Just for the sake of
-%D compatibility we can define them like:
-%D
-%D \starttypen
-%D \definecorpsswitch [twelvepoint] [12pt]
-%D \stoptypen
-%D
-%D We don't support language specific synonyms here, mainly
-%D because \PLAIN\ \TEX\ is english anyway.
-
-\def\dodefinecorpsswitch[#1][#2]%
- {\def\docommando##1%
- {\setvalue{##1}{\switchtocorps[#2]}}%
- \processcommalist[#1]\docommando}
-
-\def\definecorpsswitch%
- {\dodoubleargument\dodefinecorpsswitch}
-
-%D \macros
-%D {setsmallcorps,setmaincorps,setbigcorps}
-%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{\switchtocorps[small]}.
-%D The three alternatives can be activated by the next three
-%D system calls and are defined by the corpsenvironment.
-
-\def\setsmallcorps%
- {\doswitchpoints[\getvalue{\??ft\normalizedcorpssize\v!klein}]%
- \doswitchstyle[\fontstyle]}
-
-\def\setmaincorps%
- {\doswitchpoints[\normalizedcorpssize]%
- \doswitchstyle[\fontstyle]}
-
-\def\setbigcorps%
- {\doswitchpoints[\getvalue{\??ft\normalizedcorpssize\v!groot}]%
- \doswitchstyle[\fontstyle]}
-
-%D \macros
-%D {restoreglobalcorps}
-%D
-%D Users can set whatever font available while typesetting text.
-%D Pagenumnbers, footers, headers etc. however must be typeset
-%D in the main corps and style of the document. Returning to
-%D the global state can be done with the next macro:
-
-\def\restoreglobalcorps%
- {\let\fontsize=\empty
- \doswitchpoints[\normalizedglobalcorpsize]%
- \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 corps and style
-%D while the running text is temporary set to a smaller one|>|
-%D by saying \type{\switchtocorps[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 corps and style, so
-%D here too we use a direct method.
-
-\def\infofont%
- {\getvalue{\!!sixpoint\c!tt\c!tf}%
- \the\everycorps}
-
-%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 {showcorps}
-%D
-%D One can call for a rather simple overview of a corps and the
-%D relations between its alternative fonts.
-%D
-%D \showsetup{\y!showcorps}
-%D
-%D The current corps (here we omitted the argument) looks like:
-%D
-%D \showcorps
-%D
-%D The implementation is rather straightforward in using
-%D \type{\halign}.
-
-\def\doshowcorps[#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}}
- {\switchtocorps[#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\showcorps%
- {\dosingleempty\doshowcorps}
-
-%D \macros
-%D {showcorpsenvironment}
-%D
-%D The current corpsenvironment is:
-%D
-%D \showcorpsenvironment
-%D
-%D This overview is generated using:
-%D
-%D \showsetup{\y!showcorpsenvironment}
-
-\def\doshowcorpsenvironment[#1]%
- {\startbaselinecorrection
- \vbox
- {\tabskip\!!zeropoint
- \parindent\!!zeropoint
- \doifelsenothing{#1}
- {\def\title{\the\korpsgrootte}}
- {\switchtocorps[#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\showcorpsenvironment%
- {\dosingleempty\doshowcorpsenvironment}
-
-%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.
-
-\let\normalaccent=\accent
-
-\def\dodosmashaccent#1%
- {\setbox0=\hbox{#1}%
- \setbox2=\hbox{\normalaccent\scratchcounter#1}%
- \ht2=\ht0\box2
- \egroup
- \nobreak}
-
-\def\dosmashaccent%
- {\afterassignment\dodosmashaccent\expandafter\scratchcounter}
-
-\def\smashaccent%
- {\dontleavehmode
- \bgroup
- \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%
- {\dimen2=\fontdimen5\font
- \dimen4=\dimen2
- \advance\dimen4 by -\dimen0
- \fontdimen5\font=\dimen4
- \normalaccent\scratchcounter#1\relax
- \fontdimen5\font=\dimen2
- \egroup}
-
-\def\domoveaccent%
- {\afterassignment\dodomoveaccent\expandafter\scratchcounter}
-
-\def\moveaccent#1%
- {\dontleavehmode
- \bgroup
- \dimen0=#1\relax
- \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
-
-\definecorpsenvironment
- [\!!fourteenpointfour]
- [ \s!text=\!!fourteenpointfour,
- \s!script=\!!elevenpoint,
- \s!scriptscript=\!!ninepoint,
- \c!x=\!!twelvepoint,
- \c!xx=\!!tenpoint,
- \c!groot=\!!fourteenpointfour,
- \c!klein=\!!twelvepoint]
-
-\definecorpsenvironment
- [\!!twelvepoint]
- [ \s!text=\!!twelvepoint,
- \s!script=\!!ninepoint,
- \s!scriptscript=\!!sevenpoint,
- \c!x=\!!tenpoint,
- \c!xx=\!!eightpoint,
- \c!groot=\!!fourteenpointfour,
- \c!klein=\!!tenpoint]
-
-\definecorpsenvironment
- [\!!elevenpoint]
- [ \s!text=\!!elevenpoint,
- \s!script=\!!eightpoint,
- \s!scriptscript=\!!sixpoint,
- \c!x=\!!ninepoint,
- \c!xx=\!!sevenpoint,
- \c!groot=\!!twelvepoint,
- \c!klein=\!!ninepoint]
-
-\definecorpsenvironment
- [\!!tenpoint]
- [ \s!text=\!!tenpoint,
- \s!script=\!!sevenpoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!eightpoint,
- \c!xx=\!!sixpoint,
- \c!groot=\!!twelvepoint,
- \c!klein=\!!eightpoint]
-
-\definecorpsenvironment
- [\!!ninepoint]
- [ \s!text=\!!ninepoint,
- \s!script=\!!sevenpoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!sevenpoint,
- \c!xx=\!!fivepoint,
- \c!groot=\!!elevenpoint,
- \c!klein=\!!sevenpoint]
-
-\definecorpsenvironment
- [\!!eightpoint]
- [ \s!text=\!!eightpoint,
- \s!script=\!!sixpoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!sixpoint,
- \c!xx=\!!fivepoint,
- \c!groot=\!!tenpoint,
- \c!klein=\!!sixpoint]
-
-\definecorpsenvironment
- [\!!sevenpoint]
- [ \s!text=\!!sevenpoint,
- \s!script=\!!sixpoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!sixpoint,
- \c!xx=\!!fivepoint,
- \c!groot=\!!ninepoint,
- \c!klein=\!!fivepoint]
-
-\definecorpsenvironment
- [\!!sixpoint]
- [ \s!text=\!!sixpoint,
- \s!script=\!!fivepoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!fivepoint,
- \c!xx=\!!fivepoint,
- \c!groot=\!!eightpoint,
- \c!klein=\!!fivepoint]
-
-\definecorpsenvironment
- [\!!fivepoint]
- [ \s!text=\!!fivepoint,
- \s!script=\!!fivepoint,
- \s!scriptscript=\!!fivepoint,
- \c!x=\!!fivepoint,
- \c!xx=\!!fivepoint,
- \c!groot=\!!sevenpoint,
- \c!klein=\!!fivepoint]
-
-\definecorpsenvironment
- [\!!fourpoint]
- [ \s!text=\!!fourpoint,
- \s!script=\!!fourpoint,
- \s!scriptscript=\!!fourpoint,
- \c!x=\!!fourpoint,
- \c!xx=\!!fourpoint,
- \c!groot=\!!sixpoint,
- \c!klein=\!!fourpoint]
-
-\definecorpsswitch [fourteenpointfour] [\!!fourteenpointfour]
-\definecorpsswitch [twelvepoint] [\!!twelvepoint]
-\definecorpsswitch [elevenpoint] [\!!elevenpoint]
-\definecorpsswitch [tenpoint] [\!!tenpoint]
-\definecorpsswitch [ninepoint] [\!!ninepoint]
-\definecorpsswitch [eightpoint] [\!!eightpoint]
-\definecorpsswitch [sevenpoint] [\!!sevenpoint]
-\definecorpsswitch [sixpoint] [\!!sixpoint]
-\definecorpsswitch [fivepoint] [\!!fivepoint]
-\definecorpsswitch [fourpoint] [\!!fourpoint]
-
-\definecorpsswitch [xii] [\!!twelvepoint]
-\definecorpsswitch [xi] [\!!elevenpoint]
-\definecorpsswitch [x] [\!!tenpoint]
-\definecorpsswitch [ix] [\!!ninepoint]
-\definecorpsswitch [viii] [\!!eightpoint]
-\definecorpsswitch [vii] [\!!sevenpoint]
-\definecorpsswitch [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 corps. 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{\setupcorps[pos]}).
-
-\setupcorps [cmr, 12pt, \v!romaan, ibm, ans]
-
-\protect
-
-\endinput
-
\ No newline at end of file +%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 diff --git a/tex/context/base/font-lbr.tex b/tex/context/base/font-lbr.tex index a5ed56f4a..92937c18e 100644 --- a/tex/context/base/font-lbr.tex +++ b/tex/context/base/font-lbr.tex @@ -1,339 +1,348 @@ -%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 corps is indeed never that size. The Lucida Bright
-%D fonts come in one design size.
-
-\startcoding[texnansi]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [14.4pt,12pt,11pt,10pt,9pt,8pt] [tt]
- [tf=lstr sa 1,
- sl=lsto sa 1,
- tfa=lstr sa 1.200,
- tfb=lstr sa 1.440,
- tfc=lstr sa 1.728,
- tfd=lstr sa 2.074]
-
-\definecorps [14.4pt,12pt,11pt,10pt,9pt,8pt] [hw]
- [tf=lbh sa 1]
-
-\definecorps [14.4pt,12pt,11pt,10pt,9pt,8pt] [cg]
- [tf=lbc sa 1]
-
-\definecorps [14.4pt,12pt,11pt,10pt,9pt,8pt] [mm]
- [ex=lbme sa 1,
- mi=lbmo sa 1,
- sy=lbms sa 1,
- ma=lbma sa 1]
-
-\definecorps [7pt,6pt,5pt] [rm]
- [tf=lbr sa 1,
- bf=lbd sa 1,
- sl=lbi sa 1,
- it=lbi sa 1]
-
-\definecorps [7pt,6pt,5pt] [ss]
- [tf=lsr sa 1,
- sl=lsd sa 1,
- it=lsi sa 1,
- bf=lsi sa 1]
-
-\definecorps [7pt,6pt,5pt] [tt]
- [tf=lstr sa 1,
- sl=lsto sa 1]
-
-\definecorps [7pt,6pt,5pt] [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}.
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [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 Firt we implement some alternatives for \AMS\ symbols.
-%D These can be overrules by loading the \AMS\ font module
-%D afterwards.
-
-\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.
-
-\unprotect
-
-\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=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 diff --git a/tex/context/base/font-pcr.tex b/tex/context/base/font-pcr.tex index 93839fe67..7251f3f48 100644 --- a/tex/context/base/font-pcr.tex +++ b/tex/context/base/font-pcr.tex @@ -1,40 +1,45 @@ -%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]
-
-\definecorps [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]
-
-\definecorps [7pt,6pt,5pt] [tt]
- [tf=com sa 1,
- sl=coo sa 1]
-
-\definecorps [14.4pt,12pt,11pt,10pt,9pt,8pt,7pt,6pt,5pt] [tt]
- [tf=com sa 1,
- sl=coo sa 1]
-
-\definecorps [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
-
-\endinput
-
\ No newline at end of file +%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 diff --git a/tex/context/base/font-phv.tex b/tex/context/base/font-phv.tex index 649cdb136..c9d1a6477 100644 --- a/tex/context/base/font-phv.tex +++ b/tex/context/base/font-phv.tex @@ -1,53 +1,52 @@ -%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]
-
-\definecorps [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]
-
-\definecorps [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]
-
-\definecorps [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
-
\ No newline at end of file +%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 diff --git a/tex/context/base/font-pos.tex b/tex/context/base/font-pos.tex index 4783df561..c168d1121 100644 --- a/tex/context/base/font-pos.tex +++ b/tex/context/base/font-pos.tex @@ -1,18 +1,17 @@ -%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 +%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 diff --git a/tex/context/base/font-ptm.tex b/tex/context/base/font-ptm.tex index ada19fa92..4e748d960 100644 --- a/tex/context/base/font-ptm.tex +++ b/tex/context/base/font-ptm.tex @@ -1,53 +1,52 @@ -%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]
-
-\definecorps [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]
-
-\definecorps [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
-
-\definecorps [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
-
\ No newline at end of file +%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 diff --git a/tex/context/base/lang-alt.tex b/tex/context/base/lang-alt.tex index b6504ffeb..41614f2e7 100644 --- a/tex/context/base/lang-alt.tex +++ b/tex/context/base/lang-alt.tex @@ -1,87 +1,86 @@ -%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 +%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 diff --git a/tex/context/base/lang-ana.tex b/tex/context/base/lang-ana.tex index 742d5f6fb..5f5b021bf 100644 --- a/tex/context/base/lang-ana.tex +++ b/tex/context/base/lang-ana.tex @@ -1,21 +1,20 @@ -%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 +%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 diff --git a/tex/context/base/lang-art.tex b/tex/context/base/lang-art.tex index d91be59fb..3538e774e 100644 --- a/tex/context/base/lang-art.tex +++ b/tex/context/base/lang-art.tex @@ -1,23 +1,22 @@ -%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 +%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 diff --git a/tex/context/base/lang-bal.tex b/tex/context/base/lang-bal.tex index 2d95f3735..a0b043019 100644 --- a/tex/context/base/lang-bal.tex +++ b/tex/context/base/lang-bal.tex @@ -1,23 +1,22 @@ -%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 +%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 diff --git a/tex/context/base/lang-cel.tex b/tex/context/base/lang-cel.tex index 2f104e9e1..90dd3f8ce 100644 --- a/tex/context/base/lang-cel.tex +++ b/tex/context/base/lang-cel.tex @@ -1,23 +1,22 @@ -%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 +%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 diff --git a/tex/context/base/lang-da.pat b/tex/context/base/lang-da.pat index 7259cee1d..e49c9fe4e 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 e0373ee4e..6a9a897f4 100644 --- a/tex/context/base/lang-de.pat +++ b/tex/context/base/lang-de.pat @@ -1,2581 +1,2580 @@ -% 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 +% 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 diff --git a/tex/context/base/lang-en.pat b/tex/context/base/lang-en.pat index 57341a7a2..efd11cdf1 100644 --- a/tex/context/base/lang-en.pat +++ b/tex/context/base/lang-en.pat @@ -1,4468 +1,4467 @@ -% 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 +% 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 diff --git a/tex/context/base/lang-fr.pat b/tex/context/base/lang-fr.pat index 374822e74..d5edc1a39 100644 --- a/tex/context/base/lang-fr.pat +++ b/tex/context/base/lang-fr.pat @@ -1,511 +1,510 @@ -% 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 +% 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 diff --git a/tex/context/base/lang-ger.tex b/tex/context/base/lang-ger.tex index f55809e64..1bfa56284 100644 --- a/tex/context/base/lang-ger.tex +++ b/tex/context/base/lang-ger.tex @@ -1,527 +1,535 @@ -%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!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 \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 +%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 diff --git a/tex/context/base/lang-grk.tex b/tex/context/base/lang-grk.tex index 51590dd06..7041962a9 100644 --- a/tex/context/base/lang-grk.tex +++ b/tex/context/base/lang-grk.tex @@ -1,23 +1,22 @@ -%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 +%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 diff --git a/tex/context/base/lang-hnl.tex b/tex/context/base/lang-hnl.tex index 32317499f..5932769c3 100644 --- a/tex/context/base/lang-hnl.tex +++ b/tex/context/base/lang-hnl.tex @@ -1,33 +1,32 @@ -%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 +%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 diff --git a/tex/context/base/lang-ind.tex b/tex/context/base/lang-ind.tex index 29df64cae..f1e50901d 100644 --- a/tex/context/base/lang-ind.tex +++ b/tex/context/base/lang-ind.tex @@ -1,23 +1,22 @@ -%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 +%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 diff --git a/tex/context/base/lang-ini.tex b/tex/context/base/lang-ini.tex index 0609e6620..eb81793c4 100644 --- a/tex/context/base/lang-ini.tex +++ b/tex/context/base/lang-ini.tex @@ -1,509 +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 scommand 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
-
\ No newline at end of file +%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 7b0ecd599..66457543a 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 d2fc6f204..1cd71ba13 100644 --- a/tex/context/base/lang-ita.tex +++ b/tex/context/base/lang-ita.tex @@ -1,282 +1,281 @@ -%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 +%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 diff --git a/tex/context/base/lang-lab.tex b/tex/context/base/lang-lab.tex index 38501603b..a5c19a31b 100644 --- a/tex/context/base/lang-lab.tex +++ b/tex/context/base/lang-lab.tex @@ -1,179 +1,181 @@ -%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\headtext%
- {\dogetupsometextprefix\v!kop}
-
-\def\labeltext%
- {\dogetupsometextprefix\c!label}
-
-\def\LABELTEXT#1%
- {\bgroup
- \let\handletextprefix=\uppercase
- \the\everyuppercase
- \dogetupsometextprefix\c!label{#1}% not \labeltext (see \MONTH)
- \egroup}
-
-\unexpanded\def\dogetupsometextprefix#1#2%
- {\doifdefinedelse{#1\currentmainlanguage#2}
- {\getvalue{#1\currentmainlanguage#2}}
- {\doifdefinedelse{#1#2}
- {\getvalue{#1#2}}
- {{\tttf[#1: #2/\currentmainlanguage]~}}}}
-
-%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 +%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 diff --git a/tex/context/base/lang-nl.hyp b/tex/context/base/lang-nl.hyp index 7d997255d..1e56fb9cb 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 9bc73109c..4eeb65a29 100644 --- a/tex/context/base/lang-nl.pat +++ b/tex/context/base/lang-nl.pat @@ -1,7947 +1,7946 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% 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 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 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 diff --git a/tex/context/base/lang-nlx.pat b/tex/context/base/lang-nlx.pat index 5e8b46062..7b7780c1b 100644 --- a/tex/context/base/lang-nlx.pat +++ b/tex/context/base/lang-nlx.pat @@ -1,8031 +1,8030 @@ -% 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 +% 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 diff --git a/tex/context/base/lang-sla.tex b/tex/context/base/lang-sla.tex index c7e8dcc29..c61455e19 100644 --- a/tex/context/base/lang-sla.tex +++ b/tex/context/base/lang-sla.tex @@ -1,87 +1,86 @@ -%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 +%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 diff --git a/tex/context/base/lang-sp.pat b/tex/context/base/lang-sp.pat index 72c2e6095..f3b0e56e8 100644 --- a/tex/context/base/lang-sp.pat +++ b/tex/context/base/lang-sp.pat @@ -1,151 +1,150 @@ -% 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 +% 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 diff --git a/tex/context/base/lang-ura.tex b/tex/context/base/lang-ura.tex index d84a0017d..5036167c6 100644 --- a/tex/context/base/lang-ura.tex +++ b/tex/context/base/lang-ura.tex @@ -1,85 +1,84 @@ -%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 +%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 diff --git a/tex/context/base/list-ini.tex b/tex/context/base/list-ini.tex index d019d2182..20031b53f 100644 --- a/tex/context/base/list-ini.tex +++ b/tex/context/base/list-ini.tex @@ -1,40 +1,39 @@ -%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 +%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 diff --git a/tex/context/base/mult-com.tex b/tex/context/base/mult-com.tex index 849f8c89f..757e3f3e3 100644 --- a/tex/context/base/mult-com.tex +++ b/tex/context/base/mult-com.tex @@ -1,1184 +1,1223 @@ -%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
- definecorpsenvironment: definieerkorpsomgeving definecorpsenvironment
- definierefliesstextumgebung
- definecorps: definieerkorps definecorps
- 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
- 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
-
- setupcorps: stelkorpsin setupcorps
- stellefliesstextein
- switchtocorps: switchnaarkorps switchtocorps
- wechselezumfliesstext
- showcorps: toonkorps showcorps
- zeigefliesstext
- showcorpsenvironment: toonkorpsomgeving showcorpsenvironment
- 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
-
- items: items items
- posten
- stelitemsin: stelitemsin setupitems
- stellepostenein
-
- regellinks: regellinks leftlined
- zeilelinks % better: linksbuendig
- regelmidden: regelmidden middlelined
- zeilemitte % better: zentriert
- regelrechts: regelrechts rightlined
- 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
- tooninstellingen: tooninstellingen showsetups
- zeigeeinstellungen
- toonkader: toonkader showframe
- zeigerahmen
- toongrid: toongrid showgrid
- zeigegrid
- toonopbouw: toonopbouw showbuildup
- zeigeaufbau
- toonlayout: toonlayout showlayout
- zeigelayout
- toonstruts: toonstruts showstruts
- zeigestruts
- definieerpapierformaat: definieerpapierformaat definepapersize
- definierepapierformat
- stelpapierformaatin: stelpapierformaatin setuppapersize
- stellepapierformatin
-
- 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
-
- 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
-
- 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
-
- 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
-
- gebruikreferenties: gebruikreferenties usereferences
- verwendereferenzen
- reflijst: reflijst reflist
- refliste
- paginareferentie: paginareferentie pagereference
- seitenreferenz
- referentie: referentie reference
- referenz
- stelreferentielijstin: stelreferentielijstin setupreferencelist
- stellereferenzlisteein
- stelrefererenin: stelrefererenin setupreferencing
- stellereferenzierenein
- tekstreferentie: tekstreferentie textreference
- textreferenz
- uit: uit from
- von
- in: in in
- in
- op: op at
- bei
- naar: naar goto
- zu
- naarbox: naarbox gotobox
- zurbox
-
- startformule: startformule startformula
- startformel
- stopformule: stopformule stopformula
- stopformel
- plaatsformule: plaatsformule placeformula
- platziereformel
- plaatssubformule: plaatssubformule placesubformula
- platziereunterformel
- stelformulesin: stelformulesin setupformulas
- 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
-
- 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
- startlokaal: startlokaal startlocal
- startlokal
- stoplokaal: stoplokaal stoplocal
- stoplokal
- 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
-
- 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
- definiereabsaetz
- stelalineasin: stelalineasin setupparagraphs
- stelleabsaetzein
-
- 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 +%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 diff --git a/tex/context/base/mult-con.tex b/tex/context/base/mult-con.tex index d9f6cba21..ff897c8f3 100644 --- a/tex/context/base/mult-con.tex +++ b/tex/context/base/mult-con.tex @@ -1,778 +1,825 @@ -%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 \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 maintext haupttext
- hoofdteksten: hoofdteksten maintexts haupttexte
- inleiding: inleiding introduction einleitung
- inleidingen: inleidingen introductions einleitungen
- uitleiding: uitleiding extroduction epilog
- uitleidingen: uitleidingen extroductions 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 formulas 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 intermezzos 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
- 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
- contrastkleur: contrastkleur contrastcolor kontrastfarbe
- expansie: expansie expansion expansion
- factor: factor factor faktor
- file: file file datei
- formaat: formaat size groesse
- gebied: gebied directory verzeichnis
- 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 corps fliesstext
- label: label label label
- 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 mark 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
- 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
- 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
- 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
- flexibel: flexibel flexible flexibel
- forceer: forceer force zwinge
- gebruikt: gebruikt used verwende
- geen: geen none kein
- geenwit: geenwit nowhite keinweiss
- globaal: globaal global global
- 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
- lijn: lijn line linie
- linker: linker left linker
- linkermarge: linkermarge leftmargin linkerrand
- linkerrand: linkerrand leftedge linkekante
- 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
- niet: niet not nicht
- nooit: nooit never nie
- normaal: normaal normal normal
- nummer: nummer number nummer
- 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
- passend: passend fit passend
- per: per by pro
- postscript: postscript postscript postscript
- 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
- 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
- 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 rigged 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
- 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
- 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 veryrigged 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
- 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 calligraphy 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 calligraphy 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 beginof anfang
- eindvan: eindvan endof ende
-
- gekoppelde: gekoppelde coupled verknuepft
- in: in - ein
- 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
-
-\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
- ViewerHelp: ViewerHelp ViewerHelp ViewerHilfe
- PrintDocument: PrintDocument PrintDocument DruckeDokument
- SearchDocument: DoorzoekDocument SearchDocument DokumentDurchsuchen
- SearchAgain: HerhaalZoeken SearchAgain WeiterSuchen
-
-\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 +%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 diff --git a/tex/context/base/mult-ini.tex b/tex/context/base/mult-ini.tex index 4557a15b9..511af6b0b 100644 --- a/tex/context/base/mult-ini.tex +++ b/tex/context/base/mult-ini.tex @@ -1,1150 +1,1148 @@ -%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{\setvalue{\??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}
- \wait}%
- \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 beginof: beginof beginvan
-%D eindof: endof 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
-
\ No newline at end of file +%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 diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex index c98ec0dd2..fa45914a8 100644 --- a/tex/context/base/mult-sys.tex +++ b/tex/context/base/mult-sys.tex @@ -1,553 +1,574 @@ -%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}
-
-%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 {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 {from} {:f:} % from list reference
-\definereferenceconstant {to} {:t:} % to list reference
-
-%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 {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 {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 {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 {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 {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 {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 {systemfilename} {cont-sys}
-\definefileconstant {oldfilename} {cont-old}
-\definefileconstant {newfilename} {cont-new}
-
-%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-}
-
-%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 {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 +%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 diff --git a/tex/context/base/plain.tex b/tex/context/base/plain.tex deleted file mode 100644 index 6a1e5acbc..000000000 --- a/tex/context/base/plain.tex +++ /dev/null @@ -1,1236 +0,0 @@ -% 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 87586326e..0e3ef3be4 100644 --- a/tex/context/base/spec-ini.tex +++ b/tex/context/base/spec-ini.tex @@ -1,869 +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}}%
- \showmessage{\m!specials}{5}{\f!specialprefix\currentspecialfile}%
- \readsysfile{\f!specialprefix\currentspecialfile}{}{}%
- \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
-
-% \startspecials
-% \stopspecials
-% \installspecial
-% \definespecial
-
-%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} {xscale} {yscale} {x} {y} {w} {h} {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 {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 {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
-%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 {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] [3]
-\installspecial [\doendofprofile] [and] [3]
-
-%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 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
-
\ No newline at end of file +%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 cff2e5774..8b03e33b1 100644 --- a/tex/context/base/spec-mis.tex +++ b/tex/context/base/spec-mis.tex @@ -1,132 +1,131 @@ -%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 \macro
-%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 \macro
-%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}{#4}}}
- {\doifdefinedelse{\fileinsertionclass#2}
- {\def\next{\getvalue{\fileinsertionclass#2}{#4}}}
- {\def\next{\gobblesevenarguments}}}%
- \next}
-
-\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
-
\ No newline at end of file +%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 diff --git a/tex/context/base/spec-pdf.tex b/tex/context/base/spec-pdf.tex index bf3fec519..5d6375e65 100644 --- a/tex/context/base/spec-pdf.tex +++ b/tex/context/base/spec-pdf.tex @@ -1,456 +1,535 @@ -%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 dostartcommand,
-%D dostartgotoprofile,
-%D dobeginofprofile,
-%D doendofprofile,
-%D dostartrunprogram,
-%D dostartobject,
-%D dostopobject,
-%D doinsertobject,
-%D doinsertbookmark,
-%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
-% [/Dest (\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
-% /Dest (\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}
-
-\definespecial\dostartexecutecommand#1#2#3#4%
- {\bgroup
- \ScaledPointsToBigPoints{#1}\width
- \ScaledPointsToBigPoints{#2}\height
- \processaction
- [#3]
- [ 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},
- close=>\def\command{Close},
- help=>\def\command{HelpUserGuide},
- swap=>\def\command{FullScreen},
- search=>\def\command{Find},
- searchagain=>\def\command{FindAgain},
- \s!unknown=>\let\command=\s!unknown]%
- \special
- {\@@insertpostscriptretain
- [/Action <</Subtype /Named /N /\command>>
- /Rect [0 0 \width\space \height]
- /Border [0 0 0]
- /Subtype /Link
- /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
- \special
- {\@@insertpostscriptretain
- [/Action /Launch
- /File (#3)
- /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}
-
-\definespecial\dobeginofprofile#1#2#3% label width page
- {\bgroup
- \doifelsenothing{#1}
- {\!!doneatrue}
- {\!!doneafalse}%
- \doifnot{0#3}{0}
- {\special
- {\@@insertpostscriptretain
- [/Title (#1)
- /Rect [0 0 0 0]
- \if!!donea /Page #3 \fi
- /ARTICLE
- pdfmark}}%
- \egroup}
-
-\definespecial\doendofprofile#1#2#3%
- {}
-
-\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}%
- \special
- {\@@insertpostscriptretain
- [/Type /Annot
- /Subtype /Movie
- /Rect [0 0 \width\space \height]
- /Movie <</F (#1) /Aspect [\width\space \height] \pdf@@posterize>>
- /A <</ShowControls false>>
- /ANN
- pdfmark}%
- \egroup}
-
-\let\doyandyinsertmov = \docommoninsertmov
-\let\dotrinsertmov = \docommoninsertmov
-
-\newbox\pdfobjects
-
-\definespecial\dostartobject#1#2#3#4%
- {\setbox\nextbox=\hbox\bgroup
- \bgroup
- \ScaledPointsToBigPoints{#2}\width
- \ScaledPointsToBigPoints{#3}\height
- \ScaledPointsToBigPoints{#4}\depth
- \escapechar=-1
- \special
- {\@@insertpostscriptretain
- [/BBox [0 -\depth\space \width\space \height]
- /_objdef {object:#1}
- /BP pdfmark}%
- \egroup}
-
-\definespecial\dostopobject%
- {\special
- {\@@insertpostscriptretain
- [/EP pdfmark}%
- \egroup
- \smashbox\nextbox
- \global\setbox\pdfobjects=\hbox{\box\pdfobjects\box\nextbox}}
-
-\definespecial\doinsertobject#1%
- {\hbox\bgroup
- \box\pdfobjects
- \escapechar=-1
- \special
- {\@@insertpostscriptretain
- [{object:#1} /SP pdfmark}%
- \egroup}
-
-\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}}
-
-\stopspecials
-
-\protect
-
-\endinput
-
\ No newline at end of file +%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 diff --git a/tex/context/base/spec-ps.tex b/tex/context/base/spec-ps.tex index 4b18199c9..54013fda8 100644 --- a/tex/context/base/spec-ps.tex +++ b/tex/context/base/spec-ps.tex @@ -1,160 +1,195 @@ -%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,
-%D dostoprotation,
-%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%
- {\special
- {\@@insertpostscriptliteral
- gsave #1\space rotate}}
-
-\definespecial\dostoprotation%
- {\special
- {\@@insertpostscriptliteral
- currentfont grestore setfont}}
-
-%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}
-
-\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
- \dosomeovalcalc{#4}{0pt}\stroke
- \dosomeovalcalc{#5}{0pt}\radius
- \edef\dostroke{#6}%
- \edef\dofill{#7}%
- \vbox
- \bgroup
- \offinterlineskip
- \forgetall
- \hsize\!!zeropoint
- \vrule\!!width\!!zeropoint\!!height#2sp\!!depth#3sp\relax
- \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}%
- \egroup
- \egroup}
-
-\stopspecials
-
-\endinput
-
\ No newline at end of file +%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 diff --git a/tex/context/base/spec-tpd.tex b/tex/context/base/spec-tpd.tex index 1573a6790..810ad97da 100644 --- a/tex/context/base/spec-tpd.tex +++ b/tex/context/base/spec-tpd.tex @@ -1,525 +1,652 @@ -%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\pdfoutput\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
-
-%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.
-
-\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}%
- \pdfannotlink
- width #6sp
- height #7sp
- attr {/Border [0 0 0]}
- user {/Subtype /Movie
- /Movie <</F (#1) /Aspect [\width\space \height\space] \pdf@@posterize>>
- /A <</ShowControls false>>}%
- \pdfendlink}
-
-%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}%
- \vbox
- \bgroup
- \offinterlineskip
- \forgetall
- \hsize\!!zeropoint
- \vrule\!!width\!!zeropoint\!!height#2sp\!!depth#3sp\relax
- \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}%
- \egroup
- \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 {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}
-%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%
- {\pdfdest num #1 fit} % will be {} when page is ok
-
-\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}
- goto \if!!donea file {#4.pdf} page 1 {/Fit}\else num \PDFdestination\space \fi
- \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
- attr {/Border [0 0 0]}
- user {/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}
- goto \if!!donea file {#4.pdf} page 1 {/Fit} \else num \PDFdestination\space \fi
- \pdfendlink}
- {\doifelsenothing{#4}
- {\let\PDFfile=\empty}
- {\edef\PDFfile{/#4}}%
- \pdfannotlink
- width #1sp
- height #2sp
- depth 0pt
- attr {/Border [0 0 0]}
- user {/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\else
- \pdfcatalog pagemode {/FullScreen}\relax
- \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.
-
-\definespecial\dostartexecutecommand#1#2#3#4%
- {\bgroup
- \processaction
- [#3]
- [ 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},
- close=>\def\command{Close},
- help=>\def\command{HelpUserGuide},
- swap=>\def\command{FullScreen},
- \s!unknown=>\let\command=\s!unknown]%
- \pdfannotlink
- width #1sp
- height #2sp
- depth 0pt
- attr {/Border [0 0 0]}
- user {/S /Named /N /\command}%
- \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}\relax} % creator {#4}
-
-%D \macros
-%D {dostartrunprogam}
-%D
-%D Although possible, running applications is not yet
-%D implemented here.
-
-\definespecial\dostartrunprogram#1#2#3%
- {}
-
-%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%
- {\doifsomething{#1}
- {\pdfthread name {#1}}}
-
-\definespecial\doendofprofile#1#2#3%
- {\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 num #4 % why's page not accepted
- \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{pdfform:#1}{\the\scratchcounter}}}
-
-\definespecial\dostopobject%
- {\dodostopobject}
-
-\definespecial\doinsertobject#1%
- {\expandafter\pdfrefform\csname pdfform:#1\endcsname\relax}
-
-\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. + +%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 diff --git a/tex/context/base/spec-tr.tex b/tex/context/base/spec-tr.tex index f449e1211..b27951d6f 100644 --- a/tex/context/base/spec-tr.tex +++ b/tex/context/base/spec-tr.tex @@ -1,44 +1,81 @@ -%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 \macros
-%D {doinsertfile}
-%D {}
-%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}
-
-\stopspecials
-
-\endinput
-
\ No newline at end of file +%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 diff --git a/tex/context/base/spec-win.tex b/tex/context/base/spec-win.tex index 228df9f7c..ac60b6e98 100644 --- a/tex/context/base/spec-win.tex +++ b/tex/context/base/spec-win.tex @@ -1,98 +1,97 @@ -%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
-
\ No newline at end of file +%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 diff --git a/tex/context/base/spec-yy.tex b/tex/context/base/spec-yy.tex index 885c6be01..832d1e6d0 100644 --- a/tex/context/base/spec-yy.tex +++ b/tex/context/base/spec-yy.tex @@ -1,73 +1,72 @@ -%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 +%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 diff --git a/tex/context/base/supp-box.tex b/tex/context/base/supp-box.tex index 34b0f2215..b3fe1d618 100644 --- a/tex/context/base/supp-box.tex +++ b/tex/context/base/supp-box.tex @@ -1,1228 +1,1107 @@ -% 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%
- {\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 \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}
-
-\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}
-%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.
-
-\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
- {\unvbox4
- \setbox4=\lastbox
- #2{\hbox{\unhbox4}}}}%
- \hskip\fontdimen2\font
- \!!plus \fontdimen3\font
- \!!minus \fontdimen4\font
- \ifdim\ht2>\!!zeropoint \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 {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}
-
-\def\offbaselinecorrection%
- {\let\startbaselinecorrection=\relax
- \let\dostopbaselinecorrection =\relax}
-
-%D \macros
-%D {topbaselinecorrection,botbaselinecorrection}
-%D
-%D The actual top and bottom corrections are implemented as:
-
-\def\topbaselinecorrection%
- {\ifvmode
- \bgroup
- \setbaselinecorrections
- \ifdim\pagegoal<\maxdimen
- \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
- \penalty\outputpenalty % be improved
- \else
- \vfill\eject % should be supp-control
- \fi
- \fi
- \fi
- \egroup
- \fi}
-
-\def\botbaselinecorrection%
- {\ifvmode
- \bgroup
- \setbaselinecorrections
- \dobotbaselinecorrection
- \prevdepth\dp\strutbox
- \egroup
- \fi}
-
-%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.
-
-\def\setrigidcolumnhsize#1#2#3%
- {\hsize=#1\relax
- \dimen0=-#2\relax
- \multiply\dimen0 by #3\relax
- \advance\dimen0 by #2\relax
- \advance\hsize by \dimen0
- \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
- \hfilneg
- \valign{##\vfill\cr\dorigidcolumnsplits}}%
- \fi}
-
-\def\dorigidcolumnsplits%
- {\ifnum\rigidcolumns>0
- \noalign{\hfil}\dorigidcolumnsplitoff
- \doglobal\decrement\rigidcolumns
- \cr
- \dorigidcolumnsplits
- \fi}
-
-\def\dorigidcolumnsplitoff%
- {\splittopskip=\ht\strutbox
- \dimen0=\ht\rigidcolumnbox
- \divide\dimen0 by \rigidcolumns
- \advance\dimen0 by \ht\strutbox
- \vsplit\rigidcolumnbox to \dimen0 }
-
-%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 diff --git a/tex/context/base/supp-fil.tex b/tex/context/base/supp-fil.tex index 4a9d3fb74..74c109e5a 100644 --- a/tex/context/base/supp-fil.tex +++ b/tex/context/base/supp-fil.tex @@ -1,351 +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 {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 loading by
-%D using:
-%D
-%D \starttypen
-%D \doloadonce{filename}
-%D \stoptypen
-%D
-%D This command obeys the standard method for locating files.
-
-\def\doinputonce#1%
- {\doifundefined{@@@#1@@@}%
- {\setgvalue{@@@#1@@@}{}%
- \doiffileelse{#1}{\normalinput #1}{}}}
-
-%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}
-
-\protect
-
-\endinput
-
\ No newline at end of file +%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 f747bed2c..d2f3b92a8 100644 --- a/tex/context/base/supp-fun.tex +++ b/tex/context/base/supp-fun.tex @@ -1,171 +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
-
-%\dorecurse{10}
-% {\horizontalpositionbar\pos\recurselevel\min1\max10\token\blokje\\}
-%
-%\hbox to 15em
-% {\hss
-% \dorecurse{10}
-% {\verticalpositionbar\pos\recurselevel\min1\max10\token\blokje\\
-% \hss}}
-
-\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}}
-
-% \font\GROOT=cminch \GROOT
-%
-% \showmakeup
-%
-% \def\dodoprocesstokens%
-% {\ifx\next\lastcharacter
-% \after
-% \let\next=\relax
-% \else
-% \expandafter\if\normalspace\next
-% \before{\white}%
-% \else
-% \before{\next}%
-% \fi
-% \let\before=\between
-% \let\next=\doprocesstokens
-% \fi
-% \next}
-%
-% \def\stapel#1%
-% {\setbox0=\vbox
-% {\processtokens
-% {\leavevmode\hbox}
-% {\endgraf\leavevmode\hbox}
-% {\endgraf}
-% {\relax}
-% {#1}}%
-% \vbox
-% {\raggedcenter
-% \hsize\wd0
-% \lineskip=5pt
-% \processtokens
-% {\leavevmode\hbox}
-% {\endgraf\leavevmode\hbox}
-% {\endgraf}
-% {\relax}
-% {#1}}}
-%
-% \stapel{NEWMAN 1}
-%
-% \stelkleurenin[status=start]
-%
-% \def\TreatFirstLine#1#2#3#4% before, after, first, next
-% {\bgroup
-% #1%
-% \setbox0=\box\voidb@x
-% \setbox2=\box\voidb@x
-% \def\grabfirstline##1 %
-% {\setbox2=\hbox{\ifvoid0 #3{##1}\else\unhcopy0\ #4{##1}\fi}%
-% \ifdim\wd2>\hsize
-% \hbox to \hsize{\unhbox0}#2##1\
-% \egroup
-% \else
-% \setbox0=\box2
-% \expandafter\grabfirstline
-% \fi}%
-% \grabfirstline}
-%
-% \TreatFirstLine {\bgroup\startkleur[rood]\sc}
-% {\stopkleur\egroup} {} {}Hello there are we once more hello
-% there are we once more hello there are we once more hello
-% there are we once more hello there are we once more hello
-% there are we once more hello there are we once more hello
-% there are we once more
-%
-% \def\DroppedCaps#1#2#3#4#5#6#7% command font height hoffset voffset lines
-% {\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}}
-%
-% \DroppedCaps {\kleur[groen]} {cmbx12} {2.2\baselineskip}
-% {2pt} {\baselineskip} {2} Hello there are we once more hello
-% there are we once more hello there are we once more hello
-% there are we once more hello there are we once more hello
-% there are we once more hello there are we once more hello
-% there are we once more
-%
-% \def\MyDroppedCaps%
-% {\DroppedCaps
-% {\kleur[groen]}
-% {cmbx12}
-% {2.2\baselineskip}
-% {2pt}
-% {\baselineskip}
-% {2}}
-%
-% \MyDroppedCaps Hello there etc etc etc etc etc etc etc etc
-% etc etc etc etc etc etc etc etc etc etc etc etc
-% etc etc etc etc etc etc etc etc etc etc etc etc
-% etc etc etc etc etc etc etc etc etc etc etc etc
-%
-%
-% \def\TreatFirstCharacter#1#2% command, char
-% {#1{#2}}
-%
-% \TreatFirstCharacter {\kleur[groen]} Hello there are we once
-% more hello there are we once more hello there are we once
-% more hello there are we once more hello there are we once
-% more hello there are we once more hello there are we once
-% more hello there are we once more
-
-\protect
-
-\endinput
-
\ No newline at end of file +%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 d409365a1..857d3d512 100644 --- a/tex/context/base/supp-ini.tex +++ b/tex/context/base/supp-ini.tex @@ -1,19 +1,18 @@ -%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 +%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 diff --git a/tex/context/base/supp-lan.tex b/tex/context/base/supp-lan.tex index 2d92f1029..c2061e128 100644 --- a/tex/context/base/supp-lan.tex +++ b/tex/context/base/supp-lan.tex @@ -1,687 +1,686 @@ -%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%
- {\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 +%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 diff --git a/tex/context/base/supp-mis.tex b/tex/context/base/supp-mis.tex new file mode 100644 index 000000000..500eb31ee --- /dev/null +++ b/tex/context/base/supp-mis.tex @@ -0,0 +1,400 @@ +%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 8fe6c292f..95a51991f 100644 --- a/tex/context/base/supp-mps.tex +++ b/tex/context/base/supp-mps.tex @@ -1,484 +1,864 @@ -%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
-
-%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:
-
-\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:
-
-\def\startMPgraphic#1\stopMPgraphic%
- {\startwritingMPgraphic
- \writeMPgraphic{#1}%
- \stopwritingMPgraphic}
-
-%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 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 number:
-
-\newcounter\currentMPgraphic
-
-%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 \macro
-%D {MPinclusions}
-%D
-%D One can include for instance common input commands by
-%D assigning those to the token register:
-
-\newtoks\MPinclusions
-
-\def\writeMPgraphic%
- {\immediate\write\scratchwrite}
-
-\def\startwritingMPgraphic%
- {\ifrunMPgraphics
- \ifreuseMPgraphics \else
- \doglobal\newcounter\currentMPgraphic
- \fi
- \doglobal\increment\currentMPgraphic
- \immediate\openout\scratchwrite=\MPgraphicfile.mp
- \immediate\write\scratchwrite{\the\MPinclusions}%
- \else
- \doglobal\increment\currentMPgraphic
- \ifnum\currentMPgraphic=1
- \immediate\openout\scratchwrite=\MPgraphicfile.mp
- \immediate\write\scratchwrite{\the\MPinclusions}%
- \fi
- \fi
- \immediate\write\scratchwrite{beginfig(\currentMPgraphic);}%
- \global\let\flushMPgraphics\dodostopwritingMPgraphic
- \global\let\stopwritingMPgraphic=\dostopwritingMPgraphic}
-
-\def\dostopwritingMPgraphic%
- {\immediate\write\scratchwrite{endfig;}%
- \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\MPgraphic
-
-\def\loadcurrentMPgraphic#1%
- {\loadMPgraphic{\MPgraphicfile.\currentMPgraphic}{#1}}
-
-\def\loadMPgraphic#1#2%
- {\setbox\MPgraphic=\hbox{\insertMPfile{#1}{#2}}}
-
-\def\placeMPgraphic%
- {\box\MPgraphic}
-
-%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
-
-\long\def\startreusableMPgraphic#1#2\stopreusableMPgraphic%
- {\reuseMPgraphicstrue
- \doifundefined{MP:#1}
- {\startMPgraphic#2\stopMPgraphic
- \ifuseMPbox
- \ifx\setobject\undefined
- \newbox\somebox
- \global\setbox\somebox=\vbox
- {\loadMPgraphic{\MPgraphicfile.\currentMPgraphic}{}%
- \placeMPgraphic}%
- \global\setevalue{MP:#1}%
- {\copy\the\somebox\relax}%
- \else
- \setobject{MP:#1}
- \vbox
- {\loadMPgraphic{\MPgraphicfile.\currentMPgraphic}{}%
- \placeMPgraphic}%
- \global\setvalue{MP:#1}%
- {\getobject{MP:#1}}%
- \fi
- \else
- \global\setevalue{MP:#1}%
- {\noexpand\loadMPgraphic{\MPgraphicfile.\currentMPgraphic}{}%
- \noexpand\placeMPgraphic}%
- \fi}}
-
-\def\reuseMPgraphic#1%
- {\getvalue{MP:#1}}
-
-%D \macro
-%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.
-
-\def\startuseMPgraphic#1#2\stopuseMPgraphic%
- {\reuseMPgraphicstrue
- \long\setvalue{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 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 {UseMetaPostGraphic, DontUseMetaPostGraphics}
-%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 \UseMetaPostGraphic{filename}
-%D \stoptypen
-%D
-%D We can turn of this mechanism with:
-%D
-%D \starttypen
-%D \DontUseMetaPostGraphics
-%D \stoptypen
-
-\def\UseMetaPostGraphic#1%
- {\bgroup
- \message{[MP fonts #1]}%
- %\uncatcodespecials
- \endlinechar=-1
- \setMPspecials
- \obeyMPspecials
- \setbox0=\hbox
- {\hskip-\maxdimen
- \doprocessfile\scratchread{#1}\handleMPSline}%
- \smashbox0
- \box0
- \egroup}
-
-\def\DontUseMetaPostGraphics%
- {\let\UseMetaPostGraphic=\gobbleoneargument}
-
-%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\dohandleMPSline#1#2\relax%
- {\if#1(%
- \expandafter\includeMPcharacters\fileline\relax
- \fi}
-
-\def\handleMPSline%
- {\expandafter\dohandleMPSline\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
-
-\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 diff --git a/tex/context/base/supp-mrk.tex b/tex/context/base/supp-mrk.tex index 287d4bbec..93a7056ac 100644 --- a/tex/context/base/supp-mrk.tex +++ b/tex/context/base/supp-mrk.tex @@ -1,299 +1,298 @@ -%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 +%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 diff --git a/tex/context/base/supp-mul.tex b/tex/context/base/supp-mul.tex index 12987ff61..b425c9723 100644 --- a/tex/context/base/supp-mul.tex +++ b/tex/context/base/supp-mul.tex @@ -358,7 +358,8 @@ %D register \type{\localcolumnwidth}, which is calculated as:
\def\setcolumnhsize%
- {\setbox0=\hbox{\parindent\!!zeropoint\betweencolumns}%
+ {\setbox0=\hbox
+ {\parindent\!!zeropoint\betweencolumns}%
\intercolumnwidth=\wd0
\localcolumnwidth=\columntextwidth
\edef\globalcolumnwidth{\the\localcolumnwidth}%
diff --git a/tex/context/base/supp-pdf.tex b/tex/context/base/supp-pdf.tex index 273c6b93f..1ac8136dc 100644 --- a/tex/context/base/supp-pdf.tex +++ b/tex/context/base/supp-pdf.tex @@ -1,1164 +1,1171 @@ -%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 \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 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\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
- \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 +%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 diff --git a/tex/context/base/supp-spe.tex b/tex/context/base/supp-spe.tex index 568a9e5e2..00bec7a53 100644 --- a/tex/context/base/supp-spe.tex +++ b/tex/context/base/supp-spe.tex @@ -1,166 +1,165 @@ -%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{#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{\normalspecial}
-%D \stoptypen
-%D
-%D But here we default to idle.
-
-\let\normalspecial =\special
-\let\defaultspecial=\special
-
-\protect
-
-\endinput
-
\ No newline at end of file +%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 diff --git a/tex/context/base/supp-tpi.tex b/tex/context/base/supp-tpi.tex index 134139e6c..107a66ac6 100644 --- a/tex/context/base/supp-tpi.tex +++ b/tex/context/base/supp-tpi.tex @@ -1,339 +1,338 @@ -%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\MPgraphic \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\MPgraphic=\hbox to \!!zeropoint
- {\kern-\wd\MPgraphic
- \vbox to \!!zeropoint{\box\MPgraphic\vss}\hss}%
- \ht\MPgraphic=\!!zeropoint
- \wd\MPgraphic=\!!zeropoint
- \dp\MPgraphic=\!!zeropoint
- \box\MPgraphic
- \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 +%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 diff --git a/tex/context/base/supp-ver.tex b/tex/context/base/supp-ver.tex deleted file mode 100644 index 8bf9663e4..000000000 --- a/tex/context/base/supp-ver.tex +++ /dev/null @@ -1,1406 +0,0 @@ -%D \module
-%D [ file=supp-ver,
-%D version=1997.01.04,
-%D title=\CONTEXT\ Support 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.
-
-%D Because this module is quite independant of system macros,
-%D it can be used as a stand||alone verbatim environment.
-
-\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 Support Macros / Verbatim}
-
-%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}
-
-\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 \macros
-%D {processdisplayverbatim}
-%D {}
-%D
-%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
-%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
- \ifskipfirstverbatimline
- \let\doverbatimline=\relax
- \else
- \let\doverbatimline=\dodoverbatimline
- \fi
- \copyverbatimline}
-
-%D \macros
-%D {ifskipfirstverbatimline}
-%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 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
- \obeycharacters}
-
-%D \macros
-%D {ifeightbitcharacters,
-%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 {iflocalcatcodes,
-%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\edef\csname @@cc@@\the\scratchcounter\endcsname%
- {\the\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
- \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
- {\ifx\doverbatimline\relax% gobble rest of the first line
- \let\doverbatimline=\dodoverbatimline%
- \def\next{\copyverbatimline}%
- \else%
- \def\next{#1 }%
- \ifx\next\emptyspace%
- \def\next%
- {\doemptyverbatimline{#1}%
- \copyverbatimline}%
- \else%
- \edef\next{\meaning\next}%
- \ifx\next\endofverbatimcommand%
- \def\next%
- {\egroup\endofdisplayverbatim}%
- \else%
- \def\next%
- {\doverbatimline{#1}%
- \copyverbatimline}%
- \fi%
- \fi%
- \fi%
- \next}}
-
-%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.
-
-\newif\iflinepar
-
-\long\def\dodoverbatimline#1%
- {\leavevmode\the\everyline\strut\processverbatimline{#1}%
- \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{\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
-\let\processverbatimline = \relax
-
-\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 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
-
-\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%
- \def\doreadline%
- {\read\verbatiminput to \next
- \ifeof\verbatiminput
- % we don't want <eof> to be treated as <crlf>
- \else\ifx\next\emptyline
- \expandafter\doemptyverbatimline\expandafter{\next}%
- \else\ifx\next\emptypage
- \expandafter\doemptyverbatimline\expandafter{\next}%
- \else
- \expandafter\dodoverbatimline\expandafter{\next}%
- \fi\fi\fi
- \readline}%
- \def\readline%
- {\ifeof\verbatiminput
- \let\next=\relax
- \else
- \let\next=\doreadline
- \fi
- \next}%
- \readline
- \closein\verbatiminput
- \egroup
- \ignorespaces}
-
-%D These 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
-
-\def\presettyping%
- {\ifcontrolspace
- \let\obeyspace=\setcontrolspace
- \fi
- \ifverbatimtabs
- \let\obeytabs=\settabskips
- \fi
- \ifprettyverbatim
- \let\obeycharacters=\setupprettytextype
- \fi}
-
-\def\type%
- {\bgroup
- \presettyping
- \processinlineverbatim{\egroup}}
-
-\def\starttyping%
- {\bgroup
- \presettyping
- \processdisplayverbatim{\stoptyping}}
-
-\def\stoptyping%
- {\egroup}
-
-\def\typefile#1%
- {\bgroup
- \presettyping
- \processfileverbatim{#1}%
- \egroup}
-
-%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
-%D We'll spend the remainder of this article on coloring the
-%D verbatim text. At \PRAGMA\ we use the integrated environment
-%D \TEXEDIT\ for editing and processing \TEX\
-%D documents.\voetnoot{\TEXEDIT\ has been operative since
-%D 1991.} This program also supports real time spell checking
-%D and \TEX\ based file management. Although definitely not
-%D exclusive, the programs cooperate nicely with \CONTEXT.
-%D Because \TEX\ can be considered a tool for experts, we've
-%D tried to put as less a burden on non||technical users as
-%D possible. This is accomplished in the following ways:
-%D
-%D \startopsomming
-%D
-%D \som We've added some trivial symmetry checking to
-%D \TEXEDIT. Sources are checked for the use of brackets,
-%D braces, begin||end and start||stop like constructions,
-%D with or without arguments.
-%D
-%D \som Although \TEX\ is very tolerant to unformatted input,
-%D we stimulate users to make the \ASCII\ source as clean
-%D as possible. Many sources I've seen in distribution
-%D sets look so awful, that I sometimes wonder how people
-%D get them working. In our opinion, a good||looking
-%D source leads to less errors.
-%D
-%D \som We use parameter driven setups and make the commands
-%D as tolerant as possible. We don't accept commands that
-%D don't look nice in \ASCII.
-%D
-%D \som Finally ---I could have added some more--- we use
-%D color.
-%D
-%D \stopopsomming
-%D
-%D When in spell||checking||mode, the words spelled correctly
-%D are shown in {\em green}, the unknown or wrongly spelled
-%D words are in {\em red} and upto four categories of words,
-%D for instance passive verbs and nouns, become {\em blue}
-%D (or cyan) or {\em yellow}. Short and nearly always correct
-%D words are in white (on a black screen). This makes
-%D checking||on||the||fly very easy and convenient, especially
-%D because we place the accents automatically.
-%D
-%D In \TEX||mode we show \TEX||specific tokens and sequences of
-%D tokens in appropriate colors and again we use four colors.
-%D We use those colors in a way that supports parameter driven
-%D setups, table typesetting and easy visual checking of
-%D symmetry. Furthermore the text becomes more readable.
-%D
-%D \bgroup
-%D \chardef\ampersand =`\&
-%D \chardef\comment =`\%
-%D \chardef\leftbrace =`\{
-%D \chardef\rightbrace=`\}
-%D
-%D \plaatstabel{geen}
-%D \starttabel[|l|l|]
-%D \HL
-%D \FC\bf color \MC\bf characters that are influenced \LC\SR
-%D \HL
-%D \FC red \MC\tt \leftbrace\ \rightbrace\
-%D \string$ \LC\FR
-%D \FC green \MC\tt \string\this\ \string\!!that\
-%D \string\??these\ \string\@@those\ \LC\MR
-%D \FC yellow \MC\tt \string` \string' \string~
-%D \string^ \string_ \ampersand\
-%D \string/ \string+ \string-
-%D \string| \comment\ \LC\MR
-%D \FC blue \MC\tt \string( \string) \string#
-%D \string[ \string] \string"
-%D \string< \string> \string= \LC\LR
-%D \HL
-%D \stoptabel
-%D \egroup
-%D
-%D Macro||definition and style files often look quite green,
-%D because they contain many calls to macros. Pure text files
-%D on the other hand are mostly white (on the screen) and color
-%D clearly shows their structure.
-%D
-%D When I prepared the interactive \PDF\ manuals of \CONTEXT,
-%D \TEXEDIT\ and \PPCHTEX\ (1995), I decided to include the
-%D original source text of the manuals as an appendix. At every
-%D chapter or (sub)section the reader can go to the
-%D corresponding line in the source, just to see how things
-%D were done in \TEX. Of course, the reader can jump from the
-%D to corresponding typeset text too.
-%D
-%D Confronted with those long (boring) sources, I decided that
-%D a colored output, in accordance with \TEXEDIT\ would be
-%D nice. It would not only visually add some quality to the
-%D manual, but also make the sources more readable.
-%D
-%D Apart from a lot of \CATCODE||magic, programming the color
-%D macros was surprisingly easy. Although the macro's are
-%D hooked into the standard \CONTEXT\ verbatim mechanism, they
-%D are set up in a way that embedding them in another verbatim
-%D environment is possible.
-%D
-%D We can turn on coloring by reassigning
-%D \type{\obeycharacters}:
-%D
-%D \starttypen
-%D \let\obeycharacters=\setupprettytextype
-%D \stoptypen
-%D
-%D During pretty typesetting we can be in two states: {\em
-%D command} and {\em parameter}. The first condition becomes
-%D true if we encounter a backslash, the second state is
-%D entered when we meet a~\type{#}.
-
-\newif\ifintexcommand
-\newif\ifintexparameter
-
-%D \macros
-%D {splittexparameters}
-%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.
-
-\newif\ifsplittexparameters \splittexparameterstrue
-
-%D \macros
-%D {splittexcontrols}
-%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.
-
-\newif\ifsplittexcontrols \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.
-
-\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 $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 texprettyone \MC red \MC 0.9 \MC 0.0 \MC 0.0 \MC 0.30 \LC\FR
-%D \FC texprettytwo \MC green \MC 0.0 \MC 0.8 \MC 0.0 \MC 0.45 \LC\MR
-%D \FC texprettythree \MC yellow \MC 0.0 \MC 0.0 \MC 0.9 \MC 0.60 \LC\MR
-%D \FC texprettyfour \MC blue \MC 0.8 \MC 0.8 \MC 0.6 \MC 0.75 \LC\LR
-%D \HL
-%D \stoptabel
-
-%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.
-
-\def\setcolorverbatim%
- {\splittexparameterstrue
- \def\texprettyone {.9 .0 .0 } % red
- \def\texprettytwo {.0 .8 .0 } % green
- \def\texprettythree {.0 .0 .9 } % blue
- \def\texprettyfour {.8 .8 .6 } % yellow
- \def\texbeginofpretty[##1]%
- {\special{ps:: \csname##1\endcsname setrgbcolor}}
- \def\texendofpretty%
- {\special{ps:: 0 0 0 setrgbcolor}}} % black
-
-\def\setgrayverbatim%
- {\splittexparameterstrue
- \def\texprettyone {.30 } % gray
- \def\texprettytwo {.45 } % gray
- \def\texprettythree {.60 } % gray
- \def\texprettyfour {.75 } % gray
- \def\texbeginofpretty[##1]%
- {\special{ps:: \csname##1\endcsname setgray}}
- \def\texendofpretty%
- {\special{ps:: 0 setgray}}} % black
-
-%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.
-
-\setcolorverbatim
-
-%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.
-
-\def\texbeginofcommand%
- {\texendofparameter
- \ifintexcommand
- \else
- \global\intexcommandtrue
- \global\firstintexcommandtrue
- \texbeginofpretty[texprettytwo]%
- \fi}
-
-\def\texendofcommand%
- {\ifintexcommand
- \texendofpretty
- \global\intexcommandfalse
- \global\firstintexcommandfalse
- \fi}
-
-\def\texbeginofparameter%
- {\texendofcommand
- \ifintexparameter
- \else
- \global\intexparametertrue
- \texbeginofpretty[texprettythree]%
- \fi}
-
-\def\texendofparameter%
- {\ifintexparameter
- \texendofpretty
- \global\intexparameterfalse
- \fi}
-
-%D We've got nine types of characters. The first type concerns
-%D the grouping characters that become red and type seven takes
-%D care of the backslash. Type eight is the most recently added
-%D one and handles the control characters starting with
-%D \type{^^}. In the definition part at the end of this module
-%D we can see how characters are organized by type.
-
-\def\ifnotfirstintexcommand#1%
- {\iffirstintexcommand
- \string#1%
- \texendofcommand
- \else}
-
-\def\textypeone#1%
- {\ifnotfirstintexcommand#1%
- \texendofcommand
- \texendofparameter
- \texbeginofpretty[texprettyone]\string#1\texendofpretty
- \fi}
-
-\def\textypetwo#1%
- {\ifnotfirstintexcommand#1%
- \texendofcommand
- \texendofparameter
- \texbeginofpretty[texprettythree]\string#1\texendofpretty
- \fi}
-
-\def\textypethree#1%
- {\ifnotfirstintexcommand#1%
- \texendofcommand
- \texendofparameter
- \texbeginofpretty[texprettyfour]\string#1\texendofpretty
- \fi}
-
-\def\textypefour#1%
- {\ifnotfirstintexcommand#1%
- \texendofcommand
- \texendofparameter
- \string#1%
- \fi}
-
-\def\textypefive#1%
- {\ifnotfirstintexcommand#1%
- \texbeginofparameter
- \string#1%
- \fi}
-
-\def\textypesix#1%
- {\ifnotfirstintexcommand#1%
- \ifintexparameter
- \ifsplittexparameters
- \texendofparameter
- \string#1%
- \else
- \string#1%
- \texendofparameter
- \fi
- \else
- \texendofcommand
- \string#1%
- \fi
- \fi}
-
-\def\textypeseven#1%
- {\ifnotfirstintexcommand#1%
- \texbeginofcommand
- \string#1%
- \fi}
-
-\def\textypeeight#1#2%
- {\texendofparameter
- \ifx#1#2%
- \ifsplittexcontrols
- \ifintexcommand
- \texendofcommand
- \string#1\string#1%
- \texbeginofcommand
- \else
- \string#1\string#2%
- \fi
- \else
- \string#1\string#1%
- \fi
- \else
- \ifintexcommand
- \firstintexcommandfalse
- \string#1#2%
- \else
- \textypethree#1#2%
- \fi
- \fi}
-
-\def\textypenine#1%
- {\texendofparameter
- \global\firstintexcommandfalse
- \string#1}
-
-%D We have to take care of the control characters we mentioned
-%D before. We obey their old values but only after ending our
-%D two states.
-
-\def\texsetcontrols%
- {\global\let\oldobeyedspace = \obeyedspace
- \global\let\oldobeyedline = \obeyedline
- \global\let\oldobeyedpage = \obeyedpage
- \def\obeyedspace%
- {\texendofcommand
- \texendofparameter
- \oldobeyedspace}%
- \def\obeyedline%
- {\texendofcommand
- \texendofparameter
- \oldobeyedline}%
- \def\obeyedpage%
- {\texendofcommand
- \texendofparameter
- \oldobeyedpage}%
- \let\obeytabs=\ignoretabs}
-
-%D Next comes the tough part. We have to change the \CATCODE\
-%D of each character. These macro's are tuned for speed and
-%D simplicity. When viewed in color they look quite simple.
-
-\def\setupprettytextype%
- {\texsetcontrols
- \texsetspecialpretty
- \texsetalphabetpretty
- \texsetextrapretty}
-
-%D When handling the lowercase characters, we cannot use
-%D lowercased macro names. This means that we have to redefine
-%D some well known macros, like \type{\bgroup}.
-
-\def\texpresetcatcode%
- {\def\\##1%
- {\expandafter\catcode\expandafter`\csname##1\endcsname\@@active}}
-
-\def\texsettypenine%
- {\def\\##1%
- {\def##1{\textypenine##1}}}
-
-\bgroup
- \bgroup
- \gdef\texpresetalphapretty%
- {\texpresetcatcode
- \\A\\B\\C\\D\\E\\F\\G\\H\\I\\J\\K\\L\\M%
- \\N\\O\\P\\Q\\R\\S\\T\\U\\V\\W\\X\\Y\\Z}
- \texpresetalphapretty
- \gdef\texsetalphapretty%
- {\texpresetalphapretty
- \texsettypenine
- \\A\\B\\C\\D\\E\\F\\G\\H\\I\\J\\K\\L\\M%
- \\N\\O\\P\\Q\\R\\S\\T\\U\\V\\W\\X\\Y\\Z}
- \egroup
- \global\let\TEXPRESETCATCODE = \texpresetcatcode
- \global\let\TEXSETTYPENINE = \texsettypenine
- \global\let\BGROUP = \bgroup
- \global\let\EGROUP = \egroup
- \global\let\GDEF = \gdef
- \BGROUP
- \GDEF\TEXPRESETALPHAPRETTY%
- {\TEXPRESETCATCODE
- \\a\\b\\c\\d\\e\\f\\g\\h\\i\\j\\k\\l\\m%
- \\n\\o\\p\\q\\r\\s\\t\\u\\v\\w\\x\\y\\z}
- \TEXPRESETALPHAPRETTY
- \GDEF\TEXSETALPHAPRETTY%
- {\TEXPRESETALPHAPRETTY
- \TEXSETTYPENINE
- \\a\\b\\c\\d\\e\\f\\g\\h\\i\\j\\k\\l\\m%
- \\n\\o\\p\\q\\r\\s\\t\\u\\v\\w\\x\\y\\z}
- \EGROUP
- \gdef\texsetalphabetpretty%
- {\texsetalphapretty
- \TEXSETALPHAPRETTY}
-\egroup
-
-%D Macro names normally only may contain characters, but in
-%D unprotected state we can also use the characters~\type{@},
-%D \type{!} and~\type{?}. Of course they are only colored
-%D (green) when they are part of a name.
-
-\bgroup
- \gdef\texpresetextrapretty%
- {\texpresetcatcode
- \\?\\!\\@}
- \texpresetextrapretty
- \gdef\texsetextrapretty%
- {\texpresetextrapretty
- \texsettypenine
- \\?\\!\\@}
-\egroup
-
-%D Here comes the main specification routine. In this macro we
-%D also have to change the escape character to \type{!} and use
-%D \type{X}, \type{Y} and \type{Z} for grouping and ignoring,
-%D which makes the result a bit less readable. Plain \TEX\
-%D defines \type{\+} as an outer macro, so we have to redefine
-%D this one too.
-
-\def\+{\tabalign}
-
-\bgroup
- \gdef\texpresetspecialpretty%
- {\def\\##1{\catcode`##1\@@active}%
- \\\[\\\]\\\=\\\<\\\>\\\#\\\(\\\)\\\"%
- \\\$\\\{\\\}%
- \\\-\\\+\\\|\\\%\\\/\\\_\\\^\\\&\\\~\\\'\\\`%
- \\\.\\\,\\\:\\\;%
- \\\*%
- \\\1\\\2\\\3\\\4\\\5\\\6\\\7\\\8\\\9%
- \\\\}
- \catcode`\X=\the\catcode`\{
- \catcode`\Y=\the\catcode`\}
- \catcode`\Z=\the\catcode`\%
- \gdef\texsetsometypes%
- {\def\!##1##2{\def##1{##2{##1}}}}%
- XZ
- \catcode`\!=\@@escape
- !texpresetspecialpretty
- !gdef!texsetspecialpretty
- XZ
- !texpresetspecialpretty
- !texsetsometypes
- !! $ !textypeone !! { !textypeone !! } !textypeone
- !! [ !textypetwo !! ] !textypetwo !! ( !textypetwo !! ) !textypetwo
- !! = !textypetwo !! < !textypetwo !! > !textypetwo !! " !textypetwo
- !! - !textypethree !! + !textypethree !! / !textypethree
- !! | !textypethree !! % !textypethree !! ' !textypethree !! ` !textypethree
- !! _ !textypethree !! ^ !textypethree !! & !textypethree !! ~ !textypethree
- !! . !textypefour !! , !textypefour !! : !textypefour !! ; !textypefour
- !! * !textypefour
- !! # !textypefive
- !! 1 !textypesix !! 2 !textypesix !! 3 !textypesix
- !! 4 !textypesix !! 5 !textypesix !! 6 !textypesix
- !! 7 !textypesix !! 8 !textypesix !! 9 !textypesix
- !! \ !textypeseven
- !! ^ !textypeeight
- YZ
- YZ
-\egroup
-
-%D This text was published in the \MAPS\ of the dutch \TEX\
-%D users group \NTG. In that article, the verbatim part of the
-%D text was set with the following 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 \def\stoptypen%
-%D {\egroup}
-%D \stoptypen
-%D
-%D The implementation itself was typeset with:
-%D
-%D \starttypen
-%D \def\startdefinition%
-%D {\bgroup
-%D \everypar{} % Again we disable some troublesome mechanisms.
-%D \let\obeycharacters=\setupprettytextype
-%D \EveryPar{\showparagraphcounter}%
-%D \EveryLine{\showlinecounter}%
-%D \verbatimcorps
-%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 Some needs are fulfilled already with:
-%D
-%D \starttypen
-%D \setcontrolspace \settabskips \setupprettytextype
-%D \stoptypen
-%D
-%D lines can be enhanced with ornaments using:
-%D
-%D \starttypen
-%D \everypar \everyline \iflinepar
-%D \stoptypen
-%D
-%D and color support is implemented by:
-%D
-%D \starttypen
-%D \texbeginofpretty[#1] ... \texendofpretty
-%D \stoptypen
-%D
-%D We can influence the verbatim environment with the following
-%D macro and booleans:
-%D
-%D \starttypen
-%D \obeyemptylines \splittexparameters... \splittexcontrols...
-%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 texprettyone}, {\em texprettytwo}, {\em
-%D texprettythree} and {\em texprettyfour}. 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.
-
-\ifx \undefined \doifinstringelse \else
-
-\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
- \ifskipfirstverbatimline
- \let\doverbatimline=\relax
- \else
- \let\doverbatimline=\dodoverbatimline
- \fi
- \copyverbatimline}
-
-\let\doifendofverbatim=\doifelse
-
-\def\permitshiftedendofverbatim%
- {\let\doifendofverbatim=\doifinstringelse}
-
-{\obeylines%
- \long\gdef\copyverbatimline#1
- {\ifx\doverbatimline\relax% gobble rest of the first line
- \let\doverbatimline=\dodoverbatimline%
- \def\next{\copyverbatimline}%
- \else%
- \convertargument#1 \to\next%
- \ifx\next\emptyspace%
- \def\next%
- {\doemptyverbatimline{#1}%
- \copyverbatimline}%
- \else%
- \doifendofverbatim{\endofverbatimcommand}{\next}%
- {\def\next%
- {\egroup\endofdisplayverbatim}}%
- {\def\next%
- {\doverbatimline{#1}%
- \copyverbatimline}}%
- \fi%
- \fi%
- \next}}
-
-\fi
-
-\protect
-
-\endinput
diff --git a/tex/context/base/supp-vis.tex b/tex/context/base/supp-vis.tex index ee3cd280f..db28c77a5 100644 --- a/tex/context/base/supp-vis.tex +++ b/tex/context/base/supp-vis.tex @@ -1,1900 +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 {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
- \offinterlineskip
- \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
-
-\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
-
-\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
-
-\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
-
-\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:
-
-\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 \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 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.
-
-\def\ruledhss%
- {\doruledhfiller\normalhss\normalhfilneg{0}{0}}
-
-\def\ruledhfil%
- {\doruledhfiller\normalhfil\normalhfilneg{10}{-6}}
-
-\def\ruledhfill%
- {\doruledhfiller\normalhfill\normalhfillneg{18}{-14}}
-
-\def\ruledhfilneg%
- {\doruledhfiller\normalhfilneg\normalhfil{-6}{10}}
-
-\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
- \offinterlineskip
- \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.
-
-\def\ruledvss%
- {\doruledvfiller\normalvss\normalvfilneg{2}}
-
-\def\ruledvfil%
- {\doruledvfiller\normalvfil\normalvfilneg{-4}}
-
-\def\ruledvfill%
- {\doruledvfiller\normalvfill\normalvfillneg{-12}}
-
-\def\ruledvfilneg%
- {\doruledvfiller\normalvfilneg\normalvfil{8}}
-
-\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}
-
-\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
- \offinterlineskip
- \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}
-
-\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}
-
-\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
- \offinterlineskip
- \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}
-
-\def\ruledvkern#1%
- {\bgroup
- \let\afterwards=#1\relax
- \afterassignment\doruledvkern
- \scratchskip=}
-
-\def\ruledkern%
- {\ifvmode
- \let\next=\ruledvkern
- \else
- \let\next=\ruledhkern
- \fi
- \next\normalkern}
-
-%D A a bit more \TEX nice solution is:
-%D
-%D \starttypen
-%D \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}
-
-\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}
-
-\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}
-
-\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}
-
-\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}
-
-\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}
-
-\def\ruledvpenalty%
- {\bgroup
- \afterassignment\doruledvpenalty
- \scratchcounter=}
-
-\def\ruledpenalty%
- {\ifvmode
- \let\next=\ruledvpenalty
- \else
- \let\next=\ruledhpenalty
- \fi
- \next}
-
-%D At the cost of some more tokens, a bit more clever
-%D implementation would be:
-%D
-%D \starttypen
-%D \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 corps 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
-
-
\ No newline at end of file +%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 c83e4526e..a04670975 100644 --- a/tex/context/base/syst-ext.tex +++ b/tex/context/base/syst-ext.tex @@ -1,2345 +1,2466 @@ -%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 \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
- \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
-%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 \macro {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
- \doglobal#2=#2}
-
-\def\prependtoks#1\to#2%
- {\scratchtoks={#1}%
- \edef\next{\noexpand#2={\the\scratchtoks\the#2}}%
- \next
- \doglobal#2=#2}
-
-\def\flushtoks#1%
- {\scratchtoks=#1\relax
- \doglobal#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\doifnotinset{#1}{#2}
- {\dodoglobal\edef#2{#2,#1}}}}
-
-\def\doremovefromcommalist#1#2#3%
- {\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 {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 alternative is one that manipulates the
-%D \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
- #1=#2\relax
- #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 \macro
-%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 \handletokens some tokens\with \somemacro
-%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 \macro
-%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 \haalbuffer[next]
-%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
- \docommando{ }%
- \fi
- \ifx#1\end \else
- \docommando{#1}%
- \expandafter\dohandletokens
- \fi}
-
-\def\dohandletokens%
- {\futurelet\next\dodohandletokens}
-
-\long\def\handletokens#1\with#2%
- {\let\docommando=#2% #2 can be \docommando itself
- \dohandletokens#1\end}
-
-%D So our example finaly shows up as:
-%D
-%D \haalbuffer[example]
-
-\protect
-
-\endinput
-
\ No newline at end of file +%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 diff --git a/tex/context/base/syst-gen.tex b/tex/context/base/syst-gen.tex index b9b3da9d9..9cdc8dd62 100644 --- a/tex/context/base/syst-gen.tex +++ b/tex/context/base/syst-gen.tex @@ -1,2682 +1,2719 @@ -%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 e-\TeX\ protection will be 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:
-
-\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}}
-
-\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}
-
-\def\unexpanded#1%
- {\def\dounexpanded%
- {\ifx\next\bgroup
- \@EA\dosetunexpanded
- \else
- \@EA\docomunexpanded
- \fi#1}%
- \futurelet\next\dounexpanded}
-
-%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}
-
-%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]%
- {\edef\!!stringb{#1}%
- \ifx\!!stringb\s!default
- #2%
- \fi}
-
-\def\v!compareprocessactionB[#1=>#2]%
- {\expandedaction\!!stringb{#1}%
- \ifx\!!stringa\!!stringb
- \def\commalistelement{#1}%
- #2%
- \let\p!doprocessaction=\gobbleoneargument
- \else
- \edef\!!stringb{#1}%
- \ifx\!!stringb\s!unknown
- \def\commalistelement{#1}%
- #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]}%
- \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}
-%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 And finaly it became:
-
-\def\v!ifinstringelse#1#2%
- {\def\c!ifinstringelse##1#1##2##3\war%
- {\csname\if##2@iffalse\else iftrue\fi\endcsname}%
- \c!ifinstringelse#2#1@@\war}
-
-\def\ifinstringelse#1#2%
- {\expanded{\v!ifinstringelse{#1}{#2}}}
-
-\long\def\doifinstringelse#1#2#3#4%
- {\ifinstringelse{#1}{#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 \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 + diff --git a/tex/context/base/syst-new.tex b/tex/context/base/syst-new.tex index e9e8bb373..cd77b5dc6 100644 --- a/tex/context/base/syst-new.tex +++ b/tex/context/base/syst-new.tex @@ -1,95 +1,156 @@ -%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\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 +%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 diff --git a/tex/context/base/syst-tex.tex b/tex/context/base/syst-tex.tex index 0d85e2050..2a34cc100 100644 --- a/tex/context/base/syst-tex.tex +++ b/tex/context/base/syst-tex.tex @@ -1,149 +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 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
-
\ No newline at end of file +%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 764ffaa42..87086b349 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.exe b/tex/context/base/texutil.exe Binary files differdeleted file mode 100644 index 45ca0cf2d..000000000 --- a/tex/context/base/texutil.exe +++ /dev/null diff --git a/tex/context/base/texutil.pl b/tex/context/base/texutil.pl new file mode 100644 index 000000000..d4d84e958 --- /dev/null +++ b/tex/context/base/texutil.pl @@ -0,0 +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. diff --git a/tex/context/base/thrd-ran.tex b/tex/context/base/thrd-ran.tex new file mode 100644 index 000000000..db0b5f650 --- /dev/null +++ b/tex/context/base/thrd-ran.tex @@ -0,0 +1,70 @@ +%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 diff --git a/tex/context/base/verb-ini.tex b/tex/context/base/verb-ini.tex new file mode 100644 index 000000000..4b76a30eb --- /dev/null +++ b/tex/context/base/verb-ini.tex @@ -0,0 +1,1557 @@ +%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 diff --git a/tex/context/base/verb-mp.tex b/tex/context/base/verb-mp.tex new file mode 100644 index 000000000..520301915 --- /dev/null +++ b/tex/context/base/verb-mp.tex @@ -0,0 +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 diff --git a/tex/context/base/verb-pl.tex b/tex/context/base/verb-pl.tex new file mode 100644 index 000000000..3b13446db --- /dev/null +++ b/tex/context/base/verb-pl.tex @@ -0,0 +1,452 @@ +%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 diff --git a/tex/context/base/verb-tex.tex b/tex/context/base/verb-tex.tex new file mode 100644 index 000000000..f1cfe6043 --- /dev/null +++ b/tex/context/base/verb-tex.tex @@ -0,0 +1,284 @@ +%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 |