% copied from TUGboat, Vol.10 (1989) No.3 p.409--415 (B.J.)
% MULTICOLUMN LaTeX environement.
% Author: F. Mittelbach
% Quick adaptation to PLAIN: B. Jackowski (Ver. 0.7); alterations are
%                                                     marked by `(B.J.)'
%
% Since I do not understand floats I assume that they are
% not used while multicolumning. Maybe some other day...
%
% ========================================================================
% --------------------- PSEUDO-LaTeX ENVIRONEMENT ------------------------
% ========================================================================
\catcode`\@=11
\newtoks\@uteroutput % (P.P.)
\@uteroutput\output  %
% --------------------------
\def\adjust@PLAIN{%
  \newlinechar=`\^^J
  \columnwidth\hsize \textwidth\hsize
  \@colht\vsize      \@colroom\vsize % NO FLOATs PLEASE!
  \def\makefootline{\baselineskip24\p@\hbox to \textwidth{\the\footline}}
  \def\pagebody{\vbox to\@colht{\boxmaxdepth\maxdepth \pagecontents}}
  \def\vfootnote##1{\insert\footins\bgroup
     \hsize=\textwidth
     \interlinepenalty\interfootnotelinepenalty
     \splittopskip\ht\strutbox % top baseline for broken footnotes
     \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
     \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
     \textindent{##1}\footstrut\futurelet\next\fo@t}
}
% --------------------------
\mathchardef\@Mi=10001
\newcount\@tempcnta % temporary count register
% ------ These four macros differ from their LaTeX twins ------
\def\thepage{\number\pageno}
\def\addvspace#1{\vskip#1\relax}
\def\typeout#1{\immediate\write\z@{#1}}
\def\@warning#1{\typeout{WARNING: #1.}}
% --------------------------
\def\newpage{\par\vfil\penalty -\@M}
\long\def\@ifundefined#1#2#3{\expandafter\ifx\csname 
                     #1\endcsname\relax#2\else#3\fi}
\def\@ifnextchar#1#2#3{\let\@tempe #1\def\@tempa{#2}\def\@tempb{#3}\futurelet
    \@tempc\@ifnch}
\def\@ifnch{\ifx \@tempc \@sptoken \let\@tempd\@xifnch
      \else \ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi
      \fi \@tempd}
\def\:{\let\@sptoken= } \:  % this makes \@sptoken a space token 
\def\:{\@xifnch} \expandafter\def\: {\futurelet\@tempc\@ifnch}
% --------------------------
\def\@spaces{\space\space\space\space}
\def\@width{width}
\newdimen\@colroom
\newdimen\@colht
\newdimen\columnwidth
\newdimen\textwidth
% --------------------------
\newdimen\columnsep          \columnsep=24pt
\newdimen\columnseprule      \columnseprule = 0pt
% ========================================================================
% -------------------- MITTELBACH's MACROS -------------------------------
% ========================================================================
\newcount\unbalance           \unbalance          = 0
\newcount\collectmore         \collectmore        = 0
\newcount\tracingmulticols    \tracingmulticols   = 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
\newif\ifshr@nking
%
\@ifundefined{mult@cols}{}{\endinput}
\ifnum\tracingmulticols>\z@ % <--------------------------------- added (B.J.)
  \typeout{%
     MULTI COLUMN format designed by Frank Mittelbach --- see TUGboat}
  \typeout{%
     Vol.10 (1989) No.3 pp.407--415> for doc.; PLAIN ver. 0.9 by B. Jackowski}
\fi
%
\def\beginmulticols{\begingroup\multicols}% <--- substitute of LaTeX's phrase
                                          % \begin{...} ... \end{...}  (B.J.)
%
\def\multicols#1{\col@number#1\relax
  %
  \adjust@PLAIN
  %
  \ifnum\col@number<\@ne
  \@warning{Using `number\col@number'
    columns doesn't seem a good idea.^^J
    \@spaces\@spaces 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]{%
  \ifnum\tracingmulticols>\z@
  \typeout{^^J^^JStarting multicolumn
           output with \the\col@number
           \space columns:^^J}\fi
  \enough@room#2%
  {#1}\par % <-------------- instead of #1\par---it seems more natural (B.J.)
           % the more so, as outer {} braces inside [] brackets are gobbled:
           % \multicols{...}[cosik] is equivalent to \multicols{...}[{cosik}]
  \addvspace\multicolsep
  \begingroup
  \prepare@multicols\ignorespaces}
%
\def\enough@room#1{\par \penalty\z@
  \page@free \pagegoal
  \advance \page@free -\pagetotal
  \ifnum \tracingmulticols>\z@
  \typeout{Current page:}%
  \message{\@spaces goal height=%
    \the\pagegoal: used \the\pagetotal
    \space -> free\the\page@free}%
  \typeout{\@spaces needed \the#1
           (for \string#1)}\fi
  \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\collectmore\baselineskip
  \hsize\columnwidth \advance\hsize\columnsep
  \advance\hsize-\col@number\columnsep
  \divide\hsize\col@number
%  \linewidth\hsize % <----------------- it seems unnecessary in PLAIN (B.J.)
  \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\unbalance\z@
  \enough@room\postmulticols
  \addvspace\multicolsep
  \nointerlineskip % <------------------------------------------ added (B.J.)
  \ifnum \tracingmulticols>\z@
    \typeout{^^JEnding multicolumn
             output.^^J^^J}\fi
  \endgroup}
%
\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
     \ifnum \tracingmulticols>\tw@
                  \hrule\allowbreak \fi
     \ifvoid\footins\else % <----------------------------------- added (B.J.)
       \@warning{I moved some lines to the next page.^^J
                 \@spaces\@spaces Footnotes on page \thepage\space
                 might be wrong}\fi\fi
     \setbox\@cclv\vbox{\page@sofar}%
%     \plainoutput % <---------------- instead of \@makecol\@outputpage (B.J.)
     \the\@uteroutput % <------------- instead of \plainoutput (P.P.)
     \global\@colroom\@colht
     \process@deferreds
     \ifnum\tracingmulticols>\@ne
       \typeout{Colroom: \the\@colht\space after float
                space removed = \the\@colroom}\fi
     \global\vsize\col@number\@colroom
     \global\advance\vsize \collectmore\baselineskip
     \multiply\skip\footins\col@number
   \fi}
%
\def\speci@ls{%
  \typeout{Floats and marginpars not allowed inside
           `multicols' environement!}%
  \unvbox\@cclv\reinsert@footnotes
%  \gdef\@currlist{}% <----------------------------- not used in PLAIN (B.J.)
  }
%
\def\process@deferreds{}% <---------- instead of the `percented' macro (B.J.)
                        % (temporarily: until I'll learn what all that
                        %  mumbling means)
%\def\process@deferreds{%
% \@floatplacement
% \begingroup
%   \let\@tempb\@deferlist
%  \gdef\@deferlist{}%
%  \let\@elt\@scoelt
%  \@tempb \endgroup}
%
% Originally: <------------------------------------------------------- (B.J.)
%\def\raggedcolumns{\@bsphack\shr@nkingtrue\@esphack}
%\def\flushcolumns{\@bsphack\shr@nkingfalse\@esphack}
%
\def\raggedcolumns{\shr@nkingtrue}
\def\flushcolumns{\shr@nkingfalse}
%
\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@ \unbalance\baselineskip
  \ifnum\tracingmulticols>\@ne
    \typeout{Balance columns: \ifnum\unbalance=\z@\else
             (off balance=\number\unbalance)\fi}%
  \fi
  {\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@}}%
  %
  % ... After \process@cols has done its job we have the following situation:
  %                 box0 <-- all material
  %                 box3 <-- first column
  %                 box5 <-- second column
  %                 ...
  %                 box1 <-- last column ...
  %
      \ifnum\tracingmulticols>\@ne
        \message{\@spaces First column = \the\ht\thr@@}\fi
      \ifshr@nking \global\setbox\thr@@\vbox{\unvbox\thr@@}%
        \ifnum\tracingmulticols>\@ne
          \message{ after shrinking \the\ht\thr@@}\fi\fi
      \ifnum\tracingmulticols>\@ne
        \message{<> last column = \the\ht\@ne}%
        \typeout{}\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}
% ========================================================================
\catcode`\@=12 % default PLAIN value
% ========================================================================
\endinput
