summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/float/float.dtx
blob: af6a35b68adf4215a05342c201e6547fc632f317 (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
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
% \iffalse
%% Package `float' to use with LaTeX 2e
%% Copyright (C) 1991-2000 Anselm Lingnau, all rights reserved
%%
% This program can be redistributed and/or modified under the terms
% of the LaTeX Project Public License distributed from CTAN archives
% in the directory macros/latex/base/lppl.txt; either version 1 of
% the License, or (at your option) any later version.
%
% $Id: float.dtx,v 1.8 2001/11/07 23:46:25 anselm Exp $
%
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{float}
%<package>         [2001/11/08 v1.3d Float enhancements (AL)]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{float}
\GetFileInfo{float.sty}
\EnableCrossrefs         
%\DisableCrossrefs   % Say \DisableCrossrefs if index is ready
\RecordChanges                  % Gather update information
\CodelineIndex                  % Index code by line number
\title{An Improved Environment for Floats\thanks{This file
       has version number \fileversion.
       Part of this style option is based on the \textsf{here} option
       by David P. Carlisle (\texttt{carlisle@cs.man.ac.uk}),
       who also provided helpful criticism.}}
\author{Anselm Lingnau\\\texttt{anselm@strathspey.org}}%
\date{\filedate}
\floatstyle{ruled}
\newfloat{Program}{tbp}{lop}[section]
\floatstyle{plain}
\newfloat{Example}{t}{lox}[section]
\floatstyle{boxed}
\restylefloat{table}
\begin{document}
\maketitle
\DocInput{float.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{495}
%
% \changes{v1.3}{18 Jul 2001}{Changed some names to reduce namespace pollution}
% \changes{v1.2d}{29 May 99}{License changed to LPPL}
% \changes{v1.2}{20 Jun 94}{Adapted for LaTeX2e}
% \changes{v1.1d}{17 Dec 92}{Fixed documentation}
%
% \DoNotIndex{\@Mii,\@Miv,\@cons,\@currlist,\@dblarg,\@dbldeferlist}
% \DoNotIndex{\@dblfloat,\@dottedtocline,\@eha,\@ehd,\@Esphack,\@float}
% \DoNotIndex{\@floatpenalty,\@gobble,\@ifnextchar,\@ifundefined,\@ifstar}
% \DoNotIndex{\@latexerr,\@latex@error,\@minipagefalse,\@mkboth,\@namedef}
% \DoNotIndex{\@nameuse,\@parboxrestore,\@setminipage,\@setnobreak,\@spaces}
% \DoNotIndex{\@starttoc,\@tempa,\@tempboxa,\@tempdima,\@tempf,\@undefined}
% \DoNotIndex{\@warning}
% \DoNotIndex{\addcontentsline,\addtocontents,\addtocounter,\advance,\arabic}
% \DoNotIndex{\begingroup,\bfseries,\bgroup,\begin,\box,\chapter}
% \DoNotIndex{\color@endbox,\color@vbox,\columnwidth,\csname,\def,\dimen}
% \DoNotIndex{\docdate,\edef,\egroup,\else,\end,\end@dblfloat,\end@float}
% \DoNotIndex{\endcsname,\endgroup,\endinput,\expandafter,\fi}
% \DoNotIndex{\filedate,\fileversion,\global,\hbadness,\hbox,\hfil,\hrule}
% \DoNotIndex{\hsize,\ht,\if@twocolumn,\ifdim,\iffalse,\ifnum,\iftrue,\ifvoid}
% \DoNotIndex{\ifx,\ignorespaces,\intextsep,\kern,\let,\long}
% \DoNotIndex{\MakeUppercase,\moveleft,\newbox,\newcommand,\newcounter,\newif}
% \DoNotIndex{\newsavebox,\newtoks,\noexpand,\normalcolor,\normalsize}
% \DoNotIndex{\numberline,\outer@nobreak,\PackageError,\PackageWarning}
% \DoNotIndex{\par,\parindent,\parskip,\penalty,\prevdepth,\protect}
% \DoNotIndex{\providecommand,\refstepcounter,\relax,\renewcommand,\reset@font}
% \DoNotIndex{\rmfamily,\section,\setbox,\setcounter,\setlength,\space}
% \DoNotIndex{\textheight,\textwidth,\the,\typeout,\unvbox,\uppercase}
% \DoNotIndex{\vadjust,\value,\vbox,\vrule,\vskip,\vspace,\wd,\xdef}
% \DoNotIndex{\z@skip,\z@}
%
% \begin{abstract}
%   This style option improves the interface for defining floating
%   objects such as figures and tables in \LaTeX{}.
%   It adds the notion of a `float style' that governs appearance
%   of floats.
%   New kinds of floats may be defined using a |\newfloat| command
%   analogous to |\newtheorem|.
%   This style option also incorporates the functionality
%   of David Carlisle's style option \textsf{here},
%   giving floating environments a \texttt{[H]} option
%   which means `PUT IT HERE'
%   (as opposed to the standard \texttt{[h]} option which means
%   `You may put it here if you like').
% \end{abstract}
%
% \section{Introduction}
%
% Among the features of \LaTeX\ are `floating' figures and tables
% that drift from where they appear in the input text to, say, the top
% of a page. The contents and formatting of floats is pretty much up
% to the user, except that there is a |\caption| command that
% governs formatting of the caption --- it is centered if it is short,
% and formatted as a paragraph if it is longer than a single line of text.
% Sometimes other types of floating objects, e.g., algorithms or programs,
% are desirable, but they must be defined by analogy to the existing
% floats since there is no simple command for doing this. This goes
% beyond the knowledge or inclination of the average \LaTeX\ user.
%
% In this style option, I present an interface to floating objects
% that attempts to fix some of these shortcomings.
% First of all, I introduce the notion of a `float style'.
% A float style governs the appearance of a class of floats like a page style
% governs the appearance of a page (\LaTeX\ has page styles \texttt{plain},
% \texttt{empty} and \texttt{headings}, among others). This style option
% provides some exemplary float styles:
% \begin{description}
% \item[plain] This is the float style that \LaTeX\ normally applies to
%   its floats, i.e., nothing in particular. The only difference is
%   that the caption comes out \emph{below} the body of the float,
%   regardless of where it is given in the text.
% \item[plaintop] This is similar to `plain' but the caption always
%   comes out \emph{above} the body of the float.
% \item[boxed] The body of the float is printed inside a box. The caption
%   goes below that box.
% \item[ruled] This float style is patterned on the table style of
%   {\sl Concrete Mathematics}. The caption is printed at the top of the
%   float, surrounded by rules; another rule finishes off the float.
% \end{description}
%
% \begin{Program}
% \begin{verbatim}
% #include <stdio.h>
%
% int main(int argc, char **argv)
% {
%        int i;
%        for (i = 0; i < argc; ++i)
%                printf("argv[%d] = %s\n", i, argv[i]);
%        return 0;
% }
% \end{verbatim}
% \caption{The first program. This hasn't got anything to do with the package
%    but is included as an example. Note the \texttt{ruled} float style.%
%    \label{prog1.1}}
% \end{Program}
% To facilitate the definition of new floating objects, \textsf{float}
% supports the |\newfloat| command. This command is comparable to
% |\newtheorem| in that it allows the user to add a new class of floats
% at the document level. No style option hacking is necessary.
% There's also a |\listof| command that prints a listing of all the
% floats of a given type, like |\listoffigures| and |\listoftables|
% in vanilla \LaTeX.
%
% \section{The User Interface --- New Floats}
%
% \DescribeMacro{\newfloat}
% The most important command in \textsf{float} is the |\newfloat|
% command. As mentioned above, it is patterned on |\newtheorem|.
% The |\newfloat| command takes three required and one optional
% argument; it is of the form\\[2pt]
% \hspace*{\MacroIndent}|\newfloat{|\meta{type}|}{|^^A
%   \meta{placement}|}{|\meta{ext}|}[|\meta{within}{\tt]}\\[2pt]
% \meta{type} is the `type' of the new class of floats, like \texttt{program}
% or \texttt{algorithm}. After the appropriate |\newfloat|, commands
% like |\begin{program}| or |\end{algorithm*}| will be available.
% \meta{placement} gives the default placement parameters for this class
% of floats. The placement parameters are the same as in standard \LaTeX,
% i.e., \texttt{t}, \texttt{b}, \texttt{p} and \texttt{h} for `top', `bottom',
% `page' and `here', respectively.
% When \LaTeX\ writes the captions to an auxiliary file for the list
% of figures (or whatever), it'll use the job name followed by \meta{ext}
% as a file name.
% Finally, the optional argument \meta{within} determines whether floats
% of this class will be numbered within some sectional unit of the document.
% For example, if \meta{within}$=$\texttt{chapter}, the floats will be numbered
% within chapters. (In standard \LaTeX, this happens with figures and tables
% in the \textsf{report} and \textsf{book} document styles.)
% As an example, Program~\ref{prog1.1} above was created by a command
% sequence similar to that shown in the following Example.
% \begin{Example}[H]
% \begin{verse}
% |\floatstyle{ruled}|\\
% |\newfloat{Program}{tbp}{lop}[section]|\\
% \dots\ loads o' stuff \dots\\
% |\begin{Program}|\\
% |\begin{verbatim}|\\
% \dots\ program text \dots\\
% |\end{verbatim}|\\
% |\caption{|\dots\ caption \dots|}|\\
% |\end{Program}|
% \end{verse}
% \caption{This is another silly floating Example. Except that this one
%   doesn't actually float because it uses the {\tt[H]} optional parameter
%   to appear \textbf{Here}. (Gotcha.)}
% \end{Example}
%
% \DescribeMacro{\floatstyle}
% The |\floatstyle| command sets a default float style. This float style
% will be used for all the floats that are subsequently defined using
% |\newfloat|, until another |\floatstyle| command appears.
% The |\floatstyle| command takes one argument, the name of a float
% style. For instance, |\floatstyle{ruled}|. Specifying a string that
% does not name a valid float style is an error.
%
% \DescribeMacro{\floatname}
% The |\floatname| command lets you define the \emph{float name} that
% \LaTeX\ uses in the caption of a float, i.e., `Figure' for a figure
% and so on. For example, |\floatname{program}{Program}|.
% The |\newfloat| command sets the float name to its argument
% \meta{type} if no other name has been specified before.
%
% \DescribeMacro{\floatplacement}
% The |\floatplacement| command resets the default placement specifier
% of a class of floats. E.g., |\floatplacement{figure}{tp}|.
%
% \DescribeMacro{\restylefloat}
% The |\restylefloat| command is necessary to change styles for the
% standard float types \texttt{figure} and \texttt{table}. Since these aren't
% usually defined via |\newfloat|, they don't have a style associated
% with them. Thus you have to say, for example,\\[2pt]
% \hspace*{\MacroIndent}|\floatstyle{ruled}|\\
% \hspace*{\MacroIndent}|\restylefloat{table}|\\[2pt]
% to have tables come out \texttt{ruled}. The command also lets you change
% style for floats that you define via |\newfloat|, although this
% is, typographically speaking, not a good idea.
% See table~\ref{table1} for an example.
% There is a |\restylefloat*| command which will restyle an existing
% float type but will keep the new float style from taking over the
% |\caption| command. In this case the user is responsible for
% handling their own captions.
% \DeleteShortVerb{\|}
% \begin{table} \def\B#1{$\displaystyle{n\choose#1}$}
% \begin{center} \begin{tabular}{c|cccccccc}
% $n$&\B0&\B1&\B2&\B3&\B4&\B5&\B6&\B7\\ \hline
%  0 & 1\\
%  1 & 1&1\\
%  2 & 1&2&1\\
%  3 & 1&3&3&1\\
%  4 & 1&4&6&4&1\\
%  5 & 1&5&10&10&5&1\\
%  6 & 1&6&15&20&15&6&1\\
%  7 & 1&7&21&35&35&21&7&1
% \end{tabular} \end{center}
% \caption{Pascal's triangle. This is a re-styled \LaTeX\ \texttt{table}.%
%   \label{table1}}
% \end{table}
% \MakeShortVerb{\|}
%
% \DescribeMacro{\listof}
% The |\listof| command produces a list of all the floats of a given
% class. Its syntax is\\[2pt]
% \hspace*{\MacroIndent}|\listof{|\meta{type}|}{|\meta{title}^^A
%   |}|\\[2pt]
% \meta{type} is the float type given in the |\newfloat| command.
% \meta{title} is used for the title of the list as well as the headings
% if the current page style includes them. Otherwise, the |\listof|
% command is analogous to the built-in \LaTeX\ commands
% |\listoffigures| and |\listoftables|.
%
% \section{The User Interface --- \texttt{[H]} Placement Specifier}
%
% Many people find \LaTeX's float placement specifiers too restrictive.
% A Commonly Uttered Complaint (CUC) calls for a way to place a float
% exactly at the spot where it occurs in the input file, i.e., to \emph{not}
% have it float at all.
% It seems that the \texttt{[h]} specifier should do that, but in fact it
% only suggests to \LaTeX\ something along the lines of ``put the float
% here if it's OK with you''. As it turns out, \LaTeX\ hardly ever feels
% inclined to actually do that. This situation can be improved by
% judicious manipulation of float style parameters.
%
% The same effect can be achieved by changing the actual method of
% placing floats. David Carlisle's \textsf{here} option introduces a new float
% placement specifier, namely \texttt{[H]}, which, when added to a float,
% tells \LaTeX\ to ``put it HERE, period''. If there isn't enough space
% left on the page, the float is carried over to the next page together
% with whatever follows, even though there might still be room left for
% some of that.
% This style option provides the \texttt{[H]} specifier for newly defined
% classes of floats as well as the predefined \texttt{figure}s and
% \texttt{table}s, thereby superseding \textsf{here}. David suggests
% that the \textsf{here} option be withdrawn from the archives in due course.
%
% The {\tt[H]} specifier may simply be added to the float as an optional
% argument, like all the other specifiers.
% It may \emph{not} be used in conjunction with any other placement
% specifiers, so {\tt[Hhtbp]} is illegal.
% Neither may it be used as the default placement specifier for a whole
% class of floats.
% The following table is
% defined like this:
% \begin{verse}
% |\begin{table}[H]|\\
% |\begin{tabular}{cl}|\\
% |\tt t & Top of the page\\|\\
% \dots\ more stuff \dots\\
% \end{verse}
% (It seems that I have to add some extraneous chatter here just so that
% the float actually comes out right in the middle of a printed page.
% When I \LaTeX ed the documentation just now it turned out that there
% was a page break that fell exactly between the ``So now'' line and the
% float. This wouldn't Prove Anything. Bother.)
% So now we have the following float placement specifiers:
% \begin{table}[H]
% \begin{tabular}{cl}
% \tt t & Top of the page\\
% \tt b & Bottom of the page\\
% \tt p & Page of floats\\
% \tt h & Here, if possible\\
% \tt H & Here, definitely
% \end{tabular}
% ^^A\caption{Could it be that this just needs a caption?}
% \end{table}
%
% \StopEventually{\PrintIndex}
%
% \section{Implementation}
%
% \subsection{Basics}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% In \LaTeX, floats are assigned `type numbers' that are powers of~$2$.
% Since there are only two classes of floats, their type numbers are
% hardwired into the document styles. We need to be somewhat more flexible,
% and thus we initialize a counter to hold the next type number to be
% assigned. This counter will be incremented appropriately later.
%    \begin{macrocode}
\newcounter{float@type}
\@ifundefined{c@figure}%
  {\setcounter{float@type}{1}}%
  {\setcounter{float@type}{4}}
%    \end{macrocode}
% To warm up, we'll look at some of the simpler commands first.
% \begin{macro}{\floatstyle}
% The |\floatstyle| command puts its argument into the
% |\float@style| macro as the name of the new float style.
% But if the argument doesn't denote a float style, an error message
% is output instead: Each float style \meta{style} has a corresponding command
% |\fs@|\meta{style} that contains the appropriate declarations.
% If the control sequence |\fs@|\meta{arg} (which goes with the
% argument \meta{arg} to |\floatstyle|) is undefined, i.e.,
% equals |\relax| under |\ifx|, then the float style \meta{arg}
% is unknown, and we call |\float@error{|\meta{arg}|}| for the
% error message.
%    \begin{macrocode}
\newcommand\floatstyle[1]{\@ifundefined{fs@#1}%
  {\float@error{#1}}%
  {\def\float@style{#1}}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\float@error}
% Here's the error message. |\@eha| is the help message that says
% `Your command was ignored.'
%    \begin{macrocode}
\newcommand\float@error[1]{\PackageError{float}{%
  Unknown float style `#1'
}{\@eha}}
%    \end{macrocode}
% \end{macro}
%
% The next two commands are even simpler. \LaTeX\ says that
% |\fps@|\meta{float} contains the default placement specifier for
% the class of floats \meta{float}. |\fname@|\meta{float} expands
% to the name that appears in \meta{float} captions, e.g., `Figure'.
% (This is our own definition.)
%    \begin{macrocode}
\newcommand\floatname[2]{\@namedef{fname@#1}{#2}}
\newcommand\floatplacement[2]{\@namedef{fps@#1}{#2}}
%    \end{macrocode}
%
%    \begin{macrocode}
\newcommand\floatevery[2]{\csname @float@every@#1\endcsname={#2}}
%    \end{macrocode}
% \begin{macro}{\restylefloat}
% The |\restylefloat| command sets up everything so that subsequent
% commands like |\begin{|\meta{float}|}| use the appropriate
% float style. It defines |\fst@|\meta{float} to expand to a command
% that sets up the currently selected float style (|\fs@|\meta{style}).
% Then it defines the commands |\begin{|\meta{float}|}|,
% |\end{|\meta{float}|}|, |\begin{|\meta{float}|*}| and
% |\end{|\meta{float}|*}|. The |\restylefloat*| command is like
% |\restylefloat| but will leave the captions of that float type
% alone.
% \changes{v1.3c}{17 Aug 2001}{Remove token register leak}
% \changes{v1.3a}{15 Aug 2001}{Introduce star form of `restylefloat}
%    \begin{macrocode}
\newcommand\restylefloat{\@ifstar\float@restyle@\float@restyle}
\newcommand\float@restyle@[1]{\float@restyle{#1}%
  \expandafter\let\csname @float@c@#1\endcsname=\@caption}
\newcommand\float@restyle[1]{\expandafter\edef\csname
  fst@#1\endcsname{\expandafter\noexpand\csname
    fs@\float@style\endcsname}%
   \@namedef{#1}{\@nameuse{fst@#1}%
      \@float@setevery{#1}\@float{#1}}%
   \@namedef{#1*}{\@nameuse{fst@#1}%
      \@float@setevery{#1}\@dblfloat{#1}}%
   \expandafter\let\csname end#1\endcsname\float@end
   \expandafter\let\csname end#1*\endcsname\float@dblend
   \expandafter\let\csname @float@c@#1\endcsname=\float@caption
   \@ifundefined{@float@every@#1}{%
     \expandafter\newtoks\csname @float@every@#1\endcsname}{}%
   \@nameuse{@float@every@#1}={}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\newfloat}
% Now we can explain how to define a new class of floats. Recall that
% the three required arguments to |\newfloat| are \meta{type},
% \meta{placement} and \meta{ext}, respectively. First we save the
% latter two; we also maintain a list of active \meta{ext}s so we can
% later iterate over all currently-open lists of floats.
%    \begin{macrocode}
\newtoks\float@exts
\newcommand\newfloat[3]{\@namedef{ext@#1}{#3}
  \let\float@do=\relax
  \xdef\@tempa{\noexpand\float@exts{\the\float@exts \float@do{#3}}}%
  \@tempa
  \floatplacement{#1}{#2}%
%    \end{macrocode}
% Then we figure out a default value for the `caption name' of this
% class of floats. If the |\fname@|\meta{type} isn't already defined,
% we tentatively use \meta{type} as the name. This is convenient if
% \meta{type} is, say, \texttt{Program}, since no |\floatname| command
% is necessary at all.
%    \begin{macrocode}
  \@ifundefined{fname@#1}{\floatname{#1}{#1}}{}
%    \end{macrocode}
% Then we set up the type number for \LaTeX\ in |\ftype@|\meta{type}.
% Afterwards we have to set the |float@type| to the next greater power
% of two, so that it is ready for the next |\newfloat|. Fortunately,
% we just have to double it by adding. We don't bother checking for overflow
% since it is pretty unlikely that somebody will define 25 different classes
% of floats. Finally, we call |\restylefloat| to define the style and
% commands for this class of floats.
%    \begin{macrocode}
  \expandafter\edef\csname ftype@#1\endcsname{\value{float@type}}%
  \addtocounter{float@type}{\value{float@type}}
  \restylefloat{#1}%
%    \end{macrocode}
% Now all that's left is to assemble the |\fnum@|\meta{type} macro
% that \LaTeX\ wants to use in its captions. Basically it is just
% `caption name'${}+{}$`counter value', disguised so that the command
% \emph{names} appear in the definition instead of their expansions.
%    \begin{macrocode}
  \expandafter\edef\csname fnum@#1\endcsname%
    {\expandafter\noexpand\csname fname@#1\endcsname{}
       \expandafter\noexpand\csname the#1\endcsname}
%    \end{macrocode}
% Finally, we have to take care of the optional argument, \meta{within}.
% If the optional argument is present, we pass control to |\float@newx|.
% Otherwise, we just define the counter for this class of floats.
% By default, the numbers come out |\arabic|.
%    \begin{macrocode}
  \@ifnextchar[{\float@newx{#1}}%
    {\@ifundefined{c@#1}{\newcounter{#1}\@namedef{the#1}{\arabic{#1}}}%
      {}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\float@newx}
% Here we deal with the optional argument to |\newfloat|. We have
% to create a new counter as per |\newcounter{|\meta{type}|}|
% and add that counter to the list of counters to be reset whenever
% counter \meta{within} is stepped. The standard command
% |\newcounter{|\meta{type}|}[|\meta{within}{\tt]} takes care of that.
% However, we can't define the \meta{type} counter if it's already defined.
% While this case is simply ignored when \meta{within} is not present,
% we issue a warning here since what comes out is probably not what the user
% expects.
%    \begin{macrocode}
\def\float@newx#1[#2]{\@ifundefined{c@#1}{\newcounter{#1}[#2]%
    \expandafter\edef\csname the#1\endcsname{%
      \expandafter\noexpand\csname
        the#2\endcsname.\noexpand\arabic{#1}}}%
    {\PackageWarning{float}{Can't redefine counter variable for #1.}}}
%    \end{macrocode}
% \end{macro}
% 
% \subsection{Adapting \LaTeX\ internals}
%
% We have to adapt some of \LaTeX's internal macros to our needs.
% There are several things that have to be changed around
% in order to provide the functionality of David Carlisle's \textsf{here}.
% The following is thus lifted from \textsf{here}, with changes and with
% David's permission:
%
% \begin{macro}{\@float@Hx}
% We save the original version of |\@xfloat|. (This macro is called from
% |\@float|, which we used above to define the environment commands for a
% new class of floats.)
%    \begin{macrocode}
\let\@float@Hx\@xfloat
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\@xfloat}
% The new version of |\@xfloat| looks for a |[H]| argument.
% If it is present |\@float@HH| is called, otherwise the original macro
% (renamed to |\@float@Hx|) is called.
%    \begin{macrocode}
\def\@xfloat#1[{\@ifnextchar{H}{\@float@HH{#1}[}{\@float@Hx{#1}[}}
%    \end{macrocode}
% \end{macro}
% Later on we'll need a box to save a |[H]| float.
%    \begin{macrocode}
\newsavebox\float@box
\newif\if@flstyle
%    \end{macrocode}
% \begin{macro}{\@float@HH}
% First gobble the |[H]|. Note that \texttt{H} should not be used in
% conjunction with the other placement options, nor as the value of the
% default placement, as set in |\fps@|{\it type}.
%    \begin{macrocode}
\def\@float@HH#1[H]{%
%    \end{macrocode}
% Locally redefine the end of the environment.
%    \begin{macrocode}
  \expandafter\let\csname end#1\endcsname\float@endH
%    \end{macrocode}
% We don't get a |\@currbox| if we don't actually use the float mechanism.
% Therefore we fake one using the |\float@box| defined above.
%    \begin{macrocode}
  \let\@currbox\float@box
%    \end{macrocode}
% Now we save the current float class name for use in constructing the
% |\caption|. The caption box (defined below) is initialised to an empty
% box to avoid trouble with floats not having a caption. Then we start the
% box that'll hold the float itself.
% |\parindent| is set to zero for compatibility with the standard \texttt{[h]}
% option.
% \changes{v1.2c}{29 Mar 95}{Bring H floats more in line with normal floats}
%    \begin{macrocode}
  \def\@captype{#1}\setbox\@floatcapt=\vbox{}%
  \expandafter\ifx\csname fst@#1\endcsname\relax
    \@flstylefalse\else\@flstyletrue\fi
  \setbox\@currbox\color@vbox\normalcolor
    \vbox\bgroup \hsize\columnwidth \@parboxrestore
      \@floatboxreset \@setnobreak
%    \end{macrocode}
% The final |\ignorespaces| is needed to gobble any spaces or newlines
% after the {\tt[H]} tokens.
%    \begin{macrocode}
  \ignorespaces}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\newtoks\@float@everytoks
\let\@float@boxreset=\@floatboxreset
\def\@floatboxreset{\@float@boxreset\the\@float@everytoks}
\def\@float@setevery#1{\@float@everytoks=\@nameuse{@float@every@#1}}
%    \end{macrocode}
%
% \begin{macro}{\float@makebox}
% Basically, we must arrange for `style commands' to be executed
% at certain points during the generation of the float.
% \LaTeX\ puts a float into a vertical box |\@currbox| which it takes
% off a list of empty boxes for insertions. When the |\float@makebox| macro
% is called, |\@currbox| contains the complete float, minus the caption
% --- we'll see later that we use our own |\caption| command to
% put the caption into a |\vbox| of its own. This is the only way
% we can control the position of the caption by the float style,
% regardless of where the caption appears in the float's input text itself.
% So the `style commands' are |\@fs@pre|, which is inserted at the
% very beginning of the float, |\@fs@mid|, which comes between the
% float and the caption (or the caption and the float, if captions are put
% at the top), and |\@fs@post|, which finishes off the float.
% The caption may appear at the top or at the bottom of the float,
% as defined by |\@fs@iftopcapt|. Therefore, before we hand the
% float to \LaTeX\ for positioning, it is taken apart and reassembled
% using the style commands.
% \changes{v1.3a}{15 Aug 2001}{Changed `ifvbox to `ifvoid}
%    \begin{macrocode}
\newcommand\float@makebox[1]{%
  \vbox{\hsize=#1 \@parboxrestore
    \@fs@pre\@fs@iftopcapt
      \ifvoid\@floatcapt\else\unvbox\@floatcapt\par\@fs@mid\fi
      \unvbox\@currbox
    \else\unvbox\@currbox
      \ifvoid\@floatcapt\else\par\@fs@mid\unvbox\@floatcapt\fi
    \fi\par\@fs@post\vskip\z@}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\float@end}
% The internal macro |\end@float| appears here under the name of |\float@end|.
% The main thing which is changed is that we call |\float@makebox| to
% reconstruct the float according to the float style.
% We want to do exactly what the \LaTeX\ kernel does without copying
% actual kernel code if we can help it; therefore we finish off the
% float using the kernel |\@endfloatbox|, then replace \LaTeX's
% contents of the |\@currbox| with our own processed version, and then
% hand the thing off to \LaTeX again. Of course we have already done
% |\@endfloatbox|, which comes at the beginning of |\end@float|, ourselves;
% therefore we neutralize it before calling |\end@float|. This doesn't
% matter since we're in a group anyway (we wanted to keep the style
% commands local), so everything is undone at the end of the environment.
% \changes{v1.3d}{08 Nov 2001}{Removed an extraneous level of grouping}
% \changes{v1.3b}{17 Aug 2001}{Still another new method}
% \changes{v1.3}{18 Jul 2001}{Simplified according to H. A. Sommerfeldt}
% \changes{v1.2a}{29 Mar 95}{Fixed float end handling for LaTeX2e of Dec94}
%    \begin{macrocode}
\newcommand\float@end{\@endfloatbox
  \global\setbox\@currbox\float@makebox\columnwidth
  \let\@endfloatbox\relax\end@float}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\float@endH}
% The |\float@endH| command is, again, derived from \textsf{here}. It'll
% deal correctly with a non-floating float, inserting the proper amounts
% of white space above and below.
% \changes{v1.3b}{18 Aug 2001}{Move more processing to LaTeX kernel}
% \changes{v1.2c}{29 Mar 95}{Bring H floats more in line with normal floats}
%    \begin{macrocode}
\newcommand\float@endH{\@endfloatbox\vskip\intextsep
  \if@flstyle\setbox\@currbox\float@makebox\columnwidth\fi
  \box\@currbox\vskip\intextsep\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\float@dblend}
% The |\float@dblend| command finishes up double-column floats. This
% uses the same approach as |\float@end| above. It seems to work.
% \changes{v1.3b}{17 Aug 2001}{Still another new method}
% \changes{v1.3}{18 Jul 2001}{Rewritten after H. A. Sommerfeldt}
% \changes{v1.2e}{09 Mar 2000}{Fixed bug in double-column floats}
% \changes{v1.2a}{29 Mar 95}{Fixed float end handling for LaTeX2e of Dec94}
%    \begin{macrocode}
\newcommand\float@dblend{\@endfloatbox
  \global\setbox\@currbox\float@makebox\textwidth
  \let\@endfloatbox\relax\end@dblfloat}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Captions and lists of floats}
%
% Now for the caption routines.
% We use a box, |\@floatcapt|, to hold the caption while the float
% is assembled.
%    \begin{macrocode}
\newsavebox\@floatcapt
%    \end{macrocode}
%
% \begin{macro}{\caption}
% This is the only \LaTeX\ macro that this document style supersedes.
% Our |\caption| command checks whether there is a custom style
% defined for the current float (whose type can be found in |\@captype|).
% If so, the caption routines from \textsf{float} are used, otherwise
% (or when the float style has been applied via |\restylefloat*| so
% that captions aren't handled by this package)
% we call the vanilla \LaTeX\ routines.
%    \begin{macrocode}
\renewcommand\caption{%
  \ifx\@captype\@undefined
    \@latex@error{\noexpand\caption outside float}\@ehd
    \expandafter\@gobble
  \else
    \refstepcounter\@captype
    \let\@tempf\@caption
    \expandafter\ifx\csname @float@c@\@captype\endcsname\relax\else
      \expandafter\expandafter\let
        \expandafter\@tempf\csname @float@c@\@captype\endcsname\fi\fi
  \@dblarg{\@tempf\@captype}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\float@caption}
% The |\float@caption| macro takes care of entering the caption into
% the appropriate listing. It also controls the typesetting of the caption
% itself, although a style-dependent macro |\@fs@capt| is called
% to handle the specifics. Note that because the caption is saved in a box
% instead of being output to the float right away, you cannot simply put
% a legend after the caption proper; it has to follow the |\caption|
% command in an optional argument.
%
% First of all, we call |\addcontentsline| to update the list of
% floats of this class. Note that |\float@caption| is |\long|
% to allow for paragraph breaks in its arguments.
%    \begin{macrocode}
\long\def\float@caption#1[#2]#3{\addcontentsline{\@nameuse{ext@#1}}{#1}%
   {\protect\numberline{\@nameuse{the#1}}{\ignorespaces #2}}
%    \end{macrocode}
% Now we collect the caption proper. The caption name and number are
% taken from |\fnum@|\meta{float}, where \meta{float} is the class
% of float we're currently handling.
%    \begin{macrocode}
  \global\setbox\@floatcapt\vbox\bgroup\@parboxrestore
    \normalsize\@fs@capt{\@nameuse{fnum@#1}}{\ignorespaces #3}%
%    \end{macrocode}
% Finally we check for the presence of the optional argument. If there is
% one, we call |\float@ccon| to pick it up; otherwise, the |\egroup|
% finishes off the box.
%    \begin{macrocode}
    \@ifnextchar[{\float@ccon}{\egroup}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\float@ccon}
% The |\float@ccon| macro expands to the optional argument of a
% |\caption| command, followed by |\par\egroup|. Note that this
% precludes using |\verb| \& Co.\ in the optional argument; the
% interested reader is urged to fix this problem as an exercise.
%    \begin{macrocode}
\long\def\float@ccon[#1]{#1\par\egroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\listof}
% The |\listof| command reads the desired list of floats from the
% appropriate auxiliary file. The file is then restarted.
% First of all, we check whether the float style that's supposed to be
% listed is actually defined. If not, we output a |\float@error|.
%    \begin{macrocode}
\newcommand*{\listof}[2]{%
  \@ifundefined{ext@#1}{\float@error{#1}}{%
%    \end{macrocode}
% All's well until now. We define the |\l@|\meta{float} command
% that \LaTeX\ needs for formatting the list, and then typeset the
% appropriate list header.
%    \begin{macrocode}
    \@namedef{l@#1}{\@dottedtocline{1}{1.5em}{2.3em}}%
    \float@listhead{#2}%
%    \end{macrocode}
% Next we call |\@starttoc| with the correct file extension
% to do the actual work.
% If |\parskip| is non-zero, vertical space would be added between
% the individual list entries. To avoid this, we zero |\parskip|
% locally. This should be done after the |\float@listhead| above since
% |\parskip| also influences the spacing of headings, and the listings
% would look different from other chapters otherwise. (Suggested by
% Markus Kohm.)
% \changes{v1.3c}{17 Aug 2001}{Set parskip to zero for listing}
%    \begin{macrocode}
    \begingroup\setlength{\parskip}{\z@}%
      \@starttoc{\@nameuse{ext@#1}}%
    \endgroup}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\float@listhead}
% This command generates the beginning of a list of floats.
% Currently the list appears at the chapter or the section level, depending
% on whether chapters are supported in the document class. According to
% a suggestion from Markus Kohm, this is now in a separate command so it
% can be overridden by other packages. We also use |\MakeUppercase| instead
% of |\uppercase|; when this piece of code was first written |\MakeUppercase|
% hadn't been invented yet, and for some reason this never got updated.
% \changes{v1.3}{18 Jul 2001}{Factored out list-of-float starting code}
%    \begin{macrocode}
\providecommand*{\float@listhead}[1]{%
  \@ifundefined{chapter}{\def\@tempa{\section*}}%
    {\def\@tempa{\chapter*}}%
  \@tempa{#1\@mkboth{\MakeUppercase{#1}}{\MakeUppercase{#1}}}}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\float@addtolists}
% This command allows \LaTeX\ programmers to add something to all
% currently-defined lists of floats, such as some extra vertical
% space at the beginning of a new chapter in the main text
% (|\float@addtolists{\protect\addvspace{10pt}}|), without knowing
% exactly which lists of floats are currently being constructed.
% This command currently does \emph{not} operate on the |lot| and |lof|
% lists.
% \changes{v1.3}{18 Jul 2001}{Added command}
%    \begin{macrocode}
\newcommand\float@addtolists[1]{%
  \def\float@do##1{\addtocontents{##1}{#1}} \the\float@exts}
%    \end{macrocode}
% \end{macro}
%
% \section{The Float Styles}
%
% Finally, we define the standard float styles that were outlined
% in the Introduction. Every float style \meta{style} corresponds to a
% command |\fs@|\meta{style} which contains the definitions of the
% style commands, namely
% \begin{center}\begin{tabular}{rl}
% |\@fs@pre|&top of the float\\
% |\@fs@mid|&between float and caption\\
% |\@fs@post|&bottom of the float\\
% |\@fs@capt|&formatting routine for caption\\
% |\@fs@cfont|&font for caption name \& number
% \end{tabular}\end{center}
%
% \begin{macro}{\floatc@plain}
% The |\floatc@plain| macro formats a caption the way \LaTeX\ does
% it: if the caption is fairly short, it is centered, otherwise it is
% formatted as a paragraph. The only difference is that the portion
% containing the caption name and number uses the |\@fs@captfont|.
%    \begin{macrocode}
\newcommand\floatc@plain[2]{\setbox\@tempboxa\hbox{{\@fs@cfont #1:} #2}%
  \ifdim\wd\@tempboxa>\hsize {\@fs@cfont #1:} #2\par
    \else\hbox to\hsize{\hfil\box\@tempboxa\hfil}\fi}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\fs@plain}
% The \texttt{plain} float style is similar to what \LaTeX\ does of its
% own accord; the only difference is that the caption is guaranteed
% to come out at the bottom of the float.
% \changes{v1.3a}{15 Aug 2001}{Use `abovecaptionskip rather than
%    hard-coded value}
%    \begin{macrocode}
\newcommand\fs@plain{\def\@fs@cfont{\rmfamily}\let\@fs@capt\floatc@plain
  \def\@fs@pre{}\def\@fs@post{}%
  \def\@fs@mid{\vspace\abovecaptionskip\relax}%
  \let\@fs@iftopcapt\iffalse}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\fs@plaintop}
% The \texttt{plaintop} float style is similar to the \texttt{plain}
% float style except that the caption comes out at the top.
%   \changes{v1.3}{18 Jul 2001}{Added plaintop float style}
%   \changes{v1.3a}{15 Aug 2001}{Use `belowcaptionskip rather than
%      hard-coded value}
%    \begin{macrocode}
\newcommand\fs@plaintop{\fs@plain
  \def\@fs@mid{\vspace\belowcaptionskip\relax}%
  \let\@fs@iftopcapt\iftrue}
\let\floatc@plaintop=\floatc@plain
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\floatc@ruled}
% The |\floatc@ruled| command is even simpler than the
% |\floatc@plain| macro. The caption is simply printed `as is'.
%    \begin{macrocode}
\newcommand\floatc@ruled[2]{{\@fs@cfont #1} #2\par}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\fs@ruled}
% In the \texttt{ruled} float style, the caption appears at the top of the
% float, preceded and followed by horizontal rules.
% Another rule followes the whole of the float.
%    \begin{macrocode}
\newcommand\fs@ruled{\def\@fs@cfont{\bfseries}\let\@fs@capt\floatc@ruled
  \def\@fs@pre{\hrule height.8pt depth0pt \kern2pt}%
  \def\@fs@post{\kern2pt\hrule\relax}%
  \def\@fs@mid{\kern2pt\hrule\kern2pt}%
  \let\@fs@iftopcapt\iftrue}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\fs@boxed}
% The \texttt{boxed} float style puts the float into a box (which is slightly
% larger than the usual |\textwidth|). The caption appears below
% the box.
% \changes{v1.2b}{29 Mar 95}{Fixed bug in boxed floatstyle}
%    \begin{macrocode}
\newcommand\fs@boxed{\def\@fs@cfont{\bfseries}\let\@fs@capt\floatc@plain
  \def\@fs@pre{\setbox\@currbox\vbox{\hbadness10000
    \moveleft3.4pt\vbox{\advance\hsize by6.8pt
      \hrule \hbox to\hsize{\vrule\kern3pt
        \vbox{\kern3pt\box\@currbox\kern3pt}\kern3pt\vrule}\hrule}}}%
  \def\@fs@mid{\kern2pt}%
  \def\@fs@post{}\let\@fs@iftopcapt\iffalse}
%    \end{macrocode}
% \end{macro}
%
% Before we finish, we set the float style to \texttt{plain}.
%    \begin{macrocode}
\floatstyle{plain}
%    \end{macrocode}
% Other float styles can be added without much ado.
% If there are many more float styles, it should be worthwhile
% to invent a scheme similar to that used in Frank Mittelbach's
% \textsf{theorem} option in order to conserve space, i.e., put the
% float styles into individual files that can be loaded on demand.
% I would like to hear from people who define interesting
% float styles.
% \PrintChanges
% \Finale
% \end{document}
\endinput