summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/tamefloats/tameflts.sty
blob: 14c516b0b746203040375d94e78c4a137a278ccd (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
%% tameflts.sty -- experimental fix of bug(s) 
%%                latex/3208, 3370, 3541, and 3719, 
%%                using \holdinginserts. 
%% (C) 2005 Uwe Lueck http://contact-ednotes.sty.de.vu 
%% Adapted from lineno.sty, due to Stephan I. Boettcher, with an 
%% improvement by David Kastrup. 
\def\filedate{2005/04/27} \def\fileversion{v0.42}
%% RIGHTS: LaTeX Project Public License (LPPL) v1.3a 
%%         -- author-maintained. 
%% 
%% PURPOSE, USAGE, WARNINGs etc.: see below \endinput. 

\ProvidesPackage{tameflts}[\filedate\space\fileversion\space 
                          do without \string\@reinserts]
% \let\@reinserts\relax     % TODO!? another package might use it. 
\mathchardef\@UAR@Mv=10005                   % v0.3, for floatflt. 
                                % "Universally Avoid \@reinserts". 
\newif\if@UAR@goodoutput        % lineno.sty has used \if@tempswa. 
\chardef\@UAR@vl=45 
% <- Latin `vl' is written `ul' in critical editions. 
\global\holdinginserts\@UAR@vl                            % TODO!? 
\let\@tempa\output     % giving up reference to previous \output .
\newtoks\output 
\output\expandafter{\the\@tempa}
\let\@UAR@output\output 
\@tempa{% 
  \@UAR@goodoutputtrue 
  \ifnum\holdinginserts=\@UAR@vl
    \ifnum\outputpenalty>-\@Mii 
      \@UAR@goodoutputfalse 
    \else 
      \ifnum\outputpenalty<-\@UAR@Mv  % was \@Miv % \@Miii breaks. 
        \@UAR@goodoutputfalse 
      \fi 
    \fi 
  \fi 
  \if@UAR@goodoutput 
    \the\@UAR@output 
    \ifnum\holdinginserts=-\@UAR@vl
      \global\holdinginserts\@UAR@vl 
    \fi 
  \else 
    \unvbox\@cclv
    \global\holdinginserts-\@UAR@vl 
    \ifnum\outputpenalty=\@M \else
      \penalty\outputpenalty
    \fi
  \fi 
}
% v0.3, user switch: 
\newcommand\releasefloats{% 
  \ifnum\holdinginserts=\@UAR@vl 
    \global\holdinginserts\z@ \fi}
\newcommand\tamefloats{\global\holdinginserts\@UAR@vl}
\endinput 

* INTRODUCTION: *
 
PURPOSE/WARNING: 
Experts know well that \@reinserts in LaTeX's \@specialoutput -- 
which handles floats (figures, tables) and \marginpar's -- may 
cause wrong order of footnote splits or output of footnotes on 
unnecessarily late pages. Disabling \@reinserts or dropping it, 
as David Kastrup recommends in latex/3541, would require 
additional efforts. TeX3 was equipped with \holdinginserts to 
deal with problems of this kind. Yet LaTeX has still not made use 
of it, since it seems that this would still require redesigning 
LaTeX's output routine entirely. Here is an experimental, simple 
fix (!?). It replaces the problem by another one, yet the new 
one might show up more rarely or might easier be dealt with by 
non-expert users -- I would like to know. (I have made a file 
newbug.tex to demonstrate a possible effect of the problem, yet 
it is not very unrealistic). 

The new problem will not occur with single-line \marginpar's 
(in different lines -- paragraph numbers, e.g.) -- for such 
purposes the package may be valuable indeed. 

Note that this package doesn't help you if you neither use 
\marginpar nor figures nor tables. The bug shows up in very 
special situations only -- e.g., many footnotes, or large ones. 
It may often be avoidable by moving the \marginpar or figure 
or table in the code a little across the suffering \footnote. 
The present package may rather be considered a contribution to 
discussion on the problem. 
(I have accidentally learnt about the problem with critical 
editions, where there are many footnotes per page, and with an 
implementation that used a modified \marginpar mechanism two 
times for each note.)

The package may be incompatible with other packages doing the 
same thing -- if you need the other one, I suppose you don't 
need the present one. I am just working at making lineno.sty 
compatible with the present package. 

Note for non-wizards: `latex/3208', `latex/3370', `latex/3541', 
and `latex/3719' refer to relevant bug reports on the LaTeX Bugs 
Data Base, 

    http://www.latex-project.org/cgi-bin/ltxbugs2html .

USAGE: 
Just load the package. You can use \releasefloats anywhere in your 
files for (kind of) reinstalling the situation without 
tameflts.sty (for a passage where it works badly); after this you 
can reinstall the tamefltos.sty function by \tamefloats. Both 
commands act globally. 

MORE INFORMATIONS: 
In the recent days, there was an intense discussion of the 
matter on the LaTeX-L e-mail list. 

WELCOME: 
Suggestions on almost everything, especially implementation, 
different algorithms, different names; demo files; where, how, 
whether to present these experiments. 


* ACKNOWLEDGEMENTs / PRESENT IMPLEMENTATION: *

The basic idea is, like in latex/3719, to have \holdinginserts>0 
unless we are sure that footnotes actually are output, i.e., the 
output routine will empty the \footins box (and \@kludgeins, for 
\enlargethispage). The problem stems from LaTeX's \@reinserts 
which in effect moves \footins and \@kludgeins inserts down the 
main vertical list. 

The implementation is a variant of how lineno.sty, say v3.02ff., 
using \holdinginserts, due to Stephan I. Boettcher. 
Particular purposes are here: As compared with the proposal 
in latex/3719, the implementation is intended to work relatively 
independently of other changes of the output routine, maybe due 
to different LaTeX versions or due to packages like longtable. 
It is even intended that it doesn't conflict with uses of 
\holdinginserts by other packages or a future LaTeX version, but 
it is not clear to me how probably this works.           %% TODO 
With version v0.3 I'm neither sure about \releasefloats and 
\tamefloats.                                             %% TODO 

The problem that the implementation introduces is the following. 
The float mechanism measures the \footins box to decide about 
placement of floats. Now, with \holdinginserts>0 the \footins box 
is "spuriously" empty. Floats may thus come too early in the sense 
that one would have preferred that footnotes had been printed. 
I have made a file newbug.tex to demonstrate an effect of this. 

One further difference to the proposal in latex/3719 is that 
\holdinginserts is decreased for \clearpage here. 

A problem discussed on LaTeX-L is whether/how 
\penalty\outputpenalty should be used. The present proposal is 
just what lineno.sty has done when I found it. 

\@reinserts is neither defined away nor circumvented, it will 
just find that there is nothing to reinsert. 

You see from the code that the package doesn't hold back 
insertions with output penalties -10002 and -10003 only, where 
\@reinserts is met. It would not work this way (the page builder 
stops working), and David Kastrup seems to address the reason in 
latex/3541, which I don't exactly know. So insertions are held 
back with any fake \output call, so also with 
\outputpenalty=-10004 and -- v0.3, for Mats Dahlgren's floatftl 
-- \outputpenalty=-10005, where \@reinserts does not occur. The 
floatftl documentation mentions that floatftl also had problems 
with footnotes. The demo file fltfltdk.tex indicates that the 
package solves the problem, although I don't exactly know why. 

v0.2 improves interaction with other packages that change the 
output routine, due to David Kastrup (LaTeX-L list). Unlike in 
lineno.sty, the number of the token register allocated by 
\newtoks\output is stored by a control sequence. The output 
(sub-)routine defined here uses the latter instead of \output. 
Otherwise, a package loaded later may try the same trick, to the 
effect that it puts a (would-be) output routine into a token 
register that will never be read, while \the\output still 
contains what the present package found in \output, although 
\output will refer to another register than at the end of the 
present package. 
(The routine may be a subroutine, the package may be loaded 
after another one using the same trick, then the present one 
does not change the content of the token parameter which "naked" 
TeX calls `\output'.) 
The previous \output is now (v0.2) referred to by just \@tempa. 
Maintaining the possibility of referring to TeX's built-in token 
parameter (when another package uses the trick) would need an 
agreement and additional effort. To do so, I would suggest: 
    \@ifundefined{@@output}{\let\@@output\output}{} .


* HISTORY of VERSIONS: *
v0.1   2005/04/01  Sent to LaTeX-L. 
v0.2   2005/04/04  Mentions of existing demo files; several 
                   changes of wordings; one \vl -> \@vl; 
                   one = to \ifnum; \@tempa and \@UAR@output for 
                   \output trick; extended explanations of 
                   implementation. Mentioning Frank Mittelbach 
                   was erroneous, corrected. Sent to LaTeX-L and 
                   CTAN. 
v0.3   2005/04/08  \@UAR@Mv, \@vl -> \@UAR@vl, \doreinserts. 
                   Sent to CTAN and Mats Dahlgren. 
v0.4   2005/04/17  Renamed noreins -> tameflts, \doreinserts 
                   -> \releasefloats, \noreinserts -> 
                   \tamefloats, changed explanations on 
                   implementation. 
v0.41  2005/04/21  Additional remarks on compatibility and the 
                   bug introduced. 
v0.42  2005/04/26  Adjustment of documentation to lineno.sty.