summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/strc-sec.mkiv
diff options
context:
space:
mode:
authorTaco Hoekwater <taco@elvenkind.com>2009-08-23 11:11:32 +0000
committerTaco Hoekwater <taco@elvenkind.com>2009-08-23 11:11:32 +0000
commit8fc3039c82d48605b5ca8b2eda3f4fdd755681e1 (patch)
tree3cd9bbdd599bc4d1ac0409e167fee2136e4c0ec9 /Master/texmf-dist/tex/context/base/strc-sec.mkiv
parent850fc99b7cd3ae7a20065531fe866ff7bae642ec (diff)
this is context 2009.08.19 17:10
git-svn-id: svn://tug.org/texlive/trunk@14827 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/strc-sec.mkiv')
-rw-r--r--Master/texmf-dist/tex/context/base/strc-sec.mkiv702
1 files changed, 702 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/strc-sec.mkiv b/Master/texmf-dist/tex/context/base/strc-sec.mkiv
new file mode 100644
index 00000000000..ddc601eb831
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/strc-sec.mkiv
@@ -0,0 +1,702 @@
+%D \module
+%D [ file=strc-sec,
+%D version=2008.10.20,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Sectioning,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / Hans Hagen]
+%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 Structure Macros / Sectioning}
+
+\unprotect
+
+% compatibility issue:
+%
+% \def\setfullsectionnumber #1{}
+% \def\preparefullnumber #1{}
+% \def\fullsectionnumber {1--1--1}
+% \def\makesectionnumber [#1]{}
+% \def\makesectionformat {}
+% \def\sectionformat {1--1-1-1-1-1-1}
+% \def\composedsectionnumber{}
+% \def\@@kolist{}
+
+% \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}
+
+% lua interface / names and interface might change
+
+\def\setstructurelevel #1#2{\ctxlua{structure.sections.setlevel("#1","#2")}} % name, level|parent
+\def\getstructurelevel #1{\ctxlua{structure.sections.getcurrentlevel("#1")}}% name
+\def\setstructurenumber #1#2{\ctxlua{structure.sections.setnumber(#1,"#2")}} % level, number (+/-)
+\def\getstructurenumber #1{\ctxlua{structure.sections.getnumber(#1)}} % level
+\def\getfullstructurenumber #1{\ctxlua{structure.sections.fullnumber(#1)}} % level
+\def\getspecificstructuretitle#1{\ctxlua{structure.sections.structuredata(#1,"titledata.title",nil,"\structureheadparameter\s!catcodes")}}%
+
+% interface
+
+\def\structureheadparameter #1{\csname\dostructureheadparameter{\??nh\currentstructurehead}#1\endcsname}
+\def\structureheadparameterhash#1{\dostructureheadparameterhash {\??nh\currentstructurehead}#1}
+
+\def\dostructureheadparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dostructureheadparentparameter \csname#1\s!parent\endcsname#2\fi}
+\def\dostructureheadparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dostructureheadparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+
+\def\dostructureheadparentparameter #1#2{\ifx#1\relax\s!empty\else\dostructureheadparameter #1#2\fi}
+\def\dostructureheadparentparameterhash#1#2{\ifx#1\relax \else\dostructureheadparameterhash#1#2\fi}
+
+\def\dosetstructureheadattributes#1#2% style color
+ {\edef\fontattributehash {\structureheadparameterhash#1}%
+ \edef\colorattributehash{\structureheadparameterhash#2}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+
+% so far
+
+\newcount\maxstructuredepth
+
+\let\laststructuresectionname\empty
+
+\def\definestructuresection[#1]%
+ {\doifundefined{\??nh#1}
+ {\global\advance\maxstructuredepth\plusone
+ \setevalue{\??nh#1\c!level}{\the\maxstructuredepth}%
+ \setstructurelevel{#1}{\the\maxstructuredepth}%
+% \letvalue{\??nh#1\c!marking}\empty % ?
+ %\writestatus{structure}{#1\ifx\laststructuresectionname\empty\else\space->\space\laststructuresectionname\fi}%
+ \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\laststructuresectionname]}%
+ \definemarking[#1]%
+ \ifnum\maxstructuredepth>\plusone
+% \normalexpanded{\noexpand\couplemarking[#1][\laststructuresectionname]}% so, the child inherits settings from the parent
+ \normalexpanded{\noexpand\relatemarking[#1][\laststructuresectionname]}% so, the parent will reset the child
+ \fi
+ \xdef\laststructuresectionname{#1}}}
+
+\def\setupstructuresection
+ {\dotripleempty\dosetupstructuresection}
+
+\def\dosetupstructuresection[#1]%
+ {\doifdefinedelse{\??nh#1}
+ {\dodosetupstructuresection[#1]}
+ {\dodosetupstructuresection[\structuresectionheadsection{#1}]}}
+
+\def\dodosetupstructuresection[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??nh#1#2][#3]% ? probably sectionblock
+ \else
+ \getparameters[\??nh#1][#2]%
+ \fi}
+
+\def\structuresectionlevel#1%
+ {\executeifdefined{\??nh#1\c!level}0}
+
+% head -> structurehead
+
+\let\currentstructurehead\empty
+\newtoks\everystructureheadsetup
+
+\def\setupstructureheads{\dosingleargument\dosetupstructureheads}
+\def\setupstructurehead {\dodoubleempty\dosetupstructurehead}
+\def\definestructurehead{\dodoubleempty\dodefinestructurehead}
+
+\newif\ifsectionnumber % maybe conditional
+
+\def\dosetupstructureheads[#1]%
+ {\getparameters[\??nh][#1]%
+ \doifelse{\structureheadparameter\c!sectionnumber}\v!yes\sectionnumbertrue\sectionnumberfalse}
+
+\def\dosetupstructurehead[#1][#2]% we move the test for command being nothing elsewhere (needed, else hard to trace)
+ {\processcommalist[#1]{\dodosetupstructurehead{#2}}}
+
+\def\dodosetupstructurehead#1#2%
+ {\edef\currentstructurehead{#2}%
+ \getparameters[\??nh#2][#1]%
+ \the\everystructureheadsetup}
+
+\def\dodefinestructurehead[#1][#2]%
+ {\processcommalist[#1]{\dododefinestructurehead{#2}}}
+
+\def\dododefinestructurehead#1#2% #1: parameters|parent, #2: self
+ {\doifsomethingelse{#2}
+ {\doifassignmentelse{#1}
+ \dodefineuniquestructurehead
+ {\doifdefinedelse{\??nh#1\s!parent} % just a check
+ \dodefineclonedstructurehead
+ \dodefineerrorstructurehead}}
+ \dodefineerrorstructurehead
+ {#2}{#1}}
+
+\def\dodefineerrorstructurehead#1#2%
+ {\setvalue{#1}{\par error: #1 is undefined\par}}
+
+% deeptextcommand and deepnumbercommand are left undefined !
+
+\def\dodefineuniquestructurehead#1#2% class, parent
+ {\def\currentstructurehead{#1}%
+ \presetlabeltext[#1=]%
+ \getparameters[\??nh#1][\c!label=#1,#2]%
+ \edef\currentstructureheaddefault{\structureheadparameter\c!default}%
+ \edef\currentstructureheadsection{\structureheadparameter\c!section}%
+ \edef\currentstructureheadparent
+ {\??nh
+ \ifx\currentstructurehead\currentstructureheaddefault
+ \currentstructureheadsection
+ \else\ifx\currentstructureheaddefault\empty
+ \currentstructureheadsection
+ \else
+ \currentstructureheaddefault
+ \fi\fi}%
+ \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\currentstructureheadparent]}% \setevalue{\??nh#1\s!parent}{\currentstructureheadparent}%
+ \ifx\currentstructureheadsection\empty
+ %\writestatus{structure}{#1->\currentstructureheadparent}%
+ \else
+ %\writestatus{structure}{#1->\currentstructureheadparent\space(\currentstructureheadsection)}%
+ % todo: filtercommand
+ \definemarking[#1][\currentstructureheadsection]%
+ \definemarking[#1\v!number][#1]%
+ \setupmarking[#1][\c!filtercommand=\sectionheadmarkingtitle{#1}]%
+ \setupmarking[#1\c!number][\c!filtercommand=\sectionheadmarkingnumber{#1}]%
+ \fi
+ \doifundefined{\??li#1}{\definelist[#1][\c!prefix=\v!no]}% definestructurelist ?
+ \the\everystructureheadsetup}
+
+\def\sectionheadmarkingtitle #1#2{\ctxlua{structure.marks.title("#1","#2")}}
+\def\sectionheadmarkingnumber#1#2{\ctxlua{structure.marks.number("#1","#2")}}
+
+\def\dodefineclonedstructurehead#1#2% class parent
+ {\def\currentstructurehead{#1}%
+ \presetlabeltext[#1=]%
+ \doifelse{#1}{#2}
+ {\getparameters[\??nh#1][\c!label=#1]%
+ \doifundefined{\??li#1}{\definelist[#1][\c!prefix=\v!no]}}% definestructurelist ?
+ {\getparameters[\??nh#1][\s!parent=\??nh#2,\c!label=#1,\c!coupling=#2]%
+ \definemarking[#1][#2]%
+ \definemarking[#1\v!number][#2\c!number]%
+ \doifundefined{\??li#1}{\definelist[#1][#2][\c!prefix=\v!no]}}% definestructurelist ?
+ \the\everystructureheadsetup}
+
+\appendtoks
+% \setstructurelevel\currentstructurehead{\structuresectionheadsection{\structuresectionheadcoupling\currentstructurehead}}%
+ \setstructurelevel\currentstructurehead{\thenamedstructureheadlevel\currentstructurehead}%
+ \doifelse{\structureheadparameter\c!ownnumber}\v!yes
+ {\setevalue\currentstructurehead{\noexpand\dohandlestructureheadown[\currentstructurehead]}}
+ {\setevalue\currentstructurehead{\noexpand\dohandlestructureheadnop[\currentstructurehead]}}%
+ \setevalue{\e!next \currentstructurehead}{\noexpand\donextstructurehead [\currentstructurehead]}%
+ \setevalue{\e!start\currentstructurehead}{\noexpand\dostartstructurehead[\currentstructurehead]}%
+ \setevalue{\e!stop \currentstructurehead}{\noexpand\dostopstructurehead [\currentstructurehead]}%
+\to \everystructureheadsetup
+
+% todo, check if section is defined
+
+\def\structuresectionheadcoupling#1%
+ {\ifcsname\??nh#1\c!coupling\endcsname
+ \expandafter\structuresectionheadcoupling\csname\??nh#1\c!coupling\endcsname\else#1%
+ \fi}
+
+\def\structuresectionheadsection#1%
+ {\ifcsname\??nh#1\c!section\endcsname
+ \expandafter\structuresectionheadcoupling\csname\??nh#1\c!section\endcsname\else#1%
+ \fi}
+
+% head construction
+
+\def\dohandlestructureheadown{\dodoubleempty\dodohandlestructureheadown} % [ref] {nr} {title}
+\def\dohandlestructureheadnop{\dodoubleempty\dodohandlestructureheadnop} % [ref] {title}
+\def\dostartstructurehead {\dotripleempty\dodostartstructurehead} % [settings] [userdata]
+
+\newconditional\currentstructureown
+
+\def\dodohandlestructureheadown[#1][#2]#3#4%
+ {\settrue\currentstructureown
+ \dohandlestructurehead{#1}{\c!reference={#2},\c!ownnumber={#3},\c!title={#4}}{}} % name ref nr title --
+
+\def\dodohandlestructureheadnop[#1][#2]#3%
+ {\setfalse\currentstructureown
+ \dohandlestructurehead{#1}{\c!reference={#2},\c!title={#3}}{}} % name ref nr title --
+
+\newtoks\everybeforestructurehead % hook, todo: before/after keys
+\newtoks\everyafterstructurehead % hook, todo: before/after keys
+
+\def\dodostartstructurehead[#1][#2][#3]% for the moment no grouping, too annoying with page breaks
+ {\setfalse\currentstructureown
+ %\globalpushmacro\currentstructurehead
+ \xdef\currentstructurehead{#1}%
+ \the\everybeforestructurehead
+ \dohandlestructurehead{#1}{#2}{#3}} % name -- -- -- userdata
+
+\def\dostopstructurehead[#1]%
+ {%\globalpopmacro\currentstructurehead
+ \xdef\currentstructurehead{#1}% recover
+ \the\everyafterstructurehead}
+
+\def\donextstructurehead[#1][#2][#3]%
+ {\setfalse\currentstructureown
+ \xdef\currentstructurehead{#1}%
+ \dohandlestructurehead{#1}{#2}{#3}} % name -- -- -- userdata
+
+% \newconditional\structurereversesectionnumbers % todo: key/val
+
+\newconditional\structureheadtolist
+\newconditional\structureheaddoincrement
+\newconditional\structureheaddoplace
+\newconditional\structureheadleaveempty
+\newconditional\structureheadshownumber
+\newconditional\structureheadisdisplay
+
+\let\structureheadprefix\empty \def\structureheadprefixplus{+}
+
+% When do we reset the referenceprefix? This needs to be checked. Does it work
+% at all?
+
+\def\setstructureheadreference#1% reference
+ {\edef\structureheadreference{#1}%
+ \edef\structureheadreferenceprefix{\structureheadparameter\c!prefix}%
+ \ifx\structureheadreferenceprefix\empty
+ \setupreferenceprefix[]% yes or no?
+ \else\ifx\structureheadreferenceprefix\structureheadreferenceprefixplus
+ \ifx\structureheadreference\empty
+ \setupreferenceprefix[\structureheadreferenceprefixplus]
+ \else
+ \setupreferenceprefix[#1]% we assume just one reference
+ \fi
+ \else
+ \setupreferenceprefix[\structureheadreferenceprefix]%
+ \fi\fi}
+
+\setvalue{\??nh:\c!incrementnumber:\v!yes }{\settrue \structureheaddoincrement\settrue \structureheadtolist}
+\setvalue{\??nh:\c!incrementnumber:\v!no }{\setfalse\structureheaddoincrement\setfalse\structureheadtolist}
+\setvalue{\??nh:\c!incrementnumber:\v!list }{\setfalse\structureheaddoincrement\settrue \structureheadtolist}
+\setvalue{\??nh:\c!incrementnumber:\s!empty}{\settrue \structureheaddoincrement\settrue \structureheadtolist}
+
+\def\setstructureheadincrement
+ {\edef\currentstructureheadincrement{\structureheadparameter\c!incrementnumber}%
+ \ifcsname\??nh:\c!incrementnumber:\currentstructureheadincrement\endcsname
+ \csname\??nh:\c!incrementnumber:\currentstructureheadincrement\endcsname
+ \else
+ \settrue \structureheaddoincrement\settrue \structureheadtolist
+ % \filterstructureheadnumber
+ \fi}
+
+\def\filterstructureheadnumber
+ {\settrue\structureheaddoincrement
+ \settrue\structureheadtolist
+ \ifx\currentproduct\empty
+ % todo : filter from other toc (number, file, title)
+ % use : \currentstructureheadincrement as spec
+ \fi}
+
+\def\setstructureheadplacement
+ {\settrue\structureheaddoplace
+ \setfalse\structureheadleaveempty
+ \processaction
+ [\structureheadparameter\c!placehead]
+ [ \v!yes=>,
+ \v!empty=>\settrue\structureheadleaveempty,
+ \v!no=>\settrue\structureheadleaveempty\setfalse\structureheaddoplace]}
+
+\def\setstructureheaddisplay
+ {\doifelsevalue{\??nh:\structureheadparameter\c!alternative}\v!horizontal
+ {\setfalse\structureheadisdisplay}
+ {\settrue \structureheadisdisplay}}
+
+\def\dosettructureheadnumbercontent
+ {\setsystemmode \v!sectionnumber
+ \settrue\structureheadshownumber}
+
+\def\doresettructureheadnumbercontent
+ {\resetsystemmode\v!sectionnumber
+ \setfalse\structureheadshownumber}
+
+\def\setstructureheadnumber
+ {\ifsectionnumber
+ \doifelse{\structureblockparameter\c!number}\v!yes % todo
+ {\doifelse{\structureheadparameter\c!number}\v!yes
+ {\settrue\structureheadshownumber}
+ {\setfalse\structureheadshownumber}}
+ {\setfalse\structureheadshownumber}%
+ \else
+ \setfalse\structureheadshownumber
+ \fi}
+
+\def\thestructureheadsynchonization
+ {\pagetype[\currentstructureheadcoupling]% hm also number
+ \normalexpanded{\noexpand\setmarking[\currentstructureheadcoupling]{\currentstructurelistnumber}}%
+ \currentstructuresynchronize}
+
+\def\fullstructureheadnumber{\labeltexts{\structureheadparameter\c!label}{\structurenumber}} % todo
+\def\fullstructureheadtitle {\structurevariable{titledata.title}} % no catcode!
+
+\unexpanded\def\fullstructureheadtitle
+ {\structureautocatcodedget{titledata.title}{\structureheadparameter\s!catcodes}}
+
+\let\currentstructurehead \empty
+\let\currentstructureheadcoupling\empty
+\let\currentstructureheadsection \empty
+\let\currentstructureheadlevel \!!zerocount
+\let\currentstructureheadcounter \!!zerocount
+
+\def\doregisterstructurehead#1#2#3% name data userdata
+ {\structurecomponent
+ [\c!label={\structureheadparameter\c!label},
+ \c!incrementnumber=\ifconditional\structureheaddoincrement\v!yes\else\v!no\fi, % not that needed
+ \c!saveinlist=\ifconditional\structureheadtolist\v!yes\else\v!no\fi,
+ \c!level=\currentstructureheadlevel,
+ \c!name=#1,
+ \c!number=\ifconditional\structureheadshownumber\v!yes\else\v!no\fi,
+ \c!bookmark=,
+ \c!marking=,
+ \c!list=,
+ \c!expansion=\structureheadparameter\c!expansion,
+ \c!sectionresetset=\structureheadparameter\c!sectionresetset,
+ \c!sectionseparatorset=\structureheadparameter\c!sectionseparatorset,
+ \c!sectionconversionset=\structureheadparameter\c!sectionconversionset,
+ \c!sectionconversion=\structureheadparameter\c!conversion, % just for compatibility
+ \c!sectionstopper=\structureheadparameter\c!sectionstopper,
+ \c!sectionset=\structureheadparameter\c!sectionset,
+ \c!sectionsegments=\structureheadparameter\c!sectionsegments,
+ \c!reference=\structureheadreference,
+ \c!referenceprefix=\structureheadreferenceprefix,
+ \c!command=,
+ #2]%
+ [#3]%
+ \reportcurrentstructure}
+
+\unexpanded\def\placeheadtext {\dosingleempty\doplaceheadtext } % use with care
+\unexpanded\def\placeheadnumber{\dosingleempty\doplaceheadnumber} % use with care
+
+\def\doplaceheadtext[#1]%
+ {\dontleavehmode
+ \begingroup
+ \edef\currentstructurehead{#1}%
+ \dosetstructureheadattributes\c!style\c!color
+ \dosetstructureheadattributes\c!textstyle\c!textcolor
+ \dontconvertfont
+ \setupinterlinespace
+ \relax
+ \getspecificstructuretitle{\thenamedstructureheadlevel{#1}}%
+ \endgraf
+ \endgroup}
+
+\def\doplaceheadnumber[#1]%
+ {\dontleavehmode
+ \begingroup
+ \edef\currentstructurehead{#1}%
+ \dosetstructureheadattributes\c!style\c!color
+ \dosetstructureheadattributes\c!numberstyle\c!numbercolor
+ \dontconvertfont
+ \setupinterlinespace
+ \relax
+ \getfullstructurenumber{\thenamedstructureheadlevel{#1}}%
+ \endgraf
+ \endgroup}
+
+\def\dohandlestructurehead#1#2#3% name data userdata
+ {\xdef\currentstructurehead {#1}%
+ \xdef\currentstructureheadcoupling{\structuresectionheadcoupling\currentstructurehead}%
+ \xdef\currentstructureheadsection {\structuresectionheadsection \currentstructureheadcoupling}%
+ \xdef\currentstructureheadlevel {\structuresectionlevel \currentstructureheadsection}%
+ %writestatus\m!systems{setup: \currentstructurehead,\currentstructureheadcoupling,\currentstructureheadsection,\currentstructureheadlevel}%
+ %
+ \setstructureheadreference{#3}% will change
+ \setstructureheadincrement
+ \setstructureheadplacement
+ \setstructureheaddisplay
+ \setstructureheadnumber
+ %
+ \unexpanded\def\\{\space}%
+ \flushingcolumnfloatsfalse
+ %
+ % todo: also mark (for header)
+ %
+ % we might remove the lower level
+ %
+ % not here, after optional \page: \doregisterstructurehead{#1}{#2}{#3}%
+ %
+% \xdef\currentstructureheadcounter{\currentstructurecounter}% lua call
+ %
+ % \currentstructuresynchronize % will move
+ %
+ \edef\numberheaddistance {\structureheadparameter\c!distance }% compatibility
+ \edef\numberheadalternative{\structureheadparameter\c!alternative}% compatibility
+ %
+ \let\getstructureheadnumber\empty
+ \let\getstructureheadtitle \empty
+ \let\getstructureheadsyncs \empty
+ \ifconditional\structureheaddoincrement
+ \ifconditional\structureheaddoplace
+ \dostructureheadspacingbeforeyes
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \let\getstructureheadtitle\fullstructureheadtitle
+ \ifconditional\structureheadshownumber
+ \let\getstructureheadnumber\fullstructureheadnumber
+ \placestructureheadnumbertext
+ \else
+ \placestructureheadtext
+ \fi
+ \dostructureheadspacingafteryes
+ \else
+ \dostructureheadspacingbeforenop % toegevoegd ivm subpaginanr / tug sheets
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \placestructureheadnothing % just flush 'm
+ \dostructureheadspacingafternop
+ \fi
+ \else
+ \ifconditional\structureheaddoplace
+ \dostructureheadspacingbeforeyes
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \let\getstructureheadtitle\fullstructureheadtitle
+ \placestructureheadtext
+ \dostructureheadspacingafteryes
+ \else
+ % do nothing / should be vbox to 0pt
+ \dostructureheadspacingbeforenop
+ \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \let\getstructureheadsyncs\thestructureheadsynchonization
+ \placestructureheadnothing % just flush 'm
+ \dostructureheadspacingafternop
+ \fi
+ \fi
+ \flushingcolumnfloatstrue
+ \setfalse\ignorehandlepagebreak
+ % ignorespaces prevents spaces creeping in when after=\dontleavehmode
+ \ifconditional\structureheadisdisplay % \ifdisplaysectionhead
+ \ignorespaces
+ \else
+ \expandafter\GotoPar
+ \fi}
+
+% typesetting
+
+\def\placestructureheadnumbertext % dummy, will be overloaded
+ {\getstructureheadnumber/\getstructureheadtitle
+ \getstructureheadsyncs}
+
+\def\placestructureheadtext % dummy, will be overloaded
+ {\getstructureheadtitle
+ \getstructureheadsyncs}
+
+\def\placestructureheadnothing % dummy, will be overloaded
+ {\getstructureheadsyncs}
+
+% pagebreaks
+
+\newcount\precedingstructurelevel \precedingstructurelevel\plusone
+\newconditional\ignorehandlepagebreak
+
+\def\dostructureheadspacingbeforeyes
+ {\docheckstructureheadbefore\dohandlestructureheadpagebreak
+ \structureheadparameter\c!inbetween}
+
+\def\dostructureheadspacingbeforenop
+ {\docheckstructureheadbefore\docheckstructureheadlayout
+ \structureheadparameter\c!inbetween}
+
+% \def\emptystructureheadcorrection
+% {\ifconditional\structureheadleaveempty % inlined \emptyheadcorrection (with after=\blank)
+% \vskip-\lineheight
+% \dosomebreak\nobreak % \penalty10000 in vspacing
+% \kern\zeropoint
+% \prevdepth\strutdepth
+% \fi}
+
+\def\emptystructureheadcorrection
+ {\ifconditional\structureheadleaveempty % inlined \emptyheadcorrection (with after=\blank)
+ \penalty10000 % first ... we need to adapt this all to vspacing
+ \vskip-\lineheight
+ \kern\zeropoint
+ \prevdepth\strutdepth
+ \fi}
+
+\def\dostructureheadspacingafteryes
+ {\ifconditional\structureheadisdisplay
+ \dosomebreak\nobreak % needs to be adapted to vspacing
+ \emptystructureheadcorrection
+ \structureheadparameter\c!after
+ \fi}
+
+\def\dostructureheadspacingafternop
+ {}
+
+\newsignal\continuousstructureheadsignal
+
+\def\docheckstructureheadbefore#1%
+ {\ifhmode
+ \scratchcounter\lastpenalty\unpenalty % no beauty in this
+ \ifdim\lastskip=\continuousstructureheadsignal
+ % no page break
+ \ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \global\precedingstructurelevel\currentstructureheadlevel
+ \nobreak
+ \fi
+ \global\settrue\continuoussectionhead
+ \else
+ \penalty\scratchcounter
+ \global\setfalse\continuoussectionhead
+ #1%
+ \fi
+ \else
+ \global\setfalse\continuoussectionhead
+ #1%
+ \fi}
+
+\def\dodocheckstructureheadlayout#1#2%
+ {\doifelselayouttextline{#1}
+ {\doifsomething{\structureheadparameter#2}{\expanded{\setuplayouttext[#1][\c!state=\structureheadparameter#2]}}}
+ \donothing}
+
+\def\docheckstructureheadlayout
+ {\doifsomething{\structureheadparameter\c!page}
+ {\page[\structureheadparameter\c!page]%
+ \dodocheckstructureheadlayout\v!header\c!header
+ \dodocheckstructureheadlayout\v!text \c!text
+ \dodocheckstructureheadlayout\v!footer\c!footer}}
+
+\def\currentstructurecounter {\ctxlua{structure.sections.depthnumber(\thenamedstructureheadlevel\currentstructurehead)}}
+\def\previousstructurecounter{\ctxlua{structure.sections.depthnumber(\thenamedstructureheadlevel\currentstructurehead-1)}}
+
+\def\dohandlestructureheadpagebreak
+ {%[[\currentstructurehead @\thenamedstructureheadlevel\currentstructurehead/prev:\previousstructurecounter/curr:\currentstructurecounter]]
+ \ifconditional\ignorehandlepagebreak
+ \setfalse\ignorehandlepagebreak
+ \else
+ \ifnum\lastpenalty>\zerocount
+ \global\pagebreakdisabledtrue
+ \fi
+ % beware, these numbers are not yet know here
+ \doifelse{\structureheadparameter\c!continue}\v!yes
+ {\ifnum\previousstructurecounter=\zerocount
+ \docheckstructureheadlayout
+ \else\ifnum\currentstructurecounter>\zerocount
+ \docheckstructureheadlayout
+ \fi\fi}%
+ {\docheckstructureheadlayout}%
+ \doifnot{\structureheadparameter\c!aligntitle}\v!float\flushsidefloats
+ \structureheadparameter\c!before
+ \relax
+ \ifpagebreakdisabled
+ \global\pagebreakdisabledfalse
+ \else
+ \dopreventbreakafterstructureheadauto
+ \fi
+ \doif{\structureheadparameter\c!aligntitle}\v!float\indent
+ \global\precedingstructurelevel\currentstructureheadlevel
+ \fi}
+
+% the next one was: \somebreakmethod
+
+\chardef\somestructureheadbreakmethod\plusone % 0=nothing, 1=weighted, 2=strict, 3=vspacing
+
+\def\dopreventbreakafterstructureheadauto % used after \c!before
+ {\ifcase\somestructureheadbreakmethod
+ % 0 = nothing
+ \or
+ % 1 = old weighted version
+ \ifnum\currentstructureheadlevel>\precedingstructurelevel
+ \dosomebreak{\penalty\numexpr20000+500*\currentstructureheadlevel\relax}%
+ \else
+ \dosomebreak\allowbreak % brr
+ \fi
+ \or
+ % 2 = strict version
+ \dosomebreak{\penalty\maxdimen}%
+ \or
+ % 3 = vspacing
+ \vspacing[\v!samepage]% if preceded by ! then a loop
+ \else
+ % nothing
+ \fi}
+
+\def\dopreventbreakafterstructureheadspec#1% see enumerations etc
+ {\ifcase\somestructureheadbreakmethod
+ % 0 = nothing
+ \or
+ % 1 = old weighted version
+ \dosomebreak{\penalty\numexpr20000+500*(\currentstructureheadlevel+#1)\relax}%
+ \or
+ % 2 = strict version
+ \dosomebreak{\penalty\maxdimen}%
+ \or
+ % 3 = vspacing
+ \vspacing[\v!samepage]%
+ \else
+ % nothing
+ \fi}
+
+\def\dohandlepagebreakX{\dopreventbreakafterstructureheadspec} % no \let so we can redefind
+
+% we do support negative numbers but it can have side effects that we won't
+% catch
+%
+% \chapter{some} \setupheadnumber[chapter][3] \chapter{more}
+% \setupheadnumber[section][8] \section{b} \section{c} \setupheadnumber[section][-1] \section{d}
+
+\def\thecurrentstructureheadlevel#1%
+ {\getcurrentstructurelevel{#1}}
+
+\def\thenamedstructureheadlevel#1%
+ {\structuresectionlevel{\structuresectionheadsection{\structuresectionheadcoupling{#1}}}}
+
+\def\setupheadnumber
+ {\dodoubleargument\dosetupheadnumber}
+
+\def\dosetupheadnumber[#1][#2]% todo: reset if at other level
+ {\setstructurenumber{\thenamedstructureheadlevel{#1}}{#2}}
+
+\def\currentstructureheadnumber{0} % ==> \currentheadnumber
+
+\def\determineheadnumber[#1]%
+ {\xdef\currentstructureheadnumber{\getstructurenumber{\thenamedstructureheadlevel{#1}}}}
+
+% The previous macro is been replaced by the expandable:
+
+\def\namedheadnumber#1{\getstructurenumber{\thenamedstructureheadlevel{#1}}}
+
+\def\structureheadnumber
+ {\dosingleempty\dostructureheadnumber}
+
+\def\dostructureheadnumber[#1]% simple case is just a number
+ {\getfullstructurenumber{\iffirstargument\thecurrentstructureheadlevel{#1}\fi}}
+
+% compatibility code (after all, we might offer different structure handlers as well
+% but we might as well remove the 'structure' substring at some point (we needed it
+% in order to test the old and new methods alongside)
+
+\let\definesectionblock \definestructureblock
+\let\definesection \definestructuresection
+\let\setupsection \setupstructuresection
+\let\setupheads \setupstructureheads
+\let\definehead \definestructurehead
+\let\setuphead \setupstructurehead
+\let\headnumber \structureheadnumber
+\let\setupsectionblock \setupstructureblock
+
+\let\sectioncountervalue\structurevalue
+
+\def\currentheadnumber {\currentstructureheadnumber}
+\def\currentheadtext {obsolete, use marks}
+
+% list references, will be redone in lua when we need it
+
+\let\startlistreferences\relax
+\let\stoplistreferences \relax
+
+\protect \endinput