summaryrefslogtreecommitdiff
path: root/tex/context/base/core-reg.tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/core-reg.tex')
-rw-r--r--tex/context/base/core-reg.tex873
1 files changed, 873 insertions, 0 deletions
diff --git a/tex/context/base/core-reg.tex b/tex/context/base/core-reg.tex
new file mode 100644
index 000000000..6b58ae107
--- /dev/null
+++ b/tex/context/base/core-reg.tex
@@ -0,0 +1,873 @@
+%D \module
+%D [ file=core-reg,
+%D version=1999.12.27,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Register Management,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D 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 / Register Management}
+
+\newif \ifautoregisterhack % for the moment a private hack
+
+% for the moment \e!register ipv #1 (evt nog \v!register)
+
+\unprotect
+
+%D Isolated but still indocumented.
+
+% 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\dodostelregisterin##1%
+ {\getparameters[\??id##1#2][#3]%
+ \preparepaginaprefix{\??id##1}}%
+ \else
+ \def\dodostelregisterin##1%
+ {\getparameters[\??id##1][#2]%
+ \doifvalue{\??id##1\c!koppeling}{\v!ja}
+ {\appendtoks\koppelregister[##1][#2]\to\everystarttext}%
+ \preparepaginaprefix{\??id##1}}%
+ \fi
+ \processcommalist[#1]\dodostelregisterin}
+
+\def\stelregisterin%
+ {\dotripleempty\dostelregisterin}
+
+\def\getlastregisterentry#1%
+ {\def\docommando##1%
+ {\def\!!stringa{##1}}%
+ \processconcanatedlist[#1][+]\docommando
+ \!!stringa}
+
+\def\doprocesspageregister[#1]#2%
+ {\begingroup
+ \thisisnextinternal{\s!ind}%
+ \ifduplicate\getlastregisterentry{#2}\fi
+ \convertexpanded{\??id\currentregister}{#2}\asciiregisterentry
+ \makesectionformat
+ \edef\schrijfwegnaarregister%
+ {\writeutility%
+ {r \ifcase\registerpagestatus\space\or e \or f \or t \fi
+ {\currentregister} %
+ {\nextinternalreference} %
+ {#1} %
+ {\asciiregisterentry} %
+ {\sectionformat::\noexpand\pagenumber} %
+ {\noexpand\realfolio}}}%
+ \schrijfwegnaarregister
+ \getfirstcharacter\currentregister
+ \registerinfo{> \firstcharacter}{#2}%
+ \endgroup}
+
+\def\complexdoregister[#1]#2%
+ {\doprocesspageregister[#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
+ \convertexpanded{\??id\currentregister}{#2}\asciiregisterentry
+ \makesectionformat
+ \edef\schrijfwegnaarregister%
+ {\writeutility%
+ {r s %
+ {\currentregister} %
+ {\nextinternalreference} %
+ {#1} %
+ {\asciiregisterentry} %
+ {#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
+ \doprocesspageregister} % 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!entryreference=\empty
+\let\c!entrya =\relax
+\let\c!entryb =\relax
+\let\c!entryc =\relax
+
+\chardef\lastregisterpagestatus=0
+
+\def\limitedregisterentry#1#2%
+ {\getvalue{\??id#1\c!tekstcommando}%
+ {\doifelsenothing{\??id#1\c!maxbreedte}
+ {#2}
+ {\limitatetext{#2}{\getvalue{\??id#1\c!maxbreedte}}{\unknown}}}}
+
+\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\limitedregisterentry{#2}{##1}}}}%
+ \gotonextinternal{\s!ind}{#4}{#6}{\box0}%
+ \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
+ \global\let\c!entryreference=\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}{\box0}%{\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\limitedregisterentry{#1}{##1}}}%
+ \getvalue
+ {#1\ifcase\currententrylevel\s!entrya\or\s!entryb\else\s!entryc\fi}%
+ {\doregisterpagehowto{#1}{\labeltexts{\v!zie}{#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\let\c!entryreference=\relax
+ \global\chardef\lastregisterpagestatus=0
+ \global\firstregisterpagefalse}}
+ {}}
+
+\def\dosetpageregisterletter#1#2%
+ {\gdef\c!entryreference%
+ {\global\let\c!entryreference=\relax
+ \doifvalue{\??id#1\c!refereren}{\v!aan}
+ {\pagereference[#1:#2]}}%
+ \gdef\c!entryletter%
+ {\global\let\c!entryletter=\relax
+ \global\utilitydonetrue
+ \getvalue{\??id#1\c!voor}%
+ \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{\strut\ignorespaces#2}}%
+ \getvalue{\??id#1\c!na}%
+ \par\nobreak} % don't use \string#2, other hack
+ {\goodbreak}}} % needed #2 can be \string...
+
+\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\c!entryreference
+ \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\c!entryreference\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\c!entryreference\hskip2em\relax
+ \dohandleregisterentry{#2}%
+ \global\firstsubsubentryfalse}}
+
+\def\dosetpageregister#1%
+ {\dosetreglevel{\getvalue{\??id#1\c!criterium}}%
+ \global\let\currentregisterentry\empty
+ \global\firstsubentrytrue
+ \global\firstsubsubentrytrue
+ \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%
+ {\doglobal\convertexpanded{\??id#1}{#2}\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}%
+ \global\let\currentregisterentry\empty
+ \global\firstsubentrytrue % not needed
+ \global\firstsubsubentrytrue % not needed too
+ \setvalue{#1\s!entrya}##1%
+ {\dosetlinkregisterentrya{#1}{##1}}%
+ \setvalue{#1\s!entry}##1%
+ {\dosetpageregisterletter{#1}{##1}}}
+
+\def\dosetlinkregisterentrya#1#2%
+ {\global\utilitydonetrue
+ \c!entryletter
+ \iflocation
+ \getalllistreferences{#1}{#2}%
+ \endgraf\hangindent1em\noindent\c!entryreference
+ %
+ %\thisissomeinternal{\s!lin}{\internallistreference}%
+ %
+ \pagereference[-:\s!lin:\internallistreference]% -: added
+ %
+ \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
+ % aangepast
+ \def\dodocommando[####1-####2]%
+ {\gotonextinternal{\s!ind}{####1}{####2}{\box0}}%
+ \doifelsevalue{\??id#1\c!interactie}{\v!paginanummer}
+ {\limitedregisterentry{#1}{#2}} % paginanummer
+ {{\setbox0=\hbox{\limitedregisterentry{#1}{\begstrut#2}}%
+ \ifx\firstlistreference\empty % tekst,alles
+ \ifx\midlistreference\empty
+ \box0
+ \else
+ \expandafter\dodocommando\expandafter[\midlistreference]%
+ \fi
+ \else
+ \expandafter\dodocommando\expandafter[\firstlistreference]%
+ \fi}}%
+ \doifvalue{\??id#1\c!nummer}{\v!ja}
+ {\hskip\getvalue{\??id#1\c!afstand}(\commalistsize)}%
+ \doifnotvalue{\??id#1\c!interactie}{\v!tekst} % paginanummer,alles
+ {\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}}%
+ \hskip\getvalue{\??id#1\c!afstand}%
+ \docommando\firstlistreference\v!vorige
+ \docommando\midlistreference\v!ergens
+ \docommando\lastlistreference\v!volgende}%
+ % tot hier
+ \else
+ \endgraf\noindent\c!entryreference
+ \limitedregisterentry{#1}{#2}%
+ \fi}
+
+%\def\dosetregister#1%
+% {\doifelsevalue{\??id#1\c!koppeling}{\v!ja}
+% {\dosetlinkregister{#1}}
+% {\dosetpageregister{#1}}}
+
+\def\dosetregister#1%
+ {\doifelsevalue{\??id#1\c!koppeling}{\v!ja}
+ {\ifautoregisterhack
+ \dosetautoregister{#1}%
+ \else
+ \dosetlinkregister{#1}%
+ \fi}
+ {\dosetpageregister{#1}}}
+
+\newcounter\internallistreference
+
+\def\doloadregisterlinks#1%
+ {\dosetreglevel{\getvalue{\??id#1\c!criterium}}%
+ \setregisterpage{#1}%
+ \global\let\currentregisterentry\empty
+ \global\firstregisterpagetrue
+ \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
+\ifautoregisterhack
+ \setxvalue{\??id#1\??id\currentregisterentry}%
+ {\internallistreference::##4}%
+\else
+ \setxvalue{\??id#1\??id\currentregisterentry}%
+ {\internallistreference::##2-##4}%
+\fi
+ \else % catches errors in index
+\ifautoregisterhack % binnen doif
+ \doifdefined{\??id#1\??id\currentregisterentry}
+ {\setxvalue{\??id#1\??id\currentregisterentry}%
+ {\getvalue{\??id#1\??id\currentregisterentry},##4}}%
+\else
+ \doifdefined{\??id#1\??id\currentregisterentry}
+ {\setxvalue{\??id#1\??id\currentregisterentry}%
+ {\getvalue{\??id#1\??id\currentregisterentry},##2-##4}}%
+\fi
+ \fi}
+ {}}}
+
+%\def\dokoppelregister[#1][#2]%
+% {\iflocation
+% \begingroup
+% \let\dosetregister=\doloadregisterlinks
+% \stelregisterin[#1][#2]%
+% \doutilities{#1}{\jobname}{#1}{}{}%
+% \endgroup
+% \fi}
+
+\def\dokoppelregister[#1][#2]%
+ {\iflocation
+ \ifcase0\countervalue{autolink:#1}\relax % only once
+ \begingroup
+ \let\dosetregister=\doloadregisterlinks
+ \stelregisterin[#1][#2]%
+ \doutilities{#1}{\jobname}{#1}{}{}%
+ \endgroup
+ \ifautoregisterhack
+ \doinitializeautoregister{#1}%
+ \else
+ \doinitializelinkregister{#1}%
+ \fi
+ \fi
+ \fi}
+
+\def\koppelregister%
+ {\dodoubleempty\dokoppelregister}
+
+\def\doprocesslinkregister[#1][#2]#3%
+ {\hbox
+ {\doprocesspageregister[#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}{\box0}}%{\copy0}}%
+ \def\docommando##1##2%
+ {\bgroup
+ \ifx##1\empty
+ \doifvalue{\??id#1\c!onbekendeverwijzing}{\v!leeg}
+ {\hskip1em}%
+ \else
+ \setbox0=\hbox to 1em{\hss\showlocation{\symbol[##2]}\hss}%
+ \expandafter\dodocommando\expandafter[##1]%
+ \fi
+ \egroup}%
+ \processaction
+ [\getvalue{\??id#1\c!plaats}]
+ [\v!midden=>\docommando\prevlistreference\v!vorige,
+ \v!links=>\docommando\prevlistreference\v!vorige
+ \docommando\nextlistreference\v!volgende]%
+ \doifreferencefoundelse{\s!lin:\internallistreference}
+ {\gotosomeinternal
+ {\s!lin}{\internallistreference}{\currentrealreference}
+ {\showlocation{\limitedregisterentry{#1}{#3}}}}
+ {\hbox{\limitedregisterentry{#1}{#3}}}%
+ \processaction
+ [\getvalue{\??id#1\c!plaats}]
+ [ \v!midden=>\docommando\nextlistreference\v!volgende,
+ \v!rechts=>\docommando\prevlistreference\v!vorige
+ \docommando\nextlistreference\v!volgende]}}
+
+\def\dodolinkedregister[#1][#2]#3% page auto link
+ {\bgroup
+ \chardef\registerpagestatus=1
+ \def\currentregister{#1}%
+ \iflocation
+ \ifautoregisterhack
+ \def\next{\doprocessautoregister[#1][#2]{#3}}%
+ \else
+ \def\next{\doprocesslinkregister[#1][#2]{#3}}%
+ \fi
+ \else
+ \def\next{\doprocesspageregister[#2]{#3}}%
+ \fi
+ \next
+ \egroup
+ \ifvmode\nobreak\fi
+ \GotoPar}
+
+\def\dolinkedregister#1%
+ {\dodoubleempty\dodolinkedregister[#1]}
+
+\def\dosetautoregister#1%
+ {\makecounter{autolink:#1}%
+ \dosetreglevel{\getvalue{\??id#1\c!criterium}}%
+ \setregisterpage{#1}%
+ \global\let\currentregisterentry\empty
+ \global\firstsubentrytrue % not needed
+ \global\firstsubsubentrytrue % not needed too
+ \setvalue{#1\s!entrya}##1%
+ {\dosetautoregisterentrya{#1}{##1}}%
+ \setvalue{#1\s!entry}##1%
+ {\dosetpageregisterletter{#1}{##1}}}
+
+\def\dosetautoregisterentrya#1#2% for the moment \e!register ipv #1
+ {\global\utilitydonetrue
+ \c!entryletter
+ \iflocation
+ \getalllistreferences{#1}{#2}%
+ \endgraf\hangindent1em\noindent\c!entryreference
+ \pagereference[-:\s!lin:\internallistreference]%
+ \pluscounter{autolink:#1}%
+ \bgroup
+ \setupinteraction[\c!kleur=,\c!contrastkleur=,\c!letter=]% kan sneller
+ \naarbox
+ {\limitedregisterentry{#1}{\begstrut#2}}%
+ [JS(SetRegisterEntry{\e!register,\countervalue{autolink:#1},#2,{\alllistreferences}})]%
+ \egroup
+ \else
+ \endgraf\noindent\c!entryreference
+ \limitedregisterentry{#1}{#2}%
+ \fi}
+
+\def\doprocessautoregister[#1][#2]#3%
+ {\hbox
+ {\doprocesspageregister[#2]{#3}%
+ \doifreferencefoundelse{\s!lin:\internallistreference}
+ {\gotosomeinternal
+ {\s!lin}{\internallistreference}{\currentrealreference}
+ {\showlocation{\limitedregisterentry{#1}{#3}}}}
+ {\hbox{\limitedregisterentry{#1}{#3}}}}}
+
+% \appendmacro aan openpaginaactie (in shipout)
+
+%D The first implementation used one main field with clones.
+%D In a 2500 page document this resulted in a rather (anoying)
+%D long start||up time. This \quote {every page its own field}
+%D solution, combined with a \quote {page open action}, works
+%D much faster, but is conceptually pretty weak.
+
+\def\complexregisterfield[#1]%
+ {\definefield[#1:\realfolio][line][\e!register]%
+ \field[#1:\realfolio]}
+
+\def\simpleregisterfield%
+ {\complexregisterfield[\e!register]}
+
+\definecomplexorsimple\registerfield
+
+\setupfield
+ [\e!register]
+ [\c!breedte=10em,
+ \c!hoogte=3ex,
+ \c!uitlijnen=\v!midden,
+ \c!optie=\v!alleenleesbaar,
+ \c!plaats=\v!laag]
+
+\def\doinitializeautoregister#1% for the moment \e!register ipv #1
+ {\useJSscripts[reg]%
+ \useJSpreamblenow{LinkedRegisters}%
+ \setupinteraction[\c!openpaginaactie=JS(UpdateRegisterField{\e!register})]%
+ \definereference[\v!reset \e!register][JS(ResetRegisterEntry{\e!register})]%
+ \definereference[\v!eerste \e!register][JS(GotoFirstRegisterEntry{\e!register})]%
+ \definereference[\v!vorige \e!register][JS(GotoPreviousRegisterEntry{\e!register})]%
+ \definereference[\v!volgende\e!register][JS(GotoNextRegisterEntry{\e!register})]%
+ \definereference[\v!laatste \e!register][JS(GotoLastRegisterEntry{\e!register})]}
+
+\def\doinitializelinkregister#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,
+ \c!plaats=\v!midden,
+ \c!maxbreedte=,
+ \c!nummer=\v!nee,
+ \c!onbekendeverwijzing=\v!leeg]%
+ \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}
+
+\definieerregister
+ [\v!index]
+ [\v!indices]
+
+% \stelregisterin[index][koppeling=ja]
+%
+% \stelveldenin
+% [register][achtergrond=raster,kader=uit]
+%
+% \stelvoettekstenin
+% [{\field[index]}]
+%
+% \stelhoofdtekstenin
+% [{\naar {first}[eersteindex]\quad
+% \naar{previous}[vorigeindex]\quad
+% \naar {next}[volgendeindex]\quad
+% \naar {last}[laatsteindex]\quad\quad
+% \naar {index}[index]}]
+%
+% \starttekst
+%
+% oeps~~~\gekoppeldeindex{oeps} \blanko
+% flop~~~\gekoppeldeindex{flop} \blanko
+% test~~~\gekoppeldeindex{test} \pagina
+% flop~~~\gekoppeldeindex{flop} \blanko
+% test~~~\gekoppeldeindex{test} \pagina
+% oeps~~~\gekoppeldeindex{oeps} \blanko
+% test~~~\gekoppeldeindex{test} \pagina
+% flop~~~\gekoppeldeindex{flop} \blanko
+% oeps~~~\gekoppeldeindex{oeps} \pagina
+%
+% \volledigeindex
+
+\protect
+
+\endinput