1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
28
29
30
31
32
33
34
35
36
37
38
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
51
52
53
54
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
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}
106 \cdef\currenttextstate {\namedlayoutelementparameter{#vertical}\c!state}
107
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
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
139
140
141
142
143
144
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
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
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
220
221
222\defcsname\??layouttextstrut\v!yes\endcsname{\setstrut\strut}
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}}
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
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
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
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
272
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
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
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
350
351
352
353
354
355
356
357
358
359
360\def\page_layouts_place_text_line_unknown#vertical#height
361 {\global\resyncaftertextline\conditionaltrue
362 \begingroup
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
374
375\permanent\protected\def\resetlayouttextlines
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
391
392\permanent\tolerant\protected\def\settextcontent[#S#vertical]#spacer[#S#horizontal]#spacer[#S#one]#spacer[#S#two]#spacer[#S#three]
393 {\ifarguments\or\or\or
394 \defcsname\namedlayoutelementhash{#vertical:#horizontal}\c!middletext\endcsname
395 {\page_layouts_process_element_double{#one}{#one}}
396 \or
397 \defcsname\namedlayoutelementhash{#vertical:#horizontal}\begincsname\??layouttextcontent\v!text:#one\endcsname\c!middletext\endcsname
398 {\page_layouts_process_element_double{#two}{#two}}
399 \or
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
407
408\permanent\tolerant\protected\def\resettextcontent[#S#vertical]#spacer[#S#horizontal]#spacer[#S#tag]
409 {\ifarguments\or\or
410 \cdef\currentlayoutelement{#vertical:#horizontal}
411 \resetlayoutelementparameter\c!lefttext
412 \resetlayoutelementparameter\c!middletext
413 \resetlayoutelementparameter\c!righttext
414 \or
415
416
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
425
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
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
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}
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
456\lettonothing\page_layouts_place_extra_text_right
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
529
530
531
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
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
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
670 {\hsize#width\relax
671 \layoutelementparameter\c!before
672 \setlayoutcomponentattribute\currentlayoutelement
673 \hbox \layoutcomponentboxattribute to #width{#content}
674 \layoutelementparameter\c!after}}
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694\appendtoks \placerightmarginblock \kern\rightmarginwidth \to \rightmargintextcontent
695\appendtoks \placeleftmarginblock \kern\leftmarginwidth \to \leftmargintextcontent
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
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}
720 \orelse\ifarguments\or\or\or\or
721 \defcsname\namedlayoutelementhash {#vertical}#tag\endcsname{\setuptexts[#vertical][#horizontal][#a]\relax}
722 \or
723 \defcsname\namedlayoutelementhash{#vertical:#horizontal}#tag\endcsname{\setuptexts[#vertical][#horizontal][#a][#b]\relax}
724 \or
725 \defcsname\namedlayoutelementhash {#vertical}#tag\endcsname{\setuptexts[#vertical][#horizontal][#a][#b][#c]\relax}
726 \or
727 \defcsname\namedlayoutelementhash{#vertical:#horizontal}#tag\endcsname{\setuptexts[#vertical][#horizontal][#a][#b][#c][#d]\relax}
728 \fi}
729
730
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
746
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
755
756
757
758
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
766 {\strc_pagenumbers_place_location}
767
768\def\page_layouts_reset_page_number_location
769 {\ifrelax\m_page_layouts_page_number_location_v\else
770
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
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
824 \orelse\ifx\p_strc_pagenumbers_location\v!none
825
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
833 {\begingroup
834 \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}
835 \ifzeropt\wd\scratchbox
836
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
845 {\begingroup
846 \setbox\scratchbox\hbox{\ignorespaces\layoutelementparameter\c!marginedgetext\removeunwantedspaces}
847 \ifzeropt\wd\scratchbox
848
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
857
858\newbox\b_page_layouts_element
859
860\def\page_layouts_insert_elements
861 {\ifexporting
862
863 \orelse\ifcase\pageornamentstate
864 \page_layouts_place_elements_indeed
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
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
900
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
909 \ifnum\bottomraggednessmode=\plusthree
910 \d_page_box_stretch_criterium2\lineheight
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
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
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
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
995
996
997
998
999
1000
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
1014
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}
1040 \global\expandafter\dimensiondef\csname\??vzdistance\the\mofcolumns\endcsname
1041 \ifabsdim\scratchdimen>\c_page_scale_lines\lineheight
1042 \zeropoint
1043 \orelse\ifdim\pagelastshrink>\zeropoint
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
1069
1070 \setbox#1\vpack\bgroup
1071 \hpack\bgroup
1072 \normalexpanded{\scale
1073
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!xoffset2\emwidth
1083 \s!width 2\emwidth
1084 \hpack
1085 \s!yoffset \scratchdimen
1086 \s!xoffset2\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
1110
1111
1112
1113
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
1118 {\setbox#1\hpack to \makeupwidth
1119 {\hss
1120 \setlayoutcomponentattribute{\v!page:\v!text}
1121 \vpack \layoutcomponentboxattribute to \textheight
1122 {\offinterlineskip
1123 \freezetextwidth
1124 \hsize\textwidth
1125 \boxmaxdepth\maxdepth
1126 \page_otr_flush_top_content
1127 \noindent
1128 \page_otr_command_package_contents#2#3}
1129 \hss}
1130 \dp#1\zeropoint}
1131
1132\protect \endinput
1133 |