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
63\newdimension \d_page_sides_shift
64\newdimension \d_page_sides_extrashift
65\newdimension \d_page_sides_leftshift
66\newdimension \d_page_sides_rightshift
67\newdimension \d_page_sides_leftskip
68\newdimension \d_page_sides_rightskip
69\newdimension \d_page_sides_maximum
70\newdimension \d_page_sides_topskip
71\newdimension \d_page_sides_bottomskip
72\newdimension \d_page_sides_midskip
73\newdimension \d_page_sides_downshift
74\newdimension \d_page_sides_pagetotal
75\newdimension \d_page_sides_topoffset
76\newdimension \d_page_sides_bottomoffset
77\newdimension \d_page_sides_toptotal
78\newdimension \d_page_sides_bottomtotal
79
80\newconstant \c_page_sides_align
81\newconstant \c_page_sides_skipmode
82\newconstant \c_page_sides_tolerance
83
84\newconstant \c_page_sides_method
85
86\newdimension \d_page_sides_progression
87
88\newinteger \c_page_sides_m_of_lines
89\newconditional \c_page_sides_delayed
90
91
92
93\newif \iftracesidefloats
94
95
96
97\d_page_sides_vsize_reset \onepoint
98
99
100
101
102\def\page_sides_floats_legend
103 {\showmessage\m!floatblocks{16}\empty
104 \glet\page_sides_floats_legend\relax}
105
106\installtextracker{floats.anchoring}
107 {\page_sides_floats_legend
108 \tracesidefloatstrue}
109 {\tracesidefloatsfalse}
110
111
112
113
114
115\def\page_sides_process_float_backspace {\global\c_page_sides_float_type\plusone \page_sides_handle_float}
116\def\page_sides_process_float_leftedge {\global\c_page_sides_float_type\plustwo \page_sides_handle_float}
117\def\page_sides_process_float_leftmargin {\global\c_page_sides_float_type\plusthree\page_sides_handle_float}
118\def\page_sides_process_float_left {\global\c_page_sides_float_type\plusfour \page_sides_handle_float}
119\def\page_sides_process_float_right {\global\c_page_sides_float_type\plusfive \page_sides_handle_float}
120\def\page_sides_process_float_rightmargin{\global\c_page_sides_float_type\plussix \page_sides_handle_float}
121\def\page_sides_process_float_rightedge {\global\c_page_sides_float_type\plusseven\page_sides_handle_float}
122\def\page_sides_process_float_cutspace {\global\c_page_sides_float_type\pluseight\page_sides_handle_float}
123\def\page_sides_process_float_margin {\global\c_page_sides_float_type\pluseight\page_sides_handle_float}
124
125\def\page_sides_check_horizontal_skips
126 {\ifcase\c_page_sides_skipmode
127 \or
128 \or
129 \or
130 \global\d_page_sides_margin\zeropoint
131 \fi}
132
133\def\page_sides_apply_horizontal_shift
134 {\ifdim\d_page_sides_maximum>\zeropoint
135 \ifcase\c_page_sides_float_type
136
137 \or
138
139 \or
140 \global\d_page_sides_shift\dimexpr
141 \d_page_sides_maximum
142 \rightorleftpageaction \leftedgedistance \rightedgedistance
143 \rightorleftpageaction \leftmarginwidth \rightmarginwidth
144 \rightorleftpageaction \leftmargindistance \rightmargindistance
145 \compensatedinnermakeupmargin
146 \relax
147 \or
148 \global\d_page_sides_shift\dimexpr
149 \d_page_sides_maximum
150 \rightorleftpageaction \leftmargindistance \rightmargindistance
151 \compensatedinnermakeupmargin
152 \relax
153 \or
154
155 \or
156
157 \or
158 \global\d_page_sides_shift\dimexpr
159 \d_page_sides_maximum
160 \rightorleftpageaction \leftmargindistance \rightmargindistance
161 \compensatedinnermakeupmargin
162 \relax
163 \or
164 \global\d_page_sides_shift\dimexpr
165 \d_page_sides_maximum
166 \rightorleftpageaction \leftedgedistance \rightedgedistance
167 \rightorleftpageaction \leftmarginwidth \rightmarginwidth
168 \rightorleftpageaction \leftmargindistance \rightmargindistance
169 \compensatedinnermakeupmargin
170 \relax
171 \or
172
173 \fi
174 \fi
175 \ifzeropt\d_page_sides_shift
176 \ifnum\c_page_sides_float_type=\plusfour
177 \global\advanceby\d_page_sides_shift\d_page_sides_extrashift
178 \global\d_page_sides_extrashift\zeropoint
179 \orelse\ifnum\c_page_sides_float_type=\plusfive
180 \global\advanceby\d_page_sides_shift\d_page_sides_extrashift
181 \global\d_page_sides_extrashift\zeropoint
182 \fi
183 \else
184 \ifnum\c_page_sides_float_type<\plusfour
185 \global\c_page_sides_float_type\plusfour
186 \orelse\ifnum\c_page_sides_float_type>\plusfive
187 \global\c_page_sides_float_type\plusfive
188 \fi
189 \fi}
190
191\def\page_sides_set_skips
192 {\global\d_page_sides_rightskip\zeropoint
193 \global\d_page_sides_leftskip \zeropoint
194 \ifcase\c_page_sides_float_type
195 \or
196 \global\d_page_sides_leftskip\dimexpr
197 \rightorleftpageaction \backspace \cutspace
198 \compensatedinnermakeupmargin
199 \relax
200 \or
201 \global\d_page_sides_leftskip\dimexpr
202 \rightorleftpageaction \leftmargindistance \rightmargindistance
203 \rightorleftpageaction \leftmarginwidth \rightmarginwidth
204 \rightorleftpageaction \leftedgedistance \rightedgedistance
205 \compensatedinnermakeupmargin
206 \relax
207 \or
208 \global\d_page_sides_leftskip\dimexpr
209 \rightorleftpageaction \leftmargindistance \rightmargindistance
210 \compensatedinnermakeupmargin
211 \relax
212 \or
213 \or
214 \or
215 \global\d_page_sides_rightskip\dimexpr
216 \rightorleftpageaction \rightmargindistance \leftmargindistance
217 \compensatedinnermakeupmargin
218 \relax
219 \or
220 \global\d_page_sides_rightskip\dimexpr
221 \rightorleftpageaction \rightmargindistance \leftmargindistance
222 \rightorleftpageaction \rightmarginwidth \leftmarginwidth
223 \rightorleftpageaction \rightedgedistance \leftedgedistance
224 \compensatedinnermakeupmargin
225 \relax
226 \or
227 \global\d_page_sides_rightskip\dimexpr
228 \rightorleftpageaction \cutspace \backspace
229 \compensatedinnermakeupmargin
230 \relax
231 \fi
232 \global\d_page_sides_leftoffset \d_page_sides_rightskip
233 \global\d_page_sides_rightoffset\d_page_sides_leftskip
234 \ifdim\d_page_sides_rightskip>\zeropoint
235 \global\advanceby\d_page_sides_rightskip\rightskip
236 \fi
237 \ifdim\d_page_sides_leftskip >\zeropoint
238 \global\advanceby\d_page_sides_leftskip \leftskip
239 \fi}
240
241
242
243\def\page_sides_relocate_float#1
244 {\global\setbox\floatbox\hpack
245 {\ifnum\c_page_sides_float_type=\plusfour
246 \kern\d_page_sides_leftshift
247 \orelse\ifnum\c_page_sides_float_type=\plusone
248 \kern\d_page_sides_leftshift
249 \fi
250 \ifnum\c_page_sides_float_type>\plusfour
251 \kern\d_page_sides_extrashift
252 \else
253 \kern\d_page_sides_shift
254 \fi
255 \vbox{#1\ifnum\c_page_sides_align=\plusfour \removedepth \fi}
256 \ifnum\c_page_sides_float_type>\plusfour
257 \kern\d_page_sides_shift
258 \else
259 \kern\d_page_sides_extrashift
260 \fi
261 \ifnum\c_page_sides_float_type=\pluseight
262 \kern\d_page_sides_rightshift
263 \orelse\ifnum\c_page_sides_float_type=\plusfive
264 \kern\d_page_sides_rightshift
265 \fi}}
266
267
268
269
270\def\page_sides_check_vertical_skips
271 {\ifdim\d_page_sides_topskip <\zeropoint\d_page_sides_topskip \zeropoint\fi
272 \ifdim\d_page_sides_bottomskip<\zeropoint\d_page_sides_bottomskip\zeropoint\fi
273 \ifdim\d_page_sides_midskip <\zeropoint\d_page_sides_midskip \zeropoint\fi
274
275 \global\d_page_sides_toptotal \dimexpr\d_page_sides_topskip \d_page_sides_topoffset \relax
276 \global\d_page_sides_bottomtotal\dimexpr\d_page_sides_bottomskip\d_page_sides_bottomoffset\relax
277 \ifcase\c_page_sides_skipmode
278 \or
279 \global\d_page_sides_toptotal \d_page_sides_topoffset
280 \or
281 \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset
282 \or
283 \global\d_page_sides_toptotal \d_page_sides_topoffset
284 \global\d_page_sides_bottomtotal\d_page_sides_bottomoffset
285 \fi}
286
287
288
289\def\page_sides_apply_vertical_shift_normal
290 {\global\setbox\floatbox\hpack
291 {\vpack
292 {\forgetall
293 \hsize\wd\floatbox
294 \vskip\privatescratchdimen
295 \offinterlineskip
296 \box\floatbox
297
298
299 \setbox\scratchbox\emptyhbox
300 \wd\scratchbox\hsize
301 \ht\scratchbox\d_page_sides_bottomtotal
302 \box\scratchbox
303 \vskip\d_page_sides_bottomtotal
304 \ifnum\c_page_sides_align=\plusfive
305 \vskip\lineheight
306 \fi}}}
307
308\def\page_sides_apply_vertical_shift_traced
309 {\global\setbox\floatbox\hpack
310 {\backgroundline[trace:r]{\ruledhpack{\vpack
311 {\forgetall
312 \hsize\wd\floatbox
313 \vskip\privatescratchdimen
314 \offinterlineskip
315 \backgroundline
316 [trace:g]
317 {\ruledhpack{\box\floatbox}}
318 \par
319 \blackrule
320 [\c!color=trace:s,
321 \c!height=\d_page_sides_bottomtotal,
322 \c!depth=\zeropoint,
323 \c!width=\hsize]
324 \vskip\d_page_sides_bottomtotal
325 \ifnum\c_page_sides_align=\plusfive
326 \vskip\lineheight
327 \fi}}}}}
328
329\def\page_sides_apply_vertical_shift
330 {\ifnum\c_page_sides_align=\plusfour
331 \getnoflines{\ht\floatbox}
332 \privatescratchdimen\dimexpr\noflines\lineheight\strutdp\relax
333 \getrawnoflines\d_page_sides_toptotal
334 \advanceby\privatescratchdimen\noflines\lineheight
335 \page_sides_force_depth
336 \ht\floatbox\privatescratchdimen
337 \dp\floatbox\zeropoint
338 \else
339 \fi
340 \ifcase\c_page_sides_align \else
341 \global\d_page_sides_toptotal\zeropoint
342 \fi
343 \privatescratchdimen
344 \ifnum\c_page_sides_float_type<\plusfour
345 \d_page_sides_toptotal
346 \orelse\ifnum\c_page_sides_float_type>\plusfive
347 \d_page_sides_toptotal
348 \else
349 \zeropoint
350 \fi
351
352 \ifcase\c_page_sides_align
353
354 \advanceby\privatescratchdimen\strutdp
355 \or
356 \advanceby\privatescratchdimen\strutdp
357 \or
358 \or
359 \advanceby\privatescratchdimen\lineheight
360 \advanceby\privatescratchdimen\strutdp
361 \or
362 \privatescratchdimen\zeropoint
363 \or
364 \advanceby\privatescratchdimen\strutht
365 \fi
366
367 \global\c_page_sides_lines_done\zerocount
368 \ifconditional\c_page_sides_shape_down
369 \global\d_page_sides_shape_down_shift\dimexpr
370 \privatescratchdimen
371 \htdp\floatbox
372
373 \relax
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\dimexpr\lineheight\strutdp\relax
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\dimexpr\d_page_sides_progress\d_page_sides_bottomtotal\relax>\pagegoal
807
808
809 \pagegoal\dimexpr\pagegoal\d_page_sides_bottomtotal\relax
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\dimexpr\wd\floatbox\d_page_sides_margin\relax
826 \fi
827 \ifdim\d_page_sides_width<\zeropoint
828 \global\d_page_sides_width\zeropoint
829 \fi
830 \global\d_page_sides_hsize \dimexpr\hsize\d_page_sides_width\relax
831 \global\d_page_sides_height\dimexpr\htdp\floatbox\d_page_sides_toptotal\relax
832 \global\d_page_sides_vsize \dimexpr\d_page_sides_height\d_page_sides_page_total\relax
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\dimexpr\pagegoal\d_page_sides_vsize\relax<\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\dimexpr\d_page_sides_height\strutdp\relax
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
1069 {\edef\p_sidethreshold{\floatparameter\c!sidethreshold}
1070 \ifconditional\c_page_sides_delayed
1071
1072 \d_page_sides_progress\zeropoint
1073 \fi
1074 \ifx\p_sidethreshold\v!old
1075 \d_page_sides_progression\dimexpr\d_page_sides_progress\strutht\roundingeps\relax
1076 \c_page_sides_n_of_hang\d_page_sides_progression
1077 \divideby\c_page_sides_n_of_hang \baselineskip\relax
1078 \else
1079 \d_page_sides_progression
1080 \ifempty\p_sidethreshold
1081 \d_page_sides_progress
1082 \else
1083 \dimexpr\d_page_sides_progress\p_sidethreshold\relax
1084 \fi
1085 \getnoflines\d_page_sides_progression
1086
1087 \ifdim\dimexpr\noflines\lineheight>\dimexpr\pagegoal\pagetotal\relax
1088 \getrawnoflines\d_page_sides_progression
1089 \fi
1090
1091 \c_page_sides_n_of_hang\noflines
1092 \fi
1093 \global\c_page_sides_hangafter\zerocount
1094 \ifnum\c_page_sides_n_of_hang>\zerocount
1095 \ifcase\c_page_sides_n_of_lines
1096 \else
1097 \ifcase\c_page_sides_lines_done
1098 \global\c_page_sides_lines_done\c_page_sides_n_of_hang
1099 \else
1100 \privatescratchcounter\c_page_sides_lines_done
1101 \advanceby\privatescratchcounter\c_page_sides_n_of_hang
1102 \global\advanceby\c_page_sides_n_of_lines\privatescratchcounter
1103 \fi
1104 \fi
1105 \ifnum\c_page_sides_n_of_lines>\zerocount
1106 \privatescratchtoks\emptytoks
1107 \privatescratchcounter\c_page_sides_n_of_lines
1108 \privatescratchdimen\dimexpr\hsize\d_page_sides_width\relax
1109 \dorecurse\c_page_sides_n_of_lines
1110 {\toksapp\privatescratchtoks{\zeropoint\hsize}}
1111 \ifnum\c_page_sides_n_of_hang>\c_page_sides_n_of_lines
1112 \advanceby\c_page_sides_n_of_hang \c_page_sides_n_of_lines\relax
1113 \advanceby\privatescratchcounter\c_page_sides_n_of_hang
1114 \dorecurse\c_page_sides_n_of_hang
1115 {\ifnum\c_page_sides_float_type>\plusfour
1116 \toksapp\privatescratchtoks{\zeropoint\privatescratchdimen}
1117 \else
1118 \toksapp\privatescratchtoks{\d_page_sides_width\privatescratchdimen}
1119 \fi}
1120 \fi
1121 \parshape
1122 \numexpr\privatescratchcounter\plusone\relax
1123 \the\privatescratchtoks
1124 \zeropoint \hsize
1125 \relax
1126 \else
1127 \hangindent \ifnum\c_page_sides_float_type>\plusfour \fi\d_page_sides_width
1128 \hangafter\c_page_sides_n_of_hang
1129 \global\c_page_sides_hangafter\hangafter
1130 \fi
1131 \fi
1132 \global\advanceby\c_page_sides_checks_done \plusone
1133 \iftracesidefloats
1134 \page_sides_check_floats_tracer
1135 \fi}
1136
1137\protected\def\page_sides_check_floats_reset
1138 {\ifcase\c_page_sides_checks_done\else
1139 \ifcase\c_page_sides_hangafter\else
1140
1141
1142 \global\c_page_sides_hangafter\zerocount
1143 \hangindent\zeropoint
1144 \fi
1145
1146 \c_page_sides_checks_done\zerocount
1147 \fi}
1148
1149\protected\def\page_sides_synchronize_floats
1150 {\ifinner \else
1151 \page_sides_check_floats
1152 \fi}
1153
1154\protected\def\page_sides_check_previous_float
1155 {\page_sides_analyse_progress
1156 \ifdim\d_page_sides_progress>\zeropoint \relax
1157 \ifconditional\c_page_sides_short
1158 \global\c_page_sides_short\conditionalfalse
1159 \page_otr_fill_and_eject_page
1160 \else
1161 \kern\d_page_sides_progress
1162 \fi
1163 \fi}
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176\permanent\protected\def\checksidefloat {\page_sides_check_floats}
1177\permanent\protected\def\flushsidefloats {\page_sides_flush_floats_text}
1178\permanent\protected\def\flushsidefloatsafterpar{\page_sides_flush_floats_after_par}
1179\permanent\protected\def\forgetsidefloats {\page_sides_forget_floats}
1180
1181
1182\protect \endinput
1183 |