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\dimexpr\pagegoal\pagetotal\relax
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 \dimexpr
299 \d_split_available_height
300 \d_split_inbetween_height
301 \d_split_minimum_free_space
302 \extrasplitfloatlines\lineheight
303 \relax
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 \localcontrolledrepeating
331 {\setbox\scratchbox\vsplit\b_split_content to \onepoint
332 \setbox\scratchbox\vbox
333 {\unvbox\scratchbox
334 \setbox\scratchbox\vbox
335 {\splitdiscards
336 \ifnum\lastpenalty>\plustenthousand\else
337
338 \global\tabl_split_forced_page\conditionaltrue
339 \fi}}
340 \ifconditional\tabl_split_forced_page
341 \global\tabl_split_forced_page\conditionalfalse
342 \setbox\b_split_result\vbox
343 {\unvbox\b_split_result
344 \expand\t_split_inbetween
345 \unvbox\scratchbox}
346 \quitloop
347 \orelse\ifdim\dimexpr\d_split_available_height\htdp\scratchbox\htdp\b_split_result\relax>\zeropoint
348 \setbox\b_split_result\vbox
349 {\unvbox\b_split_result
350 \expand\t_split_inbetween
351 \unvbox\scratchbox}
352 \ifvoid\b_split_content
353 \quitloop
354 \fi
355 \orelse\ifconditional\c_tabl_split_head
356
357 \global\setbox\b_split_result_saved\vbox{\unvbox\b_split_result\unvbox\scratchbox}
358 \quitloop
359 \orelse\ifconditional\c_tabl_split_full
360
361
362 \setbox\b_split_result\vbox
363 {\unvbox\b_split_result
364 \expand\t_split_inbetween
365 \unvbox\scratchbox}
366 \quitloop
367 \else
368 \setbox\b_split_content\vbox
369 {\unvbox\scratchbox
370 \expand\t_split_inbetween
371 \ifvoid\b_split_content\else\unvbox\b_split_content\fi}
372 \quitloop
373 \fi
374 \c_tabl_split_head\conditionalfalse
375 \c_tabl_split_full\conditionalfalse}
376 \postprocesstsplit
377 \page_split_float_check_content\b_split_content
378 \ifvoid\b_split_content
379 \setbox\b_split_result\vbox
380 {\unvbox\b_split_result
381 \expand\t_split_inbetween
382 \unvcopy\b_split_tail}
383 \page_split_float_process{\expand\t_split_before_result\box\b_split_result\expand\t_split_after_result}
384 \doifnotinsidesplitfloat{\expand\t_split_after}
385 \endgraf
386 \quitloop
387 \else
388
389 \ifdim\pagegoal<\maxdimen
390 \pagegoal\dimexpr\pagegoal\lineheight\relax
391 \fi
392
393 \ifdim\ht\b_split_result>\zeropoint
394 \setbox\b_split_result\vbox
395 {\unvbox\b_split_result
396 \expand\t_split_inbetween
397 \unvcopy\b_split_tail}
398 \page_split_float_process{\expand\t_split_before_result\box\b_split_result\expand\t_split_after_result}
399 \doifnotinsidesplitfloat{\expand\t_split_after}
400 \endgraf
401 \global\usesamefloatnumber\conditionaltrue
402 \fi
403 \ifinsidecolumns
404 \goodbreak
405 \else
406 \page
407 \fi
408 \fi}
409
410
411
412
413\aliased\let\resetdirecttsplit\resettsplit
414
415\mutable\let\tsplitdirectsplitter\relax
416
417\permanent\protected\def\handledirecttsplit
418 {\page_split_float_check_caption{\tsplitdirectwidth}
419 \global\splitfloatfirstdone\conditionalfalse
420 \testpagesync
421 [\the\c_split_minimum_free_lines]
422 [\dimexpr\d_split_minimum_free_space\extrasplitfloatlines\lineheight\relax]
423 \localcontrolledrepeating
424 {\tabl_split_direct_loop_body}
425 \global\usesamefloatnumber\conditionalfalse
426 \global\splitfloatfirstdone\conditionalfalse}
427
428\newconditional\splitfloatfixedheight
429
430\def\splitfloatheight{\textheight}
431
432\def\tabl_split_direct_loop_body
433 {\ifconditional\splitfloatfixedheight
434 \d_split_available_height\splitfloatheight
435 \orelse\ifinsidecolumns
436 \global\splitfloatfirstdone\conditionalfalse
437 \d_split_available_height\textheight
438 \orelse\ifconditional\splitfloatfirstdone
439 \d_split_available_height\textheight
440 \orelse\ifdim\pagegoal<\maxdimen
441 \d_split_available_height\dimexpr\pagegoal\pagetotal\relax
442 \else
443 \d_split_available_height\textheight
444 \fi
445 \d_split_available_height\dimexpr
446 \d_split_available_height
447 \d_split_minimum_free_space
448 \extrasplitfloatlines\lineheight
449 \relax
450 \tsplitdirectsplitter\d_split_available_height
451 \ifdim\ht\b_split_result>\zeropoint
452 \ifconditional\somenextsplitofffloat
453 \global\onlyonesplitofffloat\conditionalfalse
454 \fi
455 \ifconditional\splitfloatfixedheight
456
457 \orelse\ifdim\pagegoal<\maxdimen
458 \pagegoal\dimexpr\pagegoal\lineheight\relax
459 \fi
460 \page_split_float_process{\expand\t_split_before_result\box\b_split_result\expand\t_split_after_result}
461 \global\usesamefloatnumber\conditionaltrue
462 \endgraf
463 \ifconditional\somenextsplitofffloat
464 \ifconditional\splitfloatfixedheight
465 \page
466 \orelse\ifinsidecolumns
467 \goodbreak
468 \else
469 \page
470 \fi
471 \fi
472 \global\splitfloatfirstdone\conditionaltrue
473 \orelse\ifconditional\somenextsplitofffloat
474 \ifconditional\splitfloatfixedheight
475 \page
476 \orelse\ifinsidecolumns
477 \goodbreak
478 \else
479 \page
480 \fi
481 \else
482 \quitloop
483 \fi}
484
485
486
487
488
489
490
491
492
493
494
495\permanent\def\handlesplittext#1
496 {\setbox\b_split_result\vbox
497 {\vsplit\b_split_content to \dimexpr#1\lineheight\relax}}
498
499\permanent\protected\def\startsplittext
500 {\begingroup
501 \resettsplit
502 \c_split_minimum_free_lines\zerocount
503 \d_split_minimum_free_space\zeropoint
504 \let\extrasplitfloatlines \!!plusone
505 \let\tsplitdirectsplitter \handlesplittext
506 \setbox\b_split_content\vbox\bgroup
507 \insidefloattrue}
508
509\permanent\protected\def\stopsplittext
510 {\egroup
511 \handledirecttsplit
512 \endgroup}
513
514\protect \endinput
515
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 |