From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/tamefloats/tameflts.sty | 208 +++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 macros/latex/contrib/tamefloats/tameflts.sty (limited to 'macros/latex/contrib/tamefloats/tameflts.sty') diff --git a/macros/latex/contrib/tamefloats/tameflts.sty b/macros/latex/contrib/tamefloats/tameflts.sty new file mode 100644 index 0000000000..14c516b0b7 --- /dev/null +++ b/macros/latex/contrib/tamefloats/tameflts.sty @@ -0,0 +1,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. -- cgit v1.2.3