summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/sepnum/sepnum.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/sepnum/sepnum.sty')
-rw-r--r--macros/latex/contrib/sepnum/sepnum.sty218
1 files changed, 218 insertions, 0 deletions
diff --git a/macros/latex/contrib/sepnum/sepnum.sty b/macros/latex/contrib/sepnum/sepnum.sty
new file mode 100644
index 0000000000..5d81c61680
--- /dev/null
+++ b/macros/latex/contrib/sepnum/sepnum.sty
@@ -0,0 +1,218 @@
+%% This is file `sepnum.sty' -- separated numbers
+%%
+%% (C) 1995, 1996, 2001 Bernd Raichle
+%% Raichle@Informatik.Uni-Stuttgart.de
+%%
+%% This package provides a means of formatting numbers
+%% with (a) a decimal separator different of the default (`.')
+%% and (b) a separator (default `,') every three digits.
+%%
+%% First version of this package was posted to the newsgroup
+%% `de.comp.tex' November 6th, 1995 (as `printnum.sty').
+%%
+%%
+%% -- LICENSING CONDITION --
+%%
+%% This program may be redistributed and/or modified under the terms
+%% of the LaTeX Project Public License, either version 1.0 of this
+%% license, or (at your option) any later version.
+%% The latest version of this license is in
+%% CTAN:macros/latex/base/lppl.txt.
+%%
+%%
+%% -- USAGE --
+%%
+%% The macro
+%%
+%% \sepnum{<c>}{<sbc>}{<sac>}{<number>}
+%%
+%% produces the <number> with the decimal point replaced by <c>
+%% and the separator <sbc> every three digits in the integer part,
+%% the separator <sac> every three digits in the fractional part
+%% of <number>. \sepnum is _fully expandable_ and _not_ fragile,
+%% unless one of <c>, <sbc>, or <sac> is.
+%%
+%% Example:
+%% - a non realistic example to show the capabilities of \sepnum
+%% \sepnum{,}{*}{-}{1234.5678} => 1*234,567-8
+%% - to print a number inserting small spaces each three digits
+%% \sepnum{.}{\,}{\,}{1234.5678} => 1\,234.567\,8
+%%
+%%
+%% Additionally this package provides
+%%
+%% \sepnumform{<c>}{<sbc>}{<sac>}{<LaTeX-counter>}
+%%
+%% to use \sepnum with a LaTeX counter.
+%%
+%% Example (with a decimal comma in the print form \the<counter>):
+%% \newcounter{money}
+%% \renewcommand{\themoney}{\sepnumform{,}{.}{}{money}}
+%%
+%% \setcounter{money}{-1000}
+%% You have \themoney{} left.
+%%
+%%
+%% (For compatibility with `printnum.sty', the macros
+%% \printnum{<number>} and \printnumKomma/\printnumTrenner
+%% still exist.)
+%%
+%%
+%% -- SEE ALSO --
+%%
+%% * Package ``comma.sty'' by David Carlisle which provides
+%% similar features for integers only, i.e. it misses support
+%% for the decimal point/comma in fixed point numbers.
+%% * Package ``numprint.sty'' by Harald Harders supporting
+%% formatting of numbers given as 1234e5 in addition.
+%%
+%%
+\begingroup \expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx \csname ProvidesPackage\endcsname\relax \else
+ \ProvidesPackage{sepnum}%
+ [1996/09/05 v2.0 Insert a separator every three digits (br)]
+\fi
+
+
+%
+% auxiliary macros for loops:
+%
+\newcommand{\sepnumReturnFi}{}
+\newcommand{\sepnumReturnElseFi}{}
+\newcommand{\sepnumReturnOrFi}{}
+
+\def\sepnumReturnFi#1\fi{\fi #1}
+\def\sepnumReturnElseFi#1\else#2\fi{\fi #1}
+\def\sepnumReturnOrFi#1\or#2\fi{\fi #1}
+
+%
+% \sepnum@DoNothing #1
+% don't change #1 (removes braces around argument token list!)
+%
+\newcommand{\sepnum@DoNothing}[1]{#1}
+
+%
+% \sepnum@ReverseNumber #1 #2
+% reverses all tokens in #2 and calls #1{#2} afterwards
+%
+\newcommand{\sepnum@ReverseNumber}[2]{%
+ \sepnum@DoReverseNumber{#1}{}#2\relax}
+\newcommand{\sepnum@DoReverseNumber}[3]{%
+ \ifx\relax#3\sepnumReturnElseFi{#1{#2}}%
+ \else\sepnumReturnFi{\sepnum@DoReverseNumber{#1}{#3#2}}%
+ \fi}
+
+%
+% \sepnum@ThreeDigits #1 #2 #3
+% reverses #3, inserts #1 every three tokens/digits
+% (you have to reverse #3 again using \sepnum@ReverseNumber!),
+% calls #2{#3} afterwards
+%
+\newcommand{\sepnum@ThreeDigits}[3]{%
+ \sepnum@DoThreeDigits{#1}{#2}{}0#3\relax}
+\newcommand{\sepnum@DoThreeDigits}[5]{%
+ \ifx\relax#5\sepnumReturnElseFi{#2{#3}}%
+ \else\sepnumReturnFi{%
+ \ifcase#4\noexpand\sepnum@DoNothing{}% 0
+ \sepnumReturnOrFi{\sepnum@DoThreeDigits{#1}{#2}{#5#3}1}%
+ \or % 1
+ \sepnumReturnOrFi{\sepnum@DoThreeDigits{#1}{#2}{#5#3}2}%
+ \or % 2
+ \sepnumReturnElseFi{\sepnum@DoThreeDigits{#1}{#2}{#5#3}3}%
+ \else % 3 ==> insert #1
+ \sepnumReturnFi{\sepnum@DoThreeDigits{#1}{#2}{#5#1#3}1}%
+ \fi}%
+ \fi}
+
+%
+% \sepnum@BeforeComma #1 #2
+% \sepnum@AfterComma #1 #2
+% call \sepnum@ReverseNumber and \sepnum@DoThreeDigits
+% to correctly group the number #2 every three digits
+% either with or without reversing first or afterwards.
+%
+\newcommand{\sepnum@BeforeComma}[2]{%
+ \sepnum@ReverseNumber{\sepnum@ThreeDigits{#1}\sepnum@DoNothing}{#2}}
+\newcommand{\sepnum@AfterComma}[2]{%
+ \sepnum@ThreeDigits{#1}{\sepnum@ReverseNumber\sepnum@DoNothing}{#2}}
+
+%
+%%%%%%%%%% USER MACRO %%%%%%%%%%
+%
+% \sepnum #1 #2 #3 #4
+%
+% #1 decimal comma
+% #2 separator for three digits groups before comma
+% #3 separator for three digits groups after comma
+% #4 number
+%
+\newcommand{\sepnum}[4]{%
+ \sepnum@Sign{#1}{#2}{#3}#4.\relax}
+%
+% look first for sign `+' or `-', divide given number in
+% digits before and after `.', insert #1 as decimal comma
+% (in \sepnum@SepComma)
+%
+\newcommand{\sepnum@Sign}[4]{%
+ \ifx\relax#4%
+ 0%
+ \else \sepnumReturnFi{%
+ \ifx -#4%
+ \sepnumReturnElseFi{-\sepnum@SepComma{#1}{#2}{#3}}%
+ \else \sepnumReturnFi{%
+ \ifx +#4%
+ \sepnumReturnElseFi{+\sepnum@SepComma{#1}{#2}{#3}}%
+ \else
+ \sepnumReturnFi{\sepnum@SepComma{#1}{#2}{#3}#4}%
+ \fi}%
+ \fi}%
+ \fi}
+
+\newcommand{\sepnum@SepComma}{}
+\def\sepnum@SepComma#1#2#3#4.#5\relax{%
+ \ifx$#4$0% no digits before `.' => add 0 for "0.xxx"
+ \else \sepnumReturnFi{\sepnum@BeforeComma{#2}{#4}}\fi
+ \ifx$#5$% no digits after `.'
+ \else \sepnumReturnFi{#1\sepnum@DoSepComma{#3}#5\relax}\fi}
+
+% remove `.' inserted in \sepnum
+\def\sepnum@DoSepComma#1#2.#3\relax{%
+ \sepnum@AfterComma{#1}{#2}}
+
+
+%
+%%%%%%%%%% USER MACRO %%%%%%%%%%
+%
+% \sepnumform #1 #2 #3 #4
+%
+% like \sepnum but #4 is the name of a LaTeX counter
+%
+\newcommand{\sepnumform}[4]{%
+ \expandafter\sepnum@doform
+ \expandafter{\number\value{#4}}{#1}{#2}{#3}}
+\newcommand{\sepnum@doform}[4]{%
+ \sepnum{#2}{#3}{#4}{#1}}
+
+
+%
+%%%%%%%%%% USER MACRO %%%%%%%%%%
+%
+% For compatibility with `printnum.sty':
+%
+% \printnum #1
+%
+\newcommand{\printnum}[1]{%
+ \sepnum{\printnumKomma}{\printnumTrenner}{\printnumTrenner}{#1}}
+%
+% Macros to specify comma and separator (default to get
+% european style numbers, e.g. "123.456,78" for "123456.78"):
+%
+% \printnumKomma => ,
+% \printnumTrenner => .
+%
+\newcommand{\printnumKomma}{,}
+\newcommand{\printnumTrenner}{.}
+
+\endinput
+%%
+%% End of file `sepnum.sty'.