% \iffalse meta-comment
% Copyright (C) 2015--2026 by Edgar Olthof
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3 of this license or (at your option) any later
% version.  The latest version of this license is in
%
%    http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of
% LaTeX version 1999/12/01 or later.
%
% \fi
% \iffalse
%<package>\ProvidesPackage{fcolumn}
%<package>          [2026/05/20 v1.4.5 Automatic Currency Package (EHTO)]
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\RequirePackage{array}[v2.6d]
%<*driver>
%\DocumentMetadata{lang=en,tagging=on} % Uncommenting this line is OK, except for
%   the verbatim tables (they contain the percentage sign) and for the captions in
%   normal tabulars (in longtable everything is fine).
\documentclass{ltxdoc}
\usepackage{dcolumn}
\usepackage{booktabs}
\usepackage[tableposition=top,aboveskip=0pt]{caption}
% The next lines are a fix to the caption package, as that package is incompatible with tagging.
%\RemoveFromHook{begindocument}[latex-lab-testphase-float]
%\makeatletter \ExplSyntaxOn
%\socket_new_plug:nnn{tagsupport/parbox/before}{caption}
%  {\tagpdfparaOn %restart para tagging
%   \tl_if_empty:NTF\@current@float@struct{\tag_struct_begin:n{tag=Caption,firstkid}}
%    {\tag_struct_begin:n{tag=Caption,parent=\@current@float@struct,firstkid}}}
%\socket_new_plug:nnn{tagsupport/parbox/after}{caption}{\tag_struct_end:}
%\l@addto@macro\caption@beginex@hook{%
% \tagpdfparaOff %leavevmode in parbox should not start paragraph structure
%  \AssignSocketPlug{tagsupport/parbox/before}{caption}
%  \AssignSocketPlug{tagsupport/parbox/after}{caption}}
%\ExplSyntaxOff \makeatother % End fix
\DeclareCaptionStyle{normal}{labelfont={rm,bf,small},textfont={rm,small},
   indention=0pt,labelsep=colon,justification=raggedright}
\captionsetup[table]{style=normal}
\captionsetup{singlelinecheck=false}
\usepackage{url}
\usepackage{eurosym}
\usepackage{color}
\usepackage[hang,symbol*,perpage]{footmisc}
\setlength\footnotemargin{10pt}
\usepackage{fcolumn}
\usepackage{longtable}
\EnableCrossrefs
\CodelineIndex
% The next definition of \LT@output is to fix a flaw in longtable.sty.
% It can be removed once the fix is implemented; expected completion 
% date around end Q1, 2026, according to David Carlisle.
\ExplSyntaxOn \makeatletter \def\LT@output{%
  \ifnum\outputpenalty <-\@Mi
    \ifnum\outputpenalty > -\LT@end@pen
      \LT@err{floats~ and~ marginpars~ not~ allowed~ in~ a~ longtable}\@ehc
    \else
      \setbox\z@\vbox{\unvbox\@cclv}%
      \ifdim \ht\LT@lastfoot>\ht\LT@foot
        \dimen@\pagegoal
        \advance\dimen@\ht\LT@foot
        \advance\dimen@-\ht\LT@lastfoot
        \ifdim\dimen@<\ht\z@
          \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot
          % \vss % old line
            \vskip 0pt plus \maxdimen minus \normalbaselineskip 
          }\@makecol
          \@expl@@@mark@update@singlecol@structures@@
          \@outputpage
          \global\vsize\@colroom
          \setbox\z@\vbox{\box\LT@head}%
        \fi
      \fi
      \unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi
      \UseTaggingSocket{tbl/longtable/foot}
    \fi
  \else
    \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot
    % \vss % old line
      \vskip 0pt plus \maxdimen minus \normalbaselineskip 
    }\UseTaggingSocket{tbl/longtable/foot}\@makecol
    \@expl@@@mark@update@singlecol@structures@@
    \@outputpage
    \global\vsize\@colroom
    \copy\LT@head\nobreak
  \fi}
\makeatother \ExplSyntaxOff
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</driver>
%\fi
%\RecordChanges
%\CheckSum{1278}
%\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
%  Digits        \0\1\2\3\4\5\6\7\8\9
%  Exclamation   \!     Double quote  \"     Hash (number) \#
%  Dollar        \$     Percent       \%     Ampersand     \&
%  Acute accent  \'     Left paren    \(     Right paren   \)
%  Asterisk      \*     Plus          \+     Comma         \,
%  Minus         \-     Point         \.     Solidus       \/
%  Colon         \:     Semicolon     \;     Less than     \<
%  Equals        \=     Greater than  \>     Question mark \?
%  Commercial at \@     Left bracket  \[     Backslash     \\
%  Right bracket \]     Circumflex    \^     Underscore    \_
%  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{v1.1}{2015/09/14}{Automatic checking of column balance performed when number of
% F-columns is even (behaviour can be overridden).  Empty entries are now recognised and 
% correctly treated as such, except for the one ended by the double backslash. Not serious;
% workaround possible. Furthermore optimisation of code: minimised the number of private 
% counts and resetting of column counter done in a nicer way.}
%\changes{v1.1.1}{2015/09/27}{Installation procedure changed from .ins-in-.dtx to separate
% .ins and .dtx after discussion with Karl Berry, as well as some minor code improvements.}
%\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 friendliness 
% of this package.  This version is only backwards compatible when zero decimal digits were
% and are specified as modifier.}
%\changes{v1.3}{2021/01/03}{Christian Hoff requested the possibility to provide extra formatting
% information to a column, e.g., colouring.  That was implemented by having an extra parameter
% to the generic F-column.  The current solution is not very robust, as font and/or size change
% in math environment are very tricky, but providing colour information works, see the example
% in the main text.  This version is now compatible with package longtable and backwards
% compatible to fcolumn v1.2: it only adds functionality.}
%\changes{v1.4}{2021/11/21}{More robust version on the extra formatting information: alternative
% formatting after the comma (if any), instead of additional information.  Corrected a few typos.}
%\changes{v1.4.1}{2022/02/01}{Definition needed for longtable only if that package is loaded.
% General update, streamlining code.  Excess digits silently ignored when all zero.}
%\changes{v1.4.2}{2023/07/25}{Better documentation.  Removed redundant endgroup/begingroup 
% pairs and other small improvements.  Unbalanced columns are reported by stating their
% difference.  Implementation of option ``red''.  No changes in user experience.}
%\changes{v1.4.3}{2026/01/10}{Attempt to make fcolumn tagging-aware.  Included my name and 
% e-mail in README (CTAN obligation).  Changed makefile to produce a fcolumn.tgz that contains
% files in fcolumn/.  Removed some typos.}
%\changes{v1.4.4}{2026/01/16}{Repair of v1.4.3, which was a complete disaster in terms of tagging,
% resulting in a broken package.  Hooks will be used to introduce code in array.sty and longtable.sty
% instead of overwriting definitions once those Hooks are implemented there.  Until that time
% fcolumn falls back to the original solution of redefining three macros in those packages. 
% Changed makefile to produce fcolumn.zip instead of fcolumn.tgz.  Changed README file: it 
% had extension .md in v1.4.3 but was (and is) raw ASCII.}
%\changes{v1.4.5}{2026/05/20}{Intermediate version ensuring a smooth transition when going 
% to the 2026-06-01 LaTeX kernel.}
%\GetFileInfo{fcolumn.sty}
%\DoNotIndex{\@@,\@@endpbox,\@@startpbox,\@@@@endpbox,\@@@@startpbox,\@acol,\@arstrut,\@arstrutbox}
%\DoNotIndex{\@classiv,\@classz,\@currentHref,\@depth,\cs,\@endpbox,\@firstampfalse,\@firstamptrue}
%\DoNotIndex{\@gobble,\@halignto,\@height,\@mkpream,\@ne,\@nextchar,\@preamble,\@sharp,\@startpbox}
%\DoNotIndex{\@tabacol,\@tabarray,\@tabclassiv,\@tabclassz,\@tempdima,\@tempswafalse,\@tempswatrue}
%\DoNotIndex{\@temptokena,\@tfor,\@whilesw,\@width,\advance,\arraystretch,\baselineskip,\bgroup}
%\DoNotIndex{\break,\count,\count@,\cr,\def,\divide,\do,\dp,\edef,\else,\egroup,\fi,\fill,\g,\global}
%\DoNotIndex{\hfil,\hline,\ht,\hsize,\if,\if@firstamp,\if@tempswa,\ifcase,\ifdim,\ifnum,\ifodd,\ifx}
%\DoNotIndex{\int,\kill,\lineskip,\LT@@hl,\LT@@@@hl,\LT@@tabarray,\LT@@@@tabarray,\LT@bchunk}
%\DoNotIndex{\LT@caption,\LTcaptype,\LTchunksize,\LT@endpbox,\LT@hline,\LT@kill,\LT@LL@FM@cr}
%\DoNotIndex{\LT@make@row,\LT@mcol,\LT@no@pgbk,\LT@nofcols,\LT@rows,\LT@setprevdepth,\LT@startpbox}
%\DoNotIndex{\LT@tabularcr,\LTleft,\LTright,\let,\loop,\mathsurround,\m@ne,\message,\multiply}
%\DoNotIndex{\newpage,\nopagebreak,\or,\pagebreak,\par,\prepnext@tok,\protect,\refstepcounter}
%\DoNotIndex{\relax,\repeat,\rlap,\setbox,\space,\stepcounter,\string,\strutbox,\tabcolsep}
%\DoNotIndex{\tabskip,\tabularnewline,\the,\theHLT@tables,\the@toks,\thr@@,\tbl,\tl,\tw@,\unhbox}
%\DoNotIndex{\vbox,\vcenter,\vrule,\vskip,\vtop,\wd,\xdef,\z@,\z@skip}
%\title{The \textsf{fcolumn} package\thanks{This file has version number~\fileversion,
%last revised~\filedate.}}
%\author{Edgar Olthof\\
%\texttt{edgar <dot> olthof <at> inter <dot> nl <dot> net}}
%\date{Printed \today}
%\maketitle
%\begin{abstract}
%\noindent 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
%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 four arguments: 1)~grouping 
%character of the integer part on output, 2)~decimal mark used on output,
%3)~compact additional information on input/output characteristics, and
%4)~anything, but primarily used for providing formatting information, 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 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 mark, and that the decimal part consists of
%two digits.  However, if in your country or company grouping is done 
%with a thinspace every four digits, that the decimal mark 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 123456p78 then, yielding $12{\,}3456{\cdot}780$ 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| for some~|x|. If you want no 
%grouping character, specify~|0,x|.
%
%As the fourth parameter you can insert anything just before the typesetting 
%of an amount in a column takes place.  Its purpose is to add additional 
%formatting information, e.g., |\color{blue}| to have the contents of a column
%coloured blue, but it can be misused, so use with care.  And it can't do all!
%                                                          
%\floatsep=5pt plus 2pt minus 3pt
%\textfloatsep=5pt plus 2pt minus 3pt
%\renewcommand{\bottomfraction}{0.9}
%\renewcommand{\textfraction}{0.1}
%\begin{table}[htb]
%\caption{Example Table.} \label{tab:fcraw}
%\begin{tabular}{@{}lflf@{}}
%\multicolumn4{@{}c@{}}{\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}
%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:fcraw}
%and how this is entered in \LaTeX\ (Table~\ref{tab:fcrawverb}).
%\begin{table}[htb]
%\caption{Verbatim version of Example Table~\ref{tab:fcraw}.}
%\label{tab:fcrawverb} \topsep0pt
%\begin{verbatim}
%\begin{table}[htb]
%\caption{Example Table.} \label{tab:fcraw}
%\begin{tabular}{@{}lflf@{}}
%\multicolumn4{@{}c@{}}{\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
%|\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.  From version~1.3 onwards it incorporates the idea
%of Christian Hoff of providing additional (formatting) information per column.
%A rather contrived example is given in Table~\ref{tab:fcformat}, combining colour and fonts.
%\newcolumntype{q}[1]{F.,{3,2}{#1}}
%\begin{table}[htb]
%\caption{Example Table with column formatting.} \label{tab:fcformat}
%\begin{tabular}{@{}lq{\color{blue}\mathsf,\mathbf}lq{\color{magenta}}@{}}
%\multicolumn4{@{}c@{}}{\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}
%How this is entered in \LaTeX\ is shown in Table~\ref{tab:fcformatverb}. The font changing commands
%like |\mathsf| and |\mathbf| act on an argument, hence require braces,
%but these are already provided internally for this purpose.  For that reason this
%type of commands must be given last, without braces (and if you don't specify a font 
%changing command, these extra internal braces are just redundant).  The fourth argument to the
%\begin{table}[htb]
%\caption{Almost verbatim version of Example Table~\ref{tab:fcformat}.}
%\label{tab:fcformatverb} \topsep0pt
%\begin{verbatim}
%\newcolumntype{q}[1]{F.,{3,2}{#1}}
%\begin{table}[htb]
%\caption{Example Table with column formatting.} \label{tab:fcformat}
%\begin{tabular}{@{}lq{\color{blue}\mathsf,\mathbf}lq{\color{magenta}}@{}}
%\multicolumn4{@{}c@{}}{\bfseries Balance sheet}\\
%...
%... (Same financial contents as in Table 1.)
%...
%\end{tabular}
%\end{table}
%\end{verbatim}
%\end{table}
%new columntype may consist of two parts, separated by a comma.  In that case, the part to
%the left of the comma is applied to the data entered by the user and the right part, if
%non-empty, is the replacement formatting for the result.  The example in Table~\ref{tab:fcformat}
%shows this: the bold font is only used in the |\sumline| and there is no colour specification,
%so that's back to the default (black).  If you want formatting for the whole column, like magenta
%in the case of the last column of Table~\ref{tab:fcformat}, leave out the comma.
%Font size changes, e.g., ``|\huge|'' in ``|\huge\mathbf|''
%as parameter to column type |q| are ignored by \LaTeX, since the formatting 
%information is used in math environment, which has its own way of handling this.
%This isn't bad, as size changes in one column, without overall changes to the 
%table look terrible.  If you want something huge, make a |\huge| table.
%
%As will be  demonstrated by Table~\ref{tab:fclong} in the next page break, the package
%|fcolumn| now also works with |longtable|~\cite{longtable}, irrespective of the order 
%in which these packages are loaded. The raw formatting of the multipage table
%is shown in Table~\ref{tab:fclongverb}.  While constructing this example with tagging,
%see section~\ref{tagging}, it turned out that |booktabs| caused problems that were
%solved by including option |firstaid|. For more information on how to handle |\endhead|
%and its ilk, see the documentation of |longtable|~\cite{longtable}. Not shown here are 
%the new |fcolumn| formatting possibilities (like new fonts and/or colours), but it has
%been checked they do work in combination with |longtable|.  The packages 
%|supertabular|~\cite{supertabular} and |fcolumn| also work happily together, so you can 
%choose which package you want if you need this.  There is no race condition with 
%|supertabular| either.
%\begin{longtable}[l]{@{}lflf@{}}
%\caption{Table showing compatibility of fcolumn and 
%  longtable.\label{tab:fclong}}\\
%\multicolumn4{@{}c@{}}{\bfseries Balance sheet}\\
%\toprule
%properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
%\midrule
%\endfirsthead
%\caption[]{\textit{(continued from previous page)\/}}\\
%\toprule
%properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
%\midrule
%\endhead
%\bottomrule
%\multicolumn4{@{}r@{}}{\small\textit{(Table continues on 
%  next page)\/}}\\
%\endfoot
%\bottomrule
%\endlastfoot
%house        & 200000    & equity capital &  50000    \\
%bank account &   -603,23 & mortgage       & 150000    \\
%savings 1    &   5600                                 \\
%savings 2    &   5600                                 \\
%savings 3    &   5600                                 \\
%savings 4    &   5600                                 \\
%savings 5    &   5600                                 \\
%cash         &    145,85 & profit         &  27542,62 \\
%\sumline
%\end{longtable}
%
%\begin{table}[htb]
%\caption{Almost verbatim version of Example Table~\ref{tab:fclong}.}
%\label{tab:fclongverb} \topsep0pt
%\begin{verbatim}
%\begin{longtable}[l]{@{}lflf@{}}
%\caption{Table showing compatibility of fcolumn and 
%  longtable.\label{tab:fclong}}\\
%\multicolumn4{@{}c@{}}{\bfseries Balance sheet}\\
%\toprule
%properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
%\midrule
%\endfirsthead
%\caption[]{\textit{(continued from previous page)\/}}\\
%\toprule
%properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
%\midrule
%\endhead
%\bottomrule
%\multicolumn4{@{}r@{}}{\small\textit{(Table continues on
%  next page)\/}}\\
%\endfoot
%\bottomrule
%\endlastfoot
%house        & 200000    & equity capital &  50000    \\
%...
%... (Somewhat altered financial contents compared to
%...  Table 1 to demonstrate the page break.)
%...
%\sumline
%\end{longtable}
%\end{verbatim}
%\end{table}
%Unlike in the package |dcolumn|~\cite{dcolumn}, the alignment on the decimal mark in 
%|fcolumn| is achieved by right aligning numbers that all have the same number of
%digits to the right of this mark, in combination with the fact that all decimal glyphs
%have the same width\footnote{The so-called tabular numerals. If the font you use has
%proportional numerals, the alignment won't work in general.}. This width is font specific,
%so changing fonts within a column may ruin the alignment, see, e.g., the first |F|-column
%in Table~\ref{tab:fcformat}.
%\section{Commands}
%The user only needs to know five commands and two options; these 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 four arguments of |F| are |.|, 
%|,|, |{3,2}|, and |{}|.  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 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 continental Europe and the Anglo-Saxon part of the world are
%served.  This is hard coded, but using input grouping characters is optional anyway.
%\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:
%\iffalse This used to be done with compactenum from paralist but that package 
%is not compatible with tagging \fi
%
%\begingroup \hangindent=12pt \hangafter=1
%\noindent 1)~It calculates and shows the total of the column so far and the maximum
%  width encountered so far, including the width of the total;
%
%\hangindent=12pt \hangafter=1
%\noindent 2)~It generates a rule with width calculated in the first item;
%
%\hangindent=12pt \hangafter=1
%\noindent 3)~It checks the columns that are supposed to balance whether or not
%  they actually do.  If so, nothing happens.  Otherwise a |\PackageWarning| is
%  given that column~$i$ and~$j$ do not balance, where $i$ and $j$ are the relevant 
%  columns.  This is only done automatically 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.
%
%\endgroup
%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.  And you may even give two options, like in 
%|\sumline[10pt][5pt]|, in which the second option is the extra space below
%the summary row.  In fact that second option is parsed to |\\|, that is
%implicit in |\sumline|.
%\end{macro}
%\begin{macro}{\resetsumline}
%Suppose you want to typeset one tabular with the profit-and-loss of many
%projects individually.  In case the layout of those tabulars is similar 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 |\resetsumline|
%is used for that: it resets all totals and all column widths, see for example
%Table~\ref{tab:fcmult}.
%\begin{table}[htb]
%\caption{Example: multiple projects.} \label{tab:fcmult}
%\begin{tabular}{@{}lfflff@{}}
%\multicolumn6{@{}c@{}}{\bfseries Project~1}\\
%\toprule
%expense & \leeg{actual} & \leeg{budget} & 
%income  & \leeg{actual} & \leeg{budget} \\
%\midrule
%food   &  450,20 & 500    & tickets & 1200    & 1000    \\
%drinks &  547,5  & 400                                  \\
%music  &  180    & 100                                  \\
%profit &   22,3                                         \\
%\sumline[2pt][10pt]
%\resetsumline
%\multicolumn6{@{}c@{}}{\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}
%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 (similar story for 
%|F|-columns two and four).  The verbatim way of setting up Table~\ref{tab:fcmult}
%is given in Table~\ref{tab:fcmultverb}.
%\begin{table}[htb]
%\caption{Verbatim version of Table~\ref{tab:fcmult}.}
%\label{tab:fcmultverb} \topsep0pt
%\begin{verbatim}
%\begin{table}[htb]
%\caption{Example: multiple projects.} \label{tab:fcmult}
%\begin{tabular}{@{}lfflff@{}}
%\multicolumn6{@{}c@{}}{\bfseries Project~1}\\
%\toprule
%expense & \leeg{actual} & \leeg{budget} & 
%income  & \leeg{actual} & \leeg{budget} \\
%\midrule
%food   &  450,20 & 500    & tickets & 1200    & 1000    \\
%drinks &  547,5  & 400                                  \\
%music  &  180    & 100                                  \\
%profit &   22,3                                         \\
%\sumline[2pt][10pt]
%\resetsumline
%\multicolumn6{@{}c@{}}{\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 is
%not 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 or in column headers.
%\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}|.  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 does the trick, at the expense of
%some trivial calculations.
%\end{macro}
%\begin{macro}{\ifstrict@ccounting}
%\begin{macro}{\ifminusr@d}
%In the rare occasion that a negative number occurs in a financial table,
%the sign of that number can be an explicit minus sign, i.e.,~`$-$' 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 prescribes that the
%number should be put between parentheses.  The latter can be accomplished
%by setting |\strict@ccountingtrue|, but since this contains a non-letter,
%it is more \LaTeX-like to invoke |fcolumn| with the option |strict|, i.e.,
%|\usepackage[strict]{fcolumn}|, which sets this flag.  If you want the
%negative numbers to be coloured red, use the option |red|, i.e.,
%|\usepackage[red]{fcolumn}|, but note that |strict| and |red| 
%are mutually exclusive: if both are used, |red| is reset because
%|strict| is strict.
%\end{macro}
%\end{macro}
%\section{Tagging}\label{tagging}
%Additional code for making tagged PDF~\cite{tagging} is available by 
%generating the style file with option ``tagging''.  If you don't want 
%this or if your \TeX-distribution doesn't support tagging (yet), it
%is possible to exclude these lines.  This is still highly experimental,
%and to properly process the document you are reading now you can't
%use tagging by having |\DocumentMetadata| as first line, because |ltxdoc|
%doesn't work well with tagging (a next version will be done with |l3doc|;
%it has been checked that that works fine).  For ``normal'' documents,
%e.g., using |\documentclass{article}| you can start with
%|\DocumentMetadata{tagging=on}| as first line, see the example file
%fcexample.tex, that is also included in the distribution.
%In this version the math-tagging is switched off again in
%the |F|-columns of a |tabular| environment, since the math there is fake math.
%\StopEventually{\PrintChanges\PrintIndex}
%\section{The macros}
%Here follows the actual code; most users will stop reading here, but
%some examples that may be interesting are presented below.  Previous 
%versions can be loaded for not-up-to-date systems, but v1.4.3 is lacking
%here, because it had a severe bug.
%    \begin{macrocode}
\DeclareRelease{v1.4.2}{2023-07-25}{fcolumn-2023-07-25.sty}
\DeclareRelease{v1.4.4}{2026-01-26}{fcolumn-2026-01-16.sty}
\DeclareCurrentRelease{v1.4.5}{2026-05-20}
\NeedsTeXFormat{LaTeX2e}[2025/06/01]
%    \end{macrocode}
%\subsection{Options}
%\begin{macro}{option red}
%\begin{macro}{option strict}
%There are two options. If |red| is set, negative numbers are displayed in red.
%If |strict| is set, strict accounting rules are used in display and this overrules
%a possibly set |red|.  Depending on the two booleans associated with these options
%the |color| package~\cite{color} will be loaded or not.
%    \begin{macrocode}
\newif\ifminusr@d \minusr@dfalse
\newif\ifstrict@ccounting \strict@ccountingfalse
\DeclareOption{red}{\minusr@dtrue}
\DeclareOption{strict}{\strict@ccountingtrue}
\ProcessOptions \ifminusr@d \ifstrict@ccounting \minusr@dfalse
\PackageWarningNoLine{fcolumn}{Option `red' is reset due to use 
 of `strict'}\else\usepackage{color}\fi\fi
%    \end{macrocode}
%\end{macro}
%\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 
%(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}[4]{>{\b@fi{#1}{#2}{#3}{#4}}r<{\e@fi}}
\newcolumntype{f}{F.,{3,2}{}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\FCsc@l}
%\begin{macro}{\FCtc@l}
%Two \meta{count}s are defined, that both start at zero: the \meta{count} 
%|\FCsc@l|, that keeps track at which |F|-column the tabular is working on 
%and the \meta{count} |\FCtc@l|, that records the number of |F|-columns 
%that were encountered so far in the document.  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@l \FCsc@l=0 \newcount\FCtc@l \FCtc@l=0
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\geldm@cro}
%The macro |\geldm@cro| takes a number and by default interprets this as
%an amount expressed in cents (dollar cents, euro cents, centen, 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 mark and the dot as grouping character
%(thousand separator if the first part of |#1| is~3).
%As explained, this can be changed.  It uses three private booleans: 
%|\ifwiths@p|, |\ifstrict@ccounting|, and |\ifminusr@d|.  The latter two
%are used to typeset negative numbers in a special way.  By default it
%doesn't do this: a minus sign is used.
%    \begin{macrocode}
\newif\ifwiths@p
%    \end{macrocode}
%Actually |\geldm@cro| is only a wrapper around |\g@ldm@cro|.
%    \begin{macrocode}
\def\geldm@cro#1#2{\withs@pfalse
\afterassignment\g@ldm@cro\count@#1\relax{#2}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\g@ldm@cro}
%After setting the environment for formatting, this macro starts by looking 
%at the sign of |#2|: if it is negative, it prints the correct indicator (a parenthesis,
%a minus sign, or nothing at all in case of |red|), assigns the absolute value 
%of~|#2| to |\count2| and goes on.  Note that |\geldm@cro| and therefore |\g@ldm@cro|
%are always used within |$|s, so it is really a minus sign that is printed, not a hyphen.
%All calculations are done with |\count0|, |\count1|, etc., i.e., without |F|-column-specific
%\meta{count}s because it is all done locally.  Leaving the tabular environment will 
%restore their values.  This is also true for the effect of |\FCform@t|, so that 
%formatting information is local to this column.  The reason for inserting the |{|
%between |\FCform@t| and |\ifnum| (and the accompanying |}| just before finishing 
%this definition) is to facilitate the possible use of |\mathbf| or any other font 
%changing command as the last item in |\FCform@t|.
% 
%When |\FCform@t| includes a colour change, this is overruled for negative numbers
%when option |red| is set.  For that reason it is unwise to use a red colour for the
%whole column in combination with the option |red|: sign information is obscured then.
%    \begin{macrocode}
\def\g@ldm@cro#1\relax#2{\ifstrict@ccounting\def\bm@nus{(}
 \def\em@nus{)}\else\def\em@nus{}\ifminusr@d\def\bm@nus{\color{red}}
 \else\def\bm@nus{-}\fi\fi\FCform@t{\ifnum#2<0 \bm@nus\count2=-#2
 \else\count2=#2 \fi
%    \end{macrocode}
%Calculate the entire currency units: this is the result of $x/a$ as integer
%division, with $a=10^n$ and $n$ the part of |#1| after the separator (if any).
%Here the first character of |#1| is discarded, so the separator in |#1| is not strict:
%you could also specify |3.2| instead of |3,2| (or even |3p2|).
%    \begin{macrocode}
\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}
%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@ldens| using 
%the separation given (and stored in |\count@|).
%    \begin{macrocode}
\g@ldens{\the\count@}%
%    \end{macrocode}
%If there is a decimal part\dots
%    \begin{macrocode}
\ifnum\count3>0 {\decim@lmark}
%    \end{macrocode}
%Next the decimal part is dealt with.  Now $x\bmod a$ is calculated in the 
%usual way: $x-(x/a)*a$ 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
  \loop\ifnum\count3>0
    \divide\count2 by 10 \advance\count3 by \m@ne
  \repeat
%    \end{macrocode}
%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@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 rightmost
%column this means that this parenthesis may even stick out of the table.
%I don't like this, therefore I chose to put |\strict@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}
\ifx\FCs@gn\m@ne\ifnum#2<0 \rlap{\em@nus~!}
 \else\rlap{\phantom{\em@nus}~!}\fi
\else\ifnum#2<0 \rlap{\em@nus}\fi\fi}}
%    \end{macrocode}
% \end{macro}
%\begin{macro}{\g@ldens}
%Here the whole currency units are dealt with.  The macro |\g@ldens| is 
%used recursively, therefore the double braces; this allows to use 
%|\count0| locally.  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 clearly state that you
%use a currency unit of~k\EUR{} (or even M\EUR{} for the very rich).
%
%There is no obvious 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@ldens#1{{\count3=\count2 \count0=#1
%    \end{macrocode}
%First divide by $10^n$, where $n$ is |#1|.
%    \begin{macrocode}
\ifnum\count0<1 \count0=3 \fi
\loop \ifnum\count0>0 \divide\count2 by 10 \advance\count0 by \m@ne
\repeat
%    \end{macrocode}
%Here is the recursive part,
%    \begin{macrocode}
\ifnum\count2>0 \g@ldens{#1}\fi
%    \end{macrocode}
%and then reconstruct the rest of the number.
%    \begin{macrocode}
\count0=#1
\ifnum\count0<1 \count0=3 \fi
\loop \ifnum\count0>0 \multiply\count2 by 10 \advance\count0 by \m@ne
\repeat
\count2=-\count2
\advance\count2 by \count3 \du@zendprint{#1}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\du@zendprint}
%The macro |\du@zendprint| takes care of correctly printing the separator
%and possible trailing zeros. The former, however, is only done if |#1|
%is larger than zero.
%    \begin{macrocode}
\def\du@zendprint#1{\ifwiths@p\ifnum#1>0 {\sep@rator}\fi
 \zerop@d{#1}{\number\count2}%
\else\zerop@d1{\number\count2}\fi\global\withs@ptrue}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\zerop@d}
%The macro |\zerop@d| uses at least |#1| digits for printing the 
%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.
%    \begin{macrocode}
\def\zerop@d#1#2{{\count0=1 \count1=#2
%    \end{macrocode}
%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
\repeat
%    \end{macrocode}
%If |#1| is positive, the number of zeros to be padded is the maximum
%of~0 and |#1-\count0| (the latter 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}
\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@ld}
%This macro takes care of 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@cro|.
%    \begin{macrocode}
\def\zetg@ld#1#2{\count0=#2\relax \let\FCs@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 cannot occur if 1)~one is (or both are) zero or 2)~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@l\endcsname<0
  \let\FCs@gn=\m@ne \fi\fi
 \ifnum\count0>0 \ifnum\csname FCtot@\romannumeral\FCsc@l\endcsname>0
  \let\FCs@gn=\m@ne \fi\fi
 \global\advance\csname FCtot@\romannumeral\FCsc@l\endcsname by \count0
 \ifx\FCs@gn\m@ne 
%    \end{macrocode}
%They have the same sign, hence risk of overflow.  Record the sign
%of |\count0| (and of the original total of this column; we just established
%they were the same) in |\FCs@gn|. Table~\ref{tab:fcoverflow} 
%\begin{table}[htb]
%\def\PackageError#1#2#3{\PackageWarning{#1}{#2: #3}}
%\caption{Examples on overflow.}
%\label{tab:fcoverflow}
%\begin{tabular}{@{}lfff@{}}
%\multicolumn4{@{}c@{}}{\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 & -1500000 \\
%item~3 &   5000000 & -1500000 &  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.
%
%Check that the sign of the updated column total is still correct.
%If so, |\FCs@gn| is reset (to |\@ne|) at the end of this chunk.
%    \begin{macrocode}
  \ifnum\count0>0 \let\FCs@gn\@ne \fi
  \count0=\csname FCtot@\romannumeral\FCsc@l\endcsname
  \ifnum\FCs@gn<0 \count0=-\count0 \fi
  \ifnum\count0<0 
   \let\FCs@gn=\m@ne
   \PackageError{fcolumn}{Register overflow}{Overflow occurred in 
   fcolumn \number\FCsc@l\space near or at line \the\inputlineno.
   You can press\MessageBreak <enter> now and I'll proceed, but
   check your table. The offending entry\MessageBreak is indicated
   with an exclamation mark in the output.}%
  \else\let\FCs@gn=\@ne
  \fi
 \fi
%    \end{macrocode}
%The value of |\FCs@gn| is used in |\geldm@cro| below.
%    \begin{macrocode}
 \setbox0=\hbox{$\geldm@cro{#1}{#2}$}%
 \ifdim\wd0>\csname FCwd@\romannumeral\FCsc@l\endcsname
  \global\csname FCwd@\romannumeral\FCsc@l\endcsname=\wd0
 \fi\unhbox0}
%    \end{macrocode}
%\end{macro}
%
%The \meta{count}s |\FC@l| and |\FC@r| capture the parts to the left and to the 
%right of the decimal mark, respectively.
%    \begin{macrocode}
\newcount\FC@l \newcount\FC@r
%    \end{macrocode}
%Some auxiliary definitions for capturing compacted information.
%    \begin{macrocode}
\def\setucc@de#1#2\relax{\uccode`\~=`#1 }
\def\assignform@t#1,#2,#3\assignform@t{\def\FCform@t{#1}%
 \def\FCform@tt{#2}\ifx\FCform@tt\@empty \def\FCform@tt{#1}\fi}
%    \end{macrocode}
%\begin{macro}{\m@thcodeswitch}
%As will be shown below, once the first digit, or sign, or decimal mark, or
%grouping character is scanned, the decimal digits should loose their activeness.
%That is done here for the digits in a rather blunt way, by putting their
%|\mathcode|s to zero if |#1| equals~0, 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@fi| is encountered, the digits get back their 
%original |\mathcode|s so that the actual typesetting in |\zetg@ld| is correct again.
%With a non-zero |#1| the activeness is switched on.
%    \begin{macrocode}
\def\m@thcodeswitch#1{\count0=10 \loop\ifnum\count0>0 
\advance\count0 by \m@ne\mathcode\expandafter`\the\count0=
\ifnum#1=0 0 \else "8000 \fi\repeat}
%    \end{macrocode}
%\end{macro}
%\def\<#1>{\leavevmode\hbox{$\langle$#1\/$\rangle$}}
%\begin{macro}{\b@fi}
%The macro |\b@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 are extra
%braces around them in the code where they are used, so it doesn't 
%affect the spacing between the digits (trick copied from |dcolumn|,
%Ref.~\cite{dcolumn}). 
%    \begin{macrocode}
\def\b@fi#1#2#3#4{\sep@xt#1\sep@xt\def\decim@lmark{#2}\def\sp@l{#3}
 \assignform@t#4,,\assignform@t\global\advance\FCsc@l by \@ne
 \global\FC@l=0 \global\FC@r=1
%    \end{macrocode}
%The next statement is missing in |\@array| (see section~\ref{adaptations}) 
%for good reasons; it indicates to the tagging engine that what follows is
%fake math, not to be tagged.  But for |fcolumn| that's exactly what's going
%on, so include it here, but only in columns with specifier~|F|, i.e.,
%in the current macro.
%    \begin{macrocode}
%<*tagging>
 \m@th
%</tagging>
%    \end{macrocode}
%The value specified by the user is then captured by |\FC@l| and 
%this is done in a special way: |\FC@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 mark>
%\<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 mark> is the middel 
%part of |#3|, i.e., the comma in |3,2| or the period in |3.2|.  If
%the \<decimal mark> 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 characters
%outside the ones that are made active, e.g., plain text or nothing at all:
%this is the only combination that doesn't put anything in an |F|-column---and
%was the most difficult part to handle.
%
%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
%part to the left of the decimal mark, 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@gn| is a general purpose flag.  Its 
%first use is to capture the sign.
%    \begin{macrocode}
 \let\FCs@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; 
%digits first. This needs a complicated |\edef| with accompanying |\noexpand|
%because the starting digit for |\FC@l| must be packed inside each definition.
%    \begin{macrocode}
 \count@=10 \loop\ifnum\count@>0 \advance\count@ by \m@ne
 \uccode`\~=\expandafter`\the\count@ \uppercase{\edef~}{\noexpand
 \m@thcodeswitch0 \global\FC@l=\the\count@}\repeat
%    \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 are still |"8000|.  The assignment to |\FC@r| starts 
%with~1 (with no space following), so that appended digits get captured
%correctly, even if they start with~0; postprocessing of |\FC@r| is done
%in |\e@fi|.  The input decimal mark switches itself off as active 
%character, so at most one input decimal mark is allowed (N.B.:
%this makes sense).
%    \begin{macrocode}
 \afterassignment\setucc@de\count@#3\relax
 \uppercase{\def~}{\ifnum\mathcode`\0="8000 \m@thcodeswitch0 \fi
 \afterassignment\deactdecm@rk\count@#3\relax \global\FC@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}
 \ifnum\uccode`\~=`. \uccode`\~=`,\relax\else \uccode`\~=`.\relax\fi
 \uppercase{\def~}{\ifnum\mathcode`\0="8000 \m@thcodeswitch0 \fi
 \afterassignment\d@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@l=\the\FC@l
 \else \expandafter\global\FC@r=\the\FC@r\fi}%
%    \end{macrocode}
%The signs are relatively simple: 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="8000
 \m@thcodeswitch0 \fi\global\FC@l=0}
 \uccode`\~=`-\relax \uppercase{\def~}{\ifnum\mathcode`\0="8000
 \m@thcodeswitch0 \fi\global\let\FCs@gn\m@ne \global\FC@l=0}
%    \end{macrocode}
%Now actually activate all these codes.
%    \begin{macrocode}
 \mathcode`-="8000 \mathcode`+="8000 \mathcode`.="8000
%    \end{macrocode}
%These three remain active until the |$| in |\e@fi| is encountered.
%The following ones will, except in the \<empty> case, have their activeness 
%turned off at some time.
%    \begin{macrocode}
 \m@thcodeswitch1 \afterassignment\actdecm@rk\count@#3\relax}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\sep@xt}
%\begin{macro}{\actdecm@rk}
%\begin{macro}{\deactdecm@rk}
%\begin{macro}{\d@cm}
%Again a few small macros to do important work. At first |\sep@xt| to extract
%the first character of |#1|, which in most cases will be the only character.
%Then |\actdecm@rk| and |\deactdecm@rk| to activate and deactive respectively the
%decimal mark.  Finally, |\d@cm| captures a |\mathcode| for further investigation.
%    \begin{macrocode}
\def\sep@xt#1#2\sep@xt{\def\sep@rator{#1}}
\def\actdecm@rk#1#2\relax{\ifx#1.\relax \mathcode`,="8000
 \else \mathcode`#1="8000 \fi}
\def\deactdecm@rk#1#2\relax{\mathcode`#1=0 }%
\def\d@cm#1#2{\count@=\mathcode`#1 }
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\e@fi}
%If the digits are still active then either nothing, or only
%characters that did not deactivate the digits were entered.  In 
%both cases the output should be \<empty>.  To flag this situation outside
%the group that started with the opening |$| of |\b@fi|, |\FC@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@r| can be tested then.  This is a slight misuse of this
%|\count|, but now it's documented.  In effect, |\FC@r| can only be~$-1$, 
%1, or at least~10, so the comparison |\ifnum\FC@r>0| does not miss~0.
%    \begin{macrocode}
\def\e@fi{\ifnum\mathcode`\0="8000 \global\FC@r=\m@ne\fi$\egroup
 \ifnum\FC@r>0
%    \end{macrocode}
%If there was no decimal mark or if there was a decimal mark but no 
%decimal part, |\FC@r| will still be~1, which doesn't parse well with
%|\secd@xt|, so a zero is appended, i.e., yielding~|10|.
%    \begin{macrocode}
  \ifnum\FC@r=1 \FC@r=10 \fi
%    \end{macrocode}
%Next is a loop for bringing the decimal part in the correct way to
%the integer part.  This loop is performed the number of decimal
%digits to be printed (the~2 in |3,2| of the default setting).  The higher 
%this number is, e.g., 6~when |3,6| is chosen as |#3|---but who does that?---,
%the lower the maximum initial value for |\FC@l| can be, before a low-level 
%\TeX\ arithmetic overflow will occur, so don't overdo it.
%    \begin{macrocode}
  \afterassignment\i@ts\count@\sp@l
  \loop\ifnum\count0>0 \multiply\FC@l by 10 \expandafter\secd@xt
  \number\FC@r\secd@xt \advance\count0 by \m@ne \repeat
%    \end{macrocode}
%This also means that if more decimal digits than this are provided, the excess 
%digit(s) will not be handled.  This is truncation, not rounding!  If all 
%truncated digits are zero, this truncation is exact and they are silently ignored,
%see the example Table~\ref{tab:fctrunc}, 
%\begin{table}[htb]
%\newcolumntype{d}{D,,{-1}}
%\caption{Truncating excess digits.}
%\label{tab:fctrunc}
%\begin{tabular}{@{}ldfl@{}}
%\toprule
%composer & \multicolumn1c{raw entry} & \leeg{debt} & remark \\
%\midrule
%Berg        & 123,450  & 123,450  & silently ignoring digit ``0''   \\
%Eisler      & 234,563  & 234,563  & warning: digit ``3'' ignored    \\
%Sch\"onberg & 345,6704 & 345,6704 & warning: digits ``04'' ignored  \\
%Webern      &   2,3456 &   2,3456 & warning: digits ``56'' ignored, i.e.,\\
%            &          &          & \quad without rounding this entry to 2,35  \\
%\sumline
%\bottomrule
%\end{tabular}
%\end{table}
%that was created with |@{}ldfl@{}| (|d| for centering on the decimal
%mark~\cite{dcolumn}) as tabular key. If, however, at least one of them is 
%not zero, a |\PackageWarning| will be given, showing the discarded digit(s). 
%There is nothing magical about the constant~19 below: it is simply the
%concatenation of~|1| and the largest decimal digit.  The smallest next value
%that |\FC@r| can have is~100, so all values from~19 up to and including~99
%would have worked here.
%    \begin{macrocode}
  \ifnum\expandafter\@gobble\number\FC@r>0
    \PackageWarning{fcolumn}{Excess digit\ifnum\FC@r>19 s\fi\space
    ``\expandafter\tw@l\number\FC@r\relax'' in decimal part
    \MessageBreak ignored near or}
  \fi
%    \end{macrocode}
%Don't forget to correct for the sign (once this is done, |\FCs@gn|
%is free again and can and will be used for other purposes).
%Then output the result.
%    \begin{macrocode}
 \ifx\FCs@gn\m@ne\relax\FC@l=-\FC@l\fi\zetg@ld{\sp@l}{\FC@l}\fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\i@ts}
%\begin{macro}{\tw@l}
%Macro |\e@fi| uses two very tiny macros, given here.  In previous versions
%these were defined inside |\e@fi|, so they also got undefined when |\e@fi|
%ended.  The current solution makes execution a bit faster.
%    \begin{macrocode}
\def\i@ts#1#2{\count0=#2} \def\tw@l#1#2\relax{#2}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\secd@xt}
%The second digit from the left is needed from a string of characters
%representing a decimal number (that should be at least 10 and start with
%a~|1|, but that is guaranteed by |\e@fi|).  The macro |\secd@xt| extracts
%that digit, which is then added to |\FC@l|. A new number is assigned to 
%|\FC@r|, that consists of the digits of |1#2|, unless |#2| was empty; in 
%that case~10 is assigned.  In this way |\FC@r| is prepared for insertion 
%in the next invocation of |\secd@xt|.  In iterating: 1234 yields~134, 
%yields~14, yields~10, stays~10, etc. 
%    \begin{macrocode}
\def\secd@xt1#1#2\secd@xt{\advance\FC@l by #1 
 \FC@r=1#2 \ifnum\FC@r=1 \FC@r=10 \fi}
%    \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 (see 
%Section~\ref{adaptations}) 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@ml@ne|, e.g., |@|, |!|, and \verb+|+ can be fully ignored.  Ampersands
%are only inserted by |c|, |l|, |r|, |p|, |m|, and |b|.  So, if |\x| is a macro
%that prints the desired result of the column (see below), then a specifier 
%like |lflf| will yield the sumline |&\x&&\x\\|.  Had the specifier been 
%\verb+l|f||@{   }l|f+, then the same sumline must be constructed: all 
%difficulties are already picked up and solved in the creation of the preamble.
%
%In reality the sumline must be constructed from the expanded form of the
%specifier, so |@{}lf@{}| will expand as
%|@{}l>{\b@fi.,{3,2}{}}r<{\e@fi}@{}|. The rules for constructing the 
%\begingroup \parskip0pt 
%\iffalse Clumsy way to have bulleted items because package paralist
% is not compatible with tagging \fi
%sumline are now very simple:
%
%\setbox0\hbox{$\bullet$~}
%\noindent\copy0 add an ampersand when |c|, |l|, |r|, |p|, |m|, or |b| is found, 
%unless it is the first one (this \hbox to \wd0{\hfil}is the same as in the preamble);
%
%\noindent\copy0 add a |\x| when |<{\e@fi}| is found;
%
%\noindent\copy0 ignore everything else;
%
%\noindent\box0 close with a |\\|.
%
%\noindent (For completeness' sake it should be mentioned that prior to the |\\| also the column
%\endgroup
%check is inserted, see |\aut@check|.)
%To discriminate, a special version of |\@testpach|~\cite{array}
%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| or |longtable|.
%
%The start is copied from |\@mkpream|.
%    \begin{macrocode}
\def\@mksumline#1{\gdef\s@ml@ne{}\@lastchclass 4 \@firstamptrue
%    \end{macrocode}
%At first the column number is reset and the actual code for what was
%called |\x| above is made inactive.
%    \begin{macrocode}
 \global\FCsc@l=0 \let\prr@sult=\relax
%    \end{macrocode}
%Then |\@mkpream| is picked up again.
%    \begin{macrocode}
 \@temptokena{#1}\@tempswatrue\@whilesw\if@tempswa\fi{\@tempswafalse
 \the\NC@list}\count0\m@ne\let\the@toks\relax\prepnext@tok
%    \end{macrocode}
%Next is the loop over all tokens in the expanded form of the specifier.  The change
%with respect to |\@mkpream| is that the body of the loop is now only dealing
%with F-classes~0, 2, and 10.  What to do in those cases is of course different from
%what to do when constructing the preamble, so special definitions are created, see
%below.
%    \begin{macrocode}
 \expandafter\@tfor\expandafter\@nextchar\expandafter:\expandafter=\the
 \@temptokena\do{\@testpach\ifcase\@chclass\@classfz\or\or\@classfii\or
 \or\or\or\or\or\or\or\@classfx\fi\@lastchclass\@chclass}%
%    \end{macrocode}
%And the macro is finished by applying the |\aut@check| and appending the 
%|\\| to the sumline.  Note that the |\aut@check| is performed {\itshape 
%in\/} the last column, but since it does not put anything in the 
%horizontal list---it only writes to screen and transcript file---, this
%is harmless.
%    \begin{macrocode}
 \xdef\s@ml@ne{\s@ml@ne\noexpand\aut@check\noexpand\\}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@addtosumline}
%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\s@ml@ne{\s@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|.
%    \begin{macrocode}
\def\@classfx{\if@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.
%    \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@fi|.  This check is rather clumsy but this was the first way, after
%many attempts, that worked.  It is necessary because the usage of |<|
%is not restricted to |\e@fi|: the user may have specified other 
%\LaTeX-code using~|<|.
%    \begin{macrocode}
\def\@classfii{\ifnum\@lastchclass=8 
 \edef\t@stm{\expandafter\string\@nextchar}
 \edef\t@stn{\string\e@fi} \ifx\t@stm\t@stn
%    \end{macrocode}
%If both tests yield |true|, i.e., we encountered a |<{\e@fi}| where
%we expect one to find, then add the macro to typeset everything (this
%is what was mentioned |\x| above for brevity).
%    \begin{macrocode}
  \@addtosumline{\prr@sult}
%    \end{macrocode}
%But we're not done yet: in the following lines of code the appropriate 
%\meta{count}s and \meta{dimen}s are created, if necessary.  Note that 
%|\FCsc@l| was set to~0 in the beginning of |\@mksumline|, so it is
%well-defined when |\@classfii| is used.
%    \begin{macrocode}
  \global\advance\FCsc@l by \@ne \ifnum\FCsc@l>\FCtc@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 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@l\endcsname\relax
    \expandafter\newcount\csname FCtot@\romannumeral\FCsc@l\endcsname
   \else
    \PackageError{fcolumn}{Name clash for <count>}{\expandafter\csname
    FCtot@\romannumeral\FCsc@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|.
%    \begin{macrocode}
   \expandafter\ifx\csname FCwd@\romannumeral\FCsc@l\endcsname\relax
    \expandafter\newdimen\csname FCwd@\romannumeral\FCsc@l\endcsname
%    \end{macrocode}
%If the creation was successful, the \meta{count} |\FCtc@l| should be 
%increased.
%    \begin{macrocode}
    \global\FCtc@l=\FCsc@l
   \else
    \PackageError{fcolumn}{Name clash for <dimen>}{\expandafter\csname
    FCwd@\romannumeral\FCsc@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.
%\end{macro}
%\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, e.g., 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}
\newdimen\s@mlinesep
\def\sumline{\@ifnextchar[\s@mline{\s@mline[2pt]}}
\def\s@mline[#1]{\global\s@mlinesep=#1 \s@ml@ne}
%    \end{macrocode}
%In the introduction it was stated that |\sumline| has two options, but in
%reality that second option is the option to |\\|, that is issued by |\s@ml@ne|.
%\end{macro}
%\begin{macro}{\prr@sult}
%The macro |\prr@sult| actually puts the information together.  It starts
%like |\leeg|.
%    \begin{macrocode}
\def\prr@sult{$\egroup \let\e@fi=\relax \let\FCform@t=\FCform@tt
%    \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 happen
%that the sum is wider (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.  This excludes the extension to the
%right in case parentheses are used, again for aesthetic reasons.
%    \begin{macrocode}   
\setbox0=\hbox{$\geldm@cro{\sp@l}{\number\csname
FCtot@\romannumeral\FCsc@l\endcsname}$}%
\ifdim\wd0>\csname FCwd@\romannumeral\FCsc@l\endcsname
 \global\csname FCwd@\romannumeral\FCsc@l\endcsname=\wd0
\fi
\vbox{\hrule width \csname FCwd@\romannumeral\FCsc@l\endcsname
\vskip\s@mlinesep
\hbox to \csname FCwd@\romannumeral\FCsc@l\endcsname{\hfil\unhbox0}}}
%    \end{macrocode}
%\end{macro}
%\subsection{Other checks}
%\begin{macro}{\leeg}
%This macro is used to overrule the default behaviour of the pair |\b@fi| 
%and |\e@fi|.  It starts with ending the groups in the 
%same way that |\e@fi| would normally do.  Then the effect of |\e@fi|
%(that is still in the preamble) is neutralised by |\let|ting it to 
%be |\relax|.  This |\let| is only local to the current column.  Then
%the argument to |\leeg| is processed in the normal way for a right 
%aligned column.
%
%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 doesn't alter the width of the sumrule, but has its normal effect on
%the column width, so be careful: don't insert the unabridged version of
%Romeo and Juliet~\cite{RJ} here.  It is not typeset in math mode, nor 
%does it use the extra (formatting) information of |#4| of the fcolumn,
%so you're completely free here.
%    \begin{macrocode}
\def\leeg#1{$\egroup \let\e@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 the text~|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?
%\end{macro}
%\begin{macro}{\res@tsumline}
%Since all changes to the totals and widths of the columns are global,
%they have to be reset actively at the start of a tabular or array.
%That is an action by itself, but it may occur more often, on request
%of the user, therefore a special macro is defined.  A side effect of
%this macro is that |\FCsc@l| is reset to~0. This is an advantage:
%it should be zero at the beginning of a line in the table (for other
%lines this is done by the |\\|).
%    \begin{macrocode}
\def\res@tsumline{\FCsc@l=\FCtc@l\loop\ifnum\FCsc@l>0
 \global\csname FCtot@\romannumeral\FCsc@l\endcsname=0
 \global\csname FCwd@\romannumeral\FCsc@l\endcsname=\z@
 \advance\FCsc@l by \m@ne\repeat}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\resetsumline}
%To reset a sumline within a table, it should be done within a |\noalign|.
%    \begin{macrocode}
\def\resetsumline{\noalign{\res@tsumline}}
%    \end{macrocode}   
%\end{macro}
%\begin{macro}{\aut@check}
%If the number of |F|-columns is even, it is assumed that they are part of 
%two sets of columns of which each column of the first set should balance
%the appropriate column of the second set.  If on the other hand the number
%of columns is odd, then at least one column has nothing to balance against
%and no automatic checking occurs.  It is correct to check for oddness of 
%|\FCsc@l| since this |\aut@check| is only performed in the last column of
%the tabular: the value of |\FCsc@l| now equals the number of columns used 
%in the current tabular (and may be less than |\FCtc@l|).
%
%The output is only to screen and the transcript file; it doesn't change
%the appearance of your document, so in case the assumption is wrong you
%can safely ignore the result and go on.  The \meta{count}s~0 and~1 are 
%used here and this can be done because any content of those \meta{count}s
%from previous calculations has become irrelevant at this moment.
%
%If the list |\FC@chklist| is empty, the list for the automatic check is
%generated (which will remain empty if |\FCsc@l| is odd).
%    \begin{macrocode}
\def\FC@chklist{}
\def\aut@check{\ifx\@empty\FC@chklist\relax
 \ifodd\FCsc@l\else 
  \count0=\@ne \count1=\FCsc@l \divide\count1 by \tw@
  \loop\ifnum\count1<\FCsc@l \advance\count1 by \@ne
   \xdef\FC@chklist{\FC@chklist\number\count0,\number\count1;}%
   \advance\count0 by\@ne \repeat
  \fi
 \fi
%    \end{macrocode}
%Then this list is peeled off and processed.
%The comparison is done between the internal representation of the totals,
%so this only makes sense when the decimal part, i.e., the |2| of |3,2| in
%the default value for |#3| of~|f| is the same for both columns.  That is
%almost always the case due to the nature of this type of tabulars.  The 
%\meta{count} |\FC@l| is free to be used for the calculations needed here.
%    \begin{macrocode}
 \loop\ifx\FC@chklist\@empty\else
  \expandafter\fre@t\FC@chklist\fre@t
  \FC@l=\csname FCtot@\romannumeral\count0\endcsname 
  \advance\FC@l by -\csname FCtot@\romannumeral\count1\endcsname
  \ifnum\FC@l=0 \else \ifnum\FC@l<0 \FC@l=-\FC@l \fi
   \PackageWarning{fcolumn}{Representations of F-columns \number
   \count0 \space and \number\count1 \space differ by\MessageBreak
   \number\FC@l\space due to \string\sumline\space near or}%
  \fi
 \repeat}
%    \end{macrocode}
%When |\aut@check| is finished, |\FC@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@t}
%This function eats the first two numbers off |\FC@chklist|.
%    \begin{macrocode}
\def\fre@t#1,#2;#3\fre@t{\count0=#1 \count1=#2 \xdef\FC@chklist{#3}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\checkfcolumns}
%But the assumptions for |\aut@check| may be wrong, therefore manual
%control on this checking is also made possible here. The macro 
%|\checkfcolumns| provides a way to the user to check that the appropriate 
%columns are balanced (as it should in a balance).  Arguments |#1| and 
%|#2| are the |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@chklist{\FC@chklist #1,#2;}}}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Adaptations to existing macros}\label{adaptations}
%\begin{macro}{\@array}
%The definition of |\@array| had to be extended slightly because it should
%also include |\@mksumline| (acting on the same |#2| that |\@mkpream| gets).
%This change is transparant: it only adds functionality and if you don't 
%use that, you won't notice the difference.  This addition to |\@array| 
%by redefining it is distracting and error-prone and is better implemented
%via the Hook-mechanism~\cite{hook}; from the June~1, 2026 version onwards,
%package |array| will contain two dedicated Hooks~\cite{LTN43} for adding
%various chunks, among which the code on |\@mksumline| in |\@array| and for
%resetting |\FCsc@l| in |\ar@ialign|, see below.  But till that date it is
%|fcolumn| that should take care of those Hooks and that is done here.
%    \begin{macrocode}
\IfFormatAtLeastF{2026-06-01}{\NewHookWithArguments{tbl/init}{2}
 \NewHook{tbl/row/end}}
%    \end{macrocode}
%Now fill those Hooks.  The |#2| is the actual |#2| from |\@array|.
%    \begin{macrocode}
\AddToHookWithArguments{tbl/init}{\begingroup\@mksumline{#2}%
 \res@tsumline\endgroup}
%    \end{macrocode}
%No arguments for this one.
%    \begin{macrocode}
\AddToHook{tbl/row/end}{\global\FCsc@l=0 }
%    \end{macrocode}
%Redefining starts by just copying the original definition from v2.6d (or later) 
%of the |array| package~\cite{array}, compacted.
%    \begin{macrocode}
%<*tagging>
\ExplSyntaxOn
%</tagging>
\IfFormatAtLeastF{2026-06-01}{\def\@array[#1]#2{\@tempdima\ht
 \strutbox\advance\@tempdima by \extrarowheight\setbox\@arstrutbox
 \hbox{\vrule\@height\arraystretch\@tempdima\@depth\arraystretch
 \dp\strutbox\@width\z@}%
%<*tagging>
 \tbl_init_cell_data_for_table:
%</tagging>
 \begingroup\@mkpream{#2}%
%<*tagging>
 \tbl_count_table_cols:
%</tagging>
 \xdef\@preamble{\noexpand\ar@ialign\@halignto
 \bgroup\@arstrut
%<*tagging>
 \UseTaggingSocket{tbl/row/begin}
 \tbl_init_cell_data_for_row:
%</tagging>
 \@preamble\tabskip\z@\cr}\endgroup
%    \end{macrocode}
%After this |\endgroup| a |\begingroup| is issued; this ensures that 
%|\@mksumline| that is created there experiences the same environment that
%|\@mkpream| saw.  As a side product of |\@mksumline| also the \meta{count}s
%for the totals and \meta{dimen}s for the widths of the columns are created.
%All columns should start fresh, i.e., totals are~0 and widths are 0\thinspace pt.
%This can be done within the group, as these resettings are global.
%    \begin{macrocode}
 \UseHookWithArguments{tbl/init}{2}{}{#2}
%    \end{macrocode}
%From here on it is just the old definition of |array.sty|.
%    \begin{macrocode}
 \@arrayleft\if #1t\vtop\else\if#1b\vbox\else\vcenter\fi\fi
 \bgroup\let\@sharp ##\let\protect\relax\lineskip\z@\baselineskip\z@
 \mathsurround \z@ \let\\\@arraycr \let\tabularnewline\\\let\par\@empty
%<*tagging>
 \UseTaggingSocket{tbl/init}
%</tagging>
 \@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.
%    \begin{macrocode}
\let\@@array=\@array\def\ar@ialign{\everycr{\noalign{%
%<*tagging>
 \tbl_if_row_was_started:T{\UseTaggingSocket{tbl/row/end}}
 \tbl_update_cell_data_for_next_row:
%</tagging>
%    \end{macrocode}
%\end{macro}
%Here comes an accompanying change: after each |\\| (or |\cr| for that matter)
%the \meta{count} |\FCsc@l| should be reset.  This is easiest done with
%|\everycr|, but |\everycr| is essentially put to |{}| by |\ar@ialign|, so 
%that definition should change.  The resetting should be done globally.
%    \begin{macrocode}
 \UseHook{tbl/row/end}
%    \end{macrocode}
%Then the definition is picked up again.
%    \begin{macrocode}
}}\tabskip\z@skip\halign}}
%    \end{macrocode}
%Much of the techniques here are repeated in |\LT@array|, see the next section.
%
%\subsection{Support for multipage tables}
%Packages |longtable|~\cite{longtable} and |supertabular|~\cite{supertabular}
%can be used for tables that span multiple pages.  Package |supertabular| works
%with |fcolumn| out of the box (no changes needed), but may lead to different 
%column widths on individual pages.  If you don't want that, use |longtable|.
%The packages |fcolumn| and |longtable| also work together because only one
%definition of |longtable| needs to be changed if it is present.  That change
%is done via a Hook~\cite{hook}, so it no longer matters in which order
%|fcolumn| and |longtable| are loaded.  More happens under the hood if also 
%|caption|~\cite{caption} is loaded, and even that is running fine.  But with
%the near infinite number of packages that exist nowadays I did not check
%all combinations, so I may have overlooked some. 
%    \begin{macrocode}
%<*tagging>
%<@@=tbl>
%</tagging>
%    \end{macrocode}
%\begin{macro}{\LT@array}
%And here is the only definition of |longtable| that needs to be extended
%to make |fcolumn| work with that package.  The lines are compacted a bit
%w.r.t.\ the original |longtable| code; if you want to study the
%code, have a look at the documentation~\cite{longtable}. It is defined, even
%if |longtable| is not loaded.  Similar Hooks as in |array| will be placed in
%package |longtable|, after which this section can be removed in
%the next version.
%    \begin{macrocode}
\IfFormatAtLeastF{2026-06-01}{\AtBeginDocument{\def\LT@array[#1]#2{%
%<*tagging>
  \UseTaggingSocket{tbl/init}\tl_if_empty:eTF{\LTcaptype}%
  {\tl_gset:Ne\@currentHref{LT@tables.\theHLT@tables}}{%
%</tagging>
  \@kernel@refstepcounter{\LTcaptype}\stepcounter{LT@tables}
%<*tagging>
  \tl_gset:Ne\@currentHref{\LTcaptype.\cs_if_exist_use:c
  {theH\LTcaptype}}}\tbl_gzero_row_count:
  \UseTaggingSocket{tbl/longtable/init}
%</tagging>
  \if l#1\LTleft\z@\LTright\fill\else\if r#1\LTleft\fill\LTright\z@
  \else\if c#1\LTleft\fill\LTright\fill\fi\fi\fi\let\LT@mcol
  \multicolumn\let\LT@@@@tabarray\@tabarray\let\LT@@@@hl\hline
  \def\@tabarray{\let\hline\LT@@@@hl\let\multicolumn\LT@mcol
  \LT@@@@tabarray}\let\\\LT@tabularcr\let\tabularnewline\\
  \def\newpage{\noalign{\break}}\def\pagebreak{\noalign{\ifnum`}=0
  \fi\@testopt{\LT@no@pgbk-}4}\def\nopagebreak{\noalign{\ifnum`}=0
  \fi\@testopt\LT@no@pgbk4}\let\hline\LT@hline\let\kill\LT@kill
  \let\caption\LT@caption\@tempdima\ht\strutbox\let\@endpbox
  \LT@endpbox\ifx\extrarowheight\@undefined\let\@acol\@tabacol\let
  \@classz\@tabclassz\let\@classiv\@tabclassiv\def\@startpbox{%
  \vtop\LT@startpbox}\let\@@@@startpbox\@startpbox\let\@@@@endpbox
  \@endpbox\let\LT@LL@FM@cr\@tabularcr\else\advance\@tempdima
  \extrarowheight\col@sep\tabcolsep\let\@startpbox\LT@startpbox
  \let\LT@LL@FM@cr\@arraycr\fi\setbox\@arstrutbox\hbox{\vrule
  \@height\arraystretch\@tempdima\@depth\arraystretch\dp\strutbox
  \@width\z@}\let\@sharp##\let\protect\relax
  \begingroup\@mkpream{#2}%
%<*tagging>
  \tbl_count_table_cols:
%</tagging>
  \xdef\LT@bchunk{%
%<*tagging>
  \tbl_inbetween_rows:
%</tagging>
  \global\advance\c@LT@chunks\@ne\global\LT@rows\z@\setbox\z@\vbox
  \bgroup\LT@setprevdepth\tabskip\LTleft\noexpand\halign to\hsize
  \bgroup\tabskip\z@\@arstrut
%<*tagging>
  \UseTaggingSocket{tbl/row/begin}\tbl_init_cell_data_for_row:
%</tagging>
  \@preamble
  \tabskip\LTright\cr}\endgroup
%    \end{macrocode}
%Until this line it was just the code for |\LT@array| from package~|longtable|.
%The next line is new to |\LT@array|.  Its purpose is the same as in |\@array| above.
%    \begin{macrocode}
  \UseHookWithArguments{tbl/init}{2}{}{#2}
%    \end{macrocode}
%A few lines of the original definition again.
%    \begin{macrocode}
  \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols\LT@make@row\m@th
  \let\par\@empty\res@tsumline\everycr{\noalign{%
%<*tagging>
  \@@_trace:n {--longtable-->~chunk~row:~ \the\LT@rows\space
  row:~ \the\g_@@_row_int \space column:~ \the\g_@@_col_int}
  \tbl_if_row_was_started:T {\UseTaggingSocket{tbl/row/end}
  \tbl_inbetween_rows:}\int_compare:nNnT\LT@rows<\LTchunksize
  {\tbl_gincr_row_count:} % Next is row about to start
%</tagging>
%    \end{macrocode}
%And here is the last addition.
%    \begin{macrocode}
  \UseHook{tbl/row/end}
%    \end{macrocode}
%From here on |\LT@array| is picked up again.  
%    \begin{macrocode}
  }}\lineskip\z@\baselineskip\z@\LT@bchunk}}}
%<*tagging>
\ExplSyntaxOff
%<@@=>
%</tagging>
%    \end{macrocode}
%\end{macro}
%
%When |longtable| splits a table, i.e., is doing what you loaded it for, modern 
%versions of pdf\/\LaTeX\ complain about infinite glue shrinkage.  This is due to
%a |\vss| in the definition of |\LT@output|.  It's not an error and can be ignored,
%but it is annoying since it interrupts generating the output file.  The author 
%of |longtable| announced a fix in |\LT@output| in the next version of that
%package~\cite{infinite}.
%
%That's it!
%
%\section*{Acknowledgement}
%Thanks to Karl Berry for valuable comments regarding the consistency of 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.  He also challenged me to make |fcolumn| compatible with 
%|longtable|.  Christian Hoff's request on column formatting triggered many
%happy hours of coding.
%\bibliographystyle{plain}
%\begin{thebibliography}{10}
%\itemsep0pt \parsep0pt \parskip0pt
%\bibitem{array} Frank Mittelbach and David Carlisle. A new implementation of 
%   \LaTeX's |tabular| and |array| environment: \url{www.ctan.org/pkg/array}.
%\bibitem{booktabs} Simon Fear and Danie Els, the |booktabs| package.  Publication 
%   quality tables in \LaTeX: \url{www.ctan.org/pkg/booktabs}.
%\bibitem{dcolumn} David Carlisle, the |dcolumn| package: \url{www.ctan.org/pkg/dcolumn}.
%\bibitem{longtable} David Carlisle, the |longtable| package: \url{www.ctan.org/pkg/longtable}. 
%\bibitem{supertabular} Theo Jurriens ^^A I checked with Theo that `Jurriens' is correct; not `Jurri\"ens' (EHTO).
%   and Johannes Braams, the |supertabular| package, to be found at: \url{www.ctan.org/pkg/supertabular}.
%\bibitem{tagging} Ulrike Fischer, the |tagpdf| package: \url{www.ctan.org/pkg/tagpdf}. 
%\bibitem{color} David Carlisle, the |color| package: \url{www.ctan.org/pkg/color}.
%\bibitem{CandTB} Donald Knuth, {\it Computers \& Typesetting/B, ``\TeX: the program,''\/}
%   Addison-Wesley, Reading (1991).
%\bibitem{CandTA} Donald Knuth, {\it Computers \& Typesetting/A, ``The \TeX book,''\/} 
%   Addison-Wesley, Reading (1991).
%\bibitem{TAOCP1} Donald Knuth, {\it The Art of Computers Programming, volume~1, 
%   ``Fundamental Algorithms,''\/} Addison-Wesley, Reading (1997).
%\bibitem{RJ} William Shakespeare, Romeo and Juliet, a tragedy (1597).
%\bibitem{hook} Frank Mittelbach, ``\LaTeX's hook management'',  
%   \url{www.latex-project.org/help/documentation/lthooks-doc.pdf}.
%\bibitem{LTN43} \LaTeX-News 43: \url{www.latex-project.org/news/latex2e-news/ltnews43.pdf}.
%\bibitem{caption} Axel Sommerfeldt, the |caption| package: \url{www.ctan.org/pkg/caption}.
%\bibitem{infinite} See discussion at \url{https://github.com/latex3/latex2e/issues/1907}.
%\end{thebibliography}
%\Finale
\endinput
