%%% 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}