1
2
3
4
5
6
7
8
9
10
11
12
13
14\writestatus{loading}{ConTeXt Page Macros Side Floats}
15
16\unprotect
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35\newdimension \d_page_sides_margin
36\newdimension \d_page_sides_height
37\newdimension \d_page_sides_width
38\newdimension \d_page_sides_hsize
39\newdimension \d_page_sides_vsize
40\newdimension \d_page_sides_vsize_reset
41\newdimension \d_page_sides_progress
42\newdimension \d_page_sides_page_total
43\newdimension \d_page_sides_shape_down_shift
44
45\newdimension \d_page_sides_leftoffset
46\newdimension \d_page_sides_rightoffset
47
48
49\newbox \b_page_sides_spill_over
50
51\newinteger \c_page_sides_lines_done
52\newinteger \c_page_sides_checks_done
53\newinteger \c_page_sides_n_of_lines
54\newinteger \c_page_sides_n_of_hang
55\newconstant \c_page_sides_float_type
56\newinteger \c_page_sides_hangafter
57
58\newconditional \c_page_sides_short
59\newconditional \c_page_sides_flag
60\newconditional \c_page_sides_shape_down
61\newconditional \c_page_sides_keep_together
62\newconditional \c_page_sides_force_shape
63
64\newdimension \d_page_sides_shift
65\newdimension \d_page_sides_extrashift
66\newdimension \d_page_sides_leftshift
67\newdimension \d_page_sides_rightshift
68\newdimension \d_page_sides_leftskip
69\newdimension \d_page_sides_rightskip
70\newdimension \d_page_sides_maximum
71\newdimension \d_page_sides_topskip
72\newdimension \d_page_sides_bottomskip
73\newdimension \d_page_sides_midskip
74\newdimension \d_page_sides_downshift
75\newdimension \d_page_sides_pagetotal
76\newdimension \d_page_sides_topoffset
77\newdimension \d_page_sides_bottomoffset
78\newdimension \d_page_sides_toptotal
79\newdimension \d_page_sides_bottomtotal
80
81\newconstant \c_page_sides_align
82\newconstant \c_page_sides_skipmode
83\newconstant \c_page_sides_tolerance
84
85\newconstant \c_page_sides_method
86
87\newdimension \d_page_sides_progression
88
89\newinteger \c_page_sides_m_of_lines
90\newconditional \c_page_sides_delayed
91
92
93
94\newif \iftracesidefloats
95
96
97
98\d_page_sides_vsize_reset \onepoint
99
100
101
102
103\def\page_sides_floats_legend
104 {\showmessage\m!floatblocks{16}\empty
105 \glet\page_sides_floats_legend\relax}
106
107\installtextracker{floats.anchoring}
108 {\page_sides_floats_legend
109 \tracesidefloatstrue}
110 {\tracesidefloatsfalse}
111
112
113
114
115
116\def\page_sides_process_float_backspace {\global\c_page_sides_float_type\plusone \page_sides_handle_float}
117\def\page_sides_process_float_leftedge {\global\c_page_sides_float_type\plustwo \page_sides_handle_float}
118\def\page_sides_process_float_leftmargin {\global\c_page_sides_float_type\plusthree\page_sides_handle_float}
119\def\page_sides_process_float_left {\global\c_page_sides_float_type\plusfour \page_sides_handle_float}
120\def\page_sides_process_float_right {\global\c_page_sides_float_type\plusfive \page_sides_handle_float}
121\def\page_sides_process_float_rightmargin{\global\c_page_sides_float_type\plussix \page_sides_handle_float}
122\def\page_sides_process_float_rightedge {\global\c_page_sides_float_type\plusseven\page_sides_handle_float}
123\def\page_sides_process_float_cutspace {\global\c_page_sides_float_type\pluseight\page_sides_handle_float}
124\def\page_sides_process_float_margin {\global\c_page_sides_float_type\pluseight\page_sides_handle_float}
125
126\def\page_sides_check_horizontal_skips
127 {\ifcase\c_page_sides_skipmode
128 \or
129 \or
130 \or
131 \global\d_page_sides_margin\zeropoint
132 \fi}
133
134\def\page_sides_apply_horizontal_shift
135 {\ifdim\d_page_sides_maximum>\zeropoint
136 \ifcase\c_page_sides_float_type
137
138 \or
139
140 \or
141 \global\d_page_sides_shift{
142 \d_page_sides_maximum
143 \rightorleftpageaction \leftedgedistance \rightedgedistance
144 \rightorleftpageaction \leftmarginwidth \rightmarginwidth
145 \rightorleftpageaction \leftmargindistance \rightmargindistance
146 \compensatedinnermakeupmargin
147 }
148 \or
149 \global\d_page_sides_shift{
150 \d_page_sides_maximum
151 \rightorleftpageaction \leftmargindistance \rightmargindistance
152 \compensatedinnermakeupmargin
153 }
154 \or
155
156 \or
157
158 \or
159 \global\d_page_sides_shift{
160 \d_page_sides_maximum
161 \rightorleftpageaction \leftmargindistance \rightmargindistance
162 \compensatedinnermakeupmargin
163 }
164 \or
165 \global\d_page_sides_shift{
166 \d_page_sides_maximum
167 \rightorleftpageaction \leftedgedistance \rightedgedistance
168 \rightorleftpageaction \leftmarginwidth \rightmarginwidth
169 \rightorleftpageaction \leftmargindistance \rightmargindistance
170 \compensatedinnermakeupmargin
171 }
172 \or
173
174 \fi
175 \fi
176 \ifzeropt\d_page_sides_shift
177 \ifnum\c_page_sides_float_type=\plusfour
178 \global\advanceby\d_page_sides_shift\d_page_sides_extrashift
179 \global\d_page_sides_extrashift\zeropoint
180 \orelse\ifnum\c_page_sides_float_type=\plusfive
181 \global\advanceby\d_page_sides_shift\d_page_sides_extrashift
182 \global\d_page_sides_extrashift\zeropoint
183 \fi
184 \else
185 \ifnum\c_page_sides_float_type<\plusfour
186 \global\c_page_sides_float_type\plusfour
187 \orelse\ifnum\c_page_sides_float_type>\plusfive
188 \global\c_page_sides_float_type\plusfive
189 \fi
190 \fi}
191
192\def\page_sides_set_skips
193 {\global\d_page_sides_rightskip\zeropoint
194 \global\d_page_sides_leftskip \zeropoint
195 \ifcase\c_page_sides_float_type
196 \or
197 \global\d_page_sides_leftskip{
198 \rightorleftpageaction \backspace \cutspace
199 \compensatedinnermakeupmargin
200 }
201 \or
202 \global\d_page_sides_leftskip{
203 \rightorleftpageaction \leftmargindistance \rightmargindistance
204 \rightorleftpageaction \leftmarginwidth \rightmarginwidth
205 \rightorleftpageaction \leftedgedistance \rightedgedistance
206 \compensatedinnermakeupmargin
207 }
208 \or
209 \global\d_page_sides_leftskip{
210 \rightorleftpageaction \leftmargindistance \rightmargindistance
211 \compensatedinnermakeupmargin
212 }
213 \or
214 \or
215 \or
216 \global\d_page_sides_rightskip{
217 \rightorleftpageaction \rightmargindistance \leftmargindistance
218 \compensatedinnermakeupmargin
219 }
220 \or
221 \global\d_page_sides_rightskip{
222 \rightorleftpageaction \rightmargindistance \leftmargindistance
223 \rightorleftpageaction \rightmarginwidth \leftmarginwidth
224 \rightorleftpageaction \rightedgedistance \leftedgedistance
225 \compensatedinnermakeupmargin
226 }
227 \or
228 \global\d_page_sides_rightskip{
229 \rightorleftpageaction \cutspace \backspace
230 \compensatedinnermakeupmargin
231 }
232 \fi
233 \global\d_page_sides_leftoffset \d_page_sides_rightskip
234 \global\d_page_sides_rightoffset\d_page_sides_leftskip
235 \ifdim\d_page_sides_rightskip>\zeropoint
236 \global\advanceby\d_page_sides_rightskip\rightskip
237 \fi
238 \ifdim\d_page_sides_leftskip >\zeropoint
239 \global\advanceby\d_page_sides_leftskip \leftskip
240 \fi}
241
242
243
244\def\page_sides_relocate_float#1
245 {\global\setbox\floatbox\hpack
246 {\ifnum\c_page_sides_float_type=\plusfour
247 \kern\d_page_sides_leftshift
248 \orelse\ifnum\c_page_sides_float_type=\plusone
249 \kern\d_page_sides_leftshift
250 \fi
251 \ifnum\c_page_sides_float_type>\plusfour
252 \kern\d_page_sides_extrashift
253 \else
254 \kern\d_page_sides_shift
255 \fi
256 \vbox{#1\ifnum\c_page_sides_align=\plusfour \removedepth \fi}
257 \ifnum\c_page_sides_float_type>\plusfour
258 \kern\d_page_sides_shift
259 \else
260 \kern\d_page_sides_extrashift
261 \fi
262 \ifnum\c_page_sides_float_type=\pluseight
263 \kern\d_page_sides_rightshift
264 \orelse\ifnum\c_page_sides_float_type=\plusfive
265 \kern\d_page_sides_rightshift
266 \fi}}
267
268
269
270
271\def\page_sides_check_vertical_skips
272 {\ifdim\d_page_sides_topskip <\zeropoint\d_page_sides_topskip \zeropoint\fi
273 \ifdim\d_page_sides_bottomskip<\zeropoint\d_page_sides_bottomskip\zeropoint\fi
274 \ifdim\d_page_sides_midskip <\zeropoint\d_page_sides_midskip \zeropoint\fi
275
276 \global\d_page_sides_toptotal {\d_page_sides_topskip \d_page_sides_topoffset }
277 \global\d_page_sides_bottomtotal{\d_page_sides_bottomskip\d_page_sides_bottomoffset}
278 \ifcase\c_page_sides_skipmode
279 \or
280 \global\d_page_sides_toptotal \d_page_sides_topoffset
281 \or
282 \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset
283 \or
284 \global\d_page_sides_toptotal \d_page_sides_topoffset
285 \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset
286 \fi}
287
288
289
290\def\page_sides_apply_vertical_shift_normal
291 {\global\setbox\floatbox\hpack
292 {\vpack
293 {\forgetall
294 \hsize\wd\floatbox
295 \vskip\privatescratchdimen
296 \offinterlineskip
297 \box\floatbox
298
299
300 \setbox\scratchbox\emptyhbox
301 \wd\scratchbox\hsize
302 \ht\scratchbox\d_page_sides_bottomtotal
303 \box\scratchbox
304 \vskip\d_page_sides_bottomtotal
305 \ifnum\c_page_sides_align=\plusfive
306 \vskip\lineheight
307 \fi}}}
308
309\def\page_sides_apply_vertical_shift_traced
310 {\global\setbox\floatbox\hpack
311 {\backgroundline[trace:r]{\ruledhpack{\vpack
312 {\forgetall
313 \hsize\wd\floatbox
314 \vskip\privatescratchdimen
315 \offinterlineskip
316 \backgroundline
317 [trace:g]
318 {\ruledhpack{\box\floatbox}}
319 \par
320 \blackrule
321 [\c!color=trace:s,
322 \c!height=\d_page_sides_bottomtotal,
323 \c!depth=\zeropoint,
324 \c!width=\hsize]
325 \vskip\d_page_sides_bottomtotal
326 \ifnum\c_page_sides_align=\plusfive
327 \vskip\lineheight
328 \fi}}}}}
329
330\def\page_sides_apply_vertical_shift
331 {\ifnum\c_page_sides_align=\plusfour
332 \getnoflines{\ht\floatbox}
333 \privatescratchdimen{\noflines\lineheight\strutdp}
334 \getrawnoflines\d_page_sides_toptotal
335 \advanceby\privatescratchdimen\noflines\lineheight
336 \page_sides_force_depth
337 \ht\floatbox\privatescratchdimen
338 \dp\floatbox\zeropoint
339 \else
340 \fi
341 \ifcase\c_page_sides_align \else
342 \global\d_page_sides_toptotal\zeropoint
343 \fi
344 \privatescratchdimen
345 \ifnum\c_page_sides_float_type<\plusfour
346 \d_page_sides_toptotal
347 \orelse\ifnum\c_page_sides_float_type>\plusfive
348 \d_page_sides_toptotal
349 \else
350 \zeropoint
351 \fi
352
353 \ifcase\c_page_sides_align
354
355 \advanceby\privatescratchdimen\strutdp
356 \or
357 \advanceby\privatescratchdimen\strutdp
358 \or
359 \or
360 \advanceby\privatescratchdimen\lineheight
361 \advanceby\privatescratchdimen\strutdp
362 \or
363 \privatescratchdimen\zeropoint
364 \or
365 \advanceby\privatescratchdimen\strutht
366 \fi
367
368 \global\c_page_sides_lines_done\zerocount
369 \ifconditional\c_page_sides_shape_down
370 \global\d_page_sides_shape_down_shift{
371 \privatescratchdimen
372 \htdp\floatbox
373 }
374 \advanceby\privatescratchdimen\c_page_sides_n_of_lines\lineheight
375\advanceby\privatescratchdimen2\lineheight
376 \else
377 \global\d_page_sides_shape_down_shift\zeropoint
378 \advanceby\privatescratchdimen\c_page_sides_n_of_lines\lineheight
379 \fi
380 \iftracesidefloats
381 \page_sides_apply_vertical_shift_traced
382 \else
383 \page_sides_apply_vertical_shift_normal
384 \fi
385 \ifnum\c_page_sides_float_type<\plusfour
386 \global\d_page_sides_toptotal\zeropoint
387 \orelse\ifnum\c_page_sides_float_type>\plusfive
388 \global\d_page_sides_toptotal\zeropoint
389 \fi
390 \global\d_page_sides_downshift\zeropoint}
391
392
393
394
395
396\permanent\def\d_page_sides_flush_criterium
397 {\dimexpr
398 \d_page_sides_vsize
399 \d_page_sides_bottomtotal
400 \pagetotal
401 \relax}
402
403\permanent\def\d_page_sides_room_criterium
404 {\dimexpr
405 \d_page_sides_vsize
406 \d_page_sides_bottomtotal
407 \pagetotal
408 \relax}
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441\protected\def\page_sides_force_depth
442 {\iftracesidefloats
443 \enabletrackers[otr.forcestrutdepth]
444 \fi
445
446
447
448
449 \forcestrutdepth
450
451 \iffalse
452 \penalty\zerocount
453 \else
454
455 \pageboundary\plustenthousand
456
457 \fi
458 \page_otr_command_set_vsize}
459
460\def\page_sides_flush_floats
461 {\ifconditional\c_page_sides_shape_down\else
462 \par
463 \fi
464 \ifdim\d_page_sides_flush_criterium>\zeropoint
465 \page_sides_flush_floats_progress
466 \page_sides_flush_floats_after_next
467 \fi
468 \page_sides_flush_floats_reset}
469
470\def\page_sides_flush_floats_text
471 {\par
472
473 \ifdim\d_page_sides_flush_criterium>\zeropoint
474 \page_sides_flush_floats_progress
475 \page_sides_flush_floats_after_none
476 \fi
477 \page_sides_flush_floats_reset}
478
479\def\page_sides_flush_floats_reset
480 {\global\d_page_sides_vsize\d_page_sides_vsize_reset
481
482 \global\c_page_sides_short\conditionalfalse
483 \global\c_page_sides_flag\conditionalfalse
484 \global\c_page_sides_checks_done\zerocount}
485
486\def\page_sides_flush_floats_after_none
487 {\ifdim\d_page_sides_midskip>\zeropoint
488 \blank[\the\d_page_sides_midskip]
489 \fi
490 \ignoreparskip
491 \blank[\v!disable]}
492
493\def\page_sides_flush_floats_after_next
494 {\ifdim\d_page_sides_bottomskip>\zeropoint
495 \blank[\the\d_page_sides_bottomskip]
496 \fi
497 \ignoreparskip
498 \blank[\v!disable]}
499
500
501
502\permanent\protected\def\doifelsesidefloat
503 {\par
504 \ifdim\d_page_sides_room_criterium>\zeropoint
505 \expandafter\firstoftwoarguments
506 \else
507 \expandafter\secondoftwoarguments
508 \fi}
509
510\aliased\let\doifsidefloatelse\doifelsesidefloat
511
512
513
514
515
516\installcorenamespace{sidefloatsteps}
517
518\defcsname\??sidefloatsteps\v!line \endcsname{\strut}
519\defcsname\??sidefloatsteps\v!big \endcsname{\strut}
520\defcsname\??sidefloatsteps\v!medium\endcsname{\halflinestrut}
521\defcsname\??sidefloatsteps\v!small \endcsname{\noheightstrut}
522
523\def\page_sides_flush_floats_tracer
524 {\dontleavehmode
525 \ruledhpack\bgroup\backgroundline[trace:b]{
526 \llap{\smash{\vrule\s!width4\points\s!height.4\points\s!depth.4\points}}
527 \ifnum\recurselevel=\plusone
528 \llap{\smash{\smallinfofont\the\scratchdimen}\hskip.5\leftmargindistance}
529 \orelse\ifodd\recurselevel
530 \llap{\smash{\smallinfofont\recurselevel}\hskip.5\leftmargindistance}
531 \fi
532 \page_sides_flush_floats_normal
533 \kern\hsize
534 \egroup}}
535
536\def\page_sides_flush_floats_normal
537 {\ifdim\scratchdimen>\struthtdp
538 \strut
539 \else
540 \m_pages_strut
541 \fi}
542
543\def\page_sides_flush_floats_progress
544 {\begingroup
545 \page_sides_force_depth
546 \parskip\zeroskip
547 \let\page_sides_flush_floats\relax
548 \edef\m_pages_strut
549 {\ifcsname\??sidefloatsteps\rootfloatparameter\c!step\endcsname
550 \lastnamedcs
551 \else
552 \noheightstrut
553 \fi}
554 \forgetall
555 \offinterlineskip
556 \localcontrolledrepeating
557 {\scratchdimen\d_page_sides_flush_criterium
558 \ifdim\scratchdimen>\onepoint
559 \ifnum\currentloopiterator>\plushundred
560 \quitloop
561 \orelse\iftracesidefloats
562 \page_sides_flush_floats_tracer\par
563 \else
564 \page_sides_flush_floats_normal\par
565 \fi
566 \else
567 \page_sides_force_depth
568 \quitloop
569 \fi}
570 \endgroup}
571
572
573
574
575
576
577\def\page_sides_inject_before
578 {\page_sides_force_depth
579 \ifdim\parskip>\zeropoint
580 \ifdim\parskip>\d_strc_floats_top
581 \ifdim\d_strc_floats_top>\zeropoint
582 \ignoreparskip
583 \blank[\v!white]
584 \else
585 \checkedblank[\rootfloatparameter\c!spacebeforeside]
586 \fi
587 \else
588 \checkedblank[\rootfloatparameter\c!spacebeforeside]
589 \fi
590 \else
591 \checkedblank[\rootfloatparameter\c!spacebeforeside]
592 \fi}
593
594
595
596
597
598\def\page_sides_inject_dummy_line_normal
599 {\hpack to \availablehsize{\strut\hss}}
600
601\def\page_sides_inject_dummy_line_traced
602 {\ruledhpack to \availablehsize{\backgroundline[trace:c]{\page_sides_inject_dummy_line_normal}}}
603
604\def\page_sides_inject_dummy_lines
605 {\par
606 \nointerlineskip
607
608
609
610 \dontleavehmode
611 \iftracesidefloats
612 \page_sides_inject_dummy_line_traced
613 \else
614 \page_sides_inject_dummy_line_normal
615 \fi
616 \par
617
618 \ignoreparskip
619
620 \kern{\lineheight\strutdp}
621
622 \ignoreparskip
623 \blank[\v!samepage]
624 \blank[\v!disable]
625
626 \ifdim\pagetotal<\zeropoint
627
628
629 \fi}
630
631
632
633\def\page_sides_check_floats_after_par
634 {\page_sides_check_floats_indeed
635 \ifdim\d_page_sides_pagetotal=\pagetotal \else
636 \glet\page_sides_check_floats\page_sides_check_floats_indeed
637 \page_sides_flush_floats
638 \global\c_page_sides_n_of_lines\zerocount
639 \fi}
640
641\protected\def\page_sides_flush_floats_after_par
642 {\global\d_page_sides_pagetotal\pagetotal
643 \glet\page_sides_check_floats\page_sides_check_floats_after_par}
644
645\protected\def\page_sides_forget_floats
646 {\global\d_page_sides_vsize\d_page_sides_vsize_reset
647 \global\c_page_sides_n_of_lines\zerocount
648
649 \global\c_page_sides_short\conditionalfalse
650 \global\c_page_sides_flag\conditionalfalse}
651
652
653
654
655
656
657\def\page_sides_output_routine
658 {\page_otr_command_side_float_output
659 \ifconditional\c_page_sides_short
660 \global\c_page_sides_short\conditionalfalse
661 \else
662 \global\d_page_sides_vsize\d_page_sides_vsize_reset
663 \global\c_page_sides_n_of_lines\zerocount
664 \fi}
665
666\def\page_sides_place_float
667 {\ifnum\c_page_sides_float_type=\plusfour \kern\d_page_sides_toptotal \fi
668 \ifnum\c_page_sides_float_type=\plusfive \kern\d_page_sides_toptotal \fi
669 \ifconditional\c_page_sides_shape_down
670 \page_sides_place_float_normal
671 \else
672 \ifgridsnapping
673 \page_sides_place_float_grid
674 \else
675 \page_sides_place_float_normal
676 \fi
677 \par
678 \kern\d_page_sides_height
679 \penalty10001
680 \normalbaselines
681 \fi}
682
683\def\page_sides_place_float_normal
684 {\page_sides_push_float_inline\firstofoneargument}
685
686
687
688
689\def\page_sides_place_snap_to_grid#1
690 {\edef\p_grid{\floatparameter\c!grid}
691 \ifempty\p_grid\else
692 \snaptogrid[\p_grid]
693 \fi
694 \hpack{#1}}
695
696\def\page_sides_place_float_grid
697 {\getrawnoflines\d_page_sides_height
698 \d_page_sides_height\noflines\lineheight
699 \page_sides_push_float_inline\page_sides_place_snap_to_grid}
700
701\let\strc_floats_mark_par_as_free\relax
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734\def\page_sides_push_float_inline_indeed#1
735 {\ifcase\c_page_sides_float_type
736
737 \or
738 \noindent#1{\llap{\rlap{\box\floatbox}\kern\d_page_sides_leftskip}}\hfill
739 \or
740 \noindent#1{\llap{\box\floatbox\kern\d_page_sides_leftskip}}\hfill
741 \or
742 \noindent#1{\llap{\box\floatbox\kern\d_page_sides_leftskip}}\hfill
743 \or
744 \noindent#1{\box\floatbox}\hfill
745 \or
746 \hfill#1{\box\floatbox}
747 \or
748 \hfill#1{\rlap{\kern\d_page_sides_rightskip\box\floatbox}}
749 \or
750 \hfill#1{\rlap{\kern\d_page_sides_rightskip\box\floatbox}}
751 \or
752 \hfill#1{\rlap{\kern\d_page_sides_rightskip\llap{\box\floatbox}}}
753 \fi}
754
755\def\page_sides_push_float_inline#1
756 {\ifconditional\c_page_sides_shape_down
757 \page_sides_set_skips
758 \page_floats_report_total
759 \global\setbox\floatbox\hbox to \hsize\bgroup
760 \page_sides_push_float_inline_indeed#1
761 \egroup
762 \else
763 \begingroup
764 \reseteverypar
765 \parskip\zeroskip
766 \nointerlineskip
767 \page_sides_set_skips
768 \page_floats_report_total
769 \relax
770
771 \strc_floats_mark_par_as_free
772 \page_sides_push_float_inline_indeed#1
773 \endgroup
774 \fi}
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799\def\page_sides_analyse_progress
800 {
801 \d_page_sides_progress\d_page_sides_vsize
802 \ifconditional\c_page_sides_flag
803 \advanceby\d_page_sides_progress\d_page_sides_page_total
804 \global\c_page_sides_flag\conditionalfalse
805 \else
806 \ifdim{\d_page_sides_progress\d_page_sides_bottomtotal}>\pagegoal
807
808
809 \pagegoal{\pagegoal\d_page_sides_bottomtotal}
810 \fi
811 \advanceby\d_page_sides_progress\pagetotal
812 \fi}
813
814\def\page_sides_analyse_space_stage_one
815 {\global\c_page_sides_flag\conditionaltrue
816
817
818
819 \global\d_page_sides_page_total\pagetotal
820 \ifnum\c_page_sides_float_type<\plusfour
821 \global\d_page_sides_width \zeropoint
822 \orelse\ifnum\c_page_sides_float_type>\plusfive
823 \global\d_page_sides_width\zeropoint
824 \else
825 \global\d_page_sides_width{\wd\floatbox\d_page_sides_margin}
826 \fi
827 \ifdim\d_page_sides_width<\zeropoint
828 \global\d_page_sides_width\zeropoint
829 \fi
830 \global\d_page_sides_hsize {\hsize\d_page_sides_width}
831 \global\d_page_sides_height{\htdp\floatbox\d_page_sides_toptotal}
832 \global\d_page_sides_vsize {\d_page_sides_height\d_page_sides_page_total}
833 \scratchdimenone\d_page_sides_vsize
834 \scratchdimentwo\pagegoal
835 \ifcase\c_page_sides_tolerance
836 \ifcase\c_page_sides_method
837
838 \or
839
840 \advanceby\scratchdimentwo \strutdp
841 \or
842
843 \advanceby\scratchdimenone \onepoint
844 \fi
845 \or
846
847 \advanceby\scratchdimentwo .5\strutdp
848 \or
849
850
851 \else
852 \advanceby\scratchdimentwo \strutdp
853 \fi}
854
855\def\page_sides_analyse_space_stage_two
856 {
857 \ifdim\scratchdimenone>\scratchdimentwo
858 \global\c_page_floats_room\conditionalfalse
859 \else
860 \ifdim{\pagegoal\d_page_sides_vsize}<\d_page_sides_bottomtotal
861
862 \global\c_page_sides_short\conditionaltrue
863
864 \else
865 \global\advanceby\d_page_sides_vsize \d_page_sides_bottomtotal
866 \global\c_page_sides_short\conditionalfalse
867 \fi
868 \global\c_page_floats_room\conditionaltrue
869 \fi}
870
871\def\page_sides_analyse_space
872 {\page_sides_analyse_space_stage_one
873
874
875
876
877
878
879
880
881
882
883
884
885 \page_sides_analyse_space_stage_two
886 \ifconditional\c_page_sides_shape_down
887 \global\c_page_floats_room\conditionaltrue
888 \fi}
889
890
891
892
893\newconstant\c_page_sides_page_method
894
895\def\page_otr_force_new_page_one
896 {\vskip\d_page_sides_height
897 \penalty\outputpenalty
898 \vskip{\strutdp\d_page_sides_height}
899 \prevdepth\strutdp}
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936\def\page_sides_handle_float#1
937 {\page_sides_initialize_checker
938 \page_sides_check_horizontal_skips
939 \page_sides_check_vertical_skips
940 \page_sides_apply_horizontal_shift
941 \page_sides_check_previous_float
942 \page_sides_inject_before
943 \page_sides_inject_dummy_lines
944 \page_sides_relocate_float{#1}
945 \page_sides_apply_vertical_shift
946 \page_sides_analyse_space
947 \ifconditional\c_page_floats_room
948 \global\c_page_sides_delayed\conditionalfalse
949
950 \else
951 \ifconditional\c_page_sides_keep_together
952 \clf_interceptsamepagecontent\b_page_sides_spill_over
953 \fi
954 \global\c_page_sides_delayed\conditionaltrue
955 \global\c_page_sides_m_of_lines\c_page_sides_n_of_lines
956 \ifcase\c_page_sides_page_method
957 \page_otr_fill_and_eject_page
958 \or
959 \page_otr_force_new_page_one
960 \else
961 \page_otr_fill_and_eject_page
962 \fi
963 \ifvoid\b_page_sides_spill_over\else
964 \box\b_page_sides_spill_over
965 \fi
966 \page_sides_analyse_space
967
968 \page_sides_inject_dummy_lines
969 \fi
970 \page_sides_place_float
971 \global\c_page_sides_delayed\conditionalfalse
972 \page_sides_check_floats_reset
973 \page_sides_wrapup}
974
975\def\page_sides_wrapup
976 {
977 \aftergroup\par
978 \aftergroup\ignoreparskip
979 \aftergroup\ignorespaces
980 \aftergroup\page_sizes_delay_float}
981
982\def\page_sides_local_float_flush
983 {\ifconditional\c_page_sides_shape_down
984 \ifnum\localboxlinenumber=\c_page_sides_n_of_lines\relax
985 \hpack to \localboxlinewidth
986 xoffset \the\localboxlinewidth
987 yoffset \d_page_sides_shape_down_shift
988 {\box\floatbox}
989 \fi
990 \fi}
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003\definelocalboxes
1004 [\v!left:\v!float]
1005 [\c!command=\page_sides_local_float_flush,
1006 \c!location=\v!middle]
1007
1008\def\page_sizes_delay_float
1009 {\ifconditional\c_page_sides_shape_down
1010 \localbox[\v!left:\v!float]{}
1011 \fi}
1012
1013\def\page_sides_check_floats_indeed
1014 {\page_sides_analyse_progress
1015 \ifdim\d_page_sides_progress>\zeropoint
1016 \page_sides_check_floats_set
1017 \else
1018 \page_sides_check_floats_reset
1019 \fi
1020 \parskip\s_spac_whitespace_parskip}
1021
1022
1023
1024\let\page_sides_check_floats\relax
1025
1026\def\page_sides_initialize_checker
1027 {\ifrelax\page_sides_check_floats
1028 \glet\page_sides_check_floats\page_sides_check_floats_indeed
1029 \clf_enablesidefloatchecker
1030 \glet\page_sides_initialize_checker\relax
1031 \fi}
1032
1033\protected\def\page_sides_check_floats_tracer
1034 {\begingroup
1035 \dontleavehmode
1036 \ifnum\c_page_sides_float_type>\plusfour
1037 \rlap
1038 {\hskip\availablehsize
1039 \color[trace:o]
1040 {\rlap{\kern.25\bodyfontsize\showstruts\strut}
1041 \vrule\s!height.5\points\s!depth.5\points\s!width\d_page_sides_width}}
1042 \else
1043 \hskip\d_page_sides_width
1044 \color[trace:o]
1045 {\vrule\s!height.5\points\s!depth.5\points\s!width\d_page_sides_width
1046 \llap{\showstruts\strut\kern.25\bodyfontsize}}
1047 \fi
1048 \endgroup}
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068\protected\def\page_sides_check_floats_set_shape
1069 {\privatescratchtoks\emptytoks
1070 \privatescratchcounter\c_page_sides_n_of_lines
1071 \privatescratchdimen{\hsize\d_page_sides_width}
1072 \dorecurse\c_page_sides_n_of_lines
1073 {\toksapp\privatescratchtoks{\zeropoint\hsize}}
1074 \ifnum\c_page_sides_n_of_hang>\c_page_sides_n_of_lines
1075 \advanceby\c_page_sides_n_of_hang \c_page_sides_n_of_lines\relax
1076 \advanceby\privatescratchcounter\c_page_sides_n_of_hang
1077 \dorecurse\c_page_sides_n_of_hang
1078 {\ifnum\c_page_sides_float_type>\plusfour
1079 \toksapp\privatescratchtoks{\zeropoint\privatescratchdimen}
1080 \else
1081 \toksapp\privatescratchtoks{\d_page_sides_width\privatescratchdimen}
1082 \fi}
1083 \fi
1084 \parshape
1085 \numexpr\privatescratchcounter\plusone\relax
1086 \the\privatescratchtoks
1087 \zeropoint \hsize
1088 \relax}
1089
1090\protected\def\page_sides_check_floats_set_hang
1091 {\hangindent \ifnum\c_page_sides_float_type>\plusfour \fi\d_page_sides_width
1092 \hangafter\c_page_sides_n_of_hang
1093 \global\c_page_sides_hangafter\hangafter}
1094
1095\protected\def\page_sides_check_floats_set
1096 {\edef\p_sidethreshold{\floatparameter\c!sidethreshold}
1097 \ifconditional\c_page_sides_delayed
1098
1099 \d_page_sides_progress\zeropoint
1100 \fi
1101 \ifx\p_sidethreshold\v!old
1102 \d_page_sides_progression{\d_page_sides_progress\strutht\roundingeps}
1103 \c_page_sides_n_of_hang\d_page_sides_progression
1104 \divideby\c_page_sides_n_of_hang \baselineskip\relax
1105 \else
1106 \d_page_sides_progression
1107 \ifempty\p_sidethreshold
1108 \d_page_sides_progress
1109 \else
1110 {\d_page_sides_progress\p_sidethreshold}
1111 \fi
1112 \getnoflines\d_page_sides_progression
1113
1114 \ifdim{\noflines\lineheight}>{\pagegoal\pagetotal}
1115 \getrawnoflines\d_page_sides_progression
1116 \fi
1117
1118 \c_page_sides_n_of_hang\noflines
1119 \fi
1120 \global\c_page_sides_hangafter\zerocount
1121 \ifnum\c_page_sides_n_of_hang>\zerocount
1122 \ifcase\c_page_sides_n_of_lines
1123 \else
1124 \ifcase\c_page_sides_lines_done
1125 \global\c_page_sides_lines_done\c_page_sides_n_of_hang
1126 \else
1127 \privatescratchcounter\c_page_sides_lines_done
1128 \advanceby\privatescratchcounter\c_page_sides_n_of_hang
1129 \global\advanceby\c_page_sides_n_of_lines\privatescratchcounter
1130 \fi
1131 \fi
1132 \ifnum\c_page_sides_n_of_lines>\zerocount
1133 \page_sides_check_floats_set_shape
1134 \orelse\ifconditional\c_page_sides_force_shape
1135 \page_sides_check_floats_set_shape
1136 \else
1137 \page_sides_check_floats_set_hang
1138 \fi
1139 \fi
1140 \global\advanceby\c_page_sides_checks_done \plusone
1141 \iftracesidefloats
1142 \page_sides_check_floats_tracer
1143 \fi}
1144
1145\protected\def\page_sides_check_floats_reset
1146 {\ifcase\c_page_sides_checks_done\else
1147 \ifcase\c_page_sides_hangafter\else
1148
1149
1150 \global\c_page_sides_hangafter\zerocount
1151 \hangindent\zeropoint
1152 \fi
1153
1154 \c_page_sides_checks_done\zerocount
1155 \fi}
1156
1157\protected\def\page_sides_synchronize_floats
1158 {\ifinner \else
1159 \page_sides_check_floats
1160 \fi}
1161
1162\protected\def\page_sides_check_previous_float
1163 {\page_sides_analyse_progress
1164 \ifdim\d_page_sides_progress>\zeropoint \relax
1165 \ifconditional\c_page_sides_short
1166 \global\c_page_sides_short\conditionalfalse
1167 \page_otr_fill_and_eject_page
1168 \else
1169 \kern\d_page_sides_progress
1170 \fi
1171 \fi}
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184\permanent\protected\def\checksidefloat {\page_sides_check_floats}
1185\permanent\protected\def\flushsidefloats {\page_sides_flush_floats_text}
1186\permanent\protected\def\flushsidefloatsafterpar{\page_sides_flush_floats_after_par}
1187\permanent\protected\def\forgetsidefloats {\page_sides_forget_floats}
1188
1189
1190\protect \endinput
1191 |