summaryrefslogtreecommitdiff
path: root/usergrps/uktug/baskervi/6_2/tblart.tex
blob: d5899dd84d8443769d41ad461d24174001c38fcc (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
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
%
% tblart.tex
%
% Article about mdwtab.sty
%
% (c) Mark Wooding, FWIW
%

% --- First, some evil hacking ---
%
% This lot sees if I'm in mid-document; if so it checks that necessary
% packages are loaded and moans at the editor if necessary.  Otherwise,
% it loads an emulation of the layout, which might help me identify bad
% line breaks.  (I know I shouldn't be using \next like this, although
% it's inside a group so I don't care.)

\begingroup
\makeatletter
\edef\next#1#2{\ifx\documentclass\@notprerr#1\else#2\fi}
\expandafter\endgroup\next
{
  \ifx\firsthline\xxundefined
    \ifx\tabpause\xxundefined
      \edef\ehelp{\errhelp{I can't seem to find Mr Wooding's excellent^^J%
                           `mdwtab' package. \space Please get it from CTAN
                                                                       if^^J%
                            necessary, and say `\string\usepackage{mdwtab}' 
                                                                 in the^^J%
                            document preamble.}}
      \ehelp
      \errmessage{Package `mdwtab' not found}
    \fi
  \else
    \edef\ehelp{\errhelp{You appear to have loaded the `array' package.^^J%
                         Mr Wooding's excellent `mdwtab' package doesn't^^J%
                         coexist well with `array' since both attempt to^^J%
                         redefine all the table handling. \space Since
                                                             `mdwtab'^^J%
                         is mostly compatible with `array', you should^^J%
                         load `mdwtab' instead.}}
    \ehelp
    \errmessage{Package `array' loaded}
  \fi
  \let\mdwendfile\endinput
}{
  \documentclass{baskart}
  \usepackage{mdwtab}
  \begin{document}
  \def\mdwendfile{\end{document}}
}

% --- Some other definitions ---

% These three typeset common LaTeX-related things.  I have no idea how these
% should be formatted, although I guess this lot will be OK.

\makeatletter

\providecommand{\pkg}[1]{\textsf{#1}}
\providecommand{\env}[1]{\textsf{\def\*{\ensuremath{*}}#1}}
\providecommand{\cmd}[1]{\expandafter\texttt\expandafter{\string#1}\cmd@i}

\def\cmd@i{\futurelet\@let@token\cmd@ii}
\def\cmd@ii{%
  \let\@tempa\relax%
  \ifx\@let@token\bgroup%
    \def\@tempa##1{\texttt{\char`\{}\textit{##1}\texttt{\char`\}}\cmd@i}%
  \fi%
  \ifx\@let@token[%
    \def\@tempa[##1]{\texttt{[}\textit{##1}\texttt{]}\cmd@i}%
  \fi%
  \@tempa%
}

\providecommand{\parg}[1]{\textit{#1}}

% --- Table styling ---

\renewcommand{\tabstyle}{\small}

% --- Hyphenation ---

\hyphenation{mdw-tab}

% --- Whew.  Now I can actually start ---

\section{Beautiful tables, the easy way with the \pkg{mdwtab} package}

\begin{multicols}{2}

The first thing you'll probably notice when you load the \pkg{mdwtab} package
is that \TeX\ runs out of memory that much quicker.  The author is well aware
that the package is far too large, but can't decide which bits of its
functionality can be dropped.  The second thing you'll notice is that some
table-related packages stop working properly, because they don't understand
how \pkg{mdwtab} handles tables, and still think that \LaTeX\ is in control.
The author has attempted to retain compatibility with the `Tools' collection
of packages, and in particular with David Carlisle's excellent set of table
handling things.  The third thing you'll probably notice is that your tables
still look (almost) exactly the same as they did before.  In common with the
\pkg{array} package, rules in tables now contribute to the table's width and
height, which fixes a problem with the sides of tables looking uneven.

\begin{center}

  % Define a rule type which does what LaTeX's standard `tabular' does.
  % Why does LaTeX do this, by the way?

  \newcolumntype{v}{!{\kern-.5\arrayrulewidth\vline\kern-.5\arrayrulewidth}}

  % Note that the text is lying through it's teeth.  It has the full power
  % and beauty of mdwtab at its desposal, yet delimberately tries to make
  % the table look awful.

  \begin{tabular}{vcvcv}                             \hline
      This is an example & of a ruled             \\ \hline
      table, using \LaTeX's & standard table      \\ \hline
      handling.  Can you see & the slight nicks   \\ \hline
      in the vertical rules & on the sides?       \\ \hline
  \end{tabular}
\end{center}

It's odd starting an article about a package with a list of its drawbacks:
the author is of the firm opinion that you should have no illusions
concerning the drawbacks of the package.  (There are a load of others which
I haven't described here; most of them aren't very interesting.)

On the other hand the package \emph{does} provide all the column types and
other new features of the \pkg{array} package, including the
\cmd{\newcolumntype} command.


\subsection{A touch of class}

Tables which have horizontal rules tend to look rather better if you insert
a little extra space above and below the rules.  Compare
  \begin{tabular}[C]{|l|l|l|}                                     \hline
    \bf Package      & \bf Advantage    & \bf Disadvantage     \\ \hline
    Standard \LaTeX  & Built-in         & Ugly tables          \\
    \pkg{array}      & New column types & It isn't perfect     \\
    \pkg{mdwtab}     & Beautiful tables & It's very big        \\ \hline
  \end{tabular}
with
  \begin{tabular}[C]{|l|l|l|}                                     \hlx{hv}
    \bf Package      & \bf Advantage    & \bf Disadvantage     \\ \hlx{vhv}
    Standard \LaTeX  & Built-in         & Ugly tables          \\
    \pkg{array}      & New column types & It isn't perfect     \\
    \pkg{mdwtab}     & Beautiful tables & It's very big        \\ \hlx{vh}
  \end{tabular}
to see the difference.  Which do you think is nicer?

The first example above was created using the standard \LaTeX\ \cmd{\hline}
command.  The second example has some extra space inserted around the
horizontal rules.  This is achieved by using the \cmd{\vgap} command.  If you
say `\cmd \vgap{length}', \TeX\ will insert a `short' row whose height is the
\parg{length} given, ensuring that the vertical rules in your table are
extended appropriately.  For example, I just said \verb"\vgap{2pt}" at
appropriate points in the table above.

However, this isn't always what you want.  If you use \cmd{\multicolumn}
commands for headings, you'll get odd-looking `stubs' as in the following
example:
\begin{tabular}[C]{|c|c|c|}                                \hlx{hv}
  Item one & \multicolumn{2}{c|}{Item two}              \\ \hlx{vhv}
  Item three & Item four & Item five                    \\ \hlx{vhv}
  \multicolumn{2}{|c|}{Item six} & Item seven           \\ \hlx{vh}
\end{tabular}
Please bear in mind that this \emph{could} be the effect you want (for
instance, the \texttt{MIX} word-layout diagrams in \emph{The Art of Computer
Programming} do this sort of thing).

In the event that you don't like this effect, and I can't blame you if you
don't, you can suppress the rule stubs in certain columns by saying
`\cmd \vgap[columns]{length}' -- the \parg{columns} argument contains a list
of column numbers whose rules are to be omitted.  The rules on the very left
hand side of the table are numbered~0, while the rules on the right hand side
of column~$n$ are numbered~$n$.  Column numbers are separated by commans, and
column ranges can be given.  For example, to suppress rules in columns~1,~2,
3, 5, 7, 8~and~9 you'd say `\verb"1-3, 5, 7-9"'.

In the example above, if I end my table rows like this:
\begin{list}{}{\leftmargin=\parindent \parskip=0pt \topsep=0pt} \footnotesize

% The hacking above makes verbatim listings rather smaller, so I can fit
% more into the rather narrow columns, and it looks rather less prominent:
% `tt' text seems to stick out rather too obviously.

\begin{verbatim}
...                  \hline \vgap[2]{2pt}
... \\ \vgap[2]{2pt} \hline \vgap   {2pt}
... \\ \vgap   {2pt} \hline \vgap[1]{2pt}
... \\ \vgap[1]{2pt} \hline
\end{verbatim}

\end{list}
then it ends up looking much nicer:
\begin{tabular}[C]{|c|c|c|}                                \hlx{hv[2]}
  Item one & \multicolumn{2}{c|}{Item two}              \\ \hlx{v[2]hv}
  Item three & Item four & Item five                    \\ \hlx{vhv[1]}
  \multicolumn{2}{|c|}{Item six} & Item seven           \\ \hlx{v[1]h}
\end{tabular}
Isn't that neat?

All of this gets terribly cumbersome to type.  The \cmd \hlx{hlx-commands}
command provides a neat abbreviation.  The \parg{hlx-commands} argument is
a list of single letter commands to perform.  There's a load of commands
provided, for doing various little jobs:
\begin{description}
\renewcommand{\makelabel}[1]{\hspace{\labelsep}\cmd#1}

\item [{h}] is equivalent to \cmd \hline.  If you type two \cmd{h} commands
      in a row, a space is left between them, as usual.

\item [{v[columns][length]}] means exactly the same thing as \cmd
      \vgap[columns]{length}, except that the \parg{length} argument is
      optional.  If you omit it, the default value of \cmd{\doublerulesep} is
      used, which is usually set to 2\,pt.

\item [{c{columns}}] is equivalent to \cmd \cline{columns}.  You can specify
      the columns by giving comma separated column numbers and ranges, just
      as for \cmd{\vgap}: the \cmd{\cline} command has been upgraded to
      understand these more complex descriptions.

\item [{s[length]}] leaves a vertical gap of height \parg{length}.  If you
      omit the \parg{length}, the value of \cmd{\doublerulesep} is used.

\end{description}

I ought to come clean now.  Since I'm a lazy typist, I didn't actually use
the \cmd{\vgap} command in the tables above.  What I actually said was
\verb"\hlx{hv}" for the first row, \verb"\hlx{vhv}" for the middle rows, and
\verb"\hlx{vh}" after the last one.


\subsection{New column types}

It seems to be traditional to add new column types when \LaTeX's table
handling gets upgraded, and the author saw no reason not to follow the trend.
The complete list of column types, and other funny characters that can be
used in the argument of the \env{tabular} environment, is given below.  The
new ones added by this package are marked with a little `*'.
\begin{description}

% The following stuff attempts to compress the list vertically, while
% still leaving a little space between items.

\renewcommand{\makelabel}[1]{\hspace{\labelsep}\cmd#1}
\parskip=0pt
\itemsep=\jot plus 1pt

\item [{l}] Left aligned text (in \env{tabular}) or equation (in
      \env{array}).

\item [{c}] Centred text (in \env{tabular}) or equation (in \env{array}).

\item [{r}] Right aligned text (in \env{tabular}) or equation (in
      \env{array}).

\item [{{Ml}, \cmd{Mc} and \cmd{Mr}*}] Left, centre and right aligned
      equations.

\item [{{Tl}, \cmd{Tc} and \cmd{Tr}*}] Left, centre and right aligned text.

\item [{p{width}}] Top aligned paragraphs, with the given width.

\item [{m{width}}] Vertically centred paragraphs, with the given width.

\item [{b{width}}] Bottom aligned paragraphs, with the given width.

\item [{#{pre}{post}*}] User defined column type: \parg{pre} is inserted
      before the table cell's text, and \parg{post} is inserted afterwards.

\item [{|}] Inserts a vertical rule between columns.

\item [{!{text}}] Inserts \parg{text} between columns, treating it just like
      a vertical rule.

\item [{@{text}}] Inserts \parg{text} in place of the usual intercolumn
      space.

\item [{>{text}}] Inserts \parg{text} just before the cell's text.

\item [{<{text}}] Inserts \parg{text} just after the cell's text.

\item [{*{count}{preamble}}] Inserts \parg{count} copies of the
      \parg{preamble} into the table preamble.

\end{description}

You can define your own new column types by saying `\cmd \newcolumntype
{type}[narg][opt]{text}', which defines a new column type \parg{type}, which
means exactly the same thing as the preamble characters \parg{text}.  The
column type can take arguments (even optional ones) -- this works in exactly
the same way as \cmd{\newcommand}.


\subsection{Unboxed tables}

Normally \LaTeX\ will wrap tables up in a box.  This makes things convenient
sometimes, but horizontal positioning can be a bit of a pain.  As well as the
usual~\texttt{[t]}, \texttt{[c]} and~\texttt{[b]} position arguments, the
package adds~\texttt{[L]}, \texttt{[C]} and~\texttt{[R]}, which position the
table left-aligned, centred and right-aligned respectively.  Such tables are
called \emph{unboxed} tables, because they're not wrapped up in a box.  As
well as allowing you to control horizontal position more easily, such tables
have some other advantages.

\iffalse
Oh, before we go any further, I ought to point out that despite not being
boxed up, unboxed tables still can't be broken across pages.  If you want to
handle long tables, you should be using the truly wonderful \pkg{longtable}
package.  You can use all the new commands, like \cmd{\vgap} and \cmd{\hlx}
in the \env{longtable} environment, to make your long tables just as
beautiful as your short ones.
\fi

You can pause a an unboxed table for a bit and insert some normal paragraph
text.  When you say \cmd\tabpause{text} in the middle of a table, \LaTeX\
inserts the \parg{text}, typeset in paragraph mode, in the middle of the
table.  The text can be split across pages and all the normal things like
that.


\subsection{Life's little luxuries}

As well as perhaps not looking as glorious as they might do, \LaTeX's tables
have a few other rough edges.  The \pkg{mdwtab} package tries (and by and
large succeeds) in smoothing these off and tucking all the nastiness under
the carpet.

\subsubsection{Footnotes}

\LaTeX\ doesn't allow footnotes in tables.  They just don't work: the
footnote text mysteriously vanishes.  This package will carefully handle
footnotes in both boxed and unboxed tables, ensuring that they appear in the
right place.  (This is done by using a trimmed down version of the author's
\pkg{footnote} package, which tries to provide a general solution to the
problems of footnote handling.)  You can therefore use footnotes in your
tables with abandon, and expect everything to work beautifully.

\subsubsection{Vertical alignment of ruled tables}

% Time for some hacking.  The `grottytab' environment attempts to emulate
% LaTeX's tables in a deeply cut down way.  It allows any number of centred
% columns, with vertical rules working in the normal LaTeX way (i.e., looking
% nasty).

\newenvironment{grottytab}[1][c]{%
  \def\hline{\noalign{\hrule height\arrayrulewidth}}%
  \def\vline{%
    \kern-.5\arrayrulewidth%
    \vrule width\arrayrulewidth%
    \kern-.5\arrayrulewidth%
  }
  \leavevmode\hbox\bgroup$%
  \ifx#1t\vtop\else\ifx#1b\vbox\else\vcenter\fi\fi\bgroup%
  \def\upart{\hskip\tabcolsep\hfil\ignorespaces}%
  \def\vpart{\unskip\hfil\hskip\tabcolsep\vline}%
  \let\\=\cr%
  \halign\bgroup\strut\vline\upart##\vpart&&\upart##\vpart\cr%
}{%
  \crcr%
  \egroup\egroup\mathsurround=0pt$\egroup%
}

It's been pointed out numerous times that having rules in tables can make
top- and bottom-aligned tables look rather odd: the baseline of the text
tends to belined up with the rules in the tables, rather than with the actual
first or last rows.  In other words, you get strange results like
\begin{grottytab}[b] \hline
  An & odd \\ \hline
  looking & table \\ \hline
\end{grottytab}
and
\begin{grottytab}[t] \hline
  An & odd \\ \hline
  looking & table \\ \hline
\end{grottytab}.
Clearly this isn't terribly desirable.

Various solutions have been proposed for this problem.  \emph{The \LaTeX\
Companion} describes a pair of commands \cmd{\firsthline} and
\cmd{\lasthline} which provide a workaround.  The \pkg{mdwtab} will calculate
the height of the rules and other material at the top or bottom of the table
and shift it into the right position.  Hence you can have
{\renewcommand{\tabstyle}{} \begin{tabular}[b]{|c|c|} \hline A & nice \\
\hline looking & table \\ \hline
\end{tabular}
and
\begin{tabular}[t]{|c|c|} \hline
  A & nice \\ \hline
  looking & table \\ \hline
\end{tabular} }
with no extra effort at all.

\subsubsection{Extra row separation}

In maths, it's conventional to insert a little extra space between the rows
of an array.  To save you having to end every line of an array with something
like `\verb"\\[\jot]"', extra space of the amount \cmd{\arrayextrasep} is
inserted automatically.  (This parameter is set to 1\,jot by default.)
There's an analogous \cmd{\tabextrasep} parameter, although this is initially
0\,pt, and isn't likely to be changed.

If you're worried about matrices looking rather odd as a result of this extra
space, don't be.  In the author's opinion, they actually end up looking
slightly nicer as a result.  However, you can almost certainly get better
results by using a dedicated \env{matrix} environment which takes
extra-special care over the spacing.

\medskip\hrule\smallskip\footnotesize
\hfill Mark Wooding \\ \hspace*{\fill} \texttt{mdw@straylight.co.uk}


\end{multicols}

\mdwendfile