%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

\newevery \everybodyfont \Everybodyfont % just to be sure

\appendtoks \presetnormallineheight \to \everybodyfont
\appendtoks \setnormalbaselines     \to \everybodyfont
\appendtoks \setstrut               \to \everybodyfont
\appendtoks \settopskip             \to \everybodyfont
\appendtoks \setmaxdepth            \to \everybodyfont
\appendtoks \stelinspringenin       \to \everybodyfont
\appendtoks \stelblankoin           \to \everybodyfont
\appendtoks \stelwitruimtein        \to \everybodyfont
%\appendtoks\setupfootnotes         \to \everybodyfont
\appendtoks \stelspatieringin       \to \everybodyfont % nieuw 
\appendtoks \setdisplayskips        \to \everybodyfont % nieuw 

% \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 --
     24: Plaatsblokken
     25: Verwijzingen
     26: Registers
     27: Versie
\stopmessages

\startmessages  english  library: systems
  title: system
      1: loading utility-file postponed (typemode)
      2: -- loaded
      3: try LaTeX
      4: command -- is already defined
      5: macros of -- loaded
      6: no macros found in --
      7: macros of -- already loaded
      8: new version of utility file, second pass needed
      9: -- not found/processed
     10: don't use em in --
     11: building simple util
     12: the utility-file is not sorted, use texutil
     13: mark -- defined --
     14: forced newpage in list at --
     15: saving buffer --
     16: typesetting buffer --
     17: typesetting verbatim buffer --
     18: synonym -- -- does not exist
     19: meaning (synonyms) of -- loaded
     20: meaning (sorts) of -- loaded
     21: no utility data is loaded
     22: use a valid utilityfile
     23: -- arranged at --
     24: Floatblocks
     25: References
     26: Registers
     27: Version
\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
     21: Die Hilfsdatei ist nicht geladen
     22: Benoetige gueltige Hilfsdateie
     23: -- angeordnet auf --
     24: Fliessbloecke
     25: Referenzen
     26: Register
     27: Version
\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

\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: -- und -- ergeben zusammen nicht 1.0
     11: Zwischenraum -- nicht im Grittermoduserlau
\stopmessages

\startmessages  dutch  library: structures
  title: structuur
      1: begin van sectieblok --
      2: eind van sectieblok --
\stopmessages

\startmessages  english  library: structures
  title: structure
      1: begin of sectionblock --
      2: end of sectionblock --
\stopmessages

\startmessages  german  library: structures
  title: struktur
      1: Begin des Abschnittsblock --
      2: Ende des Abschnittsblock --
\stopmessages

% \CONTEXTtrue % Now we know that we can use ConTeXt commands.

% \def\teststatus{stop}
%
% \def\doiftrue  {\iftrue}
% \def\doiffalse {\iffalse}
%
% \def\setstatus#1#2%
%   {\doifelse{\getvalue{#1\c!status}}{\v!start}
%      {\let#2=\doiftrue}
%      {\let#2=\doiffalse}}
%
% \setstatus{test}\iftest
%
% \iftest
%   \message{JA}
% \else
%   \message{NEE}
% \fi

% om problemen te voorkomen:
%
% \ascii   => \@@ascii@@
% \asciiA  => \@@ascii@@A
% \asciiB  => \@@ascii@@B

% Nodig i.v.m. inspringen eerste alineas

\def\explicithmode%
  {\unhbox\voidb@x}

% Nodig voor gebruikers

\def\geentest{\donottest}

% Dit moet nog ergens een plaats krijgen:

\def\stelfactorenin%
  {\stelwitruimtein
   \stelblankoin
   \settopskip
   \setmaxdepth}

% Nog doen:
%
%  \goodbreak -> \allowbreak en \dosomebreak{..} in koppen
%
% bij koppen zowieso: \blanko[reset]

% Nog in commando verwerken:
%
% \voorkeur … la \blanko
%
% Om ongewenste witruimte te voorkomen kan met \dosomebreak{\break}
% een \penalty v¢¢r witruimte worden geplaatst.

\def\dosomebreak#1%
  {\skip0=\lastskip
   \removelastskip
   %\type{#1}%
   #1\relax
   \ifdim\skip0=\!!zeropoint
   \else
     \vskip\skip0
   \fi}

% beter, vooral in \vbox; nog in \pagina toepassen s!

\def\doifoutervmode#1%
  {\ifvmode\ifinner\else#1\fi\fi}

\def\dosomebreak#1%
  {\doifoutervmode
     {\skip0=\lastskip
      \removelastskip
      %\leavevmode\type{#1}%
      #1\relax
      \ifdim\skip0=\!!zeropoint % else interference with footnotes
      \else
        \vskip\skip0
      \fi}}

% Idem:
%
% \springin

%\def\noindentation% vervallen
%   {\EveryPar
%     {\ifdim\parindent=\!!zeropoint
%      \else
%        \bgroup
%        \setbox0=\lastbox
%        \egroup
%      \fi
%      \EveryPar{}}}

\newif\ifindentation \indentationtrue  % documenteren, naar buiten

\let\checkindentation=\relax

\def\donoindentation%
  {\ifdim\parindent=\!!zeropoint
   \else
     \bgroup
     \setbox0=\lastbox
     \egroup
   \fi}

\def\noindentation% made global
  {\ifinpagebody \else
     \global\indentationfalse
     \gdef\checkindentation%
       {\donoindentation
        \gdef\checkindentation{\global\indentationtrue}}%
   \fi}

\def\nonoindentation% bv bij floats
  {\ifinpagebody \else
     \global\indentationtrue
     \gdef\checkindentation{\global\indentationtrue}%
   \fi}

\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
   \indentfirstparagraphtrue % recently added
   \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
   \notragged
   \forgetparskip
   \forgetparindent
   \forgetbothskips
   \forgetspacing     % i.v.m. funny spacing in pagebody
   \everypar{}}       % indeed!

\def\localvbox#1#%
  {\vbox#1\bgroup
     \forgetparskip
     \setlocalhsize
     \hsize=\localhsize
     \forgetparindent
     \forgetbothskips
     \forgeteverypar
     \let\next=}

% ach ja

\unexpanded\def\dostartattributes#1#2#3%
  {\begingroup  % geen \bgroup, anders in mathmode lege \hbox
   \doifdefinedelse{#1#2}
     {\def\fontattribute{\getvalue{#1#2}}}
     {\let\fontattribute=\empty}%
   \doifdefinedelse{#1#3}
     {\def\colorattribute{\getvalue{#1#3}}}
     {\let\colorattribute=\empty}%
   \startcolor[\colorattribute]%
   \@EA\doconvertfont\@EA{\fontattribute}}

\unexpanded\def\dostopattributes%
  {\stopcolor
   \endgroup}

\unexpanded\def\doattributes#1#2#3#4%
  {\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes}

% \dotextprefix{tekst}
%
% als {tekst} niet leeg is: tekst~

\def\dotextprefix#1%
  {\ConvertToConstant\doifnot{#1}{}{#1~}}

% kan vaker worden toegepast:

\def\doadaptleftskip#1%
  {\processaction[#1] % \ExpandFirstAfter
     [\v!standaard=>\advance\leftskip by
                    \ifdim\voorwit=\!!zeropoint\@@sllinks\else\voorwit\fi,
             \v!ja=>\advance\leftskip by
                    \ifdim\voorwit=\!!zeropoint\@@sllinks\else\voorwit\fi,
            \v!nee=>,
        \s!unknown=>\advance\leftskip by #1]}

\def\herhaal            {\dorepeat}
\def\herhaler           {\repeater}
\def\herhaalmetcommando {\dorepeatwithcommand}

% This permits things like ^\index{hans}^, where hans is
% duplicated in the text.

\newif\ifduplicate

\bgroup
\gdef\checkduplication%   in line with Knuth
  {\ifmmode
     \def\next{^}%
   \else
     \let\next=\startduplication
   \fi
   \next}
\gdef\insideduplication%
  {\ifmmode
     \def\next{^}%
   \else
     \let\next=\egroup
   \fi
   \next}
\catcode`\^=\@@active
\gdef\enableduplication%
  {\catcode`\^=\@@active
   \let^=\checkduplication}
\gdef\disableduplication%
  {\catcode`\^=\@@superscript}
\gdef\startduplication%
  {\bgroup
   \duplicatetrue
   \let^=\insideduplication}
\egroup

\def\verbatim#1%
  {\convertargument#1\to\ascii\ascii}

% mogelijke optimalisaties:
%
% \ifx ...\else ...\fi
% \ifvisible ... \fi

% De opbouw van deze file
%
% Deze file bevat naast de verschillende Pragma-Macro's ook
% helpinformatie bij deze macro's en templates. Een blok
% helpinformatie wordt gekenmerkt door een %I.
%
% Een blok kan zijn opgedeeld in pagina's. In dat geval is
% %I vervangen door %P. De eerste regel van een blok bevat
% de titel van de informatie.
%
% Een template (voorgedefinieerde structuur) wordt gekenmerkt
% door %T. Ook hier bevat de eerste regel een titel,
% eventueel gevolgd door een mnemonic.
%
% Zowel de helpinformatie als de templates zijn in het
% programma TeXEdit oproepbaar.
%
% Het programma TeXEdit kan t.z.t. worden ingesteld met
% behulp van de onderstaande, door %S voorafgegane,
% setupcommando's. Vooralsnog is een en ander 'hard' in het
% programma geprogrammeerd.

%S InputFile     \input
%S InputFile     \omgeving    \environment
%S InputFile     \projekt     \project
%S InputFile     \produkt     \product
%S InputFile     \onderdeel   \component
%S
%S CheckStrings  \start  \stop
%S CheckStrings  \begin  \end
%S CheckStrings  \begin  \eind
%S
%S CheckChars    { }
%S CheckChars    [ ]
%S CheckChars    ( )
%S
%S CheckChar     $

% Het <pagina>-karakter (FormFeed), wordt omgezet in \par

\edef\oldlinefeed{\the\catcode`\^^L}

\catcode`\^^L=\oldlinefeed

\catcode`\^^L=\@@endofline

%I n=Struts
%I c=\strut,\setnostrut,\setstrut,\toonstruts,\pseudostrut
%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.5}

\def\systemtopskipfactor    {\topskipfactor}
\def\systemmaxdepthfactor   {\maxdepthfactor}

% De onderstaande definitie wordt in de font-module overruled

\ifx\globalbodyfontsize\undefined
  \newdimen\globalbodyfontsize
  \globalbodyfontsize=12pt
\fi
\ifx\normalizedbodyfontsize\undefined
  \def\normalizedbodyfontsize{12pt}
\fi

% door een \dimen. Dit is geen probleem omdat (1) de default
% korpsgrootte 12pt is en (2) de fonts nog niet geladen zijn
% en de instellingen bij het laden nogmaals plaatsvinden.

\def\topskipcorrection%
  {\ifdim\topskip>\openstrutheight
     \vskip\topskip
     \vskip-\openstrutheight
   \fi
   \vbox{\strut}
   \vskip-\openlineheight}

\def\settopskip% the extra test is needed for the lbr family
  {\topskip=\systemtopskipfactor\globalbodyfontsize
   \ifgridsnapping \else
     \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi
   \fi
   \relax % the skip
   \ifdim\topskip<\strutheightfactor\openlineheight
     \topskip=\strutheightfactor\openlineheight\relax
   \fi}

\def\setmaxdepth%
  {\maxdepth=\systemmaxdepthfactor\globalbodyfontsize}

\def\normalbaselines%
  {\baselineskip\normalbaselineskip
   \lineskip\normallineskip
   \lineskiplimit\normallineskiplimit}

\def\setnormalbaselines%
  {\lineheight=\normallineheight
   \openlineheight=\spacingfactor\lineheight
\openstrutheight=\strutheightfactor\openlineheight
\openstrutdepth =\strutdepthfactor \openlineheight
   \normalbaselineskip=
     \openlineheight
     \!!plus\baselinegluefactor\openlineheight
     \!!minus\baselinegluefactor\openlineheight
   \normallineskip\!!onepoint\relax
   \normallineskiplimit\!!zeropoint\relax
   \normalbaselines}

\def\setspacingfactor#1\to#2\by#3\\%
  {\strutdimen=#2pt\relax
   \strutdimen=#3\strutdimen
   \edef#1{\withoutpt{\the\strutdimen}}}

\def\spacing#1%
  {\ifgridsnapping
     \edef\spacingfactor{1}%
     \showmessage{\m!layouts}{11}{#1}%
   \else
     \edef\spacingfactor{#1}%
   \fi
   \setspacingfactor\systemtopskipfactor\to\topskipfactor\by#1\\%
   \setspacingfactor\systemmaxdepthfactor\to\maxdepthfactor\by#1\\%
   \setnormalbaselines
   \setstrut}

\def\setstrutdimen#1#2#3%              % een strut is n.m maal ex
  {\strutdimen=\normallineheight       % wat niet per se \lineheight
   \strutdimen=#2\strutdimen           % is omdat een strut lokaal
   \strutdimen=#3\strutdimen           % kan afwijken van de globale
   \edef#1{\the\strutdimen}}           % strut

\let\normalstrut=\strut

% The double \hbox construction enables us to \backtrack
% boxes.

\def\setstrut%
  {\setstrutdimen\strutheight\strutheightfactor\spacingfactor
   \setstrutdimen\strutdepth \strutdepthfactor \spacingfactor
   \let\strut=\normalstrut
   \setbox\strutbox=\normalhbox
     {\normalhbox
        {\vrule
           \!!width  \strutwidth
           \!!height \strutheight
           \!!depth  \strutdepth
           \normalkern-\strutwidth}}}

\def\setteststrut%
  {\def\strutwidth{.8pt}%
   \setstrut}

\def\begstrut%
  {\relax\ifdim\ht\strutbox=\!!zeropoint\else
     \strut
     \normalpenalty\!!tenthousand
     \normalhskip\!!zeropoint
     \ignorespaces
   \fi}

\def\endstrut%
  {\relax\ifhmode\ifdim\ht\strutbox=\!!zeropoint\else
     \unskip
     \normalpenalty\!!tenthousand
     \normalhskip\!!zeropoint
     \strut
   \fi\fi}

\def\setnostrut%
  {\setbox\strutbox=\normalhbox{\normalhbox{}}%
   \let\strut=\empty
   \let\endstrut=\empty
   \let\begstrut=\empty}

\def\pseudostrut%
  {\bgroup
   \setnostrut
   \normalstrut
   \egroup}

\def\resetteststrut%
  {\let\strutwidth=\!!zeropoint
   \setstrut}

\def\setfontparameters%
  {\the\everybodyfont}

% \setnormalbaselines
% \setstrut
% \settopskip
% \setmaxdepth
% \the\EveryFontSwitch

%D We need \type{\normaloffinterlineskip} because the new
%D definition contains an assignment, and |<|don't ask me
%D why|>| this assignment gives troubles in for instance the
%D visual debugger.

\ifx\undefined\normaloffinterlineskip
  \let\normaloffinterlineskip=\offinterlineskip % knuth's original
\fi

% \def\offinterlineskip%
%   {\edef\oninterlineskip%
%      {\baselineskip=\the\baselineskip
%       \lineskip=\the\lineskip
%       \lineskiplimit=\the\lineskiplimit
%       \noexpand\let\noexpand\offinterlineskip=\noexpand\normaloffinterlineskip}%
%    \normaloffinterlineskip}

\def\offinterlineskip%
  {\ifdim\baselineskip>\!!zeropoint
     \edef\oninterlineskip%
       {\baselineskip=\the\baselineskip
        \lineskip=\the\lineskip
        \lineskiplimit=\the\lineskiplimit
        \noexpand\let\noexpand\offinterlineskip=\noexpand\normaloffinterlineskip}%
   \else
     \let\oninterlineskip=\setnormalbaselines
   \fi
   \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%
  {\ifdim\tussenwit>\!!zeropoint
     #1\tussenwit\!!plus#2\tussenwit\!!minus#2\tussenwit\relax
   \else
     #1\lineheight\!!plus#2\lineheight\!!minus#2\lineheight\relax
   \fi}

\def\displayskipfactor          {1.0}
\def\displayshortskipfactor     {0.8}

\def\displayskipgluefactor      {0.3}
\def\displayshortskipgluefactor {0.2}

\def\abovedisplayskipsize% doet niets ?
  {\displayskipsize\displayskipfactor\displayskipgluefactor}

\def\belowdisplayskipsize% doet niets ?
  {\displayskipsize\displayskipfactor\displayskipgluefactor}

\def\abovedisplayshortskipsize%
  {\displayskipsize\displayshortskipfactor\displayshortskipgluefactor}

\def\belowdisplayshortskipsize%
  {\displayskipsize\displayshortskipfactor\displayshortskipgluefactor}

\def\setdisplayskip#1#2#3%
  {#1=#2\relax
   \advance#1 by -\parskip
   \advance#1 by -#3\relax}

\def\setdisplayskips%
  {\setdisplayskip\abovedisplayskip\abovedisplayskipsize\baselineskip
   \setdisplayskip\belowdisplayskip\belowdisplayskipsize\!!zeropoint
   \setdisplayskip\abovedisplayshortskip\abovedisplayshortskipsize\baselineskip
   \setdisplayskip\belowdisplayshortskip\belowdisplayshortskipsize\!!zeropoint}

% We stellen enkele penalties anders in dan Plain TEX:

\def\defaultwidowpenalty{2000} % was: 1000
\def\defaultclubpenalty {2000} % was:  800

\widowpenalty=\defaultwidowpenalty\relax
\clubpenalty =\defaultclubpenalty \relax

% Bovendien definieren we enkele extra \fill's:

\def\hfilll%
  {\hskip\!!zeropoint\!!plus1filll\relax}

\def\vfilll%
  {\vskip\!!zeropoint\!!plus1filll\relax}

% De onderstaande hulpmacro's moeten nog eens instelbaar worden
% gemaakt.

\def\tfskipsize{1em\relax}

\def\tfkernsize{1ex\relax}

\def\tfskip%
  {{\tf\hskip\tfskipsize}}

\def\tfkern%
  {{\tf\kern\tfkernsize}}

% Dit hoort eigenlijk thuis onder het kopje boodschappen cq,
% meldingen.

\def\mindermeldingen%
  {\hbadness=10000
   \hfuzz=\maxdimen
   \vbadness=10000
   \vfuzz=\maxdimen}

% Utility-file
%
% De onderstaande macro's ondersteunen het gebruik van de
% zogeheten utility-file. Alle extern onder te brengen
% informatie wordt opgeslagen in de file \jobname.tui, tenzij
% er selectief pagina's worden gezet. In dat geval wordt de
% file \jobname.tmp gebruikt. Informatie wordt ingelezen uit
% de file \jobname.tuo, welke door TeXUtil wordt aangemaakt.

% Bepaalde commando's worden als string weggeschreven. Deze
% zijn aan het eind van deze file gedefinieerd.

% Om een opbouw van spaties te voorkomen (???) moet ^^M een
% andere betekenis krijgen:
%
% \catcode`\^^M=14 (comment)
%
% read file
%
% \catcode`\^^M=5  (end of line)

\newwrite\uti
\newif\ifutilitydone

\def\@@utilityerrormessage%
  {\showmessage{\m!systems}{8}{}%
   \global\let\@@utilityerrormessage=\relax}

\def\thisisutilityversion#1%
  {\doifnot{\utilityversion}{#1}%
     {\@@utilityerrormessage
      \resetutilities
      \endinput}}

\def\writeutility%
  {\write\uti}

\def\immediatewriteutility%
  {\immediate\write\uti}

\def\writeutilitycommand#1%
  {\writeutility{c \string#1}}

\def\immediatewriteutilitycommand#1%
  {\immediatewriteutility{c \string#1}}

\def\openutilities%
  {\immediate\openout\uti=\jobname.\f!inputextension
   \immediatewriteutilitycommand{\thisisutilityversion{\utilityversion}}}

\def\closeutilities%
  {\savenofsubpages
   \savenofpages
   \immediate\closeout\uti
   \reportutilityproblems}

\def\abortutilitygeneration%
  {\immediatewriteutilitycommand{\utilitygenerationaborted}%
   \immediatewriteutility{q {quit}}}

\def\utilitygenerationaborted%
  {\showmessage{\m!systems}{21}{}%
   \global\let\utilitygenerationaborted=\endinput
   \gdef\reportutilityproblems{\showmessage{\m!systems}{22}{}}%
   \endinput}

\def\savecurrentvalue#1#2%
  {\immediatewriteutilitycommand{\initializevariable\string#1{#2}}}

\let\initializevariable\gdef

\def\disableinitializevariables%
  {\global\let\initializevariable\gobbletwoarguments}

\let\reportutilityproblems=\relax

\let\utilityresetlist=\empty

%\def\addutilityreset#1%
%  {\addtocommalist{\s!reset#1}\utilityresetlist}
%
%\def\resetutilities%
%  {\processcommacommand[\utilityresetlist]\getvalue}

\def\addutilityreset#1%
  {\addtocommalist{#1}\utilityresetlist}

\def\doresetutility#1%
  {\getvalue{\s!reset#1}}

\def\resetutilities%
  {\processcommacommand[\utilityresetlist]\doresetutility}

% #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
  {\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
   \disableinitializevariables
   \endgroup}

% 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\appendtwopasselement#1#2#3%
  {\debuggerinfo{\m!systems}{twopass data #1 - #2 = #3}%
   \setxvalue{#1:\s!list}{\getvalue{#1:\s!list}#3,}}

\def\dodefinetwopasslist#1%
  {\doifundefined{#1:\s!list}
     {\debuggerinfo{\m!systems}{defining twopass class #1}%
      \doglobal\addtocommalist{#1}\alltwopasslists
      \doglobal\addutilityreset{#1\s!pass}%
      \setgvalue{\s!set#1\s!pass}%
        {\global\letvalue{\s!set#1\s!pass}\gobbletwoarguments
         \setgvalue{@@#1\s!pass}{\appendtwopasselement{#1}}}%
      \setgvalue{\s!reset#1\s!pass}%
        {\global\letvalue{@@#1\s!pass}\gobbletwoarguments}%
      \getvalue{\s!reset#1\s!pass}}}

\def\definetwopasslist#1%
  {\expanded{\dodefinetwopasslist{#1}}}

\def\doloadtwopassdata#1%
  {\doifundefined{#1:\s!list}
     {\global\letvalue{#1:\s!list}\empty
      \doutilities{#1\s!pass}{\jobname}{}{}{}%
      \setxvalue{#1:\s!list}{\getvalue{#1:\s!list}0,0}}}

\def\loadtwopassdata%
  {\ifx\alltwopasslists\empty\else
     \processcommacommand[\alltwopasslists]\doloadtwopassdata
     \global\let\alltwopassdata\empty
   \fi}

\let\twopassdata=\empty

\def\dogettwopassdata[#1,#2]#3%
  {\doifelse{#1}{0} % \ifcase truukje gaat fout
     {\twopassdatafoundfalse
      \let\twopassdata\empty}
     {\twopassdatafoundtrue
      \setxvalue{#3:\s!list}{#2}%
      \edef\twopassdata{#1}}}

\def\gettwopassdata#1%
  {\loadtwopassdata
   \edef\!!stringa{\getvalue{#1:\s!list}}%
   \debuggerinfo{\m!systems}{twopass get #1 - \!!stringa}%
   \expandafter\dogettwopassdata\expandafter[\!!stringa]{#1}}

\def\findtwopassdata%
  {\loadtwopassdata
   \ExpandBothAfter\dofindtwopassdata}

\def\dofindtwopassdata#1#2%
  {\edef\!!stringa{,\getvalue{#1:\s!list}}%
   \debuggerinfo{\m!systems}{twopass find #2 - \!!stringa}%
   \def\dodofindtwopassdata[##1,##2#2##3,##4]%
     {\edef\twopassdata{##3}%
      \ifx\twopassdata\empty
        \twopassdatafoundfalse
      \else
        \twopassdatafoundtrue
      \fi}%
   \@EA\dodofindtwopassdata\@EA[\!!stringa,#2,#2,]}

\def\getfirsttwopassdata#1%
  {\loadtwopassdata
   \edef\!!stringa{\getvalue{#1:\s!list}}%
   \expandafter\dogetfirsttwopassdata\expandafter[\!!stringa]{#1}}

\def\dogetfirsttwopassdata[#1,#2]#3%
  {\doifelse{#1}{0}
     {\twopassdatafoundfalse
      \let\twopassdata\empty}
     {\twopassdatafoundtrue
      \edef\twopassdata{#1}}}

\def\getlasttwopassdata#1%
  {\loadtwopassdata
   \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%
  {\loadtwopassdata
   \getfromcommacommand[\getvalue{#1:\s!list}][#2]%
   \doifelsenothing{\commalistelement}
     {\twopassdatafoundfalse
      \let\twopassdata\empty}
     {\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}}

% NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET

\def\calculatevsizes% global needed in \resetlayoutregel
  {\redoglobal\teksthoogte=\zethoogte
   %\redoglobal\kopkopwit=\kopwit
   %\redoglobal\advance\kopkopwit by \hoofdhoogte
   %\redoglobal\advance\kopkopwit by \hoofdafstand
   \doifsometextlineelse{\v!hoofd}
     {\redoglobal\advance\teksthoogte by -\hoofdhoogte
      \redoglobal\advance\teksthoogte by -\hoofdafstand}
     {}%
   \doifsometextlineelse{\v!voet}
     {\redoglobal\advance\teksthoogte by -\voethoogte
      \redoglobal\advance\teksthoogte by -\voetafstand}
     {}%
   \resetglobal
   \setvsize}

\def\calculatereducedvsizes%
  {\teksthoogte=\zethoogte
   \doifsometextlineelse{\v!hoofd}
     {\advance\teksthoogte by -\hoofdhoogte
      \advance\teksthoogte by -\hoofdafstand}
     {\hoofdhoogte=\!!zeropoint}%
   \doifsometextlineelse{\v!voet}
     {\advance\teksthoogte by -\voethoogte
      \advance\teksthoogte by -\voetafstand}
     {\voethoogte=\!!zeropoint}}

\def\calculatehsizes%
  {\tekstbreedte=\zetbreedte
   \sethsize}

\def\sethsize%
  {\global\hsize=\tekstbreedte}

\def\setvsize%
  {\ifdim\vsize=\teksthoogte
   \else
     \bgroup
     \dimen0=-\vsize
     \advance\dimen0 by \teksthoogte
     \global\advance\vsize by \dimen0
%\ifgridsnapping % evt altijd, nog testen
%  \getnoflines\vsize
%  \vsize=\noflines\openlineheight % local is better and ok
%  \advance\vsize by .5\openlineheight % collect enough data
%\fi
     \ifdim\pagegoal<\maxdimen
       \advance\dimen0 by \pagegoal
       \global\pagegoal=\dimen0
     \fi
     \egroup
   \fi}

% Algemeen
%
% De Pragma-macros zijn samengesteld met behulp van de
% commandos van PlainTeX- en enkele TugBoat routines.
%
% Voor de volledigheid zijn in de definitie steeds de
% {}-haakjes vermeld. Deze haakjes zijn niet altijd
% nodig, Als bijvoorbeeld een paragraaf bewerkt wordt,
% kunnen ze achterwege blijven.
%
% Instellingen worden opgegeven tussen []-haakjes,
% meestal direct na het commando. Instellingen mogen
% soms achterwege blijven.
%
% Een aantal veelgebruikte macro's zijn in TeXEdit op
% naam en/of door middel van een mnemonic oproepbaar.

% %I n=Offset
% %I c=\steloffsetin
% %I
% %I De totale bladzijde kan verschoven worden ten opzichte
% %I van de linkerbovenhoek met:
% %I
% %I   \steloffsetin[rug=,kop=]
% %I
% %I Dit commando moet worden gegeven aan het begin van de
% %I pagina waarvoor het moet gelden. Er kunnen positieve
% %I en negatieve waarden worden ingevuld: -10pt, 1.5cm.
%
% \def\dosteloffsetin[#1]%
%   {\getparameters
%      [\??os]
%      [\c!rug=\rugoffset,
%       \c!kop=\kopoffset,
%       #1]%
%    \rugoffset=\@@osrug
%    \kopoffset=\@@oskop}
%
% \def\steloffsetin%
%   {\dosingleargument\dosteloffsetin}

% De onderstaande macro voert commando's uit, afhankelijk van
% het karakter van het paginanummer.
%
% \doifonevenpaginaelse{then-commando}{else-commando}

% NB \userpageno vervangen door \realpageno

\def\doifonevenpaginaelse#1#2%
  {\ifodd\realpageno#1\else#2\fi}

\def\doifbothsidesoverruled#1\orsideone#2\orsidetwo#3\od%
  {\ifdubbelzijdig
     \ifodd\realpageno#2\relax\else#3\relax\fi
   \else
     #1\relax
   \fi}

\def\doifbothsides#1\orsideone#2\orsidetwo#3\od%
  {\ifdubbelzijdig
     \ifenkelzijdig
       #1\relax
     \else
       \ifodd\realpageno#2\relax\else#3\relax\fi
     \fi
   \else
     #1\relax
   \fi}

\def\dostartglobaldefs#1#2%
  {\edef\!!stringa{\the\globaldefs}%
   \ifnum\globaldefs#10
     \globaldefs=-\globaldefs
   \fi
   \advance\globaldefs by #21
   \setevalue{@gd@\the\globaldefs}{\!!stringa}}

\def\dostopglobaldefs%
  {\doifdefinedelse{@gd@\the\globaldefs}
     {\globaldefs=\getvalue{@gd@\the\globaldefs}\relax}
     {\globaldefs=0\relax}}

\def\startlocal  {\dostartglobaldefs>-}
\def\stoplocal   {\dostopglobaldefs}
\def\startglobal {\dostartglobaldefs<+}
\def\stopglobal  {\dostopglobaldefs}

%I n=Zetspiegel
%I c=\stellayoutin,\definieerpapierformaat,\stelpapierformaatin
%I c=\paslayoutaan
%I
%I De zetspiegel is het door de tekst gevormde vlak.
%I Hiertoe behoren ¢¢k de hoofd- en voetmarge. De zetspiegel
%I wordt ingesteld met:
%I
%I   \stellayoutin[breedte=,hoogte=,rugwit=,kopwit=]
%I
%I Er dienen maten te worden ingevuld, waarbij de eenheid
%I direkt achter het getal staat: 10pt, 100mm, 5cm, 3.5in.
%I
%I De parameters hebben de volgende betekenis:
%I
%I   breedte    breedte van het tekstvlak, inclusief marges
%I   hoogte     hoogte van het tekstvlak, inclusief marges
%I   rugwit     witruimte aan de binnenzijde, zonder marge
%I   kopwit     witruimte aan de bovenzijde, zonder marge
%P
%I Rond de zetspiegel vinden we marges, randen, het hoofd en
%I de voet. Ook deze worden ingesteld met:
%I
%I   \stellayoutin[breedte=,hoogte=,rugwit=,kopwit=]
%I
%I   hoofd      hoogte van de bovenmarge binnen de zetspiegel
%I   voet       hoogte van de ondermarge binnen de zetspiegel
%I   marge      breedte van de marge naast de zetspiegel
%I
%I en
%I
%I   rand       breedte van de rand naast de marge
%I   boven      hoogte van de rand boven het hoofd
%I   onder      hoogte van de rand onder de voet
%I
%I Alleen het hoofd en de voet hangen dus samen met de
%I zetspiegel.
%P
%I Eventueel kunnen de linker- en rechtermarge en apart
%I worden ingesteld:
%I
%I   \stellayoutin[linkermarge=,rechtermarge=]
%I
%I Het zelfde geldt voor de randen. In dat geval wordt bij
%I dubbelzijdig zetten gespiegeld. Oppassen dus!
%I
%I De afstanden tussen marges, randen enz. kunnen worden
%I ingesteld met:
%I
%I   bovenafstand, onderafstand
%I   hoofdafstand,voetafstand
%I   linkermargeafstand,rechtermargeafstand,
%I   linkerrandafstand,rechterrandafstand
%P
%I De zetspiegel kan (tijdelijk) worden aangepast met het
%I commando:
%I
%I   \paslayoutaan[hoogte=]
%I
%I Men dient een positieve (+) of negatieve (-) maat op te
%I geven. De zethoogte blijft gelijk, maar de teksthoogte
%I wordt aangepast ten koste van de voethoogte. Eventueel
%I kan 'max' worden opgegeven.
%I
%I Er kan een reeks aanpassingen worden opgegeven:
%I
%I   \paslayoutaan[nr,nr,nr,...][hoogte=]
%I
%I Hierbij is staat nr voor het paginanummer, dat wil
%I zeggen: het volgnummer in de tekst.
%I
%I Bij voorlopige versies wordt onderaan de pagina de
%I aanpassing weergegeven.
%P
%I Beeldmerken en achtergronden worden uit oogpunt van
%I verwerkingssnelheid niet vaker berekend dan nodig. Mocht
%I om een of andere reden een beeldmerk of achtergrond niet
%I overeenkomen komen met de wensen, dan kan herberekenen
%I worden geforceerd met:
%I
%I   \stellayoutin[reset]
%P
%I Het papierformaat is in te stellen met het commando
%I
%I   \stelpapierformaatin[DIN-formaat]
%I
%I Mogelijke DIN-formaten zijn A4 tot en met A9. De
%I afmetingen van een A4 zijn:
%I
%I   breedte : 21.0cm =  8.18in = 589pt
%I   hoogte  : 29.7cm = 11.58in = 834pt
%I
%I Optioneel kan men het printer papierformaat instellen door
%I een tweede argument mee te geven. Standaard wordt
%I uitgegaan van A4.
%I
%I   \stelpapierformaatin[A5][A4]
%I
%P Men kan zelf een papierformaat definieren met
%I
%I   \definieerpapierformaat [naam] [hoogte=,breedte=]
%I
%I waarbij de offset betrekking heeft op dubbelzijdig zetten.

\def\dodefinieerpapierformaat[#1][#2]%
  {\getparameters
     [\??pp#1] % geen \c!schaal, scheelt hash ruimte
     [\c!breedte=\@@ppbreedte,\c!hoogte=\@@pphoogte,#2]}

\def\definieerpapierformaat%
  {\dodoubleargument\dodefinieerpapierformaat}

\definieerpapierformaat[][\c!breedte=210mm,\c!hoogte=297mm]

\chardef\papermirror   =0
\chardef\printmirror   =0
\chardef\paperrotation =0
\chardef\paperreverse  =0
\chardef\printrotation =0
\chardef\printreverse  =0
\chardef\paperlandscape=0
\chardef\printlandscape=0

\def\papierschaal{1}

\newif\ifnegateprintbox

\def\dostelpapierrichtingin#1#2#3#4#5%
  {\global\chardef#2=0
   \global\chardef#5=0
   \gdef#3{0}%
   \gdef#4{0}%
   \global\negateprintboxfalse
   \processallactionsinset
     [#1]
     [   \v!liggend=>\global\chardef#2=1,
      \v!gespiegeld=>\global\chardef#5=1,
       \v!geroteerd=>\gdef#3{90}\gdef#4{270},
        \v!negatief=>\global\negateprintboxtrue,
                 90=>\gdef#3{90}\gdef#4{270},
                180=>\gdef#3{180}\gdef#4{0},
                270=>\gdef#3{270}\gdef#4{90}]}

\def\dostelpapierformaatin[#1][#2]%
  {\ifsecondargument
     \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
   \else\iffirstargument
     \stelpapierformaatin[#1][#2]%
   \fi\fi}

\def\stelpapierformaatin%
  {\dodoubleempty\dostelpapierformaatin}

\def\checkforems[#1]%
  {\def\docommando##1%
     {\beforesplitstring##1\at em\to\asciia
      \doifnot{\asciia}{##1}
        {\aftersplitstring\asciia\at=\to\asciia
         \doifsomething{\asciia}
           {\showmessage{\m!systems}{10}{##1}}}}%
   \processcommalist[#1]\docommando}

\def\resetlayout%
  {\global\linkermargebreedte=\@@lylinkermarge
   \global\rechtermargebreedte=\@@lyrechtermarge
   \global\linkerrandbreedte=\@@lylinkerrand
   \global\rechterrandbreedte=\@@lyrechterrand
   \global\hoofdhoogte=\@@lyhoofd
   \global\voethoogte=\@@lyvoet
   \global\onderhoogte=\@@lyonder
   \global\bovenhoogte=\@@lyboven
   \global\rugwit=\@@lyrugwit
   \global\kopwit=\@@lykopwit
   \doifelse{\@@lygrid}{\v!ja}
     {\gridsnappingtrue}
     {\gridsnappingfalse}%
\ifgridsnapping
  \widowpenalty=0 % is gewoon beter
  \clubpenalty =0 % zeker bij grids
\else
  \widowpenalty=\defaultwidowpenalty
  \clubpenalty=\defaultclubpenalty
\fi
   \stelwitruimtein
   \stelblankoin
   \doifelse{\@@lybreedte}{\v!midden}
     {\global\zetbreedte=\papierbreedte
      \global\advance\zetbreedte by -2\rugwit}
     {\doifelse{\@@lybreedte}{\v!passend}
        {\global\zetbreedte=\papierbreedte
         \global\advance\zetbreedte by -\rugwit
         \scratchdimen=\rugwit
         \advance\scratchdimen by -\linkerrandbreedte
         \advance\scratchdimen by -\linkerrandafstand
         \advance\scratchdimen by -\paginascheiding
         \advance\scratchdimen by -\linkermargebreedte
         \advance\scratchdimen by -\linkermargeafstand
         \ifdim\scratchdimen<\!!zeropoint
           \scratchdimen=\!!zeropoint
         \fi
         \global\advance\zetbreedte by -\rechtermargeafstand
         \global\advance\zetbreedte by -\rechtermargebreedte
         \global\advance\zetbreedte by -\paginascheiding
         \global\advance\zetbreedte by -\rechterrandafstand
         \global\advance\zetbreedte by -\rechterrandbreedte
         \global\advance\zetbreedte by -\scratchdimen}
        {\global\zetbreedte=\@@lybreedte}}%
   \doifelse{\@@lyregels}{}
     {\doifelse{\@@lyhoogte}{\v!midden}
        {\global\zethoogte=\papierhoogte
         \global\advance\zethoogte by -2\kopwit}
        {\doifelse{\@@lyhoogte}{\v!passend}
           {\global\zethoogte=\papierhoogte
            \global\advance\zethoogte by -\kopwit
            \scratchdimen=\kopwit
            \advance\scratchdimen by -\bovenhoogte
            \advance\scratchdimen by -\bovenafstand
              \ifdim\scratchdimen<\!!zeropoint
              \scratchdimen=\!!zeropoint
            \fi
            \global\advance\zethoogte by -\onderafstand
            \global\advance\zethoogte by -\onderhoogte
            \global\advance\zethoogte by -\scratchdimen}
           {\global\zethoogte=\@@lyhoogte}}}
     {\global\zethoogte=\@@lyregels\lineheight
      \global\advance\zethoogte by \hoofdhoogte
      \global\advance\zethoogte by \voethoogte}%
   \rugoffset=\@@lyrugoffset
   \kopoffset=\@@lykopoffset
   \calculatehsizes
   \calculatevsizes
   \global\newlogostrue
   \global\newbackgroundtrue}

\def\checklayout%
  {\doifsomething{\@@lyregels}
     {\ifdim\zethoogte=\@@lyregels\lineheight \else \resetlayout \fi}}

\appendtoks \checklayout \to \everystarttext

\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}

\definecomplexorsimpleempty\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\adaptpagedimensions%
  {\rawdoifinsetelse{\realfolio}{\adaptedpages}
     {\getvalue{\??za\realfolio}%
      \letbeundefined{\??za\realfolio}}
     {}}

\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\c!letter\c!kleur{}%
     \begstrut\ignorespaces}

\def\dostopmargeblok%
  {\unskip\endstrut
   \dostopattributes
   \egroup
   \egroup}

\def\dontstartmargeblok%
  {\@@mbvoor
   \bgroup
   \dostartattributes\??mb\c!letter\c!kleur{}}

\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

\newif\ifinuitstellen

\newevery\everytopofpage\relax

\appendtoks\the\everytopofpage\to\everystarttext
\appendtoks\global\everytopofpage{}\to\everystoptext

\def\douitstellen%
  {\the\everytopofpage
   \ifinuitstellen\else\ifcase\nofpostponedblocks\else % The \nof-test is
     \global\inuitstellentrue                          % definitely needed
     \dorecurse{\nofpostponedblocks}                   % else we can loose
       {\haalbuffer[buf-\recurselevel]}                % or disorder floats
     \doflushfloats % new but potential dangerous      % and that is something
     \doglobal\newcounter\nofpostponedblocks           % we don't want, do we?
     \global\inuitstellenfalse                         % Anyhow, 'uitstellen'
   \fi\fi}                                             % is still suboptimal.

\setvalue{\e!start\e!uitstellen}%
  {\doglobal\increment\nofpostponedblocks
   \showmessage{\m!layouts}{3}{\nofpostponedblocks}%
   \dostartbuffer[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% overlapt behoorlijk met realpage macro 
  {\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!eerstesubpagina}\firstsubpage
     \setglobalsystemreference\rt!page{\v!laatstesubpagina}\lastsubpage
     \bgroup
     \ifnum\realpageno=\firstsubpage\relax
       \global\let\prevsubpage=\firstsubpage
\setglobalsystemreference\rt!page{\v!sub\v!achteruit}\lastsubpage
     \else
       \xdef\prevsubpage{\realfolio}%
       \doglobal\decrement\prevsubpage
\setglobalsystemreference\rt!page{\v!sub\v!achteruit}\prevsubpage
     \fi
     \setglobalsystemreference\rt!page{\v!vorigesubpagina}\prevsubpage
     \ifnum\realpageno=\lastsubpage\relax
       \global\let\nextsubpage=\lastsubpage
\setglobalsystemreference\rt!page{\v!sub\v!vooruit}\firstsubpage
     \else
       \xdef\nextsubpage{\realfolio}%
       \doglobal\increment\nextsubpage
\setglobalsystemreference\rt!page{\v!sub\v!vooruit}\nextsubpage
     \fi
     \setglobalsystemreference\rt!page{\v!volgendesubpagina}\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!eerstepagina}\firstpage
   \setglobalsystemreference\rt!page{\v!laatstepagina}\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!vorigepagina}\prevpage
   \egroup
   \bgroup
   \ifnum\realpageno<\lastpage\relax
     \advance\realpageno by 1
     \xdef\nextpage{\realfolio}%
     \setglobalsystemreference\rt!page{\v!pagina}\nextpage
     \setglobalsystemreference\rt!page{\v!vooruit}\nextpage
   \else
     \global\let\nextpage=\lastpage
     \setglobalsystemreference\rt!page{\v!pagina}\firstpage
     \setglobalsystemreference\rt!page{\v!vooruit}\firstpage
   \fi
   \setglobalsystemreference\rt!page{\v!volgendepagina}\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
   \savecurrentvalue\lastpage{\realfolio}}%
  %\immediatewriteutilitycommand{\realnumberofpages{\realfolio}}}%

\def\totaalaantalpaginas%
  {\lastpage}

\def\initializepaper%
  {\iflocation
     \dosetuppaper
       {\papierformaat}
       {\the\papierbreedte}
       {\the\papierhoogte}%
   \else
     \dosetuppaper
       {\printpapierformaat}
       {\the\printpapierbreedte}
       {\the\printpapierhoogte}%
   \fi}

\def\myshipout#1%
  {\voorpagina
   \dontshowcomposition
   \ifarrangingpages
     \actualarrange
       {\thisisrealpage{\realfolio}#1}%
   \else
     \actualshipout
       {\thisisrealpage{\realfolio}#1}%
   \fi
   \gotonextrealpage
   \napagina}

\newbox\postponedcontent

\def\flushatshipout%
  {\dowithnextbox
      {\global\setbox\postponedcontent=\hbox to \!!zeropoint
         {%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
          \box\postponedcontent\box\nextbox}%
       \global\ht\postponedcontent=\!!zeropoint
       \global\dp\postponedcontent=\!!zeropoint
       \global\wd\postponedcontent=\!!zeropoint}%
   \hbox}

% \starttypen
% \def\pagestoshipout{1,3,5}
% \stoptypen

\newcounter\shippedoutpages
\let\pagestoshipout\empty      % {1,3,6}
\chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even 

\def\actualshipout#1%
  {\doglobal\increment\shippedoutpages 
   \ifx\pagestoshipout\empty
     \ifcase\whichpagetoshipout\relax
       \donetrue
     \or % 1 
       \ifodd\shippedoutpages\relax\donetrue\else\donefalse\fi
     \or % 2
       \ifodd\shippedoutpages\relax\donefalse\else\donetrue\fi
     \else
       \donetrue
     \fi
   \else
     \ExpandBothAfter\doifinsetelse{\shippedoutpages}{\pagestoshipout}
       \donetrue\donefalse
   \fi
   \ifdone
     \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
              \ifnum\realpageno=\lastpage\relax\the\everylastshipout\fi}%
           \smashbox\scratchbox
           \box\scratchbox
           \box\postponedcontent % evt ver naar links !
           \box0}}%
   \else
     \message
       {[\ifarrangingpages arranged \fi page 
         \ifarrangingpages\the\arrangeno\else\the\realpageno\fi\normalspace
         not flushed]}% 
     \setbox0=\hbox{#1}%
     \deadcycles=0
   \fi}


\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
   \nofbotfloats=0
   \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% \fuzzysnappedbox{#1}{#2}% goes wrong
      \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
      \else
       %\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}%
  {\vskip\bovenhoogte} % \vbox to \bovenhoogte{\vss}}

\setvalue{\s!dummy\c!commando\v!onder}%
  {\vskip\onderhoogte} % \vbox to \onderhoogte{\vss}}

\def\plaatslinkerrandblok  {\dodummypageskip\v!links}
\def\plaatsrechterrandblok {\dodummypageskip\v!rechts}

\def\plaatsboventekstblok  {\dodummypageskip\v!boven}
\def\plaatsondertekstblok  {\dodummypageskip\v!onder}

% kan tzt nog eens als: 
%
% \newtoks\everyboventekstblok
%
%\def\plaatsboventekstblok%
%  {\vbox to \bovenhoogte
%     {\the\everyboventekstblok}
%
% \def\doplaatsboventekstblok#1%
%   {\vbox to \bovenhoogte
%      {\@@tkboventekstvoor#1\@@tkboventekstna\kern\!!zeropoint}%
%    \vskip-\bovenhoogte}
%
% \appendtoks\interactiemenus[\v!boven]\to\everyboventekstblok
%
% kan vaker, is namelijk sneller als commalist 

\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\hskip\@@lydx}\unskip}%
         \vskip\@@lydy}
      \unskip}}

\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
     {\beginrestorecatcodes
      \forgetall  % igv problemen, check: \boxmaxdepth\maxdimen
      \boxmaxdepth\maxdimen % new 
      \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
      \endrestorecatcodes}}

\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]%
  {\framed
     [\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
        {\framed
          [\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

\appendtoks \restoreglobalbodyfont \to \everypagebody 
\appendtoks \restorecolumnsettings \to \everypagebody

\def\dopagebody#1#2%
  {\getallmarks
   \the\everypagebody
   \startcolorpage
   \gotonextsubpage
   \dontshowboxes
   \naastpagina
   \checkreferences
   \checkmargeblokken
   \dotoks\beforeeverypage
   \flushtoks\beforepage
   \inpagebodytrue
   \buildpagebody#1#2%
   \flushtoks\afterpage
   \dotoks\aftereverypage
   \resetpagina
   \updatelistreferences
   \resetlayoutregels % mischien in shipout
   \stopcolorpage}

\def\beforefinaloutput%
  {}

\def\afterfinaloutput%
  {\forgetall
   \vskip\!!zeropoint\relax
   \ifvoid\normalpagebox
   \else
     \unvbox\normalpagebox
     \penalty\outputpenalty
   \fi
   \ifnum\outputpenalty>-\@MM\relax
   \else
     \dosupereject
   \fi
   \inpagebodytrue  % needed for enabling \blanko !
   \dosetbothinserts
   \setvsize % this is needed for interacting components, like floats and multicolumns
   \adaptfuzzypagegoal} % watch this hack!

\def\setpagecounters%
  {\setuserpageno{\ruwenummer[\s!page]}%
   \doifelse{\@@snstatus}{\v!stop}
     {\global\subpageno=0}
     {\global\subpageno=\ruwenummer[\s!subpage]}}

\newtoks\pageboundsettings 

\prependtoks \initializepaper \to \pageboundsettings

\def\dofinaloutput#1#2%
  {\beforefinaloutput
   \the\everybeforeshipout
   \ifspecialbasedsettings
     \myshipout{\hbox{\hbox to \!!zeropoint{\the\pageboundsettings}\hbox{\dopagebody#1#2\setpagecounters}}}%
   \else
     \the\pageboundsettings
     \myshipout{\hbox{\dopagebody#1#2\setpagecounters}}%
   \fi
   \the\everyaftershipout
   \afterfinaloutput
   \popcolor}  % ... and here ...

\def\donofinaloutput#1#2%
  {\beforefinaloutput
   \the\everybeforeshipout
   \setpagecounters
   \message{[-\the\realpageno]}%
   \setbox0=\hbox
     {\the\everyshipout
      \dopagebody#1#2}%
   \deadcycles=0
   \gotonextrealpage
   \the\everyaftershipout
   \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\complexstelspatieringin[#1]%
  {\processaction
     [#1]
     [\v!opelkaar=>\newfrenchspacing,
          \v!ruim=>\nonfrenchspacing]%
   \updateraggedskips}

\def\simplestelspatieringin%
  {\updateraggedskips}

\definecomplexorsimple\stelspatieringin

\bgroup
\catcode`\~=\@@active       % eigenlijk is ~ al actief
\gdef\fixedspaces%          % in Plain \TeX, maar we weten
  {\catcode`\~=\@@active    % nooit wat er inmiddels is
   \def~{\fixedspace}}      % gebeurd, vandaar.
\egroup

\def\space      { }
\def\fixedspace {\hskip.5em\relax} 
\def\nospace    {\unskip\ignorespaces}

\let\spatie     \space
\let\hardespatie\fixedspace
\let\geenspatie \nospace

\def\opelkaar%
  {\nointerlineskip}

\def\omlaag[#1]% nog eens mooier, relateren aan blanko 
  {\nointerlineskip
   \vskip#1 }

%I n=Witruimte
%I c=\stelwitruimtein,\witruimte,\geenwitruimte
%I c=\startopelkaar,\startvanelkaar
%I c=\startregelcorrectie,\corrigeerwitruimte
%I
%I De afstand tussen paragrafen is in te stellen met:
%I
%I   \stelwitruimtein[maat]
%I
%I In te vullen op de plaats van 'maat' (12pt, 1cm) of een
%I van de aanduidingen klein, middel of groot. Als niets
%I wordt meegegeven, dus alleen \stelwitruimtein, dan
%I wordt de ingestelde witruimte aangepast aan het formaat
%I letter.
%I
%I Voor elke lege regel in de ASCII-file voegt TEX de
%I ingestelde witruimte tussen.
%I
%I Het commando \witruimte dwingt witruimte af en het
%I commando \geenwitruimte maakt witruimte ongedaan.
%I
%I Behalve met de hier beschreven witruimte-commando's is de
%I witruimte tussen paragrafen te be‹nvloeden met behulp van
%I de elders beschreven blanko-commando's.
%P
%I Een stuk tekst kan zonder witruimte worden gezet door het
%I tussen de volgende commando's op te nemen:
%I
%I   \startopelkaar
%I   \stopopelkaar
%I
%I Waarbij een optioneel argument [blanko] mogelijk is. De
%I tegenhanger hiervan is:
%I
%I   \startvanelkaar
%I   \stopvanelkaar
%P
%I TeX handelt de interlinie van een (omlijnde) box of een
%I rule anders af dan van een regel tekst. In dergelijke
%I gevallen kan de volgende constructie worden gebruikt:
%I
%I   \startregelcorrectie
%I     \omlijnd{tekst}
%I   \stopregelcorrectie

\newskip\tussenwit
\tussenwit=\!!zeropoint

\def\blankokleinmaat%
  {\smallskipamount}

\def\blankomiddelmaat%
  {\medskipamount}

\def\blankogrootmaat%
  {\bigskipamount}

\def\currentwitruimte%
  {\!!zeropoint}

\def\stelwitruimteopnieuwin%
  {\expanded{\stelwitruimtein[\currentwitruimte]}}

% \def\dodostelwitruimtein[#1]%
%   {\processallactionsinset
%      [#1]
%      [\v!herstel=>\parskip=\tussenwit,
%         \v!regel=>\edef\currentwitruimte{#1}%
%                   \tussenwit=\baselineskip
%                   \parskip=\tussenwit,
%          \v!vast=>\tussenwit=1\tussenwit
%                   \parskip=1\parskip,
%       \s!default=>\doifnot{\currentwitruimte}{\v!geen}
%                     {\stelwitruimteopnieuwin},
%       \s!unknown=>\edef\currentwitruimte{#1}%
%                   \assigndimension{#1}
%                     {\tussenwit}{\blankokleinmaat}
%                     {\blankomiddelmaat}{\blankogrootmaat}%
%                   \parskip=\tussenwit]}

\newif\ifwitruimteflexibel

\def\dodostelwitruimtein[#1]%
  {\witruimteflexibeltrue
   \processallactionsinset
     [#1]
     [\v!herstel=>,
         \v!vast=>\witruimteflexibelfalse,
     \v!flexibel=>\witruimteflexibeltrue,
        \v!regel=>\tussenwit=\baselineskip,
   \v!halveregel=>\tussenwit=.5\baselineskip,
      \s!default=>\doifnot{\currentwitruimte}{\v!geen}
                    {\stelwitruimteopnieuwin},
      \s!unknown=>\@EA\assigndimension\@EA{\commalistelement} % \@EA is nodig
                    {\tussenwit}
                    {\blankokleinmaat}{\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}

\def\savecurrentwitruimte%
  {\edef\restorecurrentwitruimte%
     {\tussenwit=\the\tussenwit
      \parskip=\the\parskip
      \noexpand\def\noexpand\currentwitruimte{\currentwitruimte}%
      \ifwitruimteflexibel
        \noexpand\witruimteflexibeltrue
      \else
        \noexpand\witruimteflexibelfalse
      \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
\baselinecorrection %% zie in \plaatsregister[n=1]   
       \vskip\noparskipsignal   % waarschijnlijk ook in
     \fi                        % blanko blokkeer
     \bgroup
     \doifelse{#1}{\v!blanko}
       {\opelkaarfalse}
       {\opelkaartrue}%
     \blanko[\v!blokkeer]%
     \stelwitruimtein[\v!geen]
  \fi}

\def\stopopelkaar%
  {\par
\ifvmode
   \egroup
   \ifdim\lastskip=\noparskipsignal\relax
     \removelastskip
     \geenwitruimte
     \vskip-\lastdoneparskip
     \vskip+\lastdoneparskip
\prevdepth-\lastdoneprevdepth % zeer recent toegevoegd
   \fi
\fi}

\def\startvanelkaar%
  {\blanko
   \leavevmode
   \bgroup}

\def\stopvanelkaar%
  {\egroup
   \blanko}

% De onderstaande macro's moeten nog eens nader worden uitgewerkt.
% Ze spelen een rol bij de spatiering rond omkaderde teksten
% en/of boxen zonder diepte.

\def\toonregelcorrectie   {\showbaselinecorrection}
\def\regelcorrectie       {\baselinecorrection}
%\def\startregelcorrectie {\startbaselinecorrection}
%\def\stopregelcorrectie  {\stopbaselinecorrection}

\definecomplexorsimpleempty\startregelcorrectie

% \prevdepth crosses pageboundaries!

\let\dorondomregelcorrectie=\relax

\def\complexstartregelcorrectie[#1]%
  {\bgroup
   \processaction
     [#1]
     [ \v!blanko=>\let\dorondomregelcorrectie=\blanko,
      \s!default=>\let\dorondomregelcorrectie=\relax,
      \s!unknown=>{\def\dorondomregelcorrectie{\blanko[#1]}}]%
   \dorondomregelcorrectie
   \startbaselinecorrection
   \offbaselinecorrection}

\def\stopregelcorrectie%
  {\stopbaselinecorrection
   \dorondomregelcorrectie
   \egroup}

\def\corrigeerwitruimte%
  {\dowithnextbox
     {\startbaselinecorrection
      \box\nextbox
      \stopbaselinecorrection}%
   \vbox}

%I n=Regelafstand
%I c=\stelinterliniein
%I
%I De regelafstand is in te stellen met het commando:
%I
%I   \stelinterliniein[factor]
%I
%I Invulmogelijkheden voor 'factor' zijn: klein (1.00),
%I middel (1.25), groot (1.50) of een getal. OOk kan
%I aan of uit worden opgegeven.
%I
%I Als het commando zonder [factor] wordt gegeven, dan
%I worden de interlinie aangepast aan het formaat van het
%I actuele letterformaat. Een aan het formaat aangepaste
%I interlinie kan ook worden ingesteld met:
%I
%I   \stelinterliniein[reset,factor]
%I
%I In z'n eenvoudigste vorm \stelinterliniein wordt de
%I interlinie aangepast aan het formaat letter.

%D There are two ways to influence the interline spacing. The
%D most general and often most consistent way is using
%D
%D \showsetup{\y!stelinterliniein}
%D
%D For instance
%D
%D \starttypen
%D \setupinterlinespace[line=2.8ex]
%D \stoptypen
%D
%D This setting adapts itself to the bodyfontsize, while for
%D instance saying
%D
%D \starttypen
%D \setupinterlinespace[line=12pt]
%D \stoptypen
%D
%D sets things fixed for all sizes, which is definitely not
%D what we want. Therefore one can also say:
%D
%D \starttypen
%D \definecorpsenvironment[9pt][interlinespace=11pt]
%D \stoptypen
%D
%D One can still use \type{\setupinterlinespace} (without
%D arguments) to set the interline space according to the
%D current font, e.g. a \type{\bfa}.

\newif\iflocalinterlinespace

\def\bodyfontinterlinespecs%
  {\??ft\normalizedbodyfontsize\c!interlinie}

\def\bodyfontinterlinespace%
  {\csname\bodyfontinterlinespecs\endcsname}

\def\presetnormallineheight%
  {\edef\normallineheight{\@@itregel}%
   \iflocalinterlinespace \else
     \doifdefined{\bodyfontinterlinespecs}
       {\doifsomething{\bodyfontinterlinespace}
          {\edef\normallineheight{\bodyfontinterlinespace}}}%
   \fi}

\def\complexstelinterliniein[#1]% \commalistelement ipv #1
  {\doifassignmentelse{#1}
     {\getparameters[\??it][#1]%
      \scratchdimen=0\@@ithoogte pt
      \advance\scratchdimen by 0\@@itdiepte pt
      \ifdim\scratchdimen>1pt
        \showmessage{\m!layouts}{10}{\@@ithoogte,\@@itdiepte}%
        \let\@@ithoogte=\strutheightfactor
        \let\@@itdiepte=\strutdepthfactor
      \else
        \let\strutheightfactor=\@@ithoogte
        \let\strutdepthfactor =\@@itdiepte
      \fi
      \let\normallineheight=\@@itregel
      \let\topskipfactor   =\@@itboven
      \let\maxdepthfactor  =\@@itonder
      \setfontparameters % redundant \setstrut
      \updateraggedskips} % yes indeed
     {\processallactionsinset % \regelwit = dummy !
        [#1]
        [     \v!aan=>\oninterlineskip,
              \v!uit=>\offinterlineskip,
            \v!reset=>\setfontparameters,
          \s!unknown=>\assignvalue{#1}{\regelwit}{1.00}{1.25}{1.50}%
                      \spacing{\regelwit}]}}

\def\simplestelinterliniein%
  {\localinterlinespacetrue
   \setfontparameters
   \updateraggedskips % funny one here 
   \localinterlinespacefalse}

\definecomplexorsimple\stelinterliniein

%I n=Blanko
%I c=\blanko,\geenblanko,\stelblankoin
%I c=\startregelcorrectie
%I
%I Behalve met de hier beschreven blanko-commando's is de
%I witruimte tussen paragrafen te be‹nvloeden met behulp van
%I de elders beschreven witruimte-commando's.
%I
%I Het commando
%I
%I   \blanko[sprong]
%I
%I voegt witruimte tussen paragrafen toe.
%I
%I Mogelijke instellingen voor 'sprong' zijn: terug, klein,
%I middel, groot. Per blanko is elke combinatie van
%I instellingen toegestaan. Ook een veelvoud van een instelling
%I is mogelijk. Enkele voorbeelden:
%I
%I   \blanko[terug,3*groot]
%I   \blanko[klein,middel]
%P
%I Naast de genoemde instellingen zijn enkele bijzondere
%I instellingen mogelijk:
%I
%I   wit         tussenvoegen van \witruimte
%I   geenwit     terugspringen van \witruimte
%I   blokkeer    overslaan van de volgende \blanko
%I   reset       opheffen van \blanko[blokkeer]
%I   forceer     afdwingen van een blanko (bovenaan)
%I
%I Ook deze instellingen zijn in combinatie met andere te
%I gebruiken. Een voorbeeld: \blanko[forceer,wit,2*middel].
%I
%I Het commando \blanko (zonder instelling) is gelijk aan
%I \blanko[groot].
%I
%I Het commando \geenblanko maakt het commando \blanko
%I ongedaan.
%P
%I Met het commando's
%I
%I   \stelblankoin[maat]
%I
%I is het mogelijk de spronggrootte in te stellen. De maat
%I kan worden opgegeven in getallen en eenheden (12pt, 1cm).
%I De standaard instellingen krijgt met met 'normaal',
%I regelafstanden met 'regel'.
%I
%I Het commando \stelblankoin (zonder argument) past de sprong
%I aan het formaat letter aan.
%P
%I Rond omlijnde tekst, of algemener: rond lijnen, wordt
%I geen witruimte gegenereerd. Wil men dit wel, dan dient men
%I de betreffende tekst te omringen met:
%I
%I   \startregelcorrectie
%I   \stopregelcorrectie

% In earlier versions \type{\bigskipamount} was
% \type{\ht\strutbox} and the stretch was plus or minus
% \type{.4\dp\strutbox}. Don't ask me why. The most recent
% implementation is based on a user supplied distance, which
% is by default \type{.75\normalskipamount} where
% \type{\normalskipamount} equals the current baseline
% distance.

\newif\ifblankoreset        \blankoresetfalse
\newif\ifblankoblokkeer     \blankoblokkeerfalse
\newif\ifblankogeenwit      \blankogeenwitfalse
\newif\ifdoeblanko          \doeblankofalse
\newif\ifblankoflexibel     \blankoflexibeltrue
\newif\ifblankobuiten
\newif\ifblankoforceer

\newskip\blankoskip         \blankoskip=\bigskipamount
\newskip\blankoskipamount

\def\skipfactor       {.75}
\def\skipgluefactor   {.25}

%\def\normalskipamount%
%  {\openlineheight
%     \ifblankoflexibel
%       \!!plus\skipgluefactor\openlineheight
%       \!!minus\skipgluefactor\openlineheight
%     \fi
%   \relax}

\def\normalskipamount%
  {\openlineheight
     \ifgridsnapping \else \ifblankoflexibel
       \!!plus\skipgluefactor\openlineheight
       \!!minus\skipgluefactor\openlineheight
     \fi \fi
   \relax}

\def\regelafstand{\normalskipamount}

\def\deblankoskip{\skipfactor\regelafstand}

\def\laatsteblankoskip%
  {\blankoskip}

\def\geenblanko%
  {\removelastskip}

\def\dosingleblanko#1% ook nog \v!halveregel+fuzzysnap
  {\doifelse{#1}{\v!regel}
     {\blankoskipamount=\openlineheight}
     {\ifgridsnapping
        \assigndimension{#1}{\blankoskipamount}%
          {.25\openlineheight}{.5\openlineheight}{\openlineheight}%
      \else
        \assigndimension{#1}{\blankoskipamount}%
          {\smallskipamount}{\medskipamount}{\bigskipamount}%
      \fi}%
   \global\advance\blankoskip by \blankoskipamount}

\newif\iffuzzyvskip

\def\doblanko#1%
  {\processallactionsinset
     [#1]
     [    \v!groot=>\dosingleblanko\v!groot, % happens often
         \v!buiten=>\ifvmode\ifinner\blankobuitentrue\fi\fi,
          \v!reset=>\global\blankoresettrue,
           \v!back=>\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=>\global\blankoforceertrue, 
          \v!regel=>\global\advance\blankoskip by \lineheight,
     \v!halveregel=>\global\fuzzyvskiptrue\global\advance\blankoskip by .5\lineheight,
        \s!unknown=>{\herhaalmetcommando[#1]\dosingleblanko}]}

\def\oldprevdepth{\prevdepth}%
\def\newprevdepth{-1001pt}

\def\mindimen{0.00002pt}

\def\docomplexdoblanko[#1]% pas op \relax's zijn nodig ivm volgende \if
  {\global\blankoresetfalse
   \global\blankoblokkeerfalse
   \global\blankogeenwitfalse
   \global\blankoskip=\!!zeropoint\relax
   \global\blankoforceerfalse
   \blankobuitenfalse
   \processcommalist[#1]\doblanko
   \ifblankobuiten
   \else
     \par
     \ifvmode
       \ifblankoforceer\ifdim\prevdepth>\!!zeropoint\else
         \vbox{\strut}\kern-\lineheight
       \fi\fi
       \ifblankoblokkeer
         \global\doeblankofalse
         \edef\oldprevdepth{\the\prevdepth}%
         \prevdepth=\newprevdepth
       \else
         \global\doeblankotrue
       \fi
       \ifblankoreset
         \global\doeblankotrue
         \ifdim\prevdepth=\newprevdepth
           \prevdepth=\oldprevdepth
         \fi
       \fi
       \ifdoeblanko
         \ifdim\lastskip<\blankoskip\relax
           % else when \blanko[2*groot] + \blanko[3*groot] with parskip
           % equaling 1*groot, gives a groot=\parskip so adding a small
           % value makes it distinguishable; can also be done at parskip
           % setting time (better)
           \global\advance\blankoskip by \mindimen\relax % = skip
           % test this on 2* + 3* and parskip groot
           \ifblankogeenwit
             \global\advance\blankoskip by -\parskip
           \else
             \ifdim\lastskip=\parskip
             \else  % force this due to previous comment
               \ifdim\parskip>\!!zeropoint\relax
                 \ifdim\blankoskip<\parskip\relax
                   \global\blankoskip=\!!zeropoint
                 \else
                   \global\advance\blankoskip by -\parskip
                 \fi
               \fi
             \fi
           \fi
           \ifdim\prevdepth=\newprevdepth
           \else
             \iffuzzyvskip
               \removelastfuzzyvskip
               \fuzzyvskip\blankoskip\relax
             \else
               \removelastskip
               \vskip\blankoskip\relax
             \fi
           \fi
         \else
           \iffuzzyvskip
             \removelastfuzzyvskip
             \fuzzyvskip\blankoskip\relax
           \fi
         \fi
       \fi
     \fi
   \fi
   \global\fuzzyvskipfalse
   \presetindentation}

\def\complexdodoblanko[#1]%
  {\flushfootnotes
   \ifopelkaar
     \ifinpagebody
       \expanded{\docomplexdoblanko[#1]}% \expanded=nieuw
     \else
       \par
     \fi
   \else
     \expanded{\docomplexdoblanko[#1]}% \expanded = nieuw
   \fi}

\def\doindirectblanko#1%
  {\ifundefined{\??bo#1}% <-etex \expandafter\ifx\csname\??bo#1\endcsname\relax
     \expanded{\complexdodoblanko[#1]}%
   \else
     \expandafter\complexdoblanko\expandafter[\csname\??bo#1\endcsname]%
   \fi}

\def\complexdoblanko[#1]% enables [force,8\bodyfontsize]
  {\doifinstringelse{,}{#1}
     {\expanded{\complexdodoblanko[#1]}}
     {\doifnumberelse{#1}
        {\expanded{\complexdodoblanko[#1]}}
        {\doindirectblanko{#1}}}}

\def\currentblanko%
  {\v!groot}

\def\simpledoblanko%
  {\doifelse{\currentwitruimte}{\v!geen}
     {\blanko[\currentblanko]}
     {\blanko[\currentwitruimte]}}

\def\blanko% % the \relax is definitely needed due to the many \if's 
  {\relax\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]%
  {\ifgridsnapping
     \blankoflexibelfalse
   \else
     \ExpandFirstAfter\processallactionsinset
       [#1]
       [ \v!flexibel=>\blankoflexibeltrue,
             \v!vast=>\blankoflexibelfalse]%
   \fi
   \ExpandFirstAfter\processallactionsinset
     [#1]
     [ \v!flexibel=>\dostelblankoin{\deblankoskip},
           \v!vast=>\dostelblankoin{\deblankoskip},
          \v!regel=>\edef\deblankoskip{\regelafstand}%
                    \dostelblankoin{\deblankoskip}%
                    \let\deblanko=\v!groot,
     \v!halveregel=>\scratchskip=.5\regelafstand
                    \edef\deblankoskip{\the\scratchskip}%
                    \dostelblankoin{\deblankoskip}%
                    \let\deblanko=\v!middel,
          \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}

\definecomplexorsimpleempty\stelblankoin

\def\dodefinieerblanko[#1][#2]%
  {\setvalue{\??bo#1}{#2}}

\def\definieerblanko%
  {\dodoubleargument\dodefinieerblanko}

\def\savecurrentblanko%
  {\edef\restorecurrentblanko%
     {\bigskipamount=\the\bigskipamount
      \medskipamount=\the\medskipamount
      \smallskipamount=\the\smallskipamount
      \noexpand\def\noexpand\currentblanko{\currentblanko}%
      \ifblankoflexibel
        \noexpand\blankoflexibeltrue
      \else
        \noexpand\blankoflexibelfalse
      \fi}}

%I n=Inspringen
%I c=\inspringen,\nietinspringen,\welinspringen
%I c=\stelinspringenin
%I
%I Het inspringen van de eerste regel van een paragraaf
%I wordt ingesteld met het commando:
%I
%I   \inspringen[parameter]
%I
%I waarbij als parameter kan worden meegegeven:
%I
%I   niet       de volgende paragraaf niet inspringen
%I   nooit      de volgende paragrafen niet inspringen
%I   altijd     de volgende paragrafen inspringen
%I
%I De mate van inspringen wordt ingesteld met:
%I
%I   \stelinspringenin[maat]
%I
%I waarbij maat staat voor een TeX-maat of het woord klein,
%I middel, groot of geen.

\let\currentvoorwit=\empty

\newdimen\voorwit

\newif\ifindentfirstparagraph % \indentfirstparagraphtrue

\def\presetindentation%
  {\doifoutervmode
     {\ifindentfirstparagraph\else\noindentation\fi}}

\def\dostelinspringenin[#1]%
  {\processallactionsinset
     [#1]
     [   \v!eerste=>\indentfirstparagraphtrue,
       \v!volgende=>\indentfirstparagraphfalse,
        \s!default=>\dodostelinspringenin,
        \s!unknown=>\edef\currentvoorwit{\commalistelement}%
                    \dodostelinspringenin]}

\def\dodostelinspringenin%
  {\assigndimension{\currentvoorwit}{\voorwit}{1em}{1.5em}{2em}%
   \parindent=\voorwit\relax}

\def\stelinspringenin%
  {\dosingleempty\dostelinspringenin}

\def\doinspringen[#1]%
  {\processallactionsinset
     [#1]
     [    \v!nee=>\parindent=\voorwit\relax\noindent,
         \v!niet=>\parindent=\voorwit\relax\noindent,
           \v!ja=>\parindent=\voorwit\relax,            % geen \indent !
       \v!eerste=>\indentfirstparagraphtrue,
     \v!volgende=>\indentfirstparagraphfalse,
       \v!altijd=>\parindent=\voorwit\relax,            % geen \indent !
        \v!nooit=>\parindent=\!!zeropoint\relax]}

\def\inspringen%
  {\dosingleargument\doinspringen}

\def\nietinspringen{\inspringen[\v!nee,\v!volgende]}
\def\welinspringen {\inspringen[\v!ja,\v!eerste]}

%I n=Verhogen,Verlagen
%I c=\laag,\hoog,\laho
%I
%I Met de volgende commando's kunnen letters en woorden
%I worden verhoogd en verlaagd.
%I
%I  \laag{tekst}
%I  \hoog{tekst}
%I  \laho{lage tekst}{hoge tekst}

\def\holatextfont{\tx}
\def\holamathfont{\the\scriptfont\fam}

\def\dodohooglaag#1%
  {\doifelsenothing{\fontsize}
    %{\ifnum\fam<0 \holatextfont\else\holamathfont\fi#1}
     {\ifmmode
        \ifnum\fam<0
          \holatextfont
        \else
          \holamathfont
        \fi
      \else
        \holatextfont
      \fi#1}
     {\holatextfont#1}}

\def\dohooglaag#1#2#3#4#5%
  {\bgroup
   \ifdim\fontdimen5\textfont2=1ex
     \dimen0=\fontdimen#1\textfont2
   \else
     \dimen0=#2ex
   \fi
   \advance\dimen0 by #3\relax
   \kern.1ex
   \setbox0=\hbox{#4\dimen0\hbox{\dodohooglaag{#5}}}%
   \ht0=\ht\strutbox
   \dp0=\dp\strutbox
   \box0
   \egroup}

\unexpanded\def\hoog%
  {\dohooglaag{14}{.86}\!!zeropoint\raise}

\unexpanded\def\laag%
  {\dohooglaag{16}{.48}\!!zeropoint\lower}

\unexpanded\def\laho#1#2%
  {\hbox%
     {\setbox4=\hbox{\dohooglaag{16}{.48}{.1ex}{\lower}{#1}}%
      \setbox6=\hbox{\dohooglaag{14}{.86}{.1ex}{\raise}{#2}}%
      \ifdim\wd4<\wd6\relax
        \wd4=\!!zeropoint\box4\box6\relax
      \else
        \wd6=\!!zeropoint\box6\box4\relax
      \fi}}

%I n=Kapitalen
%I c=\kap,\Kap,\KAP,\Kaps,\Woord,\Woorden,\uitgerekt
%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   \uitgerekt{tekst}
%I
%I bijvoorbeeld:
%I
%I   \hbox to 20em{\uitgerekt{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!status=\v!start,
      \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
      \doifnot{\@@psstatus}{\v!overlay}
        {\skip2=##5\relax
         \advance\skip2 by ##3\relax
         \ifdim##3<-##7\relax\global##7=-##3\relax\fi
         \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}

%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%
  {\doifinsetelse{\@@kloffset}{\v!geen,\v!overlay}
     {\let\@@kloffset\!!zeropoint}
     {\scratchdimen=\@@kloffset
      \advance\scratchdimen by -\@@kllijndikte
      \edef\@@kloffset{\the\scratchdimen}}%
   \localframed
     [\??kl]
     [\c!strut=\v!nee,
      \c!breedte=\v!passend,
      \c!hoogte=\v!passend,
      \c!uitlijnen=]}

\let\restorecolumnsettings\relax

\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
          \def\columntextoffset{\@@kloffset}}%
       \ifx\@@klcommando\empty\else
         \let\postprocesscolumnline\@@klcommando
       \fi
       \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
       %
       % probably more is needed, and how about nesting save's
       %
       \savecurrentblanko
       \savecurrentwitruimte
       \def\restorecolumnsettings%
         {\boxmaxdepth\maxdimen % done elsewhere 
          \restorecurrentblanko
          \restorecurrentwitruimte}%
       %
       \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}

\definecomplexorsimpleempty\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\dotoonkader[#1][#2]%
  {\ifsecondargument
     \stelachtergrondenin
       [#1][#2]
       [\c!achtergrond=,
        \c!kader=\v!aan,
        \c!hoek=\v!recht,
        \c!kaderoffset=\!!zeropoint,
        \c!kaderdiepte=\!!zeropoint,
        \c!kaderkleur=]
   \else\iffirstargument
     \toonkader
       [\v!hoofd,\v!tekst,\v!voet]
       [#1]
   \else
     \toonkader
       [\v!hoofd,\v!tekst,\v!voet]
       [\v!linkerrand,\v!linkermarge,
        \v!tekst,
        \v!rechtermarge,\v!rechterrand]
   \fi\fi
   \let\pageseparation=\!!zeropoint}

\def\toonkader{\dodoubleempty\dotoonkader}

\def\tooninstellingA#1#2%
  {#1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr}

\def\tooninstellingC#1#2%
  {#1&\dimen0=#2\PtToCm{\the\dimen0}&\dimen0=#2\the\dimen0&\tttf\string#2\cr}

\def\tooninstellingB#1#2#3%
  {#1&&#2#3&\tttf\string#3\cr}

\startinterface dutch 

\def\tooninstellingen% 
  {\noindent
   \vbox
     {\forgetall
      \mindermeldingen
      \switchtobodyfont[\v!klein]
      \tabskip\!!zeropoint
      \halign
        {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
         \tooninstellingA{papierhoogte}       \papierhoogte
         \tooninstellingA{papierbreedte}      \papierbreedte
         \tooninstellingA{printpapierhoogte}  \printpapierhoogte
         \tooninstellingA{printpapierbreedte} \printpapierbreedte
         \tooninstellingA{kopwit}             \kopwit
         \tooninstellingA{rugwit}             \rugwit
         \tooninstellingA{hoogte}             \zethoogte
         \tooninstellingA{breedte}            \zetbreedte
         \tooninstellingA{teksthoogte}        \teksthoogte
         \tooninstellingA{tekstbreedte}       \tekstbreedte
         \tooninstellingC{bovenafstand}       \bovenafstand
         \tooninstellingA{hoofd}              \hoofdhoogte
         \tooninstellingC{hoofdafstand}       \hoofdafstand
         \tooninstellingA{boven}              \bovenhoogte
         \tooninstellingC{voetafstand}        \voetafstand
         \tooninstellingA{voet}               \voethoogte
         \tooninstellingC{onderafstand}       \onderafstand
         \tooninstellingA{onder}              \onderhoogte
         \tooninstellingA{linkerrand}         \linkerrandbreedte
         \tooninstellingC{linkerrandafstand}  \linkerrandafstand
         \tooninstellingA{linkermarge}        \linkermargebreedte
         \tooninstellingC{linkermargeafstand} \linkermargeafstand
         \tooninstellingC{rechtermargeafstand}\rechtermargeafstand
         \tooninstellingA{rechtermarge}       \rechtermargebreedte
         \tooninstellingC{rechterrandafstand} \rechterrandafstand
         \tooninstellingA{rechterrand}        \rechterrandbreedte
         \noalign{\blanko}
         \tooninstellingB{korps}  \the   \globalbodyfontsize
         \noalign{\blanko}
         \tooninstellingB{regel}  \relax \normallineheight
         \tooninstellingB{hoogte} \relax \strutheightfactor
         \tooninstellingB{diepte} \relax \strutdepthfactor
         \tooninstellingB{boven}  \relax \topskipfactor
         \tooninstellingB{onder}  \relax \maxdepthfactor}}}

\stopinterface

\startinterface english 

\def\tooninstellingen% 
  {\noindent
   \vbox
     {\forgetall
      \mindermeldingen
      \switchtobodyfont[\v!klein]
      \tabskip\!!zeropoint
      \halign
        {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
         \tooninstellingA{paperheight}        \paperheight
         \tooninstellingA{paperwidth}         \paperwidth
         \tooninstellingA{printpaperheight}   \printpaperheight
         \tooninstellingA{printpaperwidth}    \printpaperwidth
         \tooninstellingA{topspace}           \topspace
         \tooninstellingA{backspace}          \backspace
         \tooninstellingA{height}             \makeupheight
         \tooninstellingA{width}              \makeupwidth
         \tooninstellingA{textheight}         \textheight
         \tooninstellingA{textwidth}          \textwidth
         \tooninstellingA{top}                \topheight
         \tooninstellingC{topdistance}        \topdistance
         \tooninstellingA{header}             \headerheight
         \tooninstellingC{headerdistance}     \headerdistance
         \tooninstellingC{footerdistance}     \footerdistance
         \tooninstellingA{footer}             \footerheight
         \tooninstellingC{bottomdistance}     \bottomdistance
         \tooninstellingA{bottom}             \bottomheight
         \tooninstellingA{leftedge}           \leftedgewidth
         \tooninstellingC{leftedgedistance}   \leftedgedistance
         \tooninstellingA{leftmargin}         \leftmarginwidth
         \tooninstellingC{leftmargindistance} \leftmargindistance
         \tooninstellingC{rightmargindistance}\rightmargindistance
         \tooninstellingA{rightmargin}        \rightmarginwidth
         \tooninstellingC{rightedgedistance}  \rightedgedistance
         \tooninstellingA{rightedge}          \rightedgewidth
         \noalign{\blanko}
         \tooninstellingB{bodyfontsize}       \the   \globalbodyfontsize
         \noalign{\blanko}
         \tooninstellingB{line}               \relax \normallineheight
         \tooninstellingB{height}             \relax \strutheightfactor
         \tooninstellingB{depth}              \relax \strutdepthfactor
         \tooninstellingB{topskip}            \relax \topskipfactor
         \tooninstellingB{maxdepth}           \relax \maxdepthfactor}}}

\stopinterface

\startinterface german

\def\tooninstellingen% 
  {\noindent
   \vbox
     {\forgetall
      \mindermeldingen
      \switchtobodyfont[\v!klein]
      \tabskip\!!zeropoint
      \halign
        {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
         \tooninstellingA{papierhoehe}          \papierhoehe
         \tooninstellingA{papierbreite}         \papierbreite
         \tooninstellingA{printpapierhoehe}     \printpapierhoehe
         \tooninstellingA{printpapierbreite}    \printpapierbreite
         \tooninstellingA{kopfweite}            \kopfweite
         \tooninstellingA{rumpfweite}           \rumpfweite
         \tooninstellingA{hoehe}                \satzhoehe
         \tooninstellingA{breite}               \satzbreite
         \tooninstellingA{texthoehe}            \texthoehe
         \tooninstellingA{textbreite}           \textbreite
         \tooninstellingA{oben}                 \hoeheoben
         \tooninstellingC{abstandoben}          \abstandoben        
         \tooninstellingA{kopfzeile}            \kopfzeilenhoehe
         \tooninstellingC{kopfzeilenabstand}    \kopfzeilenabstand
         \tooninstellingC{fusszeileabstand}     \fusszeileabstand
         \tooninstellingA{fusszeilen}           \fusszeilenhoehe
         \tooninstellingC{abstandunten}         \abstandunten
         \tooninstellingA{hoeheunten}           \hoeheunten
         \tooninstellingA{linkerrand}           \breitelinkerrand
         \tooninstellingC{abstandlinkerrand}    \abstandlinkerrand
         \tooninstellingA{linkemarginal}        \linkemarginalbreite
         \tooninstellingC{linkemarginalafstand} \linkemarginalafstand
         \tooninstellingC{rechtemarginalafstand}\rechtemarginalafstand
         \tooninstellingA{rechtemarginal}       \rechtemarginalbreite
         \tooninstellingC{abstandrechterrand}   \abstandrechterrand
         \tooninstellingA{rechterrand}          \breiterechterrand
         \noalign{\blanko}
         \tooninstellingB{fliesstext}           \the   \globalbodyfontsize
         \noalign{\blanko}
         \tooninstellingB{linie}                \relax \normallineheight
         \tooninstellingB{hoehe}                \relax \strutheightfactor
         \tooninstellingB{tiefe}                \relax \strutdepthfactor
         \tooninstellingB{topskip}              \relax \topskipfactor
         \tooninstellingB{maxdepth}             \relax \maxdepthfactor}}}

\stopinterface

\def\toonlayout% interfereert lelijk met een \typefile er na
  {\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\ifoptimizeitems  \optimizeitemstrue
\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!letter,\c!marletter,\c!symletter,\c!kopletter,
         \c!kleur,\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}]%
     %\dorecurse{\@@ooniveaus}{\setnextitemlevel\recurselevel}%
   \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#4]% * permits [2]
  {\processaction
     [#2#3#4]
     [   \v!opelkaar*=>\packitems,
            \v!intro*=>\somintrotrue,
        \v!autointro*=>\somautointrotrue,
             \v!ruim*=>{\doassign[\??op#1][\c!factor=1]},
        #2#3*\v!ruim*=>{\doassign[\??op#1][\c!factor=#2#3]},
          #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!los*=>\optimizeitemsfalse,
      \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#3*\v!aanelkaar*=>{\doassign[\??op#1][\c!factor=-#2#3]},
     #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]}]}
%        {\dorecurse{\maxitemlevel}{\ExpandFirstAfter\dodododostelopsommingin[\recurselevel][#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}

% PAS OP: ook 'opelkaar' en zo worden getest, nog eens afvangen! 

\def\setitemmark#1% % en pas op: resets \docommando
  {\doifsymboldefinedelse{#1} 
     {\setxvalue{\??op\c!symbool\s!global\itemlevel}{#1}%
      \setgvalue{\??op\c!symbool\s!local\itemlevel}{?}%
      \def\listitem{\symbol[#1]}%
      \let\docommando\gobbleoneargument}
     {\doifconversiondefinedelse{#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}%
         \let\docommando\gobbleoneargument}
       {\let\listitem\empty}}}

%\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\calculatelistwidth#1#2%
  {#2=\getvalue{\??op#1\c!afstand}\relax
   \ifnum\getvalue{\??op#1\c!factor}>0
     \ifdim#2=\!!zeropoint #2=.5em\fi
   \fi
   \multiply#2 by \getvalue{\??op#1\c!factor}\relax
   \advance#2 by \getvalue{\??op#1\c!breedte}\relax}

\def\dodostartopsomming[#1][#2]%
  {\ifhmode
     \par
   \fi
   \ifnum\itemlevel=\maxitemlevel\relax
     \showmessage{\m!layouts}{9}{\maxitemlevel}%
     \def\itemincrement{0}%
   \else
     \def\itemincrement{1}%
   \fi
   \doglobal\increment(\itemlevel,\itemincrement)%
   \begingroup
   \ifnum\itemlevel=1 % NIEUW
     \doadaptleftskip{\getvalue{\??op1\c!marge}}%
%     \dosetraggedcommand{\@@oouitlijnen}\raggedcommand
   \fi
\dosetraggedcommand{\getvalue{\??op\itemlevel\c!uitlijnen}}\raggedcommand
   \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}\c!marletter\c!markleur{##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}\c!symletter\c!symkleur{##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}}}}%
   \setvalue{\v!its}%
     {\getvalue{\v!ran}%
        {\dorecurse{\getvalue{\??op\itemlevel\c!items}}{\listitem\hss}%
         \unskip}}%
   \setvalue{\v!ran}##1%
     {\getvalue{\v!sym}%
        {\calculatelistwidth{\itemlevel}{\dimen0}%
         \hbox to \dimen0
           {##1\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
   \ifsomkolommen \else
     \dolistreference % beware ! 
   \fi
   \endgroup
   \ifsomkolommen
     \global\somkolommenfalse
     \stopkolommen
     \getvalue{\??op\itemlevel\c!na}%
   \else
     \ifnum\itemlevel=1
       \dosomebreak\allowbreak           % toegevoegd
       \getvalue{\??op1\c!na}%
       \doif{\@@oospringvolgendein}{\v!nee}{\noindentation}%
     \fi
   \fi
   \endgroup
   \doglobal\decrement(\itemlevel,\itemincrement)%
   \egroup}

\def\sombreak%
  {\flushfootnotes\penalty-5\relax}   % -10

\def\somnobreak%
  {\flushfootnotes\penalty+5\ifbinnenkolommen\else00\fi\relax} % +5 

\def\dolistitem%
  {\par
   \ignorespaces
   \increment\noflistelements
%   \ifnum\noflistelements=1                 % als gevolg van nesting
%     \findtwopassdata{\s!list}{\noflists:}% % wordt soms de volgorde
%   \fi                                      % verstoord, vandaar \find
   \ifsomkolommen\else\ifoptimizeitems
     \ifnum\noflistelements=1                 % tgv bv kolommen/nesting
       \findtwopassdata{\s!list}{\noflists:}% % wordt soms de volgorde
     \fi                                      % verstoord, vandaar 
     \iftwopassdatafound
       \ifnum\twopassdata=3 
         \ifnum\noflistelements>1
           \dosomebreak\somnobreak
         \fi
       \else\ifnum\twopassdata>3
         \ifnum\noflistelements=2
           \ifsomintro
             \dosomebreak\nobreak
           \else
             \dosomebreak\somnobreak
           \fi
         \else\ifnum\twopassdata=\noflistelements\relax
           \dosomebreak\somnobreak
         \else\ifnum\noflistelements>2
           \dosomebreak\sombreak
         \else
           \ifsomintro\else\dosomebreak\sombreak\fi
         \fi\fi\fi
       \fi\fi
     \fi
   \fi\fi
   \noindent
   \ifkopsom
     \setbox8=\hbox
       {\doattributes{\??op\itemlevel}\c!kopletter\c!kopkleur{\listitem}}%
   \else\ifsymsom
     \setbox8=\hbox{\symsymbol}%
   \else
     \setbox8=\hbox
       {\doattributes{\??op\itemlevel}\c!letter\c!kleur{\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\ifbinnenkolommen\else % dubbelop
     \ifnum\noflistelements>0\relax\dosomebreak\nobreak\fi
   \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}
     {\doifnot{\itemreference}{?}
        {\bgroup
         \protectconversion
         \rawreference{\s!lst}{#1}{\itemreference}%
         \egroup}}%
   \ignorespaces}

\def\complexsom[#1]#2\par%
  {\startopsomming[#1]
   \complexdosom[]\ignorespaces#2\par
   \stopopsomming}

\definecomplexorsimpleempty\som
\definecomplexorsimpleempty\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}\c!kopletter\c!kopkleur
%     {\ignorespaces#2}}\par%
%   \ifpackeditems\else\itemuse{\c!kopna}\fi%
%   \dosomebreak\nobreak}

\def\complexdokop[#1]#2\par%
  {\ifpackeditems\else\itemuse{\c!kopvoor}\fi%
   \dosomebreak{\pagina[\v!voorkeur]}%  geen \goodbreak ! \allowbreak testen
   \complexdosom[#1]{\doattributes{\??op\itemlevel}\c!kopletter\c!kopkleur
     {\ignorespaces#2}}\par%
   \ifpackeditems\else\itemuse{\c!kopna}\fi%
   \dosomebreak\nobreak
   \noindentation}

\def\complexkop[#1]#2\par#3\par%
  {\startopsomming[#1]%
   \complexdokop[]\ignorespaces#2\par#3\par%
   \stopopsomming}

\definecomplexorsimpleempty\kop
\definecomplexorsimpleempty\dokop

\def\sym#1%
  {\noindent
   \setbox0=\hbox{#1}%
   \ifdim\wd0<1em\relax
     \setbox0=\hbox to 1.5em{#1\hfil}%
   \else
     \setbox0=\hbox spread 1em{#1\hfil}%
   \fi
   \hangindent=\wd0\relax
   \box0
   \ignorespaces}

%I n=Doordefinieren
%I c=\doordefinieren,\steldoordefinierenin
%I
%I Er kunnen (eenvoudige) definitie-lijsten worden
%I gemaakt met behulp van het commando:
%I
%I   \doordefinieren[naam][plaats=,breedte=,uitlijnen=,
%I     monster=,letter=,kopletter=,voor=,tussen=,na=,hang=,
%I     inspringen=,tekst=]
%I
%I Een definitie is vervolgens op naam op te roepen:
%I
%I   \naam{begrip} definitie
%P
%I Een definitie heeft de vorm:
%I
%I links     Dit is een linker tekst. Een tekst wordt
%I           links geplaatst als 'links' wordt meegegeven.
%I
%I Dit is een rechter tekst. Een tekst wordt        rechts
%I rechts geplaatst als 'rechts' wordt meegegeven.
%I
%I boven
%I
%I Dit is een tekst waarbij het woord erboven staat. Voor
%I dit soort teksten wordt 'boven' meegegeven.
%I
%I Tot slot is het mogelijk de tekst in de marge of
%I aansluitend te plaatsen, in dat geval wordt 'inmarge',
%I 'inlinker', 'inrechter' of 'aanelkaar' meegegeven.
%P
%I Aan 'voor', 'tussen' of 'na' kan een commando worden
%I toegekend, bijvoorbeeld \blanko[groot]. Als letter kan
%I normaal, vet, kapitaal, type, schuin, klein en kleinvet
%I worden meegegeven.
%I
%I Als 'breedte' kan een maat worden meegegeven of een van de
%I instellingen 'passend' en 'ruim'. In dat geval wordt de
%I aan 'monster' toegekende tekst als uitgangspunt genomen.
%P
%I Met 'hang' kan men aangeven hoe lang er links of rechts
%I moet worden ingesprongen. Er kan een aantal regels worden
%I meegegeven maar ook 'passend' of 'ruim'. Een overgang naar
%I een nieuwe regel binnen een linker- of rechtertekst wordt
%I afgedwongen met \\ (vergelijk \margeteksten).
%I
%I Defaultwaarden kunnen worden ingesteld met het commando:
%I
%I   \steldoordefinierenin[instellingen]
%I
%I Het tussentijds bijstellen van de instellingen is mogelijk
%I met:
%I
%I  \steldoordefinieren[naam][instellingen]

% Dit kan en moet dus anders:
%
% \start... :  \vbox\bgroup
% \stop...  :  \egroup
% llap enz.
% geen indent!
%
% enz. enz.
%
% Op die manier is meer mogelijk en worden \par's geskipt.
%
% De macro \??dd#1\s!do\c!commando levert de koppeling tussen
% \doornummeren en \doordefinieren. Deze constructie is nodig
% omdat doornummeren geen argument heeft en omdat subnummers
% niet worden genest binnen het hogere niveau. Het commando
% \??dd#1\s!do\c!status moet in dat geval \v!start zijn.
%
% herimplementeren met \nextbox en \unhbox\unvbox

\newbox\@@definitiebox

\def\@@definitiewoord#1%
  {\getvalue{\??dd#1\s!do\c!commando}{#1}}

\def\normal@@definitiewoord#1[#2]#3#4%
  {\doattributes
     {\??dd#1}\c!kopletter\c!kopkleur
     {\getvalue{\??dd#1\c!commando}%
        {\begstrut\getvalue{\??dd#1\c!tekst}#4\endstrut}}%
   \rawreference{\s!def}{#2}{#3}}

\setvalue{@@definitie\v!links}#1%
  {\@@definitiehang{#1}\@@definitielinkspure\@@definitielinkshang}

\setvalue{@@definitie\v!rechts}#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
     {\mindermeldingen
      \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
     {\mindermeldingen
      \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
      \mindermeldingen
      \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}}}%

\setvalue{@@definitie\v!boven}#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}}

\setvalue{@@definitie\v!inmarge}#1[#2]#3%
  {\@@dostartdefinitie{#1}[#2]{#3}%
   \inmarge{\unhcopy\@@definitiebox}%
   \@@dodefinitie{#1}}

\setvalue{@@definitie\v!inlinker}#1[#2]#3%
  {\@@dostartdefinitie{#1}[#2]{#3}%
   \inlinker{\unhcopy\@@definitiebox}%
   \@@dodefinitie{#1}}

\setvalue{@@definitie\v!inrechter}#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}%
   \unhcopy\@@definitiebox
   \hskip\!!widthb \!!plus .5\!!widthb \!!minus .25\!!widthb
   \@@dodefinitie{#1}}

\def\@@definitieaanelkaarbreed#1[#2]#3%
  {\@@dostartdefinitie{#1}[#2]{#3}%
   \hbox to \!!widtha
     {\unhcopy\@@definitiebox\hss}%
   \hskip\!!widthb 
   \ignorespaces
   \@@dodefinitie{#1}}

\setvalue{@@definitie\v!aanelkaar}#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}}

\setvalue{@@definitie\v!hangend}#1[#2]#3%
  {\skip0=-\leftskip                % uggly trick
   \@@dostartdefinitie{#1}[#2]{#3}% % adds \c!marge to \leftskip
   \advance\skip0 by \leftskip      % but useful
   \ifdim\skip0=\!!zeropoint
     \skip0=1.5em                   % just some default
     \advance\leftskip by \skip0
   \fi
   \hskip-\skip0                    % no hang in the first line
   \unhcopy\@@definitiebox
   \ifdim\!!widthb=\!!zeropoint
     \kern.75em                     % another default
   \else
     \kern\!!widthb
   \fi
   \ignorespaces
   \@@dodefinitie{#1}}

\def\@@dostartdefinitie#1[#2]#3%
  {\getvalue{\??dd#1\c!voor}%
   \begingroup
   \doadaptleftskip{\getvalue{\??dd#1\c!marge}}%
   \showcomposition
   \setbox\@@definitiebox=\hbox
     {\forgetall
      \mindermeldingen
      \def\\{\crcr}%
      \doattributes
        {\??dd#1}\c!kopletter\c!kopkleur
        {\doifelsevalue{\??dd#1\c!plaats}{\v!aanelkaar}
           {\@@definitiewoord{#1}[#2]{#3}{#3}}
           {\@@definitiewoord{#1}[#2]{#3}{\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}\c!kopletter\c!kopkleur
           {\getvalue{\??dd#1\c!tekst}\getvalue{\??dd#1\c!monster}}}}
     {\!!widthb}%
  %\getvalue{\??dd#1\s!do\c!lokaal}%
   \parindent=\!!zeropoint\relax
   \noindent
   \ignorespaces}

\def\@@stopdefinitie#1%
  {\par
   \dostopattributes
   \endgroup
   \egroup % temporary hack
   \getvalue{\??dd#1\c!na}%
   \doifvalue{\??dd#1\c!springvolgendein}{\v!nee}{\noindentation}}

\def\@@dodefinitie#1%
  {\dostartattributes{\??dd#1}\c!letter\c!kleur{}%
   \ignorespaces}

\def\@@somedefinitie#1[#2]#3%
  {\bgroup % temporary hack
  %\BeforePar{\getvalue{\??dd#1}[#2]{#3}}%
   \BeforePar{\executedoordefinitie{#1}[#2]{#3}}%
   \AfterPar{\@@stopdefinitie{#1}}%
   \GetPar}

\def\@@startsomedefinitie#1[#2]#3%
  {\bgroup % temporary hack
  %\BeforePar{\getvalue{\??dd#1}[#2]{#3}}%
   \BeforePar{\executedoordefinitie{#1}[#2]{#3}}%
   \GotoPar}

\def\dodosteldoordefinierenin[#1][#2]%
  {\getparameters[\??dd#1][#2]}

\def\dosteldoordefinierenin[#1][#2]% % beter: \iffirstargument
  {\ConvertToConstant\doifelse{#2}{}
     {\dodosteldoordefinierenin[][#1]}
     {\dodoubleargumentwithset\dodosteldoordefinierenin[#1][#2]}}

\def\steldoordefinierenin%
  {\dodoubleempty\dosteldoordefinierenin}

\def\executedoordefinitie#1[#2]%
  {\ExpandAfter\doifundefined{@@definitie\getvalue{\??dd#1\c!plaats}}
     {\setvalue{\??dd#1\c!plaats}{\v!links}}%
   \getvalue{@@definitie\getvalue{\??dd#1\c!plaats}}{#1}[#2]}

\def\dodoordefinieren[#1][#2]%
  {\copyparameters[\??dd#1][\??dd]
     [\c!plaats,\c!kopletter,\c!letter,\c!kleur,\c!kopkleur,
      \c!breedte,\c!hang,\c!monster,\c!voor,\c!tussen,\c!na,\c!marge,
      \c!springvolgendein,\c!uitlijnen,\c!tekst,\c!afstand,\c!commando]%
   \getparameters[\??dd#1]
     [\s!do\c!status=\v!stop,
      \s!do\c!commando=\normal@@definitiewoord,
      #2]%
   \doifvalue{\??dd#1\c!plaats}{\v!boven}%
     {\doassign[\??dd#1][\c!tussen={\blanko}]}%
   \setvalue{#1}%
     {\dodoubleempty\@@definitie[#1]}%
   \setvalue{\e!start#1}%
     {\dodoubleempty\@@startdefinitie[#1]}%
   \setvalue{\e!stop#1}%
     {\@@stopdefinitie{#1}}}%

\def\@@startdefinitie[#1][#2]%
  {\doifelsevalue{\??dd#1\s!do\c!status}{\v!start}
     {\def\next{\@@startsomedefinitie{#1}[#2]{}}}
     {\def\next{\dowithwargument{\@@startsomedefinitie{#1}[#2]}}}%
   \next}

\def\@@definitie[#1][#2]%
  {\doifelsevalue{\??dd#1\s!do\c!status}{\v!start}
     {\def\next{\@@somedefinitie{#1}[#2]{}}}
     {\def\next{\dowithwargument{\@@somedefinitie{#1}[#2]}}}%
   \next}

\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#7=#1[#2]#3#4 van definitie

\def\special@@definitiewoord#1#2#3#4[#5]#6#7%
  {\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}\c!kopletter\c!kopkleur
          {\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
     \edef\!!stringa{\showdnpuretext{#2#1}}% nog eens testen binnen \expanded
     \expanded{\doattributes{\??dd#1}\noexpand\c!kopletter\noexpand\c!kopkleur
       {\!!stringa}}%
     \rawreference{\s!num}{#5}{}%
   \fi}

\def\@@ddresetsubsubsubnummer#1%
  {\edef\doornummer{\getvalue{\??dd#1\??dd\c!nummer}}%
   \resetnummer[\v!sub\v!sub\v!sub\doornummer]}

\def\@@ddresetsubsubnummer#1%
  {\@@ddresetsubsubsubnummer{#1}%
   \resetnummer[\v!sub\v!sub\doornummer]}

\def\@@ddresetsubnummer#1%
  {\@@ddresetsubsubnummer{#1}%
   \resetnummer[\v!sub\doornummer]}

\def\@@ddresetnummer#1%
  {\@@ddresetsubnummer{#1}%
   \resetnummer[\doornummer]}

\def\@@ddvolgendesubsubsubnummer#1[#2]%
  {\edef\doornummer{\getvalue{\??dd#1\??dd\c!nummer}}%
   \verhoognummer[\v!sub\v!sub\v!sub\doornummer]%
   \rawreference{\s!num}{#2}{\showdnsubsubsubnummer{\doornummer}}}%

\def\@@ddvolgendesubsubnummer#1[#2]%
  {\@@ddresetsubsubsubnummer{#1}%
   \verhoognummer[\v!sub\v!sub\doornummer]%
   \rawreference{\s!num}{#2}{\showdnsubsubnummer{\doornummer}}}

\def\@@ddvolgendesubnummer#1[#2]%
  {\@@ddresetsubsubnummer{#1}%
   \verhoognummer[\v!sub\doornummer]%
   \rawreference{\s!num}{#2}{\showdnsubnummer{\doornummer}}}

\def\@@ddvolgendenummer#1[#2]%
  {\@@ddresetsubnummer{#1}%
   \verhoognummer[\doornummer]%
   \rawreference{\s!num}{#2}{\showdnnummer{\doornummer}}}

\def\dodosteldoornummerenin[#1][#2]%
  {\getparameters[\??dd#1][#2]%
   \stelnummerin[#1][\c!conversie=\getvalue{\??dd#1\c!conversie}]} % see below

\def\dosteldoornummerenin[#1][#2]%
  {\ConvertToConstant\doifelse{#2}{}
     {\getparameters[\??dn][#1]}
     {\dodoubleargumentwithset\dodosteldoornummerenin[#1][#2]}}

\def\steldoornummerenin%
  {\dodoubleempty\dosteldoornummerenin}

\def\dododoornummeren#1#2#3[#4][#5]#6%
  {\dodoordefinieren[#3#1]%
     [\s!do\c!status=\v!start,
      \s!do\c!commando=\special@@definitiewoord{#1}{#3}{#6}]%
   \copyparameters[\??dd#3#1][\??dn]
     [\c!plaats,\c!kopletter,\c!letter,\c!kleur,\c!kopkleur,
      \c!breedte,\c!nummer,\c!afstand,\c!commando,
      \c!monster,\c!hang,\c!uitlijnen,\c!voor,\c!tussen,\c!na,
      \c!niveaus,\c!wijze,\c!blokwijze,\c!scheider,\c!marge,
      \c!springvolgendein,\c!afsluiter,\c!sectienummer,\c!nummer]%
   \ConvertToConstant\doifinstringelse{=}{#4}
     {\getparameters[\??dd#3#1]%
        [\c!tekst=#1,\??dd\c!nummer=#1,\c!conversie=,
         \c!links=,\c!rechts=,\c!koppeling=,#4]}%
     {\doifelsenothing{#4}
        {\getparameters[\??dd#3#1]%
           [\c!tekst=#1,\??dd\c!nummer=#1,\c!conversie=,
            \c!links=,\c!rechts=,\c!koppeling=,#4]}%
        {\copyparameters[\??dd#3#1][\??dd#3#4]
           [\c!plaats,\c!kopletter,\c!letter,\c!kleur,\c!kopkleur,
            \c!breedte,\c!nummer,\c!afstand,\c!commando,\c!marge,
            \c!monster,\c!hang,\c!uitlijnen,\c!voor,\c!tussen,\c!na,
            \c!springvolgendein,\c!links,\c!rechts,\c!koppeling]%
         \getparameters[\??dd#3#1]
           [\c!tekst=#1,\??dd\c!nummer=#4,\c!conversie=,#5]}}%
   \ExpandBothAfter\doif{\getvalue{\??dd#3#1\??dd\c!nummer}}{#1}
     {\definieernummer
        [#3#1]
        [\c!wijze=\getvalue{\??dd#1\c!wijze},
         \c!blokwijze=\getvalue{\??dd#1\c!blokwijze},
         \c!sectienummer=\getvalue{\??dd#1\c!sectienummer}]%
      \doifvalue{\??dd#1\c!niveaus}{#2}%                           % for
        {\doifsomething{\getvalue{\??dd#1\c!conversie}}%           % old
           {\stelnummerin[#3#1]                                    % times
              [\c!conversie=\getvalue{\??dd#1\c!conversie}]}}}%    % sake
   \setvalue{\s!reset#3#1}%
     {\doresetdoornummer[#1][#3]}%
   \setvalue{\e!volgende#3#1}%
     {\dotripleempty\dovolgendedoornummer[#1][#3]}}

\def\dovolgendedoornummer[#1][#2]%
  {\getvalue{\??dd\c!volgende#2\c!nummer}{#1}}%

\def\doresetdoornummer[#1][#2]%
  {\getvalue{\??dd\s!reset#2\c!nummer}{#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
   \dosomebreak{\goodbreak}% \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}\c!kopletter\c!kopkleur
        {\getvalue{\??ds#1\c!monster}\getvalue{\??ds#1\c!scheider}}}
     {1em}%
   \advance\!!widtha by \tfskipsize
   \setbox2=\hbox to \!!widtha
     {\doattributes
        {\??ds#1}\c!kopletter\c!kopkleur
        {\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}\c!letter\c!kleur{}% #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}\c!kopletter\c!kopkleur
     {\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

\let\updateraggedskips\relax

\def\setraggedskips#1#2#3#4#5#6% never change this name
  {\def\updateraggedskips%
     {\dosetraggedskips{#1}{#2}{#3}{#4}{#5}{#6}}%
   \updateraggedskips}     

\def\dosetraggedskips#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}

% directe commando's

\def\regellinks {\doalignline \relax \hss  }
\def\regelrechts{\doalignline \hss   \relax}
\def\regelmidden{\doalignline \hss   \hss  }

% indirecte commando's 

\setvalue{regel\v!links }{\doalignline \relax \hss  }
\setvalue{regel\v!rechts}{\doalignline \hss   \relax}
\setvalue{regel\v!midden}{\doalignline \hss   \hss  }

\def\doregelplaats#1%
  {\getvalue{regel#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\margestrutheight{\ht\strutbox}

\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!nee=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{\v!normaal},
       \v!binnen=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#2},
       \v!buiten=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#3},
        \v!links=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{\v!links},
       \v!midden=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{\v!midden},
       \v!rechts=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{\v!rechts},
      \s!default=>\setvalue{\??im\margetekstnummer\c!uitlijnen}{#2}]%
   \setbox0=\vbox\localframed
     [\??im\margetekstnummer]
     [\c!strut=\v!nee]
     {\decrement\margetekstregels
      \@@imvoor
      \doattributes
        {\??im\margetekstnummer}\c!letter\c!kleur
        {\dorecurse{\margetekstregels}{\strut\\}%
         \xdef\margestrutheight{\the\ht\strutbox}%
         \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
           \dimen0=\dp\strutbox
           \advance\dimen0 by \margestrutheight
           \advance\dimen0 by -\ht\strutbox
           \raise\dimen0
         \fi
         \box0}}%
   \ht0=\!!zeropoint
   \dp0=\!!zeropoint
   \gdef\margestrutheight{\the\ht\strutbox}%
   \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
     [\v!links][\doinlinker][\doinrechter]}

\def\inrechter%
  {\indentation\doquintupleempty\doinmarge
     [\v!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][]% see next macro 
   \@EA\setgvalue\@EA{\@EA\??im\@EA\margincontent\@EA}\@EA
     {\@EA\stelinmargein\@EA[\margincontent][]%  see next macro 
      \flushmargincontent[#1][#2]{#3}}}

\def\margewoordpositie[#1]#2%
  {\ifnum#1>\margincontent
     \xdef\margincontent{#1}%
   \fi
   \stelinmargein[#1][]% when at outer level, saves local settings
   \setgvalue{\??im#1}%
     {\stelinmargein[#1][]% needed when par start outside group
      \flushmargincontent[][]{#2}}}

\def\margewoord%
  {\dodoubleempty\complexmargewoord}

\def\margetitel%
  {\margewoord}

\def\margetekst%
  {\margewoord}

\def\oplinker#1%
  {\strut
   \vadjust
     {\mindermeldingen
      \setbox0=\vtop{\forgetall\strut#1}%
      \getboxheight\dimen0\of\box0
      \vskip-\dimen0\
      \box0}}

%D \macros
%D   {inleftside,inleftmargin,inrightmargin,inrightside}
%D   {}
%D
%D The fast and clean way of putting things in the margin is
%D using \type{\rlap} or \type{\llap}. Unfortunately these
%D macro's don't handle indentation, left and right skips. We
%D therefore embed them in some macro's that (force and)
%D remove the indentation and restore it afterwards.

\def\inleftmargin#1%
  {\pushindentation
   \llap{#1\hskip\leftskip\hskip\linkermargeafstand}%
   \popindentation
   \ignorespaces}

\def\inrightmargin#1%
  {\pushindentation
   \rlap{\hskip\hsize\hskip-\rightskip\hskip\rechtermargeafstand#1}%
   \popindentation
   \ignorespaces}

\def\inleftside#1%
  {\inleftmargin
     {#1\relax
      \hskip\linkermargebreedte
      \hskip\pageseparation
      \hskip\linkerrandafstand}}

\def\inrightside#1%
  {\inrightmargin
     {\hskip\rechtermargebreedte
      \hskip\rechterrandafstand
      \hskip\pageseparation
      #1}}

%D We want to keep things efficient and therefore only handle
%D situations like:
%D
%D \startbuffer
%D                  \inleftside    {fine} some text \par
%D \strut           \inleftmargin  {fine} some text \par
%D \noindent        \inrightmargin {fine} some text \par
%D \noindent \strut \inrightside   {fine} some text \par
%D \stopbuffer
%D
%D \typebuffer
%D
%D which looks like:
%D
%D \bgroup
%D \haalbuffer
%D \parindent 30pt
%D \haalbuffer
%D \egroup

%D \macros
%D   {pushindentation,popindentation}
%D
%D The pushing and popping is done by:

\newbox\indentationboxA
\newbox\indentationboxB

\def\pushindentation%
  {\bgroup
   \ifhmode
     \unskip
     \setbox\indentationboxA=\lastbox       % get \strut if present
     \unskip
     \setbox\indentationboxB=\lastbox       % get \indent generated box
     \unskip
   \else
     \hskip\!!zeropoint                     % switch to horizontal mode
     \unskip
     \setbox\indentationboxA=\lastbox       % get \indent generated box
     \setbox\indentationboxB=\box\voidb@x
   \fi}

\def\popindentation%
  {\box\indentationboxB\box\indentationboxA % put back the boxes
   \egroup}

%D The only complication lays in \type{\strut}. In \PLAIN\
%D \TEX\ a \type{\strut} is defined as:
%D
%D \starttypen
%D \def\strut%
%D   {\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
%D \stoptypen
%D
%D But what is a \type{\strut}? Normally it's a rule of width
%D zero, but when made visual, it's a rule and a negative skip.
%D The mechanism for putting things in the margins described
%D here cannot handle this situation very well. One
%D characteristic of \type{\strut} is that the \type{\unhcopy}
%D results in entering horizontal mode, which in return leads
%D to some indentation.
%D
%D To serve our purpose a bit better, the macro \type{\strut}
%D can be redefined as:
%D
%D \starttypen
%D \def\strut%
%D   {\relax\ifmmode\else\hskip0pt\fi\copy\strutbox}
%D \stoptypen
%D
%D Or more compatible:
%D
%D \starttypen
%D \def\strut%
%D   {\relax\ifmmode
%D      \copy\strutbox
%D    \else
%D      \bgroup\setbox\strutbox=\normalhbox{\box\strutbox}\unhcopy\strutbox\egroup
%D    \fi}
%D \stoptypen
%D
%D In \CONTEXT\ however we save some processing time by putting
%D an extra \type{\hbox} around the \type{\strutbox}.

% dit zijn voorlopig lokale commando's

\def\woordinlinker {\inlinkermarge}  % vervallen
\def\woordinrechter{\inrechtermarge} % vervallen

\def\woordinmarge%
  {\doquintupleempty\doinmarge
     [\@@implaats][\woordinlinker][\woordinrechter]}

%I n=Paginanummer
%I c=\stelpaginanummerin,\stelsubpaginanummerin
%I
%I Het paginanummer kan worden ingesteld met het commando:
%I
%I   \stelpaginanummerin[nummer=,status=]
%I
%I Het nummeren kan gedurende een of meerdere pagina's worden
%I stilgezet door in plaats van een nummer start, stop of
%I handhaaf mee te geven.
%I
%I Het paginanummer is oproepbaar met:
%I
%I   \paginanummer
%I
%I en het totaal aantal paginanummers met:
%I
%I   \totaalaantalpaginas
%P
%I Er zijn subnummers beschikbaar. De wijze van nummeren
%I wordt ingesteld met:
%I
%I   \stelsubpaginanummerin[wijze=,status=]
%I
%I De status kan 'stop', 'start' of 'geen' zijn. In het
%I laatste geval wordt gewoon doorgenummerd, maar wordt het
%I nummer niet geplaatst.
%I
%I Standaard wordt 'perdeel' genummerd. De subnummers zijn
%I oproepbaar met:
%I
%I    \subpaginanummer
%I    \aantalsubpaginas

% Standaard is \count0 in Plain TeX de paginateller. Omwille
% van de afhandeling van lokaal nummeren, definieren we
% echter een eigen nummer.

\definieernummer
  [\s!page]
  [\c!conversie=\@@nmconversie,
   \c!wijze=\@@nmwijze,
   \c!status=\@@nmstatus,
   \c!start=1]

\def\dostelpaginanummerin[#1]%
  {\getparameters
     [\??pn]
     [\c!status=\v!start,
      #1]%
   \doifinstringelse{\c!nummer}{#1}
     {\setnummer[\s!page]{\@@pnnummer}%
      \setuserpageno{\ruwenummer[\s!page]}}%
     {}}

\def\stelpaginanummerin%
  {\dosingleargument\dostelpaginanummerin}

\def\verlaagpaginanummer%
  {\doif{\@@pnstatus}{\v!start}
     {\verlaagnummer[\s!page]%
      \setuserpageno{\ruwenummer[\s!page]}}}

\def\verhoogpaginanummer%
  {\processaction
     [\@@pnstatus]
     [    \v!start=>{\verhoognummer[\s!page]%
                     \setuserpageno{\ruwenummer[\s!page]}},
       \v!handhaaf=>{\doassign[\??pn][\c!status=\v!start]}]}

\def\checkpagecounter%
  {\checknummer{\s!page}}

%I n=Pagina
%I c=\pagina
%I
%I Het volgende commando kan worden gebruikt om pagina's af
%I te dwingen of blokkeren:
%I
%I   \pagina[instelling]
%I
%I Waarbij als instelling kan worden gegeven:
%I
%I   ja             een geforceerde paginaovergang met \vfill
%I   opmaak         een geforceerde paginaovergang zonder \vfill
%I   nee            bij voorkeur geen paginaovergang
%I   voorkeur       bij voorkeur de paginaovergang hier (3)
%I   grotevoorkeur  bij voorkeur de paginaovergang hier (7)
%I   links          ga naar een linker pagina
%I   rechts         ga naar een rechter pagina
%I   leeg           een lege pagina
%I   blokkeer       blokkeer ja ... grotevoorkeur (1 pagina)
%I   reset          het blokkering ja ... grotevoorkeur op
%I
%I Als geen instelling wordt meegegeven (\pagina), wordt een
%I overgang geforceerd. Als een nummer wordt meegegeven, wordt
%I naar de opgegeven pagina gegaan.

\newif\ifpaginageblokkeerd
\paginageblokkeerdfalse

\def\testpagina[#1][#2]%
  {\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
       \fi
     \else
       \goodbreak
     \fi
   \fi}

\let\resetcurrentsectionmarks=\relax

% was: \resetsectionmarks[\firstsection], zie \handelpaginaaf

\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]}

\definecomplexorsimple\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]}

% THIS: !!!

\def\dolimitateteksten#1#2%
  {\doifelsevaluenothing{#1}{#2}{\limitatetext{#2}{\getvalue{#1}}{...}}}

\def\doteksten#1#2#3#4#5#6%
  {\bgroup
  %\showcomposition % I need to test first 
   \convertargument#6\to\ascii
   \doifsomething{\ascii}
     {\doattributes{#1#2}#3#4%
        {\doifvalue{#1\v!tekst\c!strut}{\v!ja}{\setstrut\strut}% here!
         \doifdefinedelse{\??mk\ascii\c!koppeling} % brrr
           {\dolimitateteksten{#1#2#5}{\haalmarkering[\ascii][\v!eerste]}}
           {\ConvertConstantAfter\doifelse{\v!paginanummer}{#6}
              {\@@plaatspaginanummer}
              {\ConvertConstantAfter\doifelse{\v!datum}{#6}
                 {\currentdate}
                 {\opeenregel\dolimitateteksten{#1#2#5}{#6}}}}}}%
  \egroup}

\def\dodoteksten#1#2#3#4#5#6%
  {\doifonevenpaginaelse
     {\doteksten{#1}{#2}#3{#4}}  % #3 => provides three arguments 
     {\doteksten{#1}{#2}#5{#6}}} % #5 => provides three arguments 

\def\dodododoteksten[#1][#2][#3][#4][#5][#6]%
  {\ifsixthargument
     \setvalue{\??tk#1#2\c!linkertekst}%
       {\dodoteksten{\??tk#1}{#2}
          {\c!linkerletter \c!linkerkleur \c!linkerbreedte }{#3}
          {\c!rechterletter\c!rechterkleur\c!rechterbreedte}{#6}}%
     \setvalue{\??tk#1#2\c!rechtertekst}%
       {\dodoteksten{\??tk#1}{#2}
          {\c!rechterletter\c!rechterkleur\c!rechterbreedte}{#4}
          {\c!linkerletter \c!linkerkleur \c!linkerbreedte }{#5}}%
   \else\iffifthargument
     \setvalue{\??tk#1\v!tekst\c!linkertekst}%
       {\dodoteksten{\??tk#1}{\v!tekst}
          {\c!linkerletter \c!linkerkleur \c!linkerbreedte }{#2}
          {\c!rechterletter\c!rechterkleur\c!rechterbreedte}{#5}}%
     \setvalue{\??tk#1\v!tekst\c!rechtertekst}%
       {\dodoteksten{\??tk#1}{\v!tekst}
          {\c!rechterletter\c!rechterkleur\c!rechterbreedte}{#3}
          {\c!linkerletter \c!linkerkleur \c!linkerbreedte }{#4}}%
   \else\iffourthargument
     \setvalue{\??tk#1#2\c!linkertekst}%
       {\dodoteksten{\??tk#1}{#2}
          {\c!linkerletter\c!linkerkleur\c!linkerbreedte}{#3}
          {\c!linkerletter\c!linkerkleur\c!linkerbreedte}{#3}}%
     \setvalue{\??tk#1#2\c!rechtertekst}%
       {\dodoteksten{\??tk#1}{#2}
          {\c!rechterletter\c!rechterkleur\c!rechterbreedte}{#4}
          {\c!rechterletter\c!rechterkleur\c!rechterbreedte}{#4}}%
   \else\ifthirdargument
     \setvalue{\??tk#1\v!tekst\c!linkertekst}%
       {\dodoteksten{\??tk#1}{\v!tekst}
          {\c!linkerletter\c!linkerkleur\c!linkerbreedte}{#2}
          {\c!linkerletter\c!linkerkleur\c!linkerbreedte}{#2}}%
     \setvalue{\??tk#1\v!tekst\c!rechtertekst}%
       {\dodoteksten{\??tk#1}{\v!tekst}
          {\c!rechterletter\c!rechterkleur\c!rechterbreedte}{#3}
          {\c!rechterletter\c!rechterkleur\c!rechterbreedte}{#3}}%
   \else\ifsecondargument % new  
     \setvalue{\??tk#1\v!tekst\c!linkertekst}{}%
     \setvalue{\??tk#1\v!tekst\c!rechtertekst}{}%
     \setvalue{\??tk#1\v!tekst\c!middentekst}%
       {\doteksten{\??tk#1}{\v!tekst}\c!letter\c!kleur\c!breedte{#2}}%
   \else
     \dosixtupleempty\dodododoteksten[#1][\v!tekst][][][][]%
     \dosixtupleempty\dodododoteksten[#1][\v!marge][][][][]%
     \dosixtupleempty\dodododoteksten[#1][\v!rand] [][][][]%
   \fi\fi\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\@@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\definieertekst%
  {\dosixtupleempty\dodefinieertekst}

\def\dodefinieertekst[#1][#2][#3][#4][#5][#6]%
  {\ifsixthargument
     \setvalue{\??tk#2#1}{\dosixtupleempty\dodododoteksten[#2][#3][#4][#5][#6]}% 
   \else\iffourthargument
     \setvalue{\??tk#2#1}{\dosixtupleempty\dodododoteksten[#2][#3][#4]}% 
   \else
     \setvalue{\??tk#2#1}{\dosixtupleempty\dodododoteksten[#2][#3]}% 
   \fi\fi}

% \definieertekst[hoofdstuk][voet][paginanummer]
% \stelkopin[hoofdstuk][hoofd=hoog,voet=hoofdstuk]
% \stelhoofdtekstenin[paginanummer]
% \stelvoettekstenin[links][rechts]
% \hoofdstuk{eerste} \dorecurse{20}{\input tufte \relax}
% \hoofdstuk{tweede} \dorecurse{20}{\input tufte \relax}

\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=>\bgroup % new 
                       \setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}%
                       \getvalue{\??tk#1\commalistelement}%
                       \doplaatslayoutregel{#1}{#2}%
                       \egroup]}

\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-\bovenhoogte
\plaatsboventekstblok
      \vskip\bovenafstand
      \plaatshoofdregel
      \vskip\hoofdafstand
      \plaatstekstregel
      \vskip\voetafstand
      \plaatsvoetregel
      \vskip\onderafstand
      \plaatsonderregel
\vskip-\onderhoogte
\plaatsondertekstblok
      \plaatsversieaanduiding
      \vfilll}%
  \smashbox0
  \box0
  \egroup}

%\def\@@plaatspaginascheider%
%  {\doif{\@@nmstatus}{\v!start}%
%     {\@@nmtekstscheider}}

\def\@@nmin     {} % kan vervallen  (upward compatibility)
\def\@@nmplaats {} % mag {plaats, in} zijn

\newcounter\@@pagenumberlocation

\def\do@@plaatspaginanummer#1%
  {\ifnum#1=\@@pagenumberlocation\@@plaatspaginanummer\fi}

\def\dodosetpagenumberlocation#1% tricky because of ...texts
  {\increment\@@pagenumberlocation
   \ifx\@@nmplaats\empty\else
     \def\dododosetpagenumberlocation##1%
       {\donetrue
        \setevalue{\??tk#1##1}%
          {\noexpand\do@@plaatspaginanummer{\@@pagenumberlocation}}}%
     \donefalse
     \ExpandFirstAfter\processallactionsinset
       [\@@nmplaats]
       [    \v!midden=>\dododosetpagenumberlocation{\v!tekst\c!middentekst},
             \v!links=>\dododosetpagenumberlocation{\v!tekst\c!linkertekst},
            \v!rechts=>\dododosetpagenumberlocation{\v!tekst\c!rechtertekst},
          \v!inlinker=>\dododosetpagenumberlocation{\v!marge\c!linkertekst},
         \v!inrechter=>\dododosetpagenumberlocation{\v!marge\c!rechtertekst},
           \v!inmarge=>\dododosetpagenumberlocation{\v!marge\ifdubbelzijdig
                         \c!margetekst\else\c!rechtertekst\fi},
             \v!marge=>\dododosetpagenumberlocation{\v!marge\ifdubbelzijdig
                         \c!margetekst\else\c!rechtertekst\fi},
           \v!opmarge=>\dododosetpagenumberlocation{\v!tekst\c!kantlijntekst},
          \v!kantlijn=>\dododosetpagenumberlocation{\v!tekst\c!kantlijntekst}]%
     \ifdone \else
       \dododosetpagenumberlocation{\v!tekst\c!middentekst}% default 
     \fi
   \fi}

\def\dosetpagenumberlocation%
  {\ExpandBothAfter\doifinsetelse{\v!hoofd}{\@@nmplaats,\@@nmin}
     {\dodosetpagenumberlocation\v!hoofd}
     {\dodosetpagenumberlocation\v!voet}}

\def\dostelnummeringin[#1]%
  {\getparameters[\??nm][#1]%
   \preparepaginaprefix{\??nm}%
   \enkelzijdigfalse
   \dubbelzijdigfalse
   \ExpandFirstAfter\processallactionsinset
     [\@@nmvariant]
     [ \v!enkelzijdig=>\enkelzijdigtrue,
      \v!dubbelzijdig=>\dubbelzijdigtrue]%
   \ifdubbelzijdig
     \trackingmarginnotestrue
   \else
     \trackingmarginnotesfalse
   \fi
   \dosetpagenumberlocation
   \global\newbackgroundtrue
   \global\newlogostrue}

\def\stelnummeringin%
  {\dosingleempty\dostelnummeringin}

% listig: hangt af van \@@kolijst

% erg fout
%
% \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\preparepaginaprefix#1%
  {\def\dopreparepaginaprefix##1%
     {\doifelsevalue{#1##1\v!nummer}{\v!ja}                    % v
        {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!ja}}     % v
        {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!nee}}}%  % v
   \processcommacommand[\@@kolijst]\dopreparepaginaprefix}

\def\dopaginaprefix#1#2%
  {\doifelsevalue{#1#2\v!nummer}{\v!ja}                        % v
     {\@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}

\unexpanded\def\@@plaatspaginanummer% called in empty tests 
  {\doif{\@@nmstatus}{\v!start}%
     {{\@@nmcommando{\doattributes\??nm\c!letter\c!kleur{\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\v!nummer}{\v!ja}  % v
        {\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.

% voor 'interne' doeleinden zijn beschikbaar:
%
%   \fetchmark[naam][plaats]

% nog expansie in hoofdmarkering

% ook nog reset koppelen aan sectie

\def\hoofdmarkering#1%
  {\getvalue{\??mk#1\c!koppeling}}

\def\dodoresetmarkering#1%
  {\doifdefined{\??mk\hoofdmarkering{#1}}
     {\expandafter\resetmark\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}

\letvalue{\??mk \v!vorige}\gettopmark
\letvalue{\??mk \v!eerste}\getfirstmark
\letvalue{\??mk\v!laatste}\getbotmark

\def\dododefinieermarkering[#1][#2]%
  {\stelmarkeringin[#1]
     [% \c!expansie=\v!nee,  % saves a macro
        \c!scheider={ --- }, % watch the spaces 
          \c!status=\v!start]%
   \ontkoppelmarkering[#1]%  % no coupling with sections
   \setevalue{\??mk#1\c!koppeling}{#2}%
   \expandafter\newmark\csname\??mk#2\endcsname
   \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\fetchmark[#1][#2]% geen \def, anders problemen in \doif...
%   {\def\dofetchmark{\getvalue{\??mk#2}}%
%    \expandafter\dofetchmark\csname\??mk\hoofdmarkering{#1}\endcsname}

\def\dofetchmark#1#2% needed because we need to expand
  {\getvalue{\??mk#2}#1}

\def\fetchmark[#1][#2]% never \unexpanded
 %{\getvalue{\getvalue{\??mk#2}\??mk\hoofdmarkering{#1}}}
  {\expandafter\dofetchmark\csname\??mk\hoofdmarkering{#1}\endcsname{#2}}

\def\fetchtwomarks[#1]%
  {\doifsomething{\fetchmark[#1][\v!eerste]}
     {\fetchmark[#1][\v!eerste]%
      \doifsomething{\fetchmark[#1][\v!laatste]}
        {\doifnot{\fetchmark[#1][\v!eerste]}{\fetchmark[#1][\v!laatste]}
            {\getvalue{\??mk#1\c!scheider}\fetchmark[#1][\v!laatste]}}}}

\def\fetchallmarks[#1]%
  {\doifsomething{\fetchmark[#1][\v!eerste]}
     {\doifsomething{\fetchmark[#1][\v!vorige]}
        {\doifnot{\fetchmark[#1][\v!vorige]}{\fetchmark[#1][\v!eerste]}
           {\fetchmark[#1][\v!vorige]\getvalue{\??mk#1\c!scheider}}}}%
      \fetchtwomarks[#1]}

\def\dohaalmarkering[#1][#2]%
  {\doifvalue{\??mk#1\c!status}{\v!start}
     {\bgroup
      \def\geenmarkering##1{\onbekend\ }%
      \processaction
        [#2]
        [  \v!beide=>{\fetchtwomarks[#1]},
           \v!alles=>{\fetchallmarks[#1]},
         \s!default=>{\fetchmark[#1][\v!eerste]}, 
         \s!unknown=>{\fetchmark[#1][#2]}]%
      \egroup}}

\def\nohaalmarkering[#1][#2]%
  {}

\unexpanded\def\haalmarkering%
  {\dodoubleargument\dohaalmarkering}

\def\domarking[#1]#2%
  {\bgroup
   \doifelsevalue{\??mk#1\c!expansie}{\v!ja}
     {\expandmarkstrue}
     {\expandmarksfalse}%
%   \getvalue{\??mk\hoofdmarkering{#1}}{#2}%
   \expandafter\setmark\csname\??mk\hoofdmarkering{#1}\endcsname{#2}%
   \egroup}

\def\marking%
  {\dosingleargument\domarking}

%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{}
\let\@@sectie\empty
\let\@@koppeling\empty

\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!vorigenummer}{\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{\zerosection}}} % \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!vorigenummer=\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}}}

\def\@@sectionlevel#1%
  {\ifundefined{\??se#1\c!niveau}0\else\getvalue{\??se#1\c!niveau}\fi}

% Omdat een markering kan worden herdefinieerd moeten we
% eerst testen of er wel een keten||afhankelijkheid is.

\def\resetsectionmarks[#1]%
  {\doifdefinedelse{\??se#1}
     {\def\donexttrackcommando##1%
        {\doifdefined{\??se##1\c!markering} % skip zero level
           {\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

% evt ook level gaan opslaan tbv snelle selectie

\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% opvoeren met \ifcsname
  {\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[\zerosection]% was firstsection
   \resetsectionmarks[\zerosection]}

\def\dostartsectieblok#1#2%
  {\begingroup
   \doaroundsectieblok{#1}%
   \dosetlocalsectieblok{#1}{#2}%
   \expandafter\csname#2true\endcsname % vervangen door mode
   \enablemode[#1]%
   \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}]}}%
      \doifinset{\getvalue{\??tk\v!voet\v!tekst\c!status}}{\v!normaal,\v!start}
        {\doifvaluesomething{\??ko#1\c!voet} % new 
           {\stelvoetin[\c!status=\getvalue{\??ko#1\c!voet}]}}}}

\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\handelpaginaafC#1%
  {\xdef\@@koniveau{\getvalue{\??se\@@sectie\c!niveau}}%
   \nobreak}

\def\dolocalkopsetup#1%  koppeling met standaard kopcommando / engels
  {\forgetall
   \doifvaluesomething{\??ko#1\c!uitlijnen} % can be embedded in \framed etc 
     {\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\dodosomekop#1[#2]#3%
  {\doifelsevalue{\??ko#1\c!eigennummer}{\v!ja}
     {\def\next{\doquadruplegroupempty\dododosomekop{#1}{#2}{#3}}}
     {\def\next{\fourthargumentfalse\dododosomekop{#1}{#2}{#3}{}}}%
   \next}

\def\finalsectionnumber%
  {\ifundefined{\@@sectie\c!nummer}\else
     \getvalue{\@@sectie\c!nummer}%
   \fi}

\def\dododosomekop#1#2#3#4%
  {\iffourthargument
     \def\next%
       {\dodododosomekop{#1}[#2]{\sectiebloklabel{#1}}{#3}{#4}}%
   \else
     \def\next%
       {\dodododosomekop{#1}[#2]{\sectiebloklabel{#1}}{\finalsectionnumber}{#3}}%
   \fi
   \next}

\def\findsectionnumber#1#2#3% class file title
  {\begingroup
   \setsectieenkoppeling{#1}%
   \xdef\foundsectionnumber{1}%
   \def\dolijstelement##1##2##3##4##5##6%
     {\doif{##1}{#1}
        {\ConvertConstantAfter\doif{##4}{#3}
           {\global\utilitydonetrue
            \scratchcounter=0\getvalue{\??se\@@sectie\c!niveau}%
            \advance\scratchcounter by 2
            \def\do####1:####2]%
              {\advance\scratchcounter by -1
               \ifcase\scratchcounter
                 \xdef\foundsectionnumber{####1}%
               \else
                 \do####2]%
               \fi}%
            \do##5]}}}%
   \setbox0=\vbox
     {\doutilities{#1}{#2}{#1}{}{}}%
   \endgroup
   \doifnumberelse{\foundsectionnumber}
     {\doif{\foundsectionnumber}{0}{\xdef\foundsectionnumber{1}}}
     {\xdef\foundsectionnumber{1}}% an appendix or so
   \stelkopnummerin[#1][\foundsectionnumber]%
   \stelkopnummerin[#1][-1]}

\def\dodododosomekop#1[#2]#3#4#5% % pas met \ExpandFirstAfter op bij twee||taligheid
  {\flushingcolumnfloatsfalse
   \setsectieenkoppeling{#1}%
   \doifelsevalue{\??ko#1\c!prefix}{}
     {\kopprefixfalse}
     {\kopprefixtrue}%
   \ifkopprefix
     \doifelsevalue{\??ko#1\c!prefix}{+}
       {\doifelsenothing{#2}
          {\def\localkopprefix{+}}
          {\def\localkopprefix{#2}}}
       {\edef\localkoprefix{\getvalue{\??ko#1\c!prefix}}}%
   \fi
   \doifelsevalue{\??ko#1\c!plaatskop}{\v!ja}
     {\plaatskoptrue}
     {\plaatskopfalse}%
  %\doifelsevalue{\??ko#1\c!verhoognummer}{\v!ja}
  %  {\verhoognummertrue}
  %  {\verhoognummerfalse}%
   \processaction
     [\getvalue{\??ko#1\c!verhoognummer}]
     [     \v!ja=>\verhoognummertrue,
          \v!nee=>\verhoognummerfalse,
      \s!unknown=>{\ifx\currentproduct\empty
                     \findsectionnumber{#1}\commalistelement{#5}%
                   \fi
                   \verhoognummertrue}]%
   \edef\numberheaddistance   {\getvalue{\??ko#1\c!afstand}}%
   \edef\numberheadalternative{\getvalue{\??ko#1\c!variant}}%
   \dostelkopvariantin[\numberheadalternative]%
   \ifsectienummer
     \doifelsevalue{\??sb\@@sectieblok\c!nummer}{\v!ja}
       {\doifelsevalue{\??ko#1\c!nummer}{\v!ja}
          {\kopnummertrue}{\kopnummerfalse}}
       {\kopnummerfalse}%
   \else
     \kopnummerfalse
   \fi
  %\convertargument#5\to\asciititle
   \processaction
     [\getvalue{\??ko#1\c!expansie}]
     [       \v!ja=>{\edef\asciititle{#5}},
       \v!commando=>{\convertcommand#5\to\asciititle},
        \s!default=>{\convertargument#5\to\asciititle},
        \s!unknown=>{\convertargument#5\to\asciititle}]%
   \ifverhoognummer
     \ifplaatskop
       \checknexthead\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
         \doplaatskopnummertekst
           {#1}
           {\setsectionlistreference{\@@sectie}{#1}%
            \ExpandFirstAfter\soortpagina[\@@koppeling]%
%            \rawreference{\s!sec}{#2}{#4}%
\rawreference{\s!sec}{#2}{{#4}{\asciititle}}%
            \resetsectionmarks[\@@sectie]%
\stellijstin[\@@koppeling][\c!expansie=\getvalue{\??ko#1\c!expansie}]%
            \doschrijfnaarlijst{\@@koppeling}{#4}{#5}{\v!kop}}
           {#3#4}
           {#5}
           {\marking[#1]{#5}% 
            \bepaalkopnummer[#1]%
            \expanded{\marking[#1\v!nummer]{\finalsectionnumber}}}%
         \writesection{#1}{#4}{#5}%
       \else
         \doplaatskoptekst
           {#1}
           {\setsectionlistreference{\@@sectie}{#1}%
            \ExpandFirstAfter\soortpagina[\@@koppeling]%
%            \rawpagereference{\s!sec}{#2}%
\rawreference{\s!sec}{#2}{{#4}{\asciititle}}%
            \resetsectionmarks[\@@sectie]%
\stellijstin[\@@koppeling][\c!expansie=\getvalue{\??ko#1\c!expansie}]%
            \doschrijfnaarlijst{\@@koppeling}{}{#5}{\v!kop}}
           {#5}
           {\marking[#1]{#5}% 
            \bepaalkopnummer[#1]%
            \expanded{\marking[#1\v!nummer]{\finalsectionnumber}}}%
         \writesection{#1}{-}{#5}%
       \fi
       \ifkopprefix
         \ExpandFirstAfter\setupreferencing[\c!prefix=\localkopprefix]%
       \fi
       \dosomebreak\nobreak
       \ifdisplaysectionhead\getvalue{\??ko#1\c!na}\fi
     \else
       \checknexthead\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]%
       \marking[#1]{#5}%
       \bepaalkopnummer[#1]%
       \expanded{\marking[#1\v!nummer]{\finalsectionnumber}}%
       \ExpandFirstAfter\soortpagina[\@@koppeling]%
\bgroup
\stellijstin[\@@koppeling][\c!expansie=\getvalue{\??ko#1\c!expansie}]%
       \ifkopnummer
%         \rawreference{\s!sec}{#2}{#4}%
\rawreference{\s!sec}{#2}{{#4}{\asciititle}}%
         \doschrijfnaarlijst{\@@koppeling}{#4}{#5}{\v!kop}%
         \writesection{#1}{#4}{#5}%
       \else
%         \rawpagereference{\s!sec}{#2}%
\rawreference{\s!sec}{#2}{{#4}{\asciititle}}%
         \doschrijfnaarlijst{\@@koppeling}{}{#5}{\v!kop}%
         \writesection{#1}{-}{#5}%
       \fi
\egroup
       \ifkopprefix
         \ExpandFirstAfter\setupreferencing[\c!prefix=\localkopprefix]%
       \fi
     \fi
   \else
     \ifplaatskop
       \checknexthead\handelpaginaaf{#1}%
       \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
       \getvalue{\??ko#1\c!tussen}%
       \doplaatskoptekst
         {#1}
%         {\rawpagereference{\s!sec}{#2}}
{\rawreference{\s!sec}{#2}{#4{}{\asciititle}}}
         {#5}
         {}%
       \writesection{#1}{-}{#5}%
       \dosomebreak\nobreak
       \ifdisplaysectionhead\getvalue{\??ko#1\c!na}\fi
     \else
       % do nothing
     \fi
   \fi
   \flushingcolumnfloatstrue
   \ifdisplaysectionhead\else\expandafter\GotoPar\fi}

% \prevdepth\dp\strutbox is belangrijk, vergelijk naast elkaar:
%
% \onderwerp{test} \input tufte
% \onderwerp{test} \strut \input tufte
% \onderwerp{test} \plaatslijst[...]

% \def\doplaatskoptekst#1#2#3#4%
%   {\bgroup
%    \forgetall
%    %\showcomposition
%    \mindermeldingen
%    \postponefootnotes
%    \def\localkopsetup%
%      {\dolocalkopsetup{#1}}%
%    \startsynchronisatie
%    \ifdisplaysectionhead\@EA\snaptogrid\@EA\hbox\fi
%      {\getvalue{\??ko#1\c!commando}
%         {} % no number
%         {\doattributes
%            {\??ko#1}\c!letter\c!kleur
%            {\doattributes
%               {\??ko#1}\c!tekstletter\c!tekstkleur
%               {\dontconvertfont
%                \ifdisplaysectionhead\stelinterliniein\fi
%                #2%
%                \getvalue{\??ko#1\c!voorcommando}%
%                \getvalue{\??ko#1\c!tekstcommando}{\setstrut\begstrut#3\endstrut}%
%                \getvalue{\??ko#1\c!nacommando}%
%                \ifdisplaysectionhead\endgraf\fi}}}}%
%    \ifdisplaysectionhead
%      \endgraf
%      \nointerlineskip
%      \dosomebreak\nobreak
%    \fi
%    #4%
%    \ifdisplaysectionhead
%      \prevdepth\openstrutdepth % \dp\strutbox % ivm grid
%    \fi
%    \stopsynchronisatie
%    \egroup
%    \doifvalue{\??ko#1\c!springvolgendein}{\v!nee}{\noindentation}}
% 
% \def\doplaatskopnummertekst#1#2#3#4#5%
%   {\bgroup
%    \forgetall
%   %\showcomposition
%    \mindermeldingen
%    \postponefootnotes
%    \def\localkopsetup%
%      {\dolocalkopsetup{#1}}%
%    \startsynchronisatie
%    \ifdisplaysectionhead\@EA\snaptogrid\@EA\hbox\fi
%      {\getvalue{\??ko#1\c!commando}%
%         {\doattributes{\??ko#1}\c!letter\c!kleur
%            {\doattributes{\??ko#1}\c!nummerletter\c!nummerkleur
%               {\getvalue{\??ko#1\c!voorcommando}%
%                \getvalue{\??ko#1\c!nummercommando}{\setstrut\begstrut#3\endstrut}}}}
%         {\doattributes{\??ko#1}\c!letter\c!kleur
%            {\doattributes{\??ko#1}\c!tekstletter\c!tekstkleur
%               {\dontconvertfont
%                \ifdisplaysectionhead\stelinterliniein\fi
%                #2%
%                \getvalue{\??ko#1\c!tekstcommando}{\setstrut\begstrut#4\endstrut}%
%                \getvalue{\??ko#1\c!nacommando}%
%                \ifdisplaysectionhead\endgraf\fi}}}}%
%    \ifdisplaysectionhead
%      \endgraf
%      \nointerlineskip
%      \dosomebreak\nobreak
%    \fi
%    #5%
%    \ifdisplaysectionhead
%      \prevdepth\openstrutdepth % \dp\strutbox % important, see comment
%    \fi
%    \stopsynchronisatie
%    \egroup
%    \doifvalue{\??ko#1\c!springvolgendein}{\v!nee}{\noindentation}}

\def\doplaatskoptekst#1#2#3#4%
  {\beginheadplacement{#1}%
   \setbox0=\hbox
     {\getvalue{\??ko#1\c!commando}
        {} % no number
        {\doattributes
           {\??ko#1}\c!letter\c!kleur
           {\doattributes
              {\??ko#1}\c!tekstletter\c!tekstkleur
              {\dontconvertfont
               \ifdisplaysectionhead\stelinterliniein\fi
               #2%
               \getvalue{\??ko#1\c!voorcommando}%
               \getvalue{\??ko#1\c!tekstcommando}%
                 {\ifdisplaysectionhead
                    \setstrut\begstrut#3\endstrut
                  \else
                    #3%
                  \fi}%
               \getvalue{\??ko#1\c!nacommando}%
               \ifdisplaysectionhead\endgraf\fi}}}}%
   \endheadplacement{#1}{#4}}

\def\doplaatskopnummertekst#1#2#3#4#5%
  {\beginheadplacement{#1}%
   \setbox0=\hbox
     {\getvalue{\??ko#1\c!commando}%
        {\doattributes{\??ko#1}\c!letter\c!kleur
           {\doattributes{\??ko#1}\c!nummerletter\c!nummerkleur
              {\getvalue{\??ko#1\c!voorcommando}%
               \getvalue{\??ko#1\c!nummercommando}%
                 {\ifdisplaysectionhead
                    \setstrut\begstrut#3\endstrut
                  \else
                    #3%
                  \fi}}}}
        {\doattributes{\??ko#1}\c!letter\c!kleur
           {\doattributes{\??ko#1}\c!tekstletter\c!tekstkleur
              {\dontconvertfont
               \ifdisplaysectionhead\stelinterliniein\fi
               #2%
               \getvalue{\??ko#1\c!tekstcommando}%
                 {\ifdisplaysectionhead
                    \setstrut\begstrut#4\endstrut
                  \else
                    #4%
                  \fi}%
               \getvalue{\??ko#1\c!nacommando}%
               \ifdisplaysectionhead\endgraf\fi}}}}%
   \endheadplacement{#1}{#5}}

\newsignal\headsignal
\let\headlastlinewidth\!!zeropoint
\newif\ifcontinuoushead

\def\beginheadplacement#1%
  {\bgroup    
   \everypar{}% needed indeed
   \noindent  % ipv \witruimte elders, na \forgetall !
   \bgroup    
   \forgetall % now we may forget everything
  %\showcomposition
   \mindermeldingen
   \postponefootnotes
   \iflocation\ifdisplaysectionhead\else\noninterferingmarks\fi\fi
   \stelinteractiein
     [\c!letter=,
      \c!kleur=,
      \c!contrastkleur=]%
   \strictouterreferencestrue % tzt instelling 
   \def\localkopsetup%
     {\dolocalkopsetup{#1}}%
   \startsynchronisatie}

\def\endheadplacement#1#2%
  {\doifvaluenothing{\??ko#1\c!file}{\locationfalse}%
   \ifdisplaysectionhead
     \let\headlastlinewidth\!!zeropoint
     \snaptogrid\hbox
       {\iflocation
          \naarbox{\box0}[\getvalue{\??ko#1\c!file}::#1]%
        \else
          \hbox{\box0}%
        \fi}%
     \endgraf
     \nointerlineskip
     \dosomebreak\nobreak
     #2%
   \else
     \strut
     \iflocation
       \hhboxindent=\ifcontinuoushead\headlastlinewidth\else\!!zeropoint\fi
       \unhhbox0\with{\naarbox{\box\hhbox}[\getvalue{\??ko#1\c!file}::#1]}%
       \advance\lasthhboxwidth by \numberheaddistance
       \xdef\headlastlinewidth{\the\lasthhboxwidth}% 
     \else
       \unhbox0
       \global\let\headlastlinewidth\!!zeropoint
     \fi
     #2%
     \dimen0=\numberheaddistance  
     \hskip\dimen0 \!!plus \dimen0 \!!minus .25\dimen0
     \hskip\headsignal\ignorespaces
   \fi
  %#2%
   \ifdisplaysectionhead
     \prevdepth\openstrutdepth % \dp\strutbox % important, see comment
   \fi
   \stopsynchronisatie
   \egroup
   \egroup
   \ifdisplaysectionhead
     \doifvalue{\??ko#1\c!springvolgendein}{\v!nee}{\noindentation}%
   \fi}

\def\checknexthead#1#2% nog optioneel
  {\ifhmode
     \scratchcounter=\lastpenalty\unpenalty % no beauty in this
     \ifdim\lastskip=\headsignal 
       \handelpaginaafC{#1}%
       \global\continuousheadtrue
     \else
       \penalty\scratchcounter
       \global\continuousheadfalse
       #1{#2}%
     \fi
   \else
     \global\continuousheadfalse
     #1{#2}%
   \fi}

\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{\finalsectionnumber}{0} % kan effienter
%      {\finalsectionnumber}%
%    \egroup}
%
% beter :

\def\huidigekopnummer{0}

\def\bepaalkopnummer[#1]%
  {\bgroup
   \setsectieenkoppeling{#1}%
   \xdef\huidigekopnummer{\@@sectionvalue{\@@sectie}}%
   \egroup}

\def\complexkopnummer[#1]%
  {\bgroup
   \setsectieenkoppeling{#1}%
   \xdef\huidigekopnummer{\@@sectionvalue{\@@sectie}}%
   \doifnot{\huidigekopnummer}{0}
     {\finalsectionnumber}%
   \egroup}

\def\simplekopnummer%
  {\huidigekopnummer}

\definecomplexorsimple\kopnummer

\def\alinea%
  {\par}

\def\plaatskopnormaal#1#2%
  {\doifelsenothing{#1}
     {\vbox
        {\localkopsetup
         \noindent
         #2}}%
     {\setbox0=\hbox{{#1}\hskip\numberheaddistance}%
      \vbox
        {\localkopsetup
         \hangindent 1\wd0
         \hangafter 1
         \noindent
         \unhbox0    %  don't use \strut's here!
         #2}}}

\def\plaatskopinmarge#1#2%
  {\vbox
     {\localkopsetup
      \begstrut            % but use one \strut here!
      \doifsomething{#1}
        {\llap{\hbox to 5em{\hfill{#1}\hskip\linkermargeafstand}}}%
      {#2}}}

\def\plaatskopmidden#1#2%
  {\vbox
     {\localkopsetup
      \veryraggedcenter
      \let\\\endgraf
      \let\crlf\endgraf
      \doifsomething{#1}{\strut#1\par}\begstrut#2}}

\def\plaatskopintekst#1#2%
  {\bgroup
   \localkopsetup
   \doifsomething{#1}{{#1}\kern\numberheaddistance}% no stretch 
   {\begstrut#2}%
  %\hskip\numberheaddistance % naar elders 
   \egroup}

% default   == instellingen
% koppeling == koppen, breaks, marks, enz.
% sectie    == nummering

\let\@@kolijst=\empty

\def\dodefinieerkop[#1][#2]%   % don't preset prefix to much
  {\presetlabeltext[#1=]%
   \getparameters
     [\??ko#1]
     [\c!nummerletter=\getvalue{\??ko#1\c!letter},
      \c!tekstletter=\getvalue{\??ko#1\c!letter},
      \c!nummerkleur=\getvalue{\??ko#1\c!kleur},
      \c!tekstkleur=\getvalue{\??ko#1\c!kleur}]%
   \ConvertToConstant\doifinstringelse{=}{#2}
     {\getparameters
        [\??ko#1]
        [\c!sectie=\getvalue{\??ko\getvalue{\??ko#1\c!koppeling}\c!sectie},
         \c!default=,
         \c!koppeling=,
         \c!prefix=,
         \c!voor=,
         \c!na=,
         \c!afstand=,
         \c!pagina=,
         \c!hoofd=,
         \c!voet=,
         \c!letter=,
         \c!nummercommando=,
         \c!tekstcommando=,
         \c!eigennummer=\v!nee,
         \c!nummer=\v!ja,
         \c!kleur=,
         \c!springvolgendein=\v!nee,
         \c!doorgaan=\v!ja,
         \c!plaatskop=\v!ja,
         \c!verhoognummer=\v!ja,
         \c!variant=\@@kovariant,
         \c!commando=\@@plaatskop,
         \c!uitlijnen=, 
         \c!file=,
         \c!expansie=,
         #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!file,\c!pagina,\c!doorgaan,\c!hoofd,\c!voet,
               \c!nummer,\c!eigennummer,\c!plaatskop,\c!verhoognummer,
               \c!letter,\c!kleur,\c!afstand,\c!variant,\c!springvolgendein,
              %\c!nummerletter,\c!tekstletter,
              %\c!expansie, % njet 
               \c!uitlijnen,\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!file,\c!pagina,\c!doorgaan,\c!hoofd,\c!voet,
            \c!nummer,\c!eigennummer,\c!plaatskop,\c!verhoognummer,
            \c!letter,\c!kleur,\c!afstand,\c!variant,\c!springvolgendein,
           %\c!nummerletter,\c!tekstletter,
           %\c!expansie, % njet 
            \c!uitlijnen,\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}%
     {\dodoubleempty\dosomekop[#1]}}

\def\definieerkop%
  {\dodoubleemptywithset\dodefinieerkop}

\def\dosomekop[#1][#2]%
  {\dowithpargument{\dodosomekop{#1}[#2]}}

\def\dostelkopin[#1][#2]%
  {\getparameters[\??ko#1][#2]%
   % The next check prevents hard to trace problems. I once
   % set \c!commando to nothing and (quite natural) got the
   % wrong references etc. The whole bunch should be boxed!
   \expandafter\convertcommand\csname\??ko#1\c!commando\endcsname\to\ascii
   \doifnothing{\ascii}
     {\setvalue{\??ko#1\c!commando}{\@@plaatskop}}}

\def\stelkopin%
  {\dodoubleargumentwithset\dostelkopin}

\newif\ifsectienummer       \sectienummertrue
\newif\ifdisplaysectionhead \displaysectionheadtrue

\def\@@plaatskop{\plaatskopnormaal}

\def\dostelkopvariantin[#1]%
  {\displaysectionheadtrue
   \processaction
     [#1]
     [ \v!normaal=>\def\@@plaatskop{\plaatskopnormaal},
        \v!midden=>\def\@@plaatskop{\plaatskopmidden},
         \v!marge=>\def\@@plaatskop{\plaatskopinmarge},
       \v!inmarge=>\def\@@plaatskop{\plaatskopinmarge},
         \v!tekst=>\def\@@plaatskop{\plaatskopintekst}\displaysectionheadfalse,
       \s!unknown=>\def\@@plaatskop{\plaatskopnormaal}]}

\def\dostelkoppenin[#1]%
  {\getparameters[\??ko][#1]%
   \doifelse{\@@kosectienummer}{\v!ja}
     {\sectienummertrue}
     {\sectienummerfalse}%
   \dostelkopvariantin[\@@kovariant]}

\def\stelkoppenin%
  {\dosingleargument\dostelkoppenin}

\def\systemsuppliedchapter {\getvalue{\v!hoofdstuk}}
\def\systemsuppliedtitle   {\getvalue{\v!titel}}

% a left over 

\def\complexbijlage[#1]#2%
  {\pagina[\v!rechts]
   \stelnummeringin[\c!status=\v!stop]
   \systemsuppliedchapter[#1]{#2}
   \pagina[\v!rechts]
   \stelnummeringin[\c!status=\v!start]
   \stelpaginanummerin[\c!nummer=1]}

\setvalue{\v!bijlage}%
  {\complexorsimpleempty\bijlage}

%I n=Selecteren
%I c=\soortpagina,\verwerkpagina,\koppelpagina
%I
%I Het is mogelijk pagina's te markeren en selectief te
%I verwerken. Markering vindt plaats met het commando:
%I
%I   \soortpagina[aanduiding]
%I
%I en selecteren vindt plaats met:
%I
%I   \verwerkpagina[aanduiding,...][instelling]
%I
%I waarbij de instelling 'ja' of 'nee' is en meerdere
%I aanduidingen worden gescheiden door een comma.
%P
%I Er kunnen commando's worden gekoppeld aan pagina's:
%I
%I   \koppelpagina[aanduiding,...][voor=,na=,optie=]
%I
%I De opgegeven commando's worden voor respectievelijk na het
%I vrijgeven van de pagina uitgevoerd.

% hier nog uti blokkeren

\newif\ifgeselecteerd
\geselecteerdtrue

\newif\ifselecteren
\selecterenfalse

\newif\ifverwerken
\verwerkentrue

\def\selectie{}
\def\paginasoort{}

\let\naastpagina=\relax
\let\napagina=\relax
\let\voorpagina=\relax

\def\dovoorpagina%
  {\doifsomething{\paginasoort}
     {\def\dododopagina##1%
        {\global\let\voorpagina=\relax
         \getvalue{\??pg##1\c!voor}}%
      \processcommacommand[\paginasoort]\dododopagina}}

\def\dododonapagina#1%
  {\global\let\napagina=\relax
   \gdef\paginasoort{}%
   \getvalue{\??pg#1\c!na}}

\def\donapagina%
  {\doifsomething{\paginasoort}
     {\def\dodopagina##1%
        {\doifelsevalue{\??pg##1\c!optie}{\v!dubbelzijdig}
           {\doifbothsidesoverruled
              \dododonapagina{##1}%
            \orsideone
              \dododonapagina{##1}%
            \orsidetwo
            \od}%
           {\dododonapagina{##1}}}%
      \processcommacommand[\paginasoort]\dodopagina}}

\def\dosoortpagina[#1]%
  {\doglobal\addtocommalist{#1}\paginasoort
   \ifselecteren
     \ExpandBothAfter\doifcommon{#1}{\selectie}
       {\global\geselecteerdtrue}%
   \fi
   \gdef\voorpagina{\dovoorpagina}%
   \gdef\napagina{\donapagina}}

\def\soortpagina%
  {\dosingleargument\dosoortpagina}

\def\dokoppelpagina[#1][#2]%
  {\getparameters
     [\??pg]
     [\c!voor=,
      \c!na=,
      \c!optie=,
      #2]%
   \def\docommando##1%
     {\getparameters
        [\??pg##1]
        [\c!voor=\@@pgvoor,
         \c!na=\@@pgna,
         \c!optie=\@@pgoptie]}%
   \processcommalist[#1]\docommando}%

\def\koppelpagina%
  {\dodoubleargument\dokoppelpagina}

\def\doverwerkpagina[#1][#2]%
  {\processaction
     [#2]
     [ \v!ja=>\global\verwerkentrue,
      \v!nee=>\global\verwerkenfalse]%
   \gdef\selectie{#1}%
   \global\selecterentrue
   \global\geselecteerdfalse}

\def\verwerkpagina%
  {\dodoubleargument\doverwerkpagina}

\def\resetselectiepagina%
  {\ifselecteren
     \doifbothsidesoverruled
       \global\geselecteerdfalse
     \orsideone
     \orsidetwo
       \global\geselecteerdfalse
     \od
   \fi}

\newif\iflocation

\def\ifinteractief{\iflocation}

\def\previoussectionformat{}
\def\currentsectionformat{}

\let\updatelistreferences=\relax
\def\updatedlistreferences{}

\def\setsectionlistreference#1#2%
  {\ifnum\countervalue{\??se\previoussection{#1}}>0\relax
     \xdef\previoussectionformat{\@@longformatnumber{\previoussection{#1}}}%
   \else
     \xdef\previoussectionformat{}%
   \fi
   \xdef\currentsectionformat{\@@longformatnumber{#1}}}

\def\startlistreferences#1%
  {\thisissomeinternal{\s!lst}{#1\currentsectionformat}%
   \setxvalue{\s!lst:#1}{\realfolio}% to be sure 
   \setxvalue{\s!lst:#1\currentsectionformat}{\realfolio}%
   \setxvalue{\e!vorigelokale#1}{\s!lst:#1\previoussectionformat}%
   \setxvalue{\e!huidigelokale#1}{\s!lst:#1\currentsectionformat}%
   \doifelse{\currentsectionformat}{}
     {\setglobalcrossreference
        {\e!vorige#1}{}{\realfolio}{}}
%
     {\setglobalsystemreference\rt!list
        {\e!vorige#1}{\getvalue{\e!vorigelokale#1}}}%
%
%         {\definereference[\e!vorige#1][\getvalue{\e!vorigelokale#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
             {\e!vorige####1}{\getvalue{\e!huidigelokale####1}}}%
%
%         {\definereference[\e!vorige####1][\getvalue{\e!huidigelokale####1}]%
%
        \processcommacommand[\updatedlistreferences]\docommando
        \global\let\updatelistreferences=\relax
        \global\let\updatedlistreferences=\empty}%
   \fi}

\def\stoplistreferences%
  {\gobbleoneargument}

% de rest

\newcount\prefixteller

\def\referenceprefix{}

% \def\showlocation            #1{#1}
% \def\showcontrastlocation#1#2#3{#3}
% \def\showcoloredlocation   #1#2{#2}

\unexpanded\def\referencepagenumber[#1]%
  {\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}%
   \gdef\@@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
   \let\checkindentation=\relax
   \@@rgstepno
   \ignorespaces
   \def\obeyedline%
     {\par
      \ifdim\lastskip>\!!zeropoint
        \def\@@rglinesteptoggle{0}%
      \else
        \doglobal\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\c!letter\c!kleur{\dodoschrijfregelnummer}%
     \fi
   \fi}

\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\setlinereference#1#2#3#4%
  {\setxvalue{lrf:#1}{\noexpand\dogetlinereference{#2}{#3}{#4}}}

\def\getlinereference#1%
  {\getvalue{lrf:#1}}

\def\dogetlinereference#1#2#3%
  {\edef\linereferencename{#1}%
   \edef\linereferenceline{#2}%
   \edef\linereferenceplus{#3}}

% 1 xxx xxx xxx xxx xxx xxx xxx
% 2 xxx yyy yyy yyy yyy yyy yyy <= start y
% 3 yyy yyy yyy yyy yyy yyy yyy 
% 4 yyy yyy yyy yyy yyy xxx xxx <= stop y 
% 5 xxx xxx xxx xxx xxx xxx xxx

%\def\regelreferentie#1[#2]%
%  {\bgroup
%   \dimen0=\dp\strutbox
%   \doif{\@@rnrefereren}{\v!aan}
%     {\doglobal\increment\linereference
%      % start 1=>(n=y,l=0,p=1)
%      % stop  2=>(n=y,l=0,p=2)
%      \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 \!!height \!!zeropoint
%   \prewordbreak
%   \egroup}

\def\regelreferentie#1[#2]%
  {\bgroup
   \dimen0=\dp\strutbox
   \doif{\@@rnrefereren}{\v!aan}
     {\doglobal\increment\linereference
      % start 1=>(n=y,l=0,p=1)
      % stop  2=>(n=y,l=0,p=2)
      \setlinereference{\linereference}{\@@rnprefix#2}{0}{#1}%
      \advance\dimen0 by \linereference sp}%
   \prewordbreak
   \vrule \!!width \!!zeropoint \!!depth \dimen0 \!!height \!!zeropoint
   \prewordbreak
   \egroup}

%\def\dostopnummerenPAR% dp's -> openstrutdepth
%  {\endofshapebox
%   \checkreferences
%   \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
%           % 1=>4 | 2=>4 1=>2 
%           % start 1=>(n=y,l=2,p=1)
%           % stop  2=>(n=y,l=4,p=2)
%           \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 % stop
%             \edef\linereferencename{\getvalue{lrf:n:\recurselevel}}%
%             \edef\linereferenceline{\getvalue{lrf:l:\recurselevel}}%
%             % ref y: text = 4 / Kan dit buiten referentie mechanisme om?
%             \expanded{\setlocalcrossreference
%               {\referenceprefix\linereferencename}{}{}{\linereferenceline}}%
%           \fi}%
%        \dorecurse{\linereference}
%          {\edef\linereferenceplus{\getvalue{lrf:p:\recurselevel}}%
%           \ifnum\linereferenceplus<2 % start / lone 
%             \edef\linereferencename{\getvalue{lrf:n:\recurselevel}}% y 
%             \edef\linereferenceline{\getvalue{lrf:l:\recurselevel}}% 2
%             \ifnum\linereferenceplus=1 % start 
%               \getreferenceelements{\linereferencename}% text = 4 
%               \ifnum\linereferenceline<0\currenttextreference\relax % 0 prevents error
%                 \edef\linereferenceline{\linereferenceline--\currenttextreference}%
%               \fi
%             \fi
%             \expanded{\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}%
%                   \expanded{\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\dostopnummerenPAR% dp's -> openstrutdepth
  {\endofshapebox
   \checkreferences
   \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
           % 1=>4 | 2=>4 1=>2 
           % start 1=>(n=y,l=2,p=1)
           % stop  2=>(n=y,l=4,p=2)
           \dostepwiserecurse{1}{\number\dimen0}{1}
             {\getlinereference\recurselevel
              \setlinereference\recurselevel
                {\linereferencename}{\the\linenumber}{\linereferenceplus}}%
         \fi}%
      \global\advance\linenumber by \linestepper
      \ifnum\linereference>0 % anders vreemde loop in paragraphs+recurse
        \dorecurse{\linereference}
          {\getlinereference\recurselevel
           \ifnum\linereferenceplus=2 % stop
             % ref y: text = 4 / Kan dit buiten referentie mechanisme om?
             \expanded{\setlocalcrossreference
               {\referenceprefix\linereferencename}{}{}{\linereferenceline}}%
           \fi}%
        \dorecurse{\linereference}
          {\getlinereference\recurselevel
           \ifnum\linereferenceplus<2 % start / lone 
             \ifnum\linereferenceplus=1 % start 
               \getreferenceelements{\linereferencename}% text = 4 
               \ifnum\linereferenceline<0\currenttextreference\relax % 0 prevents error
                 \edef\linereferenceline{\linereferenceline--\currenttextreference}%
               \fi
             \fi
             \expanded{\setlocalcrossreference
               {\referenceprefix\linereferencename}{}{}{\linereferenceline}}%
           \fi}%
        \global\let\scratchline=\linenumber  % We are going back!
        \reshapebox
          {\doglobal\decrement\scratchline
           \hbox
             {\dorecurse{\linereference}
                {\getlinereference\recurselevel
                 \getreferenceelements{\linereferencename}%
                 \beforesplitstring\currenttextreference--\at--\to\firstline
                 \ifnum\firstline=\scratchline\relax
                   % beter een rawtextreference
                   \textreference[\linereferencename]{\currenttextreference}%
                   \expanded{\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%
  {\def\crlf{\unskip\space}\let\\\crlf}

%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\dodostopopmaak[#1]%
  {\dododostopopmaak[#1]%
   \doflushopmaak[#1]%
   \endgroup
   \calculatehsizes
   \calculatevsizes}

\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%
  {\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=>\global\advance\middensmaller by \commalistelement]}

\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]}

\definecomplexorsimple\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\dosetraggedvbox#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\dosetraggedhbox#1% 
  {\processaction
     [#1]
     [  \v!links=>\let\raggedbox\regellinks,
       \v!rechts=>\let\raggedbox\regelrechts,
       \v!midden=>\let\raggedbox\regelmidden,
      \s!default=>\let\raggedbox\hbox,
      \s!unknown=>\let\raggedbox\hbox]}

\def\dosetraggedcommand#1% ook ruim,rechts en zo 
  {\processaction
     [#1]
     [  \v!links=>\def\raggedcommand{\raggedleft},
       \v!rechts=>\def\raggedcommand{\raggedright},
       \v!midden=>\def\raggedcommand{\raggedcenter},
          \v!nee=>\def\raggedcommand{\raggedright},
%      \v!normaal=>\let\raggedcommand\relax,
      \s!default=>\def\raggedcommand{\raggedcenter},
      \s!unknown=>\let\raggedcommand\relax]}

%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!achtergrondoffset=\@@bkachtergrondoffset,
      \c!bovenkader=\@@bkbovenkader,
      \c!onderkader=\@@bkonderkader,
      \c!linkerkader=\@@bklinkerkader,
      \c!rechterkader=\@@bkrechterkader,
      \c!kaderoffset=\@@bkkaderoffset,
      \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=\Word{#1}~]%
   \presetheadtext[#2=\Word{#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 even more! In inner, gaat't mis omdat daar
% pagetotal enz niet zijn aangepast. Inner kan overigens niet
% betrouwbaar worden getest!

% NOT TOEVOEGEN: \the\everytrace

\everypar    ={\flushfootnotes
               \ifinner\else\checksidefloat\fi
               \checkindentation
               \flushmargincontents
               \flushcomments}
\neverypar   ={}
\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}%
     \hskip\sidefloatwidth
   \fi}

\def\eqno%
  {\iffloatshort
     \global\floatrighteqotrue
   \fi
   \floatrighteqo}

\def\leftmarginfloat#1%
  {\global\rightfloatfalse\marginfloattrue\putsidefloat{#1}}

\def\rightmarginfloat#1%
  {\global\rightfloattrue\marginfloattrue\putsidefloat{#1}}

\def\leftfloat#1%
  {\global\rightfloatfalse\marginfloatfalse\putsidefloat{#1}}

\def\rightfloat#1%
  {\global\rightfloattrue\marginfloatfalse\putsidefloat{#1}}

\def\putsidefloat#1%
  {\par
   \witruimte
   \previoussidefloat
   \stallsidefloat
   \setbox\floatbox=\hbox{\vbox{\vskip\sidefloattopoffset#1}}
   \measuresidefloat
   \ifroomforfloat
     \setsidefloat
   \else
     \tosssidefloat
     \measuresidefloat
     \stallsidefloat
     \setsidefloat
   \fi}

\def\progresssidefloat%
  {\!!heighta=\sidefloatvsize
   \iffloatflag
     \advance\!!heighta by -\dimen3
     \global\floatflagfalse
   \else
     \advance\!!heighta by -\pagetotal
   \fi}

\def\tosssidefloat%
  {\vfill\eject}

\def\measuresidefloat%
  {\global\floatflagtrue
   \dimen3=\pagetotal
   \ifmarginfloat
     \global\sidefloatwidth=\!!zeropoint
   \else
     \global\sidefloatwidth=\wd\floatbox
     \global\advance\sidefloatwidth by \floatsideskip
   \fi
   \global\sidefloathsize=\hsize
   \global\advance\sidefloathsize by -\sidefloatwidth
   \global\sidefloatheight=\ht\floatbox
\global\advance\sidefloatheight by \dp\floatbox
   \global\advance\sidefloatheight by \sidefloattopskip
   \global\sidefloatvsize=\sidefloatheight
   \global\advance\sidefloatvsize by \dimen3
   \dimen0=\sidefloatvsize
%   \advance\dimen0 by -\baselineskip
%\ifgridsnapping
%  \advance\dimen0 by .5\openlineheight % \vsize slightly too large
%\fi
   \ifdim\dimen0>.99\pagegoal          \relax
     \roomforfloatfalse
   \else
     \dimen0=\pagegoal
     \advance\dimen0 by -\sidefloatvsize
     \ifdim\dimen0<\sidefloatbottomskip
       \global\advance\sidefloatvsize by \dimen0
       \global\floatshorttrue
       \pushpenalties
       \global\holdinginserts=1
     \else
       \global\advance\sidefloatvsize by \sidefloatbottomskip
       \global\floatshortfalse
     \fi
     \roomforfloattrue
   \fi}

\def\setsidefloat%
  {\vbox{\strut}\vskip-\lineheight
   \kern\sidefloattopskip
   \edef\presidefloatdepth{\the\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=\presidefloatdepth
   %\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%
  {\bgroup
   \!!counta=\totalnoffloats
   \advance\!!counta by -\savednoffloats
   \dofloatinfomessage{<}{3}{\the\!!counta}%
   \egroup}

\def\doinsertfloatinfo%
  {\dofloatinfomessage{<}{4}{\the\totalnoffloats}}

% ook voetnoten saven

\def\dosavefloat%
  {\global\setbox\floatlist=\vbox
     {\nointerlineskip
      \box\floatbox
      \unvbox\floatlist}%
   \global\advance\savednoffloats by 1
   \global\somefloatwaitingtrue
   \dosavefloatinfo
   \nonoindentation}

\def\doresavefloat%
  {\global\setbox\floatlist=\vbox
     {\nointerlineskip
      \unvbox\floatlist
      \box\floatbox}%
   \global\advance\savednoffloats by 1
   \global\somefloatwaitingtrue}

\def\doreversesavefloat%
  {\global\setbox\floatlist=\vbox
     {\nointerlineskip
      \unvbox\floatlist
      \box\floatbox}%
   \global\advance\savednoffloats by 1
   \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
       \global\somefloatwaitingfalse
     \fi
   \else
     \global\savednoffloats=0
     \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}

% The number of topinserts also influences the float order, 
% in this respect that when a moved float does not fit, but a 
% next one does, it is indeed placed. Take for instance a 
% sequence of 20 floats, large and small, where a large one 
% migrates and the next smaller one is inserted.

% \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
     \let\totaltopinserted=\!!zeropoint
     \dodosettopinserts
     \ifnum\@@bknonder=0
       \ifnum\@@bknregels>0
         \ifdim\totaltopinserted>\!!zeropoint\relax
           \dimen0=\lineheight
           \dimen0=\@@bknregels\dimen0
           \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
     \dodosetbotinserts
   \fi
   \egroup}

\def\dobotfloat%
  {\global\advance\botinserted by \ht\floatbox
   \global\advance\botinserted by \dp\floatbox
   \global\advance\botinserted by \floattopskip
   \insert\botins
     {\forgetall
      \blanko[\@@bkvoorwit]%
      \flushfloatbox}%
   %\global\nofloatpermittedtrue
   \doinsertfloatinfo}

\def\dosetbothinserts%
  {\ifflushingfloats
     \global\topinserted=\!!zeropoint\relax
     \global\botinserted=\!!zeropoint\relax
   \else
     \global\topinserted=\!!zeropoint\relax
     \dosettopinserts
     \global\botinserted=\topinserted\relax
     \dosetbotinserts
   \fi}

\def\dotopinsertions%
  {\ifvoid\topins\else
     \ifgridsnapping
       %\topsnaptogrid{\box\topins}
       \box\topins % already snapped
     \else
       \unvbox\topins
     \fi
   \fi
   \global\topinserted=\!!zeropoint\relax}

\def\dobotinsertions%
  {\ifvoid\botins\else
     \ifgridsnapping
       \snaptogrid\hbox{\box\botins}
     \else
       \unvbox\botins
     \fi
   \fi
   \global\botinserted=\!!zeropoint\relax
   \global\nofloatpermittedfalse}

\newif\iftopofinsert
\newif\iftestfloatbox %\testfloatboxtrue

%\def\flushfloatbox% nog verder doorvoeren en meer info in marge
%  {\iftestfloatbox
%     \ruledhbox{\box\floatbox}%
%   \else
%     \box\floatbox
%   \fi}

% \testfloatboxtrue
%
% testfloatbox gaat mis, niet in midden, dus elders

\def\flushfloatbox% nog verder doorvoeren en meer info in marge
  {\snaptogrid\hbox{\iftestfloatbox\ruledhbox\fi{\box\floatbox}}}

% beter de laatste skip buiten de \insert uitvoeren,
% bovendien bij volle flush onder baseline.

\def\betweenfloatblanko% assumes that \@@bknawit is present
  {\bgroup
   \setbox0=\vbox{\strut\blanko[\@@bkvoorwit]\strut}%
   \setbox2=\vbox{\strut\blanko[\@@bknawit]\strut}%
   \ifdim\ht0>\ht2
     \blanko[-\@@bknawit,\@@bkvoorwit]
   \fi
   \egroup}

\def\doroomfloat%
  {\ifnofloatpermitted
     \global\roomforfloatfalse
   \else
     \dimen0=\pagetotal
     \advance\dimen0 by \ht\floatbox
     \advance\dimen0 by \dp\floatbox
     \advance\dimen0 by \floattopskip
     \advance\dimen0 by -\pageshrink  % toegevoegd
%\ifgridsnapping
%  \advance\dimen0 by .5\openlineheight % \vsize slightly too large
%\fi
     \ifdim\dimen0>\pagegoal
       \global\roomforfloatfalse
     \else
       \global\roomforfloattrue
     \fi
   \fi}

\def\doexecfloat% spacing between two successive must be better
  {\baselinecorrection
   \witruimte
   \blanko[\@@bkvoorwit]%
   \flushfloatbox
   \blanko[\@@bknawit]%
   \doinsertfloatinfo}

\def\somefixdfloat[#1]%
  {\doroomfloat
   \ifroomforfloat\else
     \goodbreak
   \fi
   \showmessage{\m!floatblocks}{9}{}%
   \doexecfloat}

\def\somesidefloat[#1]%  links, rechts     NOG TESTEN EN AANPASSEN
  {\ifbinnenkolommen
     \someelsefloat[\v!hier]%
   \else
     \checkwaitingfloats{#1}%
     \def\logsidefloat%
       {\doinsertfloatinfo}%
     \setbox\floatbox=\vbox{\box\floatbox}%
     \wd\floatbox=\floatwidth
     \processfirstactioninset
       [#1]
       [     \v!links=>\leftfloat{\box\floatbox},
            \v!rechts=>\rightfloat{\box\floatbox},
          \v!inlinker=>\leftmarginfloat{\box\floatbox},
         \v!inrechter=>\rightmarginfloat{\box\floatbox},
           \v!inmarge=>{\doinmargenormal\leftmarginfloat\rightmarginfloat[]{\box\floatbox}}]%
     \doifinset{\v!lang}{#1}
       {\flushsidefloatsafterpar}%
   \fi}

\def\sometextfloat[#1]%  lang, links, rechts, hoog, midden, laag, offset
  {\checkwaitingfloats{#1}%
   \def\dostoptextfloat{\dodostoptextfloat[#1]}%
   \global\floattextwidth=\hsize
   \global\floatwidth=\wd\floatbox
   \global\floatheight=\ht\floatbox % forget about the depth
   \global\advance\floattextwidth by -\floatwidth
   \global\advance\floattextwidth by -\@@bkmarge\relax % was \tfskipsize
   \doifinsetelse{\v!lang}{#1}
     {\floattextheight=\pagegoal
      \advance\floattextheight by -\pagetotal
      \advance\floattextheight by -\bigskipamount     % lelijk
      \ifdim\floattextheight>\teksthoogte
        \floattextheight=\teksthoogte
      \fi
      \boxmaxdepth=\!!zeropoint\relax            % toegevoegd
      \ifdim\floattextheight<\floatheight
        \floattextheight=\floatheight
      \fi
      \setbox\floattext=\vbox to \floattextheight}
     {\setbox\floattext=\vbox}%
   \bgroup
   \blanko[\v!blokkeer]
   \hsize\floattextwidth
   \ignorespaces}

\def\dodostoptextfloat[#1]%
  {\egroup
   \doifnotinset{\v!lang}{#1}%
     {\ifdim\ht\floattext<\floatheight
        \floattextheight=\floatheight
      \else
        \floattextheight=\ht\floattext
      \fi}%
   \setbox\floatbox=\vbox to \floattextheight
     {\hsize\floatwidth
      \box\floatbox
      \vfill}%
   \setbox\floattext=\vbox to \floattextheight
     {\hsize\floattextwidth
      \doifinsetelse{\v!laag}{#1}
        {\vfill
         \box\floattext
         \doifinset{\c!offset}{#1}{\witruimte\blanko}}
        {\doifinsetelse{\v!midden}{#1}
           {\vfill
            \box\floattext
            \vfill}
           {\doifinset{\v!offset}{#1}{\witruimte\blanko}%
            \box\floattext
            \vfill}}}%
   \doifinsetelse{\v!rechts}{#1}%
     {\setbox\floatbox=\hbox to \hsize
        {\box\floattext
         \hfill
         \box\floatbox}}
     {\setbox\floatbox=\hbox to \hsize
        {\box\floatbox
         \hfill
         \box\floattext}}%
   \baselinecorrection
   \witruimte
   \blanko[\@@bkvoorwit]%
   \doifnotinset{\v!lang}{#1}%
     {\dp\floatbox=\openstrutdepth}% dp\strutbox}%      % toegevoegd
   \box\floatbox
   \blanko[\@@bknawit]%
   \doinsertfloatinfo}

\def\somefacefloat[#1]%  links, rechts, midden, hoog, midden, laag
  {\checkwaitingfloats{#1}%
   \startnaast\box\floatbox\stopnaast
   \doinsertfloatinfo}

\def\somepagefloat[#1]%  links, rechts, midden, hoog, midden, laag
  {\checkwaitingfloats{#1}%
   \vbox to \teksthoogte
     {\doifnotinset{\v!hoog}{#1}{\vfill}%
      \box\floatbox
      \doifnotinset{\v!laag}{#1}{\vfill}}%
   \doinsertfloatinfo
   \pagina}                      % toegevoegd

\def\someelsefloat[#1]%
  {\doifinsetelse{\v!hier}{#1}
     {\doifinsetelse{\v!altijd}{#1}
        {\pagina[\v!voorkeur]%
         \doroomfloat
         \ifroomforfloat
           \doexecfloat
         \else
           \showmessage{\m!floatblocks}{9}{}%
           \doreversesavefloat
         \fi}
        {\ifsomefloatwaiting
           \dosavefloat
         \else
           \pagina[\v!voorkeur]%
           \doroomfloat
           \ifroomforfloat
             \doexecfloat
           \else
             \dosavefloat
           \fi
         \fi}}
     {\doifinsetelse{\v!altijd}{#1}
        {\doroomfloat
         \ifroomforfloat
           \processallactionsinset
             [#1]
             [   \v!boven=>\dotopfloat,
                 \v!onder=>\dobotfloat,
               \s!default=>\doexecfloat]%
         \else
           \showmessage{\m!floatblocks}{9}{}%
           \doreversesavefloat
         \fi}
        {\doroomfloat
         \ifroomforfloat
           \processallactionsinset
             [#1]
             [  \v!boven=>\dotopfloat,
                \v!onder=>\dobotfloat,
              \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}\c!letter\c!kleur{#3}}}%
   \doifelsevalue{\??kj#1\c!nummer}{\v!ja}
     {\def\dofloatnummer%
        {{\xdef\floatcaptionnumber{#1}%
          \hbox{\doattributes{\??kj#1}\c!kopletter\c!kopkleur
             {\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}
           {\dosetraggedvbox{\@@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}
                {\dosetraggedvbox{\@@kjkjuitlijnen}%
                 \setbox2=\raggedbox
                   {\hsize\@@kjkjbreedte
                    \putcompletecaption}}%
              \fi}}%
      \global\setbox\floatbox=\vbox
        {\forgetall
         \processaction
           [\@@kjkjplaats]
           [ \v!boven=>\locatefloat{\copy2}%
                       \endgraf\@@kjkjtussen
                       \locatefloat{\copy4},
             \v!onder=>\locatefloat{\copy4}%
                       \endgraf\@@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\wd4>\hsize
     \global\setbox\floatbox=
       \hbox to \ifbinnenkolommen\wd4\else\hsize\fi
         {\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}
        {\dosetraggedvbox{\@@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}
           {\dosetraggedvbox{\@@kjkjuitlijnen}%
            \setbox2=\raggedbox
              {\hsize\wd4
               \putcompletecaption}}}%
      \global\setbox\floatbox=\vbox
        {\processaction
           [\@@kjkjplaats]
           [ \v!boven=>\box2
                       \endgraf\@@kjkjtussen
                       \box4,
             \v!onder=>\box4
                       \endgraf\@@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
\setbox\floatbox=\hbox{\black\box\floatbox}%
     \global\floatheight=\ht\floatbox
     \global\advance\floatheight by \dp\floatbox
     \global\floatwidth=\wd\floatbox
     \global\advance\totalnoffloats by 1
     \doifnotinset{\v!marge}{#1} % gaat namelijk nog fout
       {\setbox\floatbox=\vbox
          {\parindent\!!zeropoint
           \ifvoorlopig
             \inlinkermarge{\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}

\def\dogetfloatbox#1%
  {\ifvisible
\let\next\relax % ivm eetex
     \processfirstactioninset
       [#1]
       [    \v!hier=>\def\next{\global\floatsonpagetrue\someelsefloat[#1]},
         \v!forceer=>\def\next{\global\floatsonpagetrue\somefixdfloat[#1]},
           \v!links=>\def\next{\global\floatsonpagetrue\somesidefloat[#1]\presetindentation},
          \v!rechts=>\def\next{\global\floatsonpagetrue\somesidefloat[#1]},
           \v!tekst=>\def\next{\global\floatsonpagetrue\sometextfloat[#1]},
           \v!boven=>\def\next{\someelsefloat[#1]\nonoindentation}, % !
           \v!onder=>\def\next{\global\floatsonpagetrue\someelsefloat[#1]},
           \v!marge=>\def\next{\somenextfloat[#1]\nonoindentation}, % !
          \v!pagina=>\def\next{\global\floatsonpagetrue\somepagefloat[#1]},
           \v!naast=>\def\next{\global\floatsonpagetrue\somefacefloat[#1]},
         \v!inmarge=>\def\next{\global\floatsonpagetrue\somesidefloat[#1]},
        \v!inlinker=>\def\next{\global\floatsonpagetrue\somesidefloat[#1]},
       \v!inrechter=>\def\next{\global\floatsonpagetrue\somesidefloat[#1]},
         \s!default=>\def\next{\global\floatsonpagetrue\someelsefloat[\v!hier,#1]},
         \s!unknown=>\def\next{\global\floatsonpagetrue\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=\vbox
        {\unvbox\floatbox
         \vss % gets rid of the depth
         \rawpagereference{\s!flt}{#2}}%
      \egroup\dofloat{#4}{}{#6}{#1}}
     {\convertargument#6\to\asciititle
      \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}%
\rawreference{\s!flt}{#2}{{\hetnummer}{\asciititle}}%
             \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}}%
\rawreference{\s!flt}{#2}{{}{\asciititle}}}%
         \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
             \ifdim\ht\nextbox>\!!zeropoint
               \pagina
               \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{}%
     \definecomplexorsimpleempty\formulenummer
     \def\subformulenummer{\formulenummer}%
     \dostartformula#4\dostopformula
   \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}%
     \definecomplexorsimple\formulenummer
     \def\subformulenummer%
       {\let\verhoogformulenummer=\relax
        \complexorsimple\formulenummer}%
     \gdef\doleqno{\leqno{\formulenummer}}%
     \gdef\doeqno{\eqno{\formulenummer}}%
     \doifelse{\@@fmplaats}{\v!links}
       {\dostartformula#4\doleqno\dostopformula}
       {\dostartformula#4\doeqno\dostopformula}%
   \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}{\dostartformula}
\setvalue{\e!stop \e!formule}{\dostopformula}

\def\dostartformula%
  {\dowithnextbox
     {\scratchskip=\ifdim\tussenwit>\!!zeropoint\tussenwit\else\blankoskip\fi
      \startregelcorrectie[\the\scratchskip]
        \box\nextbox
      \stopregelcorrectie}
   \vbox\bgroup
     \forgetall
     \abovedisplayskip\!!zeropoint
     \belowdisplayskip\!!zeropoint
     \abovedisplayshortskip\!!zeropoint
     \belowdisplayshortskip\!!zeropoint
     $$\def\dostopformula{$$\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
        \expandafter\dodoplaatsstartformule
      \else
        \expandafter\dodoplaatsformule
      \fi
      #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=\vbox
       \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\doschrijfnaarlijst#1#2#3#4% 
  {\doifvalue{\??li#1\c!status}{\v!start}
     {\begingroup
      \ExpandFirstAfter\processaction
        [\getvalue{\??li#1\c!expansie}]
        [      \v!ja=>{\edef\ascii{#3}},
         \v!commando=>{\convertcommand#3\to\ascii},
          \s!default=>{\convertargument#3\to\ascii},
          \s!unknown=>{\convertargument#3\to\ascii}]%
      \makesectionformat
      \doifelse{\@@nmstatus}{\v!start}
        {\def\dopaginanummer{\noexpand\pagenumber}}
        {\def\dopaginanummer{0}}%
      % niet waterdicht, wat te doen met figuren en zo
      % first hack: scheelt rommel, second hack: alleen koppen
      \ExpandBothAfter\rawdoifinsetelse{#1}{\crossdocumentelements}
        {\doif{\@@sectionlevel\@@sectie}{0}{\autocrossdocumentfalse}}
        {\autocrossdocumentfalse}%
      % blijft nog wat zwakjes
      \ifautocrossdocument
        \bgroup
        \thisisdestination{#1::\sectionformat}%
        \@EA\setsectieenkoppeling\@EA{#1}%
        \edef\currentlevel{\@@sectionlevel\@@sectie}%
        \def\docommando##1%
          {\def\dodocommando####1%
             {\setsectieenkoppeling{####1}%
              \def\level{\@@sectionlevel\@@sectie}%
              \ifnum\level>\currentlevel
                \expanded{\definereference[##1::####1][\v!geen]}%
              \else\ifnum\level=\currentlevel
                \expanded{\definereference[##1::####1][##1::{####1::\sectionformat}]}%
              \fi\fi}%
           \processcommacommand[\crossdocumentelements]\dodocommando}%
        \processcommacommand[\crossdocumentreferences]\docommando
        \egroup
      \else
        \thisisnextinternal{#1}% 
      \fi
      \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\lijstwidth{2em}}

\def\@@livariantb% nr - tit - fill - pag
  {\def\lijstfill{\hfill}%
   \def\lijstskip{5em}%
   \def\lijstwidth{2em}}

\def\@@livariantc% nr - tit - dots - pag
  {\def\lijstfill{\leaders\hbox to .5em{\hss.\hss}\hfill\hskip.5em}%
   \def\lijstskip{5em}%
   \def\lijstwidth{0pt}}

\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\dodosetlijst#1%
  {\def\geenlijst##1{\unknown}%
   \setvalue{#1\c!tussen}{\dotussenlijst{#1}}%
   \setvalue{#1\c!lijst}{\dolijstelement{#1}}}

\def\dodoresetlijst#1%
  {\let\geenlijst\empty
   \setvalue{#1\c!tussen}{\gobblefourarguments{#1}}%
   \setvalue{#1\c!lijst}{\gobblesixarguments{#1}}}

\let\geenlijst\empty

\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\v!nummer=\v!ja,  % nodig ? % v
      \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
   \dogetcommalistelement1\from#1\to\firstlistelement
   \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#3}
     {\stelinteractiein[\c!kleur=,\c!contrastkleur=]}%
   \doattributes{\??li#1}{#2}{#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!nummertekst\c!nummerkleur
%                  {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}}%
%             \makelijstelement\v!tekst
%               {\dolistattributes{#1}\c!tekstletter\c!tekstkleur
%                  {\def\\{ }%
%                   \dontconvertfont
%                   \getvalue{\??li#1\c!tekstcommando}{#4}}}%
%             \doifvalue{\??li#1\c!paginanummer}{\v!ja}
%               {\doifsomething{#5}
%                  {\makelijstelement\v!paginanummer
%                     {\dolistattributes{#1}\c!paginaletter\c!paginakleur
%                        {\getvalue{\??li#1\c!paginacommando}
%                           {\paginaprefix\??li#1[#5]%
%                            \translatednumber[#5]}}}}}}}%
% \nointerlineskip % anders verkeerde spatiering bij multi-line
%       \endgraf
% \allowbreak
% }%
%    \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!nummerletter\c!nummerkleur
%                  {\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!paginaletter\c!paginakleur
%                           {\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!tekstletter\c!tekstkleur
%               {\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
% \allowbreak
%    \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!paginaletter\c!paginakleur
%                  {\getvalue{\??li#1\c!paginacommando}
%                     {\paginaprefix\??li#1[#5]%
%                      \translatednumber[#5]}}}}}}%
%    \hbox
%      {\getvalue{\??li#1\c!links}%
%       \makelijstelement\v!sectienummer
%         {\dolistattributes{#1}\c!nummerletter\c!nummerkleur
%            {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}}%
%       \getvalue{\??li#1\c!rechts}%
%       \hskip.5em}%
%    \nobreak
%    \tolerance3500
%    \dolistattributes{#1}\c!tekstletter\c!tekstkleur
%      {\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!diepte=\!!zeropoint,\c!kleur=]}{#1}}
% 
% \def\dodofixdlijstelementF%
%   {\dodofixdlijstelementEFG\relax}
% 
% \def\dodofixdlijstelementG#1%
%   {\dodofixdlijstelementEFG\regelmidden{#1}}
% 
% \def\dodofixdlijstelementEFG#1#2#3#4#5#6#7%
%   {\noindent
%    \hbox
%      {\def\\={ }% or better \relax ?
%       \setbox0=\hbox
%         {#1{\showcontrastlocation{\??ia}{#7}
%           {\dostartattributes{\??li#2}\c!letter\c!kleur{}%
%            \ignorespaces\dontconvertfont#5%
%            \dostopattributes}}}%
%       \gotonextinternal{#2}{#3}{#7}{\copy0}}
%    \par}

\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}}%
            \linklisttoelement{#1}{#2}{#5}{#6}{\copy0}}%
           %\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!nummertekst\c!nummerkleur
                 {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}}%
            \makelijstelement\v!tekst
              {\dolistattributes{#1}\c!tekstletter\c!tekstkleur
                 {\def\\{ }%
                  \dontconvertfont
                  \getvalue{\??li#1\c!tekstcommando}{#4}}}%
            \doifvalue{\??li#1\c!paginanummer}{\v!ja}
              {\doifsomething{#5}
                 {\makelijstelement\v!paginanummer
                    {\dolistattributes{#1}\c!paginaletter\c!paginakleur
                       {\getvalue{\??li#1\c!paginacommando}
                          {\paginaprefix\??li#1[#5]%
                           \translatednumber[#5]}}}}}}}%
      \nointerlineskip % anders verkeerde spatiering bij multi-line
      \endgraf
      \allowbreak}
   \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}}%
         \linklisttoelement{#1}{#2}{#5}{#6}{\copy0}}%
        %\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!nummerletter\c!nummerkleur
                 {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}%
            \hfill}}%
         \setbox4=\hbox
           {\doifvalue{\??li#1\c!paginanummer}{\v!ja}
              {\doifsomething{#5}    % \lijstwidth is new ; temp hack 
                 {\hbox \ifdim\lijstwidth>\!!zeropoint to \lijstwidth\fi
                    {\hfill
                     \makelijstelement\v!paginanummer
                       {\dolistattributes{#1}\c!paginaletter\c!paginakleur
                          {\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!tekstletter\c!tekstkleur
              {\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
   \allowbreak
   \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}%
\ifvmode
  \advance\leftskip\getvalue{\??li#1\c!marge}%  AANGEPAST 
\fi
   \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}}%
         \linklisttoelement{#1}{#2}{#5}{#6}{\copy0}}%
        %\gotonextinternal{#1}{#2}{#6}{\copy0}%
        {\hbox{##2}}}%
   \setbox4=\hbox
     {\doifvalue{\??li#1\c!paginanummer}{\v!ja}
        {\doifsomething{#5}
           {\makelijstelement\v!paginanummer
              {\dolistattributes{#1}\c!paginaletter\c!paginakleur
                 {\getvalue{\??li#1\c!paginacommando}
                    {\paginaprefix\??li#1[#5]%
                     \translatednumber[#5]}}}}}}%
   \hbox
     {\getvalue{\??li#1\c!links}%
      \makelijstelement\v!sectienummer
        {\dolistattributes{#1}\c!nummerletter\c!nummerkleur
           {\getvalue{\??li#1\c!nummercommando}{\listsymbol}}}%
      \getvalue{\??li#1\c!rechts}%
      \hskip.5em}%
   \nobreak
   \tolerance3500 % niet zomaar veranderen 
   \dolistattributes{#1}\c!tekstletter\c!tekstkleur
     {\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
     {\stelinteractiein[\c!strut=\v!nee]}
     {\localframed[\??li#1][\c!diepte=\!!zeropoint,\c!kleur=]}
     {#1}}

\def\dodofixdlijstelementF#1%
  {\dodofixdlijstelementEFG  
     {}   
     {\dosetraggedhbox{\getvalue{\??li#1\c!uitlijnen}}\raggedbox}
     {#1}}

\def\dodofixdlijstelementG#1%
  {\dodofixdlijstelementEFG
     {}
     \regelmidden
     {#1}}

\def\dodofixdlijstelementEFG#1#2#3#4#5#6#7#8%
  {\noindent
   \hbox
     {#1% in case E nils the strut 
      \def\\={ }% 
      \setbox0=\hbox
        {#2{\showcontrastlocation{\??ia}{#8}
          {\dostartattributes{\??li#3}\c!letter\c!kleur{}%
           \ignorespaces\dontconvertfont\setstrut
           \begstrut
           \getvalue{\??li#3\c!tekstcommando}{#6}% tekstcommando nieuw 
           \endstrut % struts new
           \dostopattributes}}}%
      \linklisttoelement{#3}{#4}{#7}{#8}{\copy0}}%
     %\gotonextinternal{#3}{#4}{#8}{\copy0}%
   \par}

\def\strippedlistentry[#1::#2::#3]{#1::#2}%

\def\linklisttoelement#1#2#3#4#5% % list location format page data 
  {\ifautocrossdocument
     \gotodestination{}{}{#1::\strippedlistentry[#3]}{#4}{#5}%
   \else
     \gotonextinternal{#1}{#2}{#4}{#5}%
   \fi}

\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!tekstletter\c!tekstkleur
             {\def\\{ }%
              \dontconvertfont
              \getvalue{\??li##1\c!tekstcommando}{##4}}}%
         \global\utilitydonetrue}
        {}}%
   \dostellijstin[#1][#2]%
   \dogetcommalistelement1\from#1\to\commalistelement
   \dosettoclevel{\getvalue{\??li\commalistelement\c!criterium}}%
   \setbox0=\vbox
     {\doutilities{#1}{\jobname}{#1}{}{\par}}%
   \xdef\utilitylistheight {\the\ht0}%
   \xdef\utilitylistwidth  {\the\wd0}%
   \endgroup
   \iflijstgeplaatst\enablemode[\e!lijst]\else\disablemode[\e!lijst]\fi}

\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]%
   \dogetcommalistelement1\from#1\to\commalistelement
   \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\doplaatssamengesteldelijst[#1][#2]%
  {\begingroup
   \getparameters[\??ih#1][#2]%
   \dosettoclevel{\getvalue{\??ih#1\c!criterium}}%
   \edef\samengesteldelijst{\getvalue{\??ih#1\c!lijst}}% 
   \stripspaces\from\samengesteldelijst\to\samengesteldelijst 
   \doifelsevalue{\??ih#1\c!niveau}{\v!huidige} % criterium=vorige,niveau=huidige
     {\!!counta=0\@@koniveau} % hm: \@@koniveau  
     {\ExpandFirstAfter\doifnumberelse{\getvalue{\??ih#1\c!niveau}}% in verband
        {\!!counta=\getvalue{\??ih#1\c!niveau}% met de vorige implementatie
         \advance\!!counta by 1 % 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}

\def\plaatssamengesteldelijst%
  {\dodoubleempty\doplaatssamengesteldelijst}

%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#4%
  {\bgroup
   \global\utilitydonetrue
   \syndef
     {\doattributes{\??sm#1}\c!tekstletter\c!tekstkleur{#3}}
     \ConvertToConstant\doifelse{#4}{}{\onbekend}{#4}\par
   \egroup}

\def\synonymentry#1%
  {\executeifdefined{#1\s!entry}\gobblethreearguments}

\def\dosetsynonym#1%
  {\doifdefinedelse{\??sm#1\c!commando}
     {\setvalue{#1\s!entry}{\getvalue{\??sm#1\c!commando}}}
     {\setvalue{#1\s!entry}{\dohandlesynonymentry{#1}}}}

\def\doplaatslijstmetsynoniemen#1#2%
  {\witruimte
   \begingroup
   \def\currentsynonym{#1}%
%   \def\synplaats{\getvalue{\??sm#1\c!plaats}}%
%   \def\synbreedte{\getvalue{\??sm#1\c!breedte}}%
%   \def\synmonster{\getvalue{\??sm#1\c!monster}}%
%
   \doordefinieren  % nog eens een class van maken, net als framed
     [syndef]
     [\c!plaats=\getvalue{\??sm#1\c!plaats},
      \c!breedte=\getvalue{\??sm#1\c!breedte},
      \c!afstand=\getvalue{\??sm#1\c!afstand}, 
      \c!monster=\getvalue{\??sm#1\c!monster}, 
      \c!hang=\getvalue{\??sm#1\c!hang}, 
      \c!uitlijnen=\getvalue{\??sm#1\c!uitlijnen}, 
      \c!voor=\getvalue{\??sm#1\c!voor}, 
      \c!tussen=\getvalue{\??sm#1\c!tussen}, 
      \c!na=\getvalue{\??sm#1\c!na}, 
      \c!springvolgendein=\getvalue{\??sm#1\c!springvolgendein}, 
      \c!kopletter=,
      \c!letter=]%
%
   \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!synoniemletter\c!synoniemkleur
       {\synonymmeaningfalse#3}%
   \else
     \explicithmode
     \doattributes{\??sm#1}\c!tekstletter\c!tekstkleur{#2}%
   \fi
   \endgroup}

%\def\getsynonymmeaning#1#2#3%
%  {\doifdefinedelse{#2#3}
%     {{\synonymmeaningtrue\getvalue{#2#3}}}
%     {{\showmessage{\m!systems}{18}{#1,#3}}}

\def\getsynonymmeaning#1#2#3%
  {\bgroup
   \doifundefined{#2#3}
     {\setgvalue{#2#3}{{\tt[#3]}}%
      \showmessage{\m!systems}{18}{#1,#3}}%
   \synonymmeaningtrue
   \getvalue{#2#3}%
   \egroup}

\def\dowritesynonym#1#2#3#4%
  {\begingroup  % anders in mathmode lege \hbox
   \ExpandFirstAfter\processaction
     [\getvalue{\??sm#1\c!expansie}]
     [      \v!ja=>{\edef\asciiA{#3}\edef\asciiB{#4}},
      \v!commando=>{\convertcommand#3\to\asciiA\convertcommand#4\to\asciiB},
       \s!default=>{\convertargument#3\to\asciiA\convertargument#4\to\asciiB},
       \s!unknown=>{\convertargument#3\to\asciiA\convertargument#4\to\asciiB}]%
  %\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}}}%
   \immediatewriteutility{s e {#1} {#2} {\asciiA} {\asciiB}}%
   \endgroup}

\def\preexecutesynonym#1#2#3#4%
  {\ifdoinpututilities \else
     \dowritesynonym{#1}{#2}{#3}{#4}%
     \unexpanded\setgvalue{#2}{\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%
  {\doifsomething{#2}
     {\getvalue{\s!check#1}{#2}%
      \doifelsevalue{\??sm#1\c!conversie}{\v!ja}
        {\unexpanded\setgvalue{#2}{\expandsynonym{#1}{#2}{#3}{#4}}}
        {\doifelsevalue{\??sm#1\c!status}{\v!start}
           {\doifelsevalue{\??sm#1\c!criterium}{\v!alles}
              {\preexecutesynonym{#1}{#2}{#3}{#4}}
              {\unexpanded\setgvalue{#2}{\executesynonym{#1}{#2}{#3}{#4}}}}
           {\unexpanded\setgvalue{#2}{\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!criterium=,
      \c!plaats=\v!links,
      \c!breedte=5em,
      \c!afstand=0pt, 
      \c!monster=, 
      \c!hang=, 
      \c!uitlijnen=, 
      \c!voor=, 
      \c!tussen=, 
      \c!na=, 
      \c!springvolgendein=\v!nee]%
   \presetheadtext
     [#2=\Word{#2}]%
   \setvalue{\e!stel#2\e!in}%
     {\dodoubleargument\getparameters[\??sm#1]}%
   \iffourthargument
     \unexpanded\def#4##1%
       {\getsynonymmeaning{#1}{\??sm:#1:}{##1}}%
     \ifthirdargument
       \unexpanded\def#3##1%
         {\getvalue{\??sm:#1:##1}}%
     \fi
     \setvalue{#1}%
       {\dotripleempty\docomplexsynonym[\??sm:#1:][#1]}%
   \else
     \ifthirdargument
       \unexpanded\def#3##1%
         {\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}\c!letter\c!kleur{##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}\c!letter\c!kleur{#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} {}}}%
   \ExpandFirstAfter\processaction
     [\getvalue{\??so#1\c!expansie}]
     [      \v!ja=>{\edef\asciiA{#3}},
      \v!commando=>{\convertcommand#3\to\asciiA},
       \s!default=>{\convertargument#3\to\asciiA},
       \s!unknown=>{\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}%
     \unexpanded\setgvalue{#2}{\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%
  {\doifsomething{#2}
     {\getvalue{\s!check#1}{#2}%
      \doifelsevalue{\??so#1\c!status}{\v!start}
        {\doifelsevalue{\??so#1\c!criterium}{\v!alles}
           {\preexecutesort{#1}{#2}{#3}}
           {\unexpanded\setgvalue{#2}{\executesort{#1}{#2}{#3}}}}
        {\unexpanded\setgvalue{#2}{\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=, % we test for defined ! 
      \c!status=\v!start,
      \c!criterium=,
      \c!letter=,
      \c!voor=,
      \c!na=\endgraf]%
   \presetheadtext[#2=\Word{#2}]%
   \setvalue{\e!stel#2\e!in}[##1]%      vervalt tzt 
     {\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}

%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.
%
%  \index                {entry}
%  \index[key]           {entry}
%  \index[pageclass::]   {entry}
%  \index[pageclass::key]{entry}
%  \index                {textclass::entry}                
%  \index[key]           {textclass::entry}
%  \index[pageclass::]   {textclass::entry}
%  \index[pageclass::key]{textclass::entry}
%
%  Deze file wordt met het Perl script TeXUtil omgezet in
%  een in te lezen file met de commando's:
%
%    \registerentrya {tag} {ingang}
%    \registerentryb {tag} {subingang}
%    \registerentryc {tag} {subsubingang}
%
%    \registerpage   {tag} {pag,txt} {volgnummer} {paginanummer} {volgnummer}
%
%    \registersee    {tag} {pag,txt} {andere ingang}
%
%    \registerentry  {tag} {letter}

\def\dostelregisterin[#1][#2][#3]%
  {\ifthirdargument
     \def\docommando##1%
       {\getparameters[\??id##1#2][#3]%
        \preparepaginaprefix{\??id##1}}%
   \else
     \def\docommando##1%
       {\getparameters[\??id##1][#2]%
        \preparepaginaprefix{\??id##1}}%
   \fi
   \processcommalist[#1]\docommando}

\def\stelregisterin%
  {\dotripleempty\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}%
   \ExpandFirstAfter\processaction
     [\getvalue{\??id\currentregister\c!expansie}]
     [      \v!ja=>{\edef\ascii{#2}},
      \v!commando=>{\convertcommand#2\to\ascii},
       \s!default=>{\convertargument#2\to\ascii},
       \s!unknown=>{\convertargument#2\to\ascii}]%
   \makesectionformat
   \edef\schrijfwegnaarregister%
     {\writeutility%
        {r \ifcase\registerpagestatus\space\or e \or f \or t \fi  
         {\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\doregister#1%
  {\chardef\registerpagestatus=1
   \def\currentregister{#1}%
   \complexorsimpleempty\doregister}

\def\startregister%
  {\dodoubleargument\dostartregister}

\def\dostartregister[#1][#2]#3%
  {\chardef\registerpagestatus=2
   \def\currentregister{#1}%
   \setgvalue{\??id#1\??id#2}{\dodostopregister[#1][#2]{#3}}%
   \complexdoregister[#2]{#3}}

\def\stopregister%
  {\dodoubleargument\dostopregister}

\def\dostopregister[#1][#2]%
  {\getvalue{\??id#1\??id#2}\setgvalue{\??id#1\??id#2}{}}

\def\dodostopregister[#1][#2]%
  {\chardef\registerpagestatus=3
   \def\currentregister{#1}%
   \complexdoregister[#2]}

\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}%
     \ExpandFirstAfter\processaction
       [\getvalue{\??id\currentregister\c!expansie}]
       [      \v!ja=>{\edef\ascii{#2}},
        \v!commando=>{\convertcommand#2\to\ascii},
         \s!default=>{\convertargument#2\to\ascii},
         \s!unknown=>{\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#2%
  {\nextregisterpage
   \hbox to 1em{\hss\doregisterpagehowto{#1}{#2}\hss}}

\def\setregisterpage#1%
  {\let\registerpageseparator=\empty
   \processaction
     [\getvalue{\??id#1\c!symbool}]
     [      \c!n=>{\def\doregisterpage##1[##2]%
                     {\doregisterpagelocation{#1}{\registerpagenumber}\/}},
            \c!a=>{\def\doregisterpage##1[##2]%
                     {\doregisterpagelocation{#1}{\character{\registerpagenumber}\/}}},
               1=>{\def\doregisterpage##1[##2]%
                     {\doregisterpagelocation{#1}{$\bullet$}}},
               2=>{\def\doregisterpage##1[##2]%
                     {\doregisterpagelocation{#1}{\vrule\!!width1em\!!height1ex\!!depth\!!zeropoint}}},
         \v!geen=>{\def\doregisterpage##1[##2]{}},%
      \s!unknown=>{\def\registerpagesymbol{\getvalue{\??id#1\c!symbool}}%
                   \def\doregisterpage##1[##2]%
                     {\doregisterpagelocation{#1}{\registerpagesymbol}}},
      \s!default=>{\def\registerpageseparator%
                     {,}%
                   \def\doregisterpage##1[##2]%
                     {\doregisterpagehowto{##1}
                        {\strut
                         \paginaprefix{\??id##1}[##2]%
                         \translatednumber[##2]}}}]}

\let\registerpagehowto\empty
\let\registertexthowto\empty

\def\setregisterhowto[#1,#2]%
  {\def\registerpagehowto{#1}%
   \def\registertexthowto{#2}}%

\def\doregistertexthowto#1#2%
  {\dostartattributes{\??id#1\registertexthowto}\c!tekstletter\c!tekstkleur{}%
   \getvalue{\??id#1\c!tekstcommando}{#2}%
   \dostopattributes}

\def\doregisterpagehowto#1#2%
  {\dostartattributes{\??id#1\registerpagehowto}\c!paginaletter\c!paginakleur{}%
   \getvalue{\??id#1\c!paginacommando}{#2}%
   \dostopattributes}

\def\registerentry #1{\executeifdefined{#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}\gobblethrearguments}
\def\registerpage  #1{\executeifdefined{#1\s!page}\gobblefourarguments}
\def\registerfrom  #1{\executeifdefined{#1\s!from}\gobblefourarguments}
\def\registerto    #1{\executeifdefined{#1\s!to}\gobblefourarguments}

\def\doresetregister#1%
  {\letvalue{#1\s!entrya}=\gobbleoneargument
   \letvalue{#1\s!entryb}=\gobbleoneargument
   \letvalue{#1\s!entryc}=\gobbleoneargument
   \letvalue   {#1\s!see}=\gobblethreearguments
   \letvalue  {#1\s!page}=\gobblefourarguments
   \letvalue  {#1\s!from}=\gobblefourarguments
   \letvalue    {#1\s!to}=\gobblefourarguments
   \letvalue {#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 % \strut nieuw 
%               \setbox0=\hbox{\showlocation{\getvalue{\??id#1\c!tekstcommando}{\strut####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
%           \def\dohandleregisterentry####1% dubbelop | \strut nieuw 
%             {\getvalue{\??id#1\c!tekstcommando}{\strut####1}}%
%           \ifcase\currententrylevel % \e!zie must be label 
%             \getvalue{#1\s!entrya}{\sl\e!zie\space##1}%
%           \or
%             \getvalue{#1\s!entryb}{\sl\e!zie\space##1}%
%           \or
%             \getvalue{#1\s!entryc}{\sl\e!zie\space##1}%
%           \fi
%           \c!entryletter\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
%           \global\firstregisterpagefalse}}
%         {}}%
%    \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}\c!letter\c!kleur
%                  {\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]}}}}}

\chardef\lastregisterpagestatus=0

\def\dosetpageregisterpage#1#2#3#4#5#6%
  {\doifreglevelelse[#5]
     {\global\utilitydonetrue
      \c!entryletter
      \setregisterhowto[#3]%
      \def\dohandleregisterentry##1%
        {\bgroup
         \if!!donea % \strut nieuw 
           \setbox0=\hbox{\showlocation{\doregistertexthowto{#2}{\strut##1}}}%
           \gotonextinternal{\s!ind}{#4}{#6}{\copy0}%
         \else
           \doregistertexthowto{#2}{##1}%
         \fi
         \egroup
         \!!doneafalse}%
      \!!doneafalse
      \doifelsevalue{\??id#2\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
        \global\chardef\lastregisterpagestatus=0
        \expandafter\hskip\getvalue{\??id#2\c!afstand}\relax
        \donetrue
      \else\ifnum#1=3
        |--|\relax % -- ! 
        \donetrue
      \else\ifnum\lastregisterpagestatus=2 
        \donefalse % waiting for "to" pagenumber 
      \else
        \registerpageseparator    
        |\spatie|\relax % \relax needed because | looks ahead
        \donetrue
      \fi\fi\fi
      \ifdone
        \doifelsevalue{\??id#2\c!interactie}{\v!paginanummer}
          {\bgroup
           \setbox0=\hbox
             {\showlocation{\doregisterpage{#2}[#5]\ifnum#1=2\/\fi}}%
           \gotonextinternal{\s!ind}{#4}{#6}{\copy0}%
           \egroup}
          {\hbox{\doregisterpage{#2}[#5]\ifnum#1=2\/\fi}}%
        \ignorespaces
        \global\chardef\lastregisterpagestatus=#1\relax 
      \fi
      \global\firstregisterpagefalse}
     {}}

\def\dosetpageregistersee#1#2#3#4%
  {\doifreglevelelse[#4::0]
     {{\global\utilitydonetrue
       \setregisterhowto[#2]%
       \def\dohandleregisterentry##1% dubbelop | \strut nieuw 
         {\doregistertexthowto{#1}{\strut##1}}%
       \getvalue
         {#1\ifcase\currententrylevel\s!entrya\or\s!entryb\else\s!entryc\fi}%
         {\doregisterpagehowto{#1}{\labeltext\v!zie\space#3}}%
       \c!entryletter\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
       \global\chardef\lastregisterpagestatus=0
       \global\firstregisterpagefalse}}
     {}}

\def\dosetpageregisterletter#1#2%
  {\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}\c!letter\c!kleur
              {\doifvalue{\??id#1\c!refereren}{\v!aan}
                 {\pagereference[#1:#2]}%
               \strut\ignorespaces#2}}%
         \getvalue{\??id#1\c!na}%
         \par\nobreak}       % don't use \string#2, other hack
        {\goodbreak          % needed #2 can be \string...
         \doifvalue{\??id#1\c!refereren}{\v!aan}
           {\pagereference[#1:#2]}}}}

\def\dosetpageregisterentrya#1#2%
  {\edef\currententrylevel{1}%
   \global\let\c!entryb=\relax
   \global\let\c!entryc=\relax
   \gdef\c!entrya%
     {\global\firstregisterpagetrue
      \endgraf
      \hangindent1em\noindent
      \dohandleregisterentry{#2}%
      \global\firstsubentrytrue
      \global\firstsubsubentrytrue}}

\def\dosetpageregisterentryb#1#2%
  {\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{#2}%
      \global\firstsubentryfalse
      \global\firstsubsubentrytrue}}

\def\dosetpageregisterentryc#1#2%
  {\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{#2}%
      \global\firstsubsubentryfalse}}

\def\dosetpageregister#1%
  {\dosetreglevel{\getvalue{\??id#1\c!criterium}}%
   \setregisterpage{#1}%
   \chardef\lastregisterpagestatus=0
   \setvalue{#1\s!entrya}{\dosetpageregisterentrya {#1}}%
   \setvalue{#1\s!entryb}{\dosetpageregisterentryb {#1}}%
   \setvalue{#1\s!entryc}{\dosetpageregisterentryc {#1}}%
   \setvalue  {#1\s!page}{\dosetpageregisterpage{1}{#1}}%
   \setvalue  {#1\s!from}{\dosetpageregisterpage{2}{#1}}%
   \setvalue    {#1\s!to}{\dosetpageregisterpage{3}{#1}}%
   \setvalue   {#1\s!see}{\dosetpageregistersee    {#1}}%
   \setvalue {#1\s!entry}{\dosetpageregisterletter {#1}}}

\def\getalllistreferences#1#2%
  {\convertargument#2\to\currentregisterentry
   \doifdefinedelse{\??id#1\??id\currentregisterentry}
     {\edef\alllistreferences%
        {\getvalue{\??id#1\??id\currentregisterentry}}%
      \beforesplitstring\alllistreferences\at::\to\internallistreference
      \aftersplitstring\alllistreferences\at::\to\alllistreferences}
     {\let\alllistreferences=\empty
      \def\internallistreference{0}}}

\def\dosetlinkregister#1% is die page reference echt nodig?
  {\dosetreglevel{\getvalue{\??id#1\c!criterium}}%
   \setregisterpage{#1}%
   \setvalue{#1\s!entrya}##1%
     {\global\utilitydonetrue
      \c!entryletter
      \iflocation
        \getalllistreferences{#1}{##1}%
        \endgraf\hangindent1em\noindent
        %
        %\thisissomeinternal{\s!lin}{\internallistreference}%
        %
        \pagereference[\s!lin:\internallistreference]%
        %
        \getcommacommandsize[\alllistreferences]%
        \getfromcommacommand[\alllistreferences][1]%
        \ifnum\commalistsize=1
          \let\firstlistreference=\empty
          \let\midlistreference=\commalistelement
          \let\lastlistreference=\empty
        \else
          \let\firstlistreference=\commalistelement
          \getfromcommacommand[\alllistreferences][\commalistsize]%
          \let\lastlistreference=\commalistelement
          \ifnum\commalistsize=2
            \let\midlistreference=\empty
          \else
            \!!counta=\commalistsize
            \divide\!!counta by 2
            \getfromcommacommand[\alllistreferences][\!!counta]%
            \let\midlistreference=\commalistelement
          \fi
        \fi
        % \hskip-.25em\relax ??????
        \getvalue{\??id#1\c!tekstcommando}{##1}%
        \hskip\getvalue{\??id#1\c!afstand}%
        \def\dodocommando[####1-####2]%
          {\gotonextinternal{\s!ind}{####1}{####2}{\copy0}}%
        \def\docommando####1####2%
          {\setbox0=\hbox{\showlocation{\hbox to 1em{\hss\symbol[####2]\hss}}}%
           \ifx####1\empty
             % \hskip\wd0 % (optioneel maken)
           \else
             \expandafter\dodocommando\expandafter[####1]%
           \fi}%
        {\docommando\firstlistreference\v!vorige}%
        {\docommando\midlistreference\v!ergens}%
        {\docommando\lastlistreference\v!volgende}%
      \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}\c!letter\c!kleur
                 {\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\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!from}%
     {\getvalue{#1\s!page}}%
   \setvalue{#1\s!page}##1##2##3##4%
     {\doifreglevelelse[##3]
        {\global\utilitydonetrue
         \iffirstregisterpage
           \global\firstregisterpagefalse
           \setxvalue{\??id#1\??id\currentregisterentry}%
             {\internallistreference::##2-##4}%
         \else
           \setxvalue{\??id#1\??id\currentregisterentry}%
             {\getvalue{\??id#1\??id\currentregisterentry},##2-##4}%
         \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
       \fi
       \ifx\nextlistreference\empty
         \let\nextlistreference=\firstlistreference
       \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{\symbol[##2]}\hss}%
          \ifx##1\empty
            \hskip\wd0 % (optioneel maken)
          \else
            \expandafter\dodocommando\expandafter[##1]%
          \fi}%
       \bgroup
         \docommando\prevlistreference{\v!vorige}% 
       \egroup
       \bgroup
         \doifreferencefoundelse{\s!lin:\internallistreference}
           {\gotosomeinternal
              {\s!lin}{\internallistreference}{\currentrealreference}
              {\showlocation{#3}}}
           {\hbox{#3}}%
       \egroup
       \bgroup
         \docommando\nextlistreference{\v!volgende}% 
       \egroup}}

\def\dodolinkedregister[#1][#2]#3%
  {\bgroup
   \chardef\registerpagestatus=1
   \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!paginaletter=\v!schuin,
      \c!aanduiding=\v!ja,
      \v!deel\v!nummer=\v!ja, % v
      \v!hoofdstuk\c!nummer=\v!nee,
      \c!criterium=\v!alles,
      \c!commando=,
      \c!refereren=\v!aan]%
   \presetheadtext[#1=\Word{#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!from}%
     {\getvalue{#1\s!page}}%
   \setvalue{#1\s!page}##1##2##3##4%
     {\doifreglevelelse[##3]
        {\doglobal\increment\utilitylistlength
         \global\utilitydonetrue}
        {}}%
   \doglobal\newcounter\utilityregisterlength
   \setbox0=\vbox
     {\doutilities{#1}{\jobname}{#1}{}{}}%
   \endgroup
   \ifregistergeplaatst\enablemode[\e!register]\else\disablemode[\e!register]\fi}

\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.


% \EveryPar%
%   {\doglobal\newcounter\NOfLines}
%
% \EveryLine%
%   {\doglobal\increment\NOfLines%
%    \hskip-3em%
%    \hbox to 3em{\hss\NOfLines\hskip1em}}

\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\dodostartbuffer[#1][#2][#3]%
  {\showmessage{\m!systems}{15}{#1}%
   \doifelse{#3}{}
     {\letbeundefined{\e!stop\e!buffer}% % \let\stopbuffer=\relax   % \undefined
      \@EA\@EA\@EA\convertargument\@EA\e!start\e!buffer\to\beginofblock % else a space
      \@EA\@EA\@EA\convertargument\@EA\e!stop\e!buffer\to\endofblock
      \let\processnextblockline=\processnextbufferline}
     {\letbeundefined{#3}% \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
   \let\writeoutblocks\gobbleoneargument
   \copyblockline}

\def\dostartbuffer%
  {\bgroup
   \obeylines % nodig, anders gaat 't fout als direct \starttabel (bv)
   \dotripleempty\dodostartbuffer}

\letvalue{\e!start\e!buffer}\dostartbuffer

% \setbuffer[name]#2\endbuffer : saves to file #2.tmp

\def\setbuffer[#1]#2\endbuffer%
  {\immediate\openout\tmpblocks=#1.\f!temporaryextension
   \convertargument#2\to\ascii
   \immediate\write\tmpblocks{\ascii}%
   \immediate\closeout\tmpblocks}

\def\dobuffer#1[#2]#3%
  {\def\dodobuffer##1%
      {\showmessage{\m!systems}{#1}{##1}%
       \beginrestorecatcodes
       #3{##1.\f!temporaryextension}{}{}%
       \endrestorecatcodes}%
   \doifelsenothing{#2}
     {\dodobuffer\jobname}
     {\processcommalist[#2]\dodobuffer}}

\def\haalbuffer%
  {\dodoubleempty\dohaalbuffer}

\def\dohaalbuffer[#1][#2]%
  {\iffirstargument
     \dodohaalbuffer[][#1]%
   \else
     \dodohaalbuffer[#1][#2]%
   \fi}

\def\dodohaalbuffer[#1][#2]%
  {\getvalue{\??bu#1\c!voor}%
   \dobuffer{16}[#2]\readjobfile
   \getvalue{\??bu#1\c!na}}

\def\typebuffer%
  {\dodoubleempty\dotypebuffer}

\def\dotypebuffer[#1][#2]%
  {\iffirstargument
    \dobuffer{17}[#1]\typefile
   \else
    \dobuffer{17}[#2]\typefile
   \fi}

\def\stelbufferin%
  {\dodoubleempty\dostelbufferin}

\def\dostelbufferin[#1][#2]%
  {\ifsecondargument
     \getparameters[\??bu#1][#2]%
   \else
     \getparameters[\??bu][#1]%
   \fi}

\def\dodefinieerbuffer[#1]%
  {\iffirstargument % else problems   
     \doglobal\increment\nofdefinedbuffers
     \setevalue{\e!start#1}%
       {\noexpand\dostartbuffer[def-\nofdefinedbuffers][\e!start#1][\e!stop#1]}%
     \setevalue{\e!haal#1}%
       {\noexpand\dodohaalbuffer[#1][def-\nofdefinedbuffers]}%
     \setevalue{\e!type#1}%
       {\noexpand\dodotypebuffer[#1][def-\nofdefinedbuffers]}%
   \fi}

\def\definieerbuffer%
  {\dosingleargument\dodefinieerbuffer}

%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 komt neer 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.

% MEER GEBRUIKEN : \dodoubleargumentwithset

\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
        %  \let\copynextline\relax
        %\fi
        %\copynextline}%
        \ifeof\inpblocks\else\expandafter\copynextline\fi}%
     \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% kan vlotter 
%  {\!!counta=1\relax
%   \loop
%     \catcode\!!counta=\@@other
%     \advance\!!counta by 1\relax
%     \ifnum\!!counta<255\relax
%   \repeat
%   \obeylines}

\def\setupcopyblock%
  {\dostepwiserecurse{1}{255}{1}{\catcode\recurselevel=\@@other}%
   \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%
  {\let\opentmpblock\empty
   \let\closetmpblock\empty
   \let\writetmpblock\gobbleoneargument
   \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%
  {\dosingleargumentwithset\dodefinieerblok}

\def\dostelblokin[#1][#2]%
  {\getparameters[\??tb#1][#2]}

\def\stelblokin%
  {\dodoubleargumentwithset\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}\c!letter\c!kleur{}%
   \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
%         \doifinsetelse{-}{#3}
%           {\showwarning{\m!textblocks}{10}{\bloktitel}%
%            \setvalue{\s!thiswasblock#1}%
%              {\global\advance\blocklevel by -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}\c!letter\c!kleur{}%
%            \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
%    \dogetcommalistelement1\from#1\to\commalistelement
%    \doifdefined{\??tb\commalistelement\c!file}
%      {\loadallblocks{\getvalue{\??tb\commalistelement\c!file}}}%
%    \endgroup}
% 
% \def\gebruikblokken%
%   {\begingroup
%    \doassign[\??bs][\c!criterium=\v!alles]%
%    \dodoubleempty\dogebruikblokken}

\newconditional\processblockstatus  
\newconditional\dummyblockstatus

\def\dodogebruikblok#1#2#3#4%
  {\getblockstatus{#2}%
   \ifblockpermitted
     \setfalse\dummyblockstatus 
     \doifelsenothing{#4}
       {\edef\bloktitel{#1}}
       {\doifnotcommon{#3}{#4}
          {\ifconditional\processblockstatus 
             \settrue\dummyblockstatus
           \else
             \global\blockpermittedfalse
           \fi}%
        \edef\bloktitel{#1:#3}}%
   \else
     \edef\bloktitel{#1}%
   \fi
   \ifblockpermitted
     \global\advance\blocklevel by 1
     \doifinset{-}{#3}{\settrue\dummyblockstatus}%
     \ifconditional\dummyblockstatus
       \showwarning{\m!textblocks}{10}{\bloktitel}%
       \setvalue{\s!thiswasblock#1}%
         {\par
          \egroup
          \global\advance\blocklevel by -1\relax}%
       \def\next%
         {\setbox0=\vbox\bgroup}%
     \else
       \showwarning{\m!textblocks}{11}{\bloktitel}%
       \setvalue{\s!thiswasblock#1}%
         {\par
          \egroup
          \getvalue{\??tb#1\c!na}%
          \global\advance\blocklevel by -1\relax}%
       \def\next%
         {\getvalue{\??tb#1\c!voor}%
          \bgroup
          \visibletrue
          \doattributes{\??tb#1}\c!letter\c!kleur{}%
          \getvalue{\??tb#1\c!binnen}}%
     \fi
   \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\dodogebruikblokken[#1][#2]%
  {\def\docommando##1%
     {\dogebruikblok[##1][#2]}%
   \processcommalist[#1]\docommando
   \dogetcommalistelement1\from#1\to\commalistelement
   \doifdefined{\??tb\commalistelement\c!file}
     {\loadallblocks{\getvalue{\??tb\commalistelement\c!file}}}%
   \endgroup}

\def\dogebruikblokken%
  {\begingroup
   \doassign[\??bs][\c!criterium=\v!alles]%
   \dodoubleempty\dodogebruikblokken}

\def\gebruikblokken%
  {\setfalse\processblockstatus\dogebruikblokken}

\def\verwerkblokken%
  {\settrue \processblockstatus\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!linkerkader }\v!aan\!!doneatrue
         {\doifelsevalue{\!!stringe\c!rechterkader}\v!aan\!!doneatrue
         {\doifelsevalue{\!!stringe\c!bovenkader  }\v!aan\!!doneatrue
         {\doifelsevalue{\!!stringe\c!onderkader  }\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
\doifnot{\@@mastatus}{\v!herhaal}{\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]%
  {\ifthirdargument
     \docheckbackgrounddefinitions
     \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\ifsecondargument
     \docheckbackgrounddefinitions
     \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]}%
   \else\iffirstargument 
     \getparameters[\??ma][#1]%
   \fi\fi\fi
   \doifelse{\@@mastatus}{\v!stop}
     {\global\newbackgroundfalse}
     {\global\newbackgroundtrue}}

\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\processlocalfile#1#2% 
  {\doglobal\increment\fileprocesslevel
   \setxvalue{\c!file::\fileprocesslevel}{#2}%
   \@EA\doglobal\@EA\addtocommalist\@EA{#2}\processedfiles
   #1{#2}{}{}% #1=\readlocfile|\readsetfile{dir} #2=filename 
   \doglobal\decrement\fileprocesslevel}

\def\processfile#1%
  {\ifx\allinputpaths\empty
     \processlocalfile{\readlocfile}{#1}{}%
   \else
     \let\filepath\empty
     \def\docommando##1%
       {\doiffileelse{\pathplusfile{##1}{#1}}
          {\donetrue\def\filepath{##1}}
          {\donefalse}%
        \ifdone\expandafter\quitcommalist\fi}%
     \processcommacommand[.,\allinputpaths]\docommando
     \ifx\filepath\empty
       \processlocalfile{\readlocfile         }{#1}% fall back ../../..  
     \else
       \processlocalfile{\readsetfile\filepath}{#1}% file found 
     \fi
   \fi}

\let\allinputpaths\empty

\def\usepath[#1]% 
  {\def\docommando##1%
     {\doifelse{##1}{\v!reset}
        {\let\allinputpaths\empty}
        {\addtocommalist{##1}\allinputpaths}}%
   \processcommalist[#1]\docommando}

\def\registreerfileinfo[#1#2]#3%
  {\writestatus{\m!systems}{#1#2 file #3 at line \the\inputlineno}%
   \immediatewriteutility{f #1 {#3}}}

\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}}{}}

% test \@@svgebied

\def\loadallsystemfiles#1%
  {\ifx\@@svgebied\empty
     \readsysfile{#1}{\showmessage{\m!systems}{2}{#1}}{}%
   \else
     \def\doloadsystemfile##1%
       {\readsetfile{##1}{#1}{\showmessage{\m!systems}{2}{#1}}{}}%
     \processcommacommand[\@@svgebied]\doloadsystemfile
   \fi}

\def\loadsystemfiles%
  {\readsysfile{\f!newfilename}
     {\showmessage{\m!systems}{2}{\f!newfilename}}{}%
   \readsysfile{\f!oldfilename}
     {\showmessage{\m!systems}{2}{\f!oldfilename}}{}%
   \loadallsystemfiles\f!filfilename
   \loadallsystemfiles\f!sysfilename}

%

\def\loadoptionfile%
  {\readsysfile{\f!optfilename}
     {\showmessage{\m!systems}{2}{\f!optfilename}}{}}

% \newevery \everyjob \EveryJob
% \appendtoks ... \to \everyjob

\appendtoks \showcontextbanner \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
\appendtoks \pagina[\v!laatste] \pagina
            \ifarrangingpages\poparrangedpages\fi \to \everybye

\appendtoks \registreerfileinfo[end]{\jobname}      \to \everybye
\appendtoks \stopcopyingblocks                    \to \everybye
\appendtoks \closeutilities                       \to \everybye
\appendtoks \closespecialfile                     \to \everybye

\def\doateverystarttext%
  {\the\everystarttext 
   \global\let\doateverystarttext\relax}

\def\starttekst%
  {\doateverystarttext
   \ifnum\textlevel=0\relax
    \registreerfileinfo[begin]{\jobname}%
    \startcopyingblocks
   \fi
   \doglobal\increment\textlevel\relax}

\def\stoptekst%
  {\doglobal\decrement\textlevel\relax
   \ifnum\textlevel>0 \else
     \the\everystoptext
     \the\everybye
     \expandafter\normalend
   \fi}

\let\normalend=\end

\def\end%
  {\ifnum\textlevel>0 \else
     \the\everybye
     \expandafter\normalend
   \fi}

\def\doexecutefileonce#1%
  {\beforesplitstring#1\at.\to\currentfile
   \ExpandBothAfter\doifnotinset{\currentfile}{\loadedfiles}%
     {\ExpandFirstAfter\addtocommalist{\currentfile}\loadedfiles
      \doexecutefile{#1}}}

\def\doexecutefile#1%
  {\registreerfileinfo[begin]{#1}
   \processfile{#1}%
   \registreerfileinfo[end]{#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\doprevlevel%
  {\ifnum\filelevel=1
     \expandafter\stoptekst
   \else
     \decrement\filelevel\relax
     \expandafter\endinput
   \fi}

\def\startprojekt #1 %
  {\!!donextlevel\currentproject
     \donotexecutefile\doexecutefileonce
     \doexecutefileonce\doexecutefile#1\\}

\def\stopprojekt%
  {\doprevlevel}

\def\startprodukt #1 %
  {\doateverystarttext
   \!!donextlevel\currentproduct
     \doexecutefileonce\doexecutefileonce
     \donotexecutefile\doexecutefile#1\\}

\def\stopprodukt%
  {\doprevlevel}

\def\startonderdeel #1 %
  {\doateverystarttext
   \!!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}}

\edef\utilityversion{1998.07.07} % was: 1996.03.15  % status variables
\edef\utilityversion{1998.12.20} % was: 1998.07.07  % index attributes

\def\doplaatsversieaanduiding#1#2%
  {\doifsomething{#2}
     {\@EA\convertargument#2\to\ascii
      \ #1: \ascii\
      \!!doneatrue}}

\def\plaatsversieaanduiding% nog engels maken 
  {\ifvoorlopig
     \vskip\!!sixpoint
     \hbox to \zetbreedte
       {\infofont
        \getmessage\m!systems{27}: \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\ifinpagebody\else
     \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}
                   {8em}
                   {..}%
                \quad}}}%
     \endgroup
     \ifinner
       \aftergroup\totaltestinfo
     \else
       \totaltestinfo
     \fi
   \fi\fi}

\def\referentieinfo%
 {\dotestinfo\referentieinfobox}

\def\registerinfo%
 {\dotestinfo\registerinfobox}

\def\floatinfo%
 {\dotestinfo\floatinfobox}

\def\plaatstestinfo%
  {\setbox0=\vbox to \teksthoogte
     {\forgetall
      \infofont
      \hsize10em
      \ifvoid\floatinfobox\else
        \strut \getmessage\m!systems{24}
        \vskip\!!sixpoint
        \unvbox\floatinfobox
        \vskip\!!twelvepoint
      \fi
      \ifvoid\referentieinfobox\else
        \strut \getmessage\m!systems{25}
        \vskip\!!sixpoint
        \unvbox\referentieinfobox
        \vskip\!!twelvepoint
      \fi
      \ifvoid\registerinfobox\else
        \strut \getmessage\m!systems{26}
        \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\complexdefinieer[#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}

\definecomplexorsimpleempty\definieer

\unexpanded\def\naam#1%
  {\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\getvalue{\e!start#1}}
\def\complexstop [#1]{\getvalue{\e!stop #1}\egroup} 

\def\simplestart{\bgroup}
\def\simplestop {\egroup}

\definecomplexorsimple\start
\definecomplexorsimple\stop

\def\dodefinieerstartstop[#1][#2]%
  {\getparameters
     [\??be#1]
     [\c!voor=,
      \c!na=,
      \c!commandos=,
      \c!letter=,
      #2]%
   \setvalue{#1}%
     {\groupedcommand
        {\getvalue{\??be#1\c!commandos}%
         \dostartattributes{\??be#1}\c!letter\c!kleur}
        {\dostopattributes}}%
   \setvalue{\e!start#1}%
     {\getvalue{\??be#1\c!voor}%
      \bgroup
      \getvalue{\??be#1\c!commandos}%
      \dostartattributes{\??be#1}\c!letter\c!kleur{}}%
   \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}%
  {\dostartbuffer[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\dosetupsystem[#1]%
  {\getparameters[\??sv][#1]%
   \beforesplitstring\@@svresolutie\at dpi\to\@@svresolutie
   \let\outputresolution=\@@svresolutie}

\def\setupsystem%
  {\dosingleargument\dosetupsystem}

% Default-instellingen (verborgen)

\resetutilities

% Uitgestelde instellingen

\def\dooutput{\sidefloatoutput}           % redefinition of \dooutput

% Default-instellingen (zichtbaar)

\setupsystem
  [\c!gebied=,
   \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!dx=\!!zeropoint,
                    \c!dy=\!!zeropoint,
                  \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!commando=,
   \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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!hoofd\v!tekst\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!hoofd\v!tekst\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!hoofd\v!marge\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!hoofd\v!marge\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!hoofd\v!rand\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!hoofd\v!rand\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!voet\v!tekst\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!voet\v!tekst\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!voet\v!marge\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!voet\v!marge\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!voet\v!rand\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!voet\v!rand\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!boven\v!tekst\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!boven\v!tekst\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!boven\v!marge\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!boven\v!marge\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!boven\v!rand\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!boven\v!rand\c!breedte}]

\stelonderin
  [\v!tekst]
  [\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!onder\v!rand\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!onder\v!rand\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!onder\v!marge\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!onder\v!marge\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!onder\v!rand\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!onder\v!rand\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!tekst\v!tekst\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!tekst\v!tekst\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!tekst\v!marge\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!tekst\v!marge\c!breedte}]

\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!breedte=,
   \c!linkerbreedte=\getvalue{\??tk\v!tekst\v!rand\c!breedte},
   \c!rechterbreedte=\getvalue{\??tk\v!tekst\v!rand\c!breedte}]

\stelnummeringin % na instellen hoofdteksten ! 
  [\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\v!nummer=\v!nee, % v
   \v!deel\v!nummer=\v!ja,       % v
   \c!nummerscheider=--,
   \c!tekstscheider=\tfskip,
   \c!status=\v!start,
   \c!commando=,
   \c!letter=\v!normaal,
   \c!kleur=]

\stelblankoin
  [\v!standaard,
   \v!groot]

\definieerblanko[\v!default] [\currentblanko]
\definieerblanko[\v!voor]    [\v!default]
\definieerblanko[\v!tussen]  [\v!default]
\definieerblanko[\v!na]      [\v!voor]

% doen?

\def\@@blankovoor  {\blanko[\v!voor]}   %
\def\@@blankotussen{\blanko[\v!tussen]} %  scheelt 5 tokens == >20 bytes
\def\@@blankona    {\blanko[\v!na]}     %

\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!sectionlevel-1]   % deel
\definieersectie[\v!sectionlevel-2]   % hoofdstuk
\definieersectie[\v!sectionlevel-3]   % paragraaf
\definieersectie[\v!sectionlevel-4]   % subparagraaf
\definieersectie[\v!sectionlevel-5]   % subsubparagraaf
\definieersectie[\v!sectionlevel-6]   % subsubsubparagraaf
\definieersectie[\v!sectionlevel-7]   % subsubsubsubparagraaf

% \c!eigennummer ook hier?

\definieerkop
  [\v!deel]
  [\c!sectie=\v!sectionlevel-1]

\definieerkop
  [\v!hoofdstuk]
  [\c!sectie=\v!sectionlevel-2]

\definieerkop
  [\v!paragraaf]
  [\c!sectie=\v!sectionlevel-3]

\definieerkop
  [\v!sub\v!paragraaf]
  [\c!sectie=\v!sectionlevel-4,
   \c!default=\v!paragraaf]

\definieerkop
  [\v!sub\v!sub\v!paragraaf]
  [\c!sectie=\v!sectionlevel-5,
   \c!default=\v!paragraaf]

\definieerkop
  [\v!sub\v!sub\v!sub\v!paragraaf]
  [\c!sectie=\v!sectionlevel-6,
   \c!default=\v!paragraaf]

\definieerkop
  [\v!sub\v!sub\v!sub\v!sub\v!paragraaf]
  [\c!sectie=\v!sectionlevel-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!sectionlevel-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=,
   \c!doorgaan=\v!nee,
   \c!springvolgendein=\v!nee,
   \c!pagina=\v!rechts,
   \c!hoofd=,
   \c!letter=\tfc,
   \c!afstand=.75em,
   \c!voor={\blanko[2*\v!groot]},
   \c!na={\blanko[2*\v!groot]}]

\stelkopin
  [\v!paragraaf]
  [\c!uitlijnen=,
   \c!letter=\tfa,
   \c!afstand=.75em,
   \c!springvolgendein=\v!nee,
   \c!voor={\blanko[2*\v!groot]},
   \c!na=\blanko]

\definieersamengesteldelijst
  [\v!inhoud]
  [\v!deel,
   \v!hoofdstuk,
   \v!paragraaf,
   \v!sub\v!paragraaf,
   \v!sub\v!sub\v!paragraaf,
   \v!sub\v!sub\v!sub\v!paragraaf,
   \v!sub\v!sub\v!sub\v!sub\v!paragraaf]
  [\c!niveau=\v!sub\v!sub\v!sub\v!sub\v!paragraaf,
   \c!criterium=\v!lokaal]

\stelblokkopjesin
  [\c!plaats=\v!onder,
   \c!voor=\blanko,
   \c!tussen={\blanko[\v!middel]},
   \c!na=\blanko,
   \c!breedte=\v!passend,
   \c!kopletter=\v!vet,
   \c!letter=\v!normaal,
   \c!kleur=,
   \c!uitlijnen=,
   \c!nummer=\v!ja,
   \c!wijze=\@@nrwijze,
   \c!blokwijze=\@@nrblokwijze,
   \c!sectienummer=\@@nrsectienummer,
   \c!conversie=\v!cijfers]

\stelplaatsblokkenin
  [\c!plaats=\v!midden,
   \c!breedte=\v!passend,
   \c!hoogte=\v!passend,
   \c!offset=\v!overlay,
   \c!kader=\v!uit,
   \c!straal=.5\korpsgrootte,
   \c!hoek=\v!recht,
   \c!achtergrond=,
   \c!achtergrondraster=\@@rsraster,
   \c!achtergrondkleur=,
   \c!achtergrondoffset=\!!zeropoint,
   \c!bovenkader=,
   \c!onderkader=,
   \c!linkerkader=,
   \c!rechterkader=,
   \c!kaderoffset=\!!zeropoint,
   \c!voor=,
   \c!na=,
   \c!voorwit=\v!groot,
   \c!nawit=\v!groot,
   \c!zijvoorwit=\@@bkvoorwit,
   \c!zijnawit=\@@bknawit,
   \c!marge=1em,
   \c!nboven=2,
   \c!nonder=0,
   \c!nregels=4]

\stelplaatsbloksplitsenin
  [\c!conversie=\v!letter, % \v!romeins
   \c!regels=3]

\stelwitruimtein
  [\v!geen]

\inspringen
  [\v!nooit]

\stelinspringenin
  [\v!geen]

\stelopsommingenin  % undocumented
  [\c!niveaus=6,
   \c!marge=\!!zeropoint,
   \c!springvolgendein=\v!ja,
   \c!breedte=1.5em,
   \c!factor=0,
   \c!afstand=.5em,
   \c!uitlijnen=\v!normaal,
   \c!kleur=,
   \c!letter=, % kan tzt weg
   \c!marletter=\c!type,  % \c! ???
   \c!symletter=,
   \c!kopletter=,
   \c!markleur=,
   \c!symkleur=,
   \c!kopkleur=,
   \c!kopvoor=,
   \c!kopna=\blanko,
   \c!voor=\blanko,
   \c!tussen=\blanko,
   \c!na=\blanko,
   \c!afsluiter=.,
   \c!plaatsafsluiter=\v!ja, % kan gewoon check zijn op afsluiter
   \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=\onbekend,
   \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] % njet 

\stelinmargein
  [\v!rechts]
  [\c!plaats=\v!rechts]
%  \c!uitlijnen=\v!rechts] % njet 

\versie
  [\v!definitief]

\stelpaginanummerin
  [\c!nummer=1]

\stelsubpaginanummerin
  [\c!wijze=\v!per\v!deel,
   \c!status=\v!stop]

\stelsmallerin
  [\c!links=1.5em,
   \c!rechts=1.5em,
   \c!midden=1.5em]

\stelregelnummerenin
  [\c!conversie=\v!cijfers,
   \c!start=1,
   \c!stap=1,
   \c!plaats=\v!inmarge,
   \c!letter=,
   \c!kleur=,
   \c!breedte=2em,
   \c!prefix=,
   \c!refereren=\v!aan]

\definieeropmaak
  [\v!standaard]
  [\c!breedte=\zetbreedte,
   \c!hoogte=\teksthoogte,
   \c!voffset=\!!zeropoint,
   \c!hoffset=\!!zeropoint,
   \c!pagina=\v!rechts,
   \c!dubbelzijdig=\v!leeg]

\stelpositionerenin
  [\c!eenheid=\s!cm,
   \c!factor=1,
   \c!schaal=1,
   \c!xstap=\v!absoluut,
   \c!ystap=\v!absoluut,
   \c!offset=\v!ja,
   \c!xoffset=\!!zeropoint,
   \c!yoffset=\!!zeropoint]

\stelregelsin
  [\c!voor=\blanko,
   \c!na=\blanko,
   \c!inspringen=\v!nee]

\steldoordefinierenin
  [\c!plaats=\v!links,
   \c!kopletter=\v!vet,
   \c!letter=\v!normaal,
   \c!kleur=,
   \c!kopkleur=,
   \c!breedte=8em,
   \c!afstand=0pt,
   \c!hang=,
   \c!monster=,
   \c!uitlijnen=,
   \c!marge=\v!nee,
   \c!voor=\blanko,
   \c!tussen=\blanko,
   \c!na=\blanko,
   \c!springvolgendein=\v!ja,
   \c!commando=]

\steldoornummerenin
  [\c!plaats=\v!boven,
   \c!kopletter=\v!vet,
   \c!kopkleur=,
   \c!letter=\v!normaal,
   \c!kleur=,
   \c!breedte=8em,
   \c!afstand=0pt,
   \c!hang=,
   \c!monster=,
   \c!uitlijnen=,
   \c!marge=\v!nee,
   \c!voor=\blanko,
   \c!tussen=\blanko,
   \c!na=\blanko,
   \c!springvolgendein=\v!ja,
   \c!tekst=,
   \c!niveaus=3,                % to be upward compatible
   \c!conversie=,               % to be upward compatible
   \c!wijze=\v!per\v!tekst,
   \c!sectienummer=\v!ja,
   \c!scheider=.,
   \c!afsluiter=,
   \c!nummer=,
   \c!commando=]

\stelkoppeltekenin
  [\c!teken=\compoundhyphen]

\stelnaastplaatsenin
  [\c!status=\v!stop]

\steltolerantiein
  [\v!horizontaal,\v!zeerstreng]

\steltolerantiein
  [\v!vertikaal,\v!streng]

\steluitlijnenin
  [\v!onder,
   \v!breedte]

\stelspatieringin
  [\v!opelkaar]

\definieerregister
  [\v!index]
  [\v!indices]

\definieerplaatsblok
  [\v!figuur]
  [\v!figuren]

\definieerplaatsblok
  [\v!tabel]
  [\v!tabellen]

\stelplaatsblokin
  [\v!tabel]
  [\c!kader=\v!uit]

\definieerplaatsblok
  [\v!intermezzo]
  [\v!intermezzos]

\definieerplaatsblok
  [\v!grafiek]
  [\v!grafieken]

\definieersynoniemen
  [\v!afkorting]
  [\v!afkortingen]
  [\voluit]

\stelsynoniemenin
  [\v!afkorting]
  [\c!tekstletter=\v!kapitaal,
   \c!synoniemletter=,
   \c!tekstkleur=,
   \c!synoniemkleur=,
   \c!plaats=\v!links,
   \c!breedte=5em,
   \c!status=\v!start]

\definieersorteren
  [\v!logo]
  [\v!logos]

\definieersynoniemen
  [\v!eenheid]
  [\v!eenheden]
  [\betekenis]

\stelsynoniemenin
  [\v!eenheid]
  [\c!tekstletter=\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
  [\c!status=\c!start]

\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
