ltfloat.dtx

Johannes Braams  David Carlisle  Alan Jeffrey
Leslie Lamport  Frank Mittelbach  Chris Rowley

Rainer Schöpf

1995/12/07

1 Floats

The different types of floats are identified by a ⟨type⟩ name, which is the name of the counter for that kind of float. For example, figures are of type ‘figure’ and tables are of type ‘table’. Each ⟨type⟩ has associated a positive ⟨type number⟩, which is a power of two. E.g., figures might be have type number 1, tables type number 2, programs type number 4, etc.

The locations where a float can go are specified by a ⟨placement specifier⟩, which is a list of the possible locations, each denoted by a letter as follows:

h : here — at the current location in the text.
t : top  — at the top of a text page.
b : bottom — at the bottom of a text page.
p : page — on a separate float page

In addition, in conjunction with these, you can use ‘!’ which means that the current values of the float positioning parameters are ignored for this float. (Has no effect on ‘p’, float page positioning.) For example, ‘pht’ specifies that the float can appear in any of three locations: page, here or top.

1.1 Floating Environments

1 ⟨∗2ekernel⟩

 2 \message{floats,}

Where floats may appear on a page, and how many may appear there are specified by the following float placement parameters. The numbers are named like counters so the user can set them with the ordinary counter-setting commands.

\c@topnumber : Number of floats allowed at the top of a column. \topfraction : Fraction of column that can be devoted to floats.

\c@dbltopnumber, \dbltopfraction

: Same as above, but for double-column floats.

\c@bottomnumber, \bottomfraction

: Same as above for bottom of page.

\c@totalnumber : Number of floats allowed in a single column,

including in-text floats.

\textfraction :Minimum fraction of column that must contain text. \floatpagefraction: Minimum fraction of page that must be taken

up by float page.

\dblfloatpagefraction

: Same as above, for double-column floats.

The document style must define the following.

\fps@TYPE : The default placement specifier for floats of type TYPE.

\ftype@TYPE : The type number for floats of type TYPE.

\ext@TYPE : The file extension indicating the file on which the

contents list for float type TYPE is stored. For example, \ext@figure = ’lof’.

\fnum@TYPE : A macro to generate the figure number for a caption.

                For example, \fnum@TYPE == Figure \thefigure.
  \@makecaption{NUM}{TEXT} :

A macro to make a caption, with NUM the value produced by \fnum@... and TEXT the text of the caption. It can assume it’s in a \parbox of the appropriate width.

\@float{TYPE}[PLACEMENT] : This macro begins a float environment for a

single-column float of type TYPE with PLACEMENT as the placement

specifier. The default value of PLACEMENT is defined by \fps@TYPE. The environment is ended by \end@float.

   E.g., \figure == \@float{figure}, \endfigure == \end@float.

\@float{TYPE}[PLACEMENT] == BEGIN

if hmode then \@bsphack

                 \@floatpenalty := -10002
            else \@floatpenalty := -10003

fi

   \@captype ==L TYPE

\@dblflset

\@fps ==L PLACEMENT

\@onelevel@sanitize \@fps

add default PLACEMENT if at most ! in PLACEMENT ==

\@fpsadddefault

if inner

then LaTeX Error: ’Not in outer paragraph mode.’

       \@floatpenalty := 0

else if \@freelist nonempty

         then \@currbox :=L head of \@freelist
              \@freelist :=G tail of \@freelist
              \count\@currbox :=G 32*\ftype@TYPE +

bits determined by

PLACEMENT

         else \@floatpenalty := 0

LaTeX Error: ’Too many unprocessed floats’ fi

fi

\@currbox :=G \color@vbox
                  \normalcolor
                    \vbox{

%% 15 Dec 87 –

                     %% removed \boxmaxdepth :=L 0pt

%% that made box 0 depth because it screwed %% things up. Instead, added \vskip0pt at

end

                          \hsize = \columnwidth
                          \@parboxrestore
                          \@floatboxreset

END

\caption ==

BEGIN

\refstepcounter{\@captype}
\@dblarg{\@caption{\@captype}}

END

In following definition, \par moved from after \addcontentsline to before \addcontentsline because the \write could cause an extra blank line to be added to the paragraph above the caption. (Change made 12 Jun 87)

\@caption{TYPE}[STEXT]{TEXT} == BEGIN

\par

\addcontentsline{\ext@TYPE}{TYPE}{\numberline{\theTYPE}{STEXT}}
\begingroup
  \@parboxrestore
  \@normalsize
  \@makecaption{\fnum@TYPE}{TEXT}
  \par
\endgroup

END

\@dblfloat{TYPE}[PLACEMENT] : Macro to begin a float environment for

a double-column float of type TYPE with PLACEMENT as the placement

specifier. The default value of PLACEMENT is ’tp’ The environment is ended by \end@dblfloat.

E.g., \figure* == \@dblfloat{figure},
      \endfigure* == \end@dblfloat.

\@dblfloat{TYPE}[PLACEMENT] ==

Identical to \@float{TYPE}[PLACEMENT] except \hsize and

\linewidth
are set to \textwidth.

3 \newcount\@floatpenalty

4 \def\caption{\refstepcounter\@captype \@dblarg{\@caption\@captype}}

\@caption
5 \long\def\@caption#1[#2]#3{\par\addcontentsline{\csname
6 ext@#1\endcsname}{#1}{\protect\numberline{\csname
7 the#1\endcsname}{\ignorespaces #2}}\begingroup
8  \@parboxrestore
9  \normalsize
10  \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
11 \endgroup}
\@float \@dblflset
12 \def\@float#1{%
13 \@ifnextchar[{\@xfloat{#1}}{\edef\reserved@a{\noexpand\@xfloat
14  {#1}[\csname fps@#1\endcsname]}\reserved@a}}

\@dblfloat
15 \def\@dblfloat{%
16 \if@twocolumn\let\reserved@a\@dbflt\else\let\reserved@a\@float\fi
17 \reserved@a}

\fps@dbl Note that all double floats have default fps ‘tp’.

\@setfps This sets the fps, dealing with error conditions by adding the default.

\@xfloat The first part of this sets the count register that stores all the information about

the type and fps of the float.

We assume here that the default specifiers already contain no active characters. It may be better to store the defaults as numbers, rather than symbol strings.

18 \def\@xfloat #1[#2]{%
19 \def \@captype {#1}%
20 \def \@fps {#2}%
21 \@onelevel@sanitize \@fps
22 \def \reserved@b {!}%
23 \ifx \reserved@b \@fps
24  \@fpsadddefault
25 \else
26  \ifx \@fps \@empty
27  \@fpsadddefault
28  \fi
29 \fi
30 \ifhmode
31  \@bsphack
32  \@floatpenalty -\@Mii
33 \else
34  \@floatpenalty-\@Miii
35 \fi
36 \ifinner
37  \@parmoderr\@floatpenalty\z@
38 \else
39  \@next\@currbox\@freelist
40  {%
41  \@tempcnta \sixt@@n
42  \expandafter \@tfor \expandafter \reserved@a
43  \expandafter :\expandafter =\@fps
44  \do
45  {%
46  \if \reserved@a h%
47  \ifodd \@tempcnta
48  \else
49  \advance \@tempcnta \@ne
50  \fi
51  \fi
52  \if \reserved@a t%
53  \@setfpsbit \tw@

54  \fi
55  \if \reserved@a b%
56  \@setfpsbit 4%
57  \fi
58  \if \reserved@a p%
59  \@setfpsbit 8%
60  \fi
61  \if \reserved@a !%
62  \ifnum \@tempcnta>15
63  \advance\@tempcnta -\sixt@@n\relax
64  \fi
65  \fi
66  }%
67  \@tempcntb \csname ftype@\@captype \endcsname
68  \multiply \@tempcntb \@xxxii
69  \advance \@tempcnta \@tempcntb
70  \global \count\@currbox \@tempcnta
71  }%
72  \@fltovf
73 \fi

The remainder sets up the box in which the float is typeset, and the typesetting enevironment to be used. It is essential to have the extra box to avoid the unwanted space that would otherwise often be put at the top of the float.

It ends with a hook; not sure how useful this is but it is needed at present to deal with double-column floats.

74 \global \setbox\@currbox
75  \color@vbox
76  \normalcolor
77  \vbox \bgroup
78  \hsize\columnwidth \@parboxrestore
79  \@floatboxreset

80 }

\@floatboxreset The default value of this is empty, for one-column floats.

81 \def \@floatboxreset {%
82  \reset@font
83  \normalsize
84  \@setnobreak
85  \@setminipage

86 }

\@setnobreak
87 \def \@setnobreak{%
88 \if@nobreak
89  \def\outer@nobreak{\global\@nobreaktrue}%
90  \global\@nobreakfalse
91 \fi

92 }

\@setminipage
 93 \def \@setminipage{%
 94 \global\@minipagetrue
 95 \everypar{\global\@minipagefalse\everypar{}}%

96 }

\end@float
 97 \def\end@float{%
 98 \@endfloatbox
 99 \ifnum\@floatpenalty <\z@

We make sure that we never exceed \textheight, otherwise float will never get typeset (91/03/15 FMi).

100  \@largefloatcheck
101  \@cons\@currlist\@currbox
102  \ifnum\@floatpenalty <-\@Mii
103  \penalty -\@Miv
104  \@tempdima\prevdepth    %% saving and restoring \prevdepth added
105  \vbox{}%                %% 26 May 87 to prevent extra vertical
106  \prevdepth \@tempdima   %% space when used in vertical mode
107  \penalty\@floatpenalty
108  \else
109  \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack
110  \fi
111 \fi

112 }

\end@dblfloat
113 \def\end@dblfloat{%
114 \if@twocolumn
115 \@endfloatbox
116 \ifnum\@floatpenalty <\z@

We make sure that we never exceed \textheight, otherwise float will never get typeset (91/03/15 FMi).

117  \@largefloatcheck
118  \@cons\@dbldeferlist\@currbox
119 \fi

RmS 92/03/18 changed \@esphack to \@Esphack.

120  \ifnum \@floatpenalty =-\@Mii \@Esphack\fi
121 \else
122 \end@float
123 \fi

124 }

\@endfloatbox This macro is not intended to be a hook; it is designed to help maintain the integrity of this code, which is used twice and, as can be seen, is subject to frequent changes.

125 \def \@endfloatbox{%
126  \par\vskip\z@skip      %% \par\vskip\z@ added 15 Dec 87

127 %    \begin{macrocode}
128  \global\@minipagefalse
129  \outer@nobreak
130  \egroup                  %% end of vbox
131 \color@endbox

132 } 133 %

134 % \begin{macro}{\outer@nobreak}
135 % \changes{v1.0h}{1994/05/20}{Macro added: default is to do nothing.}
136 %    \begin{macrocode}
137 \let\outer@nobreak\@empty

\@largefloatcheck This calculates by how much a float is oversize for the page and prints this in a warning message.

138 \def \@largefloatcheck{%
139 \ifdim \ht\@currbox>\textheight
140  \@tempdima -\textheight
141  \advance \@tempdima \ht\@currbox
142  \@latex@warning {Float too large for page by \the\@tempdima}%
143  \ht\@currbox \textheight
144 \fi

145 }

\@dbflt \@xdblfloat
146 \def\@dbflt#1{\@ifnextchar[{\@xdblfloat{#1}}{\@xdblfloat{#1}[tp]}}
147 \def\@xdblfloat#1[#2]{%
148 \@xfloat{#1}[#2]\hsize\textwidth\linewidth\textwidth}

Moved to ltoutput 93/12/16

149 %\newcount\c@topnumber
150 %\newcount\c@dbltopnumber
151 %\newcount\c@bottomnumber
152 %\newcount\c@totalnumber
    An analysis of \@floatplacement:

This should be called whenever \@colht has been set.

153 \def\@floatplacement{\global\@topnum\c@topnumber
154  % Textpage bit, global:
155 \global\@toproom \topfraction\@colht
156 \global\@botnum  \c@bottomnumber
157 \global\@botroom \bottomfraction\@colht
158 \global\@colnum  \c@totalnumber
159  % Floatpage bit, local:
160 \@fpmin   \floatpagefraction\@colht}

\@dblfloatplacement This should be called only within a group. Now changed to provide extra checks in \@addtodblcol, needed when processing a BANG float.

161 \def \@dblfloatplacement {%

Textpage bit: global, but need not be.

162 \global \@dbltopnum \c@dbltopnumber
163 \global \@dbltoproom \dbltopfraction\@colht

This new bit uses \@textmin to locally store the amount of extra room in the column.

164 \@textmin \@colht
165 \advance \@textmin -\@dbltoproom

Floatpage bit: must be local.

166 \@fpmin \dblfloatpagefraction\textheight
167 \@fptop \@dblfptop
168 \@fpsep \@dblfpsep
169 \@fpbot \@dblfpbot

170 }

MARGINAL NOTES:

Marginal notes use the same mechanism as floats to communicate with the \output routine. Marginal notes are distinguished from floats by having a negative placement specification. The command \marginpar [LTEXT]{RTEXT} generates a marginal note in a parbox, using LTEXT if it’s on the left and RTEXT if it’s on the right. (Default is RTEXT = LTEXT.) It uses the following parameters.

\marginparwidth : Width of marginal notes. \marginparsep : Distance between marginal note and text.

the page layout to determine how to move the marginal note into the margin. E.g., \@leftmarginskip ==

     \hskip -\marginparwidth \hskip -\marginparsep .

\marginparpush : Minimum vertical separation between \marginpar's

Marginal notes are normally put on the outside of the page if @mparswitch = true, and on the right if @mparswitch = false. The command \reversemarginpar reverses the side where they

are put. \normalmarginpar undoes \reversemarginpar.

These commands have no effect for two-column output.

SURPRISE: if two marginal notes appear on the same line of text, then the second one could appear on the next page, in a funny position.

\marginpar [LTEXT]{RTEXT} == BEGIN

if hmode then \@bsphack

                \@floatpenalty := -10002

  else \@floatpenalty := -10003

fi if inner

then LaTeX Error: ’Not in outer paragraph mode.’

\@floatpenalty := 0

else if \@freelist has two elements:

  then get \@marbox, \@currbox from \@freelist
       \count\@marbox :=G -1
  else \@floatpenalty := 0

LaTeX Error: ’Too many unprocessed floats’

       \@currbox, \@marbox := \@tempboxa    %%use \def

fi fi if optional argument

then %% \@xmpar ==
\@savemarbox\@marbox{LTEXT}
\@savemarbox\@currbox{RTEXT}
else %% \@ympar ==
\@savemarbox\@marbox{RTEXT}
\box\@currbox :=G \box\@marbox

fi

\@xympar

END

\reversemarginpar == BEGIN \@mparbottom :=G 0

@reversemargin :=G true END

\normalmarginpar == BEGIN \@mparbottom :=G 0

@reversemargin :=G false END

\marginpar
171 \def\marginpar{\ifhmode \@bsphack\@floatpenalty -\@Mii\else
172 \@floatpenalty-\@Miii\fi\ifinner
173  \@parmoderr\@floatpenalty\z@
174  \else\@next\@currbox\@freelist{}{}\@next\@marbox\@freelist{\global
175  \count\@marbox\m@ne}{\@floatpenalty\z@ \@fltovf
176  \def\@currbox{\@tempboxa}\def\@marbox{\@tempboxa}}\fi
177  \@ifnextchar [\@xmpar\@ympar}
\@xmpar
178 \long\def\@xmpar[#1]#2{\@savemarbox\@marbox{#1}\@savemarbox\@currbox
179 {#2}\@xympar}

\@ympar
180 \long\def\@ympar#1{\@savemarbox\@marbox{#1}\global\setbox\@currbox
181  \copy\@marbox\@xympar}
\@savemarbox
182 \long\def \@savemarbox #1#2{%
183 \global\setbox #1%
184  \color@vbox
185  \vtop{%
186  \hsize\marginparwidth
187  \@parboxrestore
188  \@marginparreset
189  #2%
190  \global\@minipagefalse
191  \outer@nobreak

192 }%

193  \color@endbox

194 }

\@marginparreset
195 \def \@marginparreset {%
196  \reset@font
197  \normalsize
198  \@setnobreak
199  \@setminipage

200 }

\@xympar

Setting the box here is done only because the code uses \end@float; it will be empty and gets discarded.

201 \def \@xympar{%
202 \ifnum\@floatpenalty <\z@\@cons\@currlist\@marbox\fi
203 \setbox\@tempboxa
204  \color@vbox
205  \vbox \bgroup
206 \end@float
207 \global \@ignorefalse \@esphack

208 }

\reversemarginpar
\normalmarginpar
209 \def\reversemarginpar{\global\@mparbottom\z@ \@reversemargintrue}
210 \def\normalmarginpar{\global\@mparbottom\z@ \@reversemarginfalse}
211 \message{footnotes,}

1.2 Footnotes

\footnote{NOTE} : User command to insert a footnote.

\footnote[NUM]{NOTE}: User command to insert a footnote numbered NUM, where NUM is a number – 1, 2, etc. For example, if footnotes are numbered *, **, etc. within pages, then \footnote[2]{...} produces footnote ’**’. This command does not step the footnote counter.

\footnotemark[NUM] : Command to produce just the footnote mark in the text, but no footnote. With no argument, it steps the footnote counter before generating the mark.

\footnotetext[NUM]{TEXT} : Command to produce the footnote but no mark. \footnote is equivalent to

                           \footnotemark \footnotetext .

As in PLAIN, footnotes use \insert\footins, and the following parameters:

\footnotesize : Size-changing command for footnotes.

\footnotesep : The height of a strut placed at the beginning of

every footnote.

\skip\footins : Space between main text and footnotes. The rule separating footnotes from text occurs in this space. This space lies above the strut of height \footnotesep which is at the beginning of the first footnote.

\footnoterule : Macro to draw the rule separating footnotes from text. It is executed right after a \vspace of \skip\footins. It should take zero vertical space–i.e., it should to a negative skip to compensate for any positive space it occupies. (See PLAIN.TEX.)

\interfootnotelinepenalty : Interline penalty for footnotes.

\thefootnote : In usual LaTeX style, produces the footnote number. If footnotes are to be numbered within pages, then the document style file must include an \@addtoreset command to cause the footnote counter to be reset when the page counter is stepped. This is not a good idea, though, because the counter will not always be reset in time to ensure that the first footnote on a page is footnote number one.

\@thefnmark : Holds the current footnote’s mark–e.g., \dag or ’1’ or ’a’.

\@mpfnnumber : A macro that generates the numbers for \footnote

and \footnotemark commands. It == \thefootnote

outside a minipage environment, but can be changed inside to generate numbers for

\footnote's.

\@makefnmark : A macro to generate the footnote marker from \@thefnmark The default definition was

\hbox{$^\@thefnmark$}.

This is now replaced by

\textsuperscript{\@thefnmark}
\@makefntext{NOTE} :

Must produce the actual footnote, using \@thefnmark as the mark of the footnote and NOTE as the text. It is called when

effectively inside a \parbox, with \hsize = \columnwidth.

For example, it might be as simple as

$^{\@thefnmark}$ NOTE

In a minipage environment, \footnote and \footnotetext are redefined so that

(a) they use the counter mpfootnote

(b) the footnotes they produce go at the bottom of the minipage. The switch is accomplished by letting \@mpfn == footnote or mpfootnote

and \thempfn == \thefootnote or \thempfootnote, and by redefining
\@footnotetext to be \@mpfootnotetext in the minipage.
\footnote{NOTE} ==

BEGIN

\stepcounter{\@mpfn}

begingroup

\protect == \noexpand
\@thefnmark :=G eval (\thempfn)

endgroup

\@footnotemark
\@footnotetext{NOTE}

END

\footnote[NUM]{NOTE} ==

BEGIN

begingroup

   \protect == \noexpand

counter \@mpfn :=L NUM

   \@thefnmark :=G eval (\thempfn)

endgroup

\@footnotemark
\@footnotetext{NOTE}

END

\footnotemark  ==
BEGIN \stepcounter{footnote}

begingroup

       \protect == \noexpand
       \@thefnmark :=G eval(\thefootnote)

endgroup

    \@footnotemark

END

\footnotemark[NUM] ==

BEGIN

begingroup footnote counter :=L NUM

     \protect == \noexpand
    \@thefnmark :=G eval(\thefootnote)

endgroup

   \@footnotemark

END

\@footnotemark ==

BEGIN

\leavevmode
IF hmode THEN \@x@sf := \the\spacefactor FI

\@makefnmark % put number in main text

IF hmode THEN \spacefactor := \@x@sf FI

END

\footnotetext  ==
BEGIN begingroup \protect == \noexpand
                 \@thefnmark :=G eval (\thempfn)

endgroup

      \@footnotetext

END

\footnotetext[NUM] ==

BEGIN begingroup counter \@mpfn :=L NUM

                       \protect == \noexpand
                       \@thefnmark :=G eval (\thempfn)

endgroup

           \@footnotetext

END

L^{A}TEX does use the same insert for footnotes as PLAIN.

212 \newinsert\footins

L^{A}TEX leaves these initializations for the \footins insert.

213 \skip\footins=\bigskipamount % space added when footnote is present
214 \count\footins=1000 % footnote magnification factor (1 to 1)
215 \dimen\footins=8in % maximum footnotes per page

L^{A}TEX keeps PLAIN TEX’s \footnoterule as the default.

216 \def\footnoterule{\kern-3\p@
217 \hrule \@width 2in \kern 2.6\p@} % the \hrule is .4pt high
\thefootnote
218 \@definecounter{footnote}
219 \def\thefootnote{\@arabic\c@footnote}
\thempfootnote
220 \@definecounter{mpfootnote}
221 \def\thempfootnote{\itshape\@alph\c@mpfootnote}

\@makefnmark Default definition.

222 %\def\@makefnmark{\hbox{$^{\@thefnmark}\m@th$}}
223 \def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}}

\textsuperscript This command provides superscript characters in the current text font. It’s implementation might change!!!

224 \DeclareRobustCommand*\textsuperscript[1]{%
225 \@textsuperscript{\selectfont#1}}

\@textsuperscript This command should not be used directly, but may be used to define other commands \textsuperscript, \@makefnmark. #1 should always start with a font selection command, to activate the font size switch.

226 \def\@textsuperscript#1{%
227 {\m@th\ensuremath{^{\mbox{\fontsize\sf@size\z@#1}}}}}
\footnotesep
228 \newdimen\footnotesep
\footnote
229 \def\footnote{\@ifnextchar[\@xfootnote{\stepcounter\@mpfn
230  \protected@xdef\@thefnmark{\thempfn}%
231  \@footnotemark\@footnotetext}}

\@xfootnote
232 \def\@xfootnote[#1]{%
233 \begingroup
234  \csname c@\@mpfn\endcsname #1\relax
235  \unrestored@protected@xdef\@thefnmark{\thempfn}%
236 \endgroup
237 \@footnotemark\@footnotetext}
\@footnotetext
238 \long\def\@footnotetext#1{\insert\footins{%
239  \reset@font\footnotesize
240  \interlinepenalty\interfootnotelinepenalty
241  \splittopskip\footnotesep
242  \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
243  \hsize\columnwidth \@parboxrestore
244  \protected@edef\@currentlabel{%
245  \csname p@footnote\endcsname\@thefnmark

246 }%

247  \color@begingroup
248  \@makefntext{%
249  \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}
250  \color@endgroup}}
\footnotemark
251 \def\footnotemark{%
252 \@ifnextchar[\@xfootnotemark
253  {\stepcounter{footnote}%
254  \protected@xdef\@thefnmark{\thefootnote}%
255  \@footnotemark}}
\@xfootnotemark
256 \def\@xfootnotemark[#1]{%
257 \begingroup
258  \c@footnote #1\relax
259  \unrestored@protected@xdef\@thefnmark{\thefootnote}%
260 \endgroup
261 \@footnotemark}
\@footnotemark
262 \def\@footnotemark{%
263 \leavevmode
264 \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
265 \@makefnmark
266 \ifhmode\spacefactor\@x@sf\fi
267 \relax}
\footnotetext
268 \def\footnotetext{%
269  \@ifnextchar [\@xfootnotenext

270  {\protected@xdef\@thefnmark{\thempfn}%
271  \@footnotetext}}
\@xfootnotenext
272 \def\@xfootnotenext[#1]{%
273 \begingroup
274  \csname c@\@mpfn\endcsname #1\relax
275  \unrestored@protected@xdef\@thefnmark{\thempfn}%
276 \endgroup
277 \@footnotetext}
\thempfn \@mpfn
278 \def\@mpfn{footnote}
279 \def\thempfn{\thefootnote}

280 ⟨/2ekernel⟩