Annotation of ttbar/p20_taujets_note/ltabptch.sty, revision 1.1.1.1

1.1       uid12904    1: %% LTabPtch.sty---Uwe L"uck---patch for Longtable. 
                      2: \def\filedate{2005/01/10} \def\fileversion{1.74d}
                      3: %% For David Carlisle's Longtable.sty, version 4.11 
                      4: %% Fixes tools/3180 (Sebastian Rahtz) and tools/3485: 
                      5: %% missing/wrong interline glues above/below table. 
                      6: %% 
                      7: %% Copyright (C) 2002--2004 Uwe L"uck, 
                      8: %% http://www.contact-ednotes.sty.de.vu 
                      9: %% --author-maintained. 
                     10: %%
                     11: %% Usage, no warranty, distribution as in lppl.txt on CTAN 
                     12: %% (macros/latex/base/lppl.txt). 
                     13: %% 
                     14: %% Loading Longtable.sty with options must be done earlier! 
                     15: %% 
                     16: \NeedsTeXFormat{LaTeX2e}[1994/05/20] % \CheckCommand 
                     17: \ProvidesPackage{ltabptch}[\filedate\space v\fileversion\space
                     18:    Longtable patch for tools/3180, 3485 (ul)]
                     19: % 
                     20: % The problem(s): 
                     21: % Sebastian Rahtz (tools/3180) observed 2000/03/05 that there be 
                     22: % a "spurios blank line" below the longtable. This impression 
                     23: % may have been due to two spacing problems: 
                     24: % (1) There is \parskip and some interline glue below longtable, 
                     25: % while there is no \parskip and no interline glue above 
                     26: % (without head as specified by \endhead or \firstendhead) 
                     27: % or just \lineskip 0.0pt (with head---\endhead, \endfirsthead). 
                     28: % (2) After longtable, \prevdepth is the depth of the last line 
                     29: % before the longtable (if there is no head) or the depth of the 
                     30: % head (otherwise). So \prevdepth may be 0pt. By contrast, the 
                     31: % last table row has depth of at least \dp\@arstrutbox--which 
                     32: % should rather matter, and this is 3.6pt or more. 
                     33: % --I have reported something like this as tools/3485, not 
                     34: % entirely correctly. Details are presented below \endinput. 
                     35: % 
                     36: % Solution presented: 
                     37: % (1) I think there should be \parskip and usual interline glue 
                     38: % above, since the same would happen with a table in a center 
                     39: % environment (e.g.). 
                     40: % \noindent seems to work fatally; moreover, \LT@start's decision 
                     41: % whether to enter a new page would ignore \parskip and interline 
                     42: % glue still needed. 
                     43: % So emulate interline glue calculation according to TeXbook p. 80 
                     44: % and add it by \vskip, along with \parskip. 
                     45: % (This is rather a hack---a proper correction should perhaps not 
                     46: % "emulate" but place the interlineglue changes of \LT@array inside 
                     47: % the \vbox \LT@bchunk starts and treat glue between chunks in a 
                     48: % new way.) 
                     49: % (2) Set \prevdepth to depth of box 0 before the latter is 
                     50: % \unvbox'ed (which leaves \prevdepth untouched, TeXbook p. 282) 
                     51: % in \endlongtable. 
                     52: % 
                     53: % I thought David Carlisle would change Longtable according to my 
                     54: % suggestions. By e-mail from 2003/04/07 however, he finds it 
                     55: % better not to change Longtable, in order not to change layouts 
                     56: % of works that have been made using Longtable so far 
                     57: % (e-Mail 2003/04/08). 
                     58: % 
                     59: %% <- TODO: change this when David has changed his mind! 
                     60: % By the way: 
                     61: % 1.) There are two successive lines in the Longtable code (v4.11) 
                     62: %     together saying: 
                     63: %         \prevdepth\z@\global 
                     64: %         \global\let\LT@setprevdepth\relax 
                     65: %     Isn't the first \global just a typo? 
                     66: %     --Yes--this is David Carlisle's answer in his e-mail 
                     67: %     dating from 2004/05/14. 
                     68: % 2.) Couldn't the one-column restriction easily be removed 
                     69: %     by using \columnwidth instead of \hsize? 
                     70: % 
                     71: % Patching is to override Longtable.sty: 
                     72: \RequirePackage{longtable}[2004/02/01] 
                     73: %% TODO: Cf. \CheckCommand below. 
                     74: % Load earlier on your own for choosing Longtable options! 
                     75: % 
                     76: % For (1), we are patching \LT@start, assumed to have been defined 
                     77: % as follows (Longtable v4.11; sorry we can no longer handle v3.16 
                     78: % through 4.10): 
                     79: 
                     80: \CheckCommand*{\LT@start}{%
                     81:   \let\LT@start\endgraf
                     82:   \endgraf\penalty\z@\vskip\LTpre
                     83:   \dimen@\pagetotal
                     84:   \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
                     85:   \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
                     86:   \advance\dimen@ \ht\LT@foot
                     87:   \dimen@ii\vfuzz
                     88:   \vfuzz\maxdimen
                     89:     \setbox\tw@\copy\z@
                     90:     \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
                     91:     \setbox\tw@\vbox{\unvbox\tw@}%
                     92:   \vfuzz\dimen@ii
                     93:   \advance\dimen@ \ht
                     94:         \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
                     95:   \advance\dimen@\dp
                     96:         \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
                     97:   \advance\dimen@ -\pagegoal
                     98:   \ifdim \dimen@>\z@\vfil\break\fi
                     99:       \global\@colroom\@colht
                    100:   \ifvoid\LT@foot\else
                    101:     \advance\vsize-\ht\LT@foot
                    102:     \global\advance\@colroom-\ht\LT@foot
                    103:     \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
                    104:     \maxdepth\z@
                    105:   \fi
                    106:   \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak 
                    107: %% \nobreak new with Longtable v4.11. 
                    108:   \output{\LT@output}}
                    109: % 
                    110: % Change it: 
                    111: \def\LT@start{%
                    112:   \let\LT@start\endgraf
                    113:   \endgraf\penalty\z@\vskip\LTpre
                    114:  \vskip\parskip %% U.L. 
                    115: % I want to add the interline glue before \pagetotal goes to \dimen@. 
                    116: % So I move \LT@start's \vsplit here. 
                    117:  %% U.L. start: 
                    118:  \dimen@ii\vfuzz 
                    119:  \vfuzz\maxdimen
                    120:    \setbox\tw@\copy\z@
                    121:    \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
                    122:    \setbox\tw@\vbox{\unvbox\tw@}%
                    123:  \vfuzz\dimen@ii
                    124:  \ifdim\prevdepth>-\@m\p@ 
                    125: % First we need the maximum of the heights of \tw@ and head row. 
                    126: % A little flaw might be here: I am ignoring \Lt@start's 
                    127: % \@arstrutbox concern below, cf. remark there. 
                    128:    \@tempskipa % \normalbaselineskip going to enter. 
                    129:      \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi 
                    130: %  \typeout{\@tempskipa=\the\@tempskipa}% TEST 
                    131:    \@tempskipa-\ifdim\@tempskipa<\ht\tw@\ht\tw@\else\@tempskipa\fi 
                    132: %  \typeout{\@tempskipa=\the\@tempskipa}% TEST 
                    133:    \advance\@tempskipa-\prevdepth 
                    134: %  \typeout{\string\prevdepth=\prevdepth}% TEST 
                    135: %  \typeout{\@tempskipa=\the\@tempskipa}% TEST 
                    136:    \advance\@tempskipa\normalbaselineskip 
                    137: %  \typeout{\normallineskiplimit=\the\normallineskiplimit}% TEST 
                    138: %  \typeout{\@tempskipa=\the\@tempskipa}% TEST 
                    139:    \vskip \ifdim\@tempskipa<\normallineskiplimit 
                    140:             \normallineskip 
                    141:           \else 
                    142:             \@tempskipa 
                    143:           \fi 
                    144:  \fi 
                    145:  \nointerlineskip % v1.4 prevent head from adding more 
                    146: %                 % (if only negative) glue. 
                    147: %  \prevdepth -1000\p@ % Prevent head from adding more glue (v1.3). 
                    148:  %% U.L. end. 
                    149:   \dimen@\pagetotal
                    150:   \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
                    151:   \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
                    152:   \advance\dimen@ \ht\LT@foot
                    153: %   \dimen@ii\vfuzz
                    154: %   \vfuzz\maxdimen
                    155: %     \setbox\tw@\copy\z@
                    156: %     \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
                    157: %     \setbox\tw@\vbox{\unvbox\tw@}%
                    158: %   \vfuzz\dimen@ii
                    159: % 
                    160: % Remark U.L.: The following four code lines seem strange to me: 
                    161: % after all, \tw@ contains \@arstrutbox, doesn't it? 
                    162: % And even if not: why should we need room for another \@arstrutbox? 
                    163:   \advance\dimen@ \ht
                    164:         \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
                    165:   \advance\dimen@\dp
                    166:         \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
                    167:   \advance\dimen@ -\pagegoal
                    168:   \ifdim \dimen@>\z@\vfil\break\fi
                    169:       \global\@colroom\@colht
                    170:   \ifvoid\LT@foot\else
                    171:     \advance\vsize-\ht\LT@foot
                    172:     \global\advance\@colroom-\ht\LT@foot
                    173:     \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
                    174:     \maxdepth\z@
                    175:   \fi
                    176:   \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak 
                    177: %% \nobreak new with Longtable 4.11. 
                    178:   \output{\LT@output}}
                    179: % 
                    180: % 
                    181: % For (2), we are patching \endlongtable: 
                    182: % The patch should not change essentials of \endlongtable 
                    183: % which may have changed when this patch meets longtable. 
                    184: % We just assume that the final contribution to the main vertical 
                    185: % list is done by \unvbox0 which is preceded by \LT@start. 
                    186: % \prevdepth\dp0 can be put in between, it will then 
                    187: % last till the end (TeXbook pp. 282, 277f.). 
                    188: \def\@tempa#1\LT@start{#1\LT@start \prevdepth\dp\z@} 
                    189: \expandafter\expandafter\expandafter \def 
                    190:  \expandafter\expandafter\expandafter \endlongtable 
                    191:   \expandafter\expandafter\expandafter 
                    192:    {\expandafter\@tempa\endlongtable} 
                    193: % 
                    194: \endinput 
                    195: 
                    196: DETAILED DIAGNOSIS: 
                    197: 
                    198: Concerning the question of "bugs" vs. "features", you might 
                    199: reason what features should be aimed at. 
                    200: 
                    201: %% TODO: This can be shortened when David agrees. 
                    202: 
                    203:     (A) If there is \parskip below a longtable, there should 
                    204: be \parskip above as well--shouldn't it? 
                    205:     (B) Interline glue above should (in general) depend on the 
                    206: same values of \baselineskip and \lineskip as below---OK? 
                    207:     (C) Interline glue below a longtable should depend on the 
                    208: depth of the last row, not on the depth of the head or of the 
                    209: last line above the longtable--OK? 
                    210: 
                    211: The recent versions of longtable.sty have not satisfied any 
                    212: of these three demands. 
                    213: Concerning (A), \parskip appears below the longtable, but not 
                    214: above. 
                    215: Concerning (B), (i) no interline glue appears above if there 
                    216: is no head, (ii) otherwise, only zero interline glue appears.
                    217: Concerning (C), the interline glue below the longtable is 
                    218: calculated using the depth of (i) the last line above the 
                    219: longtable as \prevdepth when there is no head or of (ii) the 
                    220: head otherwise. (Thus I was wrong earlier when I claimed that 
                    221: \prevdepth were 0pt after longtable. This only holds in the 
                    222: previous case (i) when the last line above the longtable has 
                    223: zero depth.)
                    224: 
                    225: You can observe this by playing with the demonstration file 
                    226: ltabptch.tex in CTAN folder macros/latex/contrib/ltabptch. 
                    227: 
                    228: Reasons: For contributing a head to the main vertical list, 
                    229: longtable uses \copy or \box, which yields a <box> according 
                    230: to TeXbook p. 278. Rows are contributed by \unvbox. Now, 
                    231: violation of (A) is due to the fact that neither \copy or 
                    232: \box of the head nor the \unvbox for table rows leads to 
                    233: execution of an \indent or \noindent (TeXbook pp. 282f., see 
                    234: also <horizontal command>). 
                    235: Violation of (B) is due either to (i) the fact that \unvbox 
                    236: is no <box> (TeXbook p. 282/278) or to (ii) the fact that at 
                    237: \copy or \box \baselineskip and \lineskip are 0pt. 
                    238: Violation of (C) is due to the fact that \unvbox does not 
                    239: change \prevdepth (TeXbook p. 282). 
                    240: 
                    241: As to recognizable effects: 
                    242:     Violation of (A), of course, has very little effect in 
                    243: general since \parskip is 0pt plus 1pt usually. This is hardly 
                    244: recognizable in the presence of the \bigskipamount above and 
                    245: below a longtable. 
                    246:     Violation of (B) results in missing appropriate interline 
                    247: glue above, which often should be 3.6pt or more. This may 
                    248: rather be recognizable and may contribute to the impression 
                    249: that there even is a spurious blank line below the longtable 
                    250: (this is what Sebastion Rahtz reported in tools/3180). 
                    251:     For the previous as well as for the details and the 
                    252: effects of violation of (C), consider the algorithm for 
                    253: calculating interline glue on p. 80 of the TeXbook. If there 
                    254: is no head, and the depth of the last line before the 
                    255: longtable is 0pt, the interline glue below the longtable is 
                    256: \baselineskip minus the height of the first line after the 
                    257: longtable. The interline glue *should be* \baselineskip minus 
                    258: height of following line *minus* depth of last table row--if 
                    259: this depth is not too large (depending on \lineskiplimit). 
                    260: This depth is at least 3.6pt. So the interline glue is often 
                    261: by 3.6pt or more greater than is appropriate. Considering the 
                    262: missing interline glue above the longtable and the \parskip 
                    263: below, the glue after the longtable is by 6.2pt (or more) plus 
                    264: 1pt larger than the glue before. Due to the shrink component 
                    265: of the surrounding \bigskipamount, the glue following the 
                    266: longtable may be nearly twice as large as the glue before.
                    267: ---Usually, violation of (C) has no effect at all. Namely, 
                    268: there is a head usually, and its depth is usually the same as 
                    269: the depth of the last row, namely \dp\@arstrutbox. 
                    270: 
                    271: 
                    272: %% VERSION HISTORY: 
                    273: v1.7  2003/01/07 Sent around 2003/01/13 with first release of 
                    274:                  ednotes.sty. Sent to David Carlisle. Earlier versions 
                    275:                  were sent to Frank Mittelbach and the team. 
                    276: v1.71 2003/01/22 Added version history. 
                    277: v1.72 2003/01/27 Changed copyright notice. 
                    278: v1.73 2004/05/13 Adapted to Longtable v4.11; new copyright; 
                    279:                  longtable -> Longtable (selectively). 
                    280:                  Added `I have ... 3485'. 
                    281: v1.74 2004/08/05 Added `---Yes---...'. 
                    282:       2004/08/21 Typo fix for `problem'; added report on 2003/04/08. 
                    283:       2004/08/23 Corrected and extended diagnosis, sent to CTAN. 
                    284: v1.74b .../08/23 `---' -> `--'; added that (C) usually doesn't 
                    285:                  matter. 
                    286: v1.74c .../08/31 `author-maintained'. 
                    287: v1.74d 2005/01/10 Contact via http. 
                    288: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>