% FLEXIBOX MACROS for LaTeX2e version 2.11,
% written by Herman Haverkort, 18 april 1995
% See end of file for information on warranty, distribution etc.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{hhflxbox}[1995/04/18 Scalable frames]
\RequirePackage{hhunits}[1995/02/16]
\RequirePackage{hhutils0}[1995/03/08]

% WARNING for those who had a hhflxbox 1.00 or 1.01: The parameter WIDTH
% for \iframe should be specified in thousands from version 1.02 on.

% ******************************
% �    HORIZONTAL CENTERING    �
% ******************************

\def\clap#1{\hbox to \z@{\hss #1\hss}}

% ******************************
% � IN-LINE VERTICAL CENTERING �
% ******************************

\def\lcenter#1{$\vcenter{\hbox{#1}}$}

% ******************************
% �     ISOMORPHOUS FRAMES     �
% ******************************
%
% \iframe sets isomorphous frames. Isomorphous frames are stretchable
% neither horizontally nor vertically; they are only scalable by the
% same factor in all directions.
%
% The syntax of \iframe is the following:
% \iframe IFRAME (HPOS, VPOS) WIDTH MINHEIGHT HSTRETCH VSTRETCH
%         UNITHEIGHT:CONTENTS
%
% *  IFRAME should be a macro that draws the frame in a picture environment,
%    assuming that the unitlength has been set equal to the height of the
%    area which is to contain the frame's contents.
%
% *  HPOS and VPOS determine the position of the frame's contents within
%    the frame; they are given by the distance between the frame's lower
%    left corner and the lower left corner of the contents area.
%    HPOS and VPOS should be in units, assuming that the unitlength is
%    the height of the contents area.
%
% *  WIDTH is 1000 times the width/height ratio of the frame's contents area.
%
% *  MINHEIGHT is the minimum height of the contents.
%
% *  HSTRETCH should be a macro that takes two arguments: a dimension
%    HSIZE and a box number BOX. HSTRETCH reads the box and enlarges
%    it to have width HSIZE. The following HSTRETCH macros are defined:
%    -  \ifrl  (sets the box flushed left)
%    -  \ifrr  (sets the box flushed right)
%    -  \ifrch (sets the box centered)
%    VSTRETCH does the similar thing for the vertical dimension:
%    -  \ifrt  (sets the box flushed up by increasing its depth)
%    -  \ifrb  (sets the box flushed down by increasing its height)
%    -  \ifrcv (sets the box `centerd' by increasing depth and height by
%              the same amount)
%
% *  UNITHEIGHT (optional) is an identifier (just some string of alphabetic
%    characters) which identifies the so-called unit height. Every time
%    a frame is set, the smaller of the contents height and the unit height
%    is set to the larger one. After compiling the entire file, the unit
%    height will have been increased to fit the largest contents which have
%    been framed with it. The unit height is then saved, and reloaded the
%    next time the file is compiled. All frames using that unit height
%    will be set to the same size then, which is determined by the largest
%    box which should fit in it.
%
% *  CONTENTS is what is to be framed.

\def\ifrl#1#2{\hbox to #1{\box#2\hss}}
\def\ifrr#1#2{\hbox to #1{\hss\box#2}}
\def\ifrch#1#2{\hbox to #1{\hss\box#2\hss}}
\def\ifrb#1#2{\hbox{{%
    \@tempdima #1\advance\@tempdima-\dp#2\ht#2\@tempdima \box#2}}}
\def\ifrt#1#2{\hbox{{%
    \@tempdima #1\advance\@tempdima-\ht#2\dp#2\@tempdima \box#2}}}
\def\ifrcv#1#2{\hbox{{%
    \@tempdima #1\relax
    \@tempdimb #1\relax
    \advance\@tempdima \ht#2%
    \advance\@tempdima-\dp#2%
    \ht#2.5 \@tempdima
    \advance\@tempdimb-\ht#2%
    \dp#2\@tempdimb
    \box#2}}}

\def\iframe#1(#2,#3)#4#5#6#7#8:#9{{%
  %
  % box what is to be framed:
  \sbox\@tempboxa{#9}%
  %
  % determine the total height of the box
  \@tempdima\ht\@tempboxa \advance\@tempdima\dp\@tempboxa
  %
  % if it is less than the minimum height, stretch the box vertically
  \ifdim\@tempdima<#5\setbox\@tempboxa #7{#5}{\@tempboxa}\@tempdima #5\fi
  %
  % calculate the natural height of the box, given its width
  \setlength\@tempdimb{\wd\@tempboxa}%
  \divide\@tempdimb#4%
  \setlength\@tempdimb{1000\@tempdimb}%
  %
  \ifdim\@tempdimb>\@tempdima
    % if the box is lower than its natural height then stretch it vertically
    \setbox\@tempboxa #7{\@tempdimb}{\@tempboxa}\@tempdima\@tempdimb
  \else
    % if the box is higher than its natural height then stretch it horizontally
    \setlength\@tempdimb{.001\@tempdima}%
    \setbox\@tempboxa #6{#4\@tempdimb}{\@tempboxa}%
  \fi
  %
  % determine if a unit name is specified
  \def\@tempa{#8}\ifx\@tempa\@empty\else
    % if so, get the right height for the box and stretch it to the extent
    % that is necessary
    \@tempdimb\unit #8:{\@tempdima}\@tempdima\@tempdimb%
    \setbox\@tempboxa #7{\@tempdima}{\@tempboxa}%
    \setlength\@tempdimb{.001\@tempdima}%
    \setbox\@tempboxa #6{#4\@tempdimb}{\@tempboxa}%
  \fi
  %
  % calculate the unit length for the frame drawing
  \divide\@tempdima 1000
  %
  % calculate the depth of the framed box, taking in account the
  % width of the lower frame part and the depth of the framed box
  \@tempdimb #3\@tempdima \advance\@tempdimb\dp\@tempboxa
  %
  % and finally put it all together
  \hbox{\lower\@tempdimb\hbox{%
    \unitlength\@tempdima
    \begin{picture}(0,0)%
      \put(#2,#3){\hbox{\raise\dp\@tempboxa\box\@tempboxa}}%
    \end{picture}%
    #1}}}}

% ******************************
% �         ENCIRCLING         �
% ******************************
%
% The first encircling macro has the following syntax:
% \ringbox UNITHEIGHT:CONTENTS
% where the parameters are as described above.

\def\ringbox{\iframe\@ringbox(200,200){1000}{0pt}\ifrch\ifrcv}
\def\@ringbox{%
  \begin{picture}(1400,1400)\put(700,700){\circle{1400}}\end{picture}}

% The second encircling macro is very much alike the first one. It also
% puts the CONTENTS in a square, which is surrounded by a circle. The
% circle, however, does not contribute anything to the size of the
% resulting box. The result of \outringbox is a box with the dimensions
% of the squared contents, causing the circle to stick out.

\def\outringbox{\iframe\@outringbox(0,0){1000}{0pt}\ifrch\ifrcv}
\def\@outringbox{%
  \begin{picture}(1000,1000)\put(500,500){\circle{1400}}\end{picture}}

% Finally, \bellybox sticks out by 5% of its diameter on every side
\def\bellybox{\iframe\@bellybox(130,130){1000}{0pt}\ifrch\ifrcv}
\def\@bellybox{%
  \begin{picture}(1260,1260)\put(630,630){\circle{1400}}\end{picture}}

% ******************************
% �     STRETCHABLE FRAMES     �
% ******************************
%
% Stretchable frames consist of four parts: two side parts (left and right)
% and two ledger parts (top and bottom).
% The side and ledger parts are macros which take (unfortunately) a lot
% of arguments: eight to be exact. The first is the box in which the side or
% ledger part is to be set. The second is the basic width of the box to
% be framed. Imagine this is the top border of the box to be framed:
% ------*-------------------------*---.
%   #3                             #4
% The asterisks specify the part of the border that has to be spanned by
% the top ledger of the frame. The total length of this border should be
% given by the second argument of the macro. The third and the fourth
% argument should specify the distances between the ends and the
% fastening points (indicated by the asterisks). Of course these distances
% are usually zero. After the ledger has been fastened the fastening
% points should be moved, because the fastening points are considered
% to be the corners of the framed box and could be needed to position
% the side parts of the frame. Imagine a strange ledger like this one:
%
%   *################
%     #################################*
%       ###########################
% ------o-------------------------o---
% The asterisks indicate the new fastening points. The position of the left
% fastening point should be stored in the dimensions identified by argument
% five and seven. The fifth argument should be set to the horizontal distance
% from the left end of the framed box border to the new left fastening point.
% The seventh argument should be set to the vertical distance between the
% framed box border and the fastening point. This distance should be
% negative if the new fastening point is outside the box, which it usually
% is. Similarly, the position of the right fastening point should be
% stored in the sixth and eighth argument. Note that if a new fastening
% point is positioned to the left or right of the framed box, its
% horizontal coordinate should be set negative. For example: in the
% above figure the right fastening point sticks out horizontally, so
% the sixth argument should be set to a negative value.
%
% For left part macros, swap left en top, and swap right and bottom in
% the above explanation. For bottom part macros, mirror the above story
% in the horizontal axis. For right part macros, mirror the left part
% explanation in the vertical axis.
%
% The basic syntax of a stretchable frame call is:
%    \sframe LEFTSIDE TOPLEDGER RIGHTSIDE BOTTOMLEDGER -HORIZALIGN |VERTALIGN
%            CONTENTS
% LEFTSIDE to BOTTOMLEDGER are as explained above.
% -HORIZALIGN and |VERTALIGN are optional. If specified the aligns have
% the following syntax:
%            [MINDIM] STRETCH UNITDIM:
% where [MINDIM] and UNITDIM are optional (however, it does not make sense
% to omit both of them). The effect of specifying aligns is similar to
% the effect of specifying minimal heights, stretches and unit heights for
% an \iframe. The difference is that \iframe aligns work in horizontal and
% vertical direction simultaneously, while \sframe offers independent
% handling of the horizontal and vertical directions.
%
% \sfrsrule is a predefined macro which can be used as a left or right
% side. It draws a vertical rule with thickness \fboxrule.
% \sfrlrule does the similar thing horizontally and can be used as a
% top or bottom ledger. Note however that
%    \sframe\sfrsrule\sfrlrule\sfrsrule\sfrlrule{stuff}
% does _not_ draw a proper box around stuff. There will be no corners!
% The solution is to divide the frame constructing process in phases.
% The first phase is drawing the side parts. The second phase is
% drawing the ledger parts, taking in account the width contributed
% by the already drawn side parts. Up to four phases can be used.
% The phases can be specified simply by typing the phase number
% between brackets just before each part, for example:
%    \sframe [1]\sfrsrule [2]\sfrlrule [1]\sfrsrule [2]\sfrlrule {stuff}
% Each part for which no phase is specified will be drawn in phase four.
%
% To specify an empty side or ledger, specify any macro with a invalid
% phase number, e.g.: "[0]\open".
%
% There is a environment variant of \sframe: use
% \begin{sframed}... STUFF\end{sframed} instead of \sframe...{STUFF}.
% =============================================================================

\newenvironment{sframed}%
  {\begingroup\@h@sfrenvironmenttrue\h@Zsframe}%
  {\h@Ksframe}
\def\sframe{\begingroup\@h@sfrenvironmentfalse\h@Zsframe}
\def\h@Zsframe{\@ifnextchar[{\h@Asframe}{\h@Asframe[4]}}
\def\h@Asframe[#1]#2{\def\h@sfrlphase{#1}\def\h@sfrlside{#2}%
  \@ifnextchar[{\h@Bsframe}{\h@Bsframe[4]}}
\def\h@Bsframe[#1]#2{\def\h@sfrtphase{#1}\def\h@sfrtledger{#2}%
  \@ifnextchar[{\h@Csframe}{\h@Csframe[4]}}
\def\h@Csframe[#1]#2{\def\h@sfrrphase{#1}\def\h@sfrrside{#2}%
  \@ifnextchar[{\h@Dsframe}{\h@Dsframe[4]}}
\def\h@Dsframe[#1]#2{\def\h@sfrbphase{#1}\def\h@sfrbledger{#2}%
  \@ifnextchar-{\h@Esframe}{\h@Esframe-\ifrch:}}
\def\h@Esframe-{\@ifnextchar[{\h@Fsframe}{\h@Fsframe[\z@]}}
\def\h@Fsframe[#1]#2#3:{%
  \def\h@sfrhmin{#1}\def\h@sfrhstretch{#2}\def\h@sfrhunit{#3}%
  \@ifnextchar|{\h@Gsframe}{\h@Gsframe|\ifrcv:}}
\def\h@Gsframe|{\@ifnextchar[{\h@Hsframe}{\h@Hsframe[\z@]}}
\def\h@Hsframe[#1]#2#3:{%
  \def\h@sfrvmin{#1}\def\h@sfrvstretch{#2}\def\h@sfrvunit{#3}%
  \if@h@sfrenvironment\def\next{\h@Jsframe\ignorespaces}%
                 \else\def\next{\h@Isframe}\fi\next}
\def\h@Isframe#1{\h@Jsframe #1\h@Ksframe}
\def\h@Jsframe{\mufoff\sbox\@tempboxa\bgroup}
\def\h@Ksframe{\egroup
  \@tempdima\ht\@tempboxa \addtolength\@tempdima{\dp\@tempboxa}%
  \ifdim\@tempdima<\h@sfrvmin
    \setbox\@tempboxa\h@sfrvstretch{\h@sfrvmin}{\@tempboxa}\@tempdima\h@sfrvmin\fi
  \ifx\h@sfrvunit\@empty\else
    \@tempdimb\unit\h@sfrvunit:{\@tempdima}\@tempdima\@tempdimb
    \setbox\@tempboxa\h@sfrvstretch{\@tempdima}{\@tempboxa}\fi
  \ifdim\wd\@tempboxa<\h@sfrhmin
    \setbox\@tempboxa\h@sfrhstretch{\h@sfrhmin}{\@tempboxa}\fi
  \ifx\h@sfrhunit\@empty\else
    \@tempdimb\unit\h@sfrhunit:{\wd\@tempboxa}%
    \setbox\@tempboxa\h@sfrhstretch{\@tempdimb}{\@tempboxa}\fi
  \setlength\@tempdimq{\dp\@tempboxa}%
  \sbox\@tempboxa{\raise\@tempdimq\box\@tempboxa}%
  \setlength\@tempdima\z@\setlength\@tempdimb\z@%
  \setlength\@tempdimc\z@\setlength\@tempdimd\z@%
  \setlength\@tempdime\z@\setlength\@tempdimf\z@%
  \setlength\@tempdimg\z@\setlength\@tempdimh\z@%
  \def\h@sfrphase{1}\h@sfrdophase
  \def\h@sfrphase{2}\h@sfrdophase
  \def\h@sfrphase{3}\h@sfrdophase
  \def\h@sfrphase{4}\h@sfrdophase
  \hbox{\lower\@tempdimq\box\@tempboxa}%
  \muffin
  \endgroup}
\newif\if@h@sfrenvironment\@h@sfrenvironmentfalse
\def\h@sfrdophase{%
  \setlength\@tempdimi\@tempdima\setlength\@tempdimj\@tempdimb
  \setlength\@tempdimk\@tempdimc\setlength\@tempdiml\@tempdimd
  \setlength\@tempdimm\@tempdime\setlength\@tempdimn\@tempdimf
  \setlength\@tempdimo\@tempdimg\setlength\@tempdimp\@tempdimh
  \ifx\h@sfrphase\h@sfrlphase\h@sfrlside\@tempboxb{\ht\@tempboxa}\@tempdima\@tempdimb
    \@tempdimi\@tempdimj\@tempdimm\@tempdimo\else\sbox\@tempboxb{}\fi
  \ifx\h@sfrphase\h@sfrtphase\h@sfrtledger\@tempboxc{\wd\@tempboxa}\@tempdime\@tempdimf
    \@tempdimm\@tempdimn\@tempdimi\@tempdimk\else\sbox\@tempboxc{}\fi
  \ifx\h@sfrphase\h@sfrrphase\h@sfrrside\@tempboxd{\ht\@tempboxa}\@tempdimc\@tempdimd
    \@tempdimk\@tempdiml\@tempdimn\@tempdimp\else\sbox\@tempboxd{}\fi
  \ifx\h@sfrphase\h@sfrbphase\h@sfrbledger\@tempboxe{\wd\@tempboxa}\@tempdimg\@tempdimh
    \@tempdimo\@tempdimp\@tempdimj\@tempdiml\else\sbox\@tempboxe{}\fi
  \addtolength\@tempdimi{\ht\@tempboxc}\addtolength\@tempdimk{\ht\@tempboxc}%
  \addtolength\@tempdimj{\ht\@tempboxe}\addtolength\@tempdiml{\ht\@tempboxe}%
  \addtolength\@tempdimm{\wd\@tempboxb}\addtolength\@tempdimo{\wd\@tempboxb}%
  \addtolength\@tempdimn{\wd\@tempboxd}\addtolength\@tempdimp{\wd\@tempboxd}%
  \addtolength\@tempdimq{\ht\@tempboxe}%
  \setbox\@tempboxa\vbox{\offinterlineskip
    \hbox{\kern\wd\@tempboxb\kern\@tempdime\rlap{\box\@tempboxc}}%
    \hbox{\raise\@tempdimb\copy\@tempboxb\box\@tempboxa\raise\@tempdimd\box\@tempboxd}%
    \hbox{\kern\wd\@tempboxb\kern\@tempdimg\rlap{\box\@tempboxe}}}%
  \setlength\@tempdima\@tempdimi\setlength\@tempdimb\@tempdimj
  \setlength\@tempdimc\@tempdimk\setlength\@tempdimd\@tempdiml
  \setlength\@tempdime\@tempdimm\setlength\@tempdimf\@tempdimn
  \setlength\@tempdimg\@tempdimo\setlength\@tempdimh\@tempdimp}

\def\sfrsrule{\sfrrule{height\@tempdimq width\fboxrule}}
\def\sfrlrule{\sfrrule{height\fboxrule width\@tempdimq}}
\def\sfrrule#1#2#3#4#5#6#7#8#9{%
  \sbox#2{\sfrcalclength{#3}{#4}{#5}\vrule #1}%
  \sfrsetoffsets{\fboxrule}{#4}{#5}#6#7#8#9}

\def\sfrcalclength#1#2#3{%
  \setlength\@tempdimq{#1}%
  \addtolength\@tempdimq{-#2}\addtolength\@tempdimq{-#3}}
\def\sfrsetoffsets#1#2#3#4#5#6#7{%
  \setlength#4#2\setlength#5#3%
  \setlength#6{-#1}\setlength#7{-#1}}

% ******************************
% �       UTILITY FRAMES       �
% ******************************
%
% Separation frames consist of blank space around a box, which forces
% surrounding self-scaling boxes to stretch and leave some space between
% the surrounding frame and its contents.
%
% The generic seperation frame macro takes four parameters:
% \sepbox(LEFTMARGIN, UPPERMARGIN, RIGHTMARGIN, LOWERMARGIN)
% A abbreviation for \mframe(MARGIN,MARGIN,MARGIN,MARGIN) is available too:
% \separbox MARGIN
%
% Instead of \sepbox and \separbox one can use the environment variants
% started by \begin{sepboxed} and \begin{separboxed} and ended by
% \end{sepboxed} and \end{separboxed}.

\newenvironment{sepboxed}%
  {\begingroup\@h@sbxenvironmenttrue\h@Asepbox}%
  {\h@Dsepbox}
\def\sepbox{\begingroup\@h@sbxenvironmentfalse\h@Asepbox}
\def\h@Asepbox(#1,#2,#3,#4){%
  \def\h@sbxlsep{#1}\def\h@sbxtsep{#2}\def\h@sbxrsep{#3}\def\h@sbxbsep{#4}%
  \if@h@sbxenvironment\def\next{\h@Csepbox\ignorespaces}%
                 \else\def\next{\h@Bsepbox}\fi\next}
\long\def\h@Bsepbox#1{\h@Csepbox #1\h@Dsepbox}
\def\h@Csepbox{\sbox\@tempboxa\bgroup\mufoff{\kern\h@sbxlsep}}
\def\h@Dsepbox{{\kern\h@sbxrsep}\egroup
  \setlength\@tempdima{\ht\@tempboxa}\addtolength\@tempdima{\h@sbxtsep}%
  \ht\@tempboxa\@tempdima
  \setlength\@tempdima{\dp\@tempboxa}\addtolength\@tempdima{\h@sbxbsep}%
  \dp\@tempboxa\@tempdima
  \box\@tempboxa\muffin\endgroup}
\newif\if@h@sbxenvironment\@h@sbxenvironmentfalse

\newenvironment{separboxed}[1]%
  {\begin{sepboxed}(#1,#1,#1,#1)}%
  {\end{sepboxed}}
\def\separbox#1{\sepbox(#1,#1,#1,#1)}

% \broadbox{DIMENSION}{CONTENTS} sets CONTENTS in a parbox which has width
% current linewidth minus DIMENSION. Instead of \broadbox{DIMENSION}{CONTENTS}
% one can also use \begin{broadboxed}{DIMENSION}CONTENTS\end{broadboxed}.

\long\def\broadbox#1#2{\vtop{\h@leavespace{#1}\mufoff #2}\muffin}
\newenvironment{broadboxed}[1]%
  {\vtop\bgroup\h@leavespace{#1}\mufoff\ignorespaces}%
  {\egroup\muffin}

% Putting \boxhigh in front of something that is boxed (that is: _in_ the
% box!) suppresses leading vertical blank space. \boxlow does the similar
% thing at the end of the box: put it at the end of the boxed material.

\newif\if@boxhigh
\def\boxhigh{%
  \ifx\h@boxhigh@addvspace\undefined
    \let\addpenalty\@gobble
    \let\h@boxhigh@addvspace=\addvspace
    \def\addvspace{\if@boxhigh
        \ifdim\prevdepth>-4774pt\relax
          \@boxhighfalse\def\next{\h@boxhigh@addvspace}%
        \else\def\next{\@gobble}\fi
      \else\def\next{\h@boxhigh@addvspace}\fi\next}\fi
  \setlength\prevdepth{-4774pt}\@boxhightrue}

\def\boxlow{\unskip}

% ******************************
% �  SOME INTERNAL UTILITIES   �
% ******************************

\h@newdimen\@tempdima\h@newdimen\@tempdimb\h@newdimen\@tempdimc
\h@newdimen\@tempdimd\h@newdimen\@tempdime\h@newdimen\@tempdimf
\h@newdimen\@tempdimg\h@newdimen\@tempdimh\h@newdimen\@tempdimi
\h@newdimen\@tempdimj\h@newdimen\@tempdimk\h@newdimen\@tempdiml
\h@newdimen\@tempdimm\h@newdimen\@tempdimn\h@newdimen\@tempdimo
\h@newdimen\@tempdimp\h@newdimen\@tempdimq
\h@newbox\@tempboxb\h@newbox\@tempboxc\h@newbox\@tempboxd\h@newbox\@tempboxe

\def\h@leavespace#1{%
  \hsize\linewidth\advance\hsize-#1\linewidth\hsize
  \parshape\@ne\@totalleftmargin\linewidth}

\newif\if@squeezing
\newcount\h@tsqo@level
\def\topsqueezeout{%
  \ifx\h@tsqo@addvspace\undefined
    \let\h@tsqo@addvspace=\addvspace
    \def\addvspace{\if@squeezing
        \ifdim\prevdepth>-4774pt\relax
          \@squeezingfalse\def\next{\h@tsqo@addvspace}%
        \else\def\next{\h@tsqo@savesqueeze\h@tsqo@addvspace}\fi
      \else\def\next{\h@tsqo@addvspace}\fi\next}%
    \let\h@tsqo@addpenalty=\addpenalty
    \def\addpenalty{\if@squeezing
        \ifdim\prevdepth>-4774pt\relax
          \@squeezingfalse\def\next{\h@tsqo@addpenalty}%
        \else\def\next{\h@tsqo@savesqueeze\h@tsqo@addpenalty}\fi
      \else\def\next{\h@tsqo@addpenalty}\fi\next}%
  \fi
  \def\topsqueezein{%
    \global\advance\h@tsqo@level-1\relax
    \global\setbox\h@tsqo@currentsqueeze\vbox{%
      \unvbox\h@tsqo@currentsqueeze
      \advance\h@tsqo@level 1\relax
      \unvbox\h@tsqo@currentsqueeze}}%
  \global\advance\h@tsqo@level 1\relax
  \expandafter\expandafter\expandafter\h@newbox\h@tsqo@currentsqueeze
  \global\setbox\h@tsqo@currentsqueeze\vbox{}%
  \setlength\prevdepth{-4774pt}\@squeezingtrue}
\def\topsqueezein{\unvbox\h@tsqo@currentsqueeze
  \global\advance\h@tsqo@level-1\relax}
\def\h@tsqo@currentsqueeze{\csname h@tsqo@squeeze\number\h@tsqo@level\endcsname}
\def\h@tsqo@savesqueeze#1#2{\global\setbox\h@tsqo@currentsqueeze\vbox{%
    \unvbox\h@tsqo@currentsqueeze #1{#2}}}

\newcount\h@bsqo@level
\newcount\h@bsqo@zeros
\newif\if@bsqo@zero
\def\botsqueezeout{\par
  \global\advance\h@bsqo@level 1\relax
  \expandafter\expandafter\expandafter\h@newbox\h@bsqo@currentsqueeze
  \global\setbox\h@bsqo@currentsqueeze\vbox{}%
  \h@bsqo@zeros=0\relax
  \@whilenum\h@bsqo@zeros<3\do{%
    \@bsqo@zerotrue
    \ifdim\lastskip=\z@\relax\unskip\else
      \setlength\@tempskipa\lastskip
      \h@bsqo@savesqueeze\addvspace\@tempskipa
      \unskip\@bsqo@zerofalse\fi
    \ifnum\lastpenalty=\z@\relax\unpenalty\else
      \@tempcnta=\lastpenalty
      \h@bsqo@savesqueeze\addpenalty\@tempcnta
      \unpenalty\@bsqo@zerofalse\fi
    \if@bsqo@zero\advance\h@bsqo@zeros 1\else\h@bsqo@zeros=0\fi}}
\def\botsqueezein{\unvbox\h@bsqo@currentsqueeze
  \global\advance\h@bsqo@level-1\relax}
\def\h@bsqo@currentsqueeze{\csname h@bsqo@squeeze\number\h@bsqo@level\endcsname}
\def\h@bsqo@savesqueeze#1#2{\global\setbox\h@bsqo@currentsqueeze\vbox{%
    #1{#2}\unvbox\h@bsqo@currentsqueeze}}

\providecommand\mufoff{}
\providecommand\muffin{}

\endinput% **********************
% * WARRANTY, DISTRIBUTION ETC. *
% *******************************
%
% This is a TeX style file by Herman Haverkort. This file is distributed
% in the hope that it will be useful, but without any warranty; without
% even the implied warranty of merchantability or fitness for a particular
% purpose. The author does not accept any responsability for any damage,
% loss, injury, psychosis, annoyance, marital problems, murders etc. which
% are caused by this file.
%
% This style file has not been tested systematically, so there are
% probably undiscoverd errors in it. If you find one, if you have
% trouble using this file, if you have a suggestion for an extension or
% another modification, or if you are just a happy user, please report
% it to:
%                       Herman Haverkort
%                       Heyenoordseweg 40
%                      NL-6813 GA  Arnhem
%                      herman@fgbbs.iaf.nl
%
% You are allowed to change this file, but you are not allowed to distribute
% the changed version unless you obey the following:
% -  give the changed file another name than the original one;
% -  record clearly in the changed file:
%    -  the original name of the file;
%    -  its original author;
%    -  that it is a changed version;
% -  do not remove the restrictions on distributing the file.
%
% You are not allowed to take money for the distribution or use of either
% this file or a changed version, except for a nominal charge for copying
% etc.
%
% Have fun!