1
2
3
4
5
6
7
8
9
10
11
12
13
14\writestatus{loading}{ConTeXt Table Macros Splitting}
15
16
17
18
19
20
21\unprotect
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56\installcorenamespace{floatsplitting}
57
58\installdirectcommandhandler \??floatsplitting {floatsplitting}
59
60\setupfloatsplitting
61 [\c!conversion=\v!character,
62 \c!lines=3,
63 \c!before=,
64 \c!inbetween=\page,
65 \c!after=]
66
67\newconditional\splitfloatfirstdone
68\newconditional\somenextsplitofffloat
69\newconditional\splitfloatdone
70\newconditional\onlyonesplitofffloat \onlyonesplitofffloat\conditionaltrue
71
72\newif \ifinsidesplitfloat
73\newcount\noffloatssplits
74\newtoks \everysplitfloatsetup
75
76\mutable\let\extrasplitfloatlines \!!zerocount
77\mutable\let\splitfloatfinalizer \relax
78
79\mutable\lettonothing\splitfloatcommand
80\mutable\lettonothing\floatcaptionsuffix
81
82\permanent\tolerant\protected\def\splitfloat[#S#1]#:#2
83 {\bgroup
84 \global\splitfloatdone\conditionalfalse
85 \aftergroup\page_split_float_check
86 \insidefloattrue
87 \insidesplitfloattrue
88 \setupcurrentfloatsplitting[#1]
89 \global\noffloatssplits\zerocount
90 \let\floatcaptionsuffix\page_split_float_suffix
91 \edef\extrasplitfloatlines{\floatsplittingparameter\c!lines}
92 \expand\everysplitfloatsetup
93 \def\splitfloatcommand{#2}
94 \global\onlyonesplitofffloat\conditionaltrue
95 \global\somenextsplitofffloat\conditionalfalse
96 \page_floats_push_saved
97 \floatsplittingparameter\c!before
98 \let\next}
99
100\protected\def\page_split_float_suffix
101 {\begingroup
102 \usefloatsplittingstyleandcolor\c!style\c!color
103 \convertnumber{\floatsplittingparameter\c!conversion}\noffloatssplits
104 \endgroup}
105
106\protected\def\page_split_float_check
107 {\ifconditional\splitfloatdone
108
109 \else
110 \blank
111 \begingroup
112 \tttf \dontleavehmode \getmessage\m!floatblocks{13}\empty
113 \endgroup
114 \blank
115 \showmessage\m!floatblocks{13}\empty
116 \fi
117 \splitfloatfinalizer}
118
119\def\page_split_float_process
120 {\ifinsidesplitfloat
121 \expandafter\page_split_float_process_yes
122 \else
123 \expandafter\page_split_float_process_nop
124 \fi}
125
126\def\page_split_float_process_yes
127 {\dowithnextboxcs\page_split_float_process_finish\vbox}
128
129\def\page_split_float_process_finish
130 {\forgetall
131 \dontcomplain
132 \global\splitfloatdone\conditionaltrue
133
134 \global\advanceby\noffloatssplits\plusone
135 \ifcase\noffloatssplits\relax \or
136 \ifconditional\onlyonesplitofffloat
137 \lettonothing\floatcaptionsuffix
138 \fi
139 \fi
140 \bgroup
141 \ifconditional\somenextsplitofffloat
142 \notesenabledfalse
143 \fi
144 \splitfloatcommand{\box\nextbox}
145 \egroup
146 \ifconditional\somenextsplitofffloat
147 \edef\p_inbetween{\floatsplittingparameter\c!inbetween}
148 \ifempty\p_inbetween
149 \ifconditional\splitfloatfirstdone\else\page\fi
150 \else
151 \p_inbetween
152 \fi
153 \else
154 \floatsplittingparameter\c!after
155 \page_floats_pop_saved
156 \page_floats_flush_saved
157 \fi
158 \global\splitfloatfirstdone\conditionaltrue}
159
160\def\page_split_float_process_nop
161 {\dowithnextboxcs\page_split_float_process_nop_finish\vbox}
162
163\def\page_split_float_process_nop_finish
164 {\forgetall
165 \dontcomplain
166 \box\nextbox
167 \global\splitfloatfirstdone\conditionaltrue}
168
169\def\page_split_float_check_content#1
170 {\ifinsidesplitfloat
171
172 \ifcase\ht#1\relax
173 \global\somenextsplitofffloat\conditionalfalse
174 \else
175 \global\somenextsplitofffloat\conditionaltrue
176 \global\onlyonesplitofffloat\conditionalfalse
177 \fi
178 \fi}
179
180\def\page_split_float_check_caption#1
181 {\edef\extrasplitfloatlines{\extrasplitfloatlines}
182 \ifx\extrasplitfloatlines\v!auto
183 \bgroup
184 \forcelocalfloats
185 \setuplocalfloats[\c!before=,\c!after=,\c!inbetween=]
186
187
188
189 \splitfloatcommand{\hbox to #1{\strut}}
190
191 \setbox\scratchbox\vbox{\flushlocalfloats}
192 \getnoflines{\ht\scratchbox}
193 \resetlocalfloats
194 \advanceby\noflines\minusone
195 \normalexpanded{\egroup\noexpand\edef\noexpand\extrasplitfloatlines{\the\noflines}}
196 \global\usesamefloatnumber\conditionaltrue
197 \orelse\ifchknum\extrasplitfloatlines\else
198 \def\extrasplitfloatlines{1}
199 \fi}
200
201\permanent\protected\def\doifnotinsidesplitfloat
202 {\ifinsidesplitfloat
203 \expandafter\gobbleoneargument
204 \fi}
205
206
207
208
209
210\newbox \b_split_content
211\newbox \b_split_result
212\newbox \b_split_head
213\newbox \b_split_next
214\newbox \b_split_tail
215
216\newtoks \t_split_before_result
217\newtoks \t_split_after_result
218\newtoks \t_split_before
219\newtoks \t_split_inbetween
220\newtoks \t_split_after
221\newtoks \t_split_section
222\newtoks \everyresettsplit
223
224\newinteger \c_split_minimum_free_lines
225
226\newdimension \d_split_minimum_free_space
227\newdimension \d_split_available_height
228\newdimension \d_split_inbetween_height
229
230\newconditional\c_tabl_split_done
231\newconditional\c_tabl_split_head
232\newconditional\c_tabl_split_full
233
234\newconditional\tabl_split_forced_page
235
236
237
238\appendtoks
239 \c_split_minimum_free_lines\zerocount
240 \d_split_minimum_free_space\zeropoint
241 \setbox\b_split_content \emptyvbox
242 \setbox\b_split_result \emptyvbox
243 \setbox\b_split_head \emptyvbox
244 \setbox\b_split_next \emptyvbox
245 \setbox\b_split_tail \emptyvbox
246 \t_split_before_result \emptytoks
247 \t_split_after_result \emptytoks
248 \t_split_inbetween \emptytoks
249 \t_split_before \emptytoks
250 \t_split_after \emptytoks
251 \t_split_section \emptytoks
252 \let\postprocesstsplit \donothing
253\to \everyresettsplit
254
255\mutable\let\postprocesstsplit\donothing
256
257\permanent\protected\def\resettsplit
258 {\expand\everyresettsplit}
259
260\resettsplit
261
262\mutable\def\tsplitdirectwidth{\hsize}
263
264\permanent\protected\def\handletsplit
265 {\page_split_float_check_caption{\wd\b_split_content}
266 \global\splitfloatfirstdone\conditionalfalse
267 \testpagesync
268 [\the\c_split_minimum_free_lines]
269 [\dimexpr\d_split_minimum_free_space\extrasplitfloatlines\lineheight\relax]
270 \setbox\scratchbox\vbox{\expand\t_split_inbetween}
271 \d_split_inbetween_height\htdp\scratchbox
272 \c_tabl_split_done\conditionalfalse
273 \localcontrolledrepeating
274 {\tabl_split_loop_body}
275 \global\usesamefloatnumber\conditionalfalse
276 \global\splitfloatfirstdone\conditionalfalse}
277
278\newbox\b_split_result_saved
279
280\def\tabl_split_loop_body
281 {\ifinsidecolumns
282
283 \global\splitfloatfirstdone\conditionalfalse
284 \d_split_available_height\textheight
285 \c_tabl_split_full\conditionaltrue
286 \else
287 \ifconditional\splitfloatfirstdone
288 \d_split_available_height\textheight
289 \c_tabl_split_full\conditionaltrue
290 \orelse\ifdim\pagegoal<\maxdimen
291 \d_split_available_height{\pagegoal\pagetotal}
292 \c_tabl_split_full\conditionalfalse
293 \else
294 \d_split_available_height\textheight
295 \c_tabl_split_full\conditionaltrue
296 \fi
297 \fi
298 \d_split_available_height {
299 \d_split_available_height
300 \d_split_inbetween_height
301 \d_split_minimum_free_space
302 \extrasplitfloatlines\lineheight
303 }
304 \ifdim\htdp\b_split_tail>\zeropoint
305 \advanceby\d_split_available_height\htdp\b_split_tail
306 \fi
307 \setbox\b_split_result\vbox
308 {\ifdim\ht\b_split_head>\zeropoint
309 \unvcopy\b_split_head
310 \expand\t_split_section
311 \expand\t_split_inbetween
312 \fi}
313 \ifconditional\c_tabl_split_done \else
314 \ifdim\ht\b_split_next>\zeropoint
315 \setbox\b_split_head\box\b_split_next
316 \fi
317 \fi
318 \c_tabl_split_done\conditionaltrue
319 \ifdim\ht\b_split_result>\zeropoint
320 \c_tabl_split_head\conditionaltrue
321 \else
322 \c_tabl_split_head\conditionalfalse
323 \fi
324 \splittopskip\zeroskip
325 \ifvoid\b_split_result_saved\else
326 \setbox\b_split_result\box\b_split_result_saved
327 \c_tabl_split_head\conditionaltrue
328 \global\tabl_split_forced_page\conditionalfalse
329 \fi
330
331 \localcontrolledrepeating
332 {\setbox\scratchbox\vsplit\b_split_content to \onepoint
333 \setbox\scratchbox\vbox
334 {\unvbox\scratchbox
335 \setbox\scratchbox\vbox
336 {\splitdiscards
337 \ifnum\lastpenalty>\plustenthousand\else
338
339 \global\tabl_split_forced_page\conditionaltrue
340 \fi}}
341 \ifconditional\tabl_split_forced_page
342 \global\tabl_split_forced_page\conditionalfalse
343 \setbox\b_split_result\vbox
344 {\unvbox\b_split_result
345 \expand\t_split_inbetween
346 \unvbox\scratchbox}
347 \quitloop
348 \orelse\ifdim{\d_split_available_height\htdp\scratchbox\htdp\b_split_result}>\zeropoint
349 \setbox\b_split_result\vbox
350 {\unvbox\b_split_result
351 \expand\t_split_inbetween
352 \unvbox\scratchbox}
353 \ifvoid\b_split_content
354 \quitloop
355 \fi
356 \orelse\ifconditional\c_tabl_split_head
357
358 \global\setbox\b_split_result_saved\vbox{\unvbox\b_split_result\unvbox\scratchbox}
359 \quitloop
360 \orelse\ifconditional\c_tabl_split_full
361
362
363 \setbox\b_split_result\vbox
364 {\unvbox\b_split_result
365 \expand\t_split_inbetween
366 \unvbox\scratchbox}
367 \quitloop
368 \else
369 \setbox\b_split_content\vbox
370 {\unvbox\scratchbox
371 \expand\t_split_inbetween
372 \ifvoid\b_split_content\else\unvbox\b_split_content\fi}
373 \quitloop
374 \fi
375 \c_tabl_split_head\conditionalfalse
376 \c_tabl_split_full\conditionalfalse}
377 \postprocesstsplit
378 \page_split_float_check_content\b_split_content
379 \ifvoid\b_split_content
380 \setbox\b_split_result\vbox
381 {\unvbox\b_split_result
382 \expand\t_split_inbetween
383 \unvcopy\b_split_tail}
384 \page_split_float_process{\expand\t_split_before_result\box\b_split_result\expand\t_split_after_result}
385 \doifnotinsidesplitfloat{\expand\t_split_after}
386 \endgraf
387 \quitloop
388 \else
389
390 \ifdim\pagegoal<\maxdimen
391 \pagegoal{\pagegoal\lineheight}
392 \fi
393
394 \ifdim\ht\b_split_result>\zeropoint
395 \setbox\b_split_result\vbox
396 {\unvbox\b_split_result
397 \expand\t_split_inbetween
398 \unvcopy\b_split_tail}
399 \page_split_float_process{\expand\t_split_before_result\box\b_split_result\expand\t_split_after_result}
400 \doifnotinsidesplitfloat{\expand\t_split_after}
401 \endgraf
402 \global\usesamefloatnumber\conditionaltrue
403 \fi
404 \ifinsidecolumns
405 \goodbreak
406 \else
407 \page
408 \fi
409 \fi}
410
411
412
413
414\aliased\let\resetdirecttsplit\resettsplit
415
416\mutable\let\tsplitdirectsplitter\relax
417
418\permanent\protected\def\handledirecttsplit
419 {\page_split_float_check_caption{\tsplitdirectwidth}
420 \global\splitfloatfirstdone\conditionalfalse
421 \testpagesync
422 [\the\c_split_minimum_free_lines]
423 [\dimexpr\d_split_minimum_free_space\extrasplitfloatlines\lineheight\relax]
424 \localcontrolledrepeating
425 {\tabl_split_direct_loop_body}
426 \global\usesamefloatnumber\conditionalfalse
427 \global\splitfloatfirstdone\conditionalfalse}
428
429\newconditional\splitfloatfixedheight
430
431\def\splitfloatheight{\textheight}
432
433\def\tabl_split_direct_loop_body
434 {\ifconditional\splitfloatfixedheight
435 \d_split_available_height\splitfloatheight
436 \orelse\ifinsidecolumns
437 \global\splitfloatfirstdone\conditionalfalse
438 \d_split_available_height\textheight
439 \orelse\ifconditional\splitfloatfirstdone
440 \d_split_available_height\textheight
441 \orelse\ifdim\pagegoal<\maxdimen
442 \d_split_available_height{\pagegoal\pagetotal}
443 \else
444 \d_split_available_height\textheight
445 \fi
446 \d_split_available_height{
447 \d_split_available_height
448 \d_split_minimum_free_space
449 \extrasplitfloatlines\lineheight
450 }
451 \tsplitdirectsplitter\d_split_available_height
452 \ifdim\ht\b_split_result>\zeropoint
453 \ifconditional\somenextsplitofffloat
454 \global\onlyonesplitofffloat\conditionalfalse
455 \fi
456 \ifconditional\splitfloatfixedheight
457
458 \orelse\ifdim\pagegoal<\maxdimen
459 \pagegoal{\pagegoal\lineheight}
460 \fi
461 \page_split_float_process{\expand\t_split_before_result\box\b_split_result\expand\t_split_after_result}
462 \global\usesamefloatnumber\conditionaltrue
463 \endgraf
464 \ifconditional\somenextsplitofffloat
465 \ifconditional\splitfloatfixedheight
466 \page
467 \orelse\ifinsidecolumns
468 \goodbreak
469 \else
470 \page
471 \fi
472 \fi
473 \global\splitfloatfirstdone\conditionaltrue
474 \orelse\ifconditional\somenextsplitofffloat
475 \ifconditional\splitfloatfixedheight
476 \page
477 \orelse\ifinsidecolumns
478 \goodbreak
479 \else
480 \page
481 \fi
482 \else
483 \quitloop
484 \fi}
485
486
487
488
489
490
491
492
493
494
495
496\permanent\def\handlesplittext#1
497 {\setbox\b_split_result\vbox
498 {\vsplit\b_split_content to {#1\lineheight}}}
499
500\permanent\protected\def\startsplittext
501 {\begingroup
502 \resettsplit
503 \c_split_minimum_free_lines\zerocount
504 \d_split_minimum_free_space\zeropoint
505 \let\extrasplitfloatlines \!!plusone
506 \let\tsplitdirectsplitter \handlesplittext
507 \setbox\b_split_content\vbox\bgroup
508 \insidefloattrue}
509
510\permanent\protected\def\stopsplittext
511 {\egroup
512 \handledirecttsplit
513 \endgroup}
514
515\protect \endinput
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609 |