diff options
author | Karl Berry <karl@freefriends.org> | 2015-09-28 21:17:02 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2015-09-28 21:17:02 +0000 |
commit | 3b599d9910b4fe668c87ddd32a48d48f8a377560 (patch) | |
tree | 1eaf15a6fc5cc826af5507e4c768df4ff428f4a4 /Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx | |
parent | 22067fe830ec3090316787abecc6644540967b54 (diff) |
fcolumn (28sep15)
git-svn-id: svn://tug.org/texlive/trunk@38489 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx | 788 |
1 files changed, 478 insertions, 310 deletions
diff --git a/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx b/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx index 3e83646dfba..182e45670c0 100644 --- a/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx +++ b/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx @@ -1,60 +1,22 @@ % \iffalse meta-comment -% % Copyright (C) 2015 by Edgar Olthof % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either -% version 1.2 of this license or (at your option) any later +% version 1.3 of this license or (at your option) any later % version. The latest version of this license is in % % http://www.latex-project.org/lppl.txt % -% and version 1.2 or later is part of all distributions of +% and version 1.3 or later is part of all distributions of % LaTeX version 1999/12/01 or later. % % \fi % \iffalse %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{fcolumn} -%<package> [2015/03/07 v1.0 automatic currency package] +%<package> [2015/09/20 v1.1.1 Automatic Currency Package (EO)] %<package>\RequirePackage{array} -%<*batchfile> -\begingroup -%% -%% Copyright (C) 2015 by Edgar Olthof -%% -%% This file may be distributed and/or modified under the -%% conditions of the LaTeX Project Public License, either -%% version 1.2 of this license or (at your option) any later -%% version. The latest version of this license is in -%% -%% http://www.latex-project.org/lppl.txt -%% -%% and version 1.2 or later is part of all distributions of -%% LaTeX version 1999/12/01 or later. -%% -\input docstrip.tex -\keepsilent -\preamble - -This is a generated file. - -Copyright (C) 2015 by Edgar Olthof - -This file may be distributed and/or modified under the -conditions of the LaTeX Project Public License, either -version 1.2 of this license or (at your option) any later -version. The latest version of this license is in - - http://www.latex-project.org/lppl.txt - -and version 1.2 or later is part of all distributions of -LaTeX version 1999/12/01 or later. -\endpreamble -\askforoverwritefalse -\generate{\file{fcolumn.sty}{\from{fcolumn.dtx}{package}}} -\endgroup -%</batchfile> %<*driver> \documentclass{ltxdoc} \usepackage{fcolumn} @@ -68,9 +30,7 @@ LaTeX version 1999/12/01 or later. \end{document} %</driver> % \fi -% -% \CheckSum{0} -% +% \CheckSum{618} % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z @@ -89,95 +49,233 @@ LaTeX version 1999/12/01 or later. % % \changes{v0.1}{2015/02/06}{First working version} % \changes{v1.0}{2015/03/07}{Three-argument version is working properly} +% \changes{v1.1}{2015/09/14}{Automatic checking of column balance performed when number of +% F-columns is even (behaviour can be overridden). Empty entries are now recognised and +% correctly treated as such, except for the one ended by the double backslash. Not serious; +% workaround possible. Furthermore optimisation of code: minimised the number of private +% counts and resetting of column counter done in a nicer way.} +% \changes{v1.1.1}{2015/09/27}{Installation procedure changed from .ins-in-.dtx to separate +% .ins and .dtx after discussion with Karl Berry as well as some minor code improvements.} % \GetFileInfo{fcolumn.sty} -% \DoNotIndex{\fi,\let,\@ne} +% \DoNotIndex{\@arstrut,\@arstrutbox,\@depth,\@firstampfalse,\@firstamptrue,\@gobble,\@halignto} +% \DoNotIndex{\@height,\@mkpream,\@ne,\@nextchar,\@preamble,\@sharp,\@tempdima,\@tempswafalse} +% \DoNotIndex{\@tempswatrue,\@\temptokena,\@tfor,\@whilesw,\@width,\advance,\arraystretch,\baselineskip} +% \DoNotIndex{\begingroup,\bgroup,\count,\count@,\cr,\csname,\def,\divide,\do,\dp,\edef,\egroup} +% \DoNotIndex{\else,\endcsname,\endgroup,\expandafter,\extrarowheight,\fi,\gdef,\halignto,\hbox} +% \DoNotIndex{\hfil,\ht,\if,\if@firstamp,\if@tempswa,\ifcase,\lineskip,\loop,\m@ne,\m@th,\message} +% \DoNotIndex{\multiply,\or,\par,\prepnext@tok,\protect,\repeat,\setbox,\space,\string,\strutbox} +% \DoNotIndex{\tabskip,\tabularnewline,\the,\the@toks,\thr@@,\tw@,\unhbox,\vbox,\vcenter,\vrule} +% \DoNotIndex{\vskip,\vtop,\wd,\xdef,\z@,\z@skip} % \title{The \textsf{fcolumn} package\thanks{This file has version % number \fileversion, last revised \filedate.}} -% \author{Edgar Olthof} +% \author{Edgar Olthof\\ +% \texttt{edgar <dot> olthof <at> inter <dot> nl <dot> net}} % \date{Printed \today} % \maketitle % \begin{abstract} % In financial reports, text and currency amounts are regularly put in % one table, e.g., a year balance or a profit-and-loss overview. -% This package provides the settings for automatically typesetting +% This package provides the settings for automatically typesetting and checking % such columns, including the sum line (preceded by a rule of the correct % width), using the specifier |f|. +% \end{abstract} % -% The column specifier |f| itself is rather simple. It is the predefined version -% of a generic column |F|. The generic version expects three arguments: -% |#1| is the separator, |#2| is the decimal mark, and |#3| the coding used for +% \section{Introduction}\label{intro} +% The package |fcolumn| provides the macros for an extra tabular specifier that makes creating +% financial tables easy. The column specifier |f| itself is rather simple. It is the +% predefined version of a generic column |F|. The generic version expects three arguments: +% |#1| is the group separator, |#2| is the decimal mark, and |#3| the coding used for % grouping digits of the integer part and decimal part. % -% The f-column in the current version of the package is defined as -% |\newcolumntype{f}{F{.}{,}{3,2}}| (which is the continental European standard, implemented here) -% and people in the Anglo-saxon world would rather code |\newcolumntype{f}{F{,}{.}{3,2}}|. +% The f-column in the current version of the package is defined for the continental European +% standard: |\newcolumntype{f}{F{.}{,}{3,2}}|. This means that a number like 1234567 will be +% typeset as $12{.}345{,}67$. People in the Anglo-saxon world would rather +% code |\newcolumntype{f}{F{,}{.}{3,2}}|, yielding $12{,}345{.}67$ for the number given above. % The default value for |#3| is 3,2, indicating that grouping of the integer part % is by three digits and that the decimal part consists of two digits. % If however, in your country or company grouping is done with a thinspace every % four digits and there are three digits after the decimal mark---that happens to % be a |\cdot|---, then simply specify |\newcolumntype{f}{F{\,}{\cdot}{4,3}}| in -% that case. By default two digits are used for the decimal part, so if you really +% that case. +% +% By default two digits are used for the decimal part, so if you really % want no decimal digits (in that case of course also skipping the decimal mark) % you have to explicitly specify |x,0|. -% \end{abstract} -% -% \section{Introduction} -% To show where and how the f-column is used, let's look at a typical financial table. % +% This package requires and loads the |array| package~\cite{array}. +% To show where and how the F-column is used, let's look at some typical financial information +% as shown in Table~\ref{tab:ex1} % \begin{table}[htb] +% \caption{Example Table} +% \label{tab:ex1} % \begin{tabular}{@{}lflf@{}} % \multicolumn4c{\bfseries Balance sheet}\\ -% \multicolumn1{@{}l}{properties}&\multicolumn1r{31 dec 2014} -% &\multicolumn1l{debts}&\multicolumn1{l@{}}{31 dec 2014}\\ -% \hline +% \toprule +% properties&\multicolumn1r{31 dec 2014}& +% debts&\multicolumn1{l@{}}{31 dec 2014}\\ +% \midrule % house & 20000000 & equity capital& 5000000\\ % bank account& -60323 & mortgage & 15000000\\ -% savings& 2800000 & & \leeg \\ +% savings& 2800000 \\ % cash& 14585 & profit & 2754262\\ % \sumline -% \check12 -% \hline +% \bottomrule % \end{tabular} % \end{table} -% -% This table was entered as: +% and how this is entered in \LaTeX\ (Table~\ref{tab:ex2}). +% \begin{table}[htb] +% \caption{Verbatim version of Example Table} +% \label{tab:ex2} % \begin{verbatim} % \begin{table}[htb] +% \caption{Example Table} +% \label{tab:ex1} % \begin{tabular}{@{}lflf@{}} % \multicolumn4c{\bfseries Balance sheet}\\ -% \multicolumn1{@{}l}{properties}&\multicolumn1r{31 dec 2014} -% &\multicolumn1l{debts}&\multicolumn1{l@{}}{31 dec 2014}\\ -% \hline +% \toprule +% properties&\multicolumn1r{31 dec 2014}& +% debts&\multicolumn1{l@{}}{31 dec 2014}\\ +% \midrule % house & 20000000 & equity capital& 5000000\\ % bank account& -60323 & mortgage & 15000000\\ -% savings& 2800000 & & \leeg \\ +% savings& 2800000 \\ % cash& 14585 & profit & 2754262\\ % \sumline -% \check12 -% \hline +% \bottomrule % \end{tabular} % \end{table} % \end{verbatim} +% \end{table} % All the work was done by the column specifier ``f'' (for ``finance''). In this case -% it constructs the |\sumline|, typesets the numbers, calculates the totals, -% and checks whether the two columns are in balance; if not, the user is warned -% via a |\message|. Of course for nice settings one should use the -% |booktabs| package, but that is not the point here. +% it constructs the |\sumline|, typesets the numbers, calculates the totals, determines +% the widths of the sumrules, and checks whether the two columns are in balance; if not, +% the user is warned via a |\message|. Of course for nice settings the +% |booktabs| package~\cite{booktabs} was used, but that is not the point here. % -% This package is heavily inspired by the |dcolumn| package by David Carlisle, +% This package is heavily inspired by the |dcolumn| package by David Carlisle~\cite{dcolumn}, % some constructions are more or less copied from that package. % -% There is at least one things to improve in this version: -% An empty entry in an f-column should result in an empty spot in the table. -% Now an empty entry is not correct and is repaired by \LaTeX\ to be equal to -% 0, printing a number in the table. This can be prevented by explicitly specifying -% |\leeg|, like in the table above, but that should be automated. -% +% \section{Commands} +% The user only needs to know six commands or constructions. These six are given here. +% \begin{macro}{F} +% In the tabular the column specifier |F| can be given with arguments, or the predefined +% version |f|, where the three arguments of |F| are |{.}|, |{,}|, and |3,2|. If you +% want |g| to be your own definition like the curious one given in Section~\ref{intro}, then +% specify |\newcolumntype{g}{F{\,}{\cdot}{4,3}}| prior to using |g| in a tabular. +% +% Entries in an F-column are from that moment on, treated as (integer) numbers unless +% explicitly escaped by |\leeg|, see below. The numbers are typeset according to the template +% the user gives with his/her |F|-column. +% \end{macro} +% \begin{macro}{\sumline} +% The numbers in an |F|-column are typeset as a financial amount, but the real benefit comes +% with the |\sumline|. It does three things: +% \begin{compactitem} +% \item It calculates the total of the column so far and the maximum width encountered +% so far, including the width of the total; +% \item It generates a rule with width calculated in the first item; +% \item It checks the columns that are supposed to balance whether or not they actually do. +% If so, nothing happens. If not, a |\message| is given that column $i$ and $j$ do not balance, +% where $i$ and $j$ are the relevant columns. This is only done if the total number of +% |F|-columns is even, e.g., if there are six |F|-columns, then~1 is checked against~4, 2 against~5, +% and 3 against~6. If the number of |F|-columns is odd then anything could be possible in that table +% and nothing is assumed about structure within the table. This behaviour can be overridden, see below. +% \end{compactitem} +% \end{macro} +% \begin{macro}{\resetsumline} +% Suppose you want to typeset one tabular with the profit-and-loss of many projects individually. +% The layout of those tabulars is the same and it were nice if all columns were aligned. This can +% be done by making it one big tabular with a fresh start for each project. The macro |\resetsumlines| +% is used for that: it resets all totals and all column widths, see for example Table~\ref{tab:ex3}. +% \begin{table}[htb] +% \caption{Example: multiple projects} +% \label{tab:ex3} +% \begin{tabular}{@{}lfflff@{}} +% \multicolumn6c{\bfseries Project~1}\\ +% \toprule +% expense&\multicolumn1r{actual}&\multicolumn1r{budget}& +% income&\multicolumn1r{actual}&\multicolumn1{r@{}}{budget}\\ +% \midrule +% food & 45000 & 50000 & tickets& 100000 & 100000\\ +% drinks & 35000 & 40000 \\ +% music & 18000 & 10000 \\ +% profit & 2000 \\ +% \sumline +% \resetsumline +% \multicolumn6c{\bfseries Project~2}\\ +% \toprule +% expense&\multicolumn1r{actual}&\multicolumn1r{budget}& +% income&\multicolumn1{r}{actual}&\multicolumn1{r@{}}{budget}\\ +% \midrule +% food & 25000 & 30000 & tickets& 40000 & 45000\\ +% drinks & 10000 & 8000 \\ +% music & 8000 & 7000 & loss & 3000 \\ +% \sumline +% \bottomrule +% \end{tabular} +% \end{table} +% Note that the rules in the first and third F-columns of project~1 cover $1{.}000{,}00$ whereas +% in project~2 those rules are shorter since they only cover $430{,}00$; still the columns are +% aligned. The verbatim way of setting up Table~\ref{tab:ex3} is given in Table~\ref{tab:ex4}. +% \begin{table}[htb] +% \caption{Verbatim version of Table~\ref{tab:ex3}} +% \label{tab:ex4} +% \begin{verbatim} +% \begin{table}[htb] +% \caption{Example: multiple projects} +% \label{tab:ex3} +% \begin{tabular}{@{}lfflff@{}} +% \multicolumn6c{\bfseries Project~1}\\ +% \toprule +% expense&\multicolumn1r{actual}&\multicolumn1r{budget}& +% income&\multicolumn1r{actual}&\multicolumn1{r@{}}{budget}\\ +% \midrule +% food & 45000 & 50000 & tickets& 100000 & 100000\\ +% drinks & 35000 & 40000 \\ +% music & 18000 & 10000 \\ +% profit & 2000 \\ +% \sumline +% \resetsumline +% \multicolumn6c{\bfseries Project~2}\\ +% \toprule +% expense&\multicolumn1r{actual}&\multicolumn1r{budget}& +% income&\multicolumn1r{actual}&\multicolumn1{r@{}}{budget}\\ +% \midrule +% food & 25000 & 30000 & tickets& 40000 & 45000\\ +% drinks & 10000 & 8000 \\ +% music & 8000 & 7000 & loss & 3000 \\ +% \sumline +% \bottomrule +% \end{tabular} +% \end{table} +% \end{verbatim} +% \end{table} +% \end{macro} +% \begin{macro}{\leeg} +% If an |F|-column should be empty then simply leave it empty. If however it should not be empty +% but the entry should be treated as text---even it is a number---this can be done with |\leeg|. +% It expects an argument and this argument is typeset in the column, affecting the maximum column +% width so far. The common case is where |p.m.| (\textit{pro memoria}) is entered. An empty |F|-column +% followed by |\\| does not work: either remove the |&| or specify |\leeg{}|. +% \end{macro} +% \begin{macro}{\checkfcolumns} +% The automatic column balance check can also be done manually. If |F|-columns~1 and~4 should balance +% and you want them to be checked, then simply say |\checkfcolumns14|. With more than nine |F|-columns +% you may be forced to say something like |\checkfcolumns{10}{12}|. +% \end{macro} +% \begin{macro}{\strictaccounting} +% In the rare occasion that a negative number occurs in a financial table, the sign of that number +% can be an explicit minus sign ($-$) or the number is coloured red, or it is typeset between parentheses, +% and there may be even other ways. By default (for aesthetic reasons) |fcolumn| typesets it with +% a minus~sign, but strict accounting prescibes that the number should be put between parentheses. +% The latter can be accomplished by setting |\strictaccountingtrue|. +% \end{macro} +% \StopEventually{\PrintChanges\PrintIndex} % \section{The macros} % \begin{macro}{column F} % \begin{macro}{column f} -% -% Note that the definition of the column type |f| does not use private macros +% The column specifier |F| is the generic one, and |f| is the default (European) one +% for easy use. Note that the definition of the column type |f| does not use private macros % (no |@|), so overriding its definition is easy for a user. % \begin{macrocode} \newcolumntype{F}[3]{>{\b@fi{#1}{#2}{#3}}r<{\e@fi}} @@ -186,18 +284,20 @@ LaTeX version 1999/12/01 or later. % \end{macro} % \end{macro} % \begin{macro}{\FCsc@l} +% \begin{macro}{\FCtc@l} % Two \meta{count}s are defined, that both start at zero: the \meta{count} -% |\FCsc@l|, that keeps track at which f-column the tabular is working on and -% the \meta{count} |\FCtc@l|, that records the number of f-columns that were +% |\FCsc@l|, that keeps track at which F-column the tabular is working on and +% the \meta{count} |\FCtc@l|, that records the number of F-columns that were % encountered so far. Later in the package the code can be found for generating -% a new \meta{count} and a new \meta{dimen} if the number of requested f-columns -% is larger than currently available. This is of course the case when an f-column +% a new \meta{count} and a new \meta{dimen} if the number of requested F-columns +% is larger than currently available. This is of course the case when an F-column % is used for the first time. % \begin{macrocode} -\newcount\FCsc@l \FCsc@l0 -\newcount\FCtc@l \FCtc@l0 +\newcount\FCsc@l \FCsc@l=0 +\newcount\FCtc@l \FCtc@l=0 % \end{macrocode} % \end{macro} +% \end{macro} % \begin{macro}{\geldm@cro} % The macro |\geldm@cro| takes a number and by default interprets this as % an amount expressed in cents (dollar cents, euro cents, centen, @@ -207,68 +307,68 @@ LaTeX version 1999/12/01 or later. % As explained, this can be changed. It uses a private boolean |\withs@p| % and an accessable, i.e., without |@| boolean: |\strictaccounting|. The latter % is used to typeset negative numbers between parentheses. By default it doesn't -% do this: a minus sign is used. It also uses two private \meta{count}s. I'm still -% figuring out whether this is needed; everything is done local within a column -% of an |\ialign|, so using |\count0|, |\count1|, etc.\ might also work: it would -% safe two \meta{count}s. +% do this: a minus sign is used. % \begin{macrocode} -\newcount\g@lda -\newcount\g@ldb \newif\ifwiths@p \newif\ifstrictaccounting \strictaccountingfalse % \end{macrocode} % Actually |\geldm@cro| is only a wrapper around |\g@ldm@cro|. % \begin{macrocode} \def\geldm@cro#1#2{\withs@pfalse - \afterassignment\g@ldm@cro\count@#2\relax{#1}} +\afterassignment\g@ldm@cro\count@#2\relax{#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\g@ldm@cro} % This macro starts by looking at the sign of |#2|: if it is negative, it prints the correct -% indicator (a parenthesis or a minus sign), assigns the absolute value of |#2| to |\g@lda| -% and goes on. Note that |\geldm@cro| and therefore |\g@ldm@cro| are used within |$|s, so -% it is really a minus sign that is printed, not a hyphen. +% indicator (a parenthesis or a minus sign), assigns the absolute value of |#2| to |\count2| +% and goes on. Note that |\geldm@cro| and therefore |\g@ldm@cro| are always used within |$|s, so +% it is really a minus sign that is printed, not a hyphen. All calculations are done with +% |\count0|, |\count1|, etc.\ i.e., without fcolumn-specific \meta{count}s because it is all +% done locally. Leaving the tabular environment will restore their values. % \begin{macrocode} \def\g@ldm@cro#1\relax#2{% - \ifnum#2<0 \ifstrictaccounting(\else-\fi\g@lda=-#2 \else\g@lda=#2 \fi +\ifnum#2<0 \ifstrictaccounting(\else-\fi\count2=-#2 \else\count2=#2 \fi % \end{macrocode} % Calculate the entire currency units: this is the result of $x/a$ as integer % division, with $a=10^n$ and $n$ the part of |#1| after the separator (if any). % Here the first character of |#1| is discarded, so the separator in |#1| is not strict: % you could also specify |3.2| instead of |3,2| (or even |3p2|). % \begin{macrocode} - \ifx\relax#1\relax\g@ldb=2 \else \g@ldb\@gobble#1\relax\fi - \loop - \ifnum\g@ldb>0 \divide\g@lda by 10 \advance\g@ldb by \m@ne - \repeat +\count3=\ifx\relax#1\relax2 \else \@gobble#1\relax\fi +\count4=\count3 +\loop + \ifnum\count3>0 \divide\count2 by 10 \advance\count3 by \m@ne +\repeat % \end{macrocode} -% The value in |\g@lda| is then output by |\g@ldens| using the separation given. +% The value in |\count2| is then output by |\g@ldens| using the separation given. % \begin{macrocode} - \g@ldens{\the\count@}% +\g@ldens{\the\count@}% % \end{macrocode} % If there is a decimal part\dots % \begin{macrocode} - \ifx\relax#1\relax\g@ldb=2 \else \g@ldb\@gobble#1\relax\fi - \ifnum\g@ldb>0\decim@lmark +\ifnum\count4>0\decim@lmark % \end{macrocode} % Next the decimal part is dealt with. Now $x\bmod a$ is calculated in the -% usual way: $x-(x/a)*a$. The minus sign necessary for this calculation is -% introduced in the next line by changing the comparison to |>| instead of |<|. -% \begin{macrocode} - \ifnum#2>0 \g@lda=-#2\else\g@lda=#2 \fi - \loop - \ifnum\g@ldb>0 \divide\g@lda by 10 \advance\g@ldb by \m@ne - \repeat - \ifx\relax#1\relax\g@ldb=2 \else \g@ldb\@gobble#1\relax\fi - \loop - \ifnum\g@ldb>0 \multiply\g@lda by 10 \advance\g@ldb by \m@ne - \repeat - \ifnum#2>0 \advance\g@lda by #2 - \else \advance\g@lda by -#2 - \fi - \ifx\relax#1\relax\g@ldb=2 \else \g@ldb\@gobble#1\relax\fi - \zerop@d{\number\g@ldb}{\number\g@lda}% +% usual way: $x-(x/a)*a$ with integer division. The minus sign necessary +% for this calculation is introduced in the next line by changing the +% comparison from |<| to |>|. +% \begin{macrocode} + \ifnum#2>0 \count2=-#2\else\count2=#2 \fi + \count3=\count4 + \loop + \ifnum\count3>0 \divide\count2 by 10 \advance\count3 by \m@ne + \repeat +% \end{macrocode} +% The value of |\count3| is~0 now. Now counting up again, this saved an assignment. +% \begin{macrocode} + \loop + \ifnum\count3<\count4 \multiply\count2 by 10 \advance\count3 by \@ne + \repeat + \ifnum#2>0 \advance\count2 by #2 + \else \advance\count2 by -#2 \fi + \zerop@d{\number\count3}{\number\count2}% +\fi % \end{macrocode} % If the negative number is indicated by putting it between parentheses, then the % closing parenthesis should stick out of the column, otherwise the alignment of @@ -277,53 +377,52 @@ LaTeX version 1999/12/01 or later. % may even stick out of the table. I don't like this, therefore I chose to put % |\strictaccountingfalse|. Change if you like. % \begin{macrocode} - \ifnum#2<0 \ifstrictaccounting\rlap{)}\fi\fi} +\ifnum#2<0 \ifstrictaccounting\rlap{)}\fi\fi} % \end{macrocode} % \end{macro} % \begin{macro}{\g@ldens} % Here the whole currency units are dealt with. The macro |\g@ldens| is used % recursively, therefore the double braces; this allows to use |\count0| locally. % Tail recursion is not possible here (at least I don't know of a way), but that -% is not very important, as the largest number ($2^{31}-1$) will only cause a +% is not very important, as the largest number (which is $2^{31}-1$) will only cause a % threefold recursion. This also implies that the largest amount this package % can deal with is 2.147.483.647 (using |x.0|). For most people this is probably % more than enough if the currency is euros or dollars. If not, then it is % more likely that you are spending your time on the beach than studying this package. % And otherwise make clear that you use a currency unit of k\$. % \begin{macrocode} -\def\g@ldens#1{{\g@ldb=\g@lda \count0=#1 +\def\g@ldens#1{{\count3=\count2 \count0=#1 % \end{macrocode} % First divide by $10^n$, where $n$ is |#1|. % \begin{macrocode} - \loop - \ifnum\count0>0 - \divide\g@lda by 10 - \advance\count0 by \m@ne - \repeat +\loop + \ifnum\count0>0 + \divide\count2 by 10 + \advance\count0 by \m@ne +\repeat % \end{macrocode} % Here is the recursive part, % \begin{macrocode} - \ifnum\g@lda>0 \g@ldens{#1}\fi +\ifnum\count2>0 \g@ldens{#1}\fi % \end{macrocode} % and then reconstruct the rest of the number. % \begin{macrocode} - \count0=#1 - \loop - \ifnum\count0>0 - \multiply\g@lda by 10 - \advance\count0 by \m@ne - \repeat - \g@lda=-\g@lda - \advance\g@lda by \g@ldb \du@zendprint{#1}}} +\count0=#1 +\loop + \ifnum\count0>0 + \multiply\count2 by 10 + \advance\count0 by\m@ne +\repeat +\count2=-\count2 +\advance\count2 by \count3 \du@zendprint{#1}}} % \end{macrocode} % \end{macro} % \begin{macro}{\du@zendprint} % The macro |\du@zendprint| takes care for correctly printing the separator % and possible trailing zeros. % \begin{macrocode} -\def\du@zendprint#1{\ifwiths@p\sep@rator\zerop@d{#1}{\number\g@lda}% - \else\zerop@d{1}{\number\g@lda}\fi - \global\withs@ptrue} +\def\du@zendprint#1{\ifwiths@p\sep@rator\zerop@d{#1}{\number\count2}% + \else\zerop@d{1}{\number\count2}\fi \global\withs@ptrue} % \end{macrocode} % \end{macro} % \begin{macro}{\zerop@d} @@ -343,44 +442,31 @@ LaTeX version 1999/12/01 or later. % First determine the number of digits of |#2| (expressed in the decimal % system). This number is in |\count0| and is at least~1. % \begin{macrocode} - \loop - \divide \count1 by 10 - \ifnum\count1>0 \advance\count0 by 1 - \repeat +\loop + \divide \count1 by 10 + \ifnum\count1>0 \advance\count0 by\@ne +\repeat % \end{macrocode} % The number of zeros to be padded is $\max(0,|#1-\count0|)$ (the second % argument can be negative), so a simple loop suffices. % \begin{macrocode} - \loop - \ifnum\count0<#1 0\advance\count0 by 1 - \repeat - \number#2}} +\loop + \ifnum\count0<#1\relax 0\advance\count0 by\@ne +\repeat +\number#2}} % \end{macrocode} % \end{macro} % \begin{macro}{\zetg@ld} % This macro takes care for several things: it increases the total for a given -% f-column, it records the largest width of the entries in that column and it +% F-column, it records the largest width of the entries in that column and it % typesets |#1| via |\geldm@cro|. % \begin{macrocode} \def\zetg@ld#1#2{\global\advance\csname - FCtot@\romannumeral\FCsc@l\endcsname by #1 - \setbox0=\hbox{$\geldm@cro{#1}{#2}$}% - \ifdim\wd0>\csname FCwd@\romannumeral\FCsc@l\endcsname - \global\csname FCwd@\romannumeral\FCsc@l\endcsname=\wd0 - \fi\unhbox0} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\check} -% The macro |\check| provides a way to the user to check that the appropriate -% columns are balanced (as it should in a balance). Arguments |#1| and |#2| are -% the column numbers to compare. It is the responsibility of the user to provide -% the correct numbers here, otherwise bogus output is generated. But the output is -% only to screen and the transcript file; it doesn't change the appearance of your -% document, so you can safely ignore the result then, repair and go on. -% \begin{macrocode} -\def\check#1#2{\noalign{\ifnum\csname FCtot@\romannumeral#1\endcsname= - \csname FCtot@\romannumeral#2\endcsname\else - \message{Columns #1 and #2 do not balance!}\fi}} +FCtot@\romannumeral\FCsc@l\endcsname by #1 +\setbox0=\hbox{$\geldm@cro{#1}{#2}$}% +\ifdim\wd0>\csname FCwd@\romannumeral\FCsc@l\endcsname + \global\csname FCwd@\romannumeral\FCsc@l\endcsname=\wd0 +\fi\unhbox0} % \end{macrocode} % \end{macro} % \begin{macro}{\b@fi} @@ -392,84 +478,107 @@ LaTeX version 1999/12/01 or later. % The plain \LaTeX\ command |\@empty| is used for that. The separator and decimal mark % are within a math environment, so you can indeed specify |\,| instead of |\thinspace|, % but there is an extra brace around, so it doesn't affect -% the spacing between the digits (trick copied from |dcolumn|). +% the spacing between the digits (trick copied from |dcolumn|, Ref.~\cite{dcolumn}). % \begin{macrocode} \newcount\bedr@g \def\b@fi#1#2#3{\def\sep@rator{{#1}}\def\decim@lmark{{#2}}% - \let\ignorespaces=\@empty \def\sp@l{#3}\global\advance\FCsc@l by \@ne +\def\sp@l{#3}\let\ignorespaces=\@empty \let\unskip=\@empty +\global\advance\FCsc@l by \@ne % \end{macrocode} -% The value specified by the user is then captured by |\bedr@g|. +% The value specified by the user is then captured by |\bedr@g| and this is done in a +% special way: |\bedr@g| is assigned globally within |\box0|. Why? To later check +% the width of this box, see |\e@fi|. % \begin{macrocode} - \bedr@g=} +\setbox0=\hbox\bgroup\global\bedr@g=} % \end{macrocode} % \end{macro} % \begin{macro}{\e@fi} -% Once captured, the rest is handled by |\e@fi|. The number is then -% fed to |\zetg@ld| for the current column. -% \begin{macrocode} -\def\e@fi{\relax \zetg@ld{\number\bedr@g}{\sp@l}} +% If the user enters a number, say 10, \LaTeX\ will read +% |\setbox| |0| |=| |\hbox| |\bgroup| |\global| |\bedr@g| |=| |10| |123| |\relax| |\egroup|, which +% is perfectly valid. The count |\bedr@g| is~10 now and |\box0| is non-empty, in fact containing +% the number 123 (although any number would be good: it is discarded anyway). If however nothing +% was entered by the user, \LaTeX\ will read |\setbox| |0| |=| |\hbox| |\bgroup| |\global| |\bedr@g| +% |=| |123| |\relax| |\egroup|, which is also perfectly valid, but now |\bedr@g| is~123 and |\box0| +% is empty. So the width of |\box0| can be used to discriminate without actually using its contents +% in the horizontal list. Later, with the code for |\leeg| a related trick will be used. The space +% at the beginning of |\e@fi| is important, otherwise the 123 might be concatenated with the user +% entry, leading to wrong numbers. +% \begin{macrocode} +\def\e@fi{ 123\relax\egroup\ifdim\wd0>\z@ + \zetg@ld{\number\bedr@g}{\sp@l}% +\fi} % \end{macrocode} +% Please note that this trick does not work for an empty F-column that is ended by |\\|. The reason +% is that the first thing |\\| does---even before providing the |\cr| ---is to issue a |\relax|. +% This stops the assignment to |\bedr@g| and causes a \TeX\ error, complaining about a missing number. +% This is then repaired by \TeX\ by inserting a zero, so it doesn't affect the total of that column, +% but in particular this zero is then typeset, which it is not supposed to. I decided to leave it +% this way because in practice this is never a problem: simply discard the last |&| and the column +% before the offending column will now be ended by |\\|. Iterate for this line until a filled F-column +% or a non-F-column is encountered. This is assuming that you did not specify \verb+|+s in the tabular +% description: for them to work for the whole table you should have all |&|s in place (this is true in +% general, not only for |fcolumn|). On the other hand you should never, ever use vertical rules in +% tables, according to Ref.~\cite{booktabs}. And if you really must, then fill the empty F-columns +% with |\leeg{}|. % \end{macro} % % Here are adaptations to existing macros. -% \begin{macro}{\@xarraycr} -% Among all its tasks, now |\\| also resets the column number. This -% is a transparant change, i.e., loading this package without using -% the ``f'' column specifier does -% not change the effect of package |array.sty| in any way. -% This resetting has to be done after the |\cr|, so it is stored -% in a |\noalign|. -% \begin{macrocode} -\def\@xarraycr{\@ifnextchar [% - \@argarraycr {\ifnum 0=`{}\fi \cr\noalign{\global\FCsc@l=0 }}} -% \end{macrocode} -% \end{macro} % \begin{macro}{\@array} % The definition of |\@array| had to be extended slightly because % it should also include |\@mksumline| (acting on the same |#2| -% as |\@mkpream| gets). Also this change is transparant: it only adds +% as |\@mkpream| gets). This change is transparant: it only adds % functionality and if you don't use that, you won't notice the difference. +% It starts by just copying the original definition from the |array| package~\cite{array}. % \begin{macrocode} \def\@array[#1]#2{% - \@tempdima \ht \strutbox - \advance \@tempdima by\extrarowheight - \setbox \@arstrutbox \hbox{\vrule - \@height \arraystretch \@tempdima - \@depth \arraystretch \dp \strutbox - \@width \z@}% - \begingroup - \@mkpream{#2}% - \xdef\@preamble{\noexpand \ialign \@halignto - \bgroup \@arstrut \@preamble - \tabskip \z@ \cr}% +\@tempdima \ht \strutbox +\advance \@tempdima by\extrarowheight +\setbox \@arstrutbox \hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% +% \end{macrocode} +% Here comes the first change: after each |\\| (or |\cr| for that matter) the \meta{count} +% |\FCsc@l| should be reset. This is easiest done with |\everycr|, but |\everycr| is +% put to |{}| by |\ialign|, so that definition should change. The resetting should +% be done globally. +% \begin{macrocode} +\def\ialign{\everycr{\noalign{\global\FCsc@l=0 }}% + \tabskip\z@skip\halign} +% \end{macrocode} +% Then the definition is picked up again. +% \begin{macrocode} +\begingroup +\@mkpream{#2}% +\xdef\@preamble{\noexpand \ialign \@halignto +\bgroup\@arstrut\@preamble\tabskip\z@\cr}% +\endgroup % \end{macrocode} % The combination |\endgroup| followed by |\begingroup| seems redundant, but that is % not the case: the |\endgroup| restores everything that was not |\global|. With the % following |\begingroup| it is ensured that |\@mksumline| experiences the same % settings as |\@mkpream| did. % \begin{macrocode} - \endgroup - \begingroup - \@mksumline{#2}% - \endgroup +\begingroup +\@mksumline{#2}% +\endgroup % \end{macrocode} % As a side product of |\@mksumline| also the \meta{count}s for the totals and % \meta{dimen}s for the widths of the colums are created. The columns should start -% fresh, i.e., totals are 0 and widths are -% 0\thinspace pt. +% fresh, i.e., totals are~0 and widths are 0\thinspace pt. % \begin{macrocode} - \res@tsumline +\res@tsumline % \end{macrocode} % From here on it is just the old definition of |array.sty|. % \begin{macrocode} - \@arrayleft - \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi - \bgroup - \let \@sharp ##\let \protect \relax - \lineskip \z@ - \baselineskip \z@ - \m@th - \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble} +\@arrayleft +\if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi +\bgroup +\let \@sharp ##\let \protect \relax +\lineskip \z@ +\baselineskip \z@ +\m@th +\let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble} % \end{macrocode} % Because |\@array| was changed here and it is this version that should be used, % |\@@array| should be |\let| equal to |\@array| again. @@ -484,20 +593,22 @@ LaTeX version 1999/12/01 or later. % Furthermore most entries will simply add nothing to |\sumline|, e.g., |@|, |!|, % and \verb+|+ can be fully ignored. Ampersands are only inserted by |c|, |l|, |r|, % |p|, |m|, and |b|. So a specifier like |@{}lflf@{}| will yield the sumline -% |&\a&&\a\\|, where |\a| is a macro that prints the desired result of the column. -% Had the specifier been \verb+l|f||@{ }l|f+, then the same sumline must +% |&\a&&\a\\|, (where |\a| is a macro that prints the desired result of the column, +% see later). Had the specifier been \verb+l|f||@{ }l|f+, then the same sumline must % be constructed: all difficulties are already picked up and solved in the creation % of the preamble. % % In reality the sumline must be constructed from the expanded form of the specifier, -% so |@{}lf@{}| will expand as |@{}l>{\b@fi#1#2#2}r<{\e@fi}@{}|. The +% so |@{}lf@{}| will expand as |@{}l>{\b@fi{.}{,}{3,2}}r<{\e@fi}@{}|. The % rules for constructing the sumline are now very simple: % \begin{compactitem} % \item add an ampersand when |c|, |l|, |r|, |p|, |m|, or |b| is found, unless it is % the first one (this is the same as in the preamble); % \item add a |\a| when |<{\e@fi}| is found; -% \item ignore everything else. +% \item ignore everything else; +% \item close with a |\\|. % \end{compactitem} +% (In reality also the column check is inserted just before the |\\|, see |\aut@check|.) % To discriminate, a special version of |\testpach| could be written, but that is % not necessary: |\testpach| can do all the work, although much of it will be discarded. % Here speed is sacrificed for space and this can be afforded because the creation @@ -505,41 +616,43 @@ LaTeX version 1999/12/01 or later. % % The start is copied from |\@mkpream|. % \begin{macrocode} -\def\@mksumline#1{\gdef\sumline{} - \@lastchclass 4 \@firstamptrue +\def\@mksumline#1{\gdef\sumline{}\@lastchclass 4 \@firstamptrue % \end{macrocode} % At first the column number is reset and the actual code for what was called |\a| % above is made inactive. % \begin{macrocode} - \global\FCsc@l=\z@ - \let\prr@sult=\relax +\global\FCsc@l=0 +\let\prr@sult=\relax % \end{macrocode} % Then |\@mkpream| is picked up again. % \begin{macrocode} - \@temptokena{#1} - \@tempswatrue - \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}% - \count@\m@ne - \let\the@toks\relax - \prepnext@tok +\@temptokena{#1} +\@tempswatrue +\@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}% +\count0\m@ne +\let\the@toks\relax +\prepnext@tok % \end{macrocode} % Next is the loop over all tokens in the expanded form of the specifier. The change % with respect to |\@mkpream| is that the body of the loop is now only dealing -% with classes 0, 2, and 10. What to do in those cases is of course different from +% with F-classes~0, 2, and 10. What to do in those cases is of course different from % what to do when constructing the preamble, so special definitions are created, see % below. % \begin{macrocode} - \expandafter \@tfor \expandafter \@nextchar - \expandafter :\expandafter =\the\@temptokena \do - {\@testpach - \ifcase \@chclass \@classfz +\expandafter \@tfor \expandafter \@nextchar + \expandafter :\expandafter =\the\@temptokena \do + {\@testpach + \ifcase \@chclass \@classfz \or \or \@classfii \or \or \or \or \or \or \or \or \@classfx \fi - \@lastchclass\@chclass}% + \@lastchclass\@chclass}% % \end{macrocode} -% And the macro is finished by appending the |\\| to the sumline. +% And the macro is finished by applying the |\aut@check| and appending the |\\| to the sumline. +% Note that the |\aut@check| is performed {\itshape in\/} the last column, but since it does not +% put anything in the horizontal list---it only writes to screen and transcript file---, this +% is harmless. % \begin{macrocode} - \xdef\sumline{\sumline\noexpand\\}} +\xdef\sumline{\sumline\noexpand\aut@check\noexpand\\}} % \end{macrocode} % \end{macro} % \begin{macro}{\@addtosumline} @@ -550,26 +663,26 @@ LaTeX version 1999/12/01 or later. % \end{macrocode} % \end{macro} % \begin{macro}{\@classfx} -% Class~10 for the sumline creation is a stripped down version of |\@classx|: add an ampersand +% Class~f10 for the sumline creation is a stripped down version of |\@classx|: add an ampersand % unless it is the first. It deals with the specifiers |b|, |m|, |p|, |c|, |l|, and |r|. % \begin{macrocode} \def\@classfx{\if@firstamp \@firstampfalse \else \@addtosumline &\fi} % \end{macrocode} % \end{macro} % \begin{macro}{\@classfz} -% Class~0 is applicable for specifiers |c|, |l|, and |r| and if the arguments of |p|, |m|, +% Class~f0 is applicable for specifiers |c|, |l|, and |r|, and if the arguments of |p|, |m|, % or |b| are given. The latter three cases, with |\@chnum| is 0, 1, or~2 should be ignored -% and the first three cases are now similar to class~10. +% and the first three cases are now similar to class~f10. % \begin{macrocode} \def\@classfz{\ifnum\@chnum<\thr@@ \@classfx\fi} % \end{macrocode} % \end{macro} % \begin{macro}{\@classfii} -% Here comes the nice and nasty part. Class~2 is applicable if a |<| is specified. This is +% Here comes the nice and nasty part. Class~f2 is applicable if a~|<| is specified. This is % tested by checking |\@lastchclass|, which should be equal to~8. Then it is checked that % the argument to |<| is indeed |\e@fi|. This check is rather clumsy but this was the % first way, after many attempts, that worked. It is necessary because the usage of |<| -% is not restricted to |\e@fi|: the user may have specified other \TeX-code using |<|. +% is not restricted to |\e@fi|: the user may have specified other \LaTeX-code using~|<|. % \begin{macrocode} \def\@classfii{\ifnum\@lastchclass=8 \edef\t@stm{\expandafter\string\@nextchar} @@ -580,26 +693,32 @@ LaTeX version 1999/12/01 or later. % \begin{macrocode} \@addtosumline{\prr@sult} % \end{macrocode} -% But we're not done yet: in the following lines of code the appropriate \meta{count}s -% and \meta{dimen}s are created, if necessary. +% But we're not done yet: in the following lines of code the appropriate \meta{count}s and +% \meta{dimen}s are created, if necessary. Note that |\FCsc@l| was set to~0 in the beginning +% of |\@mksumline|, so it is well-defined when |\@classfii| is used. % \begin{macrocode} - \global\advance\FCsc@l by \@ne + \global\advance\FCsc@l by \@ne \ifnum\FCsc@l>\FCtc@l % \end{macrocode} -% Apparently the number of requested columns is larger than the currently available number, -% so a new one should be created. What is checked here is its existence: if it exists, it is not -% created by |fcolumn| so it may be something other than a \meta{count}, in which things go haywire. -% Therefore it is assumed that only |fcolumn| is allowed to generate a \meta{count} called -% |\FCtot@<some romannumeral>|. +% Apparently the number of requested columns is larger than the currently available number of +% relevant \meta{count}s and \meta{dimen}s, so new ones should be created. What is checked +% here is merely the existence of |\FCtot@<some romannumeral>|. If it already exists---although +% it may not even be a \meta{count}; that is not checked---it is not created by |fcolumn| and a +% warning is given. In case it is a \meta{count} you're just lucky, although any change to this +% \meta{count} is global anyway, so things will be overwritten. In the case it is not a +% \meta{count}, things will go haywire and you'll soon find out. The remedy then is to rename +% your \meta{count} prior to |fcolumn| to avoid this name clash. % \begin{macrocode} \expandafter\ifx\csname FCtot@\romannumeral\FCsc@l\endcsname\relax \expandafter\newcount\csname FCtot@\romannumeral\FCsc@l\endcsname \else - \message{\noexpand\FCtot@\romannumeral\FCsc@l already exists.} + \message{^^JWarning: FCtot@\romannumeral\FCsc@l \space is already + defined and it may not even be a <count>. I'll proceed, + but with fingers crossed. } \fi % \end{macrocode} -% And the same is applicable for the \meta{dimen}: it is assumed that only |fcolumn| is allowed to -% generate a \meta{dimen} called |\FCwd@<some romannumeral>|. +% And the same is applicable for the \meta{dimen}: in case of a name clash you have to +% rename your \meta{dimen} prior to |fcolumn|. % \begin{macrocode} \expandafter\ifx\csname FCwd@\romannumeral\FCsc@l\endcsname\relax \expandafter\newdimen\csname FCwd@\romannumeral\FCsc@l\endcsname @@ -608,65 +727,115 @@ LaTeX version 1999/12/01 or later. % \begin{macrocode} \global\FCtc@l=\FCsc@l \else - \message{\noexpand\FCwd@\romannumeral\FCsc@l already exists.} + \message{^^JWarning: FCwd@\romannumeral\FCsc@l \space is already + defined and it may not even be a <dimen>. I'll proceed, + but with fingers crossed. } \fi \fi \fi \fi} % \end{macrocode} -% Once created they are not initialised here because that is done later in one go. +% Once created it is not necessary to initialise them here because that is done later in one go. % \end{macro} % \begin{macro}{\leeg} -% The macro |\prr@sult| (see below) actually puts the information together. -% It starts with switching off the default behaviour of the f-column by -% providing the number 0 to comfort the assignment in |\b@fi|, although -% any number would be good: it -% is discarded anyway. This is achieved by |\let|ting |\e@fi| to be |\relax|. -% This |\let| is only local to the current column. Since the user may from time to -% time also need an empty entry in the table, this definition is without at-sign. -% \begin{macrocode} -\def\leeg{0\relax \let\e@fi=\relax} -% \end{macrocode} -% A better solution were to check for a number. If present then do the -% default action, otherwise generate an empty entry. +% This macro is used to overrule the default behaviour of the pair |\b@fi| and |\e@fi|. It +% starts with ending the assignment to |\bedr@g| in the same way that |\e@fi| would normally +% do. Then the effect of |\e@fi| (that is still in the preamble) is annihilated by |\let|ting +% it to be |\relax|. This |\let| is only local to the current column. Then the argument to +% |\leeg| is treated in a similar way as |\e@fi| would do with a typeset number. +% +% Since the user may from time to time also need a column entry other than a number in the +% table, e.g., |\leeg{p.m.}|, this definition is without at-sign. +% \begin{macrocode} +\def\leeg#1{ 234\relax\egroup \let\e@fi=\relax \setbox0=\hbox{#1}% +\ifdim\wd0>\csname FCwd@\romannumeral\FCsc@l\endcsname + \global\csname FCwd@\romannumeral\FCsc@l\endcsname=\wd0 +\fi\unhbox0} +% \end{macrocode} +% Note that anything may be given as argument to |\leeg|, so in principle it can also be used +% to cheat: |\leeg{0,03}| will insert |0,03| in the table but it doesn't increase the totals +% of that column by~3 (assuming |3,2| coding for the separations). But you won't cheat, won't you? +% It may affect the width, so be careful: don't insert the unabridged version of Romeo and Julia here. % \end{macro} % \begin{macro}{\prr@sult} -% And here it is: the end result. First annihilate the effect of |\e@fi|. +% The macro |\prr@sult| actually puts the information together. It starts like |\leeg|. % \begin{macrocode} -\def\prr@sult{\leeg +\def\prr@sult{ 345\relax\egroup \let\e@fi=\relax % \end{macrocode} % Then the information for the last line is computed. It is not sufficient to calculate % the width of the result (in points) to use that as the width of the rule separating -% the individual entries and the result. It may be that the sum is larger -% (in points) than any of the entries, e.g., when the result of $6+6$ is typeset. The -% width of the rule should be equal to the width of |\hbox{$12$}| then. On the other -% hand the width of the rule when summing $24$ and $-24$ should be that of |\hbox{$-24$}| -% (or |\hbox{$(24$}|, see above), not the width of the result |\hbox{$0$}|. Therefore the +% the individual entries and the result. It may be that the sum is larger (in points) than +% any of the entries, e.g., when the result of $600+600$ is typeset. The width of the rule +% should be equal to the width of |\hbox{$12{,}00$}| then (using specifier |3,2|). On the other +% hand the width of the rule when summing $2400$ and $-2400$ should be that of |\hbox{$-24{,}00$}| +% (or |\hbox{$(24{,}00$}|, see above), not the width of the result |\hbox{$0{,}00$}|. Therefore the % maximum of all entry widths, including the result, was calculated. % \begin{macrocode} - \setbox0=\hbox{$\geldm@cro{\number\csname - FCtot@\romannumeral\FCsc@l\endcsname}{\sp@l}$}% - \ifdim\wd0>\csname FCwd@\romannumeral\FCsc@l\endcsname - \global\csname FCwd@\romannumeral\FCsc@l\endcsname=\wd0 - \fi - \vbox{\hbox to \csname - FCwd@\romannumeral\FCsc@l\endcsname{\hrulefill}\vskip2pt - \hbox to \csname - FCwd@\romannumeral\FCsc@l\endcsname{\hfil\unhbox0}}} +\setbox0=\hbox{$\geldm@cro{\number\csname +FCtot@\romannumeral\FCsc@l\endcsname}{\sp@l}$}% +\ifdim\wd0>\csname FCwd@\romannumeral\FCsc@l\endcsname + \global\csname FCwd@\romannumeral\FCsc@l\endcsname=\wd0 +\fi +\vbox{\hrule width \csname FCwd@\romannumeral\FCsc@l\endcsname +\vskip2pt +\hbox to \csname FCwd@\romannumeral\FCsc@l\endcsname{\hfil\unhbox0}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\aut@check} +% If the number of F-columns is even, it is assumed that they are part of two sets of columns of +% which each column of the first set should balance the appropriate column of the second set. If +% on the other hand the number of columns is odd, then at least one column has nothing to balance +% against and no checking occurs. It is correct to check for oddness of |\FCsc@l| since this +% |\aut@check| is only performed in the last column of the tabular: the value of |\FCsc@l| now +% equals the number of columns used in the current tabular (and may differ from |\FCtc@l|). +% +% The output is only to screen and the transcript file; it doesn't change the appearance of your +% document, so in case the assumption is wrong you can safely ignore the result and go on. +% The \meta{count}s 0 and~1 are used here and this can be done because any content of those +% \meta{count}s from previous calculations has become irrelevant at this moment. +% \begin{macrocode} +\def\aut@check{\ifodd\FCsc@l\else \count0=\@ne \count1=\FCsc@l + \divide\count1 by \tw@ \advance\count1 by \@ne + \loop + \ifnum\csname FCtot@\romannumeral\count0\endcsname= + \csname FCtot@\romannumeral\count1\endcsname\else + \message{^^JWarning: F-columns \number\count0 \space + and \number\count1 \space do not balance! }% + \fi + \ifnum\count1=\FCsc@l\else + \advance\count0 by\@ne \advance\count1 by\@ne + \repeat +\fi } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\checkfcolumns} +% But the assumptions for |\aut@check| may be wrong, therefore manual +% control on this checking is also made possible here. The macro |\checkfcolumns| +% provides a way to the user to check that the appropriate +% columns are balanced (as it should in a balance). Arguments |#1| and |#2| are +% the column numbers to compare. It is the responsibility of the user to provide +% the correct numbers here, otherwise bogus output is generated. +% \begin{macrocode} +\def\checkfcolumns#1#2{\noalign{\ifnum\csname FCtot@\romannumeral#1 +\endcsname=\csname FCtot@\romannumeral#2\endcsname\else + \message{^^JWarning: F-columns #1 and #2 do not balance! }% +\fi}} % \end{macrocode} % \end{macro} % \begin{macro}{\res@tsumline} % Since all changes to the totals and widths of the columns are global, % they have to be reset actively at the start of a tabular or array. % That is an action by itself, but it may occur more often, on request -% of the user, therefore a special macro is defined. The count -% |\FCsc@l| can be used as a temporary register because its actual -% value is not important anymore. +% of the user, therefore a special macro is defined. A side effect of +% this macro is that |\FCsc@l| is reset to~0. This is an advantage: +% it should be zero at the beginning of a line in the table (for other +% lines this is done by the |\\|). % \begin{macrocode} -\def\res@tsumline{\FCsc@l\FCtc@l \loop\ifnum\FCsc@l>0 - \global\csname FCtot@\romannumeral\FCsc@l\endcsname=0 - \global\csname FCwd@\romannumeral\FCsc@l\endcsname=0pt - \advance\FCsc@l by \m@ne \repeat} +\def\res@tsumline{\FCsc@l=\FCtc@l\loop\ifnum\FCsc@l>0 + \global\csname FCtot@\romannumeral\FCsc@l\endcsname=0 + \global\csname FCwd@\romannumeral\FCsc@l\endcsname=\z@ + \advance\FCsc@l by \m@ne +\repeat} % \end{macrocode} % \end{macro} % \begin{macro}{\resetsumline} @@ -676,19 +845,18 @@ LaTeX version 1999/12/01 or later. % \end{macrocode} % \end{macro} % That's it! -% \StopEventually{\PrintIndex} -% \Finale -%\typeout{****************************************************} -%\typeout{*} -%\typeout{* To finish the installation you have to move the} -%\typeout{* following file into a directory searched by TeX:} -%\typeout{*} -%\typeout{*\space\space\space fcolumn.sty} -%\typeout{*} -%\typeout{* To produce the documentation run the file} -%\typeout{* fcolumn.dtx through LaTeX.} -%\typeout{*} -%\typeout{* Happy TeXing!} -%\typeout{*} -%\typeout{****************************************************} +%\section*{Acknowledgement} +% Thanks to Karl Berry for valuable comments regarding the consistency of +% the installation procedure of this version. +%\bibliographystyle{plain} +%\begin{thebibliography}{9} +%\itemsep0pt +%\parsep0pt +%\parskip0pt +%\bibitem{array} Frank Mittelbach and David Carlisle. +% A new implementation of \LaTeX's |tabular| and |array| environment. +%\bibitem{booktabs} Simon Fear. Publication quality tables in \LaTeX. +%\bibitem{dcolumn} David Carlisle. The |dcolumn| package. +%\end{thebibliography} +%\Finale \endinput |