% 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