summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/captdef/captdef.tex
blob: afa928a4b530c14b0fdfae00f784c44c2e60d278 (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
\documentclass[a4paper]{article}
\usepackage[a4paper]{geometry}
\usepackage{miscdoc}
\usepackage[scaled=0.85]{luximono}
\begin{document}
\title{The \Package{captdef} package}
\author{Robin Fairbairns\thanks{Email: \emph{rf10@cam.ac.uk}}}
\maketitle

\section{Why this package?}

\LaTeX{} provides a command (\cs{caption}) for adding a caption to a
float environment (that is to say, a \texttt{figure} or a
\texttt{table}, ``out of the box'').

The command is a good one, and many users want to use it.  Often,
they end up using a float environment, in a case where it's not
strictly necessary, and get entangled in the positioning problems
that floats pose for the innocent user.  Using this package, the
user can have standard-looking captions without the need of a float
environment.

This package defines a means of defining caption commands, which
creates things that look as if they were created by \cs{caption}, and
which work outside of a float.

The \textsf{float} package provides an alternative to
\cs{captdef}-defined commands, in the float \texttt{[H]} option
(``place the environment \emph{here} without doing any of this
floating stuff'').  So why use \Package{captdef}?\,---\,its great
advantage is simplicity; you load it, and it defines just \emph{three}
macros, while \textsf{float} defines lots and lots.  (Of course, if
you need others of \textsf{float}'s capabilities, \textsf{captdef}
loses its advantage\dots).

\section{How the package works}

The package defines a command
\begin{quote}
  \cmdinvoke*{DeclareCaption}{command}{counter}
\end{quote}
which creates a `caption'-like command, which uses \texttt{counter}
for its numbering.

The package then goes on to declare the commonly-needed caption
commands \cs{figcaption} and \cs{tabcaption}:
\begin{quote}
  \cmdinvoke{captdef}{\cs{figcaption}}{figure}\\
  \cmdinvoke{captdef}{\cs{tabcaption}}{table}
\end{quote}

\section{The potential problem}

Commands defined by \cs{captdef} place a caption in text, and also step the
\environment{figure} (or \environment{table} or whatever) counter.  The float
environments do the same.

Now, consider the sequence:
\begin{quote}
\begin{verbatim}
<earlier text>
\begin{figure}
  <figure stuff>
  \caption{...}
\end{figure}
...
<intervening text>
...
<inline figure stuff>
\figcaption{...}
\end{verbatim}
\end{quote}
and suppose the \environment{figure} environment doesn't fit anywhere
between where it's specified and the inline figure (so that it will
float to somewhere later).

We will then see a document with
\begin{quote}
\meta{earlier text}\\
\dots\\
\meta{intervening text}\\
\dots\\
\meta{inline figure stuff}\\
Figure \meta{n+1}: \dots\\
\dots\\
\meta{yet more text}\\
\dots\\
\meta{figure stuff}\\
Figure \meta{n}: \dots
\end{quote}
That is, the figure numbers have got out of order, because the
floating figure was specified before the inline figure.

\LaTeX{} won't do this when everything is specified as a float: it
keeps floats of the same type in order (which is why floats stack up
if a single one won't fit).

The moral of that little tale is to say: don't use
\cs{captdef}-defined commands with floats of the same type in the same
document.  (Or be extra-specially careful about what's happening if
you must.)
\end{document}