
%%% comma.sty 
%%%
%%% Copyright 1996 1997 David Carlisle
%%%
%%% This file may be distributed under the terms of the LPPL.
%%% See 00readme.txt for details.
%%%
%%% David Carlisle david@dcarlisle.demon.co.uk
%%%
\ProvidesPackage{comma}
      [1997/12/15 v1.2 Insert commas every three digits (DPC)]

%% This package provides a means of producing numbers with a separator
%% (by default a comma) every three digits.
%%
%% Given a LaTeX counter (eg section)
%%
%% \renewcommand\thesection{\commaform{section}}
%%
%% If section is 12345, \thesection will now print as 12,345
%% 
%% If you want something other than a comma, for instance a thin
%% space, or a full word space, redefine \commaformtoken, for instance
%% \renewcommand\commaformtoken{\,}
%% \renewcommand\commaformtoken{ }
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% v1.0 1996/09/05
% v1.1 1997/07/10
% v1.2 1997/12/15


% #1 is the name of a LaTeX counter.
\def\commaform#1{%
  \expandafter\@commaform\csname c@#1\endcsname}

%     The token to place every three digits.
\def\commaformtoken{,}

% Internal version.
% #1 is the number. It may be a TeX count register, eg \count@
%    or an explicit number such as `1234'.
% v1.1 use \relax not empty so explicit digits need not end with a space
% token.
% (This \relax will be eaten by the parser, second two must be \@empty)
% v1.2 add \@comma@ux for very long digit strings (requested on c.t.t)
\def\@commaform#1{%
  \expandafter\@commaaux
    \expandafter{\expandafter}%
    \number\@comma@ux#1%
    \relax\@empty\@empty}


% If \@commaform is given a very long digit string then it may be
% too large for \number, so make sure \number only applies to the first
% token. This may leave a spurious space token, but it will be eaten
% by the \@commaaux parsing, which uses non delimited arguments, and
% so skips space tokens.
% Added in v1.2.
\def\@comma@ux#1{#1 }

% Wander down to the end of the number and then see where
%    \relax turns up.
% #1 List of digits already seen (initially {} )
% #2#3#4 next three digits (or \@empty) in list.
\def\@commaaux#1#2#3#4{%
  \ifx\relax#2%
    \addcomma#1\relax
  \else
    \ifx\relax#3%
      \addcomma\@empty\@empty#1#2\relax
    \else
      \ifx\relax#4%
        \addcomma\@empty#1#2#3\relax
      \else
         \@commaauxafterfi{#1#2#3#4}%
      \fi
    \fi
  \fi}


% Get out of the nested \if before recursing down the list of digits.
% #1 list of digits seen so far.
\def\@commaauxafterfi#1\fi\fi\fi{%
  \fi\fi\fi\@commaaux{#1}}

% Go down adding a `comma' every three tokens. The list will have
%    been padded with 0 1 or 2  \@empty at the start so there is
%    definitely a multiple of three tokens before the \relax.
% #1#2#3 are next three digits
% #4 is next digit, or \relax to stop
\def\addcomma#1#2#3#4{%
  #1#2#3%
  \if#4\relax
  \else
    \commaformtoken
    \expandafter\addcomma\expandafter#4%
  \fi}
 
