diff options
Diffstat (limited to 'tex/context/base/page-ins.mkiv')
-rw-r--r-- | tex/context/base/page-ins.mkiv | 175 |
1 files changed, 123 insertions, 52 deletions
diff --git a/tex/context/base/page-ins.mkiv b/tex/context/base/page-ins.mkiv index 33c50451b..cb952e6e7 100644 --- a/tex/context/base/page-ins.mkiv +++ b/tex/context/base/page-ins.mkiv @@ -17,23 +17,56 @@ %D page builder. When multiple footnote classes were introduced, I decided to %D isolate some of the functionality in a module. +\registerctxluafile{page-ins}{1.001} + \unprotect +%D Because we need to deal with inserts at the \LUA\ end as well, +%D we provide a proper installer. + +% Not yet used as we need to adapt some code to this. + +\installcorenamespace{insertion} +\installcorenamespace{insertionnumber} + +\installcommandhandler \??insertion {insertion} \??insertion + +\newcount\currentinsertionnumber % This is a count and not a macro ! + \newtoks\t_page_inserts_list -\let\doprocessinsert\gobbleoneargument +\let\doprocessinsert\relax -\unexpanded\def\installinsertion#1% - {\ifdefined#1\else - \let#1\relax - \fi - \ifx#1\relax % permits \csname...\endcsname - \newinsert#1% - \count#1\plusthousand - \skip #1\zeropoint - \dimen#1\maxdimen - \appendtoks\doprocessinsert#1\to\t_page_inserts_list - \fi} +%D Maybe some day we will move settings here. + +\unexpanded\def\setcurrentinsertion#1% + {\edef\currentinsertion{#1}% + \currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname} + +\def\namedinsertionnumber#1{\csname\??insertionnumber#1\endcsname} + +\unexpanded\def\page_inserts_synchronize_registers + {\currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname} + +\appendtoks + \page_inserts_synchronize_registers +\to \everysetupinsertion + +% \setupinsertion +% [\c!distance=\zeropoint, +% \c!maxheight=\maxdimen, +% \c!factor=\plusthousand] +% +% \unexpanded\def\page_inserts_synchronize_registers +% {\currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname +% \global\count\currentinsertionnumber\insertionparameter\c!factor \relax +% \global\skip \currentinsertionnumber\insertionparameter\c!distance \relax +% \global\dimen\currentinsertionnumber\insertionparameter\c!maxheight\relax} + +\unexpanded\def\page_inserts_process#1% + {\edef\currentinsertion{#1}% + \currentinsertionnumber\csname\??insertionnumber\currentinsertion\endcsname + \doprocessinsert\currentinsertionnumber} % old method \unexpanded\def\processinsertions {\the\t_page_inserts_list} @@ -42,54 +75,92 @@ {\let\doprocessinsert\page_inserts_synchronize \processinsertions} -\def\page_inserts_synchronize#1% +\unexpanded\def\page_inserts_synchronize#1% yes or no {\ifvoid#1\else \insert#1{\unvbox#1}% \fi} -%D For instance, when we postpone footnotes, we need to save some data related to -%D the inserts. The next methods are far from ideal, but better than nothing. We -%D save and restore box content and associated data independently. The box content -%D is only restores when non||void. - -\installcorenamespace{insertionbackup} - -\unexpanded\def\installbackupinsertion#1% - {\ifcsname\??insertionbackup\string#1\endcsname \else - \expandafter\newinsert\csname\??insertionbackup\string#1\endcsname - \count\csname\??insertionbackup\string#1\endcsname\zerocount - \skip \csname\??insertionbackup\string#1\endcsname\zeropoint - \dimen\csname\??insertionbackup\string#1\endcsname\maxdimen - \fi} - -\unexpanded\def\saveinsertionbox#1% hm, actually unknown - {\global\setbox\csname\??insertionbackup\string#1\endcsname - \ifdim\ht#1>\zeropoint\box#1\else\emptybox\fi} - -\unexpanded\def\restoreinsertionbox#1% - {\ifvoid\backupinsertion#1\else % if void, we keep the content - \global\setbox#1\box\csname\??insertionbackup\string#1\endcsname +\unexpanded\def\doifinsertionelse#1% + {\ifcsname\??insertionnumber#1\endcsname + \expandafter\firstoftwoarguments + \else + \expandafter\secondoftwoarguments \fi} -\unexpanded\def\eraseinsertionbackup#1% - {\global\setbox\csname\??insertionbackup\string#1\endcsname\emptybox} - -\unexpanded\def\saveinsertiondata#1% - {\global\skip \csname\??insertionbackup\string#1\endcsname\skip #1% - \global\count\csname\??insertionbackup\string#1\endcsname\count#1% - \global\dimen\csname\??insertionbackup\string#1\endcsname\dimen#1} - -\unexpanded\def\restoreinsertiondata#1% - {\global\skip #1\skip \csname\??insertionbackup\string#1\endcsname - \global\count#1\count\csname\??insertionbackup\string#1\endcsname - \global\dimen#1\dimen\csname\??insertionbackup\string#1\endcsname} +% \unexpanded\def\startinsertion[#1]% +% {\insert\csname\??insertionnumber#1\endcsname\bgroup} +% +% \unexpanded\def\stopinsertion +% {\egroup} + +% For the moment we use the regular insertion allocator so that users can +% still define their own insertions (not that they will play nicely with +% all context mechanisms then). We can use the dimensions at the \LUA\ end +% so we don't need to pass pass them explicitly. Actually, when we see an +% insertion node at that end, we already know the number. + +\appendtoks + \ifcsname\??insertionnumber\currentinsertion\endcsname + % bad news + \else + \expandafter\newinsert\csname\??insertionnumber\currentinsertion\endcsname + \page_inserts_synchronize_registers + \ctxcommand{defineinsertion + { + name = "\currentinsertion", + number = \number\currentinsertionnumber, + } + }% + % + \t_page_inserts_list\expandafter\expandafter\expandafter + {\expandafter\the\expandafter\t_page_inserts_list + \expandafter\page_inserts_process\csname\??insertionnumber\currentinsertion\endcsname}% + \count\currentinsertionnumber\plusthousand + \skip \currentinsertionnumber\zeropoint + \dimen\currentinsertionnumber\maxdimen + \fi +\to \everydefineinsertion %D Auxiliary macros: -\unexpanded\def\addinsertionheight#1\to#2% - {\ifvoid#1\else - \advance#2 1\skip#1\relax - \advance#2 \ht #1\relax - \fi} +\def\page_insert_insertion_height#1% + {\dimexpr\expandafter\page_insert_insertion_height_indeed\csname\??insertionnumber#1\endcsname\relax} + +\def\page_insert_insertion_height_indeed#1% + {\ifvoid#1\zeropoint\else1\skip#1+\ht#1\fi} + +%D Obsolete: + +% \installcorenamespace{insertionbackup} +% +% \unexpanded\def\installbackupinsertion#1% +% {\ifcsname\??insertionbackup\string#1\endcsname \else +% \expandafter\newinsert\csname\??insertionbackup\string#1\endcsname +% \count\csname\??insertionbackup\string#1\endcsname\zerocount +% \skip \csname\??insertionbackup\string#1\endcsname\zeropoint +% \dimen\csname\??insertionbackup\string#1\endcsname\maxdimen +% \fi} +% +% \unexpanded\def\saveinsertionbox#1% hm, actually unknown +% {\global\setbox\csname\??insertionbackup\string#1\endcsname +% \ifdim\ht#1>\zeropoint\box#1\else\emptybox\fi} +% +% \unexpanded\def\restoreinsertionbox#1% +% {\ifvoid\backupinsertion#1\else % if void, we keep the content +% \global\setbox#1\box\csname\??insertionbackup\string#1\endcsname +% \fi} +% +% \unexpanded\def\eraseinsertionbackup#1% +% {\global\setbox\csname\??insertionbackup\string#1\endcsname\emptybox} +% +% \unexpanded\def\saveinsertiondata#1% +% {\global\skip \csname\??insertionbackup\string#1\endcsname\skip #1% +% \global\count\csname\??insertionbackup\string#1\endcsname\count#1% +% \global\dimen\csname\??insertionbackup\string#1\endcsname\dimen#1} +% +% \unexpanded\def\restoreinsertiondata#1% +% {\global\skip #1\skip \csname\??insertionbackup\string#1\endcsname +% \global\count#1\count\csname\??insertionbackup\string#1\endcsname +% \global\dimen#1\dimen\csname\??insertionbackup\string#1\endcsname} \protect \endinput |