% \iffalse %% File: dcolumn.dtx Copyright (C) 1992-1996 David Carlisle % %<*dtx> \ProvidesFile{dcolumn.dtx} % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{dcolumn} %\ProvidesFile{dcolumn.drv} % \fi % \ProvidesFile{dcolumn.dtx} [1996/09/23 v1.04 decimal alignment package (DPC)] % % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage{dcolumn} \DeleteShortVerb{\|} \DocInput{dcolumn.dtx} \end{document} % % \fi % % \GetFileInfo{dcolumn.dtx} % \begin{document} % \title{The \textsf{dcolumn} package\thanks{This file % has version number \fileversion, last % revised \filedate.}} % \author{David Carlisle} % \date{\filedate} % \author{David Carlisle} % \maketitle % % % \changes{v1.00}{1992/02/17}{Initial version} % \changes{v1.01}{1992/06/12}{Re-issue for the new doc and docstrip.} % \changes{v1.02}{1994/03/14}{Re-issue for LaTeX2e} % \changes{v1.03}{1996/02/28}{New feature, after tools/2093} % % \CheckSum{143} % % % \begin{abstract} % This package defines a system for defining columns of entries in an % \texttt{array} or \texttt{tabular} which are to be aligned on a % `decimal point'. % \end{abstract} % % \MakeShortVerb{\"} % % This package defines {\tt D} to be a column specifier with three % arguments.\\ % "D{"\meta{sep.tex}"}{"\meta{sep.dvi}"}{"\meta{decimal % places}"}" % % \meta{sep.tex} should be a single character, this is used as the % separator in the {\tt .tex} file. Thus it will usually be `{\tt.}' or % `{\tt,}'. % % \mbox{\meta{sep.dvi}} is used as the separator in the output, this may % be the same as the first argument, but may be any math-mode % expression, such as "\cdot". It should be noted that \texttt{dcolumn} % always uses math mode for the digits as well as the separator. % % \meta{decimal places} should be the maximum number of decimal places % in the column. If this is negative, any number of decimal places can % be used in the column, and all entries will be centred on the % separator. Note that this can cause a column to be too wide, compare % the first two columns in the example below. If this argument is % positive, the column uses macros equivalent to "\rightdots" % "\endrightdots" of {\tt array.sty}, otherwise the macros are % essentially equivalent to "\centerdots" "\endcenterdots". % % You may not want to use all three entries in the {\tt array} or {\tt % tabular} preamble, so you may define your own preamble specifiers % using "\newcolumntype". % % For example we may say: % % \noindent"\newcolumntype{d}[1]{D{.}{\cdot}{#1}}" % % {\tt d} takes a single argument specifying the number of decimal % places, and the {\tt .tex} file should use {\tt.}, with $\cdot$ being % used in the output. % % \noindent"\newcolumntype{.}{D{.}{.}{-1}}" % % {\tt .} specifies a column of entries to be centred on the~$.$. % % \noindent"\newcolumntype{,}{D{,}{,}{2}}" % % {\tt ,} specifies takes a column of entries with at most two decimal % places after a~$,$. % % \newcolumntype{d}[1]{D{.}{\cdot}{#1}} % \newcolumntype{.}{D{.}{.}{-1}} % \newcolumntype{,}{D{,}{,}{2}} % % The following table begins "\begin{tabular}{|d{-1}|d{2}|.|,|}" % % \begin{center} % \begin{tabular}{|d{-1}|d{2}|.|,|} % 1.2 & 1.2 &1.2 &1,2 \\ % 1.23 & 1.23 &12.5 &300,2 \\ % 1121.2& 1121.2&861.20 &674,29 \\ % 184 & 184 &10 &69 \\ % .4 & .4 & &,4 \\ % & &.4 & % \end{tabular} % \end{center} % % Note that the first column, which had a negative \meta{decimal places} % argument is wider than the second column, so that the decimal point % appears in the middle of the column. % % Also note that this package deals correctly with entries with no % decimal part, no integer part, and blank entries. % % If you have table headings (inserted with "\multicolumn{1}{c}{..}" % to over-ride the "D" column type) then it may be that neither of the % above `centred' or `right aligned' forms is quite what you want. % \begin{center}\small % \begin{tabular}[t]{|D..{-1}|D..{1}|D..{5.1}|} %\multicolumn{1}{|c|}{head}& %\multicolumn{1}{c|}{head}& %\multicolumn{1}{c|}{head}\\[3pt] % 1.2 & 1.2 &1.2 \\ % 11212.2& 11212.2&11212.2 \\ % .4 & .4 &.4 % \end{tabular} % \hfill % \begin{tabular}[t]{|D..{-1}|D..{1}|D..{1.1}|} %\multicolumn{1}{|c|}{wide heading}& %\multicolumn{1}{c|}{wide heading}& %\multicolumn{1}{c|}{wide heading}\\[3pt] % 1.2 & 1.2 &1.2 \\ % .4 & .4 &.4 % \end{tabular} % \end{center} % % In both of these tables the first column is set with "D{.}{.}{-1}" % to produce a column centered on the ".", and the second column is % set with "D{.}{.}{1}" to produce a right aligned column. % % The centered column produces columns that are wider than necessary % to fit in the numbers under a heading as it has to ensure that the % decimal point is centred. The right aligned column two does not have % this drawback, but under a wide heading a column of small right % aligned figures looks a bit odd. % % In version v1.03 a third alternative is introduced. The third % \meta{decimal places} argument may specify \emph{both} the number of % digits to the left and to the right of the decimal place. The third % column in the first tables above is set with "D{.}{.}{5.1}" and in the % second table, "D{.}{.}{1.1}", to specify % `five places to the left and one to the right' and `one place to the % left and% one to the right' respectively. (You may use `,' or other % tokens, not necessarily `.' in this argument.) The column of figures % is then positioned such that a number with the specified numbers of % digits is centred in the column. % \StopEventually{} % % % \section{The Macros} % % \begin{macrocode} %<*package> % \end{macrocode} % % First we load {\tt array.sty} if it not already loaded. % \begin{macrocode} \RequirePackage{array} % \end{macrocode} % % The basic ideas behind these macros are explained in the documentation % for {\tt array.sty}. However they use three % tricks which may be useful in other contexts. % \begin{itemize} % \item The separator is surrounded in extra "{ }", so that it is set % with "\mathord" spacing, otherwise, for instance a `,' would have % extra space after it. % \item The separator is not given its special definition by making it % active, as this would not work for an entry such as "& .5 &", as the % first token of an alignment entry is read {\em before\/} the preamble % part, incase it is an "\omit", in which case the preamble is to be % omitted. Instead we switch the mathcode to (hex) 8000, which makes the % token act as if it were active. % \item Although \verb|\mathcode`.="8000| makes {\tt.} act as if it % were active, it is still not allowed in constructions such as % "\def.{}", even in math-mode, so we have to construct an active % version of the separator, this is done by making it the uppercase of % "~", and then using the construct\\ % "\uppercase{\def~}{"\meta{definition}"}".\\ % Note that the \meta{definition} is not uppercased, so the definition % can refer to the standard, non-active use of the separator. % \end{itemize} % % \begin{macro}{\DC@} % \changes{v1.03}{1996/02/28}{New feature, after tools/2093} % Set up uppercase tables as required, and then grab the first part of % the numerical argument into "\count@". % \begin{macrocode} \def\DC@#1#2#3{% \uccode`\~=`#1\relax \m@th \afterassignment\DC@x\count@#3\relax{#1}{#2}} % \end{macrocode} % \end{macro} % % \begin{macro}{\DC@x} % \changes{v1.03}{1996/02/28}{Macro added} % If "\count@" is negative, centre on the decimal point. If it is % positive either "#1" will be empty in which case bad out decimal % part to the number of digits specified by "\count@" or (new feature % in v1.03) it is none empty in which case "\count@" contains the % number of digits to the left of the point, and "#1" contains a junk % token (probably ".") followed by the number of digits to the right % of the point. In either of these latter cases, "\DC@right" is used. % \begin{macrocode} \def\DC@x#1\relax#2#3{% \ifnum\z@>\count@ \expandafter\DC@centre \else \expandafter\DC@right \fi {#2}{#3}{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\DC@centre} % If centering on the decimal point, just need to box up the two halves. % \begin{macrocode} \def\DC@centre#1#2#3{% \let\DC@end\DC@endcentre \uppercase{\def~}{$\egroup\setbox\tw@=\hbox\bgroup${#2}}% \setbox\tw@=\hbox{${\phantom{{#2}}}$}% \setbox\z@=\hbox\bgroup$\mathcode`#1="8000 } % \end{macrocode} % \end{macro} % % \begin{macro}{\DC@endcentre} % and then pad out the smaller of the two boxes so there is the same % amount of stuff either side of the point. % \begin{macrocode} \def\DC@endcentre{$\egroup \ifdim \wd\z@>\wd\tw@ \setbox\tw@=\hbox to\wd\z@{\unhbox\tw@\hfill}% \else \setbox\z@=\hbox to\wd\tw@{\hfill\unhbox\z@}\fi \box\z@\box\tw@} % \end{macrocode} % \end{macro} % % \begin{macro}{\DC@right} % \changes{v1.03}{1996/02/28}{Re-implemeted, after tools/2093} % This deals with both the cases where a specified number of decimal % places is given. % \begin{macrocode} \def\DC@right#1#2#3{% \ifx\relax#3\relax % \end{macrocode} % If "#3" is empty, add "\hfill" to right align the column, and % Just set "\DC@rl" to begin a group, so nothing fancy is done with % the whole number part. % \begin{macrocode} \hfill \let\DC@rl\bgroup \else % \end{macrocode} % Otherwise set "\DC@rl" so that the whole number part is put in a % box "\count@" times as wide as a digit. % In order to share code with the other branch, then move "#3" (the % number of decimal places) into "\count@" throwing away the `.' from % the user syntax. % \changes{v1.04}{1996/09/23}{Add \cs{hfill} so integer part % is still flush right if no decimal point used.} % \begin{macrocode} \edef\DC@rl{to\the\count@\dimen@ii\bgroup\hss\hfill}% \count@\@gobble#3\relax \fi % \end{macrocode} % % \begin{macrocode} \let\DC@end\DC@endright % \end{macrocode} % Box 2 contains the decimal part, set to "\dimen@" which is % calculated below to be "\count@" times the width of a digit, plus % the with of the `decimal point'. % \begin{macrocode} \uppercase{\def~}{$\egroup\setbox\tw@\hbox to\dimen@\bgroup${#2}}% \setbox\z@\hbox{$1$}\dimen@ii\wd\z@ \dimen@\count@\dimen@ii \setbox\z@\hbox{${#2}$}\advance\dimen@\wd\z@ \setbox\tw@\hbox to\dimen@{}% % \end{macrocode} % Box 0 contains the whole number part, either just at its natural % size for right aligned columns, or set to (the old value of) % "\count@" times the width of a digit. "\DC@rl" defined above % determines the two cases. % \begin{macrocode} \setbox\z@\hbox\DC@rl$\mathcode`#1="8000 } % \end{macrocode} % \end{macro} % % \begin{macro}{\DC@endright} % \changes{v1.03}{1996/02/28}{Re-implemeted, after tools/2093} % Just finish off the second box, and then put out both boxes. % \begin{macrocode} \def\DC@endright{$\hfil\egroup\box\z@\box\tw@} % \end{macrocode} % \end{macro} % % \begin{macro}{D} % The user interface, define the {\tt D} column to take three arguments. % For special purposes, you may need to directly access "\DC@" rather % than the "D" column, eg to get a bold version you could use %\begin{verbatim} % \newcolumntype{E}[3]{>{\boldmath\DC@{#1}{#2}{#3}}c<{\DC@end}} %\end{verbatim} % \begin{macrocode} \newcolumntype{D}[3]{>{\DC@{#1}{#2}{#3}}c<{\DC@end}} % \end{macrocode} % \end{macro} % % \begin{macrocode} % % \end{macrocode} % % % \Finale \endinput