texlive[50937] Master/texmf-dist: fcolumn (26apr19)

commits+karl at tug.org commits+karl at tug.org
Fri May 3 00:36:43 CEST 2019


Revision: 50937
          http://tug.org/svn/texlive?view=revision&revision=50937
Author:   karl
Date:     2019-05-03 00:36:42 +0200 (Fri, 03 May 2019)
Log Message:
-----------
fcolumn (26apr19)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/fcolumn/README
    trunk/Master/texmf-dist/doc/latex/fcolumn/fcolumn.pdf
    trunk/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx
    trunk/Master/texmf-dist/source/latex/fcolumn/fcolumn.ins
    trunk/Master/texmf-dist/tex/latex/fcolumn/fcolumn.sty

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/fcolumn/makefile

Modified: trunk/Master/texmf-dist/doc/latex/fcolumn/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/fcolumn/README	2019-05-02 22:36:31 UTC (rev 50936)
+++ trunk/Master/texmf-dist/doc/latex/fcolumn/README	2019-05-02 22:36:42 UTC (rev 50937)
@@ -1,4 +1,4 @@
-The LaTeX-package ``fcolumn''
+The LaTeX-package ``fcolumn'', under LPPL 1.3
 
 In financial reports, text and currency amounts are regularly put in
 one table, e.g., a year balance or a profit-and-loss overview.
@@ -31,10 +31,10 @@
 
 The core part of this table is input as 
 \begin{tabular}{lflf}
-house        &  20000000 &  equity capital &  5000000\\
-bank account &    -60323 &  mortgage       & 15000000\\
-savings      &   2800000 \\
-cash         &     14585 &  profit         &  2754262\\
+house        &  200000    &  equity capital &  50000    \\
+bank account &    -603,23 &  mortgage       & 150000    \\
+savings      &   28000                                  \\
+cash         &     145,85 &  profit         &  27542,62 \\
 \sumline
 \end{tabular}
 
@@ -48,9 +48,9 @@
 
 To install:
 -----------
-Run the file fcolumn.ins through LaTeX (in a directory also
-containing fcolumn.dtx) and move the file fcolumn.sty to a place
-searched by TeX.
+Run the file fcolumn.ins through (La)TeX (in a directory also
+containing fcolumn.dtx) or type ``make install'' and move the 
+file fcolumn.sty to a place searched by TeX.
 
 To produce the documentation:
 -----------------------------

Modified: trunk/Master/texmf-dist/doc/latex/fcolumn/fcolumn.pdf
===================================================================
(Binary files differ)

Added: trunk/Master/texmf-dist/doc/latex/fcolumn/makefile
===================================================================
--- trunk/Master/texmf-dist/doc/latex/fcolumn/makefile	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/fcolumn/makefile	2019-05-02 22:36:42 UTC (rev 50937)
@@ -0,0 +1,40 @@
+.SUFFIXES: .pdf .glo .gls .ind .idx .dtx .sty .ins
+
+.ins.sty:
+	pdflatex $*.ins
+
+.dtx.glo:
+	pdflatex $*.dtx
+
+.dtx.idx:
+	pdflatex $*.dtx
+
+.glo.gls:
+	makeindex -s gglo.ist -o fcolumn.gls fcolumn.glo
+
+.idx.ind:
+	makeindex -s gind.ist -o fcolumn.ind fcolumn.idx
+
+.dtx.pdf:
+	pdflatex $*.dtx
+
+all: fcolumn.pdf
+
+install: 
+	tex fcolumn.ins
+
+dist: fcolumn.dtx fcolumn.ins fcolumn.sty fcolumn.pdf README makefile
+	mkdir fcolumn; cp fcolumn.dtx fcolumn; cp fcolumn.ins fcolumn; \
+ cp fcolumn.sty fcolumn; cp fcolumn.pdf fcolumn; cp README fcolumn; \
+ cp makefile fcolumn; tar -czf fcolumn.tgz fcolumn; rm -r fcolumn
+
+fcolumn.pdf: fcolumn.dtx fcolumn.gls fcolumn.ind fcolumn.sty
+fcolumn.idx: fcolumn.dtx
+fcolumn.ind: fcolumn.idx
+fcolumn.glo: fcolumn.dtx
+fcolumn.gls: fcolumn.glo
+
+.PHONY: clean
+clean:
+	-rm fcolumn.pdf fcolumn.sty fcolumn.log fcolumn.glo fcolumn.gls \
+     fcolumn.ind fcolumn.idx fcolumn.aux fcolumn.ilg


Property changes on: trunk/Master/texmf-dist/doc/latex/fcolumn/makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx	2019-05-02 22:36:31 UTC (rev 50936)
+++ trunk/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx	2019-05-02 22:36:42 UTC (rev 50937)
@@ -1,5 +1,5 @@
 % \iffalse meta-comment
-% Copyright (C) 2015 by Edgar Olthof
+% Copyright (C) 2015--2019 by Edgar Olthof
 %
 % This file may be distributed and/or modified under the
 % conditions of the LaTeX Project Public License, either
@@ -13,15 +13,23 @@
 %
 % \fi
 % \iffalse
+%<package>\ProvidesPackage{fcolumn}
+%<package>          [2019/04/24 v1.2 Automatic Currency Package (EHTO)]
 %<package>\NeedsTeXFormat{LaTeX2e}
-%<package>\ProvidesPackage{fcolumn}
-%<package>          [2015/09/20 v1.1.1 Automatic Currency Package (EO)]
-%<package>\RequirePackage{array}
+%<package>\RequirePackage{array}[v2.4k]
 %<*driver>
 \documentclass{ltxdoc}
-\usepackage{fcolumn}
+\usepackage{fcolumn}          
 \usepackage{booktabs}
+\usepackage[tableposition=top,aboveskip=0pt]{caption}
+\DeclareCaptionStyle{normal}{labelfont={rm,bf,small},textfont={rm,small},%
+indention=0pt,labelsep=colon,justification=raggedright}
+\captionsetup[table]{style=normal}
+\captionsetup{singlelinecheck=false}
 \usepackage{paralist}
+\usepackage{url}
+\usepackage[hyperfootnotes=false,hidelinks]{hyperref}
+\usepackage{eurosym}
 \EnableCrossrefs
 \CodelineIndex
 \RecordChanges
@@ -30,7 +38,7 @@
 \end{document}
 %</driver>
 % \fi
-% \CheckSum{618}
+% \CheckSum{1078}
 % \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
@@ -47,8 +55,8 @@
 %   Grave accent  \`     Left brace    \{     Vertical bar  \|
 %   Right brace   \}     Tilde         \~}
 %
-% \changes{v0.1}{2015/02/06}{First working version}
-% \changes{v1.0}{2015/03/07}{Three-argument version is working properly}
+% \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;
@@ -55,7 +63,13 @@
 %   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.}
+%   .ins and .dtx after discussion with Karl Berry as well as some minor code improvements.}
+% \changes{v1.1.2}{2015/09/29}{Some inconsistencies between explanatory text 
+%   and actual code removed.}
+% \changes{v1.2}{2019/03/06}{Input parsing changed after comment from Frank
+%   Mittelbach.  He (Frank) also gave various suggestions for improving robustness
+%   or user friendlyness of this package.  This version is only backwards compatible
+%   when zero decimal digits were and are specified as modifier.}
 % \GetFileInfo{fcolumn.sty}
 % \DoNotIndex{\@arstrut,\@arstrutbox,\@depth,\@firstampfalse,\@firstamptrue,\@gobble,\@halignto}
 % \DoNotIndex{\@height,\@mkpream,\@ne,\@nextchar,\@preamble,\@sharp,\@tempdima,\@tempswafalse}
@@ -74,50 +88,58 @@
 % \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 and checking
+% one table, e.g., a year balance or a profit-and-loss overview.  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}
 %
 % \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 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)~grouping 
+% character of the integer part on output, 2)~decimal mark used on output,
+% and 3)~compact additional information on input/output characteristics,
+% see below.
 %
-% 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. 
+% 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 12345,67 will be typeset as $12{.}345{,}67$.  
+% People in the Anglo-saxon world would rather code 
+% |\newcolumntype{f}{F{,}{.}{3,2}}| for the same input, yielding 
+% $12{,}345{.}67$ as output for the number given above.  The default
+% value for |#3| is |3,2|, indicating
+% that grouping of the integer part is by three digits, that a comma is
+% used in the \TeX-source to indicate the decimal separator, 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.  
+% four digits, that the separator in the source should be the character |p|,
+% and there are three digits after the decimal mark---that happens to be a 
+% |\cdot|---, then simply specify |\newcolumntype{f}{F{\,}{\cdot}{4p3}}| in 
+% that case.  The input could be 12345p678 then, yielding $1{\,}2345{\cdot}678$
+% as output.
 %
 % 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|.
+% want no decimal digits (in that case of course also skipping the decimal
+% mark) you have to explicitly specify |x,0|. If you want no grouping
+% character, specify |0,x|.
 %
-% 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}
+% 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}
+% \caption{Example Table.}
 % \label{tab:ex1}
 % \begin{tabular}{@{}lflf@{}}
 % \multicolumn4c{\bfseries Balance sheet}\\
 % \toprule
-% properties&\multicolumn1r{31 dec 2014}&
-% debts&\multicolumn1{l@{}}{31 dec 2014}\\
+% properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
 % \midrule
-% house &     20000000 & equity capital&  5000000\\
-% bank account& -60323 & mortgage &      15000000\\
-% savings&     2800000 \\
-% cash&          14585 & profit  &        2754262\\
+% house &      200000    & equity capital&  50000    \\
+% bank account & -603,23 & mortgage &      150000    \\
+% savings &     28000    & &                         \\
+% cash &          145,85 & profit  &        27542,62 \\
 % \sumline
 % \bottomrule
 % \end{tabular}
@@ -124,159 +146,198 @@
 % \end{table}
 % and how this is entered in \LaTeX\ (Table~\ref{tab:ex2}).
 % \begin{table}[htb]
-% \caption{Verbatim version of Example Table}
+% \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}\\
-% \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 \\
-% cash&          14585 & profit  &        2754262\\
-% \sumline
-% \bottomrule
-% \end{tabular}
-% \end{table}
+%\begin{table}[htb]
+%\caption{Example Table.}
+%\label{tab:ex1}
+%\begin{tabular}{@{}lflf@{}}
+%\multicolumn4c{\bfseries Balance sheet}\\
+%\toprule
+%properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
+%\midrule
+%house &      200000    & equity capital&  50000    \\
+%bank account & -603,23 & mortgage &      150000    \\
+%savings &     28000    & &                         \\
+%cash &          145,85 & profit  &        27542,62 \\
+%\sumline
+%\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, 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.
+% 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, determines the widths of the sumrules, and checks
+% whether the two columns are in balance; if not, the user is warned via a
+% |\PackageWarning|.  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~\cite{dcolumn},
-% some constructions are more or less copied from that package.
+% This package is heavily inspired by the |dcolumn| package by
+% David Carlisle~\cite{dcolumn}, some constructions are more or less 
+% copied from that package.  Version~1.2 (this version) uses a few ideas 
+% from, and incorporates quite some suggestions by, Frank Mittelbach.
 %
 % \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.
+% 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}{4p3}}| 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.
+% Entries in an F-column are, from that moment on, treated as numbers unless
+% explicitly escaped by |\leeg|, see below.  The numbers are typeset 
+% according to the template the user gives with his/her |F|-column.
+% The ``middle'' character of |#3| is an important switch: it does more
+% than just setting the input decimal mark.  By default the input grouping 
+% character is the dot, except when the dot is specified as input decimal
+% mark; in that case the comma is acting as input grouping character.  With 
+% this convention the continental Europe and Anglo-saxon part of the world 
+% is served. 
 % \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;
+% 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{compactenum}[1)]
+% \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}
+% \item It checks the columns that are supposed to balance whether or not they
+% actually do.  If so, nothing happens.  If not, a |\PackageWarning| 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{compactenum}
+% By default the vertical separation between the rule and the total is 
+% 2\thinspace pt, but this can be changed by the optional argument to 
+% |\sumline|. Give, e.g., |\sumline[10pt]|, in case you want this spacing
+% to be 10\thinspace pt.
 % \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}.
+% 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}
+% \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}\\
+% expense & \leeg{actual} & \leeg{budget} & 
+% income & \leeg{actual} & \leeg{budget} \\
 % \midrule
-% food &         45000 & 50000 & tickets&  100000 &  100000\\
-% drinks &       35000 & 40000 \\
-% music &        18000 & 10000 \\
-% profit &        2000 \\
+% food &         450,20 & 500    & tickets &  1200    &  1000    \\
+% drinks &       547,5  & 400    \\
+% music &        180    & 100    \\
+% profit &        22,3  \\
 % \sumline
 % \resetsumline
 % \multicolumn6c{\bfseries Project~2}\\
 % \toprule
-% expense&\multicolumn1r{actual}&\multicolumn1r{budget}&
-% income&\multicolumn1{r}{actual}&\multicolumn1{r@{}}{budget}\\
+% expense & \leeg{actual} & \leeg{budget} & 
+% income & \leeg{actual} & \leeg{budget} \\
 % \midrule
-% food &         25000 & 30000 & tickets&  40000 &  45000\\
-% drinks &       10000 &  8000 \\
-% music &         8000 &  7000 & loss &     3000 \\
+% food &         250    & 300    & tickets &  400    &  450    \\
+% drinks &       100    &  80    \\
+% music &         80    &  70    & loss &      30    \\
 % \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}.
+% Note that the rules in the first and third |F|-columns of project~1 cover
+% $1{.}200{,}00$ whereas in project~2 those rules are narrower 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}}
+% \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}
+%\begin{table}[htb]
+%\caption{Example: multiple projects.}
+%\label{tab:ex3}
+%\begin{tabular}{@{}lfflff@{}}
+%\multicolumn6c{\bfseries Project~1}\\
+%\toprule
+%expense & \leeg{actual} & \leeg{budget} & 
+%income & \leeg{actual} & \leeg{budget} \\
+%\midrule
+%food &         450,2  & 500    & tickets &  1200    &  1000    \\
+%drinks &       547,5  & 400    \\
+%music &        180    & 100    \\
+%profit &        22,3  \\
+%\sumline
+%\resetsumline
+%\multicolumn6c{\bfseries Project~2}\\
+%\toprule
+%expense & \leeg{actual} & \leeg{budget} & 
+%income & \leeg{actual} & \leeg{budget} \\
+%\midrule
+%food &         250    & 300    & tickets &  400    &  450    \\
+%drinks &       100    &  80    \\
+%music &         80    &  70    & loss &      30    \\
+%\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{}|.
+% 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 
+% if it is a number---, this can be done with |\leeg|.  It expects an 
+% argument and this argument is typeset in the column.  The common case is
+% where |p.m.| (\textit{pro memoria}) is entered.  In contrast to v1.1.2 
+% of this package, now even an empty |F|-column followed by |\\| is allowed.
 % \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}|.
+% 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}|. If
+% |\checkfcolumns| is used, the automatic check is disabled.  Multiple
+% |\checkfcolumns|s are supported; if |F|-columns~1, 2, and~3 should 
+% balance, you specify |\checkfcolumns12| and |\checkfcolumns23|.
+% There is no explicit command to disable all checking, but
+% |\checkfcolumns11| obviously also serves that purpose.
 % \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|. 
+% \begin{macro}{\ifstrict at ccounting}
+% 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 |\strict at ccountingtrue|. 
 % \end{macro}
 % \StopEventually{\PrintChanges\PrintIndex}
 % \section{The macros}
+% Here follows the actual code.
+% \subsection{Option}
+% \begin{macro}{option strict}
+% There is one option. If set, strict accounting rules are used in display.
+%    \begin{macrocode}
+\newif\ifstrict at ccounting \strict at ccountingfalse
+\DeclareOption{strict}{\strict at ccountingtrue}
+\ProcessOptions
+%    \end{macrocode}
+% \end{macro}
+%\subsection{Definitions}
 % \begin{macro}{column F}
 % \begin{macro}{column f}
-% 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.
+% The column specifier |F| is the generic one, and |f| is the default 
+% (continental 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 at fi{#1}{#2}{#3}}r<{\e at fi}}
 \newcolumntype{f}{F{.}{,}{3,2}}
@@ -286,48 +347,49 @@
 % \begin{macro}{\FCsc at l}
 % \begin{macro}{\FCtc at l}
 % Two \meta{count}s are defined, that both start at zero: the \meta{count} 
-% |\FCsc at l|, that keeps track at which F-column the tabular is working on and 
-% the \meta{count} |\FCtc at 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
-% is used for the first time.
+% |\FCsc at l|, that keeps track at which F-column the tabular is working on 
+% and the \meta{count} |\FCtc at 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 is used for the first time.
 %    \begin{macrocode}
-\newcount\FCsc at l \FCsc at l=0
-\newcount\FCtc at l \FCtc at l=0
+\newcount\FCsc at l \FCsc at l=0 \newcount\FCtc at l \FCtc at l=0
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \begin{macro}{\geldm at cro}
 % The macro |\geldm at cro| takes a number and by default interprets this as
-% an amount expressed in cents (dollar cents, euro cents, centen, 
-% Pfennige, kopecks, groszy) and typesets it as the amount in entire 
-% currency units (dollars, euros, guldens, Marke, ruble, z\l oty)
-% with comma as decimal separator and the dot as thousand separator.
-% As explained, this can be changed. It uses a private boolean |\withs at 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.
+% an amount expressed in cents (dollar cents, euro cents, centen, Pfennige,
+% centimes, kopecks, groszy) and typesets it as the amount in entire 
+% currency units (dollars, euros, guldens, Marke, francs, rubles, z\l oty)
+% with comma as decimal separator and the dot as grouping character
+% (thousand separator if the first part of |#1| is~3).
+% As explained, this can be changed.  It uses two private booleans: 
+% |\withs at p| and |\strict at ccounting|.  The latter is used to typeset
+% negative numbers between parentheses.  By default it doesn't do this:
+% a minus sign is used.
 %    \begin{macrocode}
 \newif\ifwiths at p
-\newif\ifstrictaccounting \strictaccountingfalse
 %    \end{macrocode}
 % Actually |\geldm at cro| is only a wrapper around |\g at ldm@cro|.
 %    \begin{macrocode}
 \def\geldm at cro#1#2{\withs at pfalse 
-\afterassignment\g at ldm@cro\count@#2\relax{#1}}
+\afterassignment\g at ldm@cro\count@#1\relax{#2}}
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\g at 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 |\count2| 
-% and goes on.  Note that |\geldm at cro| and therefore |\g at 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.
+% 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 |\count2| and goes on.  Note that |\geldm at cro| and therefore |\g at 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 |F|-column-specific
+% \meta{count}s because it is all done locally.  Leaving the tabular environment will 
+% restore their values.
 %    \begin{macrocode}
-\def\g at ldm@cro#1\relax#2{%
-\ifnum#2<0 \ifstrictaccounting(\else-\fi\count2=-#2 \else\count2=#2 \fi
+\def\g at ldm@cro#1\relax#2{\ifnum#2<0 \ifstrict at ccounting (\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).
@@ -334,71 +396,92 @@
 % 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}
-\count3=\ifx\relax#1\relax2 \else \@gobble#1\relax\fi
-\count4=\count3
-\loop
- \ifnum\count3>0 \divide\count2 by 10 \advance\count3 by \m at ne
+\count4=\ifx\relax#1\relax 2 \else \@gobble#1\relax\fi
+\count3=0
+\loop\ifnum\count3<\count4 
+  \divide\count2 by 10 \advance\count3 by \@ne
 \repeat
 %    \end{macrocode}
-% The value in |\count2| is then output by |\g at ldens| using the separation given.
+% Note that |\count3| now equals |\count4|: this going up-and-down will be used more often,
+% it saves several assignments.  The value in |\count2| is then output by |\g at ldens| using 
+% the separation given (and stored in |\count@|).
 %    \begin{macrocode}
 \g at ldens{\the\count@}%
 %    \end{macrocode}
 % If there is a decimal part\dots
 %    \begin{macrocode}
-\ifnum\count4>0\decim at lmark
+\ifnum\count3>0\decim at lmark
 %    \end{macrocode}
-% Next the decimal part is dealt with. Now $x\bmod a$ is calculated in the 
+% Next the decimal part is dealt with.  Now $x\bmod a$ is calculated in the 
 % 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 at ne
- \repeat
+  \ifnum#2>0 \count2=-#2\else\count2=#2 \fi
+  \loop\ifnum\count3>0
+    \divide\count2 by 10 \advance\count3 by \m at ne
+  \repeat
 %    \end{macrocode}
-% The value of |\count3| is~0 now. Now counting up again, this saved an assignment.
+% The value of |\count3| is now~0, so counting up again.
 %    \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 at d{\number\count3}{\number\count2}%
+  \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 at 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 
-% this entry in the column is wrong.  This is done by an |\rlap| and therefore does
-% not influence the column width.  For the last column this means that this parenthesis
-% may even stick out of the table.  I don't like this, therefore I chose to put 
-% |\strictaccountingfalse|.  Change if you like.
+% 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 this entry in the column is wrong.  This is done by an
+% |\rlap| and therefore does not influence the column width.  For the last
+% column this means that this parenthesis may even stick out of the table.
+% I don't like this, therefore I chose to put |\strict at ccountingfalse|.
+% Change if you like, by setting the option |strict|.
+% 
+% If overflow was detected, an exclamation mark is output to the right of
+% the value that caused this.  This of course ruins the appearance of the
+% table, but in this case that serves a clear goal: there's something wrong
+% and you should know.
 %    \begin{macrocode}
-\ifnum#2<0 \ifstrictaccounting\rlap{)}\fi\fi}
+\ifx\FCs at gn\m at ne \ifnum#2<0 \ifstrict at ccounting
+  \rlap{)~!}\else\rlap{~!}\fi\else\ifstrict at ccounting
+  \rlap{\phantom{)}~!}\else\rlap{~!}\fi\fi
+\else \ifnum#2<0 \ifstrict at ccounting\rlap{)}\fi\fi
+\fi}
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\g at ldens}
-% Here the whole currency units are dealt with.  The macro |\g at 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 (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\$.
+% Here the whole currency units are dealt with.  The macro |\g at ldens| is 
+% used recursively, therefore the double braces; this allows to use 
+% |\count0| locally.  This also implies that tail recursion is not 
+% possible here, but that is not very important, as the largest number
+% (which is $2^{31}-1$) will only cause a threefold recursion using the
+% default |3,2| (ninefold when using |1,0|, but who does that?).  The 
+% largest amount this package can deal with is therefore 2.147.483.647 
+% (using |3,0|).  For most people this is probably more than enough if
+% the currency is euros or dollars.  And otherwise make clear that you
+% use a currency unit of~k\EUR{} (or even M\EUR{} for the very rich).
+% The author is thinking of ways to use two counters for each number.
+% The maximum then becomes $2^{63}-1$.  Even expressed in cents this 
+% would lead to a maximum of slightly more than 92.2\thinspace P\EUR{};
+% about 100 times the current world economy~\cite{world_economy}. Yet
+% another method is to used Heiko Oberdiek's package |bigintcalc|:
+% then only memory restrictions apply.  This, however, requires a major
+% rewrite of |fcolumn|. For now, version~1.2 sticks to the moderate amounts.
+%
+% There is no straightforward interpretation of |#1| being zero or 
+% negative, therefore this is used as an indicator that no grouping
+% character should be used.
 %    \begin{macrocode}
 \def\g at ldens#1{{\count3=\count2 \count0=#1
 %    \end{macrocode}
 % First divide by $10^n$, where $n$ is |#1|.
 %    \begin{macrocode}
-\loop
- \ifnum\count0>0
- \divide\count2 by 10
- \advance\count0 by \m at ne
+\ifnum\count0<1 \count0=3 \fi
+\loop \ifnum\count0>0 \divide\count2 by 10 \advance\count0 by \m at ne
 \repeat
 %    \end{macrocode}
 % Here is the recursive part,
@@ -408,10 +491,8 @@
 % and then reconstruct the rest of the number.
 %    \begin{macrocode}
 \count0=#1
-\loop
- \ifnum\count0>0
- \multiply\count2 by 10
- \advance\count0 by\m at ne
+\ifnum\count0<1 \count0=3 \fi
+\loop \ifnum\count0>0 \multiply\count2 by 10 \advance\count0 by \m at ne
 \repeat
 \count2=-\count2
 \advance\count2 by \count3 \du at zendprint{#1}}}
@@ -419,20 +500,19 @@
 % \end{macro}
 % \begin{macro}{\du at zendprint}
 % The macro |\du at zendprint| takes care for correctly printing the separator
-% and possible trailing zeros.
+% and possible trailing zeros. The former, however, is only done if |#1|
+% is larger than zero.
 %    \begin{macrocode}
-\def\du at zendprint#1{\ifwiths at p\sep at rator\zerop at d{#1}{\number\count2}%
- \else\zerop at d{1}{\number\count2}\fi \global\withs at ptrue}
+\def\du at zendprint#1{\ifwiths at p\ifnum#1>0 \sep at rator\fi
+ \zerop at d{#1}{\number\count2}%
+\else\zerop at d1{\number\count2}\fi\global\withs at ptrue}
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\zerop at d}
 % The macro |\zerop at d| uses at least |#1| digits for printing the 
-% number |#2|, padding with zeros when necessary.
-% Initially this was a nice macro using tail recursion until it was
-% found that the running time of that macro was proportional to $n^2$,
-% where $n$ is roughly the number of zeros to be padded. The worst
-% case situation is when printing ``0''.  The running time of the current version
-% is only linear in $n$.
+% number |#2|, padding with zeros when necessary. Note: |#1| being
+% zero or negative is a flag that it should be interpreted as 3.
+% A bit ugly, but it works, since the related code knows about this.
 %
 % It is done within an extra pair of braces, so that |\count0| 
 % and |\count1| can be used without disturbing their values in other macros.
@@ -442,27 +522,96 @@
 % 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\@ne
+\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.
+% If |#1| is positive, the number of zeros to be padded is 
+% $\max(0,|#1-\count0|)$ (the second argument can be negative), so a
+% simple loop suffices.  If it is zero or negative, this is a signal
+% that it should be interpreted as 3 (and no separator will be output).
 %    \begin{macrocode}
-\loop
- \ifnum\count0<#1\relax 0\advance\count0 by\@ne
-\repeat 
-\number#2}}
+\ifnum#1>0
+ \loop \ifnum\count0<#1\relax 0\advance\count0 by \@ne
+ \repeat 
+\else
+ \advance\count0 by -3
+ \loop \ifnum\count0<0 0\advance\count0 by \@ne
+ \repeat 
+\fi\number#2}}
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\zetg at 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
-% typesets |#1| via |\geldm at cro|.
+% This macro takes care for several things: it increases the subtotal for a
+% given F-column, it checks whether or not that subtotal has overflown, it
+% records the largest width of the entries in that column and it typesets 
+% |#1| via |\geldm at cro|.
 %    \begin{macrocode}
-\def\zetg at ld#1#2{\global\advance\csname 
-FCtot@\romannumeral\FCsc at l\endcsname by #1
+\def\zetg at ld#1#2{\count0=#2\relax \let\FCs at gn=\@ne
+%    \end{macrocode}
+% First it checks whether there is a risk of overflow in this step.  If
+% $A$ and $B$ are two \TeX-registers and $B$ is to be added to $A$, 
+% overflow will not occur if one is (or both are) zero or if $A$ and~$B$
+% have different signs.  Otherwise, be careful. Note that \TeX\ does not
+% check for overflow when performing an |\advance| (done in section~1238
+% of Ref.~\cite{CandTB}), in contrast to |\multiply|, see section~105.
+%    \begin{macrocode}
+\ifnum\count0<0 
+  \ifnum\csname FCtot@\romannumeral\FCsc at l\endcsname<0
+    \let\FCs at gn=\m at ne 
+  \fi
+\fi
+\ifnum\count0>0
+  \ifnum\csname FCtot@\romannumeral\FCsc at l\endcsname>0
+    \let\FCs at gn=\m at ne 
+  \fi
+\fi
+\global\advance\csname FCtot@\romannumeral\FCsc at l\endcsname by \count0
+\ifx\FCs at gn\m at ne 
+%    \end{macrocode}
+% They had the same sign: risk of overflow. Record the sign
+% of |\count0| (and of the original total of this column; they were 
+% the same) in |\FCs at gn|. Table~\ref{tab:ex5} 
+% \begin{table}[htb]
+% \def\PackageError#1#2#3{\PackageWarning{#1}{#2}}
+% \caption{Examples on overflow.}
+% \label{tab:ex5}
+% \begin{tabular}{@{}lfff@{}}
+% \multicolumn4c{\bfseries Projects}\\
+% \toprule
+% income & \leeg{31 dec 2014} & \leeg{31 dec 2015} & \leeg{31 dec 2016} \\
+% \midrule
+% item~1 &  20000000 & 20000000 &20000000 \\
+% item~2 &  10000000 &  2000000 &-2000000 \\
+% item~3 &   5000000 & -2000000 & 2000000 \\
+% \checkfcolumns23
+% \sumline
+% \bottomrule
+% \end{tabular}
+% \end{table}
+% shows what can go wrong if the numbers are too large: in the left
+% |F|-column the sumline is incorrect and the number that caused 
+% the overflow is indicated by an exclamation mark. In the middle 
+% |F|-column, overflow occurs twice and because this is once positive,
+% once negative here, cancellation of errors occurs and the sumline
+% is correct in the end.  Nevertheless, it is advised to swap the two
+% items that caused the overflow, as shown in the right |F|-column.
+%
+% Since the absolute value of |\FCs at gn| is unity, no overflow will
+% occur in the multiplication step below.
+%    \begin{macrocode}
+  \ifnum\count0>0 \let\FCs at gn\@ne \fi
+  \count0=\csname FCtot@\romannumeral\FCsc at l\endcsname
+  \multiply\count0 by \FCs at gn
+  \ifnum\count0<0 
+    \let\FCs at gn=\m at ne
+    \PackageError{fcolumn}{Register overflow}{Overflow occurred
+    in fcolumn \number\FCsc at l. Check your table.}%
+  \else\let\FCs at gn=\@ne
+  \fi
+\fi
+%    \end{macrocode}
+% The value of |\FCs at gn| is used in |\geldm at cro| below.
+%    \begin{macrocode}
 \setbox0=\hbox{$\geldm at cro{#1}{#2}$}%
 \ifdim\wd0>\csname FCwd@\romannumeral\FCsc at l\endcsname
  \global\csname FCwd@\romannumeral\FCsc at l\endcsname=\wd0
@@ -469,66 +618,227 @@
 \fi\unhbox0}
 %    \end{macrocode}
 % \end{macro}
+% \def\<#1>{\leavevmode\hbox{$\langle$#1\/$\rangle$}}
 % \begin{macro}{\b at fi}
-% The macro |\b at fi| provides the beginning of the financial column.
-% It will be inserted in the column to capture the number
-% entered by the user. The |\let| is only local to the column and is necessary because
-% |\ignorespaces| is automatically inserted by the preamble-generating macro |\@mkpream|.
-% Its effect should be annihilated, otherwise the assignment to |\bedr at g| goes wrong.
-% 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|, Ref.~\cite{dcolumn}).
+% The macro |\b at fi| provides the beginning of the financial column.  It
+% will be inserted in the column to capture the number entered by the user
+% 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|, Ref.~\cite{dcolumn}).
+%
+% The \meta{count}s |\FC at l| captures the part to the left of the decimal 
+% marker, |\FC at r| that to the right.
 %    \begin{macrocode}
-\newcount\bedr at g
-\def\b at fi#1#2#3{\def\sep at rator{{#1}}\def\decim at lmark{{#2}}%
-\def\sp at l{#3}\let\ignorespaces=\@empty \let\unskip=\@empty
-\global\advance\FCsc at l by \@ne
+\newcount\FC at l \newcount\FC at r
+\def\FC at chklist{}
+\def\setucc at de#1#2\relax{\uccode`\~=`#1 }
+\def\b at fi#1#2#3{%
 %    \end{macrocode}
-% The value specified by the user is then captured by |\bedr at g| and this is done in a
-% special way: |\bedr at g| is assigned globally within |\box0|.  Why? To later check
-% the width of this box, see |\e at fi|.
+% An intermediate macro |\sep at xt| to extract the first character
+% of |#1|, which in most cases will be the only character.
 %    \begin{macrocode}
-\setbox0=\hbox\bgroup\global\bedr at g=}
+\def\sep at xt##1##2\end{\def\sep at rator{{##1}}}%
+\sep at xt#1\end\def\decim at lmark{{#2}}%
+\def\sp at l{#3}\global\advance\FCsc at l by \@ne
+\global\FC at l=0 \global\FC at r=1
 %    \end{macrocode}
+% The value specified by the user is then captured by |\FC at l| and 
+% this is done in a special way: |\FC at l| is assigned globally within
+% |\box0|.  Why?  To use it as scribbling paper to examine what the 
+% user entered, without dumping it into the horizontal list.
+%
+% There are four parts to an |F|-column entry, all parts optional,
+% making 16 combinations.  The sequence is
+% (in the Backus--Naur notation of Ref.~\cite{CandTA}):
+% \<sign> \<integer constant> \<decimal marker>
+% \<integer constant>. Here \<sign> is a plus or minus character with 
+% category code~12, \<integer constant> is a sequence of zero
+% or more (decimal) \<digit>s, and \<decimal marker> is the middel 
+% part of |#3|, i.e., the comma in |3,2| or the period in |3.2|.
+% If the \<decimal marker> is absent with no space characters between 
+% the two \<integer constant> terms, these merge, making four redundant
+% entries.  One of the 
+% combinations is \<empty>, a sequence of exactly zero non-space tokens:
+% this is the only combination that doesn't put anything in an |F|-column.
+%
+% The minus sign must be captured separately, because in an entry like
+% |-0,07| the 7~cents are negative, but this cannot be seen from the
+% integer part, since $-0$ is $0$ in \TeX\ (in fact in most computer
+% languages, but not in~MIX~\cite{TAOCP1}), so |\ifnum-0<0| yields false.
+% |\FCs at gn| is a general purpose flag.  Its first use is to capture
+% the sign.
+%    \begin{macrocode}
+\let\FCs at gn=\@ne\relax \setbox0\hbox\bgroup$%   
+%    \end{macrocode}
+% Do the scan inside a box and inside math mode.  Start with
+% defining all characters that may appear as the first one in an |F|-column
+% as active.
+%    \begin{macrocode}
+\uccode`\~=`0\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=0}
+\uccode`\~=`1\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=1}
+\uccode`\~=`2\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=2}
+\uccode`\~=`3\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=3}
+\uccode`\~=`4\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=4}
+\uccode`\~=`5\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=5}
+\uccode`\~=`6\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=6}
+\uccode`\~=`7\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=7}
+\uccode`\~=`8\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=8}
+\uccode`\~=`9\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=9}
+%    \end{macrocode}
+% For the input decimal mark something extra is needed: if it is the
+% first character in an |F|-column (like in |,07|), it should also
+% restore the |\mathcode|s of the digits.  Checking whether or not it
+% is the first is easy, since in that case the |\mathcode|s of the 
+% decimal digits is still |"8000|.  The assignment to |\FC at r| starts 
+% with~1, so that appended digits get captured correctly, even if they
+% start with~0.  Postprocessing of |\FC at r| is done in |\e at fi|.
+% The input decimal mark switches itself off as active character, 
+% so at most one input decimal separator is allowed (N.B.:
+% this makes sense).
+%    \begin{macrocode}
+\def\deactdecm at rk##1##2\relax{\mathcode`##1=0 }%
+\afterassignment\setucc at de\count@#3\relax
+\uppercase{\def~}{\ifnum\mathcode`\0=\mathcode`- \restorem at thcodes\fi
+\afterassignment\deactdecm at rk\count@#3\relax \global\FC at r=1}%
+%    \end{macrocode}
+% The input grouping character effectively expands to ``nothing, i.e.,
+% ignore'' in a complicated way: it ignores the character and resumes 
+% scanning the number.  The test prior to that action is needed if
+% the grouping character is the first character encountered in the
+% |F|-column.  Which part to continue with depends on whether or not an
+% input decimal mark was encountered; that can be checked by looking
+% at its |\mathcode|.
+% 
+% The input grouping character is the dot |.|, except when that character
+% was already chosen as input decimal mark.  In that case, the grouping 
+% character will be the comma. This is easy to check because the |\uccode|
+% of |`\~| is still preserved.  
+%    \begin{macrocode}
+\def\d at cm##1##2{\count@=\mathcode`##1 }
+\ifnum\uccode`\~=`. \uccode`\~=`,\relax\else \uccode`\~=`.\relax\fi
+\uppercase{\def~}{\ifnum\mathcode`\0=\mathcode`- \restorem at thcodes\fi
+\afterassignment\d at cm\count@#3\relax
+%    \end{macrocode}
+% The |\expandafter| below is necessary because the global assignment
+% should act after the |\fi|.
+%    \begin{macrocode}
+\ifnum\count@=\mathcode`- \expandafter\global\FC at l=\the\FC at l
+\else \expandafter\global\FC at r=\the\FC at r\fi}%
+%    \end{macrocode}
+% The signs are relatively simply: record the sign, restore |\mathcode|s if
+% needed (it should be: a minus sign between digits screws up everything),
+% and start scanning the number.
+%    \begin{macrocode}
+\uccode`\~=`+\relax
+\uppercase{\def~}{\ifnum\mathcode`\0=\mathcode`-
+\restorem at thcodes\fi\global\FC at l=0}%
+\uccode`\~=`-\relax 
+\uppercase{\def~}{\ifnum\mathcode`\0=\mathcode`-
+\restorem at thcodes\fi\global\let\FCs at gn\m at ne \global\FC at l=0}%
+%    \end{macrocode}
+% Now actually activate all these codes.  The first is simple, but
+% after that, one can't say |"8000| anymore because |0| acts as active.
+% But copying |\mathcode|s still works.
+%    \begin{macrocode}
+\mathcode`-="8000 \mathcode`+=\mathcode`- \mathcode`.=\mathcode`- 
+%    \end{macrocode}
+% These three remain active until the |$| in |\e at fi| is encountered.
+% The following ones will, in the general case, have their activeness 
+% turned off at some time.
+%    \begin{macrocode}
+\def\actdecm at rk##1##2\relax{\ifx##1.\relax \mathcode`,=\mathcode`-
+\else \mathcode`##1=\mathcode`- \fi}%
+\afterassignment\actdecm at rk\count@#3\relax
+\mathcode`\0=\mathcode`- \mathcode`\1=\mathcode`- 
+\mathcode`\2=\mathcode`- \mathcode`\3=\mathcode`- 
+\mathcode`\4=\mathcode`- \mathcode`\5=\mathcode`- 
+\mathcode`\6=\mathcode`- \mathcode`\7=\mathcode`- 
+\mathcode`\8=\mathcode`- \mathcode`\9=\mathcode`- }
+%    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\e at fi}
-% If the user enters a number, say 10, \LaTeX\ will read
-% |\setbox| |0| |=| |\hbox| |\bgroup| |\global| |\bedr at g| |=| |10| |123| |\relax| |\egroup|, which
-% is perfectly valid.  The count |\bedr at 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 at g|
-% |=| |123| |\relax| |\egroup|, which is also perfectly valid, but now |\bedr at 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 at fi| is important, otherwise the 123 might be concatenated with the user 
-% entry, leading to wrong numbers.
+% If the digits are still active then either nothing was entered or only
+% characters that did not deactivate the digits were entered.  In 
+% either case the output should be \<empty>.  To flag this outside
+% the group that started with the opening |$| of |\b at fi|, |\FC at r| is set
+% globally to a negative value.  This doesn't harm, because it didn't 
+% contain relevant information anyway.  Outside the group, the sign
+% of |\FC at r| can then be tested.  This is a slight misuse of this
+% |\count|, but now it's documented.
+%
+% If there was no decimal sign or if there was a decimal sign but no 
+% decimal part, |\FC at r| will still be~1, which doesn't parse well with
+% |\secd at xt|, so a zero is appended.
 %    \begin{macrocode}
-\def\e at fi{ 123\relax\egroup\ifdim\wd0>\z@
- \zetg at ld{\number\bedr at g}{\sp at l}%
+\def\e at fi{\ifnum\mathcode`\0=\mathcode`- \global\FC at r=\m at ne\fi$\egroup
+\ifnum\FC at r>0
+ \ifnum\FC at r<10 \multiply\FC at r by 10 \fi
+%    \end{macrocode}
+% Next is a loop for bringing the decimal part in the correct way to the 
+% the integer part.  The loop is performed the number of decimal
+% digits to be printed (the~2 in |3,2| of the default setting).  This also
+% means that if you specified more decimal digits than this, the excess 
+% digit(s) will not be handled and a |\PackageWarning| will be given.
+%    \begin{macrocode}
+ \def\i at ts##1##2{\count0=##2}
+ \afterassignment\i at ts\count@\sp at l
+ \loop\ifnum\count0>0 \multiply\FC at l by 10
+  \expandafter\secd at xt\number\FC at r\end \advance\count0 by \m at ne
+ \repeat
+ \ifnum\FC at r>10
+   \def\tw at l##1##2\relax{##2}
+   \PackageWarning{fcolumn}{Excess digit\ifnum\FC at r>100 s\fi\space
+   ``\expandafter\tw at l\number\FC at r\relax'' in decimal part
+   \MessageBreak ignored}
+ \fi
+%    \end{macrocode}
+% Don't forget to correct for the sign (once this is done, |\FCs at gn|
+% is free again and can and will be used for other purposes).
+% Then output the result.
+%    \begin{macrocode}
+ \ifx\FCs at gn\m at ne\relax \FC at l=-\FC at l \fi
+ \zetg at ld{\sp at l}{\FC at 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 at 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}{\secd at xt}
+% The second digit from the left is needed from a decimal number. The
+% macro |\secd at xt| extracts that digit, provided that the number has at
+% least two digits, but that is guaranteed by |\e at fi|.  That second digit
+% is then added to |\FC at l|.  A new number is assigned to |\FC at r|, that 
+% consists of the digits of |#1#3|.  If |#3| was empty, a zero is appended.
+% In this way |\FC at r| is prepared for insertion in the next invocation of 
+% |\secd at xt|.  In iterating: 1234 yields~134, yields~14, yields~10,
+% stays~10, etc.
+%    \begin{macrocode}
+\def\secd at xt#1#2#3\end{\advance\FC at l by #2
+\FC at r=#1#3 \ifnum\FC at r<10 \multiply\FC at r by 10 \fi}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\restorem at thcodes}
+% As shown above, once the first digit, or sign, or decimal separator, or
+% grouping character is scanned, the decimal digits should loose their
+% activeness.  That is done here rather blunt, since the actual 
+% |\mathcode| is not important---as long as it is not |"8000|---because
+% the digits are not used for typesetting (and even if they were; it's
+% inside |\box0|, whose contents will be discarded).  When the |$| 
+% in |\e at fi| is encountered, the digits get back their original
+% |\mathcode|s so that the actual typesetting in |\zetg at ld| is
+% correct again.
+%    \begin{macrocode}
+\def\restorem at thcodes{\mathcode`\0=0 \mathcode`\1=0 
+\mathcode`\2=0 \mathcode`\3=0 \mathcode`\4=0 \mathcode`\5=0
+\mathcode`\6=0 \mathcode`\7=0 \mathcode`\8=0 \mathcode`\9=0 }
+%    \end{macrocode}
+% \end{macro}
+% \subsection{Adaptations to existing macros}
 % \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).  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}.
+% The definition of |\@array| had to be extended slightly because it should
+% also include |\@mksumline| (acting on the same |#2| 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 v2.4k of the |array| package~\cite{array}.
 %    \begin{macrocode}
 \def\@array[#1]#2{%
 \@tempdima \ht \strutbox
@@ -538,10 +848,10 @@
            \@depth \arraystretch \dp \strutbox
            \@width \z@}%
 %    \end{macrocode}
-% Here comes the first change: after each |\\| (or |\cr| for that matter) the \meta{count}
-% |\FCsc at 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.
+% Here comes the first change: after each |\\| (or |\cr| for that matter)
+% the \meta{count} |\FCsc at 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 at l=0 }}%
  \tabskip\z at skip\halign}
@@ -554,18 +864,18 @@
 \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.
+% 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}
 \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.
+% 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.
 %    \begin{macrocode}
 \res at tsumline
 %    \end{macrocode}
@@ -580,17 +890,18 @@
 \m at 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.
+% Because |\@array| was changed here and it is this version that should
+% be used, |\@@array| should be |\let| equal to |\@array| again.
 %    \begin{macrocode}
 \let\@@array=\@array
 %    \end{macrocode}
 % \end{macro}
+% \subsection{The sumline, close to a postamble}
 % \begin{macro}{\@mksumline}
-% The construction of the sumline is much easier than that of the preamble for
-% several reasons.  It may be safely assumed that the preamble specifier is
-% grammatically correct because it has already been screened by |\@mkpream|.
-% Furthermore most entries will simply add nothing to |\sumline|, e.g., |@|, |!|,
+% The construction of the sumline is much easier than that of the preamble
+% for several reasons.  It may be safely assumed that the preamble specifier
+% is grammatically correct because it has already been screened by |\@mkpream|.
+% Furthermore most entries will simply add nothing to |\s at ml@ne|, 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, 
@@ -598,28 +909,30 @@
 % 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 at fi{.}{,}{3,2}}r<{\e at 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);
+% In reality the sumline must be constructed from the expanded form of the
+% specifier, so |@{}lf@{}| will expand as
+% |@{}l>{\b at fi{.}{,}{3,2}}r<{\e at fi}@{}|. The rules for constructing the 
+% sumline are now very simple:
+% \begin{compactitem}[$\bullet$]
+% \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 at fi}| is found;
 % \item ignore everything else;
 % \item close with a |\\|.
 % \end{compactitem}
-% (In reality also the column check is inserted just before the |\\|, see |\aut at 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
-% of the sumline is only done once per |\tabular|.
+% (In reality also the column check is inserted just before the |\\|, see
+% |\aut at 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 of the sumline is done only 
+% once per |\tabular|.
 % 
 % The start is copied from |\@mkpream|.
 %    \begin{macrocode}
-\def\@mksumline#1{\gdef\sumline{}\@lastchclass 4 \@firstamptrue
+\def\@mksumline#1{\gdef\s at ml@ne{}\@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.
+% At first the column number is reset and the actual code for what was
+% called |\a| above is made inactive.
 %    \begin{macrocode}
 \global\FCsc at l=0
 \let\prr at sult=\relax
@@ -647,12 +960,13 @@
   \or \or \or \or \or \or \or \@classfx \fi
  \@lastchclass\@chclass}%
 %    \end{macrocode}
-% And the macro is finished by applying the |\aut at check| and appending the |\\| to the sumline.
-% Note that the |\aut at 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 
+% And the macro is finished by applying the |\aut at check| and appending the 
+% |\\| to the sumline.  Note that the |\aut at 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\aut at check\noexpand\\}}
+\xdef\s at ml@ne{\s at ml@ne\noexpand\aut at check\noexpand\\}}
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\@addtosumline}
@@ -659,30 +973,33 @@
 % Macro |\@addtosumline|, as its name already suggests, adds something to the 
 % sumline, like its counterpart |\@addtopreamble| did to the preamble.
 %    \begin{macrocode}
-\def\@addtosumline#1{\xdef\sumline{\sumline #1}}
+\def\@addtosumline#1{\xdef\s at ml@ne{\s at ml@ne #1}}
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\@classfx}
-% 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|.
+% 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 at firstamp \@firstampfalse \else \@addtosumline &\fi} 
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\@classfz}
-% 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~f10.
+% 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~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~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 at 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 at fi|: the user may have specified other \LaTeX-code using~|<|.
+% 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 at 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 at fi|: the user may have specified other 
+% \LaTeX-code using~|<|.
 %    \begin{macrocode}
 \def\@classfii{\ifnum\@lastchclass=8 
  \edef\t at stm{\expandafter\string\@nextchar}
@@ -694,133 +1011,122 @@
   \@addtosumline{\prr at 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.  Note that |\FCsc at l| was set to~0 in the beginning
-% of |\@mksumline|, so it is well-defined when |\@classfii| is used.
+% \meta{dimen}s are created, if necessary.  Note that |\FCsc at l| was set to~0 in the 
+% beginning of |\@mksumline|, so it is well-defined when |\@classfii| is used.
 %    \begin{macrocode}
   \global\advance\FCsc at l by \@ne 
   \ifnum\FCsc at l>\FCtc at l
 %    \end{macrocode}
-% 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.
+% 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 cannot be checked---it is not created by 
+% |fcolumn| and an error is given.  In case it is a \meta{count} you're just
+% lucky, and you could ignore that error, 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 at l\endcsname\relax
     \expandafter\newcount\csname FCtot@\romannumeral\FCsc at l\endcsname
    \else
-    \message{^^JWarning: FCtot@\romannumeral\FCsc at l \space is already 
-    defined and it may not even be a <count>. I'll proceed,
-    but with fingers crossed. }
+    \PackageError{fcolumn}{Name clash for <count>}{\expandafter\csname
+    FCtot@\romannumeral\FCsc at l\endcsname is already defined and it may
+    not even be a <count>. If you're\MessageBreak sure it is a <count>,
+    you can press <enter> now and I'll proceed, but things\MessageBreak
+    will get overwritten.}%
    \fi
 %    \end{macrocode}
-% 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|.
+% 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 at l\endcsname\relax
     \expandafter\newdimen\csname FCwd@\romannumeral\FCsc at l\endcsname
 %    \end{macrocode}
-% If the creation was successful, the \meta{count} |\FCtc at l| should be increased.
+% If the creation was successful, the \meta{count} |\FCtc at l| should be 
+% increased.
 %    \begin{macrocode}
     \global\FCtc at l=\FCsc at l
    \else
-    \message{^^JWarning: FCwd@\romannumeral\FCsc at l \space is already 
-    defined and it may not even be a <dimen>. I'll proceed,
-    but with fingers crossed. }
+    \PackageError{fcolumn}{Name clash for <dimen>}{\expandafter\csname
+    FCwd@\romannumeral\FCsc at l\endcsname is already defined and it may 
+    not even be a <dimen>.  If you're\MessageBreak sure it is a <dimen>,
+    you can press <enter> now and I'll proceed, but things\MessageBreak
+    will get overwritten.}%
    \fi
   \fi
  \fi
 \fi}
 %    \end{macrocode}
-% Once created it is not necessary to initialise them 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}
-% This macro is used to overrule the default behaviour of the pair |\b at fi| and |\e at fi|.  It
-% starts with ending the assignment to |\bedr at g| in the same way that |\e at fi| would normally
-% do.  Then the effect of |\e at 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 at 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{macro}{\sumline}
+% The command for the sumline has one optional argument: the separation
+% between the rule and the total. By default this is 2\thinspace pt, but
+% the user may specify |\sumline[10pt]| if that separation needs to be
+% 10\thinspace pt.  The assignment needs to be global, because it is done
+% in the first column of the tabular, but is valid for the whole line.
 %    \begin{macrocode}
-\def\leeg#1{ 234\relax\egroup \let\e at fi=\relax \setbox0=\hbox{#1}%
-\ifdim\wd0>\csname FCwd@\romannumeral\FCsc at l\endcsname
- \global\csname FCwd@\romannumeral\FCsc at l\endcsname=\wd0
-\fi\unhbox0}
+\newdimen\s at mlinesep
+\def\sumline{\@ifnextchar[\s at mline{\s at mline[2pt]}}
+\def\s at mline[#1]{\global\s at mlinesep=#1 \s at ml@ne}
 %    \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 at sult}
-% The macro |\prr at sult| actually puts the information together.  It starts like |\leeg|.
+% The macro |\prr at sult| actually puts the information together.  It starts
+% like |\leeg|.
 %    \begin{macrocode}
-\def\prr at sult{ 345\relax\egroup \let\e at fi=\relax
+\def\prr at sult{$\egroup \let\e at 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 $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.
+% 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$ (using specifier~|3,2|) is typeset. The width of the rule 
+% should be equal to the width of |\hbox{$12{,}00$}| then.  On the other
+% hand the width of the rule when summing $24$ and $-24$ 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 at cro{\number\csname
-FCtot@\romannumeral\FCsc at l\endcsname}{\sp at l}$}%
+\setbox0=\hbox{$\geldm at cro{\sp at l}{\number\csname
+FCtot@\romannumeral\FCsc at l\endcsname}$}%
 \ifdim\wd0>\csname FCwd@\romannumeral\FCsc at l\endcsname
  \global\csname FCwd@\romannumeral\FCsc at l\endcsname=\wd0
 \fi
 \vbox{\hrule width \csname FCwd@\romannumeral\FCsc at l\endcsname
-\vskip2pt
+\vskip\s at mlinesep
 \hbox to \csname FCwd@\romannumeral\FCsc at l\endcsname{\hfil\unhbox0}}}
 %    \end{macrocode}
 % \end{macro}
-% \begin{macro}{\aut at 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 at l| since this
-% |\aut at check| is only performed in the last column of the tabular: the value of |\FCsc at l| now 
-% equals the number of columns used in the current tabular (and may differ from |\FCtc at l|).
+% \subsection{Other checks}
+% \begin{macro}{\leeg}
+% This macro is used to overrule the default behaviour of the pair |\b at fi| 
+% and |\e at fi|.  It starts with ending the groups in the 
+% same way that |\e at fi| would normally do.  Then the effect of |\e at 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 at fi| would
+% do with a typeset number.
 %
-% 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 at check{\ifodd\FCsc at l\else \count0=\@ne \count1=\FCsc at 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 at l\else
-   \advance\count0 by\@ne \advance\count1 by\@ne
- \repeat
-\fi }
-%    \end{macrocode}
-% \end{macro}
-% \begin{macro}{\checkfcolumns}
-% But the assumptions for |\aut at 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. 
+% 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. By defining |\leeg| in this way, instead of |\multicolumn1r{}|
+% (which contains |\omit|), the default spacing in the column is retained.
+% It has its normal effect on the column width, but doesn't alter the 
+% width of the sumrule.
 %    \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}}
+\def\leeg#1{$\egroup \let\e at fi=\relax #1}
 %    \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}{\res at tsumline}
 % Since all changes to the totals and widths of the columns are global,
@@ -834,8 +1140,7 @@
 \def\res at tsumline{\FCsc at l=\FCtc at l\loop\ifnum\FCsc at l>0
  \global\csname FCtot@\romannumeral\FCsc at l\endcsname=0
  \global\csname FCwd@\romannumeral\FCsc at l\endcsname=\z@
- \advance\FCsc at l by \m at ne
-\repeat}
+ \advance\FCsc at l by \m at ne\repeat}
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\resetsumline}
@@ -844,19 +1149,93 @@
 \def\resetsumline{\noalign{\res at tsumline}}
 %    \end{macrocode}   
 % \end{macro}
+% \begin{macro}{\aut at 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 at l| 
+% since this |\aut at check| is only performed in the last column of the 
+% tabular: the value of |\FCsc at l| now equals the number of columns used 
+% in the current tabular (and may differ from |\FCtc at 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.
+%
+% If the list |\FC at chklist| is empty, the list for the automatic check is
+% generated (which will remain empty if |\FCsc at l| is odd).
+%    \begin{macrocode}
+\def\aut at check{\ifx\@empty\FC at chklist\relax
+ \ifodd\FCsc at l\else 
+  \count0=\@ne \count1=\FCsc at l 
+  \divide\count1 by \tw@
+  \loop\ifnum\count1<\FCsc at l
+    \advance\count1 by \@ne
+    \xdef\FC at chklist{\FC at chklist\number\count0,\number\count1;}%
+    \advance\count0 by\@ne
+  \repeat
+  \fi
+\fi
+%    \end{macrocode}
+% Then this list is peeled off and processed.
+%    \begin{macrocode}
+\loop 
+  \ifx\FC at chklist\@empty\let\FCs at gn=\@ne\else\let\FCs at gn=\m at ne\fi
+  \ifx\FCs at gn\m at ne
+    \expandafter\fre at t\FC at chklist\end
+    \ifnum\csname FCtot@\romannumeral\count0\endcsname=
+      \csname FCtot@\romannumeral\count1\endcsname\else
+      \PackageWarningNoLine{fcolumn}{F-columns \number\count0 \space
+      and \number\count1 \space do not balance}%
+    \fi
+\repeat}
+%    \end{macrocode}
+% When |\aut at check| is finished, |\FC at chklist| is empty again, i.e., well
+% prepared for the next time it is used.  This also means that the default
+% behaviour kicks in again: if that's not what you want, you should
+% specify the appropriate |\checkfcolumns| lines again.
+% \end{macro}
+% \begin{macro}{\fre at t}
+% This function eats the first two numbers off |\FC at chklist|.
+%    \begin{macrocode}
+\def\fre at t#1,#2;#3\end{\count0=#1 \count1=#2 \xdef\FC at chklist{#3}}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\checkfcolumns}
+% But the assumptions for |\aut at 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 |F|-column numbers to compare.  It is the responsibility of 
+% the user to provide the correct numbers here, otherwise bogus output 
+% is generated.  If this manual check is inserted, the automatic check
+% will not be performed.
+%    \begin{macrocode}
+\def\checkfcolumns#1#2{\noalign{\xdef\FC at chklist{\FC at chklist #1,#2;}}}
+%    \end{macrocode}
+% \end{macro}
 % That's it!
-%\section*{Acknowledgement}
+% \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. 
+% the installation procedure of this version.  Frank Mittelbach gave 
+% various useful suggestions for improving the input parsing as well as
+% hints to make the package more \LaTeX-like. 
+% \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
+% \bibitem{booktabs} Simon Fear.  Publication quality tables in \LaTeX.
+% \bibitem{dcolumn} David Carlisle.  The |dcolumn| package.
+% \bibitem{world_economy} According to the IMF \url{www.imf.org}.
+% \bibitem{CandTB} Donald Knuth, Computers \& Typesetting/B, \TeX: the program.
+% \bibitem{CandTA} Donald Knuth, Computers \& Typesetting/A, The \TeX book.
+% \bibitem{TAOCP1} Donald Knuth, The Art of Computers Programming, volume~1.
+% \end{thebibliography}
+% \Finale
 \endinput

Modified: trunk/Master/texmf-dist/source/latex/fcolumn/fcolumn.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/fcolumn/fcolumn.ins	2019-05-02 22:36:31 UTC (rev 50936)
+++ trunk/Master/texmf-dist/source/latex/fcolumn/fcolumn.ins	2019-05-02 22:36:42 UTC (rev 50937)
@@ -17,7 +17,7 @@
 
 This is a generated file.
 
-Copyright (C) 2015 by Edgar Olthof
+Copyright (C) 2015--2019 by Edgar Olthof
 
 This file may be distributed and/or modified under the
 conditions of the LaTeX Project Public License, either
@@ -30,26 +30,28 @@
 LaTeX version 1999/12/01 or later.
 \endpreamble
 \askforoverwritefalse
+\usedir{tex/latex/tools}
 \generate{\file{fcolumn.sty}{\from{fcolumn.dtx}{package}}}
 
 \obeyspaces
-\Msg{******************************************************}
-\Msg{*                                                    *}
-\Msg{* To finish the installation you have to move the    *}
-\Msg{* following file into a directory searched by TeX:   *}
-\Msg{*                                                    *}
-\Msg{*   fcolumn.sty                                      *}
-\Msg{*                                                    *}
-\Msg{* To produce the documentation, run the file         *}
-\Msg{* fcolumn.dtx through LaTeX.  Make sure to update    *}
-\Msg{* the glossary and index by makeindex:               *}
-\Msg{*                                                    *}
-\Msg{*  makeindex -s gglo.ist -o fcolumn.gls fcolumn.glo  *}
-\Msg{*  makeindex -s gglo.ist -o fcolumn.ind fcolumn.idx  *}
-\Msg{*                                                    *}
-\Msg{* and then LaTeX again; presto!                      *}
-\Msg{*                                                    *}
-\Msg{* Happy TeXing!                                      *}
-\Msg{*                                                    *}
-\Msg{******************************************************}
+\Msg{*******************************************************}
+\Msg{*                                                     *}
+\Msg{* To finish the installation you have to move the     *}
+\Msg{* following file                                      *}
+\Msg{*                                                     *}
+\Msg{*   fcolumn.sty                                       *}
+\Msg{*                                                     *}
+\Msg{* into a directory searched by TeX.                   *}
+\Msg{*    To produce the documentation, run the file       *}
+\Msg{* fcolumn.dtx through LaTeX.  Make sure to update     *}
+\Msg{* the glossary and index by makeindex:                *}
+\Msg{*                                                     *}
+\Msg{*   makeindex -s gglo.ist -o fcolumn.gls fcolumn.glo  *}
+\Msg{*   makeindex -s gglo.ist -o fcolumn.ind fcolumn.idx  *}
+\Msg{*                                                     *}
+\Msg{* and then LaTeX again; presto!                       *}
+\Msg{*                                                     *}
+\Msg{* Happy TeXing!                                       *}
+\Msg{*                                                     *}
+\Msg{*******************************************************}
 \endbatchfile

Modified: trunk/Master/texmf-dist/tex/latex/fcolumn/fcolumn.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/fcolumn/fcolumn.sty	2019-05-02 22:36:31 UTC (rev 50936)
+++ trunk/Master/texmf-dist/tex/latex/fcolumn/fcolumn.sty	2019-05-02 22:36:42 UTC (rev 50937)
@@ -8,7 +8,7 @@
 %% 
 %% This is a generated file.
 %% 
-%% Copyright (C) 2015 by Edgar Olthof
+%% Copyright (C) 2015--2019 by Edgar Olthof
 %% 
 %% This file may be distributed and/or modified under the
 %% conditions of the LaTeX Project Public License, either
@@ -19,81 +19,164 @@
 %% 
 %% and version 1.3 or later is part of all distributions of
 %% LaTeX version 1999/12/01 or later.
+\ProvidesPackage{fcolumn}
+          [2019/04/24 v1.2 Automatic Currency Package (EHTO)]
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{fcolumn}
-          [2015/09/20 v1.1.1 Automatic Currency Package (EO)]
-\RequirePackage{array}
+\RequirePackage{array}[v2.4k]
+\newif\ifstrict at ccounting \strict at ccountingfalse
+\DeclareOption{strict}{\strict at ccountingtrue}
+\ProcessOptions
 \newcolumntype{F}[3]{>{\b at fi{#1}{#2}{#3}}r<{\e at fi}}
 \newcolumntype{f}{F{.}{,}{3,2}}
-\newcount\FCsc at l \FCsc at l=0
-\newcount\FCtc at l \FCtc at l=0
+\newcount\FCsc at l \FCsc at l=0 \newcount\FCtc at l \FCtc at l=0
 \newif\ifwiths at p
-\newif\ifstrictaccounting \strictaccountingfalse
 \def\geldm at cro#1#2{\withs at pfalse
-\afterassignment\g at ldm@cro\count@#2\relax{#1}}
-\def\g at ldm@cro#1\relax#2{%
-\ifnum#2<0 \ifstrictaccounting(\else-\fi\count2=-#2 \else\count2=#2 \fi
-\count3=\ifx\relax#1\relax2 \else \@gobble#1\relax\fi
-\count4=\count3
-\loop
- \ifnum\count3>0 \divide\count2 by 10 \advance\count3 by \m at ne
+\afterassignment\g at ldm@cro\count@#1\relax{#2}}
+\def\g at ldm@cro#1\relax#2{\ifnum#2<0 \ifstrict at ccounting (\else -\fi
+  \count2=-#2 \else\count2=#2
+\fi
+\count4=\ifx\relax#1\relax 2 \else \@gobble#1\relax\fi
+\count3=0
+\loop\ifnum\count3<\count4
+  \divide\count2 by 10 \advance\count3 by \@ne
 \repeat
 \g at ldens{\the\count@}%
-\ifnum\count4>0\decim at lmark
- \ifnum#2>0 \count2=-#2\else\count2=#2 \fi
- \count3=\count4
- \loop
-  \ifnum\count3>0 \divide\count2 by 10 \advance\count3 by \m at ne
- \repeat
- \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 at d{\number\count3}{\number\count2}%
+\ifnum\count3>0\decim at lmark
+  \ifnum#2>0 \count2=-#2\else\count2=#2 \fi
+  \loop\ifnum\count3>0
+    \divide\count2 by 10 \advance\count3 by \m at ne
+  \repeat
+  \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 at d{\number\count3}{\number\count2}%
 \fi
-\ifnum#2<0 \ifstrictaccounting\rlap{)}\fi\fi}
+\ifx\FCs at gn\m at ne \ifnum#2<0 \ifstrict at ccounting
+  \rlap{)~!}\else\rlap{~!}\fi\else\ifstrict at ccounting
+  \rlap{\phantom{)}~!}\else\rlap{~!}\fi\fi
+\else \ifnum#2<0 \ifstrict at ccounting\rlap{)}\fi\fi
+\fi}
 \def\g at ldens#1{{\count3=\count2 \count0=#1
-\loop
- \ifnum\count0>0
- \divide\count2 by 10
- \advance\count0 by \m at ne
+\ifnum\count0<1 \count0=3 \fi
+\loop \ifnum\count0>0 \divide\count2 by 10 \advance\count0 by \m at ne
 \repeat
 \ifnum\count2>0 \g at ldens{#1}\fi
 \count0=#1
-\loop
- \ifnum\count0>0
- \multiply\count2 by 10
- \advance\count0 by\m at ne
+\ifnum\count0<1 \count0=3 \fi
+\loop \ifnum\count0>0 \multiply\count2 by 10 \advance\count0 by \m at ne
 \repeat
 \count2=-\count2
 \advance\count2 by \count3 \du at zendprint{#1}}}
-\def\du at zendprint#1{\ifwiths at p\sep at rator\zerop at d{#1}{\number\count2}%
- \else\zerop at d{1}{\number\count2}\fi \global\withs at ptrue}
+\def\du at zendprint#1{\ifwiths at p\ifnum#1>0 \sep at rator\fi
+ \zerop at d{#1}{\number\count2}%
+\else\zerop at d1{\number\count2}\fi\global\withs at ptrue}
 \def\zerop at d#1#2{{\count0=1 \count1=#2
-\loop
- \divide \count1 by 10
- \ifnum\count1>0 \advance\count0 by\@ne
+\loop \divide \count1 by 10 \ifnum\count1>0 \advance\count0 by \@ne
 \repeat
-\loop
- \ifnum\count0<#1\relax 0\advance\count0 by\@ne
-\repeat
-\number#2}}
-\def\zetg at ld#1#2{\global\advance\csname
-FCtot@\romannumeral\FCsc at l\endcsname by #1
+\ifnum#1>0
+ \loop \ifnum\count0<#1\relax 0\advance\count0 by \@ne
+ \repeat
+\else
+ \advance\count0 by -3
+ \loop \ifnum\count0<0 0\advance\count0 by \@ne
+ \repeat
+\fi\number#2}}
+\def\zetg at ld#1#2{\count0=#2\relax \let\FCs at gn=\@ne
+\ifnum\count0<0
+  \ifnum\csname FCtot@\romannumeral\FCsc at l\endcsname<0
+    \let\FCs at gn=\m at ne
+  \fi
+\fi
+\ifnum\count0>0
+  \ifnum\csname FCtot@\romannumeral\FCsc at l\endcsname>0
+    \let\FCs at gn=\m at ne
+  \fi
+\fi
+\global\advance\csname FCtot@\romannumeral\FCsc at l\endcsname by \count0
+\ifx\FCs at gn\m at ne
+  \ifnum\count0>0 \let\FCs at gn\@ne \fi
+  \count0=\csname FCtot@\romannumeral\FCsc at l\endcsname
+  \multiply\count0 by \FCs at gn
+  \ifnum\count0<0
+    \let\FCs at gn=\m at ne
+    \PackageError{fcolumn}{Register overflow}{Overflow occurred
+    in fcolumn \number\FCsc at l. Check your table.}%
+  \else\let\FCs at gn=\@ne
+  \fi
+\fi
 \setbox0=\hbox{$\geldm at cro{#1}{#2}$}%
 \ifdim\wd0>\csname FCwd@\romannumeral\FCsc at l\endcsname
  \global\csname FCwd@\romannumeral\FCsc at l\endcsname=\wd0
 \fi\unhbox0}
-\newcount\bedr at g
-\def\b at fi#1#2#3{\def\sep at rator{{#1}}\def\decim at lmark{{#2}}%
-\def\sp at l{#3}\let\ignorespaces=\@empty \let\unskip=\@empty
-\global\advance\FCsc at l by \@ne
-\setbox0=\hbox\bgroup\global\bedr at g=}
-\def\e at fi{ 123\relax\egroup\ifdim\wd0>\z@
- \zetg at ld{\number\bedr at g}{\sp at l}%
+\newcount\FC at l \newcount\FC at r
+\def\FC at chklist{}
+\def\setucc at de#1#2\relax{\uccode`\~=`#1 }
+\def\b at fi#1#2#3{%
+\def\sep at xt##1##2\end{\def\sep at rator{{##1}}}%
+\sep at xt#1\end\def\decim at lmark{{#2}}%
+\def\sp at l{#3}\global\advance\FCsc at l by \@ne
+\global\FC at l=0 \global\FC at r=1
+\let\FCs at gn=\@ne\relax \setbox0\hbox\bgroup$%
+\uccode`\~=`0\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=0}
+\uccode`\~=`1\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=1}
+\uccode`\~=`2\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=2}
+\uccode`\~=`3\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=3}
+\uccode`\~=`4\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=4}
+\uccode`\~=`5\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=5}
+\uccode`\~=`6\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=6}
+\uccode`\~=`7\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=7}
+\uccode`\~=`8\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=8}
+\uccode`\~=`9\relax \uppercase{\def~}{\restorem at thcodes \global\FC at l=9}
+\def\deactdecm at rk##1##2\relax{\mathcode`##1=0 }%
+\afterassignment\setucc at de\count@#3\relax
+\uppercase{\def~}{\ifnum\mathcode`\0=\mathcode`- \restorem at thcodes\fi
+\afterassignment\deactdecm at rk\count@#3\relax \global\FC at r=1}%
+\def\d at cm##1##2{\count@=\mathcode`##1 }
+\ifnum\uccode`\~=`. \uccode`\~=`,\relax\else \uccode`\~=`.\relax\fi
+\uppercase{\def~}{\ifnum\mathcode`\0=\mathcode`- \restorem at thcodes\fi
+\afterassignment\d at cm\count@#3\relax
+\ifnum\count@=\mathcode`- \expandafter\global\FC at l=\the\FC at l
+\else \expandafter\global\FC at r=\the\FC at r\fi}%
+\uccode`\~=`+\relax
+\uppercase{\def~}{\ifnum\mathcode`\0=\mathcode`-
+\restorem at thcodes\fi\global\FC at l=0}%
+\uccode`\~=`-\relax
+\uppercase{\def~}{\ifnum\mathcode`\0=\mathcode`-
+\restorem at thcodes\fi\global\let\FCs at gn\m at ne \global\FC at l=0}%
+\mathcode`-="8000 \mathcode`+=\mathcode`- \mathcode`.=\mathcode`-
+\def\actdecm at rk##1##2\relax{\ifx##1.\relax \mathcode`,=\mathcode`-
+\else \mathcode`##1=\mathcode`- \fi}%
+\afterassignment\actdecm at rk\count@#3\relax
+\mathcode`\0=\mathcode`- \mathcode`\1=\mathcode`-
+\mathcode`\2=\mathcode`- \mathcode`\3=\mathcode`-
+\mathcode`\4=\mathcode`- \mathcode`\5=\mathcode`-
+\mathcode`\6=\mathcode`- \mathcode`\7=\mathcode`-
+\mathcode`\8=\mathcode`- \mathcode`\9=\mathcode`- }
+\def\e at fi{\ifnum\mathcode`\0=\mathcode`- \global\FC at r=\m at ne\fi$\egroup
+\ifnum\FC at r>0
+ \ifnum\FC at r<10 \multiply\FC at r by 10 \fi
+ \def\i at ts##1##2{\count0=##2}
+ \afterassignment\i at ts\count@\sp at l
+ \loop\ifnum\count0>0 \multiply\FC at l by 10
+  \expandafter\secd at xt\number\FC at r\end \advance\count0 by \m at ne
+ \repeat
+ \ifnum\FC at r>10
+   \def\tw at l##1##2\relax{##2}
+   \PackageWarning{fcolumn}{Excess digit\ifnum\FC at r>100 s\fi\space
+   ``\expandafter\tw at l\number\FC at r\relax'' in decimal part
+   \MessageBreak ignored}
+ \fi
+ \ifx\FCs at gn\m at ne\relax \FC at l=-\FC at l \fi
+ \zetg at ld{\sp at l}{\FC at l}%
 \fi}
+\def\secd at xt#1#2#3\end{\advance\FC at l by #2
+\FC at r=#1#3 \ifnum\FC at r<10 \multiply\FC at r by 10 \fi}
+\def\restorem at thcodes{\mathcode`\0=0 \mathcode`\1=0
+\mathcode`\2=0 \mathcode`\3=0 \mathcode`\4=0 \mathcode`\5=0
+\mathcode`\6=0 \mathcode`\7=0 \mathcode`\8=0 \mathcode`\9=0 }
 \def\@array[#1]#2{%
 \@tempdima \ht \strutbox
 \advance \@tempdima by\extrarowheight
@@ -121,7 +204,7 @@
 \m at th
 \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble}
 \let\@@array=\@array
-\def\@mksumline#1{\gdef\sumline{}\@lastchclass 4 \@firstamptrue
+\def\@mksumline#1{\gdef\s at ml@ne{}\@lastchclass 4 \@firstamptrue
 \global\FCsc at l=0
 \let\prr at sult=\relax
 \@temptokena{#1}
@@ -137,8 +220,8 @@
   \or \or \@classfii \or
   \or \or \or \or \or \or \or \@classfx \fi
  \@lastchclass\@chclass}%
-\xdef\sumline{\sumline\noexpand\aut at check\noexpand\\}}
-\def\@addtosumline#1{\xdef\sumline{\sumline #1}}
+\xdef\s at ml@ne{\s at ml@ne\noexpand\aut at check\noexpand\\}}
+\def\@addtosumline#1{\xdef\s at ml@ne{\s at ml@ne #1}}
 \def\@classfx{\if at firstamp \@firstampfalse \else \@addtosumline &\fi}
 \def\@classfz{\ifnum\@chnum<\thr@@ \@classfx\fi}
 \def\@classfii{\ifnum\@lastchclass=8
@@ -151,56 +234,66 @@
    \expandafter\ifx\csname FCtot@\romannumeral\FCsc at l\endcsname\relax
     \expandafter\newcount\csname FCtot@\romannumeral\FCsc at l\endcsname
    \else
-    \message{^^JWarning: FCtot@\romannumeral\FCsc at l \space is already
-    defined and it may not even be a <count>. I'll proceed,
-    but with fingers crossed. }
+    \PackageError{fcolumn}{Name clash for <count>}{\expandafter\csname
+    FCtot@\romannumeral\FCsc at l\endcsname is already defined and it may
+    not even be a <count>. If you're\MessageBreak sure it is a <count>,
+    you can press <enter> now and I'll proceed, but things\MessageBreak
+    will get overwritten.}%
    \fi
    \expandafter\ifx\csname FCwd@\romannumeral\FCsc at l\endcsname\relax
     \expandafter\newdimen\csname FCwd@\romannumeral\FCsc at l\endcsname
     \global\FCtc at l=\FCsc at l
    \else
-    \message{^^JWarning: FCwd@\romannumeral\FCsc at l \space is already
-    defined and it may not even be a <dimen>. I'll proceed,
-    but with fingers crossed. }
+    \PackageError{fcolumn}{Name clash for <dimen>}{\expandafter\csname
+    FCwd@\romannumeral\FCsc at l\endcsname is already defined and it may
+    not even be a <dimen>.  If you're\MessageBreak sure it is a <dimen>,
+    you can press <enter> now and I'll proceed, but things\MessageBreak
+    will get overwritten.}%
    \fi
   \fi
  \fi
 \fi}
-\def\leeg#1{ 234\relax\egroup \let\e at fi=\relax \setbox0=\hbox{#1}%
+\newdimen\s at mlinesep
+\def\sumline{\@ifnextchar[\s at mline{\s at mline[2pt]}}
+\def\s at mline[#1]{\global\s at mlinesep=#1 \s at ml@ne}
+\def\prr at sult{$\egroup \let\e at fi=\relax
+\setbox0=\hbox{$\geldm at cro{\sp at l}{\number\csname
+FCtot@\romannumeral\FCsc at l\endcsname}$}%
 \ifdim\wd0>\csname FCwd@\romannumeral\FCsc at l\endcsname
  \global\csname FCwd@\romannumeral\FCsc at l\endcsname=\wd0
-\fi\unhbox0}
-\def\prr at sult{ 345\relax\egroup \let\e at fi=\relax
-\setbox0=\hbox{$\geldm at cro{\number\csname
-FCtot@\romannumeral\FCsc at l\endcsname}{\sp at l}$}%
-\ifdim\wd0>\csname FCwd@\romannumeral\FCsc at l\endcsname
- \global\csname FCwd@\romannumeral\FCsc at l\endcsname=\wd0
 \fi
 \vbox{\hrule width \csname FCwd@\romannumeral\FCsc at l\endcsname
-\vskip2pt
+\vskip\s at mlinesep
 \hbox to \csname FCwd@\romannumeral\FCsc at l\endcsname{\hfil\unhbox0}}}
-\def\aut at check{\ifodd\FCsc at l\else \count0=\@ne \count1=\FCsc at 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 at l\else
-   \advance\count0 by\@ne \advance\count1 by\@ne
- \repeat
-\fi }
-\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}}
+\def\leeg#1{$\egroup \let\e at fi=\relax #1}
 \def\res at tsumline{\FCsc at l=\FCtc at l\loop\ifnum\FCsc at l>0
  \global\csname FCtot@\romannumeral\FCsc at l\endcsname=0
  \global\csname FCwd@\romannumeral\FCsc at l\endcsname=\z@
- \advance\FCsc at l by \m at ne
+ \advance\FCsc at l by \m at ne\repeat}
+\def\resetsumline{\noalign{\res at tsumline}}
+\def\aut at check{\ifx\@empty\FC at chklist\relax
+ \ifodd\FCsc at l\else
+  \count0=\@ne \count1=\FCsc at l
+  \divide\count1 by \tw@
+  \loop\ifnum\count1<\FCsc at l
+    \advance\count1 by \@ne
+    \xdef\FC at chklist{\FC at chklist\number\count0,\number\count1;}%
+    \advance\count0 by\@ne
+  \repeat
+  \fi
+\fi
+\loop
+  \ifx\FC at chklist\@empty\let\FCs at gn=\@ne\else\let\FCs at gn=\m at ne\fi
+  \ifx\FCs at gn\m at ne
+    \expandafter\fre at t\FC at chklist\end
+    \ifnum\csname FCtot@\romannumeral\count0\endcsname=
+      \csname FCtot@\romannumeral\count1\endcsname\else
+      \PackageWarningNoLine{fcolumn}{F-columns \number\count0 \space
+      and \number\count1 \space do not balance}%
+    \fi
 \repeat}
-\def\resetsumline{\noalign{\res at tsumline}}
+\def\fre at t#1,#2;#3\end{\count0=#1 \count1=#2 \xdef\FC at chklist{#3}}
+\def\checkfcolumns#1#2{\noalign{\xdef\FC at chklist{\FC at chklist #1,#2;}}}
 \endinput
 %%
 %% End of file `fcolumn.sty'.



More information about the tex-live-commits mailing list