diff options
author | Hans Hagen <pragma@wxs.nl> | 2020-11-23 19:48:34 +0100 |
---|---|---|
committer | Context Git Mirror Bot <phg@phi-gamma.net> | 2020-11-23 19:48:34 +0100 |
commit | 18499e46a49b8ccf4346686d1cf626ada33935b8 (patch) | |
tree | bd0ae7b601b323e20954c10c07598637d9403e00 /tex/context/base/mkxl/strc-sec.mkxl | |
parent | 4b089e589d39346a66a27d04f9857fe16e4b7b41 (diff) | |
download | context-18499e46a49b8ccf4346686d1cf626ada33935b8.tar.gz |
2020-11-23 18:39:00
Diffstat (limited to 'tex/context/base/mkxl/strc-sec.mkxl')
-rw-r--r-- | tex/context/base/mkxl/strc-sec.mkxl | 1321 |
1 files changed, 1321 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/strc-sec.mkxl b/tex/context/base/mkxl/strc-sec.mkxl new file mode 100644 index 000000000..e5371d1e9 --- /dev/null +++ b/tex/context/base/mkxl/strc-sec.mkxl @@ -0,0 +1,1321 @@ +%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 \& \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. + +%D In retrospect I should have gone futher and move more to the +%D \LUA\ end but here we are now. Maybe some day. + +\writestatus{loading}{ConTeXt Structure Macros / Sectioning} + +\unprotect + +\startcontextdefinitioncode + +\installcorenamespace{structure} + +\installdirectcommandhandler \??structure {structure} % unchecked, so we need to initialize used parameters + +\setupstructure % not a user command so we might need to change the name + [\c!number=, + \c!level=, + \c!name=, + \c!title=, + \c!bookmark=, + \c!marking=, + \c!list=, + \c!label=, + \c!coupling=, + \c!ownnumber=, + % \c!interaction=\v!list, + \c!sectionseparatorset=\s!default, + \c!sectionconversionset=\s!default, + \c!sectionstopper=, + \c!sectionstarter=, + \c!sectionsegments=, + \c!sectionresetset=, + \c!reference=, + \c!backreference=, + \c!expansion=\v!no, + \c!xmlsetup=, + \s!catcodes=, + \c!saveinlist=\v!yes] + +% maybe flags for list, bm, mark + +\def\m_strc_references_prefix_yes{+} +\def\m_strc_references_prefix_nop{-} + +\let\currentstructurereferenceprefix\empty + +\installglobalmacrostack\currentstructurereferenceprefix + +\def\strc_sectioning_set_reference_prefix + {\ifempty\currentstructurereferenceprefix + % nothing + \orelse\ifx\currentstructurereferenceprefix\m_strc_references_prefix_yes + \global\advance\prefixcounter \plusone % temp here + \setupglobalreferenceprefix[\the\prefixcounter]% + \orelse\ifx\currentstructurereferenceprefix\m_strc_references_prefix_nop + \setupglobalreferenceprefix[]% + \else + \setupglobalreferenceprefix[\currentstructurereferenceprefix]% + \fi + \glet\currentstructurereferenceprefix\referenceprefix} + +% why xdef ? + +\setupstructure + [\c!label={\headparameter{\currentsectionblock\c!label}}, + \c!incrementnumber=\ifconditional\c_strc_sectioning_increment\v!yes\else\v!no\fi, % not that needed + \c!saveinlist=\ifconditional\c_strc_sectioning_to_list\v!yes\else\v!no\fi, + \c!level=\currentheadlevel, + \c!number=\ifconditional\c_strc_sectioning_increment\ifconditional\headshownumber\v!yes\else\v!no\fi\else\v!no\fi, + \c!expansion=\headparameter\c!expansion, + \c!xmlsetup=\headparameter\c!xmlsetup, + \s!catcodes=\headparameter\s!catcodes, + \c!sectionresetset=\headparameter\c!sectionresetset, + \c!sectionseparatorset=\headparameter\c!sectionseparatorset, + \c!sectionconversionset=\headparameter\c!sectionconversionset, + \c!sectionconversion=\headparameter\c!conversion, % just for compatibility + \c!sectionstarter=\headparameter\c!sectionstarter, + \c!sectionstopper=\headparameter\c!sectionstopper, + \c!sectionset=\headparameter\c!sectionset, + \c!sectionsegments=\headparameter\c!sectionsegments, + \c!reference=\headparameter\c!reference, + \c!referenceprefix=\headparameter\c!referenceprefix, + \c!criterium=\headparameter\c!criterium] + +% see lists/neat-001.tex for usage of: + +\permanent\def\namedstructureheadlocation#1% expandable, maybe [#1] + {\csname\??savedinternalreference\ifcsname\??savedinternalreference#1\endcsname#1\else\s!default\fi\endcsname} + +% The next directive only makes sense when we have sort of garanteed outcome (math is not so +% nice for instance). +% +% \enabledirectives[references.bookmarks.preroll] + +\newconditional\c_strc_bookmarks_preroll + +\installtexdirective + {references.bookmarks.preroll} + {\settrue \c_strc_bookmarks_preroll} + {\setfalse\c_strc_bookmarks_preroll} + +\def\strc_sectioning_autobookmark#1% + {\begingroup + % \settrialtypesetting + \the\everypreroll + \nodestostring\tempstring{#1}% + \glet\currentstructurebookmark\tempstring + \endgroup} + +% zeros: +% +% \setuphead[subsection][criterium=all] +% +% \dorecurse{3} { +% \chapter{Blabla} \subsection{bla 1 1} \subsection{bla 1 2} +% \section{bla 2} \subsection{bla 2 1} \subsection{bla 2 2} +% } + +\protected\def\strc_sectioning_register#1#2#3% #1=interfaced-settings, #2=optional user data (not yet supported) + {\begingroup + \setupstructure[\c!name={#1},#2]% + \xdef\currentstructurename {\structureparameter\c!name}% + \xdef\currentstructurecoupling {\structureparameter\c!coupling}% + \xdef\currentstructureownnumber {\structureparameter\c!ownnumber}% optional own number + \xdef\currentstructurelevel {\structureparameter\c!level}% + \edef\currentstructureexpansion {\structureparameter\c!expansion}% + \xdef\currentstructurexmlsetup {\structureparameter\c!xmlsetup}% + \xdef\currentstructurecatcodes {\structureparameter\s!catcodes}% + \xdef\currentstructurelabel {\structureparameter\c!label}% + \xdef\currentstructurereference {\structureparameter\c!reference}% + \xdef\currentstructurereferenceprefix{\structureparameter\c!referenceprefix}% + \xdef\currentstructurebackreference {\structureparameter\c!backreference}% + \xdef\currentstructureshownumber {\structureparameter\c!number}% + \xdef\currentstructuresaveinlist {\structureparameter\c!saveinlist}% + \xdef\currentstructureincrementnumber{\structureparameter\c!incrementnumber}% + \xdef\currentstructureplaceholder {\structureparameter\c!placeholder}% + \ifx\currentstructureexpansion\s!xml + \xmlstartraw + \xdef\currentstructuretitle {\structureparameter\c!title}% + \xdef\currentstructurebookmark{\structureparameter\c!bookmark}% + \xdef\currentstructuremarking {\structureparameter\c!marking}% + \xdef\currentstructurelist {\structureparameter\c!list}% + \xmlstopraw + \iflocation \ifempty\currentstructurebookmark \ifconditional\c_strc_bookmarks_preroll + \strc_sectioning_autobookmark\currentstructuretitle + \fi \fi \fi + \ifempty\currentstructurelist + \glet\currentstructurelist\currentstructuretitle + \fi + \glet\currentstructurecoding\s!xml + \else + \ifx\currentstructureexpansion\v!yes + \xdef\currentstructuretitle {\structureparameter\c!title}% + \xdef\currentstructurebookmark{\structureparameter\c!bookmark}% + \xdef\currentstructuremarking {\structureparameter\c!marking}% + \xdef\currentstructurelist {\structureparameter\c!list}% + \iflocation \ifempty\currentstructurebookmark \ifconditional\c_strc_bookmarks_preroll + \strc_sectioning_autobookmark\currentstructuretitle + \fi \fi \fi + \else + \xdef\currentstructuretitle {\detokenizedstructureparameter\c!title}% + \xdef\currentstructurebookmark{\detokenizedstructureparameter\c!bookmark}% + \xdef\currentstructuremarking {\detokenizedstructureparameter\c!marking}% + \xdef\currentstructurelist {\detokenizedstructureparameter\c!list}% + \iflocation \ifempty\currentstructurebookmark + \ifconditional\c_strc_bookmarks_preroll + \strc_sectioning_autobookmark{\structureparameter\c!title}% + \else + \begingroup + \simplifycommands + \xdef\currentstructurebookmark{\detokenize\expandafter{\normalexpanded{\structureparameter\c!title}}}% + \endgroup + \fi + \fi \fi + \fi + \ifempty\currentstructurelist + \glet\currentstructurelist\currentstructuretitle + \fi + \glet\currentstructurecoding\s!tex + \fi + \setnextinternalreference + \storeinternalreference\currentstructurename{\the\locationcount}% + \strc_sectioning_set_reference_prefix + \clf_setsectionentry + references { + internal \locationcount + % block {\currentsectionblock} + prefix {\currentstructurereferenceprefix} + reference {\currentstructurereference} + backreference {\currentstructurebackreference} + } + directives { + resetset {\structureparameter\c!sectionresetset} + } + metadata { + kind {section} + name {\currentstructurename} + catcodes \ifempty\currentstructurecatcodes\catcodetable\else\csname\currentstructurecatcodes\endcsname\fi\space + coding {\currentstructurecoding} + \ifx\currentstructurecoding\s!xml + xmlroot {\xmldocument} + \fi + \ifempty\currentstructurexmlsetup \else + xmlsetup {\currentstructurexmlsetup} + \fi + \ifx\currentstructuresaveinlist\v!no + nolist \space true\space + \fi + \ifx\currentstructureincrementnumber\v!yes + increment {\currentstructureincrementnumber} + \fi + } + titledata { + label {\detokenize\expandafter{\currentstructurelabel}} + title {\detokenize\expandafter{\currentstructuretitle}} + \ifx\currentstructurebookmark\currentstructuretitle \else + bookmark {\detokenize\expandafter{\currentstructurebookmark}} + \fi + \ifx\currentstructuremarking\currentstructuretitle \else + marking {\detokenize\expandafter{\currentstructuremarking}} + \fi + \ifx\currentstructuresaveinlist\v!no \else + \ifx\currentstructurelist\currentstructuretitle \else + list {\detokenize\expandafter{\currentstructurelist}} + \fi + \fi + } + numberdata { + % block {\currentsectionblock} + \ifx\currentstructureshownumber\v!no + hidenumber \space true\space % space needed for parser + \fi + separatorset {\structureparameter\c!sectionseparatorset} + conversionset {\structureparameter\c!sectionconversionset} + conversion {\structureparameter\c!sectionconversion} + starter {\structureparameter\c!sectionstarter} + stopper {\structureparameter\c!sectionstopper} + set {\structureparameter\c!sectionset} + segments {\structureparameter\c!sectionsegments} + ownnumber {\currentstructureownnumber} + language {\currentlanguage}% for the moment, needed for bookmarks conversion + criterium {\structureparameter\c!criterium} + } + userdata {\detokenize{#3}}% will be converted to table at the lua end + \relax + \xdef\currentstructurelistnumber{\clf_currentsectiontolist}% + % \currentstructuresynchronize has to be called someplace, since it introduces a node + \setstructuresynchronization\currentstructurelistnumber + \endgroup} + +\let\currentsectioncountervalue \!!zerocount % redefined later +\let\previoussectioncountervalue\!!zerocount % redefined later + +% We can access the (stored) data with the following macros. +% +% \def\MyHeadCommand #1#2{\framed{#1}\framed{#2 / \structureuservariable{subtitle}}} +% \def\MyListCommand#1#2#3{\externalfigure[\structurelistuservariable{figure}][height=5mm]#2} +% +% \setuphead[chapter][command=\MyHeadCommand] +% \setuplist[chapter][alternative=command,command=\MyListCommand] +% +% \starttext +% \setupheadertexts[chapter] +% \setupinteraction[state=start] +% \placebookmarks[chapter] +% \placelist[chapter] +% \startchapter[ownnumber=10,title=Ton,list=Hans,marking=Kees,bookmark=Bram][figure=cow.pdf,subtitle=oeps] +% \stopchapter +% \stoptext + +% todo: #1 => "#1" ... adapt lua code for name and number + +\permanent\def\structurenumber {\clf_structurenumber} +\permanent\def\structuretitle {\clf_structuretitle} +\permanent\def\structurevariable #1{\clf_structurevariable {#1}} +\permanent\def\structureuservariable #1{\clf_structureuservariable {#1}} +\permanent\def\structurecatcodedget #1{\clf_structurecatcodedget {#1}} % bad name +\permanent\def\structuregivencatcodedget #1#2{\clf_structuregivencatcodedget {#1}#2 } % bad name +\permanent\def\structureautocatcodedget #1#2{\clf_structureautocatcodedget {#1}{#2}} +\permanent\def\namedstructurevariable #1#2{\clf_namedstructurevariable {#1}{#2}} +\permanent\def\namedstructureuservariable#1#2{\clf_namedstructureuservariable{#1}{#2}} + +% 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 + +% \newconditional\c_strc_rendering_continuous % not used (mkii ?) + +\permanent\def\setstructurelevel #1#2{\clf_setstructurelevel {#1}{#2}} % name, level|parent +\permanent\def\getstructurelevel #1{\clf_getstructurelevel {#1}} % name +\permanent\def\setstructurenumber #1#2{\clf_setstructurenumber #1{#2}} % level, number (+/-) +\permanent\def\getstructurenumber #1{\clf_getstructurenumber \numexpr#1\relax} % level +\permanent\def\getsomestructurenumber #1#2{\clf_getsomestructurenumber #1{#2}} % level, what +\permanent\def\getfullstructurenumber #1{\clf_getfullstructurenumber \numexpr#1\relax} % level +\permanent\def\getsomefullstructurenumber#1#2{\clf_getsomefullstructurenumber #1{#2}} % level, what +\permanent\def\getspecificstructuretitle #1{\clf_getspecificstructuretitle {#1}{\headparameter\s!catcodes}} + +% structure heads (like \startchapter) + +% \c!deeptextcommand, \c!deepnumbercommand: undefined ! +% \c!before \c!after \c!distance +% \c!page \c!header \c!text \c!footer=, +% \c!numbercommand \c!textcommand \c!ownnumber \c!number +% \c!file \c!grid \c!margintext +% \c!expansion \c!xmlsetup \s!catcode + +\installcorenamespace{head} +\installcorenamespace{headlevel} +\installcorenamespace{headincrement} +\installcorenamespace{headplace} +\installcorenamespace{headmarkyes} +\installcorenamespace{headmarknop} + +\installcommandhandler \??head {head} \??head + +\installmacrostack\currenthead +\installmacrostack\currentheadparent + +\setuphead [% + %\c!after=, + %\c!align=, + %\c!aligntitle=, + \c!alternative=\v!normal, + %\c!before=, + %\c!color=, + %\c!command=, + \c!continue=\v!yes, + %\c!coupling=, + %\c!deepnumbercommand=, + %\c!deeptextcommand=, + %\c!default=, + \c!distance=\zeropoint, + \c!textdistance=\zeropoint, + \c!textwidth=\zeropoint, % signal too + \c!numberwidth=\zeropoint, % signal too + \c!width=\zeropoint, % signal too + \c!expansion=\v!no, + %\c!file=, + %\c!footer=, + %\c!grid=, + \c!hang=\v!none, + %\c!header=, + \c!incrementnumber=\v!yes, + \c!indentnext=\v!no, + %\c!label=, + %\c!limittext=\languageparameter\c!limittext, + \c!margin=\zeropoint, + %\c!margintext=, + \c!number=\v!yes, + \c!numbercolor=\headparameter\c!color, + \c!textcolor=\headparameter\c!color, + \c!numberstyle=\headparameter\c!style, + \c!textstyle=\headparameter\c!style, + %\c!numbercommand=, + %\c!textcommand=, + \c!ownnumber=\v!no, + %\c!page=, + \c!placehead=\v!yes, + \c!sectionconversionset=\s!default, + \c!sectionnumber=\v!yes, + %\c!sectionsegments=, + \c!sectionseparatorset=\s!default, + \c!sectionset=\v!all, + \c!interlinespace=, + %\c!sectionstopper=, + %\c!sectionstarter=, + %\c!strut=, + %\c!style=, + %\c!text=, + %\c!tolerance=, + %\c!beforesection=\directsetup{document:\currenthead:start}, % these might become defaults i.e. acpect document: namespace + %\c!insidesection=\directsetup{document:\currenthead:inside}, % these might become defaults i.e. acpect document: namespace + %\c!aftersection=\directsetup{document:\currenthead:stop}, % these might become defaults i.e. acpect document: namespace + ] + +\aliased\let\setupheads\setuphead % will go + +\appendtoks + \ifempty\currentheadparent + \edef\currentheaddefault{\headparameter\c!default}% + \edef\currentheadsection{\headparameter\c!section}% + \ifx\currenthead\currentheaddefault + \let\currentheadparent\currentheadsection + \orelse\ifempty\currentheaddefault + \let\currentheadparent\currentheadsection + \else + \let\currentheadparent\currentheaddefault + \fi + \normalexpanded {% + \setheadparameter{\c!label}{\currenthead}% + \setheadparameter{\c!coupling}{\currenthead}% + \setheadparameter{\s!parent}{\??head\currentheadparent}% + \definemarking[\currenthead] [\currentheadsection]% + \definemarking[\currenthead\v!number][\currentheadsection]% + \setupmarking [\currenthead] [\c!filtercommand=\noexpand\sectionheadmarkingtitle {\currenthead}]% + \setupmarking [\currenthead\v!number][\c!filtercommand=\noexpand\sectionheadmarkingnumber{\currenthead}]% + }% + \doifelselist\currenthead\donothing + {\definelist[\currenthead][\c!prefix=\v!no]}% + % we can't do this now for backward compatibility reasons + % \doifelselist\currenthead\donothing + % {\normalexpanded{\definelist[\currenthead][\currentheadparent][\c!prefix=\v!no]}}% + \else + \normalexpanded {% + \setheadparameter{\c!label}{\currenthead}% + \setheadparameter{\c!coupling}{\currentheadparent}% + \definemarking[\currenthead] [\currentheadparent]% + \definemarking[\currenthead\v!number][\currentheadparent\c!number]% + }% + \doifelselist\currenthead\donothing + {\normalexpanded{\definelist[\currenthead][\currentheadparent][\c!prefix=\v!no]}}% + \fi + \presetlabeltext[\currenthead=]% + \the\everysetuphead +\to \everydefinehead + +\newtoks\everyredefinehead + +\appendtoks + \the\everyredefinehead +\to \everydefinehead + +\appendtoks + \setstructurelevel\currenthead{\thenamedheadlevel\currenthead}% +\to \everyredefinehead + +\appendtoks + % beware, this is a global register + \begingroup + \edef\currentsectionheadcoupling{\sectionheadcoupling\currenthead}% + \edef\currentsectionheadsection {\sectionheadsection \currentsectionheadcoupling}% + \edef\currentsectionlevel {\sectionlevel \currentsectionheadsection}% + \clf_registersection {\currenthead} { + coupling {\currentsectionheadcoupling} + section {\currentsectionheadsection} + level \space \currentsectionlevel \space % space needed for parser + parent {\currentheadparent} + }% + \endgroup +\to \everyredefinehead + +\appendtoks + \frozen\instance\setuevalue{\e!start\currenthead}{\strc_sectioning_start[\currenthead]}% + \frozen\instance\setuevalue{\e!stop \currenthead}{\strc_sectioning_stop [\currenthead]}% +\to \everydefinehead + +% so \subject as well as \section will need two commands when ownnumber +% is used (one can disable it anyway for subject) .. this is not downward +% compatible but better + +\appendtoks + \ifempty\currenthead \else + \doifelse{\headparameter\c!ownnumber}\v!yes + {\instance\setuevalue\currenthead{\strc_sectioning_handle_own[\currenthead]}} + {\instance\setuevalue\currenthead{\strc_sectioning_handle_nop[\currenthead]}}% + \fi +\to \everysetuphead + +\permanent\protected\def\doredefinehead#1#2% called at lua end + {\push_macro_currenthead + \push_macro_currentheadparent + \edef\currenthead{#1}% + \edef\currentheadparent{#2}% + \the\everyredefinehead\relax + \pop_macro_currentheadparent + \pop_macro_currenthead} + +\let\currentnamedsection\empty + +\installmacrostack\currentnamedsection + +% structure sections (the parents of chapter etc) + +\let\firstsectionname\empty +\let\lastsectionname \empty + +\let\resetallstructuremarks \relax +\let\resetcurrentstructuremarks \relax +\let\resetcurrentstructuremarkswithpage\relax + +\def\resetallstructuremarks {\resetmarking[\firstsectionname]} % will become option (was \v!section-1) +\def\resetcurrentstructuremarks {\resetmarking[\lastsectionname]} % will become option +%def\resetcurrentstructuremarkswithpage{\resetmarking[\lastsectionname]} % will become option + +% We could use a commandhandler here but sections are somewhat special in the +% sense that we have two ways of chaining: the main section (levels) as well +% as rendering (head). + +% -2 = text +% -1 = manual +% 0 = block +% +1 = structurelevel 1 .. n + +\newcount\maxstructuredepth + +\permanent\def\sectionlevel#1% + {\csname\??headlevel\ifcsname\??headlevel#1\endcsname#1\else\v!none\fi\endcsname} + +\permanent\def\namedsectionlevel#1#2% direct indirect + {\csname\??headlevel + \ifcsname\??headlevel#1\endcsname + #1% + \orelse\ifcsname\??headlevel#2\endcsname + #2% + \else + \v!none + \fi + \endcsname} + +\permanent\def\xthenamedheadlevel#1% + {\namedsectionlevel{#1}{\sectionheadsection{\sectionheadcoupling{#1}}}} + +\setvalue{\??headlevel\v!block}{0} +\setvalue{\??headlevel\v!none }{-1} +\setvalue{\??headlevel\v!text }{-2} +\setvalue{\??headlevel\v!head }{-3} + +\newtoks\everydefinesection + +\permanent\protected\def\definesection[#1]% + {\ifcsname\??headlevel#1\endcsname \else + \edef\currentsection{#1}% not used, will go + \edef\currenthead{#1}% + \global\advance\maxstructuredepth\plusone + \setevalue{\??headlevel#1}{\the\maxstructuredepth}% + \setstructurelevel{#1}{\sectionlevel{#1}}% + \normalexpanded{\setheadparameter{\s!parent}{\??head\lastsectionname}}% TO BE CHECKED, WE HAVE A HELPER + \the\everydefinesection + % so far for these default inheritances + \definemarking[#1]% + \ifnum\maxstructuredepth>\plusone + \normalexpanded{\relatemarking[#1][\lastsectionname]}% so, the parent will reset the child + \fi + \xdef\lastsectionname{#1}% + \ifempty\firstsectionname + \glet\firstsectionname\lastsectionname + \fi + \fi} + +\permanent\tolerant\protected\def\setupsection[#1]#*[#2]#*[#3]% + {\ifparameter#1\else + \push_macro_currenthead + \edef\currenthead{\ifcsname\??headlevel#1\endcsname#1\else\sectionheadsection{#1}\fi}% + \ifparameter#3\or + \edef\currenthead{\currenthead#2}% not used at any more in mkiv (sets now) + \setupcurrenthead[#3]% + \else + \setupcurrenthead[#2]% + \fi + \pop_macro_currenthead + \fi} + +% we share the parameters as sections are roots of heads so eventually we can +% consider \definesection -> \definehead with one argument + +\appendtoks + % This is a rather practical default that we don't want to + % be part of the parent chain lookup mechanism; it's also + % mkii compatible. Somewhat weird that it's part of the + % top level structure but it will be flattened anyway. + \let\currenthead\currentsection % + \setheadparameter\c!textstyle {\directheadparameter\c!style}% + \setheadparameter\c!textcolor {\directheadparameter\c!color}% + \setheadparameter\c!numberstyle{\directheadparameter\c!style}% + \setheadparameter\c!numbercolor{\directheadparameter\c!color}% +\to \everydefinesection + +% head -> head + +\permanent\def\sectionheadmarkingtitle #1#2{\clf_markingtitle {#1}{#2}} % can be done at lua end +\permanent\def\sectionheadmarkingnumber#1#2{\clf_markingnumber{#1}{#2}} % can be done at lua end + +\permanent\def\sectionheadcoupling#1{\namedheadparameter{#1}\c!coupling} +\permanent\def\sectionheadsection #1{\namedheadparameter{#1}\c!section} + +% head construction + +\newconditional\currentstructureown + +\newtoks\everybeforehead % hook, todo: before/after keys +\newtoks\everyafterhead % hook, todo: before/after keys + +\permanent\tolerant\protected\def\strc_sectioning_handle_own[#1]#*[#2]#:#*#=#*#=% [ref] {nr} {title} + {\settrue\currentstructureown + \triggerautostructurelevel + \strc_sectioning_handle{#1}{\c!reference={#2},\c!ownnumber={#3},\c!title={#4}}{}} % name ref nr title -- + +\permanent\tolerant\protected\def\strc_sectioning_handle_nop[#1]#*[#2]% [ref] {title} / for taco: [key=value] variant + {\setfalse\currentstructureown + \triggerautostructurelevel + \ifhastok={#2}% + \expandafter\strc_sectioning_handle_nop_indeed_yes + \else + \expandafter\strc_sectioning_handle_nop_indeed_nop + \fi + {#1}{#2}} + +\def\strc_sectioning_handle_nop_indeed_yes#1#2% + {\strc_sectioning_handle{#1}{#2}{}} + +\def\strc_sectioning_handle_nop_indeed_nop#1#2#3% + {\strc_sectioning_handle{#1}{\c!reference={#2},\c!title={#3}}{}} % name ref nr title -- + +\permanent\tolerant\protected\def\strc_sectioning_start[#1]#*[#2]#*[#3]% for the moment no grouping, too annoying with page breaks + {\push_macro_currentnamedsection + \push_macro_currentstructurereferenceprefix + \edef\currentnamedsection{#1}% + \setfalse\currentstructureown + %\globalpushmacro\currenthead % this does not work out well + \xdef\currenthead{#1}% + \setsystemmode\currenthead % new, also here now + \headparameter\c!beforesection % beware, no users vars set yet + \the\everybeforehead + \strc_sectioning_handle{#1}{#2}{#3}% name -- -- -- userdata (we might move the tagged to here) + % potential: \bgroup (can be optional: grouped = yes) + \headparameter\c!insidesection} + +\permanent\protected\def\strc_sectioning_stop[#1]% !!! also used at lua end + {\dostoptagged + \dostoptagged + % potential: \egroup + %\globalpopmacro\currenthead % so we do a hard recover + \xdef\currenthead{#1}% recover + \headparameter\c!aftersection + \the\everyafterhead + \resetsystemmode\currenthead + \pop_macro_currentstructurereferenceprefix + \pop_macro_currentnamedsection} % new, also here now + +\aliased\let\dostarthead\strc_sectioning_start % used at lua end +\aliased\let\dostophead \strc_sectioning_stop % used at lua end + +% todo: add grouping but where: before/after trickery .. probably inside because one can always add +% grouping to the before/after settings + +\aliased\let\startnamedsection\strc_sectioning_start + +\permanent\protected\def\stopnamedsection + {\normalexpanded{\strc_sectioning_stop[\currentnamedsection]}} + +% \newconditional\structurereversesectionnumbers % todo: key/val + +\newconditional\c_strc_sectioning_to_list +\newconditional\c_strc_sectioning_increment +\newconditional\c_strc_sectioning_place +\newconditional\c_strc_sectioning_empty +\newconditional\c_strc_sectioning_hidden +\newconditional\c_strc_sectioning_section + +\newconditional\headshownumber % public +\newconditional\headisdisplay % public +\newconditional\headissomewhere % public + +\setvalue{\??headincrement\v!yes }{\settrue \c_strc_sectioning_increment\settrue \c_strc_sectioning_to_list} +\setvalue{\??headincrement\v!no }{\setfalse\c_strc_sectioning_increment\setfalse\c_strc_sectioning_to_list} +\setvalue{\??headincrement\v!list }{\setfalse\c_strc_sectioning_increment\settrue \c_strc_sectioning_to_list} +\setvalue{\??headincrement\s!empty}{\settrue \c_strc_sectioning_increment\settrue \c_strc_sectioning_to_list} + +\protected\def\strc_sectioning_initialize_increment + {\edef\currentheadincrement{\headparameter\c!incrementnumber}% + \ifcsname\??headincrement\currentheadincrement\endcsname + \lastnamedcs + \else + \settrue \c_strc_sectioning_increment\settrue \c_strc_sectioning_to_list + % \filterheadnumber + \fi} + +\permanent\protected\def\filterheadnumber + {\settrue\c_strc_sectioning_increment + \settrue\c_strc_sectioning_to_list + \ifempty\currentproduct + % todo : filter from other toc (number, file, title) + % use : \currentheadincrement as spec + \fi} + +\setvalue{\??headplace\v!yes}% + {\setfalse\c_strc_sectioning_empty + \settrue \c_strc_sectioning_place + \setfalse\c_strc_sectioning_hidden + \setfalse\c_strc_sectioning_section} + +\setvalue{\??headplace\v!empty}% + {\settrue \c_strc_sectioning_empty + \settrue \c_strc_sectioning_place + \setfalse\c_strc_sectioning_hidden + \setfalse\c_strc_sectioning_section} + +\setvalue{\??headplace\v!no}% + {\settrue \c_strc_sectioning_empty + \setfalse\c_strc_sectioning_place + \setfalse\c_strc_sectioning_hidden + \setfalse\c_strc_sectioning_section} + +\setvalue{\??headplace\v!hidden}% + {\settrue \c_strc_sectioning_empty + \setfalse\c_strc_sectioning_place + \settrue \c_strc_sectioning_hidden + \setfalse\c_strc_sectioning_section} + +\setvalue{\??headplace\v!section}% + {\settrue \c_strc_sectioning_empty + \setfalse\c_strc_sectioning_place + \settrue \c_strc_sectioning_hidden + \settrue \c_strc_sectioning_section} + +\protected\def\strc_sectioning_initialize_placement + {\expandnamespaceparameter\??headplace\headparameter\c!placehead\v!yes} + +\newmode\v!sectionnumber + +\def\dosetstructureheadnumbercontent + {\setsystemmode\v!sectionnumber + \settrue\headshownumber} % why ? + +\def\doresetstructureheadnumbercontent + {\resetsystemmode\v!sectionnumber + \setfalse\headshownumber} % why ? + +\protected\def\strc_sectioning_initialize_number + {\edef\p_number{\sectionblockparameter\c!number}% + \ifx\p_number\v!yes + \edef\p_number{\headparameter\c!number}% + \ifx\p_number\v!yes + \settrue\headshownumber + \else + \setfalse\headshownumber + \fi + \else + \setfalse\headshownumber + \fi} + +% Beware, we do need some node for anchoring marks and normally a zwnj will +% do but it interferes so we deal with it at the \LUA\ end. + +\newtoks\everyheadsynchronization + +% \appendtoks +% \currentstructuresynchronize +% \to \everyheadsynchronization + +\aliased\let\currentstructuresynchronize\donothing + +\appendtoks + \currentstructuresynchronize + \enforced\glet\currentstructuresynchronize\donothing +\to \everyheadsynchronization + +\protected\def\theheadsynchonization + {% no, interferes: \signalcharacter + \the\everyheadsynchronization} + +% BEWARE: \marking[section]{my text} does not work as we use list indices instead +% so we need a 'keep track of raw set option' (or maybe a funny internal prefix) + +\permanent\protected\def\setheadmarking % li:: so that we can use \marking[section]{Taco needed this} + {\strc_sectioning_delayed_flush + \normalexpanded{\setmarking[\currenthead]{li::\currentstructurelistnumber}}} + +\let\deepstructurenumbercommand\relax +\let\deepstructuretitlecommand \relax + +\permanent\protected\def\fullheadnumber + {\edef\currentheadlabeltag{\currentsectionblock\c!label}% + \dostarttagged\t!sectionnumber\empty + \labeltexts + {\headparameter\currentheadlabeltag} + {\ifx\deepstructurenumbercommand\relax + \structurenumber + \else + \normalexpanded{\noexpand\deepstructurenumbercommand{\structurenumber}}% + \fi}% + \dostoptagged} + +\permanent\protected\def\fullheadtitle + {\dostarttagged\t!sectiontitle\empty + \ifx\deepstructuretitlecommand\relax + \structuretitle + \else + \normalexpanded{\noexpand\deepstructuretitlecommand{\structuretitle}}% + \fi + \dostoptagged} + +\let\currenthead \empty +\let\currentheadcoupling\empty +\let\currentheadsection \empty +\let\currentheadlevel \!!zerocount +\let\currentheadcounter \!!zerocount + +\let\strc_show_used\relax + +\installtextracker + {structures.showused} + {\let\strc_show_used\clf_showstructure} + {\let\strc_show_used\relax} + +\appendtoks + \strc_show_used +\to \everystoptext + +\protected\def\strc_sectioning_report{\clf_reportstructure} + +\ifdefined\strc_rendering_initialize_style_and_color \else + + \protected\def\strc_rendering_initialize_style_and_color#1#2% + {\dontconvertfont + \useheadstyleandcolor\c!style\c!color + \useheadstyleandcolor#1#2% + \setupinterlinespace} + +\fi + +\permanent\tolerant\protected\def\placeheadtext[#1]% + {\dontleavehmode + \begingroup + \protected\def\\{\space}% messy here, but the default (and needs to be grouped) + \global\settrue\headisdisplay % triggers interlinespace checking + \edef\currenthead{#1}% maybe only when #1 is given + \strc_rendering_initialize_style_and_color\c!textstyle\c!textcolor + \relax + \getspecificstructuretitle{\thenamedheadlevel{#1}}% + \endgraf + \endgroup} + +\permanent\tolerant\protected\def\placeheadnumber[#1]% + {\dontleavehmode + \begingroup + \global\settrue\headisdisplay % triggers interlinespace checking + \edef\currenthead{#1}% maybe only when #1 is given + \strc_rendering_initialize_style_and_color\c!numberstyle\c!numbercolor + \relax + \getfullstructurenumber{\thenamedheadlevel{#1}}% + \endgraf + \endgroup} + +\ifdefined\triggerautostructurelevel \else \let\triggerautostructurelevel\relax \fi + +\newtoks\everybeforesectionheadhandle +\newtoks\everyaftersectionheadhandle + +\def\strc_sectioning_handle#1#2#3% name data userdata (we can move #1 to the caller) + {\xdef\currenthead {#1}% + \xdef\currentheadcoupling{\sectionheadcoupling\currenthead}% + \xdef\currentheadsection {\sectionheadsection \currentheadcoupling}% + \xdef\currentheadlevel {\sectionlevel \currentheadsection}% + % + %\writestatus\m!system{setup: \currenthead,\currentheadcoupling,\currentheadsection,\currentheadlevel}% + % + \strc_sectioning_initialize_autolevel + \strc_sectioning_initialize_increment + \strc_sectioning_initialize_placement + \strc_sectioning_initialize_number + % + \the\everybeforesectionheadhandle + % + % todo: also mark (for header) + % + % we might remove the lower level + % + % not here, after optional \page: \strc_sectioning_register{#1}{#2}{#3}% + % +% \xdef\currentheadcounter{\currentsectioncountervalue}% lua call + % + % \currentstructuresynchronize % will move + % + \let\getheadnumber\empty + \let\getheadtitle \empty + \let\getheadsyncs \empty + \ifconditional\c_strc_sectioning_increment + \ifconditional\c_strc_sectioning_place + \strc_sectioning_before_yes + \strc_sectioning_register{#1}{#2}{#3}% after optional \page + \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty + \let\getheadsyncs\theheadsynchonization + \let\getheadtitle\fullheadtitle + \ifconditional\headshownumber + \let\getheadnumber\fullheadnumber + \strc_rendering_place_head_number_and_text + \else + \strc_rendering_place_head_text + \fi + \dostoptagged + \strc_sectioning_after_yes + \orelse\ifconditional\c_strc_sectioning_hidden + \strc_sectioning_register{#1}{#2}{#3}% after optional \page + \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty + \let\getheadsyncs\theheadsynchonization + \ifconditional\c_strc_sectioning_section + \strc_rendering_place_head_section + \else + \strc_rendering_place_head_hidden % only something when tracing + \fi + \dostoptagged + \else + \strc_sectioning_before_nop % toegevoegd ivm subpaginanr / tug sheets + \strc_sectioning_register{#1}{#2}{#3}% after optional \page + \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty + \let\getheadsyncs\theheadsynchonization + \strc_rendering_place_head_empty % just flush 'm + \dostoptagged + \strc_sectioning_after_nop + \fi + \else + \ifconditional\c_strc_sectioning_place + \strc_sectioning_before_yes + \strc_sectioning_register{#1}{#2}{#3}% after optional \page + \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty + \let\getheadsyncs\theheadsynchonization + \let\getheadtitle\fullheadtitle + \strc_rendering_place_head_text + \dostoptagged + \strc_sectioning_after_yes + \orelse\ifconditional\c_strc_sectioning_hidden + \strc_sectioning_register{#1}{#2}{#3}% after optional \page + \strc_sectioning_report + \let\getheadsyncs\theheadsynchonization + \dostarttagged\t!sectioncaption\empty + \ifconditional\c_strc_sectioning_section + \strc_rendering_place_head_section + \else + \strc_rendering_place_head_hidden % only something when tracing + \fi + \dostoptagged + \else + % do nothing / should be vbox to 0pt + \strc_sectioning_before_nop + \strc_sectioning_register{#1}{#2}{#3}% after optional \page + \strc_sectioning_report + \dostarttagged\t!sectioncaption\empty + \let\getheadsyncs\theheadsynchonization + \strc_rendering_place_head_empty % just flush 'm + \dostoptagged + \strc_sectioning_after_nop + \fi + \fi + % + \the\everyaftersectionheadhandle + % + \setfalse\c_strc_sectioning_ignore_page + % ignorespaces prevents spaces creeping in when after=\dontleavehmode + \dostarttagged\t!sectioncontent\empty + \ifempty\currentstructureplaceholder + \ifconditional\headisdisplay + \doubleexpandafter\ignorespaces + \else + \doubleexpandafter\ignorepars + \fi + \else + \expandafter\strc_sectioning_placeholder + \fi} + +%D \starttyping +%D \startsubject[placeholder=todo,title=one] +%D whatever one +%D \stopsubject +%D \stoptyping + +\def\strc_sectioning_placeholder + {\placeholder[\currentstructureplaceholder]% + \gobblenested{\e!start\currenthead}{\e!stop\currenthead}{\e!stop\currenthead}} + +% typesetting (the getters are public) + +\protected\def\strc_rendering_place_head_number_and_text + {\setheadmarking + \getheadnumber/\getheadtitle + \getheadsyncs} + +\protected\def\strc_rendering_place_head_text + {\setheadmarking + \getheadtitle + \getheadsyncs} + +\protected\def\strc_rendering_place_head_empty + {\setheadmarking + \getheadsyncs} + +\installcorenamespace{hiddenheadattr} +\installcorenamespace{hiddenheadsync} + +% todo: when in the page builder we need to resolve the marking immediately +% because otherwise we have an async + +\newbox\b_sectioning_delayed + +\def\strc_sectioning_delayed_flush + {\ifvoid\b_sectioning_delayed\else + \smashedbox\b_sectioning_delayed + \fi} + +\protected\def\strc_rendering_place_head_section % see hidden below + {\global\setbox\b_sectioning_delayed\hpack\bgroup + \setmarking[\currentheadcoupling]{li::\currentstructurelistnumber}% + \hpack\headreferenceattributes{}% also does the mark + \theheadsynchonization + \egroup} + +\protected\def\strc_rendering_place_head_hidden % maybe trialtypesetting check + {\xdefcsname\??hiddenheadattr\currenthead\endcsname + {\headreferenceattributes}% can be used when making a box + \xdefcsname\??hiddenheadsync\currenthead\endcsname + {\noexpand\letgvalue{\??hiddenheadsync\currenthead}\relax + \noexpand\setmarking[\currentheadcoupling]{li::\currentstructurelistnumber}% + \hpack\headreferenceattributes{}% otherwise no destination ... maybe tag ref as hidden and fall back on page reference + \theheadsynchonization}} % and it's a node anyway + +\permanent\def\synchronizehead #1{\begincsname\??hiddenheadsync#1\endcsname} +\permanent\def\theheadreferenceattributes#1{\begincsname\??hiddenheadattr#1\endcsname} + +\permanent\protected\def\placerawheaddata [#1]{\synchronizehead{#1}} +\permanent\protected\def\placerawheadtext [#1]{\getspecificstructuretitle{\thenamedheadlevel{#1}}} +\permanent\protected\def\placerawheadnumber[#1]{\getfullstructurenumber{\thenamedheadlevel{#1}}} + +\permanent\protected\def\repeathead[#1]% + {\begingroup + \setupinteraction[\c!state=\v!stop]% + \def\currenthead{#1} + \strc_sectioning_initialize_placement + \strc_sectioning_initialize_number + \dostarttagged\t!sectioncaption\empty + \let\getheadsyncs \relax + \def\getheadtitle {\getmarking[#1]} + \def\getheadnumber{\getmarking[#1\v!number]} + \strc_sectioning_before_yes + \ifconditional\headshownumber + \strc_rendering_place_head_number_and_text + \else + \strc_rendering_place_head_text + \fi + \dostoptagged + \strc_sectioning_after_yes + \endgroup} + +% \setuphead[chapter][placehead=hidden] +% \chapter {test} +% +% %(\synchronizehead{chapter}) % \getheadsyncs +% %(\getfullstructurenumber{\thenamedheadlevel{chapter}}) +% %(\getspecificstructuretitle{\thenamedheadlevel{chapter}}) +% +% (\placerawheaddata [chapter]) +% (\placerawheadnumber[chapter]) +% (\placerawheadtext [chapter]) + +% pagebreaks + +\letvalue{\??headmarknop\v!page }\donothing +\setvalue{\??headmarknop\v!reset }{\resetcurrentstructuremarks} +\letvalue{\??headmarknop\s!unknown}\donothing + +\letvalue{\??headmarkyes\v!page }\donothing % to be checked: {\resetcurrentstructuremarks} +\setvalue{\??headmarkyes\v!reset }{\resetcurrentstructuremarks} +\letvalue{\??headmarkyes\s!unknown}\donothing + +\def\strc_sectioning_check_layout + {\edef\p_page{\headparameter\c!page}% + \ifempty\p_page + \strc_sectioning_check_layout_nop + \else + \strc_sectioning_check_layout_yes + \fi} + +\def\strc_sectioning_check_layout_nop + {\expandnamespaceparameter\??headmarknop\headparameter\c!marking\s!unknown} + +\def\strc_sectioning_check_layout_yes + {\page[\p_page]% + \expandnamespaceparameter\??headmarkyes\headparameter\c!marking\s!unknown + \edef\p_header{\headparameter\c!header}% + \ifempty\p_header \else + \doifelselayouttextline\v!header{\normalexpanded{\setuplayouttext[\v!header][\c!state=\p_header]}}\donothing + \fi + \edef\p_text{\headparameter\c!text}% + \ifempty\p_text \else + \doifelselayouttextline\v!text {\normalexpanded{\setuplayouttext[\v!text ][\c!state=\p_text ]}}\donothing + \fi + \edef\p_footer{\headparameter\c!footer}% + \ifempty\p_footer \else + \doifelselayouttextline\v!footer{\normalexpanded{\setuplayouttext[\v!footer][\c!state=\p_footer]}}\donothing + \fi} + +\newcount \c_strc_sectioning_preceding_level \c_strc_sectioning_preceding_level\plusone +\newconditional\c_strc_sectioning_auto_break \settrue\c_strc_sectioning_auto_break +\newconditional\c_strc_sectioning_ignore_page +\newsignal \d_strc_sectioning_continuous_signal + +\protected\def\strc_sectioning_inject_continuous_signal + {\ifhmode + \hskip\d_strc_sectioning_continuous_signal\relax + \fi} + +% \let\dotagsectionlevel\relax + +\def\strc_sectioning_before_yes + {\strc_sectioning_check_before\strc_sectioning_handle_page_yes + \headparameter\c!inbetween + \dostarttaggedchained\t!section\currenthead\??head +% \dotagsectionlevel + } + +\def\strc_sectioning_before_nop + {\strc_sectioning_check_before\strc_sectioning_handle_page_nop + \headparameter\c!inbetween + \dostarttagged\currenthead\empty} % this is a weird one .. needs checking + +\def\strc_sectioning_empty_correction + {\ifconditional\c_strc_sectioning_empty + % this needs checking + \penalty\plustenthousand + \vskip-\lineheight + \kern\zeropoint + \prevdepth\strutdepth + \fi} + +\def\strc_sectioning_after_nop + {} + +\def\strc_sectioning_check_before#1% + {\ifhmode + \scratchcounter\lastpenalty + \unpenalty % no beauty in this + \ifdim\lastskip=\d_strc_sectioning_continuous_signal + % no page break + \ifconditional\c_strc_sectioning_ignore_page + \setfalse\c_strc_sectioning_ignore_page + \else + \global\c_strc_sectioning_preceding_level\currentheadlevel + \nobreak + \fi + % \global\settrue\c_strc_rendering_continuous + \else + \penalty\scratchcounter + % \global\setfalse\c_strc_rendering_continuous + #1% + \fi + \else + % \global\setfalse\c_strc_rendering_continuous + #1% + \fi} + +%permanent\def\currentsectioncountervalue {\clf_depthnumber\numexpr\thenamedheadlevel\currenthead\relax} +%permanent\def\previoussectioncountervalue{\clf_depthnumber\numexpr\thenamedheadlevel\currenthead+\minusone\relax} + +\permanent\def\currentsectioncountervalue {\clf_depthnumber\numexpr\thenamedheadlevel\currenthead\relax} +%permanent\def\previoussectioncountervalue{\clf_depthnumber\numexpr\thenamedheadlevel\currenthead+\minusone\relax} +\permanent\def\previoussectioncountervalue{\clf_depthnumber\numexpr\thenamedheadlevel\previoushead\relax} + +\let\previoushead\empty + +\def\strc_sectioning_handle_page_nop + {\edef\p_continue{\headparameter\c!continue}% + \ifx\p_continue\v!yes + \ifx\currenthead\previoushead % not really needed + \strc_sectioning_check_layout + \orelse\ifnum\previoussectioncountervalue=\zerocount + \strc_sectioning_check_layout + \orelse\ifnum\currentsectioncountervalue>\zerocount + \strc_sectioning_check_layout + \fi + \else + \strc_sectioning_check_layout + \fi + \glet\previoushead\currenthead} + + +\def\strc_sectioning_handle_page_yes + {\ifconditional\c_strc_sectioning_ignore_page + \setfalse\c_strc_sectioning_ignore_page + \else + % beware, these numbers are not yet know here + \strc_sectioning_handle_page_nop + \edef\p_aligntitle{\headparameter\c!aligntitle}% + \ifx\p_aligntitle\v!float + \ifconditional\c_strc_sectioning_auto_break + \spac_vspacing_same_page\currentheadlevel\zerocount + \fi + \headparameter\c!before\relax + \indent + \else + \page_otr_command_flush_side_floats + \ifconditional\c_strc_sectioning_auto_break + \spac_vspacing_same_page\currentheadlevel\zerocount + \fi + \headparameter\c!before\relax + \fi + \global\c_strc_sectioning_preceding_level\currentheadlevel + \fi + \glet\previoushead\currenthead} + +\def\strc_sectioning_depth_correction + {\ifvmode + \edef\p_depthcorrection{\headparameter\c!depthcorrection}% + \ifx\p_depthcorrection\v!strut + \prevdepth\strutdepth + \fi + \fi} + +\def\strc_sectioning_after_yes + {\ifconditional\headisdisplay + \ifconditional\c_strc_sectioning_auto_break + \spac_vspacing_same_page\currentheadlevel\plusone + \fi + \strc_sectioning_empty_correction + \headparameter\c!after + \strc_sectioning_depth_correction + \fi} + +\protected\def\strc_sectioning_prevent_page_break % see strc-con + {\ifconditional\c_strc_sectioning_auto_break + \spac_vspacing_same_page\currentheadlevel\plustwo + \fi} + + +% 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} + +\permanent\def\thenamedheadlevel#1% + {\sectionlevel{\sectionheadsection{\sectionheadcoupling{#1}}}} + +\permanent\tolerant\protected\def\setupheadnumber[#1]#*[#2]% todo: reset if at other level + {\setstructurenumber{\thenamedheadlevel{#1}}{\number#2}} + +\def\currentheadnumber{0} % ==> \currentheadnumber + +\permanent\protected\def\determineheadnumber[#1]% + {\xdef\currentheadnumber{\getstructurenumber{\thenamedheadlevel{#1}}}} + +% The previous macro is been replaced by the expandable: + +\permanent\def\namedheadnumber #1{\getstructurenumber {\thenamedheadlevel{#1}}} +\permanent\def\somenamedheadnumber#1#2{\getsomestructurenumber{\thenamedheadlevel{#1}}{#2}} + +\permanent\tolerant\protected\def\headnumber[#1]#*[#2]% simple case is just a number + {\getsomefullstructurenumber{\ifparameter#1\or\thenamedheadlevel{#1}\fi}{#2}} + +\permanent\tolerant\protected\def\someheadnumber[#1]#*[#2]% + {\dontleavehmode + \begingroup + \edef\currenthead{#1}% + \getsomefullstructurenumber{\thenamedheadlevel{#1}}{#2}% + \endgroup} + +\aliased\let\sectioncountervalue\structurevalue + +\def\currentheadtext{obsolete,\space use marks} + +% list references, will be redone in lua when we need it + +\let\startlistreferences\relax +\let\stoplistreferences \relax + +% experimental + +\newconditional\c_strc_sectioning_auto_levels + +\appendtoks + \settrue\c_strc_sectioning_auto_levels +\to \everyenableelements + +\protected\def\strc_sectioning_initialize_autolevel + {\ifconditional\c_strc_sectioning_auto_levels + \clf_autonextstructurelevel\currentheadlevel\relax + \global\setfalse\c_strc_sectioning_auto_levels + \fi} + +\permanent\protected\def\triggerautostructurelevel + {\global\settrue\c_strc_sectioning_auto_levels} + +\permanent\protected\def\finalizeautostructurelevels + {\clf_autofinishstructurelevels} + +\permanent\protected\def\finalizeautostructurelevel + {\dostoptagged + \dostoptagged} + +\appendtoks + \finalizeautostructurelevels +\to \everystoptext + +\stopcontextdefinitioncode + +\protect \endinput |