summaryrefslogtreecommitdiff
path: root/macros/latex209/contrib/misc/balanced.sty
blob: ae5244253d107bc3a2c809ac06f60b1123254900 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
57
58
59
60
61
% The twocolumns environment can be used anywhere in a one column document to
% produce two column output.  The twocolumns environment may extend for an
% unlimited number of pages, and start and finish mid-page.  Columns are
% always balanced.  The code works very hard to avoid two-column ``widows''
% and ``orphans''.  No inserts are supported (haven't worked out where to put
% them yet).
 
\newbox\partialpage
\newbox\leftcolumn
\newdimen\dimen@
\newdimen\colsize
\newdimen\lastpageshrink
\newdimen\dimend
\newenvironment{twocolumns}{\begingroup \global\@twocolumntrue
\def\fps@table{t}
   \pagegoal=2\textheight
   \lastpageshrink=\pageshrink
   \output={\global\setbox\partialpage=\vbox{\unvbox255}}\penalty-10000%
   \def\columnout{\trycolumnout}%
   \output={\columnout}%
   \hsize=\textwidth \advance\hsize-\columnsep \divide\hsize by 2
   \columnwidth=\hsize \linewidth=\hsize
   \global\colsize=\textheight
   \global\advance\colsize by-\ht\partialpage
   \vsize=\colsize
   \global\advance\vsize by\lastpageshrink
   \multiply\vsize by2}%
% \end{twocolumns}
   {\pagegoal=4\textheight
   \output={\balancecolumns\pagesofar}\break
   \endgroup \global\vsize=\textheight \pagegoal=\vsize}
 
\def\pagesofar{\unvbox\partialpage%
   \wd0=\hsize \wd2=\hsize \hbox to\textwidth{\box0\hfil\box2}}
\def\balancecolumns{\setbox0\vbox{\unvbox255} \dimen@=\ht0
   \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
   \divide\dimen@ by2 \splittopskip=\topskip
   {\vbadness=10000 \loop \global\setbox3=\copy0
     \global\setbox1=\vsplit3 to\dimen@
     \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt\repeat}
   \ifdim\dimen@>\textheight \dimen@=\textheight\fi
   \setbox0=\vbox to \dimen@{\unvbox1} \setbox2=\vbox to \dimen@{\unvbox3}
   \if\ht0>\ht2\setbox2=\vbox to\ht0{\unvbox2}\else
   \if\ht2>\ht0\setbox0=\vbox to\ht2{\unvbox0}\fi\fi}
 
\def\trycolumnout{%
%   \@dblfloatplacement
   \global\def\columnout{\leftcolumnout}
   \global\vsize=\colsize
   \unvbox255\penalty\outputpenalty}
\def\leftcolumnout{%
   \global\def\columnout{\rightcolumnout}
   \global\setbox\leftcolumn=\vbox to\vsize{\unvbox255}}
\def\rightcolumnout{%
   \global\def\columnout{\trycolumnout}
   \setbox0=\box\leftcolumn
   \setbox2=\vbox to \vsize{\unvbox255}
   \setbox\@outputbox=\vbox{\pagesofar}\@outputpage
   \global\colsize=\textheight
   \global\vsize=2\colsize}