Welcome to the floatflt package!^{∗}

Mats Dahlgren^{†}

1998/06/05

Abstract

The floatflt package is an extension of Thomas Kneser’s style option floatfig.sty for L^{A}TEX 2.09. The extension was done by Mats Dahlgren (matsd@sssk.se http://www.homenet.se/matsd/). This file and the package: Copyright \begin{matrix}c \\ ◯ \end{matrix} 1994-1998 by Mats Dahlgren. All rights reserved.

1 Introduction

The floatflt package defines two environments: floatingfigure and floatingtable. In principle the two environments work the same way and do the same job, but there are some important differences, which are explained below. The general idea is that a figure or table which is not very wide should be allowed to have regular text typsetted beside itself. In Thomas Kneser’s file floatfig.sty and in the documentation thereof, such figures are called floating figures. In the floatflt package, the term floating is generally used for such figures and tables, despite the slight different use of the term float in L^{A}TEX. Hence the term floating floats for such figures and tables.

This userguide is also available in .pdf-format on the internet. It is found from my L^{A}TEX web

page: http://www.homenet.se/matsd/latex/
1.1 For floatfig.sty users

There are five major differences in the use of floatflt as compared to floatfig:

• The extension to the floattable environment.

• There is no longer any need for initialization, thanks to the \AtBeginDocument command.

• Optional arguments for the environments which allows the user to place the floating floats left, right or according to the page number (as with floatfig.sty); this is mainly due to the possibility to have optional arguments in newly defined environments.

• Optional argument for the package as a whole if the user wants to force all floating floats to be to the right or left. The placement option at \begin{floatingfigure} (and \begin{floatingtable}) overrides this (and there is also the optional placement option to re-introduce the page-number dependent placement for one figure or table).

• Compatibility with the multicol package is now obtained.

∗This document describes floatflt v.1.31 and was last updated 1998/06/05.

†Email: matsd@sssk.se Web: http://www.homenet.se/matsd/

2 Userguide

In the following, the usage of the package is explained in some detail. Users who are unfamiliar with the floatfig.sty package by Thomas Kneser may also find it useful to run L^{A}TEX on the file

floatfge.tex.

2.1 How to call the package

The floatflt package is activated by the following line in your L^{A}TEX input file following your

\documentclass command:
   \usepackage[option]{floatflt}

The option may be either one of the following: rflt, lflt, or vflt.

2.1.1 The package options

The three package options have the following functions:

rflt Forces the default for the floating figures and tables to be typset to the right in a paragraph.

lflt Forces the default for the floating figures and tables to be typset to the left in a paragraph.

vflt Forces the floating figures and tables to be typset to the right in a paragraph on odd-nubered pages, and to the left on even-numbered pages; this is also the default.

The option vflt is actually not needed and does nothing but tells L^{A}TEX to use the default, it is also the internal default. It is supported for symmetry reasons with the optional arguments for the environments temselves.

2.2 How to use the floatingfigure environment

In your L^{A}TEX document you invoke the floatingfigure environment by typing:

   \begin{floatingfigure}[option]{width}

figure commands with or without \caption

   \end{floatingfigure}

The option may be either one of the following: r, l, p, or v. The quantity width is the width you want your floating figure to have (such as “75mm”).

2.2.1 The floatingfigure options

The options to the floatingfigure environment all overrule any present package option which may be in effect. The options have the following functions:

r Forces the current floating figure to be typset to the right in a paragraph.

l Forces the current floating figure to be typset to the left in a paragraph.

p Forces the current floating figure to be typset to the right in a paragraph if the pagenumber is odd, and to the left if even.

v Applies the package option to the current figure, and if no package option is specified, it forces the current floating figure to be typset to the right in a paragraph if the pagenumber is odd, and to the left if even.

The p option is used when the default alternating right/left typesetting of floating figures is desired despite the use of the rflt or lflt package option. The v option is the internal default, and does not have any effect other than applying either the default or the option specified for the whole package.

2.3 How to use the floatingtable environment

In your L^{A}TEX document you invoke the floatingtable environment by typing:

   \begin{floatingtable}[option]{
   \begin{tabular}{tabular specifiers}

here you put your table entries

   \end{tabular}}

\caption if desired

   \end{floatingtable}

The option may be either one of the following: r, l, p, or v. No specification of the width is explicitly made, instead the whole tabular environment is a mandatory argument. Thus, it is important to always have the “{” before \begin{tabular} and the “extra” “}” after \end{tabular}. At the present, the tabbing environment can not be used in the floatingtable environment. (Other commands and environments such as the \parbox command may be used instead of the tabular environment within a floatingtable environment.)

2.3.1 The floatingtable options

The options for the floatingtable environment are exactly the same as for the floatingfigure environment, and they also have the same effects.

2.4 Compatibility

The present version of floatflt (v.1.31) has been tested with L^{A}TEX 2ε of 1997/06/01 using MiKTEX 1.07 running TEX 3.14159 under Win95, using the article document class. Only changes to the the documentation has been made since the previous verision.

The regular \caption command of both the figure and tabular environments work fine.

The \hangcaption command of David M. Jones (dmjones@theory.lcs.mit.edu) does not work

with floatflt. The use of \hangcaption gives the same result as \caption. The listing commands \listoffigures and \listoftables also work properly. However, since floating figures and tables normally are typsetted in a paragraph, the order in the lists may be strange if also regular figure and table environments are used close to the floating ones.

Unlike floatfig.sty, floatflt works with the multicol package, provided the floating floats are still less wide than the columns. If not, or if the floating floats and the columns have almost the same width, text may drift away and overlap text in adjacent column(s). However, this combination has several restrictions, and the placement of the floating floats may not always be the correct according to the page numbering. Normally it also leads to many ”Underfull \hbox” warnings. The use of this combination is discouraged.

2.5 Warnings and messages

In Thomas Kneser’s original work floatfig.sty, there are several warnings issued when problems occur. These are kept in floatflt. Warnings will be issued if two floating figures, two floating tables, or if one floating table is colliding with one floating figure. Also, message(s) will be displayed if a floating float is moved from its original paragraph. Finally, each processed floating float will produce a message telling which page it has been typsetted on.

3 Known problems and limitations

The following problems and limitations are known:

• If a floating figure or table is called close to a sectioning command, the floating float may be lost or truncated. This may lead to a “collision warning”, which normally has to be analyzed “by hand”.

• If two consecutive paragraphs both contain a floating float, a “collision warning” is issued. This warning may be ignored.

• A floatingtable environment sometimes leads to a warning like:

        Overfull \hbox (10.78334pt too wide) in paragraph at lines 287--289

where the line numbers refered to are those of the \end{tabular} statement. This could not be avoided in all cases.

• If you use floating floats of different kinds close to each other in your input, you are likely to have problems. You may either lose one of the floating floats entirely, have it overwritten by the other, or have it truncated.

• L^{A}TEX has problem in linebreaking short lines. This may give you bad linebreaks in the captions of floating floats.

• There are some problems when a floating float and a footnote appear on the same page, especially when the floating float is moved to another page. Unfortunately, this may need some adjustments by hand. (Reported by Jakob Schiotz (schiotz@fysik.dtu.dk).)

• If a floating float is placed close to a list environment (such as enumerate or itemize), the text of the list environment is likely to overwrite the floating float. See section 3.1 below for a semi-automatic solution of this problem. (The bug was reported by Rafael Gallego

     (gallego@esi.us.es).)

The first two of these were pointed out by Thomas Kneser in the original documentation of

floatfig.sty.

3.1 How to Avoid the List Problem

There is a semi-automatic way to avoid the “List Problem” mentioned above. The solution was introduced in version 1.2. For items in a list which are colliding with a floating float, there is a special command \fltitem avaliable, which takes one mandatory argument. This command is to be used in place of the ordinary \item, and should have the text of the item as the argument. E. g. you would write

      \fltitem{text}

instead of

      \item text

to avoid the text of the \item command to be written in the floating float. \fltitem also takes a second, optional, argument, which is an extra vertical space put in after the text of the \fltitem command. This is meant to be used specially when there are two paragraphs in the same item text, and the latter is to use the full line width (i. e. when the item text ends below the floating float). So, the full syntax of the \fltitem command is:

     \fltitem[len]{text}

which inserts the extra vertical space len after the item text. If there is a second text which is to span the full linewidth in the same item, one would write:

\fltitem[len]{text1 } text2 which first typesets text1 narrowed according to the floating float, followed by text2 with full linewidth, and an extra vertical space len between these two texts.

There is also a second, analogous command \fltditem which takes two mandatory and one optional argument. The optional argument is the same as the optional argument of \fltitem, the first mandatory argument is the item label, e. g. the item to be described in a description environment. The second mandatory argument of \fltditem is the item text. The syntax of the \fltditem command is:

     \fltditem[len]{label}{text}

which produces an item with label label and text text and extra vertical space len after the item text. Additional text spanning the full linewidth may follow, just like with \fltitem, but the indentation may turn out to be strange.

   Both \fltitem and \fltditem can be used in an ordinary itemize, enumerate, or description

environment (however, the use of \fltditem in enumerate may produce strange results). For \fltitem and \fltditem to work properly, the (otherwise) colliding floating float must be set flush right, that is have the option r specified. The use of \fltitem or \fltditem is not demonstrated in the floatexm.tex file.

3.2 Sending a bug report

Reports of new bugs in the package are most welcome. However, I do not consider this to be a “supported” package. This means that there is no guarantee I (or anyone else) will put any effort into fixing the bug. But, on the other hand, someone may try debugging, so filing a bug report is always a good thing to do! (If nothing else, your discoveries may end up in future releases of this document.) Before filing a bug report, please take the following actions:

1. Ensure your problem is not due to your inputfile;

2. Ensure your problem is not due to your own package(s) or class(es);

3. Ensure your problem is not covered in the section “Known problems and limitations” above;

4. Try to locate the problem by writing a minimal L^{A}TEX 2ε input file which reproduces the

problem. Include the command

        \setcounter{errorcontextlines}{999}

in your input;

5. Run your file through L^{A}TEX 2ε;

6. Send a description of your problem, the input file and the log file via e-mail to:

     matsd@sssk.se.

4 Conclusion

Without Thomas Kneser’s floatfig.sty as a base, I could never have written the floatflt package. I hope that some users will find the package useful and not too bugful. :–) Comments and suggestions for improvements are always most welcome!

Enjoy your L^{A}TEX!mats d.

5 Package code

This section prints the package code but without comments.

 1 \NeedsTeXFormat{LaTeX2e}[1996/12/01]
 2 \ProvidesPackage{floatflt}[1997/07/16 v. 1.31]
 3 \newcounter{OptionTest}
 4 \setcounter{OptionTest}{0}
 5 \DeclareOption{rflt}{\setcounter{OptionTest}{1}}
 6 \DeclareOption{lflt}{\setcounter{OptionTest}{2}}
 7 \DeclareOption{vflt}{\setcounter{OptionTest}{0}}
 8 \DeclareOption*{\OptionNotUsed}
 9 \ProcessOptions
10 \newbox\figbox
11 \newbox\tabbox
12 \newbox\pagebox
13 \newcount\ffigcount
14 \newcount\ftabcount
15 \newcount\fftest
16 \newcount\hangcount
17 \newcount\nosuccesstryfig
18 \newcount\nosuccesstrytab
19 \newdimen\figgutter   \figgutter=1truepc
20 \newdimen\tabgutter   \tabgutter=1truepc
21 \newdimen\htdone      \htdone=0pt
22 \newdimen\pageht
23 \newdimen\startpageht
24 \newdimen\tabbredd
25 \newdimen\floatfltwidth
26 \newdimen\fltitemwidth
27 \newif\iftryingfig     \tryingfigfalse
28 \newif\iftryingtab     \tryingtabfalse
29 \newif\ifdoingfig      \doingfigfalse
30 \newif\ifdoingtab      \doingtabfalse
31 \newif\iffigprocessing \figprocessingfalse
32 \newif\iftabprocessing \tabprocessingfalse
33 \newif\ifpageafterfig  \pageafterfigfalse
34 \newif\ifpageaftertab  \pageaftertabfalse
35 \newif\ifoddpages
36 \newif\ifoutput
37 \newtoks\outputpretest
38 \newenvironment{floatingfigure}[2][v]%
39 {\@tfor \@tempa :=#1\do
40  {\if\@tempa r\global\oddpagestrue\fi
41  \if\@tempa l\global\oddpagesfalse\fi
42  \if\@tempa p%
43  \ifodd\c@page\global\oddpagestrue
44  \else\global\oddpagesfalse\fi
45  \fi
46  \if\@tempa v%
47  \ifnum\theOptionTest=0
48  \ifodd\c@page\global\oddpagestrue
49  \else\global\oddpagesfalse\fi
50  \else
51  \ifodd\theOptionTest\global\oddpagestrue

52  \else\global\oddpagesfalse\fi
53  \fi
54  \fi

55 }

56 \expandafter\ifx\csname oldoutput\endcsname\relax% ref. TeXbook Ex.7.7
57  \PackageError{floatflt}{The `floatflt' package is not initialized}
58  {Try to reinstall the `floatflt' package.\MessageBreak
59  Type `x' to quit or <Return> to try to go on.}\@@end\fi
60 \global\everypar={\tryfig\oldeverypar}% must be set globally!
61 \global\advance\ffigcount by 1
62 \iffigprocessing
63  {\count0=\ffigcount\advance\count0 by -1
64  \PackageWarningNoLine{floatflt}{Floating figures \the\count0\space%
65  \space and \the\ffigcount\space colliding}%
66  }%
67 \fi
68 \iftabprocessing \PackageWarningNoLine{floatflt}{Floating figure %
69 \the\ffigcount\space and floating table \the\ftabcount\space colliding}
70 \fi
71 \def\@captype{figure}
72 \global\setlength{\floatfltwidth}{#2}
73 \global\figprocessingtrue
74 \global\setbox\figbox=\vbox\bgroup% begin of figbox
75  \hrule height 0pt width #2 depth 0pt%
76  \hsize=#2%

77 } 78 {

79 \egroup
80 \figinsert\par%

81 }

82 \newenvironment{floatingtable}[2][v]%
83 {\@tfor \@tempa :=#1\do
84  {\if\@tempa r\global\oddpagestrue\fi
85  \if\@tempa l\global\oddpagesfalse\fi
86  \if\@tempa p%
87  \ifodd\c@page\global\oddpagestrue
88  \else\global\oddpagesfalse\fi
89  \fi
90  \if\@tempa v%
91  \ifnum \theOptionTest=0
92  \ifodd\c@page\global\oddpagestrue
93  \else\global\oddpagesfalse\fi
94  \else
95  \ifodd\theOptionTest\global\oddpagestrue
96  \else\global\oddpagesfalse\fi
97  \fi
98  \fi

99 }

100 \expandafter\ifx\csname oldoutput\endcsname\relax% ref. TeXbook Ex.7.7
101  \PackageError{floatflt}{The `floatflt' package is not initialized}
102  {Try to reinstall the `floatflt' package.\MessageBreak
103  Type `x' to quit or <Return> to try to go on.}\@@end\fi
104 \global\setbox\tabbox=\vbox\bgroup\hrule height 0pt width 0pt depth 0pt%
105 \hsize=0pt\egroup

106 \global\everypar={\trytab\oldeverypar}
107 \global\advance\ftabcount by 1
108 \iftabprocessing
109  {\count0=\ftabcount\advance\count0 by -1
110  \PackageWarningNoLine{floatflt}{Floating tables \the\count0\space%
111  \space and \the\ftabcount \space colliding}%

112 }

113 \fi
114 \iftabprocessing \PackageWarningNoLine{floatflt}{Floating table %
115 \the\ffigcount\space and floating figure \the\ftabcount\space colliding}
116 \fi
117 \settowidth{\tabbredd}{#2}
118 \global\setlength{\floatfltwidth}{\tabbredd}
119 \def\@captype{table}
120 \global\tabprocessingtrue
121 \global\setbox\tabbox=\vbox\bgroup% begin of tabbox
122  \hrule height 0pt width\tabbredd depth 0pt%
123  \hsize=\tabbredd
124 \noindent\ifnum\ftabcount >1\ifoddpages\else\hspace*{-12pt}\fi\fi%
125 #2\vspace{0.2\baselineskip}%

126 } 127 {

128 \egroup% end of \tabbox
129 \tabinsert\par%

130 }

131 \AtBeginDocument{%
132 \edef\oldoutput{\the\output}%
133 \output={\the\outputpretest%
134  \ifoutput\oldoutput\fi}
135 \outputpretest={\outputtrue}
136 \edef\oldeverypar{\the\everypar}

137 }

138 \def\dofigtest{%
139 \ifnum\outputpenalty=-10005
140  \setbox\pagebox=\vbox{\unvbox255}%
141  \global\pageht=\ht\pagebox
142  \global\outputfalse
143  \unvbox\pagebox
144 \else
145  \global\outputtrue
146  \ifdoingfig
147  \global\pageafterfigtrue
148  \fi
149 \fi}%
150 \def\dotabtest{%
151 \ifnum\outputpenalty=-10005
152  \setbox\pagebox=\vbox{\unvbox255}%
153  \global\pageht=\ht\pagebox
154  \global\outputfalse
155  \unvbox\pagebox
156 \else
157  \global\outputtrue
158  \ifdoingtab
159  \global\pageaftertabtrue

160  \fi
161 \fi}%
162 \def\tryfig{%
163  \iftryingfig
164  {\everypar={\relax}\setbox0=\lastbox%
165  \parindent=\wd0 \parskip=0pt \par%
166  \penalty-10005 \leavevmode}%
167  \dimen0=\vsize%
168  \advance\dimen0 by -\pageht%
169  \advance\dimen0 by -2\baselineskip%
170  \ifdim\dimen0>\ht\figbox%
171  \dimen0=0.3\baselineskip
172  \vrule depth \dimen0 width 0pt
173  \vadjust{\kern -\dimen0%
174  \vtop to \dimen0{%
175  \baselineskip=\dimen0%
176  \vss \vbox to 1ex{%
177  \ifoddpages%
178  \hbox to \hsize{\hss\copy\figbox}%
179  \else% leftsetting
180  \hbox to \hsize{\copy\figbox\hss}%
181  \fi% \ifodd\count0
182  \vss}\null}}%
183  \global\tryingfigfalse%
184  \global\doingfigtrue
185  \global\startpageht=\pageht
186  \global\htdone=0pt
187  \dohangf
188  \ifnum\nosuccesstryfig>0%
189  \typeout{floatflt Message: Flt. fig. \the\ffigcount\space set on page
190  \the\count0, shifted \the\nosuccesstryfig\space par(s) forward.}%
191  \else
192  \typeout{Package floatflt Message: Floating figure \the\ffigcount
193  \space set on page \the\count0}%
194  \fi
195  \else
196  \global\advance\nosuccesstryfig by 1
197  \fi
198  \else%
199  \ifdoingfig
200  {\everypar={\relax}\setbox0=\lastbox
201  \parindent=\wd0 \parskip=0pt \par
202  \penalty-10005 \leavevmode}%
203  \global\htdone=\pageht
204  \global\advance\htdone by -\startpageht
205  \ifpageafterfig
206  \global\doingfigfalse
207  \else
208  \dimen0=\ht\figbox%
209  \advance\dimen0 by 0.5\baselineskip%
210  \ifdim\htdone<\dimen0%
211  \dohangf
212  \else
213  \global\doingfigfalse

214  \fi
215  \fi
216  \ifdoingfig\relax\else\global\figprocessingfalse\fi
217 \else
218  \global\outputpretest={\outputtrue}%
219 \fi
220 \fi

221 }

222 \def\trytab{%
223  \iftryingtab%
224  {\everypar={\relax}\setbox0=\lastbox%
225  \parindent=\wd0 \parskip=0pt \par%
226  \penalty-10005 \leavevmode}%
227  \dimen0=\vsize%
228  \advance\dimen0 by -\pageht%
229  \advance\dimen0 by -2\baselineskip%
230  \ifdim\dimen0>\ht\tabbox%
231  \dimen0=0.3\baselineskip
232  \vrule depth \dimen0 width 0pt
233  \vadjust{\kern -\dimen0%
234  \vtop to \dimen0{%
235  \baselineskip=\dimen0%
236  \vss \vbox to 1ex{%
237  \ifoddpages%
238  \hbox to \hsize{\hss\copy\tabbox}%
239  \else% leftsetting
240  \hbox to \hsize{\copy\tabbox\hss}%
241  \fi% \ifodd\count0
242  \vss}\null}}%
243  \global\tryingtabfalse%
244  \global\doingtabtrue
245  \global\startpageht=\pageht
246  \global\htdone=0pt
247  \dohangt
248  \ifnum\nosuccesstrytab>0%
249  \typeout{floatflt Message: Flt. tab. \the\ftabcount\space set on page
250  \the\count0, shifted \the\nosuccesstrytab\space par(s) forward.}%
251  \else
252  \typeout{Package floatflt Message: Floating table \the\ftabcount\space
253  set on page \the\count0}%
254  \fi
255  \else
256  \global\advance\nosuccesstrytab by 1
257  \fi
258  \else
259  \ifdoingtab
260  {\everypar={\relax}\setbox0=\lastbox
261  \parindent=\wd0 \parskip=0pt \par
262  \penalty-10005 \leavevmode}%
263  \global\htdone=\pageht
264  \global\advance\htdone by -\startpageht
265  \ifpageaftertab
266  \global\doingtabfalse
267  \else

268  \dimen0=\ht\tabbox%
269  \advance\dimen0 by 0.5\baselineskip%
270  \ifdim\htdone<\dimen0%
271  \dohangt
272  \else
273  \global\doingtabfalse
274  \fi
275  \fi
276  \ifdoingtab\relax\else\global\tabprocessingfalse\fi
277 \else
278  \global\outputpretest={\outputtrue}%
279 \fi
280 \fi

281 }

282 \def\figinsert{%
283 \global\nosuccesstryfig=0%
284 \global\outputpretest={\dofigtest}%
285 \global\tryingfigtrue \global\doingfigfalse%
286 \global\pageafterfigfalse}%
287 \def\tabinsert{%
288 \global\nosuccesstrytab=0%
289 \global\outputpretest={\dotabtest}%
290 \global\tryingtabtrue \global\doingtabfalse%
291 \global\pageaftertabfalse}%
292 \def\dohangf{%
293 \dimen0=\ht\figbox%
294 \advance\dimen0 by -\htdone%
295 \advance\dimen0 by 1.49\baselineskip%
296 \hangcount=\dimen0%
297 \divide\hangcount by \baselineskip%
298 \dimen0=\wd\figbox%
299 \advance\dimen0 by \figgutter%
300 \ifoddpages%
301  \global\hangafter=-\hangcount% placing right
302  \global\hangindent=-\dimen0%
303 \else% \ifleftsetting
304  \global\hangafter=-\hangcount% placing left
305  \global\hangindent=\dimen0%
306 \fi

307 }

308 \def\dohangt{%
309 \dimen0=\ht\tabbox%
310 \advance\dimen0 by -\htdone%
311 \advance\dimen0 by 1.49\baselineskip%
312 \hangcount=\dimen0%
313 \divide\hangcount by \baselineskip%
314 \dimen0=\wd\tabbox%
315 \advance\dimen0 by \tabgutter%
316 \ifoddpages%
317  \global\hangafter=-\hangcount% placing right
318  \global\hangindent=-\dimen0%
319 \else% \ifleftsetting
320  \global\hangafter=-\hangcount% placing left
321  \global\hangindent=\dimen0%

322 \fi

323 }

324 \newcommand{\fltitem}[2][0pt]{\setlength{\fltitemwidth}{\linewidth}%
325 \addtolength{\fltitemwidth}{-\floatfltwidth}%
326 \addtolength{\fltitemwidth}{-0.5em}%
327 \item \parbox[t]{\fltitemwidth}{#2}\\[#1]}
328 \newcommand{\fltditem}[3][0pt]{\setlength{\fltitemwidth}{\linewidth}%
329 \addtolength{\fltitemwidth}{-\floatfltwidth}%
330 \addtolength{\fltitemwidth}{-0.5em}%
331 \item[#2] \parbox[t]{\fltitemwidth}{#3}\\[#1]}

Copyright \begin{matrix}c \\ ◯ \end{matrix} 1994-1998 by Mats Dahlgren.