summaryrefslogtreecommitdiff
path: root/usergrps/uktug/baskervi/5_5/hhflxbox.sty
blob: 39ba9b077ec6fb1636c8c431c08107d928f5aa37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
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!