\NeedsTeXFormat{LaTeX2e}[1997/12/01]
\ProvidesPackage{multicol}
[2004/02/14 v1.6e multicolumn formatting (FMi)]
\DeclareOption{twocolumn}
{\PackageWarning{multicol}{May not work
with the twocolumn option}}
\newcount\c@tracingmulticols
\DeclareOption{errorshow}
{\c@tracingmulticols\z@}
\DeclareOption{infoshow}
{\c@tracingmulticols\@ne}
\DeclareOption{balancingshow}
{\c@tracingmulticols\tw@}
\DeclareOption{markshow}
{\c@tracingmulticols\thr@@}
\DeclareOption{debugshow}
{\c@tracingmulticols5\relax}
\let\mc@gridwarn\maxdimen
\DeclareOption{grid}{\def\mc@gridwarn{\maxdepth}}
\ProcessOptions
\def\multicols#1{\col@number#1\relax
\ifnum\col@number<\tw@
\PackageWarning{multicol}
{Using `\number\col@number'
columns doesn't seem a good idea.^^J
I therefore use two columns instead}
\col@number\tw@ \fi
\ifnum\col@number>10
\PackageError{multicol}
{Too many columns}
{Current implementation doesn't
support more than 10 columns.
\MessageBreak
I therefore use 10 columns instead}
\col@number10 \fi
\ifx\@footnotetext\mult@footnotetext\else
\let\orig@footnotetext\@footnotetext
\let\@footnotetext\mult@footnotetext
\fi
\@ifnextchar[\mult@cols{\mult@cols[]}}
\long\def\mult@footnotetext#1{\begingroup
\columnwidth\textwidth
\orig@footnotetext{#1}\endgroup}
\def\mult@cols[#1]{\@ifnextchar[
{\mult@@cols{#1}}
{\mult@@cols{#1}[\premulticols]}}
\def\mult@@cols#1[#2]{
\par
\ifinner \@boxedmulticolstrue
\else
\ifnum \doublecol@number>\z@
\@boxedmulticolstrue
\fi
\fi
\mult@info\z@
{Starting environment with
\the\col@number\space columns
\if@boxedmulticols\MessageBreak
(boxed mode)\fi
}
\enough@room{#2}
#1\par\addvspace\multicolsep
\ifdim \prevdepth = -\@m\p@
\else
\@tempcnta\prevdepth
\@tempcntb\baselineskip
\divide\@tempcnta\@tempcntb
\advance\@tempcnta\@ne
\dimen@\prevdepth
\advance\dimen@ -\@tempcnta\baselineskip
\advance\dimen@ \topskip
\kern-\dimen@
\fi
\begingroup
\prepare@multicols
\if@boxedmulticols
\setbox\mult@box\vbox\bgroup
\fi
\ignorespaces}
\newif\if@boxedmulticols
\@boxedmulticolsfalse
\newbox\mult@box
\def\enough@room#1{
\if@boxedmulticols\else
\par
\bgroup\@nobreakfalse\addpenalty\z@\egroup
\page@free \pagegoal
\advance \page@free -\pagetotal
\@tempskipa#1\relax
\mult@info\z@
{Current page:\MessageBreak
height=
\the\pagegoal: used \the\pagetotal
\space -> free=\the\page@free
\MessageBreak
needed \the\@tempskipa
\space(for #1)}
\ifdim \page@free <#1\newpage \fi
\fi}
\def\prepare@multicols{
\multicol@leftmargin\@totalleftmargin
\@totalleftmargin\z@
\parshape\z@
\doublecol@number\col@number
\multiply\doublecol@number\tw@
\advance\doublecol@number\mult@rightbox
\if@boxedmulticols
\let\l@kept@firstmark\kept@firstmark
\let\l@kept@botmark\kept@botmark
\global\let\kept@firstmark\@empty
\global\let\kept@botmark\@empty
\else
\nointerlineskip {\topskip\z@\null}
\output{
\global\setbox\partial@page\vbox
{
\ifvoid\partial@page\else
\PackageError{multicol}
{Error saving partial page}
{The part of the page before
the multicols environment was
nearly full with^^Jthe result
that starting the environment
will produce an overfull
page. Some^^Jtext may be lost!
Please increase \premulticols
either generally or for this
^^Jenvironment by specifying a
suitable value in the second
optional argument to^^Jthe
multicols environment.}
\unvbox\partial@page
\box\last@line
\fi
\unvbox\@cclv
\global\setbox\last@line\lastbox
}
\prep@keptmarks
\global\let\kept@topmark\firstmark
}\eject
\advance\@colroom-\ht\partial@page
\set@mult@vsize\relax
\output{\multi@column@out}
\init@mult@footins
\reinsert@footnotes
\fi
\vbadness\@Mi \hbadness5000
\tolerance\multicoltolerance
\pretolerance\multicolpretolerance
\setemergencystretch\col@number\hsize
\set@floatcmds
\advance\baselineskip\multicolbaselineskip
\hsize\linewidth \advance\hsize\columnsep
\advance\hsize-\col@number\columnsep
\divide\hsize\col@number
\full@width\linewidth
\linewidth\hsize
\columnwidth\hsize
}
\def\init@mult@footins{
\multiply\count\footins\col@number
\multiply\skip \footins\col@number
}
\def\set@mult@vsize#1{
\vsize\@colroom
\@tempdima\baselineskip
\advance\@tempdima-\topskip
\advance\vsize\@tempdima
\vsize\col@number\vsize
\advance\vsize-\@tempdima
\advance\vsize\col@number\baselineskip
#1\advance\vsize
\c@collectmore\baselineskip}
\newdimen\multicol@leftmargin
\def\endmulticols{\par
\if@boxedmulticols
\egroup
\balance@columns
\return@nonemptymark{first}
\kept@firstmark
\return@nonemptymark{bot}
\kept@botmark
\page@sofar
\global\let\kept@firstmark
\l@kept@firstmark
\global\let\kept@botmark
\l@kept@botmark
\mult@info\tw@
{Restore kept marks to\MessageBreak
first: \meaning\kept@firstmark
\MessageBreak bot\space\space:
\meaning\kept@botmark }
\else
\ifdim\pagegoal=\maxdimen
\ifvoid\colbreak@box\else
\mult@info\@ne{Re-adding forced
break(s) for splitting}
\unvbox\colbreak@box\fi
\fi
\penalty\z@
\prevdepth\z@
\output{\balance@columns@out}\eject
\ifvbox\partial@page
\unvbox\partial@page\fi
\global\let\kept@firstmark\@empty
\global\let\kept@botmark\@empty
\mult@info\tw@
{Make kept marks empty}
\fi
\@checkend{multicols}
\endgroup
\global\c@unbalance\z@
\if@boxedmulticols\else
\reinsert@footnotes
\ifdim \pagegoal=\maxdimen
\global\vsize\@colroom
\else
\enough@room\postmulticols
\fi
\fi
\addvspace\multicolsep
\mult@info\z@
{Ending environment
\if@boxedmulticols
\space(boxed mode)\fi
}}
\newcount\c@unbalance
\newcount\c@collectmore
\newcount\doublecol@number
\newcount\multicoltolerance
\newcount\multicolpretolerance
\newdimen\full@width
\newdimen\page@free
\newdimen\premulticols
\newdimen\postmulticols
\newskip\multicolsep
\newskip\multicolbaselineskip
\newbox\partial@page
\newbox\last@line
\c@unbalance = 0
\c@collectmore = 0
\col@number = 1
\multicoltolerance = 9999
\multicolpretolerance = -1
\premulticols = 50pt
\postmulticols= 20pt
\multicolsep = 12pt plus 4pt minus 3pt
\multicolbaselineskip=0pt
\def\process@cols#1#2{\count@#1\relax
\loop
#2
\advance\count@\tw@
\ifnum\count@<\doublecol@number
\repeat}
\def\page@sofar{
\process@cols\mult@rightbox
{\ifvoid\count@
\setbox\count@\hbox to\hsize{}
\else
\wd\count@\hsize
\fi}
\count@\col@number \advance\count@\m@ne
\mult@info\z@
{Column spec: \the\full@width\space = indent
+ columns + sep =\MessageBreak
\the\multicol@leftmargin\space
+ \the\col@number\space
x \the\hsize\space
+ \the\count@\space
x \the\columnsep
}
\ifvmode\else\errmessage{Multicol Error}\fi
\nointerlineskip
\setbox\z@\hbox{p}\global\dimen\tw@\dp\z@
\moveright\multicol@leftmargin
\hbox to\full@width{
\process@cols\mult@gfirstbox{
\ifdim\dp\count@>\dimen\tw@
\global\dimen\tw@\dp\count@ \fi
\box\count@
\hss{\normalcolor\vrule
\@width\columnseprule}\hss}
\ifdim\dp\mult@rightbox>\dimen\tw@
\global\dimen\tw@\dp\mult@rightbox \fi
\box\mult@rightbox
\rlap{\phantom p}
}
\kern-\dimen\tw@
\ifdim\dimen\tw@ = \mc@gridwarn
\PackageWarning{multicol}
{Very deep columns!\MessageBreak
Grid alignment might be broken}
\fi
}
\def\reinsert@footnotes{\ifvoid\footins\else
\insert\footins{}\fi}
\def\multi@column@out{
\ifnum\outputpenalty <-\@M
\speci@ls \else
\ifvoid\colbreak@box\else
\mult@info\@ne{Re-adding forced
break(s) for splitting}
\setbox\@cclv\vbox{
\unvbox\colbreak@box
\penalty-\@Mv\unvbox\@cclv}
\fi
\splittopskip\topskip
\splitmaxdepth\maxdepth
\dimen@\@colroom
\divide\skip\footins\col@number
\ifvoid\footins \else
\leave@mult@footins
\fi
\process@cols\mult@gfirstbox{
\setbox\count@
\vsplit\@cclv to\dimen@
\set@keptmarks
\ifshr@nking
\setbox\count@
\vbox to\dimen@
{\unvbox\count@\vfill}
\fi
}
\setbox\mult@rightbox
\vsplit\@cclv to\dimen@
\set@keptmarks
\ifshr@nking
\setbox\mult@rightbox\vbox to\dimen@
{\unvbox\mult@rightbox\vfill}
\fi
\ifvoid\@cclv \else
\unvbox\@cclv
\penalty\outputpenalty
\ifvoid\footins\else
\PackageWarning{multicol}
{I moved some lines to
the next page.\MessageBreak
Footnotes on page
\thepage\space might be wrong}
\fi
\ifnum \c@tracingmulticols>\thr@@
\hrule\allowbreak \fi
\fi
\ifx\@empty\kept@firstmark
\let\firstmark\kept@topmark
\let\botmark\kept@topmark
\else
\let\firstmark\kept@firstmark
\let\botmark\kept@botmark
\fi
\let\topmark\kept@topmark
\mult@info\tw@
{Use kept top mark:\MessageBreak
\meaning\kept@topmark
\MessageBreak
Use kept first mark:\MessageBreak
\meaning\kept@firstmark
\MessageBreak
Use kept bot mark:\MessageBreak
\meaning\kept@botmark
\MessageBreak
Produce first mark:\MessageBreak
\meaning\firstmark
\MessageBreak
Produce bot mark:\MessageBreak
\meaning\botmark
\@gobbletwo}
\setbox\@cclv\vbox{\unvbox\partial@page
\page@sofar}
\@makecol\@outputpage
\global\let\kept@topmark\botmark
\global\let\kept@firstmark\@empty
\global\let\kept@botmark\@empty
\mult@info\tw@
{(Re)Init top mark:\MessageBreak
\meaning\kept@topmark
\@gobbletwo}
\global\@colroom\@colht
\process@deferreds
\@whilesw\if@fcolmade\fi{\@outputpage
\global\@colroom\@colht
\process@deferreds}
\mult@info\@ne
{Colroom:\MessageBreak
\the\@colht\space
after float space removed
= \the\@colroom \@gobble}
\set@mult@vsize \global
\fi}
\def\leave@mult@footins{
\advance\dimen@-\skip\footins
\advance\dimen@-\ht\footins
}
\def\speci@ls{
\ifnum\outputpenalty <-\@Mi
\ifnum \outputpenalty<-\@MM
\PackageError{multicol}{Document end
inside multicols environment}\@ehd
\@specialoutput
\else
\ifnum\outputpenalty = -\@Mv
\mult@info\@ne{Forced column
break seen}
\global\advance\vsize-\pagetotal
\global\setbox\colbreak@box
\vbox{\ifvoid\colbreak@box
\else
\unvbox\colbreak@box
\penalty-\@Mv
\fi
\unvbox\@cclv}
\reinsert@footnotes
\else
\PackageWarningNoLine{multicol}
{Floats and marginpars not
allowed inside `multicols'
environment!}
\unvbox\@cclv\reinsert@footnotes
\xdef\@freelist{\@freelist\@currlist}
\gdef\@currlist{}
\fi
\fi
\else \@doclearpage \fi
}
\def\process@deferreds{
\@floatplacement
\@tryfcolumn\@deferlist
\if@fcolmade\else
\begingroup
\let\@tempb\@deferlist
\gdef\@deferlist{}
\let\@elt\@scolelt
\@tempb \endgroup
\fi}
\newif\ifshr@nking
\def\raggedcolumns{
\@bsphack\shr@nkingtrue\@esphack}
\def\flushcolumns{
\@bsphack\shr@nkingfalse\@esphack}
\def\balance@columns@out{
\setbox\mult@box\vbox{
\ifvoid\colbreak@box\else
\unvbox\colbreak@box\break
\mult@info\@ne{Re-adding
forced break(s) in balancing}
\fi
\unvbox\@cclv}
\balance@columns
\global\vsize\@colroom
\global\advance\vsize\ht\partial@page
\unvbox\partial@page
\return@nonemptymark{first}\kept@firstmark
\return@nonemptymark{bot}\kept@botmark
\page@sofar
\penalty\z@
}
\def\balance@columns{
\get@keptmarks\mult@box
\setbox\mult@box\vbox{
\penalty-\@M
\unvbox\mult@box
\remove@discardable@items
}
\@tempdima\topskip
\splittopskip\@tempdima
\@plus\multicolundershoot
\@minus\multicolovershoot
\splitmaxdepth\maxdepth
\setbox\@tempboxa\vsplit\mult@box to\z@
\@tempdima\ht\mult@box
\advance\@tempdima\dp\mult@box
\divide\@tempdima\col@number
\count@\@tempdima
\divide\count@\baselineskip
\dimen@\count@\baselineskip
\advance\dimen@\topskip
\ifdim \dimen@ >\@tempdima
\advance\dimen@-\baselineskip
\fi
\advance\dimen@\c@unbalance\baselineskip
\mult@info\@ne
{Balance columns\on@line:
\ifnum\c@unbalance=\z@\else
(off balance=\number\c@unbalance)\fi
\@gobbletwo}
\ifnum\dimen@<\topskip
\mult@info\@ne
{Start value
\the\dimen@ \space ->
\the\topskip \space (corrected)}
\dimen@\topskip
\fi
\vbadness\@M
\vfuzz \col@number\baselineskip
\last@try-\p@
\loop
{\process@cols\mult@grightbox
{\global\setbox\count@
\box\voidb@x}}
\global\setbox\mult@grightbox
\copy\mult@box
\global\too@badfalse
{\process@cols\mult@firstbox{
\global\setbox\count@
\vsplit\mult@grightbox to\dimen@
\ifnum\c@tracingmulticols>\@ne
\@tempcnta\count@
\advance\@tempcnta-\mult@grightbox
\divide\@tempcnta \tw@
\message{^^JColumn
\number\@tempcnta\space
badness: \the\badness\space}
\fi
\ifnum\badness>\c@columnbadness
\ifnum\c@tracingmulticols>\@ne
\message{too bad
(>\the\c@columnbadness)}
\fi
\global\too@badtrue
\fi
}}
\boxmaxdepth\maxdepth
\global\setbox\mult@grightbox
\vbox{\unvbox\mult@grightbox}
\setbox\mult@nat@firstbox
\vbox{\unvcopy\mult@firstbox}
\ifnum\c@tracingmulticols>\@ne
\message{^^JFirst column
= \the\dimen@\space
(\the\ht\mult@nat@firstbox)}\fi
\ifnum\c@tracingmulticols>\@ne
\message{<> last column =
\the\ht\mult@grightbox^^J}
\fi
\ifdim\ht\mult@grightbox >\dimen@
\too@badtrue
\ifnum\c@tracingmulticols>\@ne
\typeout{Rejected: last
column too large!}
\fi
\else
\setbox\@tempboxa
\copy\mult@grightbox
\setbox\z@\vsplit\@tempboxa to\maxdimen
\ifvoid\@tempboxa
\global\setbox\mult@grightbox
\vbox to\dimen@
{\unvbox\mult@grightbox}
\ifnum\c@tracingmulticols>\@ne
\message{Final badness:
\the\badness}
\fi
\ifnum\badness>\c@finalcolumnbadness
\global\setbox\mult@grightbox
\vbox to\dimen@
{\unvbox\mult@grightbox\vfill}
\ifnum\c@tracingmulticols>\@ne
\message{ setting natural
(> \the\c@finalcolumnbadness)}
\fi
\fi
\else
\too@badtrue
\ifnum\c@tracingmulticols>\@ne
\typeout{Rejected: unprocessed
forced break(s) in last column!}
\fi
\fi
\fi
\ifdim\ht\mult@nat@firstbox<\dimen@
\ifdim\ht\mult@nat@firstbox>\last@try
\too@badtrue
\ifnum\c@tracingmulticols>\@ne
\typeout{Retry: using natural
height of first column!}
\fi
\dimen@\ht\mult@nat@firstbox
\last@try\dimen@
\advance\dimen@-\p@
\fi
\fi
\iftoo@bad
\advance\dimen@\p@
\repeat
\if@boxedmulticols\else
\ifdim\dimen@>\@colroom
\dimen@\@colroom
\fi
\fi
\process@cols\mult@rightbox
{\@tempcnta\count@
\advance\@tempcnta\@ne
\setbox\count@\vbox to\dimen@
{
\vskip \z@
\@plus-\multicolundershoot
\@minus-\multicolovershoot
\unvbox\@tempcnta
\ifshr@nking\vfill\fi}}
}
\newbox\mult@rightbox
\newbox\mult@grightbox
\newbox\mult@gfirstbox
\newbox\mult@firstbox
\newbox\@tempa\newbox\@tempa
\newbox\@tempa\newbox\@tempa
\newbox\@tempa\newbox\@tempa
\newbox\@tempa\newbox\@tempa
\newbox\@tempa\newbox\@tempa
\newbox\@tempa\newbox\@tempa
\newbox\@tempa\newbox\@tempa
\newbox\@tempa\newbox\@tempa
\newbox\@tempa
\let\@tempa\relax
\@ifundefined{emergencystretch}
{\newdimen\emergencystretch}{}
\def\setemergencystretch#1#2{
\emergencystretch 4pt
\multiply\emergencystretch#1}
\def\set@floatcmds{
\let\@dblfloat\@dbflt
\def\end@dblfloat{\par
\vskip\z@
\egroup
\color@endbox
\@largefloatcheck
\outer@nobreak
\ifnum\@floatpenalty<\z@
\@cons\@deferlist\@currbox
\fi
\ifnum\@floatpenalty=-\@Mii
\@Esphack
\fi}}
\def\kept@topmark{{}{}}
\let\kept@firstmark\@empty
\let\kept@botmark\@empty
\def\return@nonemptymark#1#2{
\ifx#2\@empty
\else
\mult@info\tw@
{Returned #1 mark:\MessageBreak
\meaning#2}
\toks@\expandafter{#2}
\mark{\the\toks@}
\nobreak
\fi}
\def\get@keptmarks#1{
\begingroup
\vbadness\@M
\setbox#1\copy#1
\setbox#1\vsplit#1to\maxdimen
\set@keptmarks
\endgroup
}
\def\set@keptmarks{
\ifx\kept@firstmark\@empty
\expandafter\gdef\expandafter
\kept@firstmark
\expandafter{\splitfirstmark}
\ifx\kept@firstmark\@empty\else
\mult@info\tw@
{Set kept first mark:\MessageBreak
\meaning\kept@firstmark
\@gobbletwo}
\fi
\fi
\expandafter\def\expandafter\@tempa
\expandafter{\splitbotmark}
\ifx\@tempa\@empty\else
\global\let\kept@botmark\@tempa
\mult@info\tw@
{Set kept bot mark:\MessageBreak
\meaning\kept@botmark
\@gobbletwo}
\fi}
\def\prep@keptmarks{
\if@boxedmulticols \else
\get@keptmarks\partial@page
\fi}
\def\remove@discardable@items{
\unskip\unpenalty\unkern
\unskip\unpenalty\unkern
\unskip\unpenalty\unkern
\unskip\unpenalty\unkern
}
\newif\iftoo@bad
\newcount\c@columnbadness
\c@columnbadness=10000
\newcount\c@finalcolumnbadness
\c@finalcolumnbadness=9999
\newdimen\last@try
\newdimen\multicolovershoot
\newdimen\multicolundershoot
\multicolovershoot=0pt
\multicolundershoot=2pt
\newbox\mult@nat@firstbox
\def\mult@info#1#2{
\ifnum\c@tracingmulticols>#1
\GenericWarning
{(multicol)\@spaces\@spaces}
{Package multicol: #2}
\fi
}
\@namedef{multicols*}{
\ifinner
\PackageWarning{multicol}
{multicols* inside a box does
not make sense.\MessageBreak
Going to balance anyway}
\else
\let\balance@columns@out
\multi@column@out
\fi
\begin{multicols}
}
\@namedef{endmulticols*}{\vfill
\end{multicols}}
\mathchardef\@Mv=10005
\def\columnbreak{
\ifnum\col@number<\tw@
\PackageError{multicol}
{\noexpand\columnbreak outside multicols}
{This command can only be used within
a multicols or multicols* environment.}
\else
\ifvmode
\penalty -\@Mv\relax
\else
\@bsphack
\vadjust{\penalty -\@Mv\relax}
\@esphack
\fi
\fi}
\newbox\colbreak@box
\endinput