1
2
3
4
5
6
7
8
9
10
11
12
13
14\writestatus{loading}{ConTeXt Page Macros Output Routines}
15
16
17
18
19
20
21
22\registerctxluafile{pageotr}{}
23
24\unprotect
25
26\let\triggerpagebuilder\clf_triggerpagebuilder
27
28\installcorenamespace{outputroutine}
29
30\installswitchcommandhandler \??outputroutine {outputroutine} \??outputroutine
31
32\newtoks\t_page_otr_commands
33\newtoks\t_page_otr_tracers
34
35\unexpanded\def\defineoutputroutinecommand[#name]
36 {\processcommalist[#name]\page_otr_commands_define}
37
38\unexpanded\def\page_otr_commands_define#name
39 {\ifcsname#name\endcsname \else
40 \expandafter\let\csname#name\endcsname\relax
41 \normalexpanded{\t_page_otr_commands{\the\t_page_otr_commands\noexpand\page_otr_commands_process{#name}}}
42 \fi}
43
44\let\page_otr_commands_process\gobbleoneargument
45
46\appendtoks
47 \let\page_otr_commands_process\page_otr_specifics_preset
48 \the\t_page_otr_commands
49 \let\page_otr_commands_process\gobbleoneargument
50\to \everyswitchoutputroutine
51
52\unexpanded\def\page_otr_specifics_preset#name
53 {\edef\page_otr_specifics_command{\directoutputroutineparameter{#name}}
54 \ifx\page_otr_specifics_command\empty
55 \writestatus{\currentoutputroutine}{ \expandafter\strippedcsname\csname#name\endcsname}
56 \expandafter\let\csname#name\endcsname\relax
57 \else
58 \writestatus{\currentoutputroutine}{ \expandafter\strippedcsname\csname#name\endcsname}
59 \expandafter\let\csname#name\expandafter\endcsname\page_otr_specifics_command
60 \fi}
61
62\unexpanded\def\page_otr_specifics_preset_normal#name
63 {\edef\page_otr_specifics_command{\directoutputroutineparameter{#name}}
64 \ifx\page_otr_specifics_command\empty
65 \expandafter\let\csname#name\endcsname\relax
66 \else
67 \expandafter\let\csname#name\expandafter\endcsname\page_otr_specifics_command
68 \fi}
69
70\unexpanded\def\page_otr_specifics_preset_traced#name
71 {\edef\page_otr_specifics_command{\directoutputroutineparameter{#name}}
72 \ifx\page_otr_specifics_command\empty
73 \writestatus{\currentoutputroutine}{preset: \expandafter\strippedcsname\csname#name\endcsname}
74 \expandafter\let\csname#name\endcsname\relax
75 \else
76 \writestatus{\currentoutputroutine}{preset: \expandafter\strippedcsname\csname#name\endcsname}
77 \expandafter\let\csname#name\expandafter\endcsname\page_otr_specifics_command
78 \fi}
79
80\let\page_otr_specifics_preset\page_otr_specifics_preset_normal
81
82\unexpanded\def\traceoutputroutines
83 {\the\t_page_otr_tracers}
84
85\appendtoks
86 \let\page_otr_specifics_preset\page_otr_specifics_preset_traced
87\to \t_page_otr_tracers
88
89
90
91
92
93
94\installcorenamespace{otrtriggers}
95
96\newconstant\c_page_otr_eject_penalty \c_page_otr_eject_penalty \plustenthousand
97\newconstant\c_page_otr_super_penalty \c_page_otr_super_penalty \plustwentythousand
98\newcount \c_page_otr_trigger_penalty \c_page_otr_trigger_penalty 100010
99
100\newif \ifinotr
101
102\unexpanded\def\page_otr_message_b{\page_otr_message_s}
103\unexpanded\def\page_otr_message_e{\page_otr_message_s}
104
105\unexpanded\def\page_otr_message_s#sign#what
106 {\writestatus
107 \currentoutputroutine
108 {#sign\space \space
109 #what\space \space
110 p:\the\outputpenalty,\space
111 r:\the\realpageno ,\space
112 c:\number\mofcolumns,\space
113 v:\the\vsize ,\space
114 g:\the\pagegoal ,\space
115 t:\the\pagetotal
116 \ifdim\pagetotal>\pagegoal
117 ,\space
118 d:\the\dimexpr\pagetotal\pagegoal\relax
119 \fi}}
120
121\unexpanded\def\page_otr_trigger#penalty
122 {\begingroup
123 \par
124 \penalty#penalty
125 \endgroup}
126
127\unexpanded\def\installoutputroutine#invoke#action
128 {\global\advance\c_page_otr_trigger_penalty\minusone
129 \edef#invoke{\page_otr_trigger{\number\c_page_otr_trigger_penalty}}
130 \setvalue{\??otrtriggers\number\c_page_otr_trigger_penalty}{#action}}
131
132\unexpanded\def\page_otr_triggered_output_routine_traced
133 {\ifcsname\??otrtriggers\the\outputpenalty\endcsname
134 \page_otr_message_b{special}
135 \csname\??otrtriggers\the\outputpenalty\endcsname
136 \page_otr_message_e{special}
137 \else
138 \page_otr_message_b{normal}
139 \page_otr_command_routine
140 \page_otr_message_e{normal}
141 \fi}
142
143\unexpanded\def\page_otr_triggered_output_routine_normal
144 {\ifcsname\??otrtriggers\the\outputpenalty\endcsname
145 \lastnamedcs
146 \else
147 \page_otr_command_routine
148 \fi}
149
150\let\page_otr_triggered_output_routine\page_otr_triggered_output_routine_normal
151
152\appendtoks
153 \let\page_otr_triggered_output_routine\page_otr_triggered_output_routine_traced
154\to \t_page_otr_tracers
155
156
157
158\ifdefined\everybeforeoutput \else \newtoks\everybeforeoutput \fi
159\ifdefined\everyafteroutput \else \newtoks\everyafteroutput \fi
160
161\def\page_otr_set_engine_output_routine#content
162 {\global\output
163 {\inotrtrue
164 \the\everybeforeoutput
165 #content\relax
166 \the\everyafteroutput}}
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188\page_otr_set_engine_output_routine\page_otr_triggered_output_routine
189
190\installoutputroutine\synchronizeoutput
191 {\ifvoid\normalpagebox\else
192 \unvbox\normalpagebox
193
194 \fi}
195
196\installoutputroutine\discardpage
197 {\setbox\scratchbox\box\normalpagebox}
198
199
200
201\def\page_otr_trigger_output_routine
202 {\par
203 \ifvmode
204 \penalty\c_page_otr_eject_penalty
205 \fi
206 \resetpagebreak}
207
208\def\page_otr_fill_and_eject_page
209 {\par
210 \ifvmode
211 \vfill
212 \penalty\c_page_otr_eject_penalty
213 \fi
214 \resetpagebreak}
215
216\def\page_otr_eject_page
217 {\par
218 \ifvmode
219 \ifdim\pagetotal>\pagegoal \else
220 \normalvfil
221 \fi
222 \penalty\c_page_otr_eject_penalty
223 \fi
224 \resetpagebreak}
225
226\def\page_otr_eject_page_and_flush_inserts
227 {\par
228 \ifvmode
229 \ifdim\pagetotal>\pagegoal \else
230 \normalvfil
231 \fi
232 \penalty\c_page_otr_super_penalty
233 \fi
234 \resetpagebreak}
235
236\def\page_otr_check_for_pending_inserts
237 {\ifnum\outputpenalty>\c_page_otr_super_penalty \else
238 \ifnum\insertpenalties>\zerocount
239
240 \page_otr_force_another_page
241 \fi
242 \fi}
243
244\def\page_otr_force_another_page
245 {
246 \hpack to \hsize{}
247 \kern\topskip
248 \nobreak
249 \vfill
250 \penalty\c_page_otr_super_penalty
251 \resetpagebreak}
252
253
254
255
256\unexpanded\def\bye
257 {\writestatus\m!system{Sorry, youre not done yet, so no goodbye!}}
258
259
260
261
262
263
264\definesystemconstant{pageotrcommandroutine}
265\definesystemconstant{pageotrcommandpackagecontents}
266\definesystemconstant{pageotrcommandsetvsize}
267\definesystemconstant{pageotrcommandsethsize}
268\definesystemconstant{pageotrcommandsynchronizehsize}
269\definesystemconstant{pageotrcommandnextpage}
270\definesystemconstant{pageotrcommandnextpageandinserts}
271\definesystemconstant{pageotrcommandsettopinsertions}
272\definesystemconstant{pageotrcommandsetbottominsertions}
273\definesystemconstant{pageotrcommandflushtopinsertions}
274\definesystemconstant{pageotrcommandflushbottominsertions}
275\definesystemconstant{pageotrcommandcheckiffloatfits}
276\definesystemconstant{pageotrcommandsetfloathsize}
277\definesystemconstant{pageotrcommandflushfloatbox}
278\definesystemconstant{pageotrcommandsidefloatoutput}
279\definesystemconstant{pageotrcommandsynchronizesidefloats}
280\definesystemconstant{pageotrcommandflushfloats}
281\definesystemconstant{pageotrcommandflushsidefloats}
282\definesystemconstant{pageotrcommandflushsavedfloats}
283\definesystemconstant{pageotrcommandflushallfloats}
284\definesystemconstant{pageotrcommandflushmarginblocks}
285\definesystemconstant{pageotrcommandtestcolumn}
286\definesystemconstant{pageotrcommandflushfacingfloats}
287
288\definesystemconstant{singlecolumn}
289\definesystemconstant{multicolumn}
290\definesystemconstant{columnset}
291\definesystemconstant{pagecolumn}
292
293\defineoutputroutinecommand
294 [\s!page_otr_command_routine,
295 \s!page_otr_command_package_contents,
296 \s!page_otr_command_set_vsize,
297 \s!page_otr_command_set_hsize,
298 \s!page_otr_command_synchronize_hsize,
299 \s!page_otr_command_next_page,
300 \s!page_otr_command_next_page_and_inserts,
301 \s!page_otr_command_set_top_insertions,
302 \s!page_otr_command_set_bottom_insertions,
303 \s!page_otr_command_flush_top_insertions,
304 \s!page_otr_command_flush_bottom_insertions,
305 \s!page_otr_command_check_if_float_fits,
306 \s!page_otr_command_set_float_hsize,
307 \s!page_otr_command_flush_float_box,
308 \s!page_otr_command_side_float_output,
309 \s!page_otr_command_synchronize_side_floats,
310 \s!page_otr_command_flush_floats,
311 \s!page_otr_command_flush_side_floats,
312 \s!page_otr_command_flush_saved_floats,
313 \s!page_otr_command_flush_all_floats,
314 \s!page_otr_command_flush_margin_blocks,
315 \s!page_otr_command_test_column,
316 \s!page_otr_command_flush_facing_floats]
317
318\appendtoks
319 \setupoutputroutine[\s!singlecolumn]
320\to \everydump
321
322\protect \endinput
323 |