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