% Save file as: MULTICOLS.STY          Source: FILESERV@SHSU.BITNET  
% multicols.sty version 1.0
% Allows for multiple column typesetting
% From TUGboat, voulme 10 (1989), No. 3
%
% Frank Mittelback
% Electronic Data Systems
% (Deutschland) GmbH
% Eisenstrasse 56
% D-6090 Russelsheim
% Federal Republic of Germany
% Bitnet: pzf5hz@drueds2
%
% Variables:
%   \premulticols - If the space left on the page is less than this, a new
%         page is started before the multiple columns.  Otherwise, a \vskip
%         of \multicolsep is added.
%   \postmulticols - analogous to \premulticols
%   \columnseprule - the width of the rule separating the columns.
%
% Commands:
%   \raggedcolumns - don't align bottom lines of columns
%   \flushcolumns  - align bottom lines (default)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\@ifundefined{mult@cols}{}{\endinput}

\def\multicols#1{\col@number#1\relax
  \ifnum\col@number<\@ne
     \@warning{Using '\number\col@number' columns doesn't seem a good idea.^^J
             I therefore use two columns instead}%
     \col@number\tw@ \fi
  \@ifnextchar[\mult@cols{\mult@cols[]}}

\def\mult@cols[#1]{\@ifnextchar[%
  {\mult@@cols{#1}}%
  {\mult@@cols{#1}[\premulticols]}}

\def\mult@@cols#1[#2]{%
  \enough@room#2%
  #1\par\addvspace\multicolsep
  \begingroup
  \prepare@multicols\ignorespaces}

\def\enough@room#1{\par \penalty\z@
   \page@free \pagegoal
   \advance \page@free -\pagetotal
   \ifdim \page@free <#1\newpage \fi}

\def\prepare@multicols{%
  \output{\global\setbox\partial@page
  		 \vbox{\unvbox\@cclv}}\eject
  \vbadness9999 \hbadness5000
  \tolerance\multicoltolerance
  \doublecol@number\col@number
  \multiply\doublecol@number\tw@
  \advance\baselineskip\multicolbaselineskip
  \advance\@colroom-\ht\partial@page
  \vsize\col@number\@colroom
  \advance\vsize\c@collectmore\baselineskip
  \hsize\columnwidth \advance\hsize\columnsep
  \advance\hsize-\col@number\columnsep
  \divide\hsize\col@number
  \linewidth\hsize
  \output{\multi@columnout}%
  \multiply\count\footins\col@number
  \multiply\skip \footins\col@number
  \reinsert@footnotes}

\def\endmulticols{\par\penalty\z@
  \output{\balance@columns}\eject
  \endgroup \reinsert@footnotes
  \global\c@unbalance\z@
  \enough@room\postmulticols
  \addvspace\multicolsep}

\newcount\c@unbalance      \c@unbalance   = 0
\newcount\c@collectmore    \c@collectmore = 0
\newcount\col@number
\newcount\doublecol@number
\newcount\multicoltolerance \multicoltolerance = 9999
\newdimen\page@free
\newdimen\premulticols \premulticols = 50pt
\newdimen\postmulticols \postmulticols = 20pt
\newskip\multicolsep \multicolsep = 12pt plus 4pt minus 3pt
\newskip\multicolbaselineskip \multicolbaselineskip=0pt
\newbox\partial@page

\def\process@cols#1#2{\count@#1\relax
    \loop #2%
    \advance\count@\tw@
    \ifnum\count@<\doublecol@number
  \repeat}

\def\page@sofar{\unvbox\partial@page
  \process@cols\z@{\wd\count@\hsize}%
  \hbox to\textwidth{%
    \process@cols\tw@{\box\count@
      \hss\vrule\@width\columnseprule\hss}%
    \box\z@}}

\def\reinsert@footnotes{\ifvoid\footins\else
	\insert\footins{\unvbox\footins}\fi}

\def\multi@columnout{%
  \ifnum\outputpenalty <-\@Mi
     \speci@ls \else
     \splittopskip\topskip
     \splitmaxdepth\maxdepth
     \dimen@\@colroom
     \divide\skip\footins\col@number
     \ifvoid\footins \else
       \advance\dimen@-\skip\footins
       \advance\dimen@-\ht\footins \fi
     \process@cols\tw@{\setbox\count@
        \vsplit\@cclv to\dimen@}%
     \setbox\z@\vsplit\@cclv to\dimen@
     \ifvoid\@cclv \else
       \unvbox\@cclv
       \penalty\outputpenalty
       \fi
     \setbox\@cclv\vbox{\page@sofar}%
     \@makecol\@outputpage
     \global\@colroom\@colht
     \process@deferreds
     \global\vsize\col@number\@colroom
     \global\advance\vsize
       \c@collectmore\baselineskip
     \multiply\skip\footins\col@number\fi}

\def\speci@ls{%
  \typeout{floats and marginpars not allowed inside `multicols' environment}%
  \unvbox\@cclv\reinsert@footnotes
  \gdef\@currlist{}}

\def\process@deferreds{%
  \@floatplacement
  \begingroup
   \let\@tempb\@deferlist
   \gdef\@deferlist{}%
   \let\@elt\@scolelt
   \@tempb \endgroup}

\newif\ifshr@nking

\def\raggedcolumns{%
  \@bsphack\shr@nkingtrue\@esphack}
\def\flushcolumns{%
  \@bsphack\shr@nkingfale\@esphack}

\def\balance@columns{%
  \splittopskip\topskip
  \splitmaxdepth\maxdepth
  \setbox\z@\vbox{\unvbox\@cclv}\dimen@\ht\z@
  \advance\dimen@\col@number\topskip
  \advance\dimen@-\col@number\baselineskip
  \divide\dimen@\col@number
  \advance\dimen@\c@unbalance\baselineskip
  {\vbadness\@M \loop
    {\process@cols\@ne{\global\setbox\count@\box\voidb@x}}%
     \global\setbox\@ne\copy\z@
     {\process@cols\thr@@{\global\setbox\count@\vsplit\@ne to\dimen@}}%
     \ifshr@nking \global\setbox\thr@@\vbox{\unvbox\thr@@}%
       \fi
     \ifdim\ht\@ne >\ht\thr@@
     \global\advance\dimen@\p@
     \repeat}%
    \dimen@\ht\thr@@
    \process@cols\z@{\@tempcnta\count@
      \advance\@tempcnta\@ne
      \setbox\count@\vtop to\dimen@
        {\unvbox\@tempcnta
	 \ifshr@nking\vfill\fi}}%
     \global\vsize\@colroom
     \global\advance\vsize\ht\partial@page
     \page@sofar}
