page-txt.mklx /size: 43 Kb    last modification: 2025-02-21 11:03
1% macros=mkvi
2
3%D \module
4%D   [       file=page-txt, % copied from main-001,
5%D        version=1997.03.31,
6%D          title=\CONTEXT\ Page Macros,
7%D       subtitle=Texts,
8%D         author=Hans Hagen,
9%D           date=\currentdate,
10%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
11%C
12%C This module is part of the \CONTEXT\ macro||package and is
13%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
14%C details.
15
16\writestatus{loading}{ConTeXt Page Macros / Texts}
17
18\unprotect
19
20\newtoks\toptextcontent     \newtoks\leftedgetextcontent
21\newtoks\headertextcontent  \newtoks\leftmargintextcontent
22\newtoks\footertextcontent  \newtoks\rightmargintextcontent
23\newtoks\bottomtextcontent  \newtoks\rightedgetextcontent
24
25\newtoks\texttextcontent
26
27%D \macros
28%D  {setuptop, setupheader, setuptext,setupfooter, setupbottom}
29%D
30%D The macros in this module sometimes look a bit more complicated than needed,
31%D which is a direct result of the fact that their ancestors are quite old and
32%D upward compatibility is a must.
33%D
34%D \showsetup{setuptop}
35%D \showsetup{setupheader}
36%D \showsetup{setuptext}
37%D \showsetup{setupfooter}
38%D \showsetup{setupbottom}
39
40\installcorenamespace{layouttexts}
41\installcorenamespace{layouttextsline}
42\installcorenamespace{layouttextsreset}
43\installcorenamespace{layouttextssynchronize}
44\installcorenamespace{layouttextstrut}
45\installcorenamespace{layouttextspecial}
46\installcorenamespace{layouttextcontent}
47
48\installcommandhandler \??layouttexts {layoutelement} \??layouttexts
49
50% \appendtoks
51%     \resetlayoutelementparameter\c!lefttext   % resolves better
52%     \resetlayoutelementparameter\c!middletext
53%     \resetlayoutelementparameter\c!righttext
54% \to \everydefinelayoutelement
55
56\definelayoutelement[\v!top   ]
57\definelayoutelement[\v!header]
58\definelayoutelement[\v!text  ]
59\definelayoutelement[\v!footer]
60\definelayoutelement[\v!bottom]
61
62\definelayoutelement[\v!top   :\v!text]  [\v!top   ][\c!lefttext=,\c!middletext=,\c!righttext=]
63\definelayoutelement[\v!header:\v!text]  [\v!header][\c!lefttext=,\c!middletext=,\c!righttext=]
64\definelayoutelement[\v!text  :\v!text]  [\v!text  ][\c!lefttext=,\c!middletext=,\c!righttext=]
65\definelayoutelement[\v!footer:\v!text]  [\v!footer][\c!lefttext=,\c!middletext=,\c!righttext=]
66\definelayoutelement[\v!bottom:\v!text]  [\v!bottom][\c!lefttext=,\c!middletext=,\c!righttext=]
67
68\definelayoutelement[\v!top   :\v!margin][\v!top   ][\c!lefttext=,\c!middletext=,\c!righttext=]
69\definelayoutelement[\v!header:\v!margin][\v!header][\c!lefttext=,\c!middletext=,\c!righttext=]
70\definelayoutelement[\v!text  :\v!margin][\v!text  ][\c!lefttext=,\c!middletext=,\c!righttext=]
71\definelayoutelement[\v!footer:\v!margin][\v!footer][\c!lefttext=,\c!middletext=,\c!righttext=]
72\definelayoutelement[\v!bottom:\v!margin][\v!bottom][\c!lefttext=,\c!middletext=,\c!righttext=]
73
74\definelayoutelement[\v!top   :\v!edge]  [\v!top   ][\c!lefttext=,\c!middletext=,\c!righttext=]
75\definelayoutelement[\v!header:\v!edge]  [\v!header][\c!lefttext=,\c!middletext=,\c!righttext=]
76\definelayoutelement[\v!text  :\v!edge]  [\v!text  ][\c!lefttext=,\c!middletext=,\c!righttext=]
77\definelayoutelement[\v!footer:\v!edge]  [\v!footer][\c!lefttext=,\c!middletext=,\c!righttext=]
78\definelayoutelement[\v!bottom:\v!edge]  [\v!bottom][\c!lefttext=,\c!middletext=,\c!righttext=]
79
80\permanent\tolerant\protected\def\setuplayouttext[#S#vertical]#spacer[#S#horizontal]#spacer[#S#settings]%
81  {\ifnum\lastarguments>\plustwo
82     \setuplayoutelement[#vertical:#horizontal][#settings]%
83   \else
84     \setuplayoutelement[#vertical][#horizontal]%
85   \fi}
86
87\appendtoks
88    \ifempty\currentlayoutelement\else
89        \page_layouts_synchronize_element\currentlayoutelement % brr, can be vertical:horizontal
90    \fi
91\to \everysetuplayoutelement
92
93\mutable\lettonothing\currenttextstate
94\mutable\lettonothing\previoustextstate
95
96\def\page_layouts_reset_element_status#vertical%
97  {\gdefcsname\??layouttextsreset#vertical\endcsname{\page_layouts_set_element_status_normal#vertical}}
98
99\def\page_layouts_set_element_status_normal#vertical%
100  {\gletcsname\namedlayoutelementhash#vertical\c!state\endcsname\v!normal
101   \gletcsname\??layouttextsreset#vertical\endcsname\relax
102   \page_layouts_synchronize_element{#vertical}}
103
104\def\page_layouts_synchronize_element#vertical%
105  {\xdef\previoustextstate{\csname\??layouttextssynchronize#vertical\endcsname}% can be a let
106   \cdef\currenttextstate {\namedlayoutelementparameter{#vertical}\c!state}%
107  %\writestatus{>>}{[#vertical:\currenttextstate/\previoustextstate]}%
108   \ifx\currenttextstate\previoustextstate \else
109     \page_layouts_synchronize_element_indeed{#vertical}%
110   \fi}
111
112\def\page_layouts_synchronize_element_indeed#vertical%
113  {\ifx\currenttextstate \v!high \calculatevsizes\page_backgrounds_recalculate \orelse
114   \ifx\previoustextstate\v!high \calculatevsizes\page_backgrounds_recalculate \orelse
115   \ifx\currenttextstate \v!none \calculatevsizes\page_backgrounds_recalculate \orelse
116   \ifx\previoustextstate\v!none \calculatevsizes\page_backgrounds_recalculate \fi
117   \gletcsname\??layouttextssynchronize#vertical\endcsname\currenttextstate}
118
119\permanent\protected\def\setuptop   {\setuplayouttext[\v!top   ]}
120\permanent\protected\def\setupheader{\setuplayouttext[\v!header]}
121\permanent\protected\def\setuptext  {\setuplayouttext[\v!text  ]}
122\permanent\protected\def\setupfooter{\setuplayouttext[\v!footer]}
123\permanent\protected\def\setupbottom{\setuplayouttext[\v!bottom]}
124
125%D We inherit some settings:
126
127\setuplayoutelement
128  [  \c!leftstyle=\layoutelementparameter\c!style,
129   \c!middlestyle=\layoutelementparameter\c!style,
130    \c!rightstyle=\layoutelementparameter\c!style,
131     \c!leftcolor=\layoutelementparameter\c!color,
132   \c!middlecolor=\layoutelementparameter\c!color,
133    \c!rightcolor=\layoutelementparameter\c!color,
134     \c!leftwidth=\layoutelementparameter\c!width,
135   \c!middlewidth=\layoutelementparameter\c!width,
136    \c!rightwidth=\layoutelementparameter\c!width]
137
138%D \macros
139%D  {noheaderandfooterlines,notopandbottomlines}
140%D
141%D Although not really needed, the following shortcuts sometimes come in handy.
142%D
143%D \showsetup{noheaderandfooterlines}
144%D \showsetup{notopandbottomlines}
145
146\permanent\protected\def\noheaderandfooterlines
147  {\setuplayoutelement[\v!header][\c!state=\v!empty]%
148   \setuplayoutelement[\v!footer][\c!state=\v!empty]}
149
150\permanent\protected\def\notopandbottomlines
151  {\setuplayoutelement[\v!top   ][\c!state=\v!empty]%
152   \setuplayoutelement[\v!bottom][\c!state=\v!empty]}
153
154%D \macros
155%D  {setuptoptexts,setupheadertexts,setuptexttexts,setupfootertexts,setupbottomtexts}
156%D
157%D The next macros take one or more arguments. The exact setup depends on the number
158%D of arguments. Although not that intuitive, the current scheme evolved out of the
159%D original. When margin and edge texts as well as middle texts showed up, the
160%D current odd|/|even scheme surfaced.
161%D
162%D \showsetup{setuptoptexts}
163%D \showsetup{setupheadertexts}
164%D \showsetup{setuptexttexts}
165%D \showsetup{setupfootertexts}
166%D \showsetup{setupbottomtexts}
167%D
168%D Only the following have checking for pagenumber, date and mark built in, so when
169%D someone uses the key|/|value interface these things have to be set explicitly as
170%D part of the text.
171
172\permanent\protected\def\setuptoptexts   {\setuptexts[\v!top   ]}
173\permanent\protected\def\setupheadertexts{\setuptexts[\v!header]}
174\permanent\protected\def\setuptexttexts  {\setuptexts[\v!text  ]}
175\permanent\protected\def\setupfootertexts{\setuptexts[\v!footer]}
176\permanent\protected\def\setupbottomtexts{\setuptexts[\v!bottom]}
177
178\mutable\lettonothing\currentlayoutelementstate
179
180\permanent\tolerant\protected\def\setuptexts[#S#vertical]#spacer[#S#horizontal]#spacer[#S#a]#spacer[#S#b]#spacer[#S#c]#spacer[#S#d]%
181  {\ifarguments
182     % there is always one
183   \or
184     \cdef\currentlayoutelement{#vertical:\v!text}%
185     \resetlayoutelementparameter\c!lefttext
186     \resetlayoutelementparameter\c!righttext
187     \resetlayoutelementparameter\c!middletext
188     \cdef\currentlayoutelement{#vertical:\v!margin}%
189     \resetlayoutelementparameter\c!lefttext
190     \resetlayoutelementparameter\c!righttext
191     \resetlayoutelementparameter\c!middletext
192     \cdef\currentlayoutelement{#vertical:\v!edge}%
193     \resetlayoutelementparameter\c!lefttext
194     \resetlayoutelementparameter\c!righttext
195     \resetlayoutelementparameter\c!middletext
196   \or
197     \cdef\currentlayoutelement{#vertical:\v!text}%
198     \resetlayoutelementparameter\c!lefttext
199     \resetlayoutelementparameter\c!righttext
200     \setlayoutelementparameter  \c!middletext{\page_layouts_process_element_single{#horizontal}}%
201   \or
202     \cdef\currentlayoutelement{#vertical:\v!text}%
203     \setlayoutelementparameter\c!lefttext {\page_layouts_process_element_single{#horizontal}}%
204     \setlayoutelementparameter\c!righttext{\page_layouts_process_element_single{#a}}%
205   \or
206     \cdef\currentlayoutelement{#vertical:#horizontal}%
207     \setlayoutelementparameter\c!lefttext {\page_layouts_process_element_single{#a}}%
208     \setlayoutelementparameter\c!righttext{\page_layouts_process_element_single{#b}}%
209   \or
210     \cdef\currentlayoutelement{#vertical:\v!text}%
211     \setlayoutelementparameter\c!lefttext {\page_layouts_process_element_double{#horizontal}{#c}}%
212     \setlayoutelementparameter\c!righttext{\page_layouts_process_element_double{#a}{#b}}%
213   \or
214     \cdef\currentlayoutelement{#vertical:#horizontal}%
215     \setlayoutelementparameter\c!lefttext {\page_layouts_process_element_double{#a}{#d}}%
216     \setlayoutelementparameter\c!righttext{\page_layouts_process_element_double{#b}{#c}}%
217   \fi}
218
219%D Left and right texts are swapped on odd and even pages, but only when double
220%D sided typesetting is enabled.
221
222\defcsname\??layouttextstrut\v!yes\endcsname{\setstrut\strut} % maybe more variants
223
224\lettonothing\m_page_layouts_element_content
225
226\protected\def\page_layouts_process_element_single#content%
227  {\edef\m_page_layouts_element_content{\detokenize{#content}}% so no \v!xxx
228   \ifcsname\??layouttextspecial\m_page_layouts_element_content\endcsname
229     \lastnamedcs
230   \else
231     \doifelsemarking\m_page_layouts_element_content
232       {\getmarking[\m_page_layouts_element_content][\v!first]}%
233       {#content}%
234   \fi}
235
236\protected\def\page_layouts_process_element_double#first#second%
237  {\doifelseoddpage
238     {\page_layouts_process_element_single{#first}}
239     {\page_layouts_process_element_single{#second}}}
240
241\protected\def\page_layouts_process_element_indeed#style#color#width%
242  {\begingroup
243   \lefttoright % new
244   \uselayoutelementstyleandcolor#style#color%
245   \begincsname\??layouttextstrut\layoutelementparameter\c!strut\endcsname
246   \ignorecrlf
247   \edef\p_width{\layoutelementparameter#width}%
248   \ifempty\p_width\else
249     \expandafter\page_layouts_process_element_limited
250   \fi\p_text
251   \endgroup}
252
253\def\page_layouts_process_element_limited#content% are the {}{}{} still needed?
254  {\limitated
255      left     \p_width
256      text     {#content}%
257      sentinel {\unknown}%
258   \relax}
259
260\defcsname\??layouttextspecial\v!pagenumber\endcsname{\page_layouts_place_page_number}
261\defcsname\??layouttextspecial\v!date      \endcsname{\currentdate}
262
263%D When specified, the texts are automatically limited in length.
264
265\appendtoks \page_layouts_place_text_line\v!top   \topheight    \to \toptextcontent
266\appendtoks \page_layouts_place_text_line\v!header\headerheight \to \headertextcontent
267\appendtoks \page_layouts_place_text_line\v!text  \textheight   \to \texttextcontent
268\appendtoks \page_layouts_place_text_line\v!footer\footerheight \to \footertextcontent
269\appendtoks \page_layouts_place_text_line\v!bottom\bottomheight \to \bottomtextcontent
270
271%D Texts can be disabled, moved up and ignored, depending in the \type {status}
272%D variable. This is handled by the next couple of macros.
273
274\newinteger\c_page_layouts_element_state_n
275
276\mutable\lettonothing\textlinestatus
277
278\def\page_layouts_set_element_status#vertical%
279  {\c_page_layouts_element_state_n=0\namedlayoutelementparameter#vertical\c!n\relax
280   \ifcase\c_page_layouts_element_state_n
281     \edef\textlinestatus{\namedlayoutelementparameter#vertical\c!state}%
282   \else
283     \xdefcsname\namedlayoutelementhash#vertical\c!n\endcsname{\tointeger{\c_page_layouts_element_state_n+\minusone}}%
284     \let\textlinestatus\v!stop
285   \fi}
286
287\appendtoks
288   \ifinset\v!header\floatspecification\xdefcsname\namedlayoutelementhash\v!header\c!n\endcsname{1}\fi
289   \ifinset\v!footer\floatspecification\xdefcsname\namedlayoutelementhash\v!footer\c!n\endcsname{1}\fi
290\to \everybeforeflushedpagefloat
291
292\protected\def\page_layouts_place_text_line#vertical%
293  {\page_layouts_set_element_status#vertical\relax
294   \ifcsname\??layouttextsline\textlinestatus\endcsname
295     \expandafter\lastnamedcs
296   \else
297     \expandafter\page_layouts_place_text_line_unknown
298   \fi#vertical}
299
300\permanent\protected\def\doifelselayouttextline#vertical% shown or not
301  {\cdef\currentlayoutelementstate{\namedlayoutelementparameter{#vertical}\c!state}%
302   \ifx\currentlayoutelementstate\v!normal
303     \expandafter\firstoftwoarguments
304   \orelse\ifx\currentlayoutelementstate\v!start
305     \expandafter\firstoftwoarguments
306   \else
307     \expandafter\secondoftwoarguments
308   \fi}
309
310\permanent\protected\def\doifelselayoutsomeline#vertical% present or not
311  {\cdef\currentlayoutelementstate{\namedlayoutelementparameter{#vertical}\c!state}%
312   \ifx\currentlayoutelementstate\v!none
313     \expandafter\secondoftwoarguments
314   \orelse\ifx\currentlayoutelementstate\v!high
315     \expandafter\secondoftwoarguments
316   \else
317     \expandafter\firstoftwoarguments
318   \fi}
319
320\aliased\let\doiflayouttextlineelse\doifelselayouttextline
321\aliased\let\doiflayoutsomelineelse\doifelselayoutsomeline
322
323\newconditional\resyncaftertextline
324
325\defcsname\??layouttextsline\v!normal\endcsname{\page_layouts_place_text_line_indeed}
326\defcsname\??layouttextsline\empty   \endcsname{\page_layouts_place_text_line_indeed}
327
328\letcsname\??layouttextsline\v!none\endcsname\gobbletwoarguments
329\letcsname\??layouttextsline\v!stop\endcsname\gobbletwoarguments
330
331\defcsname\??layouttextsline\v!high\endcsname#vertical#height%
332  {\global\resyncaftertextline\conditionaltrue
333   \page_layouts_reset_element_status#vertical}
334
335\defcsname\??layouttextsline\v!empty\endcsname#vertical#height%
336  {\page_layouts_reset_element_status#vertical}
337
338\defcsname\??layouttextsline\v!start\endcsname#vertical#height%
339  {\page_layouts_reset_element_status#vertical%
340   \page_layouts_place_text_line_indeed#vertical#height}
341
342\defcsname\??layouttextsline\v!nomarking\endcsname#vertical#height%
343  {\bgroup
344   \page_layouts_reset_element_status#vertical%
345   \inhibitgetmarking\conditionaltrue
346   \page_layouts_place_text_line_indeed#vertical#height%
347   \egroup}
348
349% \setupheadertexts            [11]
350% \definetext [title] [header] [aa]
351% \setupheadertexts            [11] [22]
352% \definetext [title] [header] [aa] [bb]
353% \setupheadertexts            [text] [11] [22]
354% \definetext [title] [header] [text] [aa] [bb]
355% \setupheadertexts            [11] [22] [33] [44]
356% \definetext [title] [header] [aa] [bb] [cc] [dd]
357% \setupheadertexts            [text] [11] [22] [33] [44]
358% \definetext [title] [header] [text] [aa] [bb] [cc] [dd]
359
360\def\page_layouts_place_text_line_unknown#vertical#height%
361  {\global\resyncaftertextline\conditionaltrue
362   \begingroup % new
363   \page_layouts_reset_element_status#vertical%
364   \begincsname\namedlayoutelementhash{#vertical}\textlinestatus\endcsname
365   \begincsname\namedlayoutelementhash{#vertical:\v!text}\textlinestatus\endcsname
366   \begincsname\namedlayoutelementhash{#vertical:\v!margin}\textlinestatus\endcsname
367   \begincsname\namedlayoutelementhash{#vertical:\v!edge}\textlinestatus\endcsname
368   \page_layouts_place_text_line_indeed#vertical#height%
369   \endgroup}
370
371\letcsname\??layouttextsline\s!unknown\endcsname\page_layouts_place_text_line_unknown
372
373%D The following macro has to be called after a page is flushed.
374
375\permanent\protected\def\resetlayouttextlines % public
376  {\begincsname\??layouttextsreset\v!top   \endcsname
377   \begincsname\??layouttextsreset\v!header\endcsname
378   \begincsname\??layouttextsreset\v!text  \endcsname
379   \begincsname\??layouttextsreset\v!footer\endcsname
380   \begincsname\??layouttextsreset\v!bottom\endcsname
381   \ifconditional\resyncaftertextline
382     \calculateglobalvsizes
383     \page_backgrounds_recalculate
384     \global\resyncaftertextline\conditionalfalse
385   \fi}
386
387\permanent\def\getspecificlayouttext#vertical#horizontal#what%
388  {\begincsname\namedlayoutelementhash{#vertical:#horizontal}#what\endcsname}
389
390% \settext[header][text][middle][xxx][yyy]
391
392\permanent\tolerant\protected\def\settextcontent[#S#vertical]#spacer[#S#horizontal]#spacer[#S#one]#spacer[#S#two]#spacer[#S#three]% header text middle text/text
393  {\ifarguments\or\or\or % 3
394     \defcsname\namedlayoutelementhash{#vertical:#horizontal}\c!middletext\endcsname
395       {\page_layouts_process_element_double{#one}{#one}}%
396   \or % 4
397     \defcsname\namedlayoutelementhash{#vertical:#horizontal}\begincsname\??layouttextcontent\v!text:#one\endcsname\c!middletext\endcsname
398       {\page_layouts_process_element_double{#two}{#two}}%
399   \or % 5
400     \defcsname\namedlayoutelementhash{#vertical:#horizontal}\begincsname\??layouttextcontent\v!text:#one\endcsname\c!middletext\endcsname
401       {\page_layouts_process_element_double{#two}{#three}}%
402   \fi}
403
404\let\currentlayoutelement\relax
405
406%D This will be redefined, so no \type {\frozen} here!
407
408\permanent\tolerant\protected\def\resettextcontent[#S#vertical]#spacer[#S#horizontal]#spacer[#S#tag]% header text middle
409  {\ifarguments\or\or % 2
410     \cdef\currentlayoutelement{#vertical:#horizontal}%
411     \resetlayoutelementparameter\c!lefttext
412     \resetlayoutelementparameter\c!middletext
413     \resetlayoutelementparameter\c!righttext
414   \or % 3
415%      \cdef\currentlayoutelement{#vertical:#horizontal}%
416%      \letcsname\layoutelementhash\begincsname\??layouttextcontent\v!text:#tag\endcsname\c!middletext\endcsname\empty
417     \letcsname\namedlayoutelementhash{#vertical:#horizontal}\begincsname\??layouttextcontent\v!text:#tag\endcsname\c!middletext\endcsname\empty
418   \fi}
419
420\letcsname\??layouttextcontent\v!text:\c!middle\endcsname\c!middletext
421\letcsname\??layouttextcontent\v!text:\c!left  \endcsname\c!lefttext
422\letcsname\??layouttextcontent\v!text:\c!right \endcsname\c!righttext
423
424%D The placement of a whole line is handled by the next two macros. These are hooked
425%D into the general purpose token list registers mentioned before.
426
427\mutable\let\currentlayouttextline\relax
428
429\def\page_layouts_place_text_line_indeed#vertical#height%
430  {\let\currentlayouttextline#vertical%
431   \ifdim#height>\zeropoint\relax  % prevents pagenumbers when zero height
432     \page_layouts_place_text_line_left_or_right{#height}%
433   \fi}
434
435\def\page_layouts_place_text_line_left_or_right#height%
436  {\goleftonpage
437   \setbox\b_page_layouts_element\vbox to #height
438     {\vsize#height\relax
439     %\hsize\zeropoint % hack so that e.g. after=\hairline gives predictable results
440      \hsize\totaltextwidth
441      \normalbaselines
442      \enforced\let\\\ignoredlinebreak
443      \enforced\let\crlf\ignoredlinebreak
444      \namedlayoutelementparameter\currentlayouttextline\c!before
445      \doifbothsidesoverruled
446        \page_layouts_place_text_line_right
447        \page_layouts_place_text_line_right
448        \page_layouts_place_text_line_left
449      \namedlayoutelementparameter\currentlayouttextline\c!after
450      \vkern\zeropoint}% keep the \dp, beware of \vtops, never change this!
451   \dp\b_page_layouts_element\zeropoint
452   \box\b_page_layouts_element
453   \vkern-#height\relax}
454
455\lettonothing\page_layouts_place_extra_text_left  % historic
456\lettonothing\page_layouts_place_extra_text_right % historic
457
458\def\page_layouts_place_text_line_right
459  {\hpack
460     {\ifdim\leftedgewidth>\zeropoint
461        \page_layouts_left_edge_element\c!lefttext\c!leftstyle\c!leftcolor\c!leftwidth
462      \fi
463      \ifdim\leftmarginwidth>\zeropoint
464        \page_layouts_left_margin_element\c!lefttext\c!leftstyle\c!leftcolor\c!leftwidth\zerocount
465      \fi
466      \ifdim\makeupwidth>\zeropoint
467        \page_layouts_text_body_element_l_m_r_e
468      \fi
469      \ifdim\rightmarginwidth>\zeropoint
470        \page_layouts_right_margin_element\c!righttext\c!rightstyle\c!rightcolor\c!rightwidth\plusone
471      \fi
472      \ifdim\rightedgewidth>\zeropoint
473        \page_layouts_right_edge_element\c!righttext\c!rightstyle\c!rightcolor\c!rightwidth
474      \fi}}
475
476\def\page_layouts_place_text_line_left
477  {\hpack
478     {\ifdim\leftedgewidth>\zeropoint
479        \page_layouts_left_edge_element\c!righttext\c!rightstyle\c!rightcolor\c!rightwidth
480      \fi
481      \ifdim\leftmarginwidth>\zeropoint
482        \page_layouts_left_margin_element\c!righttext\c!rightstyle\c!rightcolor\c!rightwidth\plusone
483      \fi
484      \ifdim\makeupwidth>\zeropoint
485        \page_layouts_text_body_element_e_r_m_l
486      \fi
487      \ifdim\rightmarginwidth>\zeropoint
488        \page_layouts_right_margin_element\c!lefttext\c!leftstyle\c!leftcolor\c!leftwidth\zerocount
489      \fi
490      \ifdim\rightedgewidth>\zeropoint
491        \page_layouts_right_edge_element\c!lefttext\c!leftstyle\c!leftcolor\c!leftwidth
492      \fi}}
493
494\def\page_layouts_left_edge_element_indeed#text#style#color#width%
495  {\letfromlayoutelementparameter\p_text#text%
496   \ifempty\p_text
497     \kern\leftedgewidth
498   \else
499     \hbox to \leftedgewidth\bgroup
500       \hss
501       \page_layouts_process_element_indeed#style#color#width%
502     \egroup
503   \fi}
504
505\def\page_layouts_left_edge_element#text#style#color#width%
506  {\cdef\currentlayoutelement{\currentlayouttextline:\v!edge}%
507   \page_layouts_place_element_indeed\leftedgewidth
508     {\page_layouts_left_edge_element_indeed#text#style#color#width}%
509   \kern\leftedgedistance}
510
511\def\page_layouts_right_edge_element_indeed#text#style#color#width%
512  {\letfromlayoutelementparameter\p_text#text%
513   \ifempty\p_text
514     \kern\rightedgewidth
515   \else
516      \hbox to \rightedgewidth\bgroup
517        \page_layouts_process_element_indeed#style#color#width%
518        \hss
519      \egroup
520   \fi}
521
522\def\page_layouts_right_edge_element#text#style#color#width%
523  {\cdef\currentlayoutelement{\currentlayouttextline:\v!edge}%
524   \kern\rightedgedistance
525   \page_layouts_place_element_indeed\rightedgewidth
526     {\page_layouts_right_edge_element_indeed#text#style#color#width}}
527
528% margin needs checking!
529
530% \hbox to \leftmarginwidth{\hss\layoutelementparameter\c!margintext}%
531% \hbox to \rightmarginwidth{\layoutelementparameter\c!margintext\hss}%
532
533\def\page_layouts_left_margin_element_indeed#text#style#color#width#margintoo%
534  {\letfromlayoutelementparameter\p_text#text%
535   \ifempty\p_text
536     \kern\leftmarginwidth
537   \else
538     \hbox to \leftmarginwidth\bgroup
539       \hss
540       \page_layouts_process_element_indeed#style#color#width%
541     \egroup
542   \fi
543   \ifcase#margintoo\or
544     \letfromlayoutelementparameter\p_text\c!margintext
545     \ifempty\p_text\else
546       \kern-\leftmarginwidth
547       \hbox to \leftmarginwidth\bgroup
548         \hss
549         \p_text % styling ?
550       \egroup
551     \fi
552   \fi}
553
554\def\page_layouts_left_margin_element#text#style#color#width#margintoo%
555  {\cdef\currentlayoutelement{\currentlayouttextline:\v!margin}%
556   \page_layouts_place_element_indeed\leftmarginwidth
557     {\page_layouts_left_margin_element_indeed#text#style#color#width#margintoo}%
558   \kern\leftmargindistance}
559
560\def\page_layouts_right_margin_element_indeed#text#style#color#width#margintoo%
561  {\letfromlayoutelementparameter\p_text#text%
562   \ifempty\p_text
563     \kern\rightmarginwidth
564   \else
565     \hbox to \rightmarginwidth\bgroup
566       \page_layouts_process_element_indeed#style#color#width%
567       \hss
568     \egroup
569   \fi
570   \ifcase#margintoo\or
571     \letfromlayoutelementparameter\p_text\c!margintext
572     \ifempty\p_text\else
573       \kern-\rightmarginwidth
574       \hbox to \rightmarginwidth\bgroup
575         \p_text % ? styling
576         \hss
577       \egroup
578     \fi
579   \fi}
580
581\def\page_layouts_right_margin_element#text#style#color#width#margintoo%
582  {\cdef\currentlayoutelement{\currentlayouttextline:\v!margin}%
583   \kern\rightmargindistance
584   \page_layouts_place_element_indeed\rightmarginwidth
585     {\page_layouts_right_margin_element_indeed#text#style#color#width#margintoo}}
586
587\def\page_layouts_text_body_element_indeed_l_m_r_e
588  {\letfromlayoutelementparameter\p_text\c!lefttext
589   \ifempty\p_text
590     \ifempty\page_layouts_place_extra_text_left\else
591       \hbox to \makeupwidth\bgroup
592         \page_layouts_place_extra_text_left
593         \hss
594       \egroup
595       \kern-\makeupwidth
596     \fi
597   \else
598     \hbox to \makeupwidth\bgroup
599       \page_layouts_place_extra_text_left
600       \page_layouts_process_element_indeed\c!leftstyle\c!leftcolor\c!leftwidth
601       \hss
602     \egroup
603     \kern-\makeupwidth
604   \fi
605   \letfromlayoutelementparameter\p_text\c!middletext
606   \ifempty\p_text\else
607     \hbox to \makeupwidth\bgroup
608       \hss
609       \page_layouts_process_element_indeed\c!middlestyle\c!middlecolor\c!middlewidth
610       \hss
611     \egroup
612     \kern-\makeupwidth
613   \fi
614   \letfromlayoutelementparameter\p_text\c!righttext
615   \ifempty\p_text
616     \kern\makeupwidth
617   \else
618     \hbox to \makeupwidth\bgroup
619       \hss
620       \page_layouts_process_element_indeed\c!rightstyle\c!rightcolor\c!rightwidth
621     \egroup
622   \fi}
623
624\def\page_layouts_text_body_element_indeed_e_r_m_l
625  {\letfromlayoutelementparameter\p_text\c!righttext
626   \ifempty\p_text\else
627     \hbox to \makeupwidth\bgroup
628       \page_layouts_process_element_indeed\c!rightstyle\c!rightcolor\c!rightwidth
629       \hss
630     \egroup
631     \kern-\makeupwidth
632   \fi
633   \letfromlayoutelementparameter\p_text\c!middletext
634   \ifempty\p_text\else
635     \hbox to \makeupwidth\bgroup
636       \hss
637       \page_layouts_process_element_indeed\c!middlestyle\c!middlecolor\c!middlewidth
638       \hss
639     \egroup
640     \kern-\makeupwidth
641   \fi
642   \letfromlayoutelementparameter\p_text\c!lefttext
643   \ifempty\p_text
644     \ifempty\page_layouts_place_extra_text_right
645       \kern\makeupwidth
646     \else
647       \hbox to \makeupwidth\bgroup
648         \hss
649         \page_layouts_place_extra_text_right
650       \egroup
651     \fi
652   \else
653     \hbox to \makeupwidth\bgroup
654       \hss
655       \page_layouts_process_element_indeed\c!leftstyle\c!leftcolor\c!leftwidth
656       \page_layouts_place_extra_text_right
657     \egroup
658   \fi}
659
660\def\page_layouts_text_body_element_l_m_r_e
661  {\cdef\currentlayoutelement{\currentlayouttextline:\v!text}%
662   \page_layouts_place_element_indeed\makeupwidth\page_layouts_text_body_element_indeed_l_m_r_e}
663
664\def\page_layouts_text_body_element_e_r_m_l
665  {\cdef\currentlayoutelement{\currentlayouttextline:\v!text}%
666   \page_layouts_place_element_indeed\makeupwidth\page_layouts_text_body_element_indeed_e_r_m_l}
667
668\def\page_layouts_place_element_indeed#width#content%
669  {\vbox % to \vsize
670     {\hsize#width\relax
671      \layoutelementparameter\c!before
672      \setlayoutcomponentattribute\currentlayoutelement
673      \hbox \layoutcomponentboxattribute to #width{#content}%
674      \layoutelementparameter\c!after}}
675
676%D Although it is far better to use backgrounds for this purpose, one can add a rule
677%D in the following way. This method makes the rules disappear in case of an empty
678%D text line. Consider this a feature.
679%D
680%D \starttyping
681%D \setupheadertexts[left][right]
682%D
683%D \setupheader[text][after=\hrule,style=bold]
684%D
685%D \starttext
686%D   \input tufte \page
687%D   \setupheader[state=empty]
688%D   \input tufte \page
689%D \stoptext
690%D \stoptyping
691
692%D This code will move to \type {page-flt.tex}.
693
694\appendtoks \placerightmarginblock \kern-\rightmarginwidth \to \rightmargintextcontent
695\appendtoks \placeleftmarginblock  \kern-\leftmarginwidth  \to \leftmargintextcontent
696
697%D \macros
698%D   {definetext}
699%D
700%D Some macros ago, we implemented the \type {status} option \type {unknown}. This
701%D one is used to take care of symbolic texts handlers.
702%D
703%D \showsetup{definetext}
704%D
705%D The next example demonstrates how we can use this mechanism to provide page
706%D (event) dependent text lines.
707%D
708%D \starttyping
709%D \definetext[chapter][footer][pagenumber]
710%D \setuphead[chapter][header=high,footer=chapter]
711%D \setupheadertexts[pagenumber]
712%D \setupfootertexts[left][right]
713%D \chapter{eerste} \dorecurse{20}{\input tufte \relax}
714%D \chapter{tweede} \dorecurse{20}{\input tufte \relax}
715%D \stoptyping
716
717\permanent\tolerant\protected\def\definetext[#S#tag]#spacer[#S#vertical]#spacer[#S#horizontal]#spacer[#S#a]#spacer[#S#b]#spacer[#S#c]#spacer[#S#d]%
718  {\ifnum\lastarguments<\plusfour
719     \defcsname\namedlayoutelementhash            {#vertical}#tag\endcsname{\setuptexts[#vertical][#horizontal]\relax}% 1, 2, 3
720   \orelse\ifarguments\or\or\or\or
721     \defcsname\namedlayoutelementhash            {#vertical}#tag\endcsname{\setuptexts[#vertical][#horizontal][#a]\relax}% 4
722   \or
723     \defcsname\namedlayoutelementhash{#vertical:#horizontal}#tag\endcsname{\setuptexts[#vertical][#horizontal][#a][#b]\relax}% 5
724   \or
725     \defcsname\namedlayoutelementhash            {#vertical}#tag\endcsname{\setuptexts[#vertical][#horizontal][#a][#b][#c]\relax}% 6
726   \or
727     \defcsname\namedlayoutelementhash{#vertical:#horizontal}#tag\endcsname{\setuptexts[#vertical][#horizontal][#a][#b][#c][#d]\relax}% 7
728   \fi}
729
730%D A few more page breakers:
731
732\installpagebreakmethod \v!empty
733  {\page_otr_flush_all_floats
734   \page_otr_command_next_page
735   \ifcstok{\namedlayoutelementparameter\v!header\c!state}\v!stop\else\setuplayoutelement[\v!header][\c!state=\v!empty]\fi
736   \ifcstok{\namedlayoutelementparameter\v!footer\c!state}\v!stop\else\setuplayoutelement[\v!footer][\c!state=\v!empty]\fi
737   \page_otr_insert_dummy_page}
738
739\installpagebreakmethod \v!header
740  {\ifcstok{\namedlayoutelementparameter\v!header\c!state}\v!stop\else\setuplayoutelement[\v!header][\c!state=\v!empty]\fi}
741
742\installpagebreakmethod \v!footer
743  {\ifcstok{\namedlayoutelementparameter\v!footer\c!state}\v!stop\else\setuplayoutelement[\v!footer][\c!state=\v!empty]\fi}
744
745%D While the header and footer lines are moved away from the main text, the top and
746%D bottom lines are centered.
747
748\setuplayoutelement[\v!top   ][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
749\setuplayoutelement[\v!header][\c!state=\v!normal,\c!n=0,\c!before=,    \c!after=\vss,\c!strut=\v!yes]
750\setuplayoutelement[\v!text  ][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
751\setuplayoutelement[\v!footer][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=,    \c!strut=\v!yes]
752\setuplayoutelement[\v!bottom][\c!state=\v!normal,\c!n=0,\c!before=\vss,\c!after=\vss,\c!strut=]
753
754%D Moved here from strc-pag:
755%D
756%D We reset a previous location but only when it has a pagenumber associated. This
757%D is a rather messy test but better than the MkII way where we use states and keep
758%D settings.
759
760\let\m_page_layouts_page_number_location  \relax
761\let\m_page_layouts_page_number_location_v\relax
762\let\m_page_layouts_page_number_location_h\relax
763\let\m_page_layouts_page_number_location_x\relax
764
765\def\page_layouts_place_page_number   % also elsewhere .. beware, not \protected else
766  {\strc_pagenumbers_place_location}  % test below fails
767
768\def\page_layouts_reset_page_number_location
769  {\ifrelax\m_page_layouts_page_number_location_v\else
770     % this can be done better now, no meaning hackery needed
771     \cdef\currentlayoutelement{\m_page_layouts_page_number_location_v:\m_page_layouts_page_number_location_h}%
772     \edef\tempstring{\detokenizedlayoutelementparameter\m_page_layouts_page_number_location_x}%
773     \iftok{\normalmeaningless\tempstring}{\normalmeaningless\page_layouts_place_page_number}%
774       \resetlayoutelementparameter\m_page_layouts_page_number_location_x
775     \fi
776   \fi}
777
778\def\page_layouts_set_page_number_location
779  {\cdef\currentlayoutelement{\m_page_layouts_page_number_location_v:\m_page_layouts_page_number_location_h}%
780   \letlayoutelementparameter\m_page_layouts_page_number_location_x\page_layouts_place_page_number
781   \ifx\m_page_layouts_page_number_location_x\c!marginedgetext
782     \let\page_layouts_place_extra_text_left \page_layouts_place_page_number_left
783     \let\page_layouts_place_extra_text_right\page_layouts_place_page_number_right
784   \else
785     \lettonothing\page_layouts_place_extra_text_left
786     \lettonothing\page_layouts_place_extra_text_right
787   \fi}
788
789\def\page_layouts_identify_page_number_location
790  {\let\m_page_layouts_page_number_location_v\v!footer
791   \let\m_page_layouts_page_number_location_h\v!text
792   \let\m_page_layouts_page_number_location_x\c!middletext
793   \processallactionsinset[\directpagenumberingparameter\c!location]%
794     [    \v!header=>\let\m_page_layouts_page_number_location_v\v!header,%
795          \v!footer=>\let\m_page_layouts_page_number_location_v\v!footer,%
796          \v!middle=>\let\m_page_layouts_page_number_location_h\v!text
797                     \let\m_page_layouts_page_number_location_x\c!middletext,%
798            \v!left=>\let\m_page_layouts_page_number_location_h\v!text
799                     \let\m_page_layouts_page_number_location_x\c!lefttext,%
800           \v!right=>\let\m_page_layouts_page_number_location_h\v!text
801                     \let\m_page_layouts_page_number_location_x\c!righttext,%
802          \v!inleft=>\let\m_page_layouts_page_number_location_h\v!margin
803                     \let\m_page_layouts_page_number_location_x\c!lefttext,%
804         \v!inright=>\let\m_page_layouts_page_number_location_h\v!margin
805                     \let\m_page_layouts_page_number_location_x\c!righttext,%
806        \v!inmargin=>\let\m_page_layouts_page_number_location_h\v!margin
807                     \def\m_page_layouts_page_number_location_x{\ifdoublesided\c!margintext\else\c!righttext\fi},%
808          \v!margin=>\let\m_page_layouts_page_number_location_h\v!margin
809                     \def\m_page_layouts_page_number_location_x{\ifdoublesided\c!margintext\else\c!righttext\fi},%
810        \v!atmargin=>\let\m_page_layouts_page_number_location_h\v!text
811                     \let\m_page_layouts_page_number_location_x\c!marginedgetext,%
812      \v!marginedge=>\let\m_page_layouts_page_number_location_h\v!text
813                     \let\m_page_layouts_page_number_location_x\c!marginedgetext]}
814
815\protected\def\strc_pagenumbers_set_location
816  {\edef\p_strc_pagenumbers_location{\directpagenumberingparameter\c!location}%
817   \ifx\p_strc_pagenumbers_location\m_page_layouts_page_number_location
818      % unchanged
819   \else
820     \let\m_page_layouts_page_number_location\p_strc_pagenumbers_location
821     \page_layouts_reset_page_number_location
822     \ifempty\p_strc_pagenumbers_location
823       % set otherwise
824     \orelse\ifx\p_strc_pagenumbers_location\v!none
825       % set otherwise
826     \else
827       \page_layouts_identify_page_number_location
828       \page_layouts_set_page_number_location
829     \fi
830   \fi}
831
832\def\page_layouts_place_page_number_left % historic
833  {\begingroup
834   \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}%
835   \ifzeropt\wd\scratchbox
836     % nothing
837   \orelse\ifchkdimexpr\directpagenumberingparameter\c!width\or
838     \hpack to \lastchkdimension{\box\scratchbox\hss}%
839   \else
840     \box\scratchbox\tfskip
841   \fi
842   \endgroup}
843
844\def\page_layouts_place_page_number_right % historic
845  {\begingroup
846   \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}%
847   \ifzeropt\wd\scratchbox
848     % nothing
849   \orelse\ifchkdimexpr\directpagenumberingparameter\c!width\or
850     \hpack to \lastchkdimension{\hss\box\scratchbox}%
851   \else
852     \tfskip\box\scratchbox
853   \fi
854   \endgroup}
855
856\strc_pagenumbers_set_location % initializes
857
858\newbox\b_page_layouts_element
859
860\def\page_layouts_insert_elements
861  {\ifexporting
862     % forget about it
863   \orelse\ifcase\pageornamentstate
864     \page_layouts_place_elements_indeed % we could have a special flag for always ignored
865   \fi}
866
867\def\page_layouts_place_elements_indeed
868  {\setbox\b_page_layouts_element\vpack
869     {\dontcomplain
870      \calculatereducedvsizes
871      \page_layouts_swap_margins\v!text
872      \offinterlineskip
873      \vkern{-\topheight-\topdistance}%
874      \the\toptextcontent
875      \vkern{\topheight+\topdistance}%
876      \the\headertextcontent
877      \vkern{\headerheight+\headerdistance+\textdistance}%
878      \anch_positions_place_anchors
879      \vkern{-\textdistance-\textheight}%
880      \the\texttextcontent
881      \vkern\textheight
882      \expand\everyendoftextbody
883      \vkern\footerdistance
884      \the\footertextcontent
885      \vkern{\footerheight+\bottomdistance}%
886      \the\bottomtextcontent
887      \vkern\bottomheight
888      \vfilll}%
889  \smashbox\b_page_layouts_element
890  \box\b_page_layouts_element}
891
892% only for very special controlled cases or experiments:
893
894\newinteger    \c_page_scale_lines
895\newdimension  \d_page_box_stretch_delta
896\newdimension  \d_page_box_stretch_criterium
897\newconditional\c_page_box_check_stretch
898
899% The stretch setting can depend on the current lineheight and the
900% alignment can be set later. So we need to delay.
901
902\def\page_box_check_limit_stretch_indeed#1%
903  {\edef\p_limitstretch{\layoutparameter\c!limitstretch}%
904   \ifx\p_limitstretch\v!yes
905     \d_page_box_stretch_criterium\zeropoint
906     \c_page_box_check_stretch\conditionaltrue
907   \orelse\ifx\p_limitstretch\v!auto
908     % safeguard for depth without limit set
909     \ifnum\bottomraggednessmode=\plusthree
910       \d_page_box_stretch_criterium2\lineheight % 2 is hardcoded
911       \c_page_box_check_stretch\conditionaltrue
912     \else
913       \d_page_box_stretch_criterium\maxdimen
914       \c_page_box_check_stretch\conditionalfalse
915     \fi
916   \orelse\ifchkdimension\p_limitstretch\or
917     \d_page_box_stretch_criterium\p_limitstretch\relax
918     \c_page_box_check_stretch\conditionaltrue
919   \else
920     \d_page_box_stretch_criterium\maxdimen
921     \c_page_box_check_stretch\conditionalfalse
922   \fi
923   \ifconditional\c_page_box_check_stretch
924     \boxfixstretch\d_page_box_stretch_criterium#1\relax
925     \d_page_box_stretch_delta\boxstretchdelta
926   \fi}
927
928\let\page_box_check_limit_stretch\relax % we test for this
929
930\appendtoks
931    \edef\p_limitstretch{\layoutparameter\c!limitstretch}%
932    \ifx\p_limitstretch\v!yes
933      \let\page_box_check_limit_stretch\page_box_check_limit_stretch_indeed
934    \orelse\ifx\p_limitstretch\v!auto
935      \let\page_box_check_limit_stretch\page_box_check_limit_stretch_indeed
936    \orelse\ifchkdimension\p_limitstretch\or
937      \let\page_box_check_limit_stretch\page_box_check_limit_stretch_indeed
938    \else
939      \let\page_box_check_limit_stretch\relax % we test for this
940    \fi
941\to \everysetuplayout
942
943\def\page_layouts_check_stretch#1%
944  {\ifcase\bottomraggednessmode
945     \d_page_box_stretch_delta\zeropoint
946   \orelse\ifrelax\page_box_check_limit_stretch
947     \d_page_box_stretch_delta\zeropoint
948   \else
949     \page_box_check_limit_stretch{#1}%
950   \fi}
951
952\def\page_insert_body#1#2%
953  {\setbox\b_page_layouts_element\vpack
954     {\offinterlineskip
955      \calculatereducedvsizes
956      \calculatehsizes
957      \page_layouts_swap_margins\v!page
958      \vkern{\headerheight+\headerdistance+\textdistance}%
959      \dontleavehmode
960      \hpack to \makeupwidth
961        {\begingroup
962         % \page_layouts_swap_margins\v!page
963           \goleftonpage
964           \ifdim\leftedgewidth>\zeropoint
965             \the\leftedgetextcontent
966             \kern{\leftedgewidth+\leftedgedistance}%
967           \fi
968           \ifdim\leftmarginwidth>\zeropoint
969             \the\leftmargintextcontent
970             \kern{\leftmarginwidth+\leftmargindistance}%
971           \fi
972         \endgroup
973         \page_apply_postprocessors_page{#2}%
974         \settextpagecontent\b_page_layouts_element{#1}{#2}%
975         \page_backgrounds_add_to_text\b_page_layouts_element
976         \page_grids_add_to_box\b_page_layouts_element
977         \box\b_page_layouts_element
978         \begingroup
979           \ifdim\rightmarginwidth>\zeropoint
980             \kern\rightmargindistance
981             \the\rightmargintextcontent
982             \kern\rightmarginwidth
983           \fi
984           \ifdim\rightedgewidth>\zeropoint
985             \kern\rightedgedistance
986             \the\rightedgetextcontent
987             \kern\rightedgewidth
988           \fi
989         \endgroup
990         \hss}}%
991   \smashbox\b_page_layouts_element
992   \box\b_page_layouts_element}
993
994%D Long ago (relative to 2023), when Thanh and I were discussing the \PDFTEX\ hz
995%D features with Hermann Zapf, we side tracked to vertical alignment. Hermann then
996%D suggested to play with vertical scaling because \quotation {No user will notice
997%D it}. Some quick experiment at the moment showed that it could work indeed but we
998%D left it at that (the code stayed around). It is for that reason that this now
999%D present feature has the key \type {vz}, as variant on \type {hz} (a.k.a.\
1000%D expansion or fontadjust).
1001
1002\newconditional\c_page_scale_trace_vz
1003
1004\installtextracker
1005  {layout.vz}
1006  {\c_page_scale_trace_vz\conditionaltrue}
1007  {\c_page_scale_trace_vz\conditionalfalse}
1008
1009\installcorenamespace{vzdistance}
1010
1011\def\page_scale_text_box_trace
1012  {\writestatus{vz page \the\realpageno}{%
1013      %\s!goal=\the\pagegoal,
1014     %\s!total=\the\pagetotal,
1015       \s!page=\the\pagegoal,
1016       \s!text=\the\textheight,
1017     \s!height=\the\pagelastheight,
1018      \s!depth=\the\pagelastdepth,
1019    \s!stretch=\the\pagelaststretch,
1020     \s!shrink=\the\pagelastshrink,
1021       \s!fill=(\thewithoutunit\pagelastfilstretch,\thewithoutunit\pagelastfillstretch,\thewithoutunit\pagelastfilllstretch)%
1022   }}
1023
1024\def\page_scale_text_box_register_box#1%
1025  {\scratchheight\boxrepack#1%
1026   \scratchdimen{\textheight-\scratchheight}%
1027   \global\expandafter\dimensiondef\csname\??vzdistance\the\mofcolumns\endcsname
1028     \ifabsdim\scratchdimen>\c_page_scale_lines\lineheight
1029       \zeropoint
1030     \else
1031       \scratchheight
1032     \fi
1033   \relax
1034   \ifconditional\c_page_scale_trace_vz
1035     \page_scale_text_box_trace
1036   \fi}
1037
1038\def\page_scale_text_box_register_page
1039  {\scratchdimen{\textheight-\pagelastheight}% not \pagegoal as that includes footnotes
1040   \global\expandafter\dimensiondef\csname\??vzdistance\the\mofcolumns\endcsname
1041     \ifabsdim\scratchdimen>\c_page_scale_lines\lineheight
1042       \zeropoint
1043     \orelse\ifdim\pagelastshrink>\zeropoint % maybe also stretch
1044       \zeropoint
1045     \else
1046       \pagelastheight
1047     \fi
1048   \relax
1049   \ifconditional\c_page_scale_trace_vz
1050     \page_scale_text_box_trace
1051   \fi}
1052
1053\def\page_scale_text_box
1054  {\scratchdistance\ifcsname\??vzdistance\the\mofcolumns\endcsname\lastnamedcs\else\zeropoint\fi
1055   \ifzeropt\scratchdistance
1056     \expandafter\gobbleoneargument
1057   \else
1058     \expandafter\page_scale_text_box_indeed
1059   \fi}
1060
1061\def\page_scale_text_box_indeed#1%
1062  {\scratchdimen{\textheight-\scratchdistance}%
1063   \scratchheight\ht#1%
1064   \scratchdepth \dp#1%
1065   \scratchwidth \wd#1%
1066   \scratchfloat \floatexpr\textheight/\scratchdistance\relax
1067   %
1068   \f_anch_extra_y_scale\scratchfloat % first attempt
1069   %
1070   \setbox#1\vpack\bgroup
1071     \hpack\bgroup
1072       \normalexpanded{\scale
1073        %[\c!xscale=\plusthousand,\c!yscale=\scratchcounter]
1074         [\c!sx=1,\c!sy=\the\scratchfloat]%
1075         {\box#1}}%
1076     \egroup
1077     \ifconditional\c_page_scale_trace_vz
1078       \nointerlineskip
1079       \srule
1080         \s!height   \scratchdimen
1081         \s!yoffset 2\scratchdimen
1082         \s!xoffset-2\emwidth
1083         \s!width   2\emwidth
1084       \hpack
1085         \s!yoffset \scratchdimen
1086         \s!xoffset-2\emwidth
1087       \bgroup
1088         \edef\tempstring{\semiexpand\formatone{@0.3f}{\the\scratchfloat}}%
1089         \writestatus{vz page \the\realpageno}{scaling \tempstring\space applied}%
1090         \llap{\infofont\tempstring}%
1091       \egroup
1092     \fi
1093   \egroup
1094   \ht#1\scratchheight
1095   \dp#1\scratchdepth
1096   \wd#1\scratchwidth}
1097
1098\appendtoks
1099    \edef\p_lines{\layoutparameter\c!vz}%
1100    \ifx\p_lines\v!yes
1101        \c_page_scale_lines\plusone
1102    \orelse\ifchknumber\p_lines\or
1103        \c_page_scale_lines\lastchknumber
1104    \else
1105        \c_page_scale_lines\zerocount
1106    \fi
1107\to \everysetuplayout
1108
1109%D The main text area has to be combined with some additional (tracing) information.
1110%D
1111%D This will be stored as normal and overloaded in page-lyr and later in page-spr we
1112%D overload the the stored version .. eventually i will clear up the experimental
1113%D mess.
1114
1115\ifdefined\page_otr_flush_top_content\else \let\page_otr_flush_top_content\relax \fi
1116
1117\protected\def\settextpagecontent#1#2#3% #2 and #3 will disappear / is overloaded
1118  {\setbox#1\hpack to \makeupwidth
1119     {\hss                     % so don't change this
1120      \setlayoutcomponentattribute{\v!page:\v!text}%
1121      \vpack \layoutcomponentboxattribute to \textheight
1122        {\offinterlineskip
1123         \freezetextwidth
1124         \hsize\textwidth      % local variant of \sethsize  <<< in columns?
1125         \boxmaxdepth\maxdepth
1126         \page_otr_flush_top_content
1127         \noindent             % content can be < \hsize
1128         \page_otr_command_package_contents#2#3}% this will vbox
1129      \hss}%
1130   \dp#1\zeropoint}
1131
1132\protect \endinput
1133