% 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