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 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
|
%
% T A B L S . S T Y (ver 3.5)
%
% Copyright (c) 1989-1996 by Donald Arseneau
% from
% LaTeX, Copyright (c) 1985... by Leslie Lamport
%
% Modify LaTeX's array and tabular environments to keep text from touching
% other text or hlines above or below. See instructions after \endinput.
%
%----------------------------------------------------------------------
% create registers and default settings:
\newdimen\tablinesep \tablinesep= 1pt \let\tablineskip=\tablinesep
\newdimen\arraylinesep \arraylinesep= 1pt \let\arraylineskip=\arraylinesep
\newdimen\extrarulesep \extrarulesep= 3pt
\newdimen\@arstdepth \newdimen\@arstheight \newdimen\@skip@bove
\let\@tarlinesep\z@ % so outermost arrays will not act nested
% Change the initializations to create a smaller strut and include
% my macros in the initialization for the preamble.
\def\@array[#1]#2{% remember global variables to allow recursion:
\edef\@unrecurse{\global\@skip@bove\the\@skip@bove
\global\@arstheight\the\@arstheight\global\@arstdepth\the\@arstdepth}%
% Make the strut on the first line be shorter by the linesep outside
\let\@otarlinesep\@tarlinesep \global\@skip@bove-\@otarlinesep
% This setup works for both tabular and array because of this test:
\ifx\@classz\@arrayclassz \let\@tarlinesep\arraylinesep
\else \let\@tarlinesep\tablinesep \fi
\divide\@tarlinesep\tw@ % half sep is applied to height & depth
\let\@seesize\relax \let\@rememsize\relax \@mkpream{#2}%
\@tempdima\arraystretch\ht\strutbox \@tempdimb\arraystretch\dp\strutbox
\ifdim\@tarlinesep>\z@ % (need \protect for \multicolumn)
\def\@rememsize{\protect\@r@m@msize}\let\@seesize\@s@@size
\advance\@tempdima-\@tarlinesep \advance\@tempdimb-\@tarlinesep
\fi \setbox\@arstrutbox\hbox{% set up smaller strut
\vrule \@height\@tempdima \@depth\@tempdimb \@width\z@}%
\let\protect\noexpand
\edef\@preamble{\ialign \noexpand\@halignto \bgroup
\unhcopy\@arstrutbox \@preamble \tabskip\z@skip &\@sharp \cr}%
% I have added an extra column (&\@sharp) to take the smart strut.
\let\@startpbox\@@startpbox \let\@endpbox\@@endpbox
\if#1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
\bgroup \let\par\@empty
\global\@arstheight\ht\@arstrutbox \global\@arstdepth\dp\@arstrutbox
\advance\extrarulesep.5\arrayrulewidth
\let\@sharp##\let\protect\relax \lineskip\z@skip \baselineskip\z@skip
\@preamble}
% Change the meaning of \\ to do the final strut calculation and
% put in the smart strut
\def\@xtabularcr{\@ifnextchar[{\@argtabularcr}{\@argtabularcr[\z@]}}
\def\@xarraycr{\aftergroup\@argarraycr\@xtabularcr}
\def\@argarraycr{${}}% put this "aftergroup" so we can combine macro streams
% Sense a following \end, and adjust spacing accordingly;
% Sense a rule below, as signalled by "\noalign" after expansion
\def\@argtabularcr[#1]{\ifnum\z@=`{\fi}&\omit % end group, new column
{\ifnum\z@=`}\fi
\global\advance\@arstheight\@skip@bove % use \@skip@bove so it is available
\global\@skip@bove#1\relax % actually, the skip below
\@ifnextchar\end{\global\advance\@arstdepth-\@otarlinesep\@mystrutcr}%
{\expandafter\expandafter\expandafter\@xargarraycr}}
\def\@xargarraycr{\@ifnextchar\noalign
{\global\advance\@arstdepth\extrarulesep \@mystrutcr}%
{\@mystrutcr}}
\def\@mystrutcr{% \@skip@bove is really the parameter for skip below here
\ifdim\@skip@bove>\z@ \advance\@arstdepth\@skip@bove \global\@skip@bove\z@\fi
\advance\@arstheight\@tarlinesep \advance\@arstdepth\@tarlinesep
\vrule \@height\@arstheight \@depth\@arstdepth \@width\z@
\global\@arstheight\ht\@arstrutbox \global\@arstdepth\dp\@arstrutbox
\ifnum\z@=`{\fi}\cr
\ifdim\@skip@bove<\z@ \noalign{\vskip\@skip@bove \global\@skip@bove\z@}\fi}
% Simulate \crcr at the end of the table, assuming that we are not in
% vmode once a line of entries has started. This fails to put in a smart
% strut if the table ends without \\ while in vmode in a column entry.
% Use \@unrecurse to simulate grouping of global parameters.
% For nested tables and arrays, the final strut is reduced by the linesep
% that will be added at the outer level.
\def\endtabular{\endarray $\egroup}
\expandafter\let\csname endtabular*\endcsname=\endtabular
\def\endarray{\ifvmode\csname crcr\endcsname % just do \crcr if \\ given
\else \\[\z@ \global\advance\@arstdepth-\@otarlinesep]%
\fi\egroup\@unrecurse\egroup}
% Put \@seesize...\@rememsize in all preamble templates
\def\@tabclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or
\or \or \@addamp \or
\@acolampacol \or \@firstampfalse \@acol \fi
\edef\@preamble{\@preamble{%
\ifcase
\@chnum \hfil\@seesize\ignorespaces\@sharp\unskip\@rememsize \hfil
\or \@seesize\ignorespaces\@sharp\unskip\@rememsize \hfil
\or \hfil\hskip\z@skip\@seesize\ignorespaces\@sharp\unskip\@rememsize
\fi}}}
\def\@arrayclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or
\or \or \@addamp \or
\@acolampacol \or \@firstampfalse \@acol \fi
\edef\@preamble{\@preamble
\ifcase \@chnum
\hfil\@seesize $\relax\@sharp$\@rememsize \hfil
\or \@seesize $\relax\@sharp$\@rememsize \hfil
\or \hfil\@seesize $\relax\@sharp$\@rememsize \fi}}
\def\@classv{\@addtopreamble{\@seesize\@startpbox{\@nextchar}%
\ignorespaces\@sharp\@endpbox\@rememsize}}
% my macros to keep track of the size of entries.
\def\@s@@size{\setbox\z@\hbox\bgroup\bgroup}
\def\@r@m@msize{\egroup\egroup % end the \hbox
\ifdim\ht\z@>\@arstheight \global\@arstheight\ht\z@ \fi
\ifdim\dp\z@>\@arstdepth \global\@arstdepth \dp\z@ \fi
\unhbox\z@}
% Redefine \hline to remove notches and to give extrarulesep and
% optional [] skip
\def\hline{\noalign{\ifnum\z@=`}\fi\kern-.5\arrayrulewidth
\hrule \@height \arrayrulewidth \kern-.5\arrayrulewidth
\global\@skip@bove\extrarulesep
\@ifnextchar[\@yhline{\expandafter\expandafter\expandafter\@zhline}}
\def\@xhline{\ifx\@tempa\noalign \vskip\doublerulesep \fi % may be the opt.
\ifnum`{=\z@\fi}}
\def\@yhline[#1]{\doublerulesep#1\global\advance\@skip@bove#1\relax
\expandafter\expandafter\expandafter\@zhline}
\def\@zhline{\futurelet\@tempa\@xhline}%
% make \cline give the \extrarulesep below
\let\TB@cline\cline
\def\cline#1{\noalign{\kern-.5\arrayrulewidth}%
\TB@cline{#1}%
\noalign{\global\@skip@bove\extrarulesep \kern.5\arrayrulewidth}}%
\endinput
% -----------------------------------------------------------------
%
% Modify LaTeX's array and tabular environments to keep text from touching
% other text or hlines above or below. There are three new parameters:
%
% \tablinesep (or \tablelineskip): minimum space between text on successive
% lines in a tabular environment. Negative distances are
% treated as zero. The default value is 1pt. 0pt turns off
% checking for touching text. Text given in an @{ }
% specification is never checked for overlap.
%
% \arraylinesep (or \arraylineskip): like \tablinesep, but for arrays.
%
% \extrarulesep : extra space to add above and below each \hline and \cline.
% There will be at least \extrarulesep + 0.5\tablinesep
% between an \hline and a line of text. Negative values can
% be used, but only until some text touches the line.
% The default value is 3pt.
%
% To ensure interline separations in tables but not arrays, declare
% \setlength\arraylinesep{0pt}
% The appearance of normal LaTeX tables can be had with
% \setlength\tablinesep{0pt}
% \setlength\arraylinesep{0pt}
% \setlength\extrarulesep{0pt}
% but it would be better to not use tabls in this situation.
%
% \hline[dimen]:
%
% \hline has been changed to take an optional length argument just like \\
% giving the space to insert below. This space is in addition to the
% \extrarulesep and linesep. A negative value will reduce the space until
% the hline touches some text below, and then will have no further effect.
% E.g., \hline[-9in] draws a horizontal line while suppressing the extrarulesep
% beneath. Also, the new \hline FIXES THE NOTCHES that used to appear at the
% junction between horizontal and vertical lines.
%
% How it works:
% There are no struts in the preamble entries (lie), rather, there are
% tests to measure the maximum height and depth of all entries on a line.
% The maximum values start at the size of LaTeX's \@arstrut minus the
% appropriate linesep. At the \\, a strut is inserted (in its own
% column) which is that maximum size plus the linesep plus any additional
% space for separation from \hline s.
%
% The Downside:
% Building a table will be slower than before because the entries have to
% be boxed twice (by \@seesize and by \halign itself) instead of just once.
% \setlength\tablinesep{0pt} will recover most of this speed, with
% \extrarulesep still partially in effect--extra space will still be added
% around hlines, but it may be taken up by very tall or very deep table
% entries; thus text may still touch the lines. Because of the speed penalty,
% if your computer is slow, it is probably best to omit the TABLS option
% until producing a final copy.
%
% (2.2) \endtabular* is defined (it was left out before. oops!)
% change some \z@ to \z@skip. Thanks to Michael Downes.
% Create alias \tablinesep = \tablelineskip for consistency with
% \tabcolsep nomenclature. \def\\{\crcr} used in ver 2.1 didn't work right,
% so use \csname crcr\endcsname.
%
% (3.0) Arrays are included! The very top and bottom struts of nested
% arrays are reduced by the lesser of the inner and outer lineseps so space
% doesn't accumulate with each level of nesting.
%
% (3.1 & 3.2 & 3.3) Minor changes to match LaTeX updates.
%
% (3.4) More extensive changes, prompted by LaTeX updates. You can now hide
% \hline in another macro, and it is still recognized. [Similar commands that
% add \extrarulesep must begin with \noalign.] \hline[3pt]\hline is now
% reasonable. (Also try \hline[0pt]\hline!)
%
% (3.5) Fix several (non-crashing) bugs introduced in 3.4
%
% Send problem reports to asnd@Reg.TRIUMF.CA
%
% Test integrity of file:
% brackets: round, square, curly, angle: () [] {} <>
% backslash, slash, vertical, at, dollar, and: \ / | @ $ &
% hat, grave, acute (apostrophe), quote, tilde: ^ ` ' " ~
|