summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/ltabptch/ltabptch.tex
blob: 98d15c99078aaa82176de8f662d2dbec90375ef7 (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
209
210
211
212
213
214
215
216
217
218
219
\documentclass[DIV=9, parskip=half, pagesize=auto]{scrartcl}

\usepackage{fixltx2e}
\usepackage{etex}
\usepackage{xspace}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
\usepackage{array}
\usepackage{microtype}
\usepackage{hyperref}

\newcommand*{\pkg}[1]{\textsf{#1}}
\newcommand*{\cs}[1]{\texttt{\textbackslash#1}}
\makeatletter
\newcommand*{\cmd}[1]{\cs{\expandafter\@gobble\string#1}}
\makeatother
\newcommand*{\env}[1]{\texttt{#1}}
\newcommand*{\meta}[1]{\textlangle\textsl{#1}\textrangle}

\addtokomafont{title}{\rmfamily}

\title{The \pkg{ltabptch} package\thanks{This manual corresponds to \pkg{ltabptch}~v1.74d, dated~2005/01/10.}}
\subtitle{patch for \pkg{Longtable}}
\author{Uwe Lück}
\date{2005/01/10}


\begin{document}

\maketitle

For David Carlisle's \pkg{Longtable.sty}, version 4.11 \\
Fixes \texttt{tools/3180} (Sebastian Rahtz) and \texttt{tools/3485}: 
missing/wrong interline glues above/below table. 
  
\begin{quote}
  \small
  Copyright \textcopyright\ 2002--2004 Uwe Lück, 
  \url{http://www.contact-ednotes.sty.de.vu}. 
  
  Usage, no warranty, distribution as in \texttt{lppl.txt} on CTAN 
  (\href{http://www.ctan.org/pub/tex-archive/macros/latex/base/lppl.txt}{\texttt{macros\slash latex\slash base\slash lppl.txt}}).
\end{quote}


\minisec{The problem(s):}

\renewcommand*{\labelenumi}{(\theenumi)}

Sebastian Rahtz (\texttt{tools/3180}) observed 2000/03/05 that there be 
a ``spurios blank line'' below the \env{longtable}. This impression 
may have been due to two spacing problems: 
%
\begin{enumerate}
\item There is \cmd{\parskip} and some interline glue below \env{longtable}, 
  while there is no \cmd{\parskip} and no interline glue above 
  (without head as specified by \cmd{\endhead} or \cmd{\firstendhead}) 
  or just \cmd{\lineskip} 0.0\,pt (with head---\cmd{\endhead}, \cmd{\endfirsthead}). 
\item After \env{longtable}, \cmd{\prevdepth} is the depth of the last line 
  before the \env{longtable} (if there is no head) or the depth of the 
  head (otherwise). So \cmd{\prevdepth} may be 0\,pt. By contrast, the 
  last table row has depth of at least \verb+\dp\@arstrutbox+---which 
  should rather matter, and this is 3.6\,pt or more. 
\end{enumerate}
%
---\,I have reported something like this as \texttt{tools/3485}, not 
entirely correctly. Details are presented below. 


\minisec{Solution presented:}

\begin{enumerate}
\item I think there should be \cmd{\parskip} and usual interline glue 
  above, since the same would happen with a table in a center 
  environment (e.\,g.)\@. 
  \cmd{\noindent} seems to work fatally; moreover, \cmd{\LT@start}'s decision 
  whether to enter a new page would ignore \cmd{\parskip} and interline 
  glue still needed. 
  So emulate interline glue calculation according to \TeX book~p.~80 
  and add it by \cmd{\vskip}, along with \cmd{\parskip}. 
  (This is rather a hack---a proper correction should perhaps not 
  ``emulate'' but place the interlineglue changes of \cmd{\LT@array} inside 
  the \cmd{\vbox} \cmd{\LT@bchunk} starts and treat glue between chunks in a 
  new way.) 
\item Set \cmd{\prevdepth} to depth of box~0 before the latter is 
  \cmd{\unvbox}'ed (which leaves \cmd{\prevdepth} untouched, \TeX book~p.~ 282) 
  in \cmd{\endlongtable}. 
\end{enumerate}
%
I thought David Carlisle would change \pkg{Longtable} according to my 
suggestions. By e-mail from 2003/04/07 however, he finds it 
better not to change \pkg{Longtable}, in order not to change layouts 
of works that have been made using \pkg{Longtable} so far 
(e-Mail 2003/04/08).


\minisec{By the way:}

\renewcommand*{\labelenumi}{\theenumi.)}

\begin{enumerate}
\item There are two successive lines in the \pkg{Longtable} code (v4.11) 
  together saying:
  % 
\begin{verbatim}
\prevdepth\z@\global 
\global\let\LT@setprevdepth\relax 
\end{verbatim}
  % 
  Isn't the first \cmd{\global} just a typo? 
  --Yes--this is David Carlisle's answer in his e-mail 
  dating from 2004/05/14. 
\item Couldn't the one-column restriction easily be removed 
  by using \cmd{\columnwidth} instead of \cmd{\hsize}? 
\end{enumerate}


\minisec{Detailed diagnosis:}

\renewcommand*{\theenumi}{(\Alph{enumi})}
\renewcommand*{\labelenumi}{\theenumi}

Concerning the question of ``bugs'' vs.\ ``features'', you might 
reason what features should be aimed at. 
%
\begin{enumerate}
\item \label{item:A} If there is \cmd{\parskip} below a \env{longtable}, there should 
  be \cmd{\parskip} above as well--shouldn't it? 
\item \label{item:B} Interline glue above should (in general) depend on the 
  same values of \cmd{\base\-line\-skip} and \cmd{\lineskip} as below---OK? 
\item \label{item:C} Interline glue below a \env{longtable} should depend on the 
  depth of the last row, not on the depth of the head or of the 
  last line above the \env{longtable}--OK? 
\end{enumerate}
%
The recent versions of \pkg{longtable.sty} have not satisfied any 
of these three demands. 
Concerning~\ref{item:A}, \cmd{\parskip} appears below the \env{longtable}, but not 
above. 
Concerning~\ref{item:B}, (i)~no interline glue appears above if there 
is no head, (ii)~otherwise, only zero interline glue appears.
Concerning~\ref{item:C}, the interline glue below the \env{longtable} is 
calculated using the depth of (i)~the last line above the 
\env{longtable} as \cmd{\prevdepth} when there is no head or of (ii)~the 
head otherwise. (Thus I was wrong earlier when I claimed that 
\cmd{\prevdepth} were 0\,pt after \env{longtable}. This only holds in the 
previous case (i)~when the last line above the \env{longtable} has 
zero depth.)

You can observe this by playing with the demonstration file 
\texttt{ltabptch.tex} in CTAN folder \href{http://www.ctan.org/pub/tex-archive/macros/latex/contrib/ltabptch/}{\texttt{macros/latex/contrib/ltabptch}}.

Reasons: For contributing a head to the main vertical list, 
\env{longtable} uses \cmd{\copy} or \cmd{\box}, which yields a \meta{box} according 
to \TeX book~p.~278. Rows are contributed by \cmd{\unvbox}. Now, 
violation of~\ref{item:A} is due to the fact that neither \cmd{\copy} or 
\cmd{\box} of the head nor the \cmd{\unvbox} for table rows leads to 
execution of an \cmd{\indent} or \cmd{\noindent} (\TeX book~pp.~282\,f.,\ see 
also \meta{horizontal command}). 
Violation of~\ref{item:B} is due either to (i)~the fact that \cmd{\unvbox} 
is no \meta{box} (\TeX book~p.~282/278) or to (ii)~the fact that at 
\cmd{\copy} or \cmd{\box} \cmd{\baselineskip} and \cmd{\lineskip} are 0\,pt. 
Violation of~\ref{item:C} is due to the fact that \cmd{\unvbox} does not 
change \cmd{\prevdepth} (\TeX book~p.~282). 

As to recognizable effects: 
%
\begin{itemize}
\item Violation of~\ref{item:A}, of course, has very little effect in 
  general since \cmd{\parskip} is \texttt{0pt plus 1pt} usually. This is hardly 
  recognizable in the presence of the \cmd{\bigskipamount} above and 
  below a \env{longtable}. 
  
\item Violation of~\ref{item:B} results in missing appropriate interline 
  glue above, which often should be 3.6\,pt or more. This may 
  rather be recognizable and may contribute to the impression 
  that there even is a spurious blank line below the \env{longtable} 
  (this is what Sebastion Rahtz reported in \texttt{tools/3180}). 
  
\item For the previous as well as for the details and the 
  effects of violation of~\ref{item:C}, consider the algorithm for 
  calculating interline glue on p.~80 of the \TeX book. If there 
  is no head, and the depth of the last line before the 
  \env{longtable} is 0\,pt, the interline glue below the \env{longtable} is 
  \cmd{\baselineskip} minus the height of the first line after the 
  \env{longtable}. The interline glue \emph{should be} \cmd{\baselineskip} minus 
  height of following line \emph{minus} depth of last table row--if 
  this depth is not too large (depending on \cmd{\lineskiplimit}). 
  This depth is at least 3.6\,pt. So the interline glue is often 
  by 3.6\,pt or more greater than is appropriate. Considering the 
  missing interline glue above the \env{longtable} and the \cmd{\parskip}
  below, the glue after the \env{longtable} is by 6.2\,pt (or more) plus 
  1\,pt larger than the glue before. Due to the shrink component 
  of the surrounding \cmd{\bigskipamount}, the glue following the 
  \env{longtable} may be nearly twice as large as the glue before.
  ---\,Usually, violation of~\ref{item:C} has no effect at all. Namely, 
  there is a head usually, and its depth is usually the same as 
  the depth of the last row, namely \verb+\dp\@arstrutbox+. 
\end{itemize}


\minisec{Version history:}

\begin{tabular}{@{}lr>{\raggedright\arraybackslash}p{93mm}@{}}
  v1.7   & 2003/01/07   & Sent around 2003/01/13 with first release of \pkg{ednotes.sty}. Sent to David Carlisle. Earlier versions were sent to Frank Mittelbach and the team. \\
  v1.71  & 2003/01/22   & Added version history.                                                                                                                               \\
  v1.72  & 2003/01/27   & Changed copyright notice.                                                                                                                            \\
  v1.73  & 2004/05/13   & Adapted to \pkg{Longtable}~v4.11; new copyright; \pkg{longtable} $\to$ \pkg{Longtable} (selectively). Added `I have \ldots \texttt{3485}'.                                      \\
  v1.74  & 2004/08/05   & Added `---Yes---\ldots'.                                                                                                                             \\
         & 2004/08/21   & Typo fix for `problem'; added report on 2003/04/08.                                                                                                  \\
         & 2004/08/23   & Corrected and extended diagnosis, sent to CTAN.                                                                                                      \\
  v1.74b & \ldots/08/23 & `---' $\to$ `--'; added that~\ref{item:C} usually doesn't matter.                                                                                    \\
  v1.74c & \ldots/08/31 & `author-maintained'.                                                                                                                                 \\
  v1.74d & 2005/01/10   & Contact via \textsc{http}.
\end{tabular}

\end{document}