summaryrefslogtreecommitdiff
path: root/usergrps/uktug/baskervi/6_3/tblarta.tex
diff options
context:
space:
mode:
Diffstat (limited to 'usergrps/uktug/baskervi/6_3/tblarta.tex')
-rw-r--r--usergrps/uktug/baskervi/6_3/tblarta.tex425
1 files changed, 425 insertions, 0 deletions
diff --git a/usergrps/uktug/baskervi/6_3/tblarta.tex b/usergrps/uktug/baskervi/6_3/tblarta.tex
new file mode 100644
index 0000000000..7a17d36538
--- /dev/null
+++ b/usergrps/uktug/baskervi/6_3/tblarta.tex
@@ -0,0 +1,425 @@
+%
+% 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
+
+% diagnosing what's going on...
+%\@ifundefined{pkg}{\typeout{No \string\pkg\space macro}}{\show\pkg}
+%\@ifundefined{env}{\typeout{No \string\env\space macro}}{\show\env}
+%\@ifundefined{cmd}{\typeout{No \string\cmd\space macro}}{\show\cmd}
+
+\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 ---
+
+\title{Beautiful tables, the easy way with the \pkg{mdwtab} package}
+\author{Mark Wooding}
+
+%\begin{multicols}{2}
+\begin{Article}
+\noindent
+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 commas, 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 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 be lined 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{Article}
+\endinput
+\end{multicols}
+
+\mdwendfile