summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/texsis/base/TXSruled.tex
blob: d7c1c21d5b944c1b69f9bbd6872c4a0214acf606 (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
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
%% file: TXSruled.tex - Ruled Tables - TeXsis version 2.18
%% @(#) $Id: TXSruled.tex,v 18.0 1999/07/09 17:24:29 myers Exp $
%======================================================================*
%
%       These macros will typeset tables with vertical and
% horizontal rules. The syntax is similar to Ray Cowan's TABLES.TEX,
% but the macros have been completely rewritten. Vertical and horizontal 
% rules are drawn by macros using vertical spacing controlled by struts.
% Usage:
%       \ruledtable
%       <item> <tab> ... <item> <cr>
%       ...
%       <item> <tab> ... <item> \endruledtable
% where <item> is an element of the table (every row must have exactly 
% the same number of items, although some may be blank), <tab> is any
% one of
%     &                 for no vertical rule
%     |  [or \vb]       for vertical rule
%     \| [or \Vb]       for thick vertical rule
%     \dbl              for double vertical rule
% and <cr> is any one of
%     \nr               for no horizontal rule
%     \cr               for horizontal rule
%     \CR [or \crthick] for thick horizontal rule
% The last <cr> must be omitted in favour of the \endruledtable
%
%  For horizontal rules across only some columns use
%       ... \nr
%       \crule | \cskip & \Crule ... \crpart
% where \crpart is a special \cr for the partial rule line and
%       \cskip          no rule for column
%       \crule          horizontal rule for column
%       \Crule          thick horizontal rule for column
% The number of columns must be identical to the other rows.
%
% To change the appearance of the table, modify \TableItem.
% Several modifications are built in:
%       \LeftJustifyTables      left justify each column
%       \RightJustifyTables     right justify each item
%       \NoJustifyTables        center each item (default)
%       \tablespace             horizontal spacing around each item 
%                               (default is \quad)
%       \TightTables            use \ horizontal spacing
%       \LooseTables            use \quad horizontal spacing (default)
%
% Use \bigitem to expand the vertical strut for high or deep items. 
%
%       These macros have been reorganized and substantially revised from
% version 2.13. The following functional changes have been made:
%       (1) The @ signs have been removed from the names of the macros
% used to save the Plain \cr, \span, and & so that they can be used to
% modify the preamble. See above.
%       (2) Macros for partial horizontal rules have been added.
%       (3) \tabskip glue has been added so that \tablewidth works
% correctly -- the table stretches uniformly over all columns.
%       (4) \linecount has been moved to the \cr macros. It produces a
% warning if the number of columns is different from that in the
% previous row.
%       (5) Trailing spaces in the table items are added to the output.
% A macro \NoTrailingSpaces inserts an \unskip after each item to remove
% them. But this also removes trailing skips unless they are followed by
% an empty \hbox or something similar. This is done automatically for 
% an \hfill (frequently used to left justify an item).
%       The default is \TrailingSpaces, but you may wish to insert
% \NoTrailingSpaces in your TXSsite.tex file.
%       (6) \para uses \normalbaselines rather than specific pt values 
% for the interline spacing and the final strut.
%
% (C) copyright 1990, 1991 by Eric Myers and Frank E. Paige
%======================================================================*
% Counters and such:     
\catcode`@=11                                   % @ is a letter here
\catcode`\|=12                                  % make sure | is not active
\catcode`\&=4                                   % and that & is alignment tab

\newcount\ncols         \ncols=\z@              % number of columns in table
\newcount\nrows         \nrows=\z@              % number of rows in table
\newcount\curcol        \curcol=\z@             % current column counter
\let\currow=\nrows                              % current row counter
     
\newdimen\thinsize      \thinsize=0.6pt         % thin rule width
\newdimen\thicksize     \thicksize=1.5pt        % thick rule width
\newdimen\tablewidth    \tablewidth=-\maxdimen  % start ``turned off''
\newdimen\parasize      \parasize=4in           % paragraph size in tables

\newif\iftableinfo      \tableinfotrue          % report rows and columns? Yes
\newif\ifcentertables   \centertablestrue       % center tables? Yes
\def\centeredtables{\centertablestrue}%
\def\noncenteredtables{\centertablesfalse}%
\def\nocenteredtables{\centertablesfalse}%      % synonym !
     
\let\plaincr=\cr                        % save real \cr
\let\plainspan=\span                    % save real \span
\let\plaintab=&                         % save real alignment tab &
\def\ampersand{\char`\&}%               % to print `&' in text
\let\lparen=(                           % save left paren     
\let\NX=\noexpand                       % shorthand for \noexpand is \NX

%---------------------------------------*
% Main macros:
%       \ruledtable <table stuff> \endruledtable turns on the ruled
% table definitions and makes the table with \halign. It handles all
% the control stuff; the real work is done by \@RuledTable.
     
\def\ruledtable{\relax                          % make ruled table
    \@BeginRuledTable                           % initialize table
    \@RuledTable}%                              % now process table body

%  \@BeginRuledTable does all the work of setting things up before
% we read in the body of the table

\def\@BeginRuledTable{%                         % initialize table
   \ncols=0\nrows=0                             % reset row and column count
   \begingroup                                  % keep the following local
    \offinterlineskip                           % so vrules touch
    \def~{\phantom{0}}%                         % ~ is phantom digit
    \def\span{\plainspan\omit\relax\colcount\plainspan}%  \span USER columns
    \let\cr=\crrule                             % \cr gives a \tablerule
    \let\CR=\crthick                            % \CR gives a \thickrule
    \let\nr=\crnorule                           % \nr give no rule
    \let\|=\Vb                                  % thick vrule between columns
    \def\hfill{\hskip0pt plus1fill\hbox{}}%     % so it is not removed
% 
% support old \tablestrut in place of \tstrut if it exists
%
    \ifx\tablestrut\undefined\relax             % if not defined, no problem
    \else\let\tstrut=\tablestrut\fi             % use \tablestrut
%
    \catcode`\|=13 \catcode`\&=13\relax         % make | and & active
    \TableActive                                % | and & get active \def`s
    \curcol=1                                   % reset column count
%
% define \Halign to do an \halign with or without a width
%
    \ifdim\tablewidth>-\maxdimen\relax          %
      \edef\@Halign{\NX\halign to \NX\tablewidth\NX\bgroup\TablePreamble}% 
      \tabskip=0pt plus 1fil                    % let things stretch
    \else                                       %
      \edef\@Halign{\NX\halign\NX\bgroup\TablePreamble}% 
      \tabskip=0pt                              % no stretch between columns
    \fi                                         %
%
% center text if needed
%
    \ifcentertables                             % should table be centered?
       \ifhmode\vskip 0pt\fi                    % yes: force vertical mode
       \line\bgroup\hss                         % center across page
    \else\hbox\bgroup                           % else: just put in \hbox
    \fi}%                                       % end of \@BeginRuledTable


%       \@RuledTable builds the table with \@Halign and getting the
% table body text as its argument.

\long\def\@RuledTable#1\endruledtable{%         % ruled table alignment
   \vrule width\thicksize                       % thick rule on side
     \vbox{\@Halign                             % then do \halign
       \thickrule                               % thick rule on top
       #1\killspace                             % body of table
       \tstrut                                  % vertical strut for last line
       \linecount                               % count this line
       \plaincr\thickrule                       % \cr, thick rule on bottom
     \egroup}%                                  % end of \halign and \vbox
   \vrule width\thicksize                       % thick rule on side, end \hbox
   \ifcentertables\hss\fi\egroup                % finish table centering
  \endgroup                                     % end group from \ruledtable
  \global\tablewidth=-\maxdimen                 %   and reset width
  \iftableinfo                                  % report rows and columns
      \immediate\write16{[Nrows=\the\nrows, Ncols=\the\ncols]}%
   \fi}%                                        % end of \@RuledTable
     
%---------------------------------------*
% Preamble and item macros:
%       \TablePreamble is the preamble for the \halign in \ruledtable. 
%       To change how each item is processed change \TableItem.  
%       To make a more complicated table you can change \TablePreamble,
% but if you do so use the following substitutions in a standard \halign 
% preamble:
%    for  &     use     \plaintab
%    for  \cr   use     \plaincr
%    for  #     use     ##
%    for  ##    use     ####

\def\TablePreamble{%                    % \ruledtable preamble
   \TableItem{####}%                    % the first item
   \plaintab\plaintab                   % && means repeat this
   \TableItem{####}%                    % the subsequent items
   \plaincr}%                           % end of preamble


%       \TableItem contains glue or spacing around the item

\def\@TableItem#1{%                     % centers item in ruled table
   \hfil\tablespace                     % left glue
   #1\killspace%                        % item
   \tablespace\hfil                     % right glue
    }%

\def\@tableright#1{%                    % right justifies item in ruled table
   \hfil\tablespace\relax               % left glue
   #1\killspace%                        % item
   \tablespace\relax}%                  % right glue

\def\@tableleft#1{%                     % left justifies item in ruled table
   \tablespace\relax                    % left glue
   #1\killspace%                        % item
   \tablespace\hfil}%                   % right glue

\let\TableItem=\@TableItem              % default is centered
     
\def\RightJustifyTables{\let\TableItem=\@tableright}%   % to right justify
\def\LeftJustifyTables{\let\TableItem=\@tableleft}%     % to left justify
\def\NoJustifyTables{\let\TableItem=\@TableItem}%       % to center


%       \TightTables makes the spacing of a table as tight as possible.
% \LooseTables, the default, gives more pleasing spacing.

\def\LooseTables{\let\tablespace=\quad}%        % table spacing is \quad
\def\TightTables{\let\tablespace=\space}%       % table spacing is space
\LooseTables                                    % default is \quad


%       \TrailingSpaces, the default, allows trailing spaces and glue
% to change the appearance of a table. \NoTrailingSpaces removes all
% trailing spaces and glue before inserting the table glue.

\def\TrailingSpaces{\let\killspace=\relax}      % do not kill trailing space
\def\NoTrailingSpaces{\let\killspace=\unskip}   % kill trailing space
\TrailingSpaces                                 % default

%---------------------------------------*
% Table Height and Width:
%
%  Normally tables are set to their natural width.  If \tablewidth
%  has been set then we set the table to that width instead,
%  but only for the next table.  Then \tablewidth is turned off

%      \setRuledStrut sets up the vertical strut \tstrut with
% the appropriate dimensions to hold up one line of a ruled table. 

\def\setRuledStrut{% sets interlines spacing for ruled tables
   \dimen@=\baselineskip                        % \dimen@ = extra space
   \advance\dimen@ by-\normalbaselineskip       % between lines
   \ifdim\dimen@<.5ex \dimen@=.5ex\fi           % minimum space
   \setbox0=\hbox{\lparen}%                     % get character size
   \dimen1=\dimen@ \advance\dimen1 by \ht0      %% space above line
   \dimen2=\dimen@ \advance\dimen2 by \dp0      %% space below line
   \def\tstrut{\vrule height\dimen1 depth\dimen2 width\z@}%
   }%

\def\tstrut{\vrule height 3.1ex depth 1.2ex width 0pt}%  default


%      \tstrut does not produce the correct spacing if the entry in
% the table is too high. The following constructs a strut higher than its
% argument and then prints the argument. The minimum space value should
% be the same as in \setRuledStrut. 

\def\bigitem#1{%                                % larger table entry
   \dimen@=\baselineskip                        % \dimen@ = extra space
   \advance\dimen@ by-\normalbaselineskip       % between lines
   \ifdim\dimen@<.5ex \dimen@=.5ex\fi           % minimum space
   \setbox0=\hbox{#1}%                          % get argument size
   \dimen1=\dimen@ \advance\dimen1 by \ht0      % space above line
   \dimen2=\dimen@ \advance\dimen2 by \dp0      % space below line
   \vrule height\dimen1 depth\dimen2 width\z@   % make strut to size
   \copy0}%                                     % print argument


%       \vctr{stuff} centers the stuff vertically, so that it can
% appear between two ROWS.
     
\def\vctr#1{\hfil\vbox to 0pt{\vss\hbox{#1}\vss}\hfil}%

%---------------------------------------*
% Vertical rules:
%       \tab, \vb and \Vb are used in a table to separate columns with no
% rule, a thin rule, or a thick rule, respectively.  \nextcolumn{<rule>} skips
% to  the next column and puts the <rule> between columns.  Use this to build
% your own separators.
     
\def\nextcolumn#1{%                             % move to next col.
   \plaintab\omit#1\relax\colcount              % tab, insert #1, count
   \plaintab}%                                  % tab to next user col.
     
\def\tab{%                                      % no rule between columns
   \nextcolumn{\relax}}%                        % count column

\let\novb=\tab                                  % synonym for \tab

\def\vb{%                                       % thin rule between columns
   \nextcolumn{\vrule width\thinsize}}%         % count and rule

\def\Vb{%                                       % THICK rule between columns
   \nextcolumn{\vrule width\thicksize}}%        % count and thick rule

\def\dbl{%                                      % double rule between columns
   \nextcolumn{\vrule width\thinsize            % count and rule
   \hskip 2\thinsize \vrule width\thinsize}}%   % and skip and rule

%       \TableActive makes | the same as \vb and & the same as \tab so
% these single characters can be used between columns. Here we have to
% make & and | active so we get the active version of the characters,
% hence the temporary change of \catcode.
     
{\catcode`\|=13 \let|0
 \catcode`\&=13 \let&0
 \gdef\TableActive{\let|=\vb \let&=\tab}%
}% end \catcode`s

%---------------------------------------*
% Horizontal rules:
%       These replacements for \cr put a wide \vrule at the end of the
% line and maybe put a rule under the line, then begin the next line
% with the wide \vrule from the preamble.
     

\def\crrule{\killspace                  % \cr plus rule
   \tstrut                              % strut for spacing
   \linecount                           % count this line
   \plaincr\tablerule                   % \cr, regular rule below line
  }%

\def\crthick{\killspace                 % \cr plus thick rule
   \tstrut                              % strut for vertical spacing
   \linecount                           % count this line
   \plaincr\thickrule                   % \cr, rule, begin next line
  }%                
     
\def\crnorule{\killspace                % \cr plus no rule
   \tstrut                              % strut for spacing
   \linecount                           % count this line
   \plaincr                             % \cr, norule, begin next line
   }%
   
\def\crpart{\killspace                  % end partial rule line
   \linecount                           % count this line
   \plaincr}                            % and end it


%       These rules go across the table.
     
\def\tablerule{\noalign{\hrule height\thinsize depth 0pt}}%
\def\thickrule{\noalign{\hrule height\thicksize depth 0pt}}%


%       Rules for individual columns. You must use \cskip in columns
% with no rules to \omit the \TablePreamble.

\def\cskip{\omit\relax}%
\def\crule{\omit\leaders\hrule height\thinsize depth0pt\hfill}%
\def\Crule{\omit\leaders\hrule height\thicksize depth0pt\hfill}%
     
%---------------------------------------*
% Counting macros:     
%       These macros count rows and columns of the table. After the
% first line has been processed \the\ncols is the total number of
% columns in the table, which may be useful. During processing,
% \the\curcol is the number of the current column, while \the\currow is
% the number of the current row.
     

\def\linecount{%                                % count and check row
   \global\advance\nrows by1%                   % advance row counter
   \ifnum\ncols>0%                              % if \ncols set
      \ifnum\curcol=\ncols\relax\else           % if new \ncols different
      \immediate\write16%                       %   then write message
      {\NX\ruledtable warning: Ncols=\the\curcol\space for Nrow=\the\nrows}%
      \fi\fi                                    % end of tests
   \global\ncols=\curcol                        % save columns in \ncols
   \global\curcol=1}                            % reset counter

\def\colcount{\relax                            %
   \global\advance\curcol by 1\relax}%          % advance column counter

%---------------------------------------*
% TEXT TABLES.
%       To put text in a table use \para{<text>}, with \parasize set
%  to the desired width of the text.

\long\def\para#1{%                      % make a paragraph for tables
   \vtop{\hsize=\parasize               % width - set before \para called
   \normalbaselines                     % set normal baseline skips
   \noindent #1\relax                   % insert text
   \vrule width 0pt depth 1.1ex}%       % hold depth of box
}%

%---------------------------------------*
% TABLES.TEX
%   For compatability with Cowan's TABLES.TEX we also allow the
% syntax \begintable ... \endtable, which do the same thing.
%

\def\begintable{\relax                          % make ruled table
    \@BeginRuledTable                           % initialize table
    \@begintable}%                              % now process table body

\long\def\@begintable#1\endtable{%              % ruled table alignment
   \@RuledTable#1\endruledtable}%               % same as \ruledtable

%>>> EOF TXSruled.tex <<<