summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/tabls/tabls.sty
blob: 9ad268ff37d5607ac7e50e62a2d623b7b1e852fd (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
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
%
%  T A B L S . S T Y           (ver 3.5)
%
%  Copyright (c) 1989-1996  by Donald Arseneau
%
%  These macros may be freely used, transmitted, reproduced, or modified
%  provided that this notice is left intact.
%
%  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@triumf.ca
%
%  Test integrity of file:
%  brackets: round, square, curly, angle:   () [] {} <>
%  backslash, slash, vertical, at, dollar, and: \ / | @ $ &
%  hat, grave, acute (apostrophe), quote, tilde:   ^ ` ' " ~