diff options
Diffstat (limited to 'tex/context/base/strc-pag.mkiv')
-rw-r--r-- | tex/context/base/strc-pag.mkiv | 193 |
1 files changed, 98 insertions, 95 deletions
diff --git a/tex/context/base/strc-pag.mkiv b/tex/context/base/strc-pag.mkiv index e3828464c..8071fbab1 100644 --- a/tex/context/base/strc-pag.mkiv +++ b/tex/context/base/strc-pag.mkiv @@ -19,11 +19,11 @@ % Allocation: -\countdef\realpageno = 0 \realpageno = 1 -\countdef\userpageno = 1 \userpageno = 1 -\countdef\subpageno = 2 \subpageno = 0 % !! -\countdef\arrangeno = 3 \arrangeno = 0 % !! -\countdef\pagenoshift = 4 \pagenoshift = 0 % !! +\countdef\realpageno \zerocount \realpageno \plusone +\countdef\userpageno \plusone \userpageno \plusone +\countdef\subpageno \plustwo \subpageno \zerocount % ! +\countdef\arrangeno \plusthree \arrangeno \zerocount % ! +\countdef\pagenoshift\plusfour \pagenoshift\zerocount % ! \let\pageno\userpageno @@ -33,7 +33,8 @@ \newtoks\everyinitializepagecounters -\def\initializepagecounters{\the\everyinitializepagecounters} +\unexpanded\def\initializepagecounters + {\the\everyinitializepagecounters} \appendtoks \initializepagecounters @@ -71,27 +72,30 @@ % \stopbodymatter % \stoptext -\definecounter[\s!realpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=realpageno,\c!method=\v!page] -\definecounter[\s!userpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=userpageno,\c!method=\v!page] -\definecounter[\s!subpage] [\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=subpageno, \c!method=\v!page] +\definecounter[\s!realpage][\c!prefix=\v!no,\c!start=\plusone,\c!prefixsegments=,\s!counter=realpageno,\c!method=\v!page] +\definecounter[\s!userpage][\c!prefix=\v!no,\c!start=\plusone,\c!prefixsegments=,\s!counter=userpageno,\c!method=\v!page] +\definecounter[\s!subpage] [\c!prefix=\v!no,\c!start=\plusone,\c!prefixsegments=,\s!counter=subpageno, \c!method=\v!page] \newtoks\everysetuprealpagenumber % todo: set state: none, start, stop, reset \newtoks\everysetupuserpagenumber % todo: set state: none, start, stop, reset \newtoks\everysetupsubpagenumber % todo: set state: none, start, stop, reset -\unexpanded\def\setuprealpagenumber{\dosingleargument\dosetuprealpagenumber} -\unexpanded\def\setupuserpagenumber{\dosingleargument\dosetupuserpagenumber} -\unexpanded\def\setupsubpagenumber {\dosingleargument\dosetupsubpagenumber} +\unexpanded\def\setuprealpagenumber{\dosingleargument\strc_pagenumbers_setup_realpage} +\unexpanded\def\setupuserpagenumber{\dosingleargument\strc_pagenumbers_setup_userpage} +\unexpanded\def\setupsubpagenumber {\dosingleargument\strc_pagenumbers_setup_subpage } -\def\dosavepagenumberstate#1{\edef\oldpagenumberstate{\counterparameter#1\c!state}} +\let\m_strc_pagenumbers_state_old\zerocount +\let\m_strc_pagenumbers_state_new\zerocount -\def\dosetuprealpagenumber[#1]{\dosavepagenumberstate\s!realpage\strc_counters_setup[\s!realpage][#1]\the\everysetuprealpagenumber} -\def\dosetupuserpagenumber[#1]{\dosavepagenumberstate\s!userpage\strc_counters_setup[\s!userpage][#1]\the\everysetupuserpagenumber} -\def\dosetupsubpagenumber [#1]{\dosavepagenumberstate\s!subpage \strc_counters_setup[\s!subpage ][#1]\the\everysetupsubpagenumber } +\def\strc_pagenumbers_save_state#1{\edef\m_strc_pagenumbers_state_old\m_strc_pagenumbers_state_old{\counterparameter#1\c!state}} -\def\resetrealpagenumber {} % not permitted -\def\resetuserpagenumber {\strc_counters_reset\s!userpage} -\def\resetsubpagenumber {\strc_counters_reset\s!subpage} +\def\strc_pagenumbers_setup_realpage[#1]{\strc_pagenumbers_save_state\s!realpage\strc_counters_setup[\s!realpage][#1]\the\everysetuprealpagenumber} +\def\strc_pagenumbers_setup_userpage[#1]{\strc_pagenumbers_save_state\s!userpage\strc_counters_setup[\s!userpage][#1]\the\everysetupuserpagenumber} +\def\strc_pagenumbers_setup_subpage [#1]{\strc_pagenumbers_save_state\s!subpage \strc_counters_setup[\s!subpage ][#1]\the\everysetupsubpagenumber } + +\unexpanded\def\resetrealpagenumber {} % not permitted +\unexpanded\def\resetuserpagenumber {\strc_counters_reset\s!userpage} +\unexpanded\def\resetsubpagenumber {\strc_counters_reset\s!subpage} \appendtoks \strc_counters_set\s!realpage\realpageno @@ -102,7 +106,7 @@ \let\setuppagenumber\setupuserpagenumber \let\resetpagenumber\resetuserpagenumber -\def\savecurrentpagestate % \normalexpanded? +\def\strc_pagenumbers_page_state_save % \normalexpanded? {\ctxlua{structures.pages.save({ prefix = "\counterparameter\s!userpage\c!prefix", separatorset = "\counterparameter\s!userpage\c!prefixseparatorset", @@ -120,11 +124,13 @@ )}} \prependtoks - \savecurrentpagestate + \strc_pagenumbers_page_state_save \to \everyshipout -\def\pushpagestate{\setxvalue{\??nm:\s!userpage:\c!state}{\counterparameter\s!userpage\c!state}} -\def\poppagestate {\normalexpanded{\setuppagenumber[\c!state=\getvalue{\??nm:\s!userpage:\c!state}]}} +\installcorenamespace{pagestatestack} % no level yet + +\unexpanded\def\strc_pagenumbers_page_state_push{\setxvalue{\??pagestatestack\c!state}{\counterparameter\s!userpage\c!state}} +\unexpanded\def\strc_pagenumbers_page_state_pop {\normalexpanded{\setuppagenumber[\c!state=\getvalue{\??pagestatestack\c!state}]}} \setuppagenumber [\c!way=\v!by\v!text, @@ -207,17 +213,17 @@ \def\nextuserpagenumber {\directconvertedcounter\s!userpage\v!next} \def\nextsubpagenumber {\directconvertedcounter\s!subpage \v!next} -\def\dodeincrementpageboundcounters % only at the end +\unexpanded\def\strc_pagenumbers_decrement_counters % only at the end {\strc_counters_decrement\s!realpage \strc_counters_decrement\s!userpage \strc_counters_decrement\s!subpage} -\def\doincrementpageboundcounters +\unexpanded\def\strc_pagenumbers_increment_counters {\incrementpagenumber \incrementsubpagenumber} \appendtoks - \dodeincrementpageboundcounters + \strc_pagenumbers_decrement_counters \to \everygoodbye % Equivalents (compatibility): @@ -238,61 +244,49 @@ % States: -\newif\ifrightpage \rightpagetrue \newif\ifdoublesided \newconditional\layoutisdoublesided \newif\ifsinglesided \newconditional\layoutissinglesided % Realpage and subpage numbers: -\def\setnextrealpageno{\global\realpageno\strc_counters_incremented\s!realpage\relax} -\def\setnextsubpageno {\global\subpageno \strc_counters_incremented\s!subpage \relax} +\unexpanded\def\setnextrealpageno{\global\realpageno\strc_counters_incremented\s!realpage\relax} +\unexpanded\def\setnextsubpageno {\global\subpageno \strc_counters_incremented\s!subpage \relax} % Page numbers: (can move to lua) ... inconsistent names -\def\dodecrementpagenumber {\global\userpageno\strc_counters_decremented\s!userpage\relax} -\def\doincrementpagenumber {\global\userpageno\strc_counters_incremented\s!userpage\relax} +\installcorenamespace{pagenumberinc} +\installcorenamespace{pagenumberdec} -\def\decrementsubpagenumber{\global\subpageno \strc_counters_decremented\s!subpage \relax} -\def\incrementsubpagenumber{\global\subpageno \strc_counters_incremented\s!subpage \relax} +\unexpanded\def\strc_pagenumbers_decrement_userpage{\global\userpageno\strc_counters_decremented\s!userpage\relax} +\unexpanded\def\strc_pagenumbers_increment_userpage{\global\userpageno\strc_counters_incremented\s!userpage\relax} -\def\dosynchronizepagenumber{\global\let\@@pnstate\v!start} +\unexpanded\def\decrementsubpagenumber{\global\subpageno \strc_counters_decremented\s!subpage \relax} +\unexpanded\def\incrementsubpagenumber{\global\subpageno \strc_counters_incremented\s!subpage \relax} -\def\decrementpagenumber{\csname\??pn-\counterparameter\s!userpage\c!state\endcsname} -\def\incrementpagenumber{\csname\??pn+\counterparameter\s!userpage\c!state\endcsname} +\unexpanded\def\strc_pagenumbers_synchronize_userpage{\global\c_strc_pagenumbers_state_userpage\plustwo} % start and visible -\letvalue{\??pn-\v!start}\dodecrementpagenumber -\letvalue{\??pn-\v!none }\dodecrementpagenumber -\letvalue{\??pn-\v!empty}\dodecrementpagenumber +\unexpanded\def\decrementpagenumber{\csname\??pagenumberdec\counterparameter\s!userpage\c!state\endcsname} +\unexpanded\def\incrementpagenumber{\csname\??pagenumberinc\counterparameter\s!userpage\c!state\endcsname} -\letvalue{\??pn+\v!start}\doincrementpagenumber -\letvalue{\??pn+\v!none }\doincrementpagenumber -\setvalue{\??pn+\v!empty}{\doincrementpagenumber\dosynchronizepagenumber} -\letvalue{\??pn+\v!keep }\dosynchronizepagenumber +\letvalue{\??pagenumberdec\v!start}\strc_pagenumbers_decrement_userpage +\letvalue{\??pagenumberdec\v!none }\strc_pagenumbers_decrement_userpage +\letvalue{\??pagenumberdec\v!empty}\strc_pagenumbers_decrement_userpage -% Control: - -\def\getpagestatus % hierboven gebruiken - {\ifdoublesided - \global\rightpagetrue - % todo: \global\rightpagetrue or \global\rightpagefalse - \else - \global\rightpagetrue - \fi} +\letvalue{\??pagenumberinc\v!start}\strc_pagenumbers_increment_userpage +\letvalue{\??pagenumberinc\v!none }\strc_pagenumbers_increment_userpage +\setvalue{\??pagenumberinc\v!empty}{\strc_pagenumbers_increment_userpage\strc_pagenumbers_synchronize_userpage} +\letvalue{\??pagenumberinc\v!keep }\strc_pagenumbers_synchronize_userpage % Setup general page numbering -\newtoks\everysetuppagenumbering +\installcorenamespace{pagenumbering} -\unexpanded\def\setuppagenumbering - {\dosingleempty\dosetuppagenumbering} - -\def\dosetuppagenumbering[#1]% - {\getparameters[\??nm][#1]\the\everysetuppagenumbering} +\installdirectcommandhandler \??pagenumbering {pagenumbering} \appendtoks \singlesidedfalse \setfalse\layoutisdoublesided \doublesidedfalse \setfalse\layoutissinglesided - \normalexpanded{\noexpand\processallactionsinset[\@@nmalternative]} + \processallactionsinset[\directpagenumberingparameter\c!alternative] [ \v!singlesided=>\singlesidedtrue\settrue\layoutissinglesided, \v!doublesided=>\doublesidedtrue\settrue\layoutisdoublesided]% \ifdefined\trackingmarginnotestrue @@ -303,19 +297,24 @@ \fi \fi \page_backgrounds_recalculate - \dosetpagenumberlocation + \strc_pagenumbers_set_location \to \everysetuppagenumbering \ifdefined \page_backgrounds_recalculate \else \let\page_backgrounds_recalculate\relax \fi -\ifdefined \dosetpagenumberlocation \else - \let\dosetpagenumberlocation\relax +\ifdefined \strc_pagenumbers_set_location \else + \let\strc_pagenumbers_set_location\relax \fi -\def\flushfinallayoutpage - {\doifsomething\@@nmpage{\doifnot\@@nmpage\v!no{\page[\@@nmpage]}}} +\unexpanded\def\strc_pagenumbers_flush_final_page + {\edef\p_strc_pagenumbers_page{\directpagenumberingparameter\c!page}% + \ifx\p_strc_pagenumbers_page\empty \else + \ifx\p_strc_pagenumbers_page\v!no \else + \page[\p_strc_pagenumbers_page] + \fi + \fi} % The numbered location handler is there because we need to be downward % compatible. So, in fact there can be multiple handlers active at the @@ -323,28 +322,32 @@ % Rendering: -\unexpanded\def\placelocationpagenumber - {\ifnum\userpagenumberstate=\plustwo - \ifnum\overallpagenumberstate=\plusone - \doif\@@nmstrut\v!yes\strut +\unexpanded\def\strc_pagenumbers_place_location + {\ifnum\c_strc_pagenumbers_state_userpage=\plustwo + \ifnum\c_strc_pagenumbers_state=\plusone + \doif{\directpagenumberingparameter\c!strut}\v!yes\strut \begingroup - \dousestyleparameter\@@nmstyle - \dousecolorparameter\@@nmcolor - \@@nmcommand{\@@nmleft\labeltexts\v!pagenumber{\prefixedpagenumber}\@@nmright}% + \usepagenumberingstyleandcolor\c!style\c!color + \directpagenumberingparameter\c!command + {\directpagenumberingparameter\c!left + \labeltexts\v!pagenumber\prefixedpagenumber + \directpagenumberingparameter\c!right}% \endgroup \fi \fi} \unexpanded\def\completepagenumber - {\ifnum\userpagenumberstate=\plustwo - \ifnum\overallpagenumberstate=\plusone - \@@nmleft\labeltexts\v!pagenumber\prefixedpagenumber\@@nmright + {\ifnum\c_strc_pagenumbers_state_userpage=\plustwo + \ifnum\c_strc_pagenumbers_state=\plusone + \directpagenumberingparameter\c!left + \labeltexts\v!pagenumber\prefixedpagenumber + \directpagenumberingparameter\c!right \fi \fi} \unexpanded\def\placepagenumber - {\ifnum\userpagenumberstate=\plustwo - \ifnum\overallpagenumberstate=\plusone + {\ifnum\c_strc_pagenumbers_state_userpage=\plustwo + \ifnum\c_strc_pagenumbers_state=\plusone \labeltexts\v!pagenumber\pagenumber \fi \fi} @@ -356,35 +359,35 @@ % compatible. So, in fact there can be multiple handlers active at the % same time, but only the current one does something. -\setnewconstant\realpagenumberstate \plustwo % counter state : 0=stop, 1=start, 2=start and visible -\setnewconstant\userpagenumberstate \plustwo % counter state : 0=stop, 1=start, 2=start and visible -\setnewconstant\subpagenumberstate \plustwo % counter state : 0=stop, 1=start, 2=start and visible -\setnewconstant\overallpagenumberstate\plusone % general number: 0=invisible, 1=visible +\setnewconstant\c_strc_pagenumbers_state_realpage\plustwo % counter state : 0=stop, 1=start, 2=start and visible +\setnewconstant\c_strc_pagenumbers_state_userpage\plustwo % counter state : 0=stop, 1=start, 2=start and visible +\setnewconstant\c_strc_pagenumbers_state_subpage \plustwo % counter state : 0=stop, 1=start, 2=start and visible +\setnewconstant\c_strc_pagenumbers_state \plusone % general number: 0=invisible, 1=visible -\def\checkpagenumberstatechange#1#2% - {\edef\newpagenumberstate{\counterparameter#1\c!state}% - \ifx\newpagenumberstate\oldpagenumberstate \else - \doifelse\newpagenumberstate\v!start +\unexpanded\def\strc_pagenumbers_check_state_change#1#2% + {\edef\m_strc_pagenumbers_state_new{\counterparameter#1\c!state}% + \ifx\m_strc_pagenumbers_state_new\m_strc_pagenumbers_state_old \else + \doifelse\m_strc_pagenumbers_state_new\v!start {#2\plustwo}% {#2\zerocount}% \fi} \appendtoks % todo: set state: none, start, stop, reset - \checkpagenumberstatechange\s!realpage\realpagenumberstate + \strc_pagenumbers_check_state_change\s!realpage\c_strc_pagenumbers_state_realpage \to \everysetuprealpagenumber \appendtoks % todo: set state: none, start, stop, reset - \checkpagenumberstatechange\s!userpage\userpagenumberstate + \strc_pagenumbers_check_state_change\s!userpage\c_strc_pagenumbers_state_userpage \to \everysetupuserpagenumber \appendtoks % todo: set state: none, start, stop, reset - \checkpagenumberstatechange\s!subpage\subpagenumberstate + \strc_pagenumbers_check_state_change\s!subpage\c_strc_pagenumbers_state_subpage \to \everysetupsubpagenumber \appendtoks % todo: set state: none, start, stop, reset - \doifelse\@@nmstate\v!start - {\overallpagenumberstate\plusone }% - {\overallpagenumberstate\zerocount}% + \doifelse{\directpagenumberingparameter\c!state}\v!start + {\c_strc_pagenumbers_state\plusone }% + {\c_strc_pagenumbers_state\zerocount}% \to \everysetuppagenumbering % Done @@ -415,7 +418,7 @@ \appendtoks \edef\askeduserpagenumber{\counterparameter\s!userpage\c!number}% \ifx\askeduserpagenumber\empty \else - \normalexpanded{\setuppagenumber[\c!start=\counterparameter\s!userpage\c!number,\c!number=]}% + \normalexpanded{\setuppagenumber[\c!start=\askeduserpagenumber,\c!number=]}% \userpageno\strc_counters_raw\s!userpage \fi \to \everysetupuserpagenumber % todo: set state: none, start, stop, reset @@ -423,7 +426,7 @@ \appendtoks \edef\askedsubpagenumber{\counterparameter\s!subpage\c!number}% \ifx\askedsubpagenumber\empty \else - \normalexpanded{\setupsubpagenumber[\c!start=\counterparameter\s!subpage\c!number,\c!number=]}% + \normalexpanded{\setupsubpagenumber[\c!start=\askedsubpagenumber,\c!number=]}% \subpageno\strc_counters_raw\s!subpage\relax \fi \to \everysetupsubpagenumber % todo: set state: none, start, stop, reset @@ -433,7 +436,7 @@ % \setupuserpagenumber[start=2] % \starttext \dorecurse{20}{\input knuth \par} \stoptext -\def\checkpagenumbershift +\unexpanded\def\strc_pagenumbers_check_change_shift {\userpageno\strc_counters_raw\s!userpage\relax \ifnum\realpageno=\plusone \ifodd\userpageno @@ -444,12 +447,12 @@ \appendtoks % todo: set state: none, start, stop, reset % this makes starting at an even page possible - \checkpagenumbershift + \strc_pagenumbers_check_change_shift \to \everysetupuserpagenumber \appendtoks % todo: set state: none, start, stop, reset % this makes starting at an even page possible - \checkpagenumbershift + \strc_pagenumbers_check_change_shift \to \everysetuppagenumbering \initializepagecounters |