1
2
3
4
5
6
7
8
9
10
11
12
13
14\writestatus{loading}{ConTeXt Page Macros Float Management}
15
16
17
18
19\registerctxluafile{pageflt}{}
20
21\unprotect
22
23\defineinsertion[\s!topfloat]
24\defineinsertion[\s!bottomfloat]
25\defineinsertion[\s!pagefloat]
26
27\newdimension\d_page_floats_inserted_bottom
28\newdimension\d_page_floats_inserted_top
29\newdimension\d_page_floats_inserted_page
30\newinteger \c_page_floats_n_of_top \c_page_floats_n_of_top \plustwo
31\newinteger \c_page_floats_n_of_bottom \c_page_floats_n_of_bottom\zerocount
32\newinteger \c_page_floats_n_of_page \c_page_floats_n_of_page \plustwo
33
34\newconstant\c_page_floats_insertions_topskip_mode
35
36\def\page_floats_report_total
37 {\showmessage\m!floatblocks4
38 {\the\totalnoffloats
39 \ifempty\floatlocationmethod
40 \ifempty\floatlocation\else,\floatlocation\fi
41 \else
42 ,\floatlocationmethod
43 \fi}}
44
45\def\page_floats_report_flushed
46 {\showmessage\m!floatblocks3
47 {\the\numexpr\totalnoffloats\savednoffloats\relax}}
48
49
50
51\newconditional\c_page_floats_room
52\newconditional\c_page_floats_some_waiting
53\newconditional\c_page_floats_not_permitted
54\newconditional\c_page_floats_flushing
55\newconditional\c_page_floats_center_box \c_page_floats_center_box\conditionaltrue
56\newconditional\c_page_floats_center_box_local
57\newconditional\c_page_floats_center_box_global
58\newconditional\c_page_floats_compress_flushed \c_page_floats_compress_flushed\conditionaltrue
59
60\newdimension \d_page_floats_compress_distance
61
62
63
64\newinteger \totalnoffloats
65\newinteger \savednoffloats
66\newinteger \nofcollectedfloats
67\newdimension\maxcollectedfloatstotal
68\newinteger \noffloatinserts
69
70\newbox \floattext
71
72\newdimension\floatwidth
73\newdimension\floatheight
74\newdimension\floatdepth
75\newdimension\floattextwidth
76\newdimension\floattextheight
77
78\newbox \floatbox
79\newbox \savedfloatbox
80
81
82
83
84
85
86\newtoks \everyfloatscheck
87
88\appendtoks
89 \ifcase\savednoffloats
90 \global\c_page_floats_some_waiting\conditionalfalse
91 \else
92 \global\c_page_floats_some_waiting\conditionaltrue
93 \fi
94\to \everyfloatscheck
95
96\protected\def\page_floats_flush#1#2
97 {\clf_flushfloat{#1}#2\relax
98 \expand\everyfloatscheck}
99
100\protected\def\page_floats_flush_by_label#1#2
101 {\clf_flushlabeledfloat{#1}{#2}\relax
102 \expand\everyfloatscheck}
103
104\protected\def\page_floats_save#1
105 {\clf_savefloat{#1}\relax
106 \expand\everyfloatscheck}
107
108\protected\def\page_floats_resave#1
109 {\clf_resavefloat{#1}\relax
110 \expand\everyfloatscheck}
111
112\protected\def\page_floats_push_saved
113 {\clf_pushfloat
114 \expand\everyfloatscheck}
115
116\protected\def\page_floats_pop_saved
117 {\clf_popfloat
118 \expand\everyfloatscheck}
119
120\protected\def\page_floats_get_info#1
121 {\clf_consultfloat{#1}}
122
123\protected\def\page_floats_if_else#1
124 {\clf_doifelsestackedfloats{#1}}
125
126\protected\def\page_floats_collect#1#2#3
127 {\clf_collectfloat{#1}{#2}{#3}}
128
129\permanent\def\nofstackedfloatsincategory#1
130 {\clf_nofstackedfloats{#1}}
131
132\let\page_floats_column_push_saved\page_floats_push_saved
133\let\page_floats_column_pop_saved \page_floats_pop_saved
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161\protected\def\page_floats_save_page_float#1#2
162 {\ifconditional\c_floats_append_to_stored
163 \scratchcounter\nofstackedfloatsincategory{#1}\relax
164 \ifcase\scratchcounter\else
165 \setbox\scratchboxtwo\box\floatbox
166 \clf_flushfloat{#1}\scratchcounter
167 \setbox\scratchboxone\box\floatbox
168 \setbox\scratchboxthree\vbox\bgroup
169 \blank[\rootfloatparameter\c!spaceafter ]
170 \blank[\rootfloatparameter\c!spacebefore]
171 \egroup
172 \scratchdimen\ifconditional\c_floats_force\maxdimen\else\textheight\fi
173 \ifdim{\htdp\scratchboxone\htdp\scratchboxtwo\htdp\scratchboxthree}>\scratchdimen
174 \setbox\floatbox\box\scratchboxone
175 \clf_savespecificfloat{#1}{specification{#2}}\relax
176 \setbox\floatbox\box\scratchboxtwo
177 \else
178 \setbox\floatbox\vbox\bgroup
179 \box \scratchboxone
180 \unvbox\scratchboxthree
181 \box \scratchboxtwo
182 \egroup
183 \fi
184 \fi
185 \fi
186 \clf_savespecificfloat{#1}{specification{#2}}\relax}
187
188\protected\def\page_floats_save_somewhere_float#1#2
189 {\clf_savespecificfloat{#1}{specification{#2}label{\floatlabel}}\relax}
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208\permanent\tolerant\protected\def\placenamedfloat[#1]#*[#2]
209 {\doloop
210 {\page_floats_flush_by_label\s!somewhere{#2}
211 \ifvoid\floatbox
212 \exitloop
213 \else
214 \cdef\currentfloat{#1}
215 \blank[\rootfloatparameter\c!spacebefore]
216 \box\floatbox
217 \blank[\rootfloatparameter\c!spaceafter]
218 \fi}}
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240\newbox\b_strc_float_saved
241
242\permanent\tolerant\protected\def\placesavedfloat[#1]#*[#2]#*[#S#3]
243 {\clf_flushlabeledfloat\s!somewhere{#2}\relax
244
245 \setbox\b_strc_float_saved\vpack{\box\floatbox}
246 \startplacefloat[#1][\c!location=\v!none,#3]
247 \box\b_strc_float_saved
248 \stopplacefloat}
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264\mutable\lettonothing\floatsetupcaption
265\mutable\lettonothing\floatsetupcontent
266\mutable\lettonothing\floatsetupwidth
267\mutable\lettonothing\floatsetupheight
268
269\aliased\let\placesetupfloat\gobbleoneoptional
270
271\permanent\tolerant\protected\def\placefloatwithsetups[#1]#*[#S#2]#*[#S#3]#:#4
272 {\def\floatsetupcaption{#4}
273 \def\floatsetupcontent{\copy\nextbox}
274 \def\floatsetupwidth {\wd\nextbox}
275 \def\floatsetupheight {\ht\nextbox}
276 \enforced\permanent\protected\def\placesetupfloat[##1]
277 {\placefloat[##1][#2][#3]{#4}{\floatsetupcontent}}
278 \dowithnextbox{\setups[#1]}\vbox}
279
280
281
282
283
284
285\def\page_floats_get_used_hsize{\hsize}
286
287\protected\def\page_floats_get
288 {\ifconditional\c_page_floats_some_waiting
289 \page_floats_flush\s!text\plusone
290 \ifconditional\c_page_floats_center_box
291 \ifdim\wd\globalscratchbox<\page_floats_get_used_hsize
292 \global\setbox\floatbox\hpack to \page_floats_get_used_hsize{\hss\box\floatbox\hss}
293 \orelse\ifinsidecolumns
294
295 \ifdim\wd\floatbox>\makeupwidth
296 \wd\floatbox\makeupwidth
297 \fi
298 \fi
299 \fi
300 \else
301 \global\savednoffloats\zerocount
302 \global\setbox\floatbox\emptybox
303 \fi}
304
305\protected\def\page_floats_flush_saved
306 {\doloop
307 {\ifconditional\c_page_floats_some_waiting
308 \page_otr_command_check_if_float_fits
309 \ifconditional\c_page_floats_room
310 \page_floats_get
311 \doplacefloatbox
312 \else
313 \exitloop
314 \fi
315 \else
316
317
318
319 \exitloop
320
321 \fi}}
322
323
324
325
326
327
328
329
330
331
332\permanent\protected\def\placefloatplaceholder
333 {\ifconditional\c_page_floats_room \else
334 \ifdim{\pagegoal\pagetotal3\lineheight}>\zeropoint
335 \startlinecorrection[blank]
336 \mhbox{\inframed{\labeltexts{placeholder}{\m_strc_floats_last_caption_tag}}}
337 \stoplinecorrection
338 \else
339 \allowbreak
340 \fi
341 \fi}
342
343\setuplabeltext
344 [placeholder={\Word{\lastplacedfloat}, moved}]
345
346
347
348\newtoks\everybeforeflushedpagefloat
349
350\let\m_page_otr_checked_page_float\relax
351
352\newconditional\c_page_floats_flushed
353
354\def\page_floats_flush_page_floats_inject#1
355 {\page_floats_flush{#1}\plusone
356 \edef\floatspecification{\clf_getfloatvariable{specification}}
357 \expand\everybeforeflushedpagefloat
358 \vpack to \textheight
359 {\ifinset\v!high\floatspecification\else\vfill\fi
360 \box\floatbox
361 \ifinset\v!low \floatspecification\else\vfill\fi}
362 \page_otr_fill_and_eject_page
363 \global\c_page_floats_flushed\conditionaltrue}
364
365\protected\def\page_floats_flush_page_floats
366 {\global\c_page_floats_flushed\conditionalfalse
367 \page_floats_flush_page_floats_indeed
368 \ifconditional\c_page_floats_flushed
369 \page_otr_fill_and_eject_page
370 \fi}
371
372\protected\def\page_floats_flush_page_floats_indeed
373 {\edef\m_page_otr_checked_page_float{\clf_checkedpagefloat}
374 \ifempty\m_page_otr_checked_page_float
375
376 \orelse\ifx\m_page_otr_checked_page_float\v!empty
377 \emptyhbox \page_otr_fill_and_eject_page
378 \expandafter\page_floats_flush_page_floats
379 \else
380 \page_floats_flush_page_floats_inject\m_page_otr_checked_page_float
381 \expandafter\page_floats_flush_page_floats
382 \fi}
383
384
385
386
387
388
389
390
391\appendtoks
392 \global\setbox\savedfloatbox\box\floatbox
393\to \everybeforeoutput
394
395\appendtoks
396 \global\setbox\floatbox\box\savedfloatbox
397\to \everyafteroutput
398
399\protect \endinput
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425 |