%% cuted.sty
%% Copyright 1997 Sigitas Tolu\v sis
%% VTeX Ltd., Akademijos 4, Vilnius, Lithuania
%% e-mail sigitas@vtex.lt
%% http://www.vtex.lt/tex/download/macros/
%%
% This program can redistributed and/or modified under the terms
% of the LaTeX Project Public License Distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
% version 1 of the License, or (at your option) any later version.
%
% PURPOSE:   Insert some onecolumn material in full-width on double-column page.
%
% SHORT DESCRIPTION:
%
%   It is denoted to place some material in full-width at any place 
%   on double-column page (\twocolumn mode). The part of material
%   can be placed on the next page. Existing text is placed
%   under inserted material in two columns (it is reformatted).
%
% Provides new environment:
%
%  \begin{strip} ... \end{strip}
%  -----------------------------
%
%   Puts \vbox{...} in full-width on double-column page.
%   Adds \stripsep glue before and after
%   (By default \stripsep=15pt plus2pt minus 2pt).
%   It can be problems with floats and footnotes. In the case of 
%   problems with footnotes it is possible to correct the situation
%   using commands \footnotemark and \footnotetext.
%
% Provides new command:
%  \oldcolsbreak{#1}
%
%   Adds #1 in place of original column break if strip is placed 
%   on the right column.
%
% \changes{1997/09/02}{improved column balancing}
% \changes{1997/09/03}{float control for \@colroom setting}
% \changes{1997/09/04}{improved \@colroom setting}
% \changes{1997/09/05}{checking for \@viper and \hold@viper}
% \changes{1997/09/09}{compatibility with flushend.sty}
% \changes{1997/09/22}{improved \output ir \@specialoutput}
% \changes{1997/10/01}{improved \output ir \@addviper}
%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{cuted}[1997/10/01]
%
\newtoks\At@ViperColsBreak \At@ViperColsBreak{}
\def\oldcolsbreak#1{\global\At@ViperColsBreak{#1}}
\newbox\v@aaa
\newbox\v@ccc
\@ifundefined{stripsep}{\newskip\stripsep\stripsep 15pt plus 2pt minus 2pt}{}
%
\@ifundefined{@viper}{\newbox\@viper}{}
\newif\if@lastviper \@lastviperfalse
\def\@outputdblcol{%
  \if@firstcolumn
    \global \@firstcolumnfalse
    \global \setbox\@leftcolumn \box\@outputbox
  \else
    \global \@firstcolumntrue
    \setbox\@outputbox \vbox {%
                         \hb@xt@\textwidth {%
                           \hb@xt@\columnwidth {%
                             \box\@leftcolumn \hss}%
                           \hfil
                           \vrule \@width\columnseprule
                           \hfil
                           \hb@xt@\columnwidth {%
                             \box\@outputbox \hss}%
                                             }%
                              }%
    \ifvoid\hold@viper
    \else
      \setbox\@outputbox \vbox{\box\hold@viper\box\@outputbox}%
    \fi
    \@combinedblfloats
    \@outputpage
    \begingroup
      \@dblfloatplacement
      \@startdblcolumn
      \@whilesw\if@fcolmade \fi
        {\@outputpage
         \@startdblcolumn}%
      \ifvoid\@viper
      \else
        \global\setbox\@viper\vbox{%
                \vskip-\stripsep\unvbox\@viper}\@viperoutput
      \fi
    \endgroup
  \fi
}
\mathchardef\@Mv=10005
\newcount\viper@penalty
\def\strip{%
  \ifinner
     \@parmoderr\viper@penalty\z@
  \else
     \viper@penalty=-\@Mv\relax
  \fi
  \global \setbox\@viper\vbox\bgroup%
        \hsize\textwidth
        \@parboxrestore
        \col@number \@ne
        \vrule height\topskip width0pt depth0pt
}
\def\endstrip{%
        \egroup
    \ifnum\viper@penalty <-\@Mii
      \penalty -\@Miv
      \@tempdima\prevdepth    %% saving and restoring \prevdepth added
      \vbox{}%                %% 26 May 87 to prevent extra vertical
      \prevdepth \@tempdima   %% space when used in vertical mode
      \penalty-\@Mv\relax
    \fi
}
\gdef\@viperoutput{%
               \global \setbox\@holdpg \vbox{%
                      \unvbox\@holdpg
                      \unvbox\@cclv
                      \setbox\@tempboxa \lastbox
                      \unskip
                                     }%
               \@pagedp \dp\@holdpg
               \@pageht \ht\@holdpg
               \ifvoid\@viper\else
                   \advance \@pageht \@pagedp
                   \ifvoid\footins \else
                     \advance \@pageht \ht\footins
                     \advance \@pageht \skip\footins
                     \advance \@pageht \dp\footins
                   \fi
                   \ifvbox \@kludgeins
                     \ifdim \wd\@kludgeins=\z@
                       \advance \@pageht \ht\@kludgeins
                     \fi
                   \fi
                   \@reinserts
                   \@addviper
               \fi
}
\gdef\@specialoutput{%
   \ifnum \outputpenalty>-\@Mii
     \@doclearpage
   \else
     \ifnum \outputpenalty<-\@Miii
       \ifnum \outputpenalty<-\@MM \deadcycles \z@ \fi
       \ifnum \outputpenalty=-10005
              \@viperoutput
               \ifnum \outputpenalty<\z@
                 \if@nobreak
                 \else
                   \addpenalty \interlinepenalty
                 \fi
               \fi
       \else
              \global \setbox\@holdpg \vbox {\unvbox\@cclv}%
       \fi
     \else
       \global \setbox\@holdpg \vbox{%
                      \unvbox\@holdpg
                      \unvbox\@cclv
                      \setbox\@tempboxa \lastbox
                      \unskip
                                     }%
       \@pagedp \dp\@holdpg
       \@pageht \ht\@holdpg
       \unvbox \@holdpg
       \@next\@currbox\@currlist{%
         \ifnum \count\@currbox>\z@
           \advance \@pageht \@pagedp
           \ifvoid\footins \else
             \advance \@pageht \ht\footins
             \advance \@pageht \skip\footins
             \advance \@pageht \dp\footins
           \fi
           \ifvbox \@kludgeins
             \ifdim \wd\@kludgeins=\z@
               \advance \@pageht \ht\@kludgeins
             \fi
           \fi
           \@reinserts
           \@addtocurcol
         \else
           \@reinserts
           \@addmarginpar
         \fi
         }\@latexbug
       \ifnum \outputpenalty<\z@
         \if@nobreak
         \else
           \addpenalty \interlinepenalty
         \fi
       \fi
     \fi
   \fi
}
\@ifundefined{hold@viper}{\newbox\hold@viper}{}
\newdimen\ht@viper 
\def \@addviper {%
   \if@firstcolumn
     \@insertfalse
     \@reqcolroom .5\@pageht
     \ht@viper\@reqcolroom
     \advance \@reqcolroom \ht\@viper
     \advance \@reqcolroom \stripsep
     \ifvoid\hold@viper\@tempdima=\z@\else\@tempdima\ht\hold@viper\fi
%
     \@tempdimb \ht@viper
     \loop
     \setbox\v@aaa\copy\@holdpg
     \setbox\v@ccc\vbox to\@tempdimb{%
                \vsplit\v@aaa to\@tempdimb\vss\vsplit\v@aaa to\@tempdimb}%
     \wlog{Extra height:\the\ht\v@aaa\space when \the\@tempdimb}%
     \ifvoid\v@aaa \else \advance\@tempdimb 1pt \repeat%
     \loop
     \setbox\v@aaa\copy\@holdpg
     \setbox\v@ccc\vbox to\@tempdimb{%
                \vsplit\v@aaa to\@tempdimb\vss}%
     \wlog{(2)Left:\the\ht\v@ccc\space Right:\the\ht\v@aaa\space Output:\the\@tempdimb}%
     \ifdim \ht\v@ccc<\ht\v@aaa \@tempdimb \the\ht\v@aaa \repeat%
     \wlog{- LAST -^^JLeft:\the\ht\v@ccc^^JRight:\the\ht\v@aaa^^JOutput:\the\@tempdimb}%
     \setbox\v@ccc\vbox to\@tempdimb{%
                \vsplit\@holdpg to\@tempdimb\vss}%
%
     \setbox\@tempboxa \vbox {%
        \hb@xt@\textwidth {%
                \hb@xt@\columnwidth {%
%                    \vbox to\ht@viper{\vsplit\@holdpg to\ht@viper\vss} \hss}%
                    \vbox to\ht@viper{\box\v@ccc\vss} \hss}%
                    \hfil
                    \vrule \@width\columnseprule
                    \hfil
                    \hb@xt@\columnwidth {%
                    \vbox to\ht@viper{\box\@holdpg\vss} \hss}%
                          }%
                       }%
     \ifvoid\hold@viper
        \global\setbox\hold@viper \vbox {%
                \unvbox\@tempboxa
                \penalty\interlinepenalty
                \vskip\stripsep
                \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
                \outputpenalty \z@
                        }%
     \else
        \global\setbox\hold@viper \vbox {%
                \unvbox\hold@viper
                \unvbox\@tempboxa
                \penalty\interlinepenalty
                \vskip\stripsep
                \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
                \outputpenalty \z@
                        }%
     \fi
     \ifdim \@colroom>\@reqcolroom
        \global\setbox\hold@viper \vbox {%
                \unvbox\hold@viper
                \box\@viper
                \penalty\interlinepenalty
                \vskip\stripsep
                \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
                \outputpenalty \z@
                        }%
        \@inserttrue
        \advance\@tempdima by-\ht\hold@viper
        \global \advance \@colht \@tempdima
        \ifdim \@colht<2.5\baselineskip
           \@latex@warning@no@line {Optional argument of \noexpand\twocolumn
                too tall on page \thepage (1 stulpelis)}%
           \@emptycol
           \if@firstcolumn
           \else
             \@emptycol
           \fi
           \global\@lastvipertrue
        \else
           \global \vsize \@colht
           \global \@colroom \@colht
           \check@floats
           \ifdim\@tempdima>\z@
                   \global\advance\@colroom by-\@tempdima
           \fi
           \ifdim\@colroom<\z@
                   \global\@colroom 1pt
                   \ifdim\@tempdima>\@colht
                      \@latex@warning@no@line {TOP ir/ar BOT FLOAT's
                                 netelpa lape \thepage (1 stulpelis)}%
                   \fi
                   \@emptycol
                   \if@firstcolumn
                   \else
                     \@emptycol
                   \fi
                   \global\@lastvipertrue
           \fi
        \fi
     \fi
   \else
     \@insertfalse
     \@reqcolroom\@colht
     \advance\@reqcolroom \@pageht
     \ht@viper.5\@reqcolroom
     \@reqcolroom\ht@viper
     \advance \@reqcolroom \ht\@viper
     \advance \@reqcolroom \stripsep
     \global\setbox\@holdpg\vbox{\unvbox\@leftcolumn
                \setbox\@tempboxa\lastbox\unskip\the\At@ViperColsBreak\unvbox\@holdpg}%
     \global\At@ViperColsBreak{}%
     \ht@viper .5\ht\@holdpg
     \ifvoid\hold@viper\@tempdima=\z@\else\@tempdima\ht\hold@viper\fi
%
     \@tempdimb \ht@viper
     \loop
     \setbox\v@aaa\copy\@holdpg
     \setbox\v@ccc\vbox to\@tempdimb{%
                \vsplit\v@aaa to\@tempdimb\vss\vsplit\v@aaa to\@tempdimb}%
     \wlog{Extra height:\the\ht\v@aaa\space when \the\@tempdimb}%
     \ifvoid\v@aaa \else \advance\@tempdimb 1pt \repeat%
     \loop
     \setbox\v@aaa\copy\@holdpg
     \setbox\v@ccc\vbox to\@tempdimb{%
                \vsplit\v@aaa to\@tempdimb\vss}%
     \wlog{(2)Left:\the\ht\v@ccc\space Right:\the\ht\v@aaa\space Output:\the\@tempdimb}%
     \ifdim \ht\v@ccc<\ht\v@aaa \@tempdimb \the\ht\v@aaa \repeat%
     \wlog{- LAST -^^JLeft:\the\ht\v@ccc^^JRight:\the\ht\v@aaa^^JOutput:\the\@tempdimb}%
     \setbox\v@ccc\vbox to\@tempdimb{%
                \vsplit\@holdpg to\@tempdimb\vss}%
%
     \setbox\@tempboxa\vbox{%
        \hb@xt@\textwidth {%
                \hb@xt@\columnwidth {%
%                   \vbox to\ht@viper{\vsplit\@holdpg to \ht@viper\vss} \hss}%
                   \vbox to\ht@viper{\box\v@ccc\vss} \hss}%
                \hfil
                \vrule \@width\columnseprule
                \hfil
                \hb@xt@\columnwidth {%
                   \vbox to\ht@viper{\box\@holdpg\vss} \hss}%
                          }%
                       }%
     \ifvoid\hold@viper
        \global\setbox\hold@viper \vbox {%
                \unvbox\@tempboxa
                \penalty\interlinepenalty
                \vskip\stripsep
                \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
                \outputpenalty \z@
                        }%
     \else
        \global\setbox\hold@viper \vbox {%
                \unvbox\hold@viper       
                \unvbox\@tempboxa
                \penalty\interlinepenalty
                \vskip\stripsep
                \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
                \outputpenalty \z@
                        }%
     \fi
     \ifdim \@colht>\@reqcolroom
        \global\setbox\hold@viper \vbox {%
                \unvbox\hold@viper
                \box\@viper
                \penalty\interlinepenalty
                \vskip\stripsep
                \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
                \outputpenalty \z@
                        }%
        \@inserttrue
        \global\@firstcolumntrue
        \advance\@tempdima by-\ht\hold@viper
        \global \advance \@colht \@tempdima
        \ifdim \@colht<2.5\baselineskip
                \@latex@warning@no@line {Optional argument of \noexpand\twocolumn
                        too tall on page \thepage (2 stulpelis)}%
                \@emptycol
                \if@firstcolumn
                \else
                  \@emptycol
                \fi
                \global\@lastvipertrue
        \else
                \global \vsize \@colht
                \global \@colroom \@colht
                \check@floats
                \ifdim\@tempdima>\z@
                        \global\advance\@colroom by-\@tempdima
                \fi
                \ifdim\@colroom<\z@
                         \global\@colroom 1pt
                         \ifdim\@tempdima>\@colht
                         \@latex@warning@no@line {TOP ir/ar BOT FLOAT's
                                 netelpa lape \thepage (2 stulpelis)}%
                         \fi
                         \@emptycol
                         \if@firstcolumn
                         \else
                           \@emptycol
                         \fi
                         \global\@lastvipertrue
                \fi
        \fi
      \fi
  \fi
  \if@insert
  \else
        \advance\@tempdima by-\ht\hold@viper
        \global \advance \@colht \@tempdima
        \global\setbox\hold@viper \vbox {%
                \unvbox\hold@viper
                \vsplit\@viper to \@colht
                \vss
                }%
        \vbox{}%
        \global\@firstcolumnfalse
        \newpage
  \fi
}

\def \check@floats {%
    \global\@tempdima\z@
    \let \@elt \ht@comflelt
    \ifx \@toplist\@empty \else\@toplist \fi
    \ifx \@botlist\@empty \else\@botlist \fi
}
\def\ht@comflelt#1{\setbox\@tempboxa\vbox{\copy #1\vskip\floatsep}%
\global\advance\@tempdima\ht\@tempboxa}

\output {%
  \let \par \@@par
  \ifnum \outputpenalty<-\@M
    \@specialoutput
  \else
    \@makecol
    \@opcol
    \@startcolumn
    \@whilesw \if@fcolmade \fi
      {%
       \@opcol\@startcolumn}%
  \fi
  \ifnum \outputpenalty>-\@Miv
    \ifdim \@colroom<1.5\baselineskip
      \ifdim \@colroom<\textheight
        \@latex@warning@no@line {Text page \thepage\space
                               contains only floats}%
        \if@lastviper\else\@emptycol\fi
        \if@twocolumn
          \if@firstcolumn
          \else
            \@emptycol
          \fi
        \fi
        \global\@lastviperfalse
      \else
        \global \vsize \@colroom
      \fi
    \else
      \global \vsize \@colroom
    \fi
  \else
    \ifnum\outputpenalty<-100005
      \global \vsize \maxdimen
    \else
      \global \vsize \@colroom
    \fi
  \fi
}
\endinput



