%% LblChng1.sty--tell about the first changed LaTeX label. \def\fileversion{0.32c} \def\filedate{2005/10/01} %% Copyright (C) 2005 Uwe L\"uck %% Munich, http://contact-ednotes.sty.de.vu. %% Current maintainer is Uwe L\"uck. %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License distributed from CTAN %% archives in directory macros/latex/base/lppl.txt; either %% version 1.3a of the License, or any later version. %% We did our best to help you, but there is NO WARRANTY. %% * SUMMARY: * %% % This package is intended to be a (primitive) tool for % fixing oscillating page breaks -- a problem that especially % sometimes occurs in typesetting critical editions. Thus it % addresses especially users of LaTeX packages lineno, ednotes, % and ledmac (maybe even manyfoot and numline). When it has been % invoked and some label(s) get an entry in the .aux file % differing, with respect to page number, to that of the % previous run, the first such label is reported on screen (and % in the .log), including the differing page numbers. This % should help in finding the first unstable page -- which is % vital. The file also contains rather detailed explanations and % discussions. % %% * CRITICAL EDITIONS, PACKAGES: * %% % For informations about macro packages mentioned in the present % text, or about critical edition typesetting in general, I % refer you to the web page http://ednotes.sty.de.vu . % %% * THE PROBLEM TO BE SOLVED: * %% % Sometimes it happens that LaTeX's final warning "Label(s) may % have changed. Rerun to get cross-references right." appears at % *every* run, i.e., rerunning doesn't help. Or instead, it may % be noticed that certain cross-references keep being wrong. % The only reason I know of is that the runs oscillate between % two decisions about what material should be put onto a certain % page. And the only reason I know for this is that the space % consumed by some cross-reference depends on the page breaking. % I know this problem from critical edition typesetting. % %% * OUTLINE of the SOLUTION offered here: * %% % I simply propose that the user makes up her mind on the nasty % page breaks and forces some at a certain lines, or contributes % her opinion, through \pagebreak (or maybe even \nopagebreak, I % have no idea whether this can be useful). -- A float (`figure' % or `table') may contribute to the problem as well, so you may % move its LaTeX code or change the placement options (through % the brackets argument). % % Typically, one position of such oscillating causes further % page breaking oscillations for many ensuing pages, yielding a % bunch of wrong cross-references and countings. Of course, the % user then should settle the first occurrence of oscillating % before bothering with others -- all the rest of them may % disappear when the first one is fixed. % % One problem with this solution ("?") is that it may be % bothersome to find out where the first oscillation occurs % indeed (by looking through the .dvi's or .pdf's). The present % package tries to help with this. % % With Peter R. Wilson's ledmac, you have the "ballast" % procedure for influencing page breaks. (It is due to John % Lavagnino, Dominik Wujastyk, and Wayne Sullivan, inherited % from EDMAC). It saves you from looking for good positions for % \pagebreak's. I might offer something similar (with % lineno.sty/ednotes.sty). However, I would like to object that % the "ballast" procedure chooses between two page break % possibilities rather "by chance" (reinforcing the first break % idea encountered while the other idea might turn out to be % better). But I must concede: One of the two breaks between the % runs oscillate may turn out not to work, or even both of them % -- when the cross-references have been adjusted to that % decision. The "ballast" procedure may then save some time for % you. On the other hand, if *both* decisions turn out not to % work, I wonder whether the "ballast" method will certainly % find a working one. % %% * USAGE: * %% % 1. \usepackage{lblchng1} in every LaTeX document that you % create, or in every critical edition LaTeX document that you % create, or only when you run into the problem of not settling % label definitions. (Hope that you then remember that there is % such a package!) % % 2a. You will be told about the page numbers where some \label % (or, with Stephan I. B\"ottcher's lineno.sty or its extension % ednotes.sty, some \linelabel) appears. Observe the page breaks % in the .dvi's or .pdf's in the corresponding region. Note that % the passage which causes the oscillation may be a number of % pages earlier than the page number mentioned in the warning. % (Sorry, this is the price of cheapness.) You can get rid of % the warning without fixing the real problem -- fixing a late % page break preceding the \label -- but this may cause badly % filled pages earlier. So it will be wise to identify the very % first passage causing oscillating page breaks. -- Another % conjecturing hint: According to the diagnosis that I delivered % above, the first oscillation happens near a cross-reference % whose length varies due to the oscillation. So look for some % \ref (or \lineref) referring forward(!). If you are lucky, the % \ref refers to the label whose change has been warned about. % % 2b. If you are working with *ednotes.sty*: ednotes.sty v1.1 % does something similar with internal informations about each % note, and it delivers a similar message on screen and in .log. % It reports on three page numbers. However, the first % oscillation happens (I think) at most one page before the % reported ones. % % 3a. As indicated above, try to force a certain page break at % this passage through \pagebreak (or \nopagebreak?) -- or % change the position of a `figure' or `table' in code or in % output (brackets argument), if it seems to contribute to the % problem. Concerning \pagebreak (\nopagebreak), I personally % also think of using the optional argument in the brackets, % while I feel unable to judge the value of this. -- I also % recommend that you use \typeout near the \pagebreak or so to % remind yourself of the \pagebreak -- in case the \pagebreak % after some changes suddenly produces a very bad page break % and you don't examine the output with sufficient carefulness, % being in a hurry, e.g. % % 3b. With *ledmac*, you may experiment with the "ballast" % amount until that first oscillation stops. % %% * A minor WARNING: * (LaTeX version) %% % A remark as of 1995/07/13 in ltmiscen.dtx makes me wonder % whether the present package works with older versions of % LaTeX. % %% * CRITICAL EDITIONS: * (lineno.sty, ednotes.sty, ledmac) %% % 1. With Stephan I. B\"ottcher's lineno.sty and its extension % ednotes.sty, oscillating page breaking also results in wrong % pagewise numbering of lines and in wrongly placed-and-numbered % footnotes. I am thinking of refining lineno.sty in addition to % the present package. On the other hand, I conjecture that % wrong pagewise numbering is *always* (at least sufficiently % often) closely accompanied by oscillating cross-references, so % the present package may offer sufficient help. -- Well, sorry, % this may remain being true with respect to lineno.sty, but % since March 2005, ednotes.sty treats its internal line number % references in a way that makes them "invisible" to % lblchng1.sty. This is very necessary for huge editions with, % say, 10.000 notes or more, for a memory capacity reason. % ednotes.sty uses an own procedure to detect page number % changes, to which lblchng1.sty adds perhaps only little. % % 2. I guess that even ledmac users may find the present package % useful, to find out where they have to watch when trying to % adjust the "ballast" appropriately. However, its usefulness % depends on how dense LaTeX \label's appear in the edited text. % Indeed, it is the pages with the numerous critical footnotes % fall where oscillations are likely to occur. \label's may be % here when the comments refer to certain sections etc. of the % edited text, OK, but will they? The line number references % preceding the single notes (just on these "critical" -- in % two senses -- pages) might be much more helpful, yet they are, % with ledmac.sty, not implemented by \label. And it is wise not % to implement them by \label, similarly as with ednotes.sty % above. (ednotes.sty still uses \label, to be sure, but it % redefines \newlabel in a way that is specific to ednotes.sty's % way of storing data about the notes.) % %% * WONDERING REMARK: * %% % Oscillating label definitions do not necessarily result in % anything wrong. The page number in the label definition may % oscillate while not being used by any \pageref. -- I have no % idea at present what this tells us to do if it happens so ... % %% * ACKNOWLEDGEMENTs: * %% % This package is due to Roy Flechner's confidence in our % ednotes.sty and to frightening observations he reported to % us. Thanks also to Peter Wilson for moral support. %% Please send comments via http://contact-ednotes.sty.de.vu. %% * IMPLEMENTATION: * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NeedsTeXFormat{LaTeX2e}[1994/10/30] %% <- \@onelevel@sanitize; also \CheckCommand \reserved@a. \ProvidesPackage{lblchng1}[\filedate\space\fileversion\space ^^Jexhibiting first changed label] %% * Main idea: * % Testing on label changes is done by \@testdef -- at least I % assume this here (and I will somewhat check it). I refine it % so it shows the label name and the page numbers -- clearly, % what could I do else? (Well, I could redefine \label so ...) % %% If LaTeX's \@testdef changes, the present package may better %% be updated: \CheckCommand*\@testdef[3]{% \def\reserved@a{#3}\expandafter \ifx \csname #1@#2\endcsname \reserved@a \else \@tempswatrue \fi} \def\@testdef#1#2#3{%% This is what I expect LaTeX to use. \@ifundefined{#1@#2}\@tempswatrue{%% Like LaTeX: \def\@tempa{#3}% \expandafter \ifx \csname #1@#2\endcsname \@tempa \else \@tempswatrue %% v0.3: moved disabling \@newl@bel from here to below. \fi %% But now: %% To be sure, I additionally assume that the page number is the %% second thing, and more. I have had bad experience with %% hyperref and thus do not assume that there are just two %% things in the last argument of \newlabel. \def\@tempb##1##2##3\@nil##4{% \def##4{##2}\@onelevel@sanitize##4}% %% Well, why not use some initially defined \@LC@extractpno %% instead of this \@tempb? %% TODO %% -- With modern large and fast TeX versions, one should not %% waste a second with such considerations. -- However: %% different effects concerning compatibility. \expandafter \@tempb \@tempa \@nil\@tempa \expandafter\expandafter\expandafter \@tempb \csname#1@#2\endcsname \@nil\@tempb \ifx\@tempa\@tempb \else \typeout{^^JPackage `lblchng1':^^J% *** Page number of label `#2' is changing: ***^^J% \space\space\space\space was \@tempb, will be \@tempa.^^JWatch whether this stops and references get right.}% %% Further testing wouldn't change anything: \def\@newl@bel{\@gobblefour\relax}\fi}} %% Warning: this could create an incompatibility with some other %% package or with some LaTeX version. %% Again: this extra line doesn't pay well nowadays. \endinput VERSION HISTORY: v0.1 2005/02/15 First release for Roy Flechner. v0.2b 2005/02/16 Attempt at \getpagewiselinenumbers -- in vain. Improved explanations. v0.2 2005/02/17 Changed implementation back; but keep completely disabling \newlabel after the report. Only page numbers are reported. (CTAN and ednotes.news received slightly different explanations than Roy Flechner.) v0.3 2005/02/17 \@newl@ble turned off with page no. change only. Doc. warns on compatibility. v0.31 2005/02/27 Additional line on screen. v0.32 2005/03/08 Adapted explanations to ednotes.sty v1.1; warned about usefulness with critical editions. Changed some headings. Acknowledgements. v0.32a 2005/03/21 Minor corrections. v0.32c 2005/10/01 Another typo fix.