summaryrefslogtreecommitdiff
path: root/usergrps/uktug/baskervi/5_5/hhflxbox.sty
diff options
context:
space:
mode:
Diffstat (limited to 'usergrps/uktug/baskervi/5_5/hhflxbox.sty')
-rw-r--r--usergrps/uktug/baskervi/5_5/hhflxbox.sty519
1 files changed, 519 insertions, 0 deletions
diff --git a/usergrps/uktug/baskervi/5_5/hhflxbox.sty b/usergrps/uktug/baskervi/5_5/hhflxbox.sty
new file mode 100644
index 0000000000..39ba9b077e
--- /dev/null
+++ b/usergrps/uktug/baskervi/5_5/hhflxbox.sty
@@ -0,0 +1,519 @@
+% 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!
+