summaryrefslogtreecommitdiff
path: root/tex/context/base/mkii/strc-sec.mkii
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-12 17:15:07 +0100
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-12 17:15:07 +0100
commit8d8d528d2ad52599f11250cfc567fea4f37f2a8b (patch)
tree94286bc131ef7d994f9432febaf03fe23d10eef8 /tex/context/base/mkii/strc-sec.mkii
parentf5aed2e51223c36c84c5f25a6cad238b2af59087 (diff)
downloadcontext-8d8d528d2ad52599f11250cfc567fea4f37f2a8b.tar.gz
2016-01-12 16:26:00
Diffstat (limited to 'tex/context/base/mkii/strc-sec.mkii')
-rw-r--r--tex/context/base/mkii/strc-sec.mkii2591
1 files changed, 2591 insertions, 0 deletions
diff --git a/tex/context/base/mkii/strc-sec.mkii b/tex/context/base/mkii/strc-sec.mkii
new file mode 100644
index 000000000..01ca71ead
--- /dev/null
+++ b/tex/context/base/mkii/strc-sec.mkii
@@ -0,0 +1,2591 @@
+%D \module
+%D [ file=strc-sec,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Sectioning,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% start-stop per section en dan combineren met sectieblok; in dat geval
+% eenvoudiger per-* acties
+
+% nummeren per sectieblok implementeren
+
+% this module needs a clean up, currently some manipulations
+% take place multiple times; also, some clever recursive level
+% thing makes more sense
+
+% in manual (zie prikkels) : tussen=\blanko is enige hook om
+% met kop-in-hoofd een spatiering af te dwingen
+
+\writestatus{loading}{ConTeXt Structure Macros / Sectioning}
+
+\unprotect
+
+% new and to be tested
+
+\unexpanded\def\separatorlist#1%
+ {\ifx\sepnumber\undefined\def\sepnumber{0}\fi
+ \increment\sepnumber
+ \getfromcommacommand[#1][\sepnumber]%
+ \ifx\commalistelement\empty
+ \getcommalistsize[#1]%
+ \def\sepnumber{\number\commalistsize}%
+ \getfromcommacommand[#1][\sepnumber]%
+ \fi
+ \commalistelement}
+
+% \setuphead[section] [separator=\separatorlist{?,!,*}]
+% \setuphead[subsection][separator=\separatorlist{??,!!,**}]
+%
+% \let\spr\separatorlist % this will enable this feature
+%
+% \setuphead[section] [separator={?,!,*}]
+% \setuphead[subsection][separator={??,!!,**}]
+%
+% \setupheads[separator={A,B,C,D,E,F}]
+% \chapter{test}
+% \section{test} \subsection{test} \subsection{test}
+% \section{test} \subsection{test} \subsection{test}
+
+% from now on, internaly numbers are separated by a period
+% and postprocessed on demand; this will change to {} {} {}
+
+\def\numberseparator {.} % reasonable default
+\def\sectionseparator{-} % was : but is now -
+
+\def\@@filterfirstpart [#1--#2]{#1}
+\def\@@filtersecondpart [#1--#2]{#2}
+
+\def\@@filterblockpart [#1--#2--#3]{#1}
+\def\@@filternumberpart [#1--#2--#3]{#2}
+\def\@@filterpagepart [#1--#2--#3]{#3}
+\def\@@filterblocknumberpart[#1--#2--#3]{#1--#2}
+
+\def\@@filterheadpart[#1]{\@EA\@@dofilterheadpart\@EA[#1-0]}
+\def\@@filtertailpart[#1]{\@EA\@@dofiltertailpart\@EA[#1-0]}
+
+\def\@@dofilterheadpart[#1-#2]{#1}
+\def\@@dofiltertailpart[#1-#2]{#2}
+
+\def\@@filterlevelpart[#1--#2--#3]{\@@dofilterlevelpart[#2-0-0-0-0]}
+
+\def\@@dofilterlevelpart[#1-0-0-0-#2]{#1}
+
+\def\gobbleuntilrelax#1\relax{}
+
+\def\separatednumber #1{\doseparatednumber #1.\empty\relax}
+\def\removefirstprefix#1{\doremovefirstprefix#1.\empty\relax}
+\def\removeallprefixes#1{\doremoveallprefixes#1.\empty\relax}
+
+\def\doseparatednumber#1.#2%
+ {#1%
+ \ifx#2\empty
+ \@EA\gobbleuntilrelax
+ \else \numberseparator
+ \@EA\doseparatednumber
+ \fi#2}
+
+\def\doremoveallprefixes#1.#2%
+ {\ifx#2\empty
+ #1\@EA\gobbleuntilrelax
+ \else
+ \@EA\doremoveallprefixes
+ \fi#2}
+
+\def\doremovefirstprefix#1.#2%
+ {\ifx#2\empty
+ #1\@EA\gobbleuntilrelax
+ \else
+ \@EA\noremovefirstprefix
+ \fi#2}
+
+\def\noremovefirstprefix#1.\empty\relax
+ {#1}
+
+% we need to expand in order to get something separatable
+
+\def\dohandleheadnumber#1%
+ {\expanded{\separatednumber{#1}}}
+
+\def\dodochecknumber#1#2#3% will become ugly after speed up
+ {\bgroup
+ \doifinstringelse{.0}{.#2}
+ {\doifnot{#3}\v!by
+ {%\debuggerinfo\m!systems{number #1 #3 becomes \getnumbervariable{#1\c!way}}%
+ \setevalue{\@@thenumber{#1}\c!way}{#3}% geen \xdef, gaat mis met \subpage
+ \dochecknumber{#1}}} % tricky and ugly
+ {\doifnotvalue{\@@thenumber{#1}\s!check}{#2}
+ {% new, calculate accumulated number
+ \scratchcounter\getvalue{\@@thenumber{#1}\c!n}\relax
+ \advance\scratchcounter\countervalue{\@@thenumber{#1}}\relax
+ \setxvalue{\@@thenumber{#1}\c!n}{\the\scratchcounter}%
+ %
+ \setcounter{\@@thenumber{#1}}{0\getvalue{\@@thenumber{#1}\c!start}}%
+ \setxvalue{\@@thenumber{#1}\c!way\c!local}{\getvalue{\@@thenumber{#1}\c!way}}%
+ \setxvalue{\@@thenumber{#1}\s!check}{#2}}}%
+ \egroup}
+
+\def\dochecknumber#1%
+ {\edef\currentsection{\csname\??by\csname\@@thenumber{#1}\c!way\endcsname\endcsname}%
+ \ifx\currentsection\empty\else
+ \dodochecknumber
+ {#1}%
+ {\csname\currentsection\c!number\endcsname}%
+ {\v!by\previoussection\currentsection}%
+ \fi}
+
+\def\checknumber[#1]%
+ {\bgroup
+ %\ifcase\blocklevel\else
+ \ifdoingblocks
+ \doifnotvalue{\@@thenumber{#1}\c!blockway}\v!no\setblockcounters
+ \fi
+ \dochecknumber{#1}%
+ \egroup}
+
+\def\rawsectionnumber#1%
+ {\countervalue{\??se#1}}
+
+\def\precedingseparator{\@@koseparator} % brrr
+
+\def\domakeprecedingsectionnumber[#1]% will become ugly after speed up
+ {\bgroup % added
+ \globallet\precedingsectionnumber\empty
+ \ifsectionnumber
+ \doifvalue{\??sb\@@sectionblock\c!number}\v!yes % added
+ {\doifelsevalue{\@@thenumber{#1}\c!sectionnumber}\v!yes
+ \donetrue\donefalse
+ \doifvalue{\@@thenumber{#1}\c!sectionnumber}\v!number
+ {\donetrue\let\@@sectionconversion\gobbleoneargument}%
+ \ifdone
+ \edef\currentsection
+ {\getvalue{\??by\getvalue{\@@thenumber{#1}\c!way\c!local}}}%
+ \doifnot\currentsection\zerosection
+ {\doifnot{\@@sectionvalue\currentsection}{0}
+ {\xdef\precedingsectionnumber
+ {\getvalue{\currentsection\c!number}%
+ \spr{\precedingseparator}}}}%
+ \fi}%
+ \fi
+ \egroup}
+
+\def\makeprecedingsectionnumber[#1]%
+ {\bgroup
+ %\ifnum\blocklevel>0
+ %\ifcase\blocklevel\else
+ \ifdoingblocks
+ \doifnotvalue{\@@thenumber{#1}\c!blockway}\v!no\setblockcounters
+ \fi
+ \domakeprecedingsectionnumber[#1]%
+ \egroup}
+
+% \def\makesectionnumber[#1]%
+% {\makeprecedingsectionnumber[#1]%
+% \xdef\composedsectionnumber%
+% {\precedingsectionnumber\convertednumber[#1]}}%
+%
+% hack needed for chinese and oldstyle in normal tex, will change
+
+\def\makesectionnumber[#1]%
+ {\bgroup
+ \forceunexpanded % i don't like this hack
+ \makeprecedingsectionnumber[#1]%
+ \xdef\composedsectionnumber% was \xdef maar dat gaat fout met font switches
+ {\precedingsectionnumber\convertednumber[#1]}%
+ \egroup}
+
+% \def\preparethenumber#1#2#3% {\??id#1} \number \result
+% {\doifelsevaluenothing{#1\c!separator}
+% {\let\numberseparator\empty
+% \let#3#2}
+% {% was \unexpanded \edef, but we need it unexpanded !
+% \edef\numberseparator{\spr{\getvalue{#1\c!separator}}}%
+% \doifelsenothing{\executeifdefined{#1\c!suffix}\empty}
+% {\edef#3%
+% {\@EA\separatednumber\@EA{#2}%
+% }}%\stp{\getvalue{#1\c!stopper}}}}
+% {\edef#3%
+% {\@EA\separatednumber\@EA{#2}%
+% \spr{\getvalue{#1\c!separator}}%
+% \getvalue{#1\c!suffix}%
+% \stp{\getvalue{#1\c!stopper}}}}}}
+%
+% some day we do a real cleanup
+
+\def\analyzenumber#1#2#3% {\??id#1} \(precedingsection)number \result
+ {% was \unexpanded \edef, but we need it unexpanded !
+ \doifelsenothing{\executeifdefined{#1\c!suffix}\empty}
+ {\let \numbersuffix \empty}
+ {\edef\numbersuffix{\spr{\getvalue{#1\c!suffix}}}}%
+ \doifelsenothing{\executeifdefined{#1\c!stopper}\empty}
+ {\let \numberstopper \empty}
+ {\edef\numberstopper{\spr{\getvalue{#1\c!stopper}}}}%
+ \doifelsenothing{\executeifdefined{#1\c!separator}\empty}
+ {\let \numberseparator \empty}
+ {\edef\numberseparator{\spr{\getvalue{#1\c!separator}}}}%
+ \let\numberprefix\empty}
+
+\def\preparefullnumber#1#2#3% {\??id#1} \(precedingsection)number \result
+ {\analyzenumber{#1}#2#3%
+ \ifx\numberseparator\empty
+ \edef\numberprefix{#2}%
+ \else
+ \edef\numberprefix{\@EA\separatednumber\@EA{#2}}%
+ \fi
+ \ifx\numbersuffix\empty
+ \ifx\numberprefix\empty
+ \let #3\empty
+ \else
+ \edef#3{\numberprefix\numberstopper}%
+ \fi
+ \else
+ \ifx\numberprefix\empty
+ \edef#3{\numbersuffix\numberstopper}%
+ \else
+ \edef#3{\numberprefix\numberseparator\numbersuffix\numberstopper}%
+ \fi
+ \fi}
+
+\def\prepareprefixnumber#1#2#3% {\??id#1} \number \result
+ {\analyzenumber{#1}#2#3%
+ \ifx\numberseparator\empty
+ \edef\numberprefix{#2}%
+ \else
+ \edef\numberprefix{\@EA\separatednumber\@EA{#2}}%
+ \fi
+ \let#3\numberprefix}
+
+\def\sectionnumberonly[#1]%
+ {\makesectionnumber[#1]%
+ \composedsectionnumber}
+
+% sectioning
+
+\newcount\nofsections
+
+\let\zerosection \v!text
+\let\firstsection\empty
+\let\lastsection \empty
+\let\@@sectie \empty
+\let\@@koppeling \empty
+
+\makecounter{\??se\v!text}
+
+\letvalueempty{\??se\v!text\c!before}
+\letvalueempty{\??se\v!text\c!after }
+
+\setvalue {\v!text\c!number}{0}
+\letvalueempty{\v!text\s!format}
+
+\letvalueempty{\??sk\v!text}
+\letvalueempty{\??sk }
+
+\letvalue{\??by }\v!text
+\letvalue{\??by\v!text }\v!text
+\letvalue{\??by\v!all }\v!text
+\letvalue{\??by\v!by }\v!text
+\letvalue{\??by\v!by\v!text}\v!text
+\letvalue{\??by\v!by\v!all }\v!text
+\letvalue{\??by\v!by\v!page}\v!text % see footnotes
+
+\def\sectionofhead#1{\executeifdefined{\??ko#1\c!section}\s!unknown}
+
+\def\setupsection
+ {\dotripleempty\dosetupsection}
+
+\def\dosetupsection[#1]%
+ {\doifdefinedelse{\??se#1}
+ {\dodosetupsection[#1]}%
+ {\dodosetupsection[\sectionofhead{#1}]}}
+
+\def\dodosetupsection[#1][#2][#3]%
+ {\doifdefined{\??se#1}
+ {\ifthirdargument
+ \getparameters[\??se#1#2][#3]%
+ \else
+ \getparameters[\??se#1][#2]%
+ \fi
+ \doifelsevalue{\??se#1\c!previousnumber}\v!yes
+ {\setvalue{#1\c!number}{\@@longsectionnumber {#1}}}
+ {\setvalue{#1\c!number}{\@@shortsectionnumber{#1}}}}}
+
+\def\docouplemarking[#1][#2]%
+ {\doifdefinedelse{\??ko#2\c!section}
+ {\docouplemarking[#1][\getvalue{\??ko#2\c!section}]}
+ {\def\donexttrackcommando##1%
+ {\edef\coupledmarkings{\getvalue{\??se##1\c!marking}}%
+ \doifelse{##1}{#2}
+ {\addtocommalist{#1}\coupledmarkings}
+ {\removefromcommalist{#1}\coupledmarkings}%
+ \setevalue{\??se##1\c!marking}{\coupledmarkings}%
+ \donexttracklevel{##1}}%
+ \donexttracklevel{\zerosection}}} % \firstsection
+
+\def\couplemarking
+ {\dodoubleargument\docouplemarking}
+
+\def\decouplemarking[#1]%
+ {\couplemarking[#1][]}
+
+\def\definesection[#1]%
+ {\doifundefined{\??se#1}
+ {\doifelsenothing\firstsection
+ {\def\firstsection{#1}%
+ \setevalue{\??se#1\c!before}{\v!text}%
+ \setevalue{\??se\v!text\c!after}{#1}}
+ {\setevalue{\??se\commalistelement\c!after}{#1}% commalistelement ?
+ \setevalue{\??se#1\c!before}{\lastsection}%
+ \setevalue{\??se\lastsection\c!after}{#1}}%
+ \advance\nofsections \plusone
+ \setevalue{\??se#1\c!level}{\the\nofsections}%
+ \letvalue{\??se#1\c!after}\empty
+ \setvalue{\e!next#1}{\@@nextsectionnumber{#1}}%
+ \setvalue{#1\c!number}{\@@longsectionnumber{#1}}%
+ \setvalue{#1\s!format}{\@@longformatnumber{#1}}%
+ \setevalue{\??by#1}{#1}%
+ \setevalue{\??by\v!by#1}{#1}%
+ \makecounter{\??se#1}%
+ \makecounter{\??se\v!last#1}% GB
+ \edef\lastsection{#1}%
+ \setvalue{\??sk#1}{#1}%
+ \letvalue{\??se#1\c!marking}\empty
+ \setupsection[#1][\c!previousnumber=\v!yes]}}%
+
+\def\previoussection#1{\csname\??se#1\c!before\endcsname}
+\def\nextsection #1{\csname\??se#1\c!after \endcsname}
+
+\let\preservedsection\v!unknown % \def\preservedsection{\firstsection}
+
+\def\checkpreservevalueafter#1% GB
+ {\ifnum\getvalue{\??se#1\c!level}<\nofsections
+ \edef\preservedsection{\getvalue{\??se#1\c!after}}%
+ \ifconditional\@@resetsubheadnumbers
+ \setcounter{\??se\v!last\preservedsection}\zerocount % {0}%
+ \else
+ \setcounter{\??se\v!last\preservedsection}{\countervalue{\??se\preservedsection}}%
+ \fi
+ \fi}
+
+\def\@@setsectionnumber#1#2%
+ {\letgvalueempty{\??se#1\s!start}% signal i.p.v. boolean
+ \setcounter{\??se#1}{#2}%
+ \checkpreservevalueafter{#1}% GB
+ \resetsectioncounters{#1}%
+ \checkpagecounter}
+
+\def\@@nextsectionnumber#1% patched by GB
+ {\letgvalueempty{\??se#1\s!start}% signal i.p.v. boolean
+ \ifnum\countervalue{\??se\v!last#1}>\zerocount
+ \setcounter{\??se#1}{\countervalue{\??se\v!last#1}}%
+ \setcounter{\??se\v!last#1}\zerocount % {0}%
+ \fi
+ \pluscounter{\??se#1}%
+ \checkpreservevalueafter{#1}%
+ \resetsectioncounters{#1}%
+ \checkpagecounter}
+
+\def\@@sectionvalue#1% % nog niet overal doorgevoerd
+ {\countervalue{\??se#1}} % zoeken op \??se
+
+% suited for chinese too:
+
+\def\@@sectionconversion#1#2% a doublure with \@@shortsectionnumber
+ {\ifnum#2=0 0\else % else troubles with \uchar
+ \@EA\ifx\csname\??se#1\@@sectionblock\c!conversion\endcsname\relax
+ \@EA\ifx\csname\??se#1\c!conversion\endcsname\relax
+ #2%
+ \else
+ \convertnumber{\getvalue{\??se#1\c!conversion}}{#2}%
+ \fi
+ \else
+ \convertnumber{\getvalue{\??se#1\@@sectionblock\c!conversion}}{#2}%
+ \fi
+ \fi}
+
+% \def\@@sectionlevel#1%
+% {\ifundefined{\??se#1\c!level}0\else\getvalue{\??se#1\c!level}\fi}
+
+\def\@@sectionlevel#1%
+ {\executeifdefined{\??se#1\c!level}0}
+
+% Omdat een markering kan worden herdefinieerd moeten we
+% eerst testen of er wel een keten||afhankelijkheid is.
+
+\def\resetsectionmarks#1% can invoke a break
+ {\ifundefined{\??se#1}%
+ \fastresetmarker[\mainmarking{#1}]% % redundant \mainmarking
+ \else
+ \let\donexttrackcommando\doresetsectionmarks
+ \donexttracklevel{#1}%
+ \fi}
+
+\def\doresetsectionmarks#1%
+ {\ifundefined{\??se#1\c!marking}\else % skip zero level
+ \fastresetmarkerlist[\csname\??se#1\c!marking\endcsname]%
+ \fi
+ \donexttracklevel{#1}}
+
+% I'm not sure if the next one is better:
+%
+% \def\doresetsectionmarks#1%
+% {\ifundefined{\??se#1\c!markering}% skip zero level
+% \donexttracklevel{#1}%
+% \else
+% \fastresetmarkerlist[\csname\??se#1\c!markering\endcsname]%
+% \fi}
+%
+% and indeed, it isn't, actually, it does not work at all, so let's drop it.
+
+% packaged:
+%
+% \def\resetsectioncounters#1%
+% {\def\donexttrackcommando##1%
+% {\resetcounter{\??se##1}%
+% \donexttracklevel{##1}}%
+% \donexttracklevel{#1}}
+%
+% nicer
+%
+% \def\doresetsectioncounters#1%
+% {\resetcounter{\??se#1}%
+% \donexttracklevel{#1}}
+%
+% obey eigennummer
+
+\def\doresetsectioncounters#1%
+ {\resetcounter{\??se#1}%
+ \letgvalue{\??se#1\c!ownnumber}\relax
+ \donexttracklevel{#1}}
+
+\def\resetsectioncounters % #1
+ {\let\donexttrackcommando\doresetsectioncounters
+ \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
+% {\edef\sectionformat
+% {\@@sectiontype\sectionseparator
+% \csname\lastsection\s!format\endcsname}}
+
+\unprotected \def\makesectionformat % we don't want eigennummers here
+ {\pushmacro\@@shortsectionnumber
+ \let\@@shortsectionnumber\@@sectionvalue
+ \edef\sectionformat
+ {\@@sectiontype\sectionseparator
+ \csname\lastsection\s!format\endcsname}%
+ \popmacro\@@shortsectionnumber}
+
+\def\dobacktracklevel#1%
+ {\doifnot{\previoussection{#1}}\zerosection
+ {\dobacktrackcommando{\previoussection{#1}}}}
+
+\def\donexttracklevel#1%
+ {\doifnot{#1}\lastsection
+ {\donexttrackcommando{\nextsection{#1}}}}
+
+\chardef\alltoclevels\zerocount
+
+\let\currentlevel\empty
+
+\def\dosetcurrentlevel#1%
+ {\global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{\lastsection\s!format}}}
+
+\def\dosetpreviouslevel#1%
+ {\global\chardef\alltoclevels\plusone
+ \globallet\currentlevel\empty
+ \def\dobacktrackcommando##1%
+ {\ifnum\countervalue{\??se##1}>\zerocount
+ \global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{\previoussection{##1}\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi}%
+ \dobacktrackcommando\lastsection}
+
+\def\dosettextlevel#1%
+ {\global\chardef\alltoclevels\plusone
+ \globallet\currentlevel\empty}
+
+\def\dosetotherlevel#1%
+ {\doifdefinedelse{\??ko#1\c!section} % beter alteratief: ook
+ {\edef\@@sectie{\getvalue{\??ko#1\c!section}}} % hoofdstuk\c!format
+ {\edef\@@sectie{#1}}%
+ \doifdefinedelse{\??se\@@sectie}
+ {\global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{\@@sectie\s!format}}}
+ {\global\chardef\alltoclevels\plusone
+ \globallet\currentlevel\empty
+ \def\dobacktrackcommando##1%
+ {\@EA\ifx\csname\??se##1\c!start\endcsname\relax
+ \dobacktracklevel{##1}%
+ \else
+ \ifnum\countervalue{\??se##1}>\zerocount
+ \global\chardef\alltoclevels\zerocount
+ \xdef\currentlevel{\getvalue{##1\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi
+ \fi}%
+ \dobacktrackcommando\lastsection}}
+
+% \def\ignoresectionconversion % brrr
+% {\let\@@sectionconversion\secondoftwoarguments}
+
+% todo: criterium=appendix|frontmatter|....
+
+\def\dosetfilterlevel#1#2% beware: this one is \let
+ {\bgroup
+ \let\@@shortsectionnumber\@@sectionvalue
+% \ignoresectionconversion
+ \edef\askedlevel{#1}%
+ \edef\askedfilter{#2}%
+ \ifx\askedlevel\v!current
+ \dosetcurrentlevel\askedlevel
+ \else\ifx\askedlevel\v!previous
+ \dosetpreviouslevel\askedlevel
+ \else\ifx\askedlevel\v!all
+ \global\chardef\alltoclevels\plusone
+ \else\ifx\askedlevel\v!text
+ \global\chardef\alltoclevels\plusone
+ \else
+ \edef\byaskedlevel{\csname\??by\askedlevel\endcsname}%
+ \ifx\byaskedlevel\v!text
+ \dosettextlevel\askedlevel
+ \else
+ \dosetotherlevel\askedlevel
+ \fi
+ \fi\fi\fi\fi
+ % experiment
+ \ifx\askedfilter\empty \else
+ \xdef\currentlevel{\currentlevel\sectionseparator\askedfilter}%
+ \fi
+ \egroup}
+
+% \def\dontsetfilterlevel#1#2%
+% {\let\currentlevel\somesavedlevel
+% \chardef\alltoclevels\zerocount}
+
+\def\dontsetfilterlevel#1#2%
+ {\let\currentlevel\somesavedlevel
+ \let\@@sectiontype\@@tocsectiontype
+ \chardef\alltoclevels\zerocount}
+
+\def\honorlocalfilterlevel % local lists will be real local
+ {\let\dosetfilterlevel\dontsetfilterlevel}
+
+% cleaner
+%
+% \def\doifnextlevelelse[#1::#2]#3#4%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}{#4}{#3}}
+% {#4}}
+% {#4}%
+% \else
+% #3%
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]#3#4%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}{#3}{#4}}
+% {#4}%
+% \else
+% #3%
+% \fi}
+%
+% faster
+%
+% \def\doifnextlevelelse[#1::#2]%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
+% \donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]%
+% {\ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% meaner
+%
+% \setuplist
+% [chapter]
+% [after={\startcolumns\placelist[section]\stopcolumns}]
+
+\def\somesavedlevel{0}
+
+% \def\dosavesomelevel[#1:0:0:0:#2]%
+% {\def\somesavedlevel{:#1}}
+
+% \def\doifnextlevelelse[#1::#2]%
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
+% \donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]%
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
+% \donefalse
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% again faster:
+
+% \def\doifnextlevelelse[#1::#2]% beware: this one is \let
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=#1
+% \def\levelstring{=:#2:}%
+% \doifincsnameelse{=\currentlevel:}\levelstring
+% {\doifincsnameelse{=\currentlevel:0}\levelstring\donefalse\donetrue}
+% \donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+%\def\doifprevlevelelse[#1::#2]% beware: this one is \let
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=#1
+% \doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \let\doiftoclevelelse\doifnextlevelelse
+% \let\doifreglevelelse\doifprevlevelelse
+% \let\doifblklevelelse\doifprevlevelelse
+%
+% we want to be able to overload them globally
+
+% This will be reimplemented some day soon
+%
+% {nn}{xx}{yy}
+%
+% -> \scan{..}{..}{0} met 0 als sentinel
+
+% still not perfect
+%
+% \def\doifnextlevelelse[#1]% !! this one is \let / uti seperator --
+% {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=\@@filterblockpart[#1]\relax
+% \edef\levelstring{=\sectionseparator\@@filternumberpart[#1]\sectionseparator}%
+% \doifincsnameelse{=\currentlevel\sectionseparator}\levelstring
+% {\doifincsnameelse{=\currentlevel\sectionseparator0}\levelstring
+% \donefalse
+% \donetrue}
+% \donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1]% !! this one is \let / uti seperator --
+% {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+% \ifcase\alltoclevels
+% \ifnum\@@sectiontype=\@@filterblockpart[#1]\relax
+% \doifinstringelse
+% {=\currentlevel\sectionseparator}
+% {=\sectionseparator\@@filternumberpart[#1]\sectionseparator}
+% \donetrue\donefalse
+% \else
+% \donefalse
+% \fi
+% \else
+% \donetrue
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+
+\def\doifnextlevelelse[#1]% !! this one is \let / uti seperator --
+ {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+ \edef\@@tocsectiontype{\@@filterblockpart[#1]}% needed for nested tocs
+ \ifcase\alltoclevels
+ \ifnum\@@sectiontype=\@@tocsectiontype\relax
+ \edef\levelstring{=\sectionseparator\@@filternumberpart[#1]\sectionseparator}%
+ \doifincsnameelse{=\currentlevel\sectionseparator}\levelstring
+ {\doifincsnameelse{=\currentlevel\sectionseparator0}\levelstring
+ \donefalse
+ \donetrue}
+ \donefalse
+ \else
+ \donefalse
+ \fi
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifprevlevelelse[#1]% !! this one is \let / uti seperator --
+ {\edef\somesavedlevel{\sectionseparator\@@filterlevelpart[#1]}%
+ \edef\@@tocsectiontype{\@@filterblockpart[#1]}% needed for nested tocs
+ \ifcase\alltoclevels
+ \ifnum\@@sectiontype=\@@tocsectiontype\relax
+ \doifinstringelse
+ {=\currentlevel\sectionseparator}
+ {=\sectionseparator\@@filternumberpart[#1]\sectionseparator}
+ \donetrue\donefalse
+ \else
+ \donefalse
+ \fi
+ \else
+ \donetrue
+ \fi
+ \ifdone
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+% we need to cover the special case of nested lists in section blocks
+%
+% \starttext
+%
+% \def\ChapterEntry#1#2#3%
+% {chapter : \hbox to \hsize{\strut\bf#2\hss#3}\endgraf\placelist[section]}
+%
+% \startfrontmatter % optional
+% \placelist[chapter][alternative=command,command=\ChapterEntry,criterium=text] \page
+% \stopfrontmatter % optional
+%
+% \startbodymatter % optional
+% \chapter{first} \section{one} test \section{two} test \page
+% \chapter{second} \section{alpha} test \section{beta} test \page
+% \stopbodymatter % optional
+%
+% \stoptext
+
+\def\doiftoclevelelse{\doifnextlevelelse}
+\def\doifreglevelelse{\doifprevlevelelse}
+\def\doifblklevelelse{\doifprevlevelelse}
+
+\def\@@longformatnumber#1%
+ {\csname\previoussection{#1}\s!format\endcsname
+ \sectionseparator
+ \@@shortsectionnumber{#1}}
+
+% \def\@@longsectionnumber#1%
+% {\ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
+% \csname\previoussection{#1}\c!nummer\endcsname.%
+% \fi
+% \@@shortsectionnumber{#1}}
+
+\def\@@longsectionnumber#1%
+ {\ifreversesectionnumbers
+ \@@shortsectionnumber{#1}%
+ \ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
+ .\csname\previoussection{#1}\c!number\endcsname
+ \fi
+ \else
+ \ifnum\countervalue{\??se\previoussection{#1}}>\zerocount
+ \csname\previoussection{#1}\c!number\endcsname.%
+ \fi
+ \@@shortsectionnumber{#1}%
+ \fi}
+
+% suited for chinese too:
+%
+% \def\@@shortsectionnumber#1%
+% {\@EA\ifx\csname\??se#1\@@sectionblock\c!conversie\endcsname\relax
+% \@@sectionvalue{#1}%
+% \else
+% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+% \fi}
+%
+% obey eigennummer
+%
+% \def\@@shortsectionnumber#1%
+% {\@EA\ifx\csname\??se#1\c!eigennummer\endcsname\relax
+% \@EA\ifx\csname\??se#1\@@sectionblock\c!conversie\endcsname\relax
+% \@EA\ifx\csname\??se#1\c!conversie\endcsname\relax
+% \@@sectionvalue{#1}%
+% \else
+% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+% \fi
+% \else
+% \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+% \fi
+% \else
+% \csname\??se#1\c!eigennummer\endcsname
+% \fi}
+
+\def\@@shortsectionnumber#1%
+ {\@EA\ifx\csname\??se#1\c!ownnumber\endcsname\relax
+ \@EA\ifx\csname\??se#1\@@sectionblock\c!conversion\endcsname\relax
+ \@EA\ifx\csname\??se#1\c!conversion\endcsname\relax
+ \@@sectionvalue{#1}%
+ \else
+ \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+ \fi
+ \else
+ \@@sectionconversion{#1}{\@@sectionvalue{#1}}%
+ \fi
+ \else
+ \csname\??se#1\c!ownnumber\endcsname
+ \fi}
+
+\def\dosetlocalsectionblock#1#2#3% new \edef's
+ {\edef\@@sectiontype {#1}%
+ \edef\@@sectionblock {#2}%
+ \edef\@@sectionblocks{#3}}
+
+% beware, the \resetsectionmarks generates some nodes that
+% will result in an additional last page, which needs to be
+% captured at the end
+
+% \def\doaroundsectionblock#1%
+% {\doifvaluesomething{\??sb#1\c!page}
+% {\ExpandFirstAfter\page[\getvalue{\??sb#1\c!page}]}%
+% \resetsectioncounters\zerosection % was firstsection
+% \resetsectionmarks\zerosection}
+
+% \def\dostartsectionblock#1#2%
+% {\begingroup
+% \doaroundsectionblock{#1}% % going to a new page or so
+% \getvalue{\??sb#1}% % set name of section block
+% \getsectionblockenvironment{#1}% % special settings, grouped
+% %\expandafter\csname#2true\endcsname % obsolete
+% \setsystemmode{#1}% % can be used in conditionals
+% \getvalue{\??sb\@@sectionblock\c!before}% this one is not to be moved!
+% \showmessage\m!structures1\@@sectionblocks}
+
+% \def\dostopsectionblock
+% {\showmessage\m!structures2\@@sectionblocks
+% \getvalue{\??sb\@@sectionblock\c!after}% don't move
+% \doaroundsectionblock\@@sectionblock
+% \endgroup}
+
+\def\doaroundsectionblock
+ {\doifvaluesomething{\??sb\@@sectionblock\c!page}
+ {\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
+ \resetsectioncounters\zerosection % was firstsection
+ \resetsectionmarks\zerosection}
+
+\def\dostartsectionblock#1#2%
+ {\begingroup
+ \getvalue{\??sb#1}%
+ \doaroundsectionblock
+% \doifvaluesomething{\??sb\@@sectionblock\c!page}{\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
+% \resetsectioncounters\zerosection % was firstsection
+% \resetsectionmarks\zerosection
+ \getsectionblockenvironment\@@sectionblock
+ \setsystemmode\@@sectionblock
+ \getvalue{\??sb\@@sectionblock\c!before}%
+ \showmessage\m!structures1\@@sectionblocks}
+
+\def\dostopsectionblock
+ {\showmessage\m!structures2\@@sectionblocks
+ \getvalue{\??sb\@@sectionblock\c!after}% don't move
+ \doaroundsectionblock
+% \doifvaluesomething{\??sb\@@sectionblock\c!page}{\page[\getvalue{\??sb\@@sectionblock\c!page}]}%
+% \resetsectioncounters\zerosection % was firstsection
+% \resetsectionmarks\zerosection
+ \endgroup}
+
+\def\dosetupsectionblock[#1]% [#2]
+ {\getparameters[\??sb#1]}
+
+\def\setupsectionblock
+ {\dodoubleargument\dosetupsectionblock}
+
+\long\def\setsectionblockenvironment#1#2%
+ {\long\setvalue{\??sb\s!do#1}{\do{#2}}}
+
+\def\getsectionblockenvironment#1%
+ {\let\do\firstofoneargument\getvalue{\??sb\s!do#1}}
+
+\setvalue{\e!start\v!sectionblockenvironment}%
+ {\dosingleargument\dostartsectionblockenvironment}
+
+\def\dostartsectionblockenvironment[#1]% evt \pushendofline \popendofline
+ {\long\def\do##1##2{\setsectionblockenvironment{#1}{##1##2}}%
+ \grabuntil{\e!stop\v!sectionblockenvironment}{\getvalue{\??sb\s!do#1}}}
+
+%D \starttyping
+%D \startsectionblockenvironment[frontpart]
+%D \setuppagenumbering[conversion=romannumerals]
+%D \stopsectionblockenvironment
+%D
+%D \startsectionblockenvironment[bodypart]
+%D \setuppagenumber[number=1]
+%D \stopsectionblockenvironment
+%D
+%D \startsectionblockenvironment[frontpart]
+%D \setuppagenumbering[conversion=character]
+%D \stopsectionblockenvironment
+%D
+%D \starttext
+%D \startfrontmatter \chapter{test} \stopfrontmatter
+%D \startbodymatter \chapter{test} \stopbodymatter
+%D \startappendices \chapter{test} \stopappendices
+%D \stoptext
+%D \stoptyping
+
+% We used to use the first char as id, but a counter is
+% better, because in english we get a name clash.
+
+\newcounter\currentsectionblock
+
+\def\currentsection{\@@sectionblock}
+
+\def\dodefinesectionblock[#1][#2][#3]%
+ {\getparameters
+ [\??sb#1]
+ [\c!number=\v!yes,
+ \c!page=\v!right, % anders worden marks te vroeg gereset !
+ %\c!before=,
+ %\c!after=,
+ #3]%
+ \expandafter\newif\csname if#2\endcsname % better a mode
+ \doglobal\increment\currentsectionblock
+ \setsectionblockenvironment{#1}{}%
+ \setevalue{\??sb #1}{\noexpand\dosetlocalsectionblock{\currentsectionblock}{#1}{#2}}%
+ \setvalue {\e!start#2}{\dostartsectionblock{#1}{#2}}%
+ \setvalue {\e!stop #2}{\dostopsectionblock}}
+
+\def\definesectionblock
+ {\dotripleargument\dodefinesectionblock}
+
+\def\sectionblocklabel#1#2%
+ {\@EA\ifx\csname\??ko#1\@@sectionblock\c!label\endcsname\relax
+ \labeltexts{#1}{#2}%
+ \else
+ \labeltexts{\getvalue{\??ko#1\@@sectionblock\c!label}}{#2}%
+ \fi}
+
+\dosetlocalsectionblock{2}{\v!bodypart}{\v!bodymatter} % hm, dirty
+
+\def\setsectiontype[#1]%
+ {\getvalue{\??sb#1}}
+
+\def\writesection#1#2#3% #3 -> \asciititle
+ {\bgroup
+ \edef\!!stringa{#1}%
+ \@EA\writestatus\@EA
+ {\!!stringa}
+ {\ifsectionnumber#2\else(#2)\fi\normalspace\asciititle}%
+ \egroup}
+
+\def\@@kolevel{1} \def\headlevel{\@@kolevel}
+
+\def\dohandlepagebreakAA#1%
+ {\ifnum\lastpenalty>0
+ \global\pagebreakdisabledtrue
+ \fi}
+
+% \setuphead[section][aligntitle=float] % permits title next to sidefloat
+%
+% \placefigure[left]{}{} \section{\dorecurse{10}{bagger }} \input tufte
+
+% \def\dohandlepagebreakAB#1% will be replaced by a more clever (signaling) mechanism (in beta)
+% {\doifnotvalue{\??ko#1\c!aligntitle}\v!float\flushsidefloats
+% \getvalue{\??ko#1\c!before}%
+% % \whitespace vervangen door \noindent elders
+% \relax
+% \ifpagebreakdisabled
+% \global\pagebreakdisabledfalse
+% \else
+% \!!countb\getvalue{\??se\@@sectie\c!level}\relax
+% \ifnum\!!countb>\@@kolevel\relax
+% \!!counta20000
+% \multiply\!!countb 500
+% \advance\!!counta \!!countb
+% \dosomebreak{\penalty\!!counta}%
+% \else
+% \dosomebreak\allowbreak
+% \fi
+% \fi
+% \doifvalue{\??ko#1\c!aligntitle}\v!float\indent
+% \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}}
+
+\chardef\somebreakmethod\plusone
+
+\def\dohandlepagebreakAB#1% will be replaced by a more clever (signaling) mechanism (in beta)
+ {\doifnotvalue{\??ko#1\c!aligntitle}\v!float\flushsidefloats
+ \getvalue{\??ko#1\c!before}%
+ % \whitespace vervangen door \noindent elders
+ \relax
+ \ifpagebreakdisabled
+ \global\pagebreakdisabledfalse
+ \else
+ \ifcase\somebreakmethod
+ % 0 = nothing
+ \or
+ % 1 = old weighted version
+ \!!countb\getvalue{\??se\@@sectie\c!level}\relax
+ \ifnum\!!countb>\@@kolevel\relax
+ \!!counta20000
+ \multiply\!!countb 500
+ \advance\!!counta \!!countb
+ \dosomebreak{\penalty\!!counta}%
+ \else
+ \dosomebreak\allowbreak % brr
+ \fi
+ \or
+ % 2 = strict version
+ \dosomebreak{\penalty\maxdimen}%
+ \else
+ % nothing
+ \fi
+ \fi
+ \doifvalue{\??ko#1\c!aligntitle}\v!float\indent
+ \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}}
+
+\def\dohandlepagebreakBB#1#2#3%
+ {%\doifinsetelse{\getvalue{\??tk#2\c!state}}{\v!normal,\v!start}
+ \doifelselayouttextline{#2}
+ {\doifvaluesomething{\??ko#1#3}
+ {\setuplayouttext[#2][\c!state=\getvalue{\??ko#1#3}]}}
+ \donothing}
+
+\def\dohandlepagebreakB#1%
+ {\doifvaluesomething{\??ko#1\c!page}
+ {\def\resetcurrentsectionmarks% toegevoegd, zie \page
+ {\resetsectionmarks{\previoussection\@@sectie}}%
+ \page[\getvalue{\??ko#1\c!page}]%
+ \dohandlepagebreakBB{#1}\v!header\c!header
+ \dohandlepagebreakBB{#1}\v!text \c!text
+ \dohandlepagebreakBB{#1}\v!footer\c!footer}}
+
+\def\dohandlepagebreakX#1% zie doordefinieren / boven
+ {\bgroup
+ \!!countb\@@kolevel
+ \advance\!!countb #1
+ \multiply\!!countb 500
+ \!!counta20000
+ \advance\!!counta \!!countb
+ \dosomebreak{\penalty\!!counta}%
+ \egroup}
+
+\newconditional\ignorehandlepagebreak
+
+\def\handlepagebreak#1%
+ {\ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \dohandlepagebreakAA{#1}%
+ \ifnum\countervalue{\??se\previoussection\@@sectie}>\zerocount\relax
+ \ifnum\countervalue{\??se\@@sectie}>\zerocount
+ \dohandlepagebreakB{#1}%
+ \else
+ \doifnotvalue{\??ko#1\c!continue}\v!yes{\dohandlepagebreakB{#1}}%
+ \fi
+ \else
+ \dohandlepagebreakB{#1}%
+ \fi
+ \dohandlepagebreakAB{#1}%
+ \fi}
+
+\def\handlenopagebreak#1%
+ {\ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \xdef\@@kolevel{\getvalue{\??se\@@sectie\c!level}}%
+ \nobreak
+ \fi}
+
+\def\localheadheight {\strutht}
+\def\localheaddepth {\strutdp}
+\def\localheadlineheight{\lineheight}
+
+\def\dolocalheadsetup#1% koppeling met standaard kopcommando / engels
+ {\forgetall % traag dus ...
+ \doifvaluesomething{\??ko#1\c!align} % wordt al expanded in spa
+ {\expanded{\setupalign[\getvalue{\??ko#1\c!align}]}}%
+ \doifvaluesomething{\??ko#1\c!tolerance} % wordt al expanded in spa
+ {\expanded{\setuptolerance[\getvalue{\??ko#1\c!tolerance}]}}%
+ \doifvalue{\??ko#1\c!strut}\v!no % wordt al expanded in spa
+ {\setnostrut}% new
+ \def\\{\crlf\strut\ignorespaces}}
+
+\def\localkopsetup{\localheadsetup} % kan tzt weg
+
+% todo: make them conditionals:
+
+\newif\ifincrementnumber
+\newif\ifreversesectionnumbers % todo: key/val
+\newif\ifsectionnumber \sectionnumbertrue
+\newif\ifdisplaysectionhead \displaysectionheadtrue
+\newif\ifplacehead
+\newif\ifemptyhead
+\newif\ifwritetolist
+\newif\ifheadnumber
+\newif\ifheadnumbercontent % niet meer wijzigen / wordt mode
+\newif\ifheadprefix
+\newif\ifsomeheadconversion
+
+% new
+
+\newconditional\@@resetsubheadnumbers
+
+\def\setsectieenkoppeling#1%
+ {\edef\@@koppeling{\getvalue{\??ko#1\c!coupling}}%
+ \edef\@@sectie{\getvalue{\??ko#1\c!section}}%
+ \doifnothing\@@koppeling
+ {\edef\@@koppeling{#1}}%
+ \doifnothing\@@sectie
+ {\edef\@@sectie{\getvalue{\??ko\@@koppeling\c!section}}}}
+
+% \handlepagebreak 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>
+
+\let\finalsectionnumber\empty
+
+\def\dofinalsectionnumber
+ {\ifundefined{\@@sectie\c!number}\else
+ \ifsomeheadconversion
+ \@@shortsectionnumber\@@sectie
+ \else
+ \getvalue{\@@sectie\c!number}%
+ \fi
+ \fi}
+
+\def\findsectionnumber#1#2#3% class file title / uti seperator --
+ {\begingroup
+ \setsectieenkoppeling{#1}%
+ \xdef\foundsectionnumber{1}%
+ \def\dolistelement##1##2##3##4##5##6%
+ {\doif{##1}{#1}
+ {\ConvertConstantAfter\doif{##4}{#3}
+ {\global\utilitydonetrue
+ \scratchcounter=0\getvalue{\??se\@@sectie\c!level}%
+ %
+ %\advance\scratchcounter 2
+ %\@EA\def\@EA\do\@EA####\@EA1\sectionseparator####2]%
+ % {\advance\scratchcounter -1
+ % \ifcase\scratchcounter
+ % \xdef\foundsectionnumber{####1}%
+ % \else
+ % \do####2]%
+ % \fi}%
+ %\do##5]}}}%
+ %
+ \def\do####1\relax % :/- clean
+ {\advance\scratchcounter \minusone
+ \ifcase\scratchcounter
+ \xdef\foundsectionnumber{\@@filterheadpart[####1]}%
+ \else
+ \@EAEAEA\do\@@filtertailpart[####1]\relax
+ \fi}%
+ \@EA\do\@@filternumberpart[##5]\relax}}}%
+ \setbox0\vbox
+ {\doutilities{#1}{#2}{#1}\relax\relax}%
+ \endgroup
+ \doifnumberelse\foundsectionnumber
+ {\doif\foundsectionnumber\!!zerocount
+ {\globallet\foundsectionnumber\!!plusone}}
+ {\globallet\foundsectionnumber\!!plusone}% an appendix or so
+ \setupheadnumber[#1][\foundsectionnumber]%
+ \setupheadnumber[#1][-1]}
+
+% deal with eigennummer
+
+\def\setsomeheadconversion#1#2%
+ {\someheadconversionfalse
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes
+ {\setgvalue{\??se\@@sectie\c!ownnumber}{#2}%
+ \def\someheadconversion{#2}}
+ {\letgvalue{\??se\@@sectie\c!ownnumber}\relax
+ \determineheadnumber[#1]%
+ \@EA\ifx\csname\??se\@@sectie\@@sectionblock\c!headconversion\endcsname\relax
+ \@EA\ifx\csname\??se\@@sectie\c!headconversion\endcsname\relax
+ \def\someheadconversion{#2}%
+ \else
+ \@EA\ifx\csname\??se\@@sectie\c!headconversion\endcsname\empty
+ \def\someheadconversion{#2}%
+ \else
+ \someheadconversiontrue
+ \def\someheadconversion%
+ {\fullsectionnumber{#1}{\getvalue{\??se\@@sectie\c!headconversion}}{#2}}%
+ \fi
+ \fi
+ \else
+ \@EA\ifx\csname\??se\@@sectie\@@sectionblock\c!headconversion\endcsname\empty
+ \def\someheadconversion{#2}%
+ \else
+ \someheadconversiontrue
+ \def\someheadconversion%
+ {\fullsectionnumber{#1}{\getvalue{\??se\@@sectie\@@sectionblock\c!headconversion}}{#2}}%
+ \fi
+ \fi}}
+
+\def\writtenfullsectionnumber
+ {\string\fullsectionnumber}
+
+\def\ignoredfullsectionnumber#1#2#3%
+ {#3}
+
+\let\storedfullsectionnumber\relax
+
+\def\expandablefullsectionnumber#1#2#3%
+ {\convertnumber{#2}{#3}}
+
+\unexpanded\def\naturalfullsectionnumber#1#2#3%
+ {\sectionblocklabel{#1}{\convertnumber{#2}{#3}}}
+
+\unexpanded\def\limitedfullsectionnumber#1#2#3%
+ {\convertnumber{#2}{#3}}
+
+\def\setfullsectionnumber#1%
+ {\doifelsevalue{#1\c!headconversion}\v!yes
+ {\doifelsevalue{#1\c!headlabel}\v!yes
+ {\let\fullsectionnumber\naturalfullsectionnumber}
+ {\let\fullsectionnumber\limitedfullsectionnumber}}
+ {\let\fullsectionnumber\ignoredfullsectionnumber}}
+
+\let\fullsectionnumber\limitedfullsectionnumber
+
+% from cont-new:
+
+\def\expandifnonempty#1%
+ {\@EA\ifx\csname#1\endcsname\empty
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi
+ {\csname#1\endcsname}}
+
+\def\@@sectiekoppeling#1%
+ {\expandifnonempty{\??ko#1\c!coupling}{#1}}
+
+\def\@@sectiesectie#1%
+ {\expandifnonempty{\??ko#1\c!section}{\@@sectiekoppeling{#1}}}
+
+\def\sectioncountervalue#1%
+ {\@@sectionvalue{\@@sectiesectie{#1}}}
+
+% \dodododoconstructhead IS NON GROUPED, SO WE NEED TO RESTORE !!!!
+%
+% dit kan dus beter \everyaroundhead zijn
+
+\let\currentheadnumber\empty
+\let\currentheadtext \empty
+
+\def\dodoconstructhead#1[#2]#3% [ref] {title}
+ {\doifelsevalue{\??ko#1\c!ownnumber}\v!yes
+ {\doquadruplegroupempty\dododoconstructhead{#1}{#2}{#3}}
+ {\fourthargumentfalse \dododoconstructhead{#1}{#2}{#3}{}}}
+
+\def\dododoconstructhead#1#2#3#4% [ref] {own} {title}
+ {\iffourthargument
+ \def\next{\dodododoconstructhead{#1}[#2]{#3}{#4}}%
+ \else
+ \def\next{\dodododoconstructhead{#1}[#2]{\finalsectionnumber}{#3}}%
+ \fi
+ \next}
+
+% pas met \ExpandFirstAfter op bij twee||taligheid
+
+\ifx\dohandleheadnumber\undefined
+ \let\dohandleheadnumber\firstofoneargument
+\fi
+
+\unexpanded\def\\{\space}
+
+\def\emptyheadcorrection % experimental, should work
+ {\ifemptyhead % well with na=\blank
+ \vskip-\lineheight
+ \dosomebreak\nobreak
+ \kern\zeropoint
+ \prevdepth\strutdepth
+ \fi}
+
+\let\localkopprefix\empty
+
+\def\headparameter#1% to do: everywhere in core-sec
+ {\executeifdefined{\??ko\currenthead#1}\empty}
+
+% todo: write to list etc in both args or in enclosing h/vbox else it gets
+% lost when no #1 or #2 is typeset
+
+% we will use variables here
+
+\def\dodododoconstructhead#1[#2]#3#4% [ref] {number} {title}
+ {\def\currenthead{#1}% dus #1 overal vervangen
+ \let\finalsectionnumber\dofinalsectionnumber % overloaded ungrouped -)
+ \unexpanded\def\\{\space}%
+ \edef\numberseparator{\spr{\getvalue{\??ko\currenthead\c!separator}}}%
+ \flushingcolumnfloatsfalse % {number} can be \finalsectionnumber
+ \someheadconversionfalse
+ \let\fullsectionnumber\limitedfullsectionnumber
+ \setsectieenkoppeling{#1}%
+ \doifelsevaluenothing{\??ko#1\c!prefix}
+ \headprefixfalse\headprefixtrue
+ \ifheadprefix
+ \doifelsevalue{\??ko#1\c!prefix}{+}
+ {\doifelsenothing{#2}
+ {\def\localkopprefix{+}}
+ {\def\localkopprefix{#2}}} % eigenlijk alleen eerste
+ {\edef\localkoprefix{\getvalue{\??ko#1\c!prefix}}}%
+ \else
+ \let\localkoprefix\empty
+ \fi
+ \placeheadtrue
+ \processaction
+ [\getvalue{\??ko#1\c!placehead}]
+ [ \v!yes=>\emptyheadfalse,
+ \v!empty=>\emptyheadtrue,
+ \v!no=>\emptyheadtrue\placeheadfalse]%
+ \doifelsevalue{\??ko#1\c!resetnumber}\v!no
+ {\setfalse\@@resetsubheadnumbers}%
+ {\settrue \@@resetsubheadnumbers}%
+ \writetolistfalse
+ \processaction
+ [\getvalue{\??ko#1\c!incrementnumber}]
+ [ \v!yes=>\incrementnumbertrue,
+ \v!no=>\incrementnumberfalse,
+ \v!list=>\incrementnumberfalse
+ % beware, since no numbers are used, no nested lists are
+ % possible here
+ \writetolisttrue,
+ \s!unknown=>{\ifx\currentproduct\empty
+ \findsectionnumber{#1}\commalistelement{#4}%
+ \fi
+ \incrementnumbertrue}]%
+ \edef\numberheaddistance {\getvalue{\??ko#1\c!distance}}%
+ \edef\numberheadalternative{\getvalue{\??ko#1\c!alternative}}%
+ \doifelsevalue{\??ko:\numberheadalternative}\v!horizontal
+ \displaysectionheadfalse
+ \displaysectionheadtrue
+ \ifsectionnumber
+ \doifelsevalue{\??sb\@@sectionblock\c!number}\v!yes
+ {\doifelsevalue{\??ko#1\c!number}\v!yes
+ \headnumbertrue
+ \headnumberfalse}
+ {\headnumberfalse}%
+ \else
+ \headnumberfalse
+ \fi
+ \defconvertexpanded\asciititle{\getvalue{\??ko#1\c!expansion}}{#4}%
+ %
+ \gdef\currentheadtext{#4}% scheelt args
+ \globallet\currentheadnumber\empty
+ %
+ \ifincrementnumber
+ \ifplacehead
+ \checknexthead\handlepagebreak{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \ifheadprefix
+ %\setupreferencing[\c!prefix=-]%
+ \setupreferenceprefix[-]%
+ \fi
+ \getvalue{\e!next\@@sectie}%
+ \ifheadnumber
+ \setsomeheadconversion{#1}{#3}%
+ \let\fullsectionnumber\expandablefullsectionnumber
+ \xdef\currentheadnumber{\someheadconversion}%
+ \getvalue{\??ko#1\c!inbetween}%
+ \ifsomeheadconversion
+ \let\fullsectionnumber\naturalfullsectionnumber
+ \doplaceheadnumbertext
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \pagetype[\@@koppeling]%
+ \let\fullsectionnumber\writtenfullsectionnumber
+ \rawreference\s!sec{#2}{{\someheadconversion}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \let\fullsectionnumber\writtenfullsectionnumber
+ \dowritetolist\@@koppeling\someheadconversion{#4}\v!head}%
+ {\dohandleheadnumber\someheadconversion}% handle is new
+ {#4}
+ {\marking[#1]{#4}%
+ \let\fullsectionnumber\storedfullsectionnumber
+ \expanded{\marking[#1\v!number]{\someheadconversion}}}%
+ \let\fullsectionnumber\ignoredfullsectionnumber
+ \writesection{#1}{\someheadconversion}{#4}%
+ \else
+ \doplaceheadnumbertext
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \pagetype[\@@koppeling]%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \dowritetolist\@@koppeling{#3}{#4}\v!head}
+ {\sectionblocklabel{#1}{\dohandleheadnumber{#3}}}% handle is new
+ {#4}
+ {\marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % rommelig omdat
+ {\edef\finalsectionnumber{#3}} % #3 al is toegekend
+ {\determineheadnumber[#1]}% migreert naar 3e argument
+ \expanded{\marking[#1\v!number]{\finalsectionnumber}}}%
+ \writesection{#1}{#3}{#4}%
+ \fi
+ \else
+ \getvalue{\??ko#1\c!inbetween}%
+ \doplaceheadtext
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \pagetype[\@@koppeling]%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % brrr, new per 18/1/2005, sometimes we need
+ {\dowritetolist\@@koppeling{#3}{#4}\v!head} % entries in the list (special purpose) but
+ {\dowritetolist\@@koppeling {}{#4}\v!head}% not in the header, ok we could pop in a command
+ }% \dowritetolist\@@koppeling{}{#4}\v!head}
+ {#4}
+ {\marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes % brrr
+ {\edef\finalsectionnumber{#3}}
+ {\determineheadnumber[#1]}%
+ % todo : geen markering (leeg maken)
+ \expanded{\marking[#1\v!number]{\finalsectionnumber}}}%
+ \writesection{#1}{-}{#4}%
+ \fi
+ \ifheadprefix
+ \setupreferenceprefix[\localkopprefix]%
+ \fi
+ \ifdisplaysectionhead
+ \dosomebreak\nobreak
+ \emptyheadcorrection
+ \getvalue{\??ko#1\c!after}%
+ \fi
+ \else
+ % Whatever future tex's will do with nodes,
+ % we assume a node here, because other \c!after=\blank
+ % will fail! See 'prikkels'
+ %
+ % so, maybe we need an explicit \kern
+ %
+ % do nothing / should be vbox to 0pt
+ %
+ \checknexthead\dohandlepagebreakB{#1}% toegevoegd ivm subpaginanr / tug sheets
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \ifheadprefix
+ \setupreferenceprefix[-]%
+ \fi
+ \getvalue{\e!next\@@sectie}%
+ \ifheadnumber
+ \setsomeheadconversion{#1}{#3}%
+ \let\fullsectionnumber\expandablefullsectionnumber
+ \xdef\currentheadnumber{\someheadconversion}%
+ \fi
+ \getvalue{\??ko#1\c!inbetween}% documenteren, is enige hook
+ \bgroup
+ \setsectionlistreference{\@@sectie}{#1}%
+ \resetsectionmarks\@@sectie
+ \marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!ownnumber}\v!yes
+ {\edef\finalsectionnumber{#3}}
+ {\determineheadnumber[#1]}%
+ \expanded{\marking[#1\v!number]{\finalsectionnumber}}%
+ \pagetype[\@@koppeling]%
+% \bgroup
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \ifheadnumber
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \dowritetolist\@@koppeling{#3}{#4}\v!head
+ \writesection{#1}{#3}{#4}%
+ \else % hm, also no own number
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}%
+ \dowritetolist\@@koppeling{}{#4}\v!head
+ \writesection{#1}{-}{#4}%
+ \fi
+ \egroup
+ \ifheadprefix
+ \setupreferenceprefix[\localkopprefix]%
+ \fi
+ \fi
+ \else
+ % todo : ref prefix
+ \ifplacehead
+ \checknexthead\handlepagebreak{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \getvalue{\??ko#1\c!inbetween}%
+ \doplaceheadtext
+ {#1}
+ {\forcesectiontolist{#1}{#4}%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}} % #3 ?
+ {#4}
+ %{}% new:
+ {\marking[#1]{#4}%
+ \marking[#1\v!number]{}}%
+ \writesection{#1}{-}{#4}%
+ \ifdisplaysectionhead
+ \dosomebreak\nobreak
+ \emptyheadcorrection
+ \getvalue{\??ko#1\c!after}%
+ \fi
+ \else
+ % do nothing / should be vbox to 0pt
+ \checknexthead\handlepagebreak{#1}%
+ \setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
+ \getvalue{\??ko#1\c!inbetween}%
+ \forcesectiontolist{#1}{#4}%
+ \rawreference\s!sec{#2}{{#3}{\asciititle}}% #3 ?
+ \marking[#1]{#4}%
+ \marking[#1\v!number]{}%
+ \writesection{#1}{-}{#4}%
+ \fi
+ \fi
+ \flushingcolumnfloatstrue
+ \someheadconversionfalse
+ \setfalse\ignorehandlepagebreak
+ \let\fullsectionnumber\limitedfullsectionnumber
+ % ignorespaces prevents spaces creeping in when after=\dontleavehmode
+ \ifdisplaysectionhead\ignorespaces\else\expandafter\GotoPar\fi}
+
+\def\forcesectiontolist#1#2%
+ {\ifwritetolist
+ % we need to make sure that there is a number set (non
+ % zero) else the list mechanism cannot determine the
+ % level
+ \bgroup
+ \setupheadnumber[#1][+1]% traag, wordt \getvalue{\c!next...}
+ \setlistparameter\@@koppeling\c!expansion{\getvalue{\??ko#1\c!expansion}}%
+ \dowritetolist\@@koppeling{}{#2}\v!head
+ \setupheadnumber[#1][-1]% traag, wordt \getvalue{\c!previous...}
+ \egroup
+ \fi}
+
+\let\previoussectionformat\empty
+\let\currentsectionformat \empty
+
+\let\updatelistreferences \relax
+\let\updatedlistreferences\empty
+
+\def\setsectionlistreference#1#2%
+ {\ifnum\countervalue{\??se\previoussection{#1}}>0\relax
+ \xdef\previoussectionformat{\@@longformatnumber{\previoussection{#1}}}%
+ \else
+ \globallet\previoussectionformat\empty
+ \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!previouslocal#1}{\s!lst:#1\previoussectionformat}%
+ \setxvalue{\e!currentlocal#1}{\s!lst:#1\currentsectionformat}%
+ \doifelse{\currentsectionformat}{}
+ {\setglobalcrossreference
+ {\e!previous#1}{}{\realfolio}{}}
+ {\setglobalsystemreference\rt!list
+ {\e!previous#1}{\getvalue{\e!previouslocal#1}}}%
+ \def\stoplistreferences{\dostoplistreferences{#1}}}
+
+\def\dostoplistreferences#1%
+ {\ifutilitydone
+ \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal)
+ \globallet\updatedlistreferences\updatedlistreferences % een noodverbandje
+ \gdef\updatelistreferences%
+ {\def\docommand####1%
+ {\setglobalsystemreference\rt!list
+ {\e!previous####1}{\getvalue{\e!currentlocal####1}}}%
+ \processcommacommand[\updatedlistreferences]\docommand
+ \globallet\updatelistreferences\relax
+ \globallet\updatedlistreferences\empty}%
+ \fi}
+
+\let\stoplistreferences\relax
+
+\appendtoks
+ \updatelistreferences
+\to\aftereverypage
+
+% \prevdepth\strutdp % is belangrijk, vergelijk naast elkaar:
+%
+% \subject{test} \input tufte
+% \subject{test} \strut \input tufte
+% \subject{test} \placelist[...]
+
+% todo: kap
+
+% to be documented: \placeheadtext \placeheadnumber
+
+\unexpanded\def\placeheadtext
+ {\doquintupleempty\doplaceheadtextornumber
+ [\c!textstyle][\c!textcolor][\empty]}
+
+\unexpanded\def\placeheadnumber
+ {\doquintupleempty\doplaceheadtextornumber
+ [\c!numberstyle][\c!numbercolor][\v!number]}
+
+\def\doplaceheadtextornumber[#1][#2][#3][#4][#5]%
+ {\bgroup
+ \edef\@@sectie{\??ko\iffifthargument#5\else#4\fi}%
+ \dostartattributes\@@sectie\c!style\c!color\empty
+ \dontconvertfont
+ \dostartattributes\@@sectie{#1}{#2}\empty
+ \setupinterlinespace
+ \begstrut\getmarking[\mainmarking{#4#3}]\endstrut
+ \endgraf
+ \dostopattributes
+ \dostopattributes
+ \egroup}
+
+\chardef\headtimingmode=0
+
+% \chardef\headtimingmode=1 % 0 also works ok now too
+%
+% Martin Kolarik's problem:
+%
+% \setuphead[section][command=\doTitle]
+%
+% \def\doTitle#1#2%
+% {\ruledvbox{\forgetall \hsize=4cm
+% \ruledhbox{\ruledvtop{#1}\ruledvtop{#2}}}}
+%
+% \section{test test test test test test test test test test
+% test test test test test test test}
+
+\newevery \everyheadstart \relax
+
+\def\placeheadmargintexts#1%
+ {\the\everyheadstart
+ \doifvalue{\??ko#1\c!margintext}\v!yes\placemargincontent}
+
+\def\doplaceheadtext#1#2#3#4%
+ {\beginheadplacement{#1}%
+ \ifemptyhead % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi to \zeropoint
+ {\headnumbercontentfalse
+ \resetsystemmode\v!sectionnumber
+ #2}%
+ \makestrutofbox0
+ \else % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
+ {\headnumbercontentfalse
+ \resetsystemmode\v!sectionnumber
+ % less interfering
+ \ifcase\headtimingmode\or#2\fi
+ % outerside font determines distance
+ \dosetfontattribute{\??ko#1}\c!style
+ % but we don't want color to influence user commands
+ % todo: get the if-else out of it
+ \getvalue{\??ko#1\c!command}
+ {} % no number
+ {\dostartattributes{\??ko#1}\c!style\c!color\empty
+ \dostartattributes{\??ko#1}\c!textstyle\c!textcolor\empty
+ \dontconvertfont
+ \ifdisplaysectionhead
+ \setupinterlinespace
+ \else
+ \setupspacing
+ \fi
+ % \ifcase\headtimingmode#2\fi % can introduce cr
+ \getvalue{\??ko#1\c!commandbefore}%
+ \placeheadmargintexts{#1}% binnen #3?
+ \ifdisplaysectionhead
+ \getvalue{\??ko#1\c!textcommand}% struts can be nilled with \setnostrut
+ {\setstrut
+ \begstrut
+ \ifcase\headtimingmode\hbox{#2}\fi
+ \executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#3}%
+ \endstrut}% \hbox prevents break
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdepth
+ \else
+ \ifcase\headtimingmode#2\fi
+ \getvalue{\??ko#1\c!textcommand}%
+ {\executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#3}}%
+ \fi
+ \getvalue{\??ko#1\c!commandafter}%
+ \ifdisplaysectionhead\endgraf\fi
+ \dostopattributes
+ \dostopattributes}}%
+ \fi
+ \endheadplacement{#1}{#4}}
+
+\def\doplaceheadnumbertext#1#2#3#4#5% maybe move modes outside box
+ {\beginheadplacement{#1}%
+ \ifemptyhead % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi to \zeropoint
+ {\doiftextelse{#3}
+ {\setsystemmode \v!sectionnumber\headnumbercontenttrue }
+ {\resetsystemmode\v!sectionnumber\headnumbercontentfalse}%
+ #2}%
+ \makestrutofbox0
+ \else % = needed
+ \setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
+ {\doiftextelse{#3}
+ {\setsystemmode \v!sectionnumber\headnumbercontenttrue }
+ {\resetsystemmode\v!sectionnumber\headnumbercontentfalse}%
+ % less interfering
+ \ifcase\headtimingmode\or#2\fi
+ % outerside font determines distance
+ \dosetfontattribute{\??ko#1}\c!style
+ % but we don't want color to influence user commands
+ \getvalue{\??ko#1\c!command}%
+ {\dostartattributes{\??ko#1}\c!style\c!color\empty
+ \dostartattributes{\??ko#1}\c!numberstyle\c!numbercolor\empty
+ % \getvalue{\??ko#1\c!commandbefore}% strange, why here? moved 21/11/2005
+ \placeheadmargintexts{#1}% binnen #3?
+ \ifdisplaysectionhead
+ % can be nilled with \setnostrut
+ \getvalue{\??ko#1\c!numbercommand}%
+ {\setstrut
+ \begstrut
+ \executeifdefined{\??ko#1\c!deepnumbercommand}\firstofoneargument{#3}%
+ \endstrut}%
+ \else
+ \getvalue{\??ko#1\c!numbercommand}%
+ {\executeifdefined{\??ko#1\c!deepnumbercommand}\firstofoneargument{#3}}%
+ \fi
+ \dostopattributes
+ \dostopattributes}
+ {\dostartattributes{\??ko#1}\c!style\c!color\empty
+ \dostartattributes{\??ko#1}\c!textstyle\c!textcolor\empty
+ \dontconvertfont
+ \ifdisplaysectionhead
+ \setupinterlinespace
+ \else
+ \setupspacing
+ \fi
+ % \ifcase\headtimingmode#2\fi % can introduce cr
+ \getvalue{\??ko#1\c!commandbefore}% makes more sense here
+ \placeheadmargintexts{#1}% binnen #3?
+ \ifdisplaysectionhead
+ \getvalue{\??ko#1\c!textcommand}% struts can be nilled with \setnostrut
+ {\setstrut
+ \begstrut
+ \ifcase\headtimingmode\hbox{#2}\fi
+ \executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#4}%
+ \endstrut}% \hbox prevents break
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdepth
+ \else
+ \ifcase\headtimingmode#2\fi % inside textcommand ?
+ \getvalue{\??ko#1\c!textcommand}%
+ {\executeifdefined{\??ko#1\c!deeptextcommand}\firstofoneargument{#4}}%
+ \fi
+ \getvalue{\??ko#1\c!commandafter}%
+ \ifdisplaysectionhead\endgraf\fi
+ \dostopattributes
+ \dostopattributes}}%
+ \fi
+ \endheadplacement{#1}{#5}}
+
+%D \starttyping
+%D \def\StretchedBox#1%
+%D {\framed
+%D [frame=off,offset=.5em,align=middle,width=broad]
+%D {\sc\def\stretchedspaceamount{.3em}\stretchednormalcase{#1}}}
+%D
+%D \definehead[MySubject][subject]
+%D \setuphead [MySubject][deeptextcommand=\StretchedBox]
+%D
+%D \MySubject{feeling stretched feeling stretched feeling stretched feeling stretched}
+%D \stoptyping
+
+\newsignal\headsignal
+\let\headlastlinewidth\!!zeropoint
+
+\def\beginheadplacement#1%
+ {\bgroup
+ \setsystemmode{#1}% to be documented
+ \ifgridsnapping\iftracegridsnapping\showstruts\fi\fi
+ \xdef\localheadheight {\the\strutht}%
+ \xdef\localheaddepth {\the\strutdp}%
+ \xdef\localheadlineheight{\the\lineheight}%
+ % == \globallet\localheaddepth\strutdp
+ \everypar\emptytoks % needed indeed
+ \noindent % ipv \whitespace elders, na \forgetall !
+ \bgroup
+ \doifinsetelse{\getvalue{\??ko#1\c!aligntitle}}{\v!yes,\v!float}% new
+ {\skip0 1\leftskip
+ \skip2 1\rightskip
+ \xdef\localheadskip{\the\skip0}%
+ \forgetall
+ \leftskip\skip0
+ \rightskip\skip2
+ \setlocalhsize\hsize\localhsize
+ \forgetbothskips}
+ {\globallet\localheadskip\!!zeropoint
+ \forgetall}%
+ \dontcomplain
+ \postponenotes
+ \iflocation\ifdisplaysectionhead\else\noninterferingmarks\fi\fi
+ \resetinteractionparameter\c!style
+ \resetinteractionparameter\c!color
+ \resetinteractionparameter\c!contrastcolor
+ \strictouterreferencestrue % tzt instelling
+ \def\localheadsetup{\dolocalheadsetup{#1}}%
+ \startsynchronization}
+
+% \setuphead[chapter] [style=\bfd,after=,hang=line] % fit broad 2
+% \setuphead[section] [style=\bfc,after=,hang=line]
+% \setuphead[subsection] [style=\bfb,after=,hang=line]
+% \setuphead[subsubsection] [style=\bfa,after=,hang=line]
+% \setuphead[subsubsubsection][style=\bf ,after=,hang=line]
+%
+% \chapter {Test} \input tufte \page
+% \section {Test} \input tufte \page
+% \subsection {Test} \input tufte \page
+% \subsubsection {Test} \input tufte \page
+% \subsubsubsection{Test} \input tufte \page
+%
+% \chapter {Test\\Test} \input tufte \page
+% \section {Test\\Test} \input tufte \page
+% \subsection {Test\\Test} \input tufte \page
+% \subsubsection {Test\\Test} \input tufte \page
+% \subsubsubsection{Test\\Test} \input tufte \page
+
+\def\hangheadplacement
+ {\scratchdimen\localheadlineheight
+ \bgroup
+ \openlineheight\scratchdimen
+ \scratchdimen\ht0
+ \advance\scratchdimen\dp0
+ \getnoflines\scratchdimen
+ \advance\noflines\minusone
+ \expanded{\egroup\noflines\the\noflines}% brrr
+ \setbox0\hbox{\lower\noflines\scratchdimen\box0}%
+ \scratchdimen\ht0
+ \advance\scratchdimen\dp0
+ \advance\scratchdimen-\localheadheight
+ \advance\scratchdimen+\strutdp
+ \ht0 \strutht
+ \dp0 \strutdp
+ \edef\localheaddepth{\the\strutdp}}
+
+\newconditional\continuoussectionhead % oeps, \newif\ifcontinuoushead got lost
+
+\def\endheadplacement#1#2%
+ {\doifelsevalue{\??rf#1\c!state}\v!start
+ {\doifvaluenothing{\??ko#1\c!file}{\autocrossdocumentfalse}}
+ {\autocrossdocumentfalse}%
+ % no message needed here, should be a proper switch
+ \noflines\zerocount
+ \ifdisplaysectionhead
+ % new (tod tight == one following line up)
+ \processaction
+ [\getvalue{\??ko#1\c!hang}]
+ [ \v!line=>\hangheadplacement\noflines\zerocount,
+ \v!broad=>\hangheadplacement\getnoflines\scratchdimen,
+ \v!fit=>\hangheadplacement\getrawnoflines\scratchdimen,
+ \v!none=>\noflines\zerocount,
+ \v!default=>\noflines\zerocount,
+ \v!unknown=>\hangheadplacement\noflines0\commalistelement\advance\noflines\minusone]%
+ % so far
+ \let\headlastlinewidth\!!zeropoint
+ \snaptogrid[\getvalue{\??ko#1\c!grid}]\hbox
+ {\hskip\localheadskip
+ \hskip\getvalue{\??ko#1\c!margin}\relax
+ \iflocation
+ \ifautocrossdocument
+ \doifreferencefoundelse{\getvalue{\??ko#1\c!file}::#1}
+ {\edef\currentinnerreference{\s!aut:\currenttextreference}% stored in
+ \gotoouterlocation{}{\box0}} % text slot
+ {\hbox{\box0}}%
+ \else
+ \hbox{\box0}%
+ \fi
+ \else
+ \hbox{\box0}%
+ \fi}%
+ \doflushnotes % new, not really needed
+ \endgraf
+ \ifvmode
+ \ifnum\noflines>\zerocount
+ \dorecurse\noflines{\nointerlineskip\dosomebreak\nobreak\strut\endgraf}%
+ \fi
+ \nointerlineskip
+ \dosomebreak\nobreak
+ \fi
+ #2%
+ \else
+ \strut
+ \doflushnotes % new, here since we're in par mode
+ \iflocation
+ \ifautocrossdocument
+ \hhboxindent=\ifconditional\continuoussectionhead\headlastlinewidth\else\zeropoint\fi
+ \unhhbox0\with{\gotobox{\box\hhbox}[\getvalue{\??ko#1\c!file}::#1]}%
+ \advance\lasthhboxwidth by \numberheaddistance
+ \xdef\headlastlinewidth{\the\lasthhboxwidth}%
+ \else
+ \unhbox0
+ \globallet\headlastlinewidth\!!zeropoint
+ \fi
+ \else
+ \unhbox0
+ \globallet\headlastlinewidth\!!zeropoint
+ \fi
+ #2%
+ \dimen0=\numberheaddistance
+ \hskip\dimen0 \!!plus \dimen0 \!!minus .25\dimen0
+ \hskip\headsignal\ignorespaces
+ \fi
+ \ifdisplaysectionhead \ifvmode
+ \ifgridsnapping % important, font related depth, see comment
+ \prevdepth\strutdp
+ \else
+ \prevdepth\localheaddepth
+ \fi
+ \fi \fi
+ \stopsynchronization
+ \egroup
+ \egroup
+ \ifdisplaysectionhead
+ \dochecknextindentation{\??ko#1}%
+ \else
+ \nonoindentation % recently added, was a bug
+ \fi}
+
+\def\checknexthead#1#2% nog optioneel
+ {\ifhmode
+ \scratchcounter=\lastpenalty\unpenalty % no beauty in this
+ \ifdim\lastskip=\headsignal
+ \handlenopagebreak{#1}%
+ \global\settrue\continuoussectionhead
+ \else
+ \penalty\scratchcounter
+ \global\setfalse\continuoussectionhead
+ #1{#2}%
+ \fi
+ \else
+ \global\setfalse\continuoussectionhead
+ #1{#2}%
+ \fi}
+
+\def\dosetupheadnumber[#1][#2#3]% todo: = (don't reset)
+ {\bgroup
+ \setsectieenkoppeling{#1}%
+ \doifinstringelse{#2}{+-}
+ {\doifelsenothing{#3}
+ {\@@nextsectionnumber\@@sectie}
+ {\!!counta=#2#3\relax
+ \advance\!!counta \@@sectionvalue\@@sectie
+ \@@setsectionnumber\@@sectie\!!counta}}
+ {\@@setsectionnumber\@@sectie{#2#3}}%
+ \egroup}
+
+\def\setupheadnumber
+ {\dodoubleargument\dosetupheadnumber}
+
+\def\currentheadnumber{0}
+
+\def\determineheadnumber[#1]%
+ {\bgroup
+ \setsectieenkoppeling{#1}%
+ \xdef\currentheadnumber{\@@sectionvalue{\@@sectie}}%
+ \egroup}
+
+\def\complexheadnumber[#1]%
+ {\bgroup
+ \edef\currentheadnumber{#1}%
+ \doifinsetelse{-}{#1} % br undocumented
+ {\removefromcommalist{-}\currentheadnumber % br
+ \setsectieenkoppeling\currentheadnumber
+ \setupsection[\@@sectie][\c!previousnumber=\v!no]}%
+ {\setsectieenkoppeling\currentheadnumber}%
+ \xdef\currentheadnumber{\@@sectionvalue{\@@sectie}}%
+ \doifnot{\currentheadnumber}{0}{\finalsectionnumber}%
+ \egroup}
+
+\def\simpleheadnumber
+ {\currentheadnumber}
+
+\definecomplexorsimple\headnumber
+
+\def\alinea
+ {\par}
+
+% nice testcase
+%
+% \setupheads[aligntitle=yes]
+%
+% \startnarrower
+% \subject{\dorecurse{100}{x }}
+% \section{\dorecurse{100}{x }}
+% \input tufte \par
+% \setupheads[alternative=inmargin]
+% \subject{\dorecurse{100}{x }}
+% \section{\dorecurse{100}{x }}
+% \input tufte \par
+% \stopnarrower
+
+\let\numberheadalternative\v!normal
+
+\def\defineheadplacement
+ {\dodoubleargument\dodefineheadplacement}
+
+\def\dodefineheadplacement[#1][#2]% #3#4
+ {\setvalue{\??ko:#1}{#2}%
+ \setvalue{\??ko::#1}}
+
+\def\normalplacehead
+ {\executeifdefined
+ {\??ko::\numberheadalternative}
+ {\getvalue{\??ko::\v!normal}}}
+
+\defineheadplacement[\v!paragraph][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \begstrut\ifheadnumbercontent#1\hskip\numberheaddistance\fi#2}}
+
+% \defineheadplacement[\v!normal][\v!vertical]#1#2%
+% {\ifheadnumbercontent
+% \setbox0\hbox{{#1}\hskip\numberheaddistance}%
+% \vbox
+% {\localheadsetup
+% \hangindent 1\wd0
+% \hangafter 1
+% \noindent
+% \unhbox0 % don't use \strut's here!
+% #2}%
+% \else
+% \vbox
+% {\localheadsetup\noindent#2}%
+% \fi}
+%
+% enhanced version:
+
+% \setuphead
+% [chapter]
+% [numberwidth=2cm,hang=line,after={\blank[3*line]}]
+%
+% \chapter{Oeps oeps oeps} \input tufte \section{Oeps}
+% \chapter{Oeps oeps oeps} \section{Oeps} \input tufte
+
+\defineheadplacement[\v!normal][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \edef\headwidth {\headparameter\c!width }%
+ \edef\headnumberwidth{\headparameter\c!numberwidth}%
+ \edef\headtextwidth {\headparameter\c!textwidth }%
+ \ifheadnumbercontent
+ \ifx\headwidth\empty
+ \else
+ \ifx\headnumberwidth\empty
+ \ifx\headtextwidth\empty\else
+ \edef\headnumberwidth{\the\dimexpr\headwidth-\headtextwidth\relax}%
+ \fi
+ \else
+ \ifx\headtextwidth\empty
+ \edef\headtextwidth{\the\dimexpr\headwidth-\headnumberwidth\relax}%
+ \fi
+ \fi
+ \hsize\headwidth
+ \fi
+ \ifx\headnumberwidth\empty\else
+ \let\numberheaddistance\!!zeropoint
+ \fi
+ \setbox\scratchbox\hbox \ifx\headnumberwidth\empty\else to \headnumberwidth\fi{{#1}}%
+ \scratchdimen\dimexpr\wd\scratchbox+\numberheaddistance\relax
+ \ifx\headtextwidth\empty\else
+ \hsize\dimexpr\scratchdimen+\headparameter\c!textwidth\relax
+ \fi
+ \hangindent\scratchdimen
+ \hangafter \plusone
+ \noindent
+ \box\scratchbox\hskip\numberheaddistance
+ \else
+ \ifx\headtextwidth\empty
+ \ifx\headwidth\empty
+ \else
+ \hsize\headwidth
+ \fi
+ \else
+ \hsize\headtextwidth
+ \fi
+ \noindent
+ \fi
+ #2}}
+
+\def\placeheadmargin#1#2%
+ {\vbox
+ {\localheadsetup
+ \begstrut % use one \strut here!
+ \dontleavehmode % in case there is no strut, else side effects with llap
+ \ifheadnumbercontent
+ \llap{\hbox to 5em{\hfill{#1}\hskip\localheadskip\hskip\leftmargindistance}}% introduces whitespace
+ % maybe better:
+ % \inleftmargin{\hbox{\hss{#1}\hskip\localheadskip}}%
+ \fi
+ {#2}}}
+
+\defineheadplacement[\v!inmargin][\v!vertical]#1#2{\placeheadmargin{#1}{#2}}
+\defineheadplacement[\v!margin] [\v!vertical]#1#2{\placeheadmargin{#1}{#2}}
+
+\defineheadplacement[\v!middle][\v!vertical]#1#2%
+ {\vbox
+ {\localheadsetup
+ \veryraggedcenter
+ \let\\\endgraf
+ \let\crlf\endgraf
+ \ifheadnumbercontent\strut#1\par\fi\begstrut#2}}
+
+\defineheadplacement[\v!text][\v!horizontal]#1#2%
+ {\bgroup
+ \localheadsetup % no stretch in distance
+ \ifheadnumbercontent{#1}\kern\numberheaddistance\fi{\begstrut#2}%
+ \egroup}
+
+\def\placeheadlohi#1#2#3%
+ {\ifheadnumbercontent
+ \setbox0\hbox{#2}
+ \setbox2=#1{\localheadsetup\advance\hsize-\wd0\relax#3}%
+ \hbox{\box0\hskip\numberheaddistance\box2}%
+ \else
+ #1{\localheadsetup\noindent#3}%
+ \fi}
+
+% onder/boven lijnt het nummer op de onderste/bovenste regel
+% uit van een meerregelige kop
+
+\defineheadplacement[\v!bottom][\v!vertical]#1#2{\placeheadlohi\vbox{#1}{#2}}
+\defineheadplacement[\v!top] [\v!vertical]#1#2{\placeheadlohi\vtop{#1}{#2}}
+
+% default == instellingen
+% koppeling == koppen, breaks, marks, enz.
+% sectie == nummering
+
+\let\@@kolist=\empty
+
+\def\dododefinehead#1#2% % don't preset prefix to much
+ {\presetlabeltext[#1=]%
+ \getparameters
+ [\??ko#1]
+ [\c!numberstyle=\getvalue{\??ko#1\c!style},
+ \c!textstyle=\getvalue{\??ko#1\c!style},
+ \c!numbercolor=\getvalue{\??ko#1\c!color},
+ \c!textcolor=\getvalue{\??ko#1\c!color}]%
+ % deeptextcommand and deepnumbercommand are left undefined !
+ \doifassignmentelse{#2}
+ {\getparameters
+ [\??ko#1]
+ [\c!section=\getvalue{\??ko\getvalue{\??ko#1\c!coupling}\c!section},
+ \c!default=,
+ \c!coupling=,
+ \c!prefix=,
+ \c!before=,
+ \c!after=,
+ \c!distance=\!!zeropoint,
+ \c!page=,
+ \c!header=,
+ \c!text=,
+ \c!footer=,
+ \c!style=,
+ \c!numbercommand=,
+ \c!textcommand=,
+ \c!ownnumber=\v!no,
+ \c!number=\v!yes,
+ \c!color=,
+ \c!continue=\v!yes,
+ \c!placehead=\v!yes,
+ \c!resetnumber=\v!yes,
+ \c!incrementnumber=\v!yes,
+ \c!alternative=\@@koalternative,
+ \c!command=\normalplacehead,
+ \c!separator=\@@koseparator,
+ \c!stopper=\@@kostopper,
+ \c!align=\@@koalign,
+ \c!aligntitle=\@@koaligntitle,
+ \c!tolerance=\@@kotolerance,
+ \c!indentnext=\@@koindentnext,
+ \c!strut=\@@kostrut,
+ \c!hang=\@@kohang,
+ \c!file=,
+ \c!expansion=,
+ \c!grid=,
+ \c!margintext=,
+ \c!margin=\@@komargin,
+ #2]%
+ \ConvertToConstant\doifnot{#1}{\getvalue{\??ko#1\c!default}}
+ {\doifsomething{\getvalue{\??ko#1\c!default}}
+ {\copyparameters
+ [\??ko#1][\??ko\getvalue{\??ko#1\c!default}]
+ [\c!before,\c!after,\c!command,\c!file,\c!page,\c!continue,
+ \c!header,\c!text,\c!footer,\c!separator,\c!stopper,\c!resetnumber,
+ \c!number,\c!ownnumber,\c!placehead,\c!incrementnumber,
+ \c!style,\c!color,\c!distance,\c!alternative,\c!indentnext,
+ % new per 20/03/3002 (o-pbu-l) / was too confusing
+ % \c!numberstyle,\c!textstyle,\c!expansion,
+ % again too confusing
+ \c!align,\c!aligntitle,\c!tolerance,\c!grid,\c!hang,\c!strut,
+ \c!numbercommand,\c!textcommand,\c!margintext,\c!margin]}}%
+ \getparameters[\??ko#1][#2]%
+ \doifsomething{\getvalue{\??ko#1\c!section}}
+ {\doifelsemarking{#1}% \doifundefined{\??mk#1}
+ {}% marking #1 already defined
+ {\definemarking[#1]%
+ \couplemarking[#1][\getvalue{\??ko#1\c!section}]%
+ \definemarking[#1\v!number]%
+ \couplemarking[#1\v!number][\getvalue{\??ko#1\c!section}]}}%
+ \doifundefined{\??li#1}{\definelist[#1]}}
+ {\ConvertToConstant\doifelse{#1}{#2}
+ {\doifundefined{\??li#1}{\definelist[#1]}}
+ {\copyparameters
+ [\??ko#1][\??ko#2]
+ [\c!level,\c!section,\c!coupling,\c!prefix,
+ \c!before,\c!after,\c!command,\c!file,\c!page,\c!continue,
+ \c!separator,\c!stopper,
+ \c!header,\c!text,\c!footer,\c!resetnumber,
+ \c!number,\c!ownnumber,\c!placehead,\c!incrementnumber,
+ \c!style,\c!color,\c!distance,\c!alternative,\c!indentnext,
+ % new per 20/03/3002 (o-pbu-l) / was too confusing
+ % \c!numberstyle,\c!textstyle,\c!expansion,
+ % again too confusing
+ \c!align,\c!aligntitle,\c!tolerance,\c!grid,\c!hang,\c!strut,
+ \c!numbercommand,\c!textcommand,\c!margintext,\c!margin]%
+ \getparameters[\??ko#1][\c!expansion=]% iig een value, rather fuzzy
+ \definemarking[#1][#2]%
+ \definemarking[#1\v!number][#2\v!number]%
+ \doifundefined{\??li#1}{\definelist[#1][#2]}}}%
+ \addtocommalist{#1}\@@kolist
+ \setevalue{\??sk#1}{\getvalue{\??ko#1\c!coupling}}%
+ \setevalue{\??by#1}{\getvalue{\??ko#1\c!section}}%
+ \setevalue{\??by\v!by#1}{\getvalue{\??ko#1\c!section}}%
+ \setvalue{#1}{\dodoubleempty\doconstructhead[#1]}}
+
+\def\dodefinehead[#1][#2]%
+ {\doifelsenothing{#2}
+ {% todo: message that it's an invalid definition
+ \setvalue{#1}{\endgraf[#1]\kern.5em}}
+ {\doifassignmentelse{#2}
+ {\dododefinehead{#1}{#2}}
+ {\doifdefined{\??ko#2\c!section}
+ {\dododefinehead{#1}{#2}}}}}
+
+\def\definehead
+ {\dodoubleemptywithset\dodefinehead}
+
+\def\doconstructhead[#1][#2]%
+ {\dowithpargument{\dodoconstructhead{#1}[#2]}}
+
+\def\dosetuphead[#1][#2]%
+ {\getparameters[\??ko#1][#2]%
+ % The next check prevents hard to trace problems. I once
+ % set \c!command to nothing and (quite natural) got the
+ % wrong references etc. The whole bunch should be boxed!
+ \expandafter\defconvertedcommand\expandafter\ascii\csname\??ko#1\c!command\endcsname
+ \doifnothing\ascii{\setvalue{\??ko#1\c!command}{\normalplacehead}}}
+
+\def\setuphead
+ {\dodoubleargumentwithset\dosetuphead}
+
+\def\dosetupheads[#1]%
+ {\getparameters[\??ko][#1]%
+ \doifelse{\@@kosectionnumber}\v!yes\sectionnumbertrue\sectionnumberfalse}
+
+\def\setupheads
+ {\dosingleargument\dosetupheads}
+
+\def\systemsuppliedchapter {\getvalue{\v!chapter}}
+\def\systemsuppliedtitle {\getvalue{\v!title}}
+
+% a left over
+
+\def\complexbijlage[#1]#2%
+ {\page[\v!right]
+ \setuppagenumbering[\c!state=\v!stop]
+ \systemsuppliedchapter[#1]{#2}
+ \page[\v!right]
+ \setuppagenumbering[\c!state=\v!start]
+ \setuppagenumbering[\c!number=1]}
+
+\setvalue{\v!appendix}%
+ {\complexorsimpleempty\bijlage}
+
+\setupheads
+ [\c!alternative=\v!normal,
+ \c!sectionnumber=\v!yes,
+ \c!separator=.,
+ \c!stopper=,
+ \c!limittext=\v!yes,
+ \c!align=,
+ \c!aligntitle=,
+ \c!tolerance=,
+ \c!strut=,
+ \c!indentnext=\v!no,
+ \c!margin=\zeropoint,
+ \c!hang=\v!none,
+ \c!command=]
+
+\definesectionblock [\v!frontpart] [\v!frontmatter] [\c!number=\v!no]
+\definesectionblock [\v!bodypart] [\v!bodymatter] [\c!number=\v!yes]
+\definesectionblock [\v!appendix] [\v!appendices] [\c!number=\v!yes]
+\definesectionblock [\v!backpart] [\v!backmatter] [\c!number=\v!no]
+
+\definesection[\s!section-1] % part
+\definesection[\s!section-2] % chapter
+\definesection[\s!section-3] % section
+\definesection[\s!section-4] % subsection
+\definesection[\s!section-5] % subsubsection
+\definesection[\s!section-6] % subsubsubsection
+\definesection[\s!section-7] % subsubsubsubsection
+
+% \c!eigennummer ook hier?
+
+\definehead
+ [\v!part]
+ [\c!section=\s!section-1,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!chapter]
+ [\c!section=\s!section-2,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!section]
+ [\c!section=\s!section-3,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsection]
+ [\c!section=\s!section-4,
+ \c!default=\v!section,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsubsection]
+ [\c!section=\s!section-5,
+ \c!default=\v!subsection,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsection]
+ [\c!section=\s!section-6,
+ \c!default=\v!subsubsection,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsection]
+ [\c!section=\s!section-7,
+ \c!default=\v!subsubsubsection,
+ \c!ownnumber=\v!no]
+
+\definehead
+ [\v!title]
+ [\c!coupling=\v!chapter,
+ \c!default=\v!chapter,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subject]
+ [\c!coupling=\v!section,
+ \c!default=\v!section,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubject]
+ [\c!coupling=\v!subsection,
+ \c!default=\v!subsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubject]
+ [\c!coupling=\v!subsubsection,
+ \c!default=\v!subsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubject]
+ [\c!coupling=\v!subsubsubsection,
+ \c!default=\v!subsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\definehead
+ [\v!subsubsubsubsubject]
+ [\c!coupling=\v!subsubsubsubsection,
+ \c!default=\v!subsubsubsubsection,
+ \c!incrementnumber=\v!no]
+
+\setupsection
+ [\s!section-2]
+ [\v!appendix\c!conversion=\v!Character,
+ \c!previousnumber=\v!no]
+
+\setuphead
+ [\v!part]
+ [\c!placehead=\v!no]
+
+\setuphead
+ [\v!chapter]
+ [\v!appendix\c!label=\v!appendix,
+ \v!bodypart\c!label=\v!chapter] % bijlageconversie=\Character
+
+\setuphead
+ [\v!section]
+ [\v!appendix\c!label=\v!section,
+ \v!bodypart\c!label=\v!section] % bijlageconversie=\Character
+
+\setuphead
+ [\v!subsection]
+ [\v!appendix\c!label=\v!subsection,
+ \v!bodypart\c!label=\v!subsection] % bijlageconversie=\Character
+
+\setuphead
+ [\v!subsubsection]
+ [\v!appendix\c!label=\v!subsubsection,
+ \v!bodypart\c!label=\v!subsubsection] % bijlageconversie=\Character
+
+\setuphead
+ [\v!part,\v!chapter]
+ [%\c!align=,
+ %\c!indentnext=\v!no,
+ \c!continue=\v!no,
+ \c!page=\v!right,
+ \c!header=,
+ \c!style=\tfc,
+ \c!distance=.75em,
+ \c!before={\blank[2*\v!big]},
+ \c!after={\blank[2*\v!big]}]
+
+\setuphead
+ [\v!section]
+ [%\c!align=,
+ %\c!indentnext=\v!no,
+ \c!style=\tfa,
+ \c!distance=.75em,
+ \c!before={\blank[2*\v!big]},
+ \c!after=\blank]
+
+\setuphead % nieuw
+ [\v!subsection]
+ [\c!page=]
+
+\definecombinedlist
+ [\v!content]
+ [\v!part,
+ \v!chapter,
+ \v!section,
+ \v!subsection,
+ \v!subsubsection,
+ \v!subsubsubsection,
+ \v!subsubsubsubsection]
+ [\c!level=\v!subsubsubsubsection,
+ \c!criterium=\v!local]
+
+\setuplist
+ [\v!part]
+ [\c!before={\blank\page[\v!preference]},
+ \c!after=\blank,
+ \c!label=\v!yes,
+ \c!separator=:,
+ \c!distance=1em]
+
+\setuplist
+ [\v!chapter]
+ [\c!before={\blank\page[\v!preference]},
+ \c!after=]
+
+\setuplist [\v!part] [\c!width=0em]
+\setuplist [\v!chapter] [\c!width=2em]
+\setuplist [\v!section] [\c!width=3em]
+\setuplist [\v!subsection] [\c!width=4em]
+\setuplist [\v!subsubsection] [\c!width=5em]
+\setuplist [\v!subsubsubsection] [\c!width=6em]
+\setuplist [\v!subsubsubsubsection] [\c!width=7em]
+
+% hm
+
+\setuppagenumbering % na instellen hoofdteksten !
+ [\c!alternative=\v!singlesided,
+ \c!location={\v!header,\v!middle},
+ \c!conversion=\v!numbers,
+ \c!width=, % in geval van \v!marginedge
+ \c!left=,
+ \c!right=,
+ \c!way=\v!by\v!part,
+ \c!text=,
+ \v!chapter\v!number=\v!no, % v
+ \v!part\v!number=\v!yes, % v
+ \c!numberseparator=--,
+ \c!textseparator=\tfskip,
+ \c!state=\v!start,
+ \c!command=,
+ \c!strut=\v!yes, % nieuw
+ \c!style=, % \v!normal, % empty, otherwise conflict
+ \c!color=]
+
+\protect \endinput