summaryrefslogtreecommitdiff
path: root/tex/context/base/page-ins.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/page-ins.mkiv')
-rw-r--r--tex/context/base/page-ins.mkiv175
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