page-ini.mkxl /size: 12 Kb    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=page-ini,
3%D        version=2000.10.20,
4%D          title=\CONTEXT\ Page Macros,
5%D       subtitle=Initializations,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14\writestatus{loading}{ConTeXt Page Macros / Initializations}
15
16\registerctxluafile{page-ini}{autosuffix}
17
18%D The \type {\processpage} command has become obsolete. It's original
19%D purpose was to flush only parts of a document but nowadays we have
20%D project structure and modes. This is just one of those very early
21%D features that no longer makes sense.
22
23%D The \type {\couplepage} command has become obsolete. It's original
24%D purpose was to provide hooks for printer directives (like choosing
25%D different paper trays).
26
27\unprotect
28
29%D Shipout control.
30
31\newinteger\nofshipouts
32
33\appendtoks
34    \global\advanceby\nofshipouts\plusone
35\to \everyaftershipout
36
37\newconditional\c_otr_shipout_enabled \c_otr_shipout_enabled\conditionaltrue
38
39\protected\def\page_otr_shipout % not used at all
40  {\ifconditional\c_otr_shipout_enabled
41     \expandafter\page_otr_shipout_yes
42   \else
43     \expandafter\page_otr_shipout_nop
44   \fi}
45
46\aliased\let\page_otr_shipout_yes\normalshipout
47
48\protected\def\page_otr_shipout_nop
49  {\writestatus\m!system{ignoring shipout of real page \the\realpageno}%
50   \global\advanceby\realpageno\minusone % else no flush of resources
51   \dowithnextbox{\deadcycles\zerocount}}
52
53% We don't support direct user \shipouts (weird: this does not work, bug?)
54%
55% \let\shipout\page_otr_shipout_nop
56
57%D Building pages.
58
59\newbox\pagebox
60
61% \ifdefined\page_postprocessors_column \else \let\page_postprocessors_column\gobbleoneargument \fi
62% \ifdefined\page_postprocessors_page   \else \let\page_postprocessors_page  \gobbleoneargument \fi
63% \ifdefined\page_postprocessors_box    \else \let\page_postprocessors_box   \gobbleoneargument \fi
64
65\newtoks\t_page_postprocessors_box
66\newtoks\t_page_postprocessors_page
67\newtoks\t_page_postprocessors_column
68
69\newconstant\b_page_postprocessor
70
71\def\page_apply_postprocessors_box#1%
72  {\b_page_postprocessor#1\relax
73   \expand\t_page_postprocessors_box}
74
75\def\page_apply_postprocessors_page#1%
76  {\b_page_postprocessor#1\relax
77   \expand\t_page_postprocessors_page}
78
79\def\page_apply_postprocessors_column#1%
80  {\b_page_postprocessor#1\relax
81   \expand\t_page_postprocessors_column}
82
83%D Floats.
84
85\def\page_otr_flush_all_floats
86  {%\flushnotes already done
87   \ifconditional\c_page_floats_some_waiting
88     \page_otr_command_flush_all_floats
89   \fi}
90
91\def\page_otr_insert_dummy_page
92  {\par
93   \ifvmode
94     \page_otr_flush_all_floats
95     \fixedspace
96     \vfill
97     \page_otr_command_next_page
98   \fi}
99
100\def\page_otr_flush_pending_content
101  {\vkern\zeropoint\relax
102   \ifvoid\normalpagebox \else
103     \unvbox\normalpagebox
104     \penalty\outputpenalty
105   \fi}
106
107\newconstant\c_page_postponed_mode % \c_page_postponed_mode\plusone
108\newbox     \b_page_otr_saved
109
110\installoutputroutine\savepagecontent
111  {\global\setbox\b_page_otr_saved\box\normalpagebox}
112
113% \permanent\protected\def\flushpagecontent
114%   {\ifvoid\b_page_otr_saved\else\unvbox\b_page_otr_saved\fi}
115
116\permanent\protected\def\flushpagecontent % used in postponing
117  {\ifvoid\b_page_otr_saved\else
118     \scratchdepth\dp\b_page_otr_saved
119     \unvbox\b_page_otr_saved
120     \prevdepth\scratchdepth
121  \fi}
122
123% Test case: assumes one group level for output routine, todo:
124% a toks.
125%
126% \starttext
127%
128% \startbuffer[makeup]
129% \startpagemakeup[pagestate=start,page=no]
130%     \color[red]{
131%         \vfill
132%         \dorecurse{3}{
133%             \samplefile{klein}
134%             \vfill
135%         }
136%     }
137% \stoppagemakeup
138% \stopbuffer
139%
140% \startcolor[green]
141%     \dorecurse{10}{
142%         \dontleavehmode{\bf 1:#1:} \samplefile{sapolsky}\par
143%     }
144% \stopcolor
145%
146% \startpostponing % [+3]
147%     \getbuffer[makeup]
148% \stoppostponing
149%
150% \startcolor[blue]
151%     \dorecurse{25}{
152%         \dontleavehmode{\bf 2:#1:} \samplefile{sapolsky}\par
153%     }
154% \stopcolor
155%
156% \stoptext
157
158\ifdefined\page_check_weird_page \else \let\page_check_weird_page\relax \fi
159
160\def\page_otr_construct_and_shipout#1#2#3%
161  {\forgetall
162   \page_boxes_shipout{\page_boxes_constructed_page#1#2}% \hbox removed
163   \page_otr_flush_pending_content
164   % not really needed, replaced by \flushsavedfloats
165   \page_otr_check_for_pending_inserts
166   % but does not hurt either (we're still in the otr!)
167   \inpagebodytrue      % needed for enabling \blank ! brrr
168   \pagebodymode\plusone % todo: \plustwo when spread
169   \page_otr_command_flush_saved_floats
170   \page_otr_command_set_vsize   % this is needed for interacting components, like floats and multicolumns
171   \strc_pagenumbers_increment_counters % should hook into an every
172   \page_adapts_synchronize
173   \page_otr_check_for_pending_inserts
174   \page_floats_flush_page_floats % before postponed blocks
175   \page_spread_flush % defined later
176   \ifnum#3=\plusone
177     % this is tricky! we need to make sure we are in the output group
178     \ifnum\c_page_postponed_mode=\plusone
179       \aftergroup\page_postponed_blocks_flush
180     \else
181       \page_postponed_blocks_flush
182     \fi
183   \else
184     \page_postponed_blocks_flush
185   \fi
186   \page_check_weird_page}
187
188% Can't we get rid of this hackery? It's used in some widgets
189% stuff so probably not.
190
191\newbox\b_page_otr_special
192
193\def\page_otr_flush_special_content
194  {\ifvoid\b_page_otr_special \else
195     \box\b_page_otr_special
196   \fi}
197
198\permanent\protected\def\page_otr_add_special_content
199  {\dowithnextboxcs\page_otr_add_special_content_indeed\hbox}
200
201\permanent\protected\def\page_otr_add_special_content_indeed
202  {\wd\nextbox\zeropoint
203   \ht\nextbox\zeropoint
204   \dp\nextbox\zeropoint
205   \global\setbox\b_page_otr_special\hbox
206     {%\hskip-\maxdimen                    % not here, fails in acrobat (clips)
207      \box\b_page_otr_special\box\nextbox}}% was \unhbox, is now box again
208
209\aliased\let\flushatshipout\page_otr_add_special_content % this might go away
210
211\maxdeadcycles\plusthousand
212
213\newtoks\afterpage     \newtoks\aftereverypage
214\newtoks\beforepage    \newtoks\beforeeverypage
215
216\newif\ifarrangingpages \arrangingpagesfalse
217
218\newconstant\pageornamentstate % 0=on 1=one-off 2=always-off
219
220% \appendtoks
221%     \ifcase\pageornamentstate \or
222%         \pageornamentstate\zerocount
223%     \fi
224% \to \everyaftershipout
225
226\appendtoks
227    \ifcase\pageornamentstate \or
228        \global\pageornamentstate\zerocount
229    \fi
230\to \everyaftershipout
231
232% Mark synchronization
233
234\newconditional\c_page_marks_building_successive_pages \c_page_marks_building_successive_pages\conditionaltrue
235
236
237\ifdefined\??markingclass
238
239    \def\page_marks_synchronize_page#1% box
240      {} % \strc_markings_synchronize\v!page{1}{#1}
241
242    \def\page_marks_synchronize_column#1#2#3#4% first last column box
243      {\strc_markings_synchronize\v!column{#3}{#4}}
244
245\else
246
247    \def\page_marks_synchronize_page#1% box
248      {\strc_markings_synchronize\v!page{#1}{\ifconditional\c_page_marks_building_successive_pages\v!keep\fi}}
249
250    \def\page_marks_synchronize_column#1#2#3#4% first last column box
251      {\ifnum#3=#1\relax
252         \strc_markings_synchronize{\number#3,\v!column:\number#3,\v!first,\v!column:\v!first}{#4}{}%
253       \orelse\ifnum#3=#2\relax
254         \strc_markings_synchronize{\number#3,\v!column:\number#3,\v!last,\v!column:\v!last}{#4}{}%
255       \else
256         \strc_markings_synchronize{\number#3,\v!column:\number#3}{#4}{}%
257       \fi}
258
259\fi
260
261% Page body building
262
263\newconditional\c_page_boxes_save_page_body
264\newbox        \b_page_boxes_saved_page_body
265
266\def\page_boxes_constructed_page_body#1#2%
267  {\ifconditional\c_page_boxes_save_page_body \global\setbox\b_page_boxes_saved_page_body \fi \vpack \bgroup
268      \boxmaxdepth\maxdimen % new
269      \dontcomplain
270      \page_marks_synchronize_page                    {#2}%  we could consider doing this for \pagebox (needs testing)
271      \page_boxes_construct_content       \pagebox{#1}{#2}%
272      \page_backgrounds_add_to_main       \pagebox
273      \page_boxes_apply_offsets           \pagebox
274      \page_info_add_to_box               \pagebox
275      \ifcase\pageornamentstate
276        \page_backgrounds_add_to_paper    \pagebox
277      \fi
278      \anch_positions_register_page       \pagebox
279      \ifarrangingpages
280        \page_boxes_apply_shift_paper     \pagebox % \v!paper
281      \else
282        \page_boxes_apply_clip_paper      \pagebox
283        \page_marks_add_page              \pagebox
284        \page_boxes_apply_replicate       \pagebox
285        \page_boxes_apply_scale           \pagebox
286        \page_boxes_apply_mirror_paper    \pagebox
287        \page_boxes_apply_orientate_paper \pagebox
288        \page_marks_add_more              \pagebox
289        \page_boxes_apply_center          \pagebox
290        \page_backgrounds_add_to_print    \pagebox
291        \page_boxes_apply_mirror_print    \pagebox
292        \page_boxes_apply_orientate_print \pagebox
293        \page_boxes_apply_shift_print     \pagebox % \v!page
294        \page_boxes_apply_offset          \pagebox
295        \page_boxes_apply_negate_print    \pagebox
296      \fi
297      \box\pagebox
298   \egroup \ifconditional\c_page_boxes_save_page_body \copy\b_page_boxes_saved_page_body \fi}
299
300\appendtoks
301    \restoreglobalbodyfont
302    \restoreglobalinterlinespace
303    \pickupattributes
304\to \everybeforepagebody
305
306% if we really need this ... we need to bypass \permanent
307
308% \ifdefined\nestednewbox \else \newbox\nestednextbox \fi % hm, still needed?
309%
310% \prependtoks
311%     \let\nextbox\nestednextbox
312% \to \everybeforepagebody
313
314\def\page_boxes_constructed_page#1#2%
315  {\vpack\bgroup % intercept spurious spaces
316     \expand\everybeforepagebody
317     \starttextproperties
318     \checkmarginblocks
319     \expand\beforeeverypage
320     \normalexpanded{\global\beforepage\emptytoks\expand\beforepage}%
321     \inpagebodytrue
322     \pagebodymode\plusone % todo: \plustwo when spread
323     \page_boxes_constructed_page_body#1#2%
324     \normalexpanded{\global\afterpage \emptytoks\expand\afterpage }%
325     \expand\aftereverypage
326     \resetpagebreak
327     \resetlayouttextlines % will go to \aftereverypage
328     \stoptextproperties
329     \expand\everyafterpagebody
330   \egroup}
331
332\permanent\def\doifelsetopofpage
333  {\ifdim\pagegoal=\maxdimen
334     \expandafter\firstoftwoarguments
335   \orelse\ifdim\pagegoal=\vsize
336     \expandafter\firstoftwoarguments
337   \else
338     \expandafter\secondoftwoarguments
339   \fi}
340
341\aliased\let\doiftopofpageelse\doifelsetopofpage
342
343\installcorenamespace{markedpage}
344
345% todo: just define at the lua end ... less hassle
346
347\permanent\tolerant\protected\def\markpage  [#1]#*[#2]#*[#3]{\clf_markpage{#1}{#2}{#3}}
348\permanent\tolerant\protected\def\startmarkpages  [#1]#*[#2]{\clf_startmarkpages{#1}{#2}}
349%permanent         \protected\def\stopmarkpages             {\clf_stopmarkpages}
350\permanent                   \def\markedpages           [#1]{\clf_markedpages{#1}} % expandable
351%permanent         \protected\def\doifmarkedpage          #1{\clf_doifmarkedpage{#1}}
352%permanent         \protected\def\doifelsemarkedpage      #1{\clf_doifelsemarkedpage{#1}}
353%                            \def\markedpageparameter   #1#2{\clf_markedpageparameter{#1}{#2}}
354%permanent         \protected\def\checkmarkedpages          {\clf_checkmarkedpages}
355
356\appendtoks
357    \checkmarkedpages % defined at lua end
358\to \everyaftershipout
359
360%D Experimental:
361
362\newconstant\c_page_force_strut_depth_trace_mode
363
364% \installtextracker
365%   {otr.forcestrutdepth}
366%   {\c_page_force_strut_depth_trace_mode\plusone}
367%   {\c_page_force_strut_depth_trace_mode\zerocount}
368
369% todo: only in mvl!
370
371% \installoutputroutine\forcestrutdepth
372%   {\clf_forcestrutdepth\normalpagebox\strutdp\c_page_force_strut_depth_trace_mode
373%    \unvbox\normalpagebox}
374
375% \installoutputroutine\forcestrutdepthplus % experimental
376%   {\clf_forcestrutdepthplus\normalpagebox\strutdp\c_page_force_strut_depth_trace_mode
377%    \unvbox\normalpagebox}
378
379% maybe better:
380%
381% \installoutputroutine\doforcestrutdepth
382%   {\clf_forcestrutdepth\normalpagebox\strutdp\c_page_force_strut_depth_trace_mode
383%    \unvbox\normalpagebox}
384%
385% \protected\def\forcestrutdepth
386%   {\par\ifvmode\ifinner\else\doforcestrutdepth\fi\fi}
387
388% Also experimental:
389
390\permanent\protected\def\doifelsependingpagecontent{\clf_doifelsependingpagecontent}
391% \permanent\protected\let\doifelsependingpagecontent\clf_doifelsependingpagecontent
392
393\protect \endinput
394