%D \module
%D   [       file=core-lst,
%D        version=1997.03.31,
%D          title=\CONTEXT\ Core Macros,
%D       subtitle=Lists,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 
%C details. 

\writestatus{loading}{Context Core Macros / Lists}

\unprotect 

% \getlistlevel[hoofdstuk]\test{0} \test

% can be made faster if needed

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

% Auto cross document links work by either using logical or 
% page references, depending on the general settings. The 
% locations are stored in global references where the auto tag
% number uses the text container. We use reference mapping 
% (define reference) to keep track of the current ref. 

\def\doschrijfnaarlijst#1%
  {\doifelsevalue{\??li#1\c!status}\v!start
     \dodoschrijfnaarlijst\gobblefourarguments{#1}}

\def\dodoschrijfnaarlijst#1#2#3#4%
  {\begingroup
   \def\currentlist{#1}%
   \convertexpanded{\??li\currentlist}{#3}\asciilistentry
   \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
   \doifelsevalue{\??rf\currentlist\c!status}\v!start
     {\doif{\@@sectionlevel\@@sectie}{0}\autocrossdocumentfalse}
     {\autocrossdocumentfalse}%
   % blijft nog wat zwakjes en inefficient
   \ifautocrossdocument
     \bgroup
     \thisisnextinternal\currentlist
    %\thisisdestination{\currentlist::\sectionformat}%
     \@EA\setsectieenkoppeling\@EA{\currentlist}%
     \edef\currentlevel{\@@sectionlevel\@@sectie}%
     \processcommacommand[\crossdocumentreferences]\dododoschrijfnaarlijst
     \egroup
   \else
     \thisisnextinternal\currentlist
   \fi
   \edef\next % \schrijfwegnaarlijst%
     {\writeutilitycommand%
        {\listentry%
           {\currentlist}%
           {\nextinternalreference}%
           {#2}%
           {\asciilistentry}%
           {\sectionformat\sectionseparator\sectionseparator\dopaginanummer}%
           {\noexpand\realfolio}}}%
   \next % \schrijfwegnaarlijst
   \endgroup}

\def\dododoschrijfnaarlijst#1%
  {\def\docommando##1%
     {\doifvalue{\??rf##1\c!status}\v!start
        {\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]\docommando}

% so far 

% \def\doschrijftussenlijst#1#2%
%   {\doifvalue{\??li#1\c!status}\v!start
%      {\dodoschrijftussenlijst{#1}{#2}}}
% 
% \def\dodoschrijftussenlijst#1#2%
%   {\begingroup
%    \convertargument#2\to\ascii
%    \makesectionformat
%    \doifelse{\@@nmstatus}\v!start
%      {\def\dopaginanummer{\noexpand\pagenumber}}
%      {\def\dopaginanummer{0}}%
%    \edef\schrijfwegnaarlijst%
%      {\writeutilitycommand%
%         {\listbetween%
%            {#1}%
%            {\ascii}%
%            {\sectionformat\sectionseparator\sectionseparator\dopaginanummer}%
%            {\noexpand\realfolio}}}%
%    \schrijfwegnaarlijst
%    \endgroup}
%
% no reason for indirectness 

\def\doschrijftussenlijst#1#2%
  {\doifvalue{\??li#1\c!status}\v!start
     {\begingroup
      \convertargument#2\to\ascii
      \makesectionformat
      \doifelse{\@@nmstatus}\v!start
        {\def\dopaginanummer{\noexpand\pagenumber}}
        {\def\dopaginanummer{0}}%
      \edef\next % \schrijfwegnaarlijst
        {\writeutilitycommand%
           {\listbetween%
              {#1}%
              {\ascii}%
              {\sectionformat\sectionseparator\sectionseparator\dopaginanummer}%
              {\noexpand\realfolio}}}%
      \next % \schrijfwegnaarlijst
      \endgroup}}

% experimental (no nodes in mvl), needed for naw 

\def\immediatetolist[#1]#2#3#4%
  {\begingroup
   \convertexpanded{\??li#1}{#3}\asciilistentry
   \makesectionformat
   \immediatewriteutilitycommand
     {\listentry
        {#1}{}{#2}{\asciilistentry}%
        {\sectionformat\sectionseparator\sectionseparator\number#4}%
        {\realfolio}}%
   \endgroup}

\def\immediatebetweenlist[#1]#2%
  {\begingroup
   \convertargument#2\to\asciilistentry
   \makesectionformat
   \immediatewriteutilitycommand
     {\listbetween
        {#1}{\asciilistentry}%
        {\sectionformat\sectionseparator\sectionseparator0}%
        {\realfolio}}%
   \endgroup}

\def\listentry#1%
  {\executeifdefined{#1\c!lijst}\gobblefivearguments}

\def\listbetween#1%
  {\executeifdefined{#1\c!tussen}\gobblethreearguments}

%\def\@@livariantaa% nr - tit - pag
%  {\def\lijstfill{\hskip .5em}%
%   \def\lijstskip{0em}%
%   \def\lijstwidth{0pt}}

\def\@@livarianta% nr - tit - pag
% {\def\lijstfill{\hskip 1.75em}% was \hskip.5em\hskip 1.25em
  {\def\lijstfill{\hskip .25em}% omdat nu check 
   \def\lijstskip{0em}%
   \def\lijstwidth{2em}}

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

\def\@@livariantc% nr - tit - dots - pag
  {\def\lijstfill{\hskip.5em\lijstdots\hskip.5em}%
   \def\lijstskip{5em}%
   \def\lijstwidth{0pt}}

\def\lijstdots{\leaders\hbox to .5em{\hss.\hss}\hfill}

\def\@@livariant%
  {\lijstvariantb}

\@@livariantb

\def\setlistparameter#1#2{\@EA\def\csname\??li#1#2\endcsname}

\def\dostellijstin[#1][#2]% slow -) 
  {\def\docommando##1%
     {\getparameters[\??li##1][#2]%
      \preparepaginaprefix{\??li##1}}%
   \processcommalist[#1]\docommando}

\def\stellijstin
  {\dodoubleargument\dostellijstin}

\def\dodosetlijst#1%
  {\def\geenlijst{\splitsequence{\getvalue{\??li#1\c!limittext}}}% 
   \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!maxbreedte=,
      \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!tussen=,
      \c!symbool=,
      \c!interactie=\v!sectienummer,
      \v!deel\v!nummer=\v!ja,  % nodig ? % v
      \c!label=\v!nee,
      \c!afstand=\!!zeropoint,
      \c!scheider=\@@koscheider,
      \c!limittext=\@@kolimittext,
      \c!afsluiter=,
      \c!expansie=]%
   \doifassignmentelse{#2}
     {\getparameters[\??li#1][#2]}
     {\ConvertToConstant\doifnot{#2}{}
        {\copyparameters % interactie ? 
           [\??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!limittext,
            \c!titeluitlijnen,\c!voor,\c!na,\c!tussen,\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\plaatslijst
  {\dodoubleempty\doplaatslijst}

\def\plaatsruwelijst
  {\dodoubleempty\doplaatsruwelijst}

\def\dobeginoflist
  {\begingroup
   \startopelkaar[\v!blanko]}

\def\doendoflist
  {\stopopelkaar
   \endgroup}

\def\doplaatslijst[#1][#2]%
  {\dobeginoflist
   \plaatsruwelijst[#1][#2]%
   \doendoflist}

\def\plaatsruwelijst[#1][#2]%
  {\begingroup
   \dogetcommalistelement1\from#1\to\firstlistelement
   \dostellijstin[#1][#2]%
   \doifvalue{\??li\firstlistelement\c!koppeling}\v!aan
     {\startlistreferences{#1}}%
   \dosettoclevel\??li\firstlistelement
   \honorlocalfilterlevel
   \doutilities{#1}\jobname{#1}\relax\par
   \stoplistreferences{#1}%
   \dosetlistmode
   \endgroup}

% th esimple appreach: 
%
% \def\dosettoclevel#1#2%
%   {\dosetfilterlevel{\getvalue{#1#2\c!criterium}}\empty}
%
% but we want to to support selection by number:
%
% \starttypen
% \placelist[section][criterium=chapter,number=1] \blank
% \placelist[section][criterium=chapter,number=2] \blank
% \placelist[section][criterium=chapter,number=3] \blank
%
% \chapter{first}  \section{AA} \section{BB}
% \chapter{second} \section{CC} \section{DD}
% \chapter{third}  \section{EE} \section{FF}
% \stoptypen

\def\dosettoclevel#1#2%
  {\ifundefined{#1#2\c!nummer}%
     \dosetfilterlevel{\getvalue{#1#2\c!criterium}}\empty
   \else
     \doifelsevaluenothing{#1#2\c!nummer}%
       {\dosetfilterlevel{\getvalue{#1#2\c!criterium}}\empty}
       {\setsectieenkoppeling{\getvalue{#1#2\c!criterium}}%
        \dosetfilterlevel
          {\previoussection\@@sectie}%
          {\getvalue{#1#2\c!nummer}}}%
   \fi}

\def\dosetlistmode
  {\iflijstgeplaatst
     \setsystemmode  \v!lijst 
   \else
     \resetsystemmode\v!lijst 
   \fi}

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

% \let\dohandlelistnumber\firstofoneargument
%
% can be anything, so no \expanded{\separatednumber{#1}} !

\def\dohandlelistnumber#1{\separatednumber{#1}} 

% new 

\let\currentlistsymbol\empty

\def\listsymbol[#1]#2%
  {{\dosetlistsymbol{#1}{#2}\currentlistsymbol}}

%

\def\dosetlistsymbol#1#2% kan sneller, default case afvangen 
  {\processaction
     [\getvalue{\??li#1\c!symbool}]
     [    \v!geen=>\def\currentlistsymbol%
                     {\doassigndimen{\dimen0}{\getvalue{\??li#1\c!breedte}}{1.5em}%
                      \hbox to \dimen0{}},
                1=>\def\currentlistsymbol%
                     {\strut$\bullet$},
                2=>\def\currentlistsymbol%
                     {\vrule\!!width1em\!!height1ex\!!depth\zeropoint},
                3=>\def\currentlistsymbol% 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\currentlistsymbol{\getvalue{\??li#1\c!symbool}},
      \s!default=>\doifelsevalue{\??li#1\c!prefix}\v!nee % ook nog eerste 
                    {\edef\splitlistsymbol{\removefirstprefix{#2}}}
                    {\doifelsevalue{\??li#1\c!prefix}\v!geen 
                       {\edef\splitlistsymbol{\removeallprefixes{#2}}}%
                       {\def\splitlistsymbol{#2}}}% geen \edef ivm � enz
                  \def\currentlistsymbol% kan iets efficienter met \ifdone 
                    {\doifvalue{\??li#1\c!label}\v!ja{\leftlabeltext{#1}}%
                     \strut  
                     \def\numberseparator{\getvalue{\??li#1\c!scheider}}%
                     \@EA\dohandlelistnumber\@EA{\splitlistsymbol}%
                     \getvalue{\??li#1\c!afsluiter}% 
                     \doifvalue{\??li#1\c!label}\v!ja{\rightlabeltext{#1}}}]}

\def\@@dodolijstelement{dodolijstelement}

\def\dosomelijstelement#1#2#3{#1 #2 \translatednumber[#3]}

\setvalue{\@@dodolijstelement a}{\let\dosomelijstelement\dodofixdlijstelementABC}
\setvalue{\@@dodolijstelement b}{\let\dosomelijstelement\dodofixdlijstelementABC}
\setvalue{\@@dodolijstelement c}{\let\dosomelijstelement\dodofixdlijstelementABC}
\setvalue{\@@dodolijstelement d}{\let\dosomelijstelement\dodofixdlijstelementD}
\setvalue{\@@dodolijstelement e}{\let\dosomelijstelement\dodofixdlijstelementE}
\setvalue{\@@dodolijstelement f}{\let\dosomelijstelement\dodofixdlijstelementF}
\setvalue{\@@dodolijstelement g}{\let\dosomelijstelement\dodofixdlijstelementG}

\setvalue{\@@dodolijstelement\v!geen}%
  {\def\dosomelijstelement{\dodofreevlijstelement}}

\setvalue{\@@dodolijstelement\v!vertikaal}%
  {\def\dosomelijstelement{\dodofreevlijstelement}}

\setvalue{\@@dodolijstelement\v!horizontaal}%
  {\def\dosomelijstelement{\dodofreehlijstelement}}

\setvalue{\@@dodolijstelement\v!commando}%
  {\let\dosomelijstelement\dodocommandlijstelement}

% 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\newlineinlist{\space}

\def\dolijstelement#1#2#3#4#5#6% pas op: wordt ook elders gedefinieerd
  {\doiftoclevelelse[#5]{\dodolijstelement{#1}{#2}{#3}{#4}{#5}{#6}}{}} 

\def\dodolijstelement#1#2#3#4#5#6% 
  {\getvalue{\@@dodolijstelement\getvalue{\??li#1\c!variant}}%
   %\showcomposition
   \let\@@iabreedte\!!zeropoint  % moet boolean worden
   \bgroup
   \edef\lijstelementen
     {\getvalue{\??li#1\c!paginaovergangen}}%
   \ExpandBothAfter\doifinset{#3}\lijstelementen
     {\showmessage{\m!systems}{14}{#3}%
      \pagina}%
   \egroup
   \mindermeldingen
   \setfullsectionnumber{\??li#1}%
   \dosetlistsymbol{#1}{#3}%
   \dosomelijstelement{#1}{#2}{#3}{#4}{#5}{#6}%
   \global\utilitydonetrue}

\def\dolistattributes#1#2#3%
  {\doifvaluesomething{\??li#1#3}
     {\resetinteractionparameter\c!kleur
      \resetinteractionparameter\c!contrastkleur}%
   \doattributes{\??li#1}{#2}{#3}}

\def\dodocommandlijstelement#1#2#3#4#5#6%
  {\doifdefinedelse{\??li#1\c!commando}
     {\getvalue{\??li#1\c!commando}%
        {#3}{#4}{\paginaprefix\??li#1[#5]\translatednumber[#5]}}
     {[#1: #3 - #4 - \paginaprefix\??li#1[#5]\translatednumber[#5]]}}

\def\dodofreelijstelement#1#2#3#4#5#6#7#8%
  {\def\makelijstelement##1##2%
     {\noindent % new and needed 
      \hbox
        {\doifelsevalue{\??li#1\c!interactie}{##1} % \??li ipv \??ia
           {\setbox0\hbox{\showcontrastlocation{\??li#1}{#6}{##2}}%
            \linklisttoelement{#1}{#2}{#5}{#6}{\box0}}%{\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]}}}
     {#7%
      \vbox
        {\forgetall
         \makelijstelement\v!alles
           {\makelijstelement\v!sectienummer
              {\dolistattributes{#1}\c!nummerletter\c!nummerkleur
                 {\getvalue{\??li#1\c!nummercommando}{\currentlistsymbol}}}%
            \makelijstelement\v!tekst
              {\dolistattributes{#1}\c!tekstletter\c!tekstkleur
                 {\let\\=\newlineinlist
                  \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]}}}}}}}%
      #8}%
   \getvalue{\??li#1\c!na}}

\def\dodofreehlijstelement#1#2#3#4#5#6%
  {\dodofreelijstelement{#1}{#2}{#3}{#4}{#5}{#6}
     {\noindent}{}}

\def\dodofreevlijstelement#1#2#3#4#5#6%          % \nointerlineskip nodig, 
  {\dodofreelijstelement{#1}{#2}{#3}{#4}{#5}{#6} % anders verkeerde spatiering  
     {\ifvmode\nointerlineskip\fi}               % bij multi-line lijsten 
     {\nointerlineskip\endgraf\allowbreak}}      % 

% to be documented: uitlijnen, hang 

% now also in abc 

\def\limitatedlistentry#1#2% 
  {\doifelsenothing{\??li#1\c!maxbreedte}
     {\getvalue{\??li#1\c!tekstcommando}{#2}}
     {\getvalue{\??li#1\c!tekstcommando}%
        {\limitatetext
           {#2}%
           {\getvalue{\??li#1\c!maxbreedte}}%
           {\splitsymbol{\getvalue{\??li#1\c!limittext}}}}}}

\def\dodofixdlijstelementABC#1#2#3#4#5#6% weeden
  {\endgraf
   \leftskip\getvalue{\??li#1\c!marge}% na de \endgraf !
   \getvalue{\??li#1\c!voor}%
   \!!widthc\getvalue{\??li#1\c!afstand}%
   \doifelsevalue{\??li#1\c!breedte}\v!passend
     {\!!widtha\zeropoint}
     {\doifelsenothing{#3}
        {\doifelsevalue{\??li#1\c!titeluitlijnen}\v!ja
           {\!!widtha\zeropoint
            \!!widthc\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}{\box0}}%{\copy0}}%
        {\hbox{##2}}}%
   \doifvalue{\??li#1\c!interactie}\v!tekst % not supported
     {\setlistparameter{#1}\c!interactie\v!alles}%
   \makelijstelement\v!alles
     {\hbox to \hsize
        {\dostartattributes{\??li#1}\c!letter\c!kleur\empty
         \!!widthb\hsize
         \setbox2\hbox \ifdim\!!widtha>\zeropoint to \!!widtha \fi
           {\makelijstelement\v!sectienummer
              {\dolistattributes{#1}\c!nummerletter\c!nummerkleur
                 {\getvalue{\??li#1\c!nummercommando}{\currentlistsymbol}}%
            \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
            \expanded{\steluitlijnenin[\getvalue{\??li#1\c!uitlijnen}]}%
            \ifdim\!!widtha<\hsize
              \hangindent=\wd2
              \dimen2=\!!widthc % \getvalue{\??li#1\c!afstand}%
              \advance\hangindent \dimen2
              \hangafter=1
              \doifvalue{\??li#1\c!hang}\v!nee{\hangafter\zerocount}%
              \ifdim\wd4=\zeropoint % \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
              {\let\\=\newlineinlist
               \dontconvertfont
              %\getvalue{\??li#1\c!tekstcommando}{#4}}%
               \limitatedlistentry{#1}{#4}}%
              %\carryoverpar % new otherwise wrong linespacing 
            \egroup
            \ifdim\wd4=\zeropoint\relax % \ifvoid4
              % \ifdim\!!widtha<\hsize \hfill\strut \fi % spoils align 
            \else
              \nobreak\lijstfill
              \box4\relax
              \relax
            \fi}%
         \hss
         \dostopattributes}}% new 
   \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 % leavevmode ? ? ? 
   \fi
   \doifvalue{\??li#1\c!interactie}\v!tekst % not supported
     {\setlistparameter{#1}\c!interactie\v!sectienummer}%
   \doifvalue{\??li#1\c!interactie}\v!alles % not supported
     {\setlistparameter{#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}{\box0}}%{\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]}}}}}}%
   \donetrue
   \doifnothing{#3}{\doifvaluenothing{\??li#1\c!symbool}\donefalse}%
   \ifdone
     \hbox
       {\getvalue{\??li#1\c!links}%
        \makelijstelement\v!sectienummer
          {\dolistattributes{#1}\c!nummerletter\c!nummerkleur
             {\getvalue{\??li#1\c!nummercommando}{\currentlistsymbol}}}%
          \getvalue{\??li#1\c!rechts}%
        \hskip.5em}%
     \nobreak
   \fi
   \tolerance3500 % niet zomaar veranderen
   \dolistattributes{#1}\c!tekstletter\c!tekstkleur
     {\let\\=\newlineinlist
      \dontconvertfont
     %\getvalue{\??li#1\c!tekstcommando}{#4}}%
      \limitatedlistentry{#1}{#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
     {\setupinteraction[\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
      \let\\=\newlineinlist
      \setbox0\hbox
        {#2{\showcontrastlocation\??ia{#8}%
          {\dostartattributes{\??li#3}\c!letter\c!kleur\empty
           \ignorespaces\dontconvertfont\setstrut
           \begstrut
          %\doifelsenothing{\??li#3\c!maxbreedte}
          %  {\getvalue{\??li#3\c!tekstcommando}{#6}}
          %  {\getvalue{\??li#3\c!tekstcommando}{\limitatetext{#6}{\getvalue{\??li#3\c!maxbreedte}}{\unknown}}}%
           \limitatedlistentry{#3}{#6}%
           \endstrut % struts new
           \dostopattributes}}}%
      \linklisttoelement{#3}{#4}{#7}{#8}{\box0}}%{\copy0}}%
   \par % should be an option
   \getvalue{\??li#3\c!tussen}}

% better:
%
% \def\linklisttoelement#1#2#3#4#5% % list location format page data
%   {\ifautocrossdocument
%     \gotodestination{}{}{#1::\@@filterblocknumberpart[#3]}{#4}{#5}%
%    \else
%      \gotonextinternal{#1}{#2}{#4}{#5}%
%    \fi}
%
% but for the moment:

\def\linklisttoelement#1#2#3#4#5% % list location format page data
  {\gotonextinternal{#1}{#2}{#4}{#5}}

\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\dolijstelementX#1#2#3#4#5#6%
  {\doiftoclevelelse[#5]
     {\doglobal\increment\utilitylistlength
      \hbox
        {\doattributes
          {\??li#1}\c!tekstletter\c!tekstkleur
          {\let\\=\newlineinlist
           \dontconvertfont
           \getvalue{\??li#1\c!tekstcommando}{#4}}}%
      \global\utilitydonetrue}
     {}}

\def\dobepaallijstkenmerken[#1][#2]%
  {\begingroup
   \doglobal\newcounter\utilitylistlength
   \let\dolijstelement\dolijstelementX
   \dostellijstin[#1][#2]%
   \dogetcommalistelement1\from#1\to\commalistelement
   \dosettoclevel\??li\commalistelement
   \setbox0\vbox{\doutilities{#1}\jobname{#1}\relax\par}%
   \xdef\utilitylistheight{\the\ht0}%
   \xdef\utilitylistwidth {\the\wd0}%
   \endgroup
   \dosetlistmode}

\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]%
  {\hbox\bgroup                        % the \hbox is needed to bypass
   \let\referenceprefix=\empty         % \dontleavehmode in \naarbox
   \setupinteraction[\c!kleur=,\c!contrastkleur=,\c!strut=]%
   \setupreferencing[\c!prefix=]%
   \naarbox{\hbox{\ignorespaces#1}}[#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\??rl\commalistelement
   \doutilities{#1}\jobname{#1}\relax\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\sectionseparator\sectionseparator\dopaginanummer}%
              {\noexpand\realfolio}}}%
      \schrijfwegnaarlijst
      \endgroup}}

%\def\schrijfnaarreferentielijst[#1]#2#3% #1=class #2=data #3=visualization
%  {\doifelsevalue{\??rl#1\c!status}{\v!start}
%     {\doglobal\increment\referencecounter
%      \referentiebutton
%        {#3%
%         \pagereference[\r!from\referencecounter]%
%         \doschrijfnaarreferentielijst{#1}{\referencecounter}{#2}}%
%        [\r!to\referencecounter]}
%     {#3}}

\def\schrijfnaarreferentielijst[#1]#2% #1=class #2=data #3=visualization
  {\dowithnextbox
     {\doifelsevalue{\??rl#1\c!status}\v!start
        {\doglobal\increment\referencecounter % must be resolved due to #2 
         \referentiebutton
           {\flushnextbox
            \pagereference[\r!from\referencecounter]%
            \doschrijfnaarreferentielijst{#1}{\referencecounter}{#2}}%
           [\r!to\referencecounter]}
        {\flushnextbox}}
     \hbox} % \vbox ? 

\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}

\def\dostelsamengesteldelijstin[#1][#2]%
  {\getparameters[\??ih#1][#2]%
   \expanded{\stellijstin[\getvalue{\??ih#1\c!lijst}]}[#2]}

\def\stelsamengesteldelijstin%
  {\dodoubleargument\dostelsamengesteldelijstin}

\def\doplaatssamengesteldelijst[#1][#2]%
  {\begingroup
   \getparameters[\??ih#1][#2]%
   \dosettoclevel\??ih{#1}%
   \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
     {\fullexpandoneargafter\doifnumberelse{\getvalue{\??ih#1\c!niveau}}% in verband
        {\!!counta\getvalue{\??ih#1\c!niveau}% met de vorige implementatie
         \advance\!!counta \plusone % 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
   \dosetlistmode}

\def\dodoplaatssamengesteldelijst[#1][#2]%
  {\dobeginoflist
   \dostellijstin[#1][#2]%
   \doutilities{#1}\jobname{#1}\relax\par
   \doendoflist}

\def\dovolledigesamengesteldelijst[#1][#2]%
  {\systemsuppliedtitle[#1]{\headtext{#1}}%
   \doplaatssamengesteldelijst[#1][#2]}

\def\dodefinieersamengesteldelijst[#1][#2][#3]%
  {\makerawcommalist[#2]\samengesteldelijst % for fast processing 
   \letvalue{\??ih#1\c!lijst}\samengesteldelijst 
   \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}

% new and yet undocumented (used in cocoa qa)
%
% \setupremaininglistlength
%   [left=\hss nog~,right=~ingangen]
% 
% \resetremaininglistlength
%   [section][settings]
% 
% \placelist
%   [section]
%   [before=\showremaininglistlength]
% 
% \dorecurse{100}{\section{hans}}

\definesystemvariable {ll} % ListLength

\def\setupremaininglistlength[#1]%
  {\getparameters[\??ll][#1]%
   \xdef\listlengthcounter{0}}

\setupremaininglistlength
  [\c!links=\hss,\c!rechts=,\c!nummer=\v!ja,
   \c!voor=\blanko,\c!na=\pagina,
   \c!letter=\v!kleinnormaal,\c!kleur=]

\def\resetremaininglistlength
  {\dodoubleempty\doresetremaininglistlength}

\def\doresetremaininglistlength[#1][#2]%
  {\bepaallijstkenmerken[#1][#2]% \determinelistcharacteristics[#1][#2]%
   \xdef\listlengthcounter{\number\utilitylistlength}}

\def\showremaininglistlength
  {\bgroup
   \ifnum\listlengthcounter>\plusone
     \scratchdimen\pagetotal
     \setbox\scratchbox\vbox
       {\@@llvoor\par\horizontalstrut\par\horizontalstrut\par\@@llna}%
     \advance\scratchdimen \ht\scratchbox
     \advance\scratchdimen \dp\scratchbox
     \ifdim\scratchdimen>\pagegoal
       \@@llvoor
       \nobreak\hbox to \hsize
         {\doifnot\@@llnummer\v!ja{\let\listlengthcounter\empty}%
          \doattributes\??ll\c!letter\c!kleur{\@@lllinks\listlengthcounter\@@llrechts}}
       \@@llna
     \fi 
   \fi 
   \doglobal\decrement\listlengthcounter\relax
   \egroup}

\stelreferentielijstin
  [\c!letter=\v!normaal]

\protect \endinput 
