diff --git a/utils/commercial/invoice/Makefile b/utils/commercial/invoice/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d485a3153d27771065685da042dcf83f47653070
--- /dev/null
+++ b/utils/commercial/invoice/Makefile
@@ -0,0 +1,2 @@
+clean:
+	rm -f *.aux *.out *.bbl *.toc *.lof *.lot *.log *.blg *.dvi *.idx *.ind *.ilg\
diff --git a/utils/commercial/invoice/invoice.def b/utils/commercial/invoice/invoice.def
new file mode 100644
index 0000000000000000000000000000000000000000..75712fee8f83f4d16e55cdc53e85850934dac353
--- /dev/null
+++ b/utils/commercial/invoice/invoice.def
@@ -0,0 +1,261 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%	File: invoice.def
+%	Author: Oliver Corff
+%	Date: 2001-12-06
+%	
+%	This file contains messages, labels etc. in English and German
+%
+%	This file cannot be used alone but is called by invoice.sty
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 	This file is the only file of this package which may be
+%	modified without renaming it.
+%
+%	Adding a new language to labels is simple. Follow the 
+%	instructions at line 194 of this file, and, please!,
+%	do not forget to send the result to
+%
+%	corff@zedat.fu-berlin.de
+%
+%	Credits for language contributions given in invoice.sty.
+%
+%	Thank you very much for your support of "invoice".
+%
+%	Oliver Corff,
+%
+%	Berlin, Guangzhou, Ulaanbaatar, Zagreb, Shenyang 2001
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% English definitions are default. Other
+% languages are selected automatically.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Warning messages for non-fatal situations
+%
+\def\InvoiceCompleted	{Invoice completed. Command ignored.}%
+\def\FeeSTExists	{You cannot print a fee subtotal twice!}%
+\def\ProjectEmpty	{Project empty. No subtotal possible!}%
+\def\ProjectSTExists	{You cannot print a project subtotal twice!}%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Error messages for fatal situations
+%
+\def\InternalError			{Package `invoice': Internal error!}%
+%
+\def\NoInvoiceNesting			{Invoices cannot be nested.
+					 Close this invoice first!}%
+%
+\def\InvoiceCompletedNoExpense		{Invoice closed.
+					 No new expense item allowed.
+					 Start a new invoice
+					 first!}%
+%
+\def\InvoiceCompletedNoFee		{Invoice closed.
+					 No new fee item allowed.
+					 Start a new invoice
+					 first!}%
+%
+\def\InvoiceCompletedNoFeeST		{Invoice closed.
+					 No fee subtotal allowed.
+					 Start a new invoice
+					 first!}%
+%
+\def\InvoiceCompletedNoProject		{Invoice closed.
+					 No new project allowed.
+					 Start a new invoice
+					 first!}%
+%
+\def\InvoiceCompletedNoProjectST	{Invoice closed.
+					 No project subtotal allowed.
+					 Start a new invoice
+					 first!}%
+%
+\def\MissingFee				{No fee given.
+					 You must charge at least one fee!}%
+%
+\def\MissingInputData			{Missing input data!}%
+%
+\def\MissingOpening			{You must open an invoice!}%
+%
+\def\MissingProject			{No project given.
+					 Open a project first!}%
+%
+\def\FeeBeforeExpense			{Fees are charged first.
+					 Expenses follow.}%
+%
+\def\NoProjectNesting			{Projects cannot be nested.
+					 Close this project first!}%
+%
+\def\ProjectCompletedNoExpense		{Project closed.
+					 No new expense item allowed.
+					 Start a new project
+					 first!}%
+%
+\def\ProjectCompletedNoFee		{Project closed.
+					 No new fee item allowed.
+					 Start a new project
+					 first!}%
+%
+\def\KOMA				{Users of KOMA-Script's scrlettr.cls%
+					 ^^Jsay `invoiceno' for the scrlettr
+					 invoice command,^^Jand `invoiceenv'
+					 for the invoice environment!}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Labels. These ones are available in translation, too. See below.
+%
+\def\Warning				{Warning}%
+\def\Error				{Error}%
+\def\Expense				{Expense}%
+\def\Amount				{Amount}%
+\def\Currency				{Currency}%
+\def\Factor				{Factor}%
+\def\Activity				{Activity}%
+\def\Count				{Count}%
+\def\UnitRate				{Rate/Unit}%
+\def\Fees				{Fees}%
+\def\VAT				{VAT}%
+\def\Expenses				{Expenses}%
+\def\SumFees				{Sum \Fees}%
+\def\SumVAT				{Sum \VAT}%
+\def\SumExpenses			{Sum \Expenses}%
+\def\SubtotalFee			{Subtotal \Fees}%
+\def\SubtotalExpenses			{Subtotal \Expenses}%
+\def\SubtotalProject			{Subtotal Project}%
+\def\Total				{Total}%
+%
+% This is German.
+%
+\ifx\l@german\undefined
+	\message{^^J(invoice) \Warning:
+		Language \string\l@german\space unknown.^^J^^J}
+\else
+\ifnum\number\language=\number\l@german
+	\def\Warning			{Warnung}%
+	\def\Error			{Fehler}%
+	\def\Expense			{Auslage}%
+	\def\Amount			{Betrag}%
+	\def\Currency			{W\"ahrung}%
+	\def\Factor			{Faktor}%
+	\def\Activity			{Aktivit\"at}%
+	\def\Count			{Anzahl}%
+	\def\UnitRate			{Rate/Einheit}%
+	\def\Fees			{Honorare}%
+	\def\VAT			{MWSt.}%
+	\def\Expenses			{Auslagen}%
+	\def\SumFees			{Summe \Fees}%
+	\def\SumVAT			{Summe \VAT}%
+	\def\SumExpenses		{Summe \Expenses}%
+	\def\SubtotalFee		{Zwischensumme \Fees}%
+	\def\SubtotalExpenses		{Zwischensumme \Expenses}%
+	\def\SubtotalProject		{Zwischensumme Projekt}%
+	\def\Total			{Gesamtsumme}%
+\fi\fi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This is Dutch.
+%
+\ifx\l@dutch\undefined
+	\message{^^J(invoice) \Warning:
+		Language \string\l@dutch\space unknown.^^J^^J}
+\else
+\ifnum\number\language=\number\l@dutch
+	\def\Warning			{Waarschuwing}%
+	\def\Error			{Fout}% 
+	\def\Expense			{Onkosten}% 
+	\def\Amount			{Bedrag}% 
+	\def\Currency			{Valuta}% 
+	\def\Factor			{Faktor}% 
+	\def\Activity			{Activiteit}% 
+	\def\Count			{Aantal}% 
+	\def\UnitRate			{Prijs/Eenheid}% 
+	\def\Fees			{Honorarium}% 
+	\def\VAT			{BTW}% 
+	\def\Expenses			{Onkosten}% 
+	\def\SumFees			{Totaal \Fees}% 
+	\def\SumVAT			{Totaal \VAT}% 
+	\def\SumExpenses		{Totaal \Expenses}% 
+	\def\SubtotalFee		{Subtotaal \Fees}% 
+	\def\SubtotalExpenses		{Subtotaal \Expenses}% 
+	\def\SubtotalProject		{Subtotaal project}% 
+	\def\Total			{Totaal}% 
+\fi\fi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This is French.
+%
+\ifx\l@french\undefined
+	\message{^^J(invoice) \Warning:
+		Language \string\l@french\space unknown.^^J^^J}
+\else
+\ifnum\number\language=\number\l@french
+	\def\Warning			{Avertissement}%
+	\def\Error			{Erreur}%
+	\def\Expense			{D\'epense}%
+	\def\Amount			{Montant}%
+	\def\Currency			{Devise}%
+	\def\Factor			{Facteur}%
+	\def\Activity			{Activit\'e}%
+	\def\Count			{Quantit\'e}%
+	\def\UnitRate			{Prix/Unit\'e}%
+	\def\Fees			{Honoraires}%
+	\def\VAT			{TVA}%
+	\def\Expenses			{D\'epenses}%
+	\def\SumFees			{Total \Fees}%
+	\def\SumVAT			{Total \VAT}%
+	\def\SumExpenses		{Total \Expenses}%
+	\def\SubtotalFee		{Sous-Total \Fees}%
+	\def\SubtotalExpenses		{Sous-Total \Expenses}%
+	\def\SubtotalProject		{Sous-Total Projet}%
+	\def\Total			{Total}%
+\fi\fi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% 
+% How to add new label languages to the `invoice' package:
+%
+% 1. Copy all following lines after this explanation
+%    and insert them above this comment.
+%
+% 2. Remove all comment symbols at the beginning of the lines.
+%
+% 3. Fill the empty parentheses {} with the appropriate
+%    translations.
+%
+% 4. Enter the correct internal language name used by LaTeX2e
+%    into the condition of the \ifnum clause.
+%
+% 5. Please do not forget to mail the resulting file to
+%    corff@zedat.fu-berlin.de
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Name correct language name here --v--
+% and   --v--!
+%\ifx\l@german\undefined
+%	\message{^^J(invoice) \Warning:
+%		Language \string\l@german\space unknown.^^J^^J}
+%\else
+%\ifnum\number\language=\number\l@german
+%	\def\Warning			{} % Enter translations here!
+%	\def\Error			{} % 
+%	\def\Expense			{} % 
+%	\def\Amount			{} % 
+%	\def\Currency			{} % 
+%	\def\Factor			{} % 
+%	\def\Activity			{} % 
+%	\def\Count			{} % 
+%	\def\UnitRate			{} % 
+%	\def\Fees			{} % 
+%	\def\VAT			{} % 
+%	\def\Expenses			{} % 
+%	\def\SumFees			{} % 
+%	\def\SumVAT			{} % 
+%	\def\SumExpenses		{} % 
+%	\def\SubtotalFee		{} % 
+%	\def\SubtotalExpenses		{} % 
+%	\def\SubtotalProject		{} % 
+%	\def\Total			{} % 
+%\fi
diff --git a/utils/commercial/invoice/invoice.sty b/utils/commercial/invoice/invoice.sty
new file mode 100644
index 0000000000000000000000000000000000000000..d376905d3e1b976cbe626eab5bffe10992820476
--- /dev/null
+++ b/utils/commercial/invoice/invoice.sty
@@ -0,0 +1,743 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%        Datei: invoice.sty
+%        Autor: Oliver Corff, corff@zedat.fu-berlin.de
+%        Datum: December 06, 2001
+%      Version: 0.4
+%    Copyright: Ulaanbaatar, Beijing, Berlin
+%  Description: This collection of macros provides
+%               tools for generating complex invoices
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Corrections and contributions by:
+%%%%%%
+% Robin Fairbairns, December 6, 2001
+% 
+%   Hinted that the dollar sign can also be printed by saying
+%   \string$.
+%
+%%%%%%
+% Vincent Tougait, France, November 27, 2001
+%
+%   Pointed out that fractions of VAT percents were not allowed.
+%   Bugfix on December 06, 2001
+%
+%%%%%%
+% Fred Donck, The Hague, The Netherlands, October, 2001
+% e-mail: fd0@donck.com
+%
+% Dutch labels
+%%%%%%
+% Ian Wormsbecker, October 31, 2001
+%
+%   Skips the VAT lines if VAT=0
+%   Noticed that the terminal message will not accept a Dollar sign.
+%   The only workaround is to say \char`$ in \begin{invoice}{}
+%%%%%%
+% Fred Donck, The Hague, The Netherlands, Sept 18, 2001
+% e-mail: fd0@donck.com
+% fixed some minor issues:
+%   real arithmetic will use integer intermediate values, so
+%   some calculations failed with the \Fee{title}{rate}{amount}
+%   where \rate is not an integer
+%
+%   another fix is that in my opinion the VAT line should be 
+%   printed also even though only one project is specified
+%
+%   third fix is that the subtotal-line should not be printed 
+%   on a project with only one \Fee line
+%%%%%%
+% Jacco Kok (fixed some labels),
+%%%%%%
+% Thilo Barth (discussed alternative names and command clashes
+%	with KOMA Script class scrlettr.cls),
+%%%%%%
+% Robert Inder (discussed general issues)
+%
+% were gladly and gratefully received and accepted.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% -------------------     identification     -------------------
+%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{invoice}[2001/12/06]
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% -------------------      initial code      -------------------
+%
+\RequirePackage{ifthen}
+\RequirePackage{longtable}
+\RequirePackage{calc}
+\input{realcalc}
+\input{invoice.def}
+%
+\newcommand{\InvoiceVersion}{0.4}%
+\newcounter{Fee}		%
+\newcounter{VAT}		%
+%\newcounter{VAT@rate}		%
+\newcounter{Expenses}		%
+\newcounter{Total}		%
+\newcounter{Project}		%
+%
+\newcounter{Fee@ctr}		% Number of fees per project
+				% no subtotal will be printed in case of
+				% value < 2
+%
+\newcounter{Expense@ctr}	% Number of expense items per project
+				% no subtotal will be printed in case of
+				% value < 2
+%
+\newcounter{One@Fee}		% Individual Fee
+\newcounter{One@VAT}		% Individual VAT
+\newcounter{One@Expense}	% Individual Expense
+%
+\newcounter{ST@Fee}		% Subtotal Fee
+\newcounter{ST@VAT}		% Subtotal VAT
+\newcounter{ST@Expenses}	% Subtotal Expenses
+\newcounter{ST@Project}		% Subtotal Project
+%
+\gdef\Flag{0}%			% State 0: Invoice not started yet
+				% State 1: Start invoice
+				% State 2: Start project, print title
+				% State 3: Fee Item
+				% State 4: Print Subtotal Fee
+				% State 5: Expense Item
+				% State 6: Print Subtotal Expenses
+				% State 7: Print Subtotal Project
+				% State 8: Print Total, Close invoice
+%
+% \def\BC{Euro}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\newcommand{\my@message}[1]{\message{^^J#1^^J^^J}}
+\newcommand{\error@message}[1]{\errmessage{^^J\Error: #1^^J^^J}}
+\newcommand{\warning@message}[1]{\message{^^J\Warning: #1^^J^^J}}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifx\invoice\undefined			% False if KOMA Script scrlettr.cls
+	\def\my@invoice{invoice}	% loaded. In this case one may say
+\else					% "invoice". If true, the environ-
+	\def\my@invoice{invoiceenv}	% ment is renamed to "invoiceenv"
+	\let\invoiceno\invoice		% and the scrlettr macro is renamed
+	\def\invoice#1{%		% to "invoiceno". Thank you, Thilo,
+		\error@message{\KOMA}}	% for this hint!
+\fi					%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newenvironment{\my@invoice}[2]{%
+	\setcounter{Project}{0}%
+	\ST@Reset\Total@Reset%
+	\def\VAT@rate{#2}%
+	\def\BC{#1}%
+	% The VAT is: \the\VAT@rate % Debugging Diagnostics only
+	\parindent=0cm
+	\ifcase\Flag % 0: Invoice not started yet
+		%
+		\gdef\Flag{1}%
+		\begin{center}%
+		\begin{longtable}{p{5cm}rlrrr}%
+		%
+	\else \error@message{\NoInvoiceNesting}
+	\fi}
+% At the end of environment: 
+% Yields state 8->0, Close and complete invoice, finish tables, etc.
+{% 
+	\ifcase\Flag % 0: Invoice not started yet
+		%
+		\error@message{\MissingOpening}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 1: Start invoice
+		%
+		\error@message{\MissingProject}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 2: Start project, print title
+		%
+		\error@message{\MissingInputData}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 3: Print remuneration item
+		%
+		\ifnum\theProject>0 \STFee\STProject\fi%
+		\Tot@l%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 4: Print subtotal remuneration
+		%
+		\ifnum\theProject>1 \STProject\fi%
+		\Tot@l%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 5: Expense item
+		%
+		\ifnum\theProject>1 \STExpenses\STProject\fi%
+		\Tot@l%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 6: Print subtotal expenses
+		%
+		\ifnum\theProject>1 \STProject\fi%
+		\Tot@l%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 7: Print subtotal project
+		%
+		\Tot@l%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 8: Print total, close invoice
+		%
+		\warning@message{\InvoiceCompleted}%
+		%
+	\else \error@message{\InternalError}%
+	\fi%
+	\gdef\Flag{0}%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\ProjectTitle}[1]{% Yields state 2: Start Project
+	%
+	\ifcase\Flag % 0: Invoice not started yet
+	%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or 	% 1: Start invoice
+		%
+		\Titel@Ausgabe{#1}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 2: Start project, print title
+		%
+		\error@message{\NoProjectNesting}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 3: Print remuneration item
+		%
+		\STFee%
+		\STProject%
+		\Titel@Ausgabe{#1}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 4: Print subtotal remuneration
+		%
+		\STProject%
+		\Titel@Ausgabe{#1}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 5: Expense item
+		%
+		\STExpenses%
+		\STProject%
+		\Titel@Ausgabe{#1}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 6: Print subtotal expenses
+		%
+		\STProject%
+		\Titel@Ausgabe{#1}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 7: Print subtotal project
+		%
+		\Titel@Ausgabe{#1}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 8: Print total, close invoice
+		%
+		\error@message{\InvoiceCompletedNoProject}%
+		%
+	\else \error@message{\InternalError}%
+	\fi%
+	\setcounter{Fee@ctr}{0}%		% reset counter
+	\setcounter{Expense@ctr}{0}%		% reset counter
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Fee}[3]{% Yields state 3, Print Fee Item
+	%
+	% #1 Contents
+	% #2 Fee per Unit
+	% #3 Unit Count
+	%
+	\ifcase\Flag % 0: Invoice not started yet
+		\error@message{\MissingOpening}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 1: Start invoice
+		%
+		\error@message{\MissingProject}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 2: Start project, print title
+		%
+		\Fee@Title%
+		\Fee@Line{#1}{#2}{#3}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 3: Print remuneration item
+		%
+		\Fee@Line{#1}{#2}{#3}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 4: Print subtotal remuneration
+		%
+		\warning@message{\FeeSTExists}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 5: Expense item
+		%
+		\error@message{\FeeBeforeExpense}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 6: Print subtotal expenses
+		%
+		\error@message{\FeeBeforeExpense}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 7: Print subtotal project
+		%
+		\error@message{\ProjectCompletedNoFee}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 8: Print total, close invoice
+		%
+		\error@message{\InvoiceCompletedNoFee}%
+		%
+		%
+	\else \error@message{\InternalError}%
+	\fi%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\STFee}{% Yields state 4, print subtotal remuneration
+	%
+	\ifcase\Flag % 0: Invoice not started yet
+		%
+		\error@message{\MissingOpening}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 1: Start invoice
+		%
+		\error@message{\MissingProject}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 2: Start project, print title
+		%
+		\error@message{\MissingFee}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 3: Print remuneration item
+		%
+		\ST@Fee%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 4: Print subtotal remuneration
+		%
+		\warning@message{\FeeSTExists}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 5: Expense item
+		%
+		\error@message{\FeeBeforeExpense}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 6: Print subtotal expenses
+		%
+		\error@message{\FeeBeforeExpense}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 7: Print subtotal project
+		%
+		\error@message{\ProjectCompletedNoFee}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 8: Print total, close invoice
+		%
+		\error@message{\ProjectCompletedNoFee}%
+		%
+	\else \error@message{\InternalError}%
+	\fi%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\EBC}[2]{% Yields state 5: Expenses in BaseCurrency 
+	%
+	% #1 Contents und Datum
+	% #2 Amount in BaseCurrency
+	%
+	\ifcase\Flag % 0: Invoice not started yet
+		%
+		\error@message{\MissingOpening}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 1: Start invoice
+		%
+		\error@message{\MissingProject}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 2: Start project, print title
+		%
+		\Expense@Title%
+		\Expense@BaseCurrency{#1}{#2}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 3: Print remuneration item
+		%
+		%\ifnum\theProject>1 \STFee\fi
+		\STFee%
+		\Expense@Title%
+		\Expense@BaseCurrency{#1}{#2}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 4: Print subtotal remuneration
+		%
+		\Expense@Title%
+		\Expense@BaseCurrency{#1}{#2}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 5: Expense item
+		%   
+		\Expense@BaseCurrency{#1}{#2}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 6: Print subtotal expenses
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 7: Print subtotal project
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 8: Print total, close invoice
+		%
+		\error@message{\InvoiceCompletedNoExpense}%
+		%
+	\else \error@message{\InternalError}%
+	\fi%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\EFC}[5]{% Yields state 5: Expenses in ForeignCurrency
+	%
+	% #1 Contents und Datum
+	% #2 Currency
+	% #3 Amount
+	% #4 Exchange Rate
+	% #5 Amount Zielwaehrung
+	%
+	% Usage:
+	% 1. {Contents}{ForeignCurrency}{ExchangeRate}{}
+	% 2. {Contents}{ForeignCurrency}{}{BaseCurrency}
+	% 3. {Contents}{ForeignCurrency}{ExchangeRate}{BaseCurrency}
+	%
+	\ifcase\Flag % 0: Invoice not started yet
+		%
+		\error@message{\MissingOpening}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 1: Start invoice
+		%
+		\error@message{\MissingProject}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 2: Start project, print title
+		%
+		\Expense@Title%
+		\Expense@ForeignCurrency{#1}{#2}{#3}{#4}{#5}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 3: Print remuneration item
+		%
+		\STFee%
+		\Expense@Title%
+		\Expense@ForeignCurrency{#1}{#2}{#3}{#4}{#5}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 4: Print subtotal remuneration
+		%
+		\Expense@ForeignCurrency{#1}{#2}{#3}{#4}{#5}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 5: Expense item
+		%
+		\Expense@ForeignCurrency{#1}{#2}{#3}{#4}{#5}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 6: Print subtotal expenses
+		%
+		\error@message{\ProjectCompletedNoExpense}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 7: Print subtotal project
+		%
+		\error@message{\ProjectCompletedNoExpense}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 8: Print total, close invoice
+		%
+		\error@message{\InvoiceCompletedNoExpense}%
+		%
+	\else \error@message{\InternalError}%
+	\fi%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\STExpenses}{% Yields state 6: Ausgabe der ST Expenses
+	%
+	\ifcase\Flag % 0: Invoice not started yet
+		%
+		\error@message{\MissingOpening}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 1: Start invoice
+		%
+		\error@message{\MissingProject}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+		%
+	\or	% 2: Start project, print title
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+		%
+	\or	% 3: Print remuneration item
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+		%
+	\or	% 4: Print subtotal remuneration
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 5: Expense item
+		%
+		\ST@Expenses%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 6: Print subtotal expenses
+		%
+		\warning@message{\ProjectCompletedNoExpense}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 7: Print subtotal project
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 8: Print total, close invoice
+		%
+		\error@message{\InvoiceCompletedNoExpense}%
+		%
+	\else \error@message{\InternalError}%
+	\fi%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\STProject}{% Yields state 7: Ausgabe der ST Project
+	%
+	\ifcase\Flag % 0: Invoice not started yet
+		%
+		\error@message{\MissingOpening}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 1: Start invoice
+		%
+		\error@message{\MissingProject}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 2: Start project, print title
+		%
+		\warning@message{\ProjectEmpty}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 3: Print remuneration item
+		%
+		\STFee%
+		\ST@Project%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 4: Print subtotal remuneration
+		%
+		\ST@Project%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 5: Expense item
+		%
+		\STExpenses%
+		\ST@Project%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 6: Print subtotal expenses
+		%
+		\ST@Project%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 7: Print subtotal project
+		%
+		\warning@message{\ProjectSTExists}%
+		%
+	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+	\or	% 8: Print total, close invoice
+		%
+		\error@message{\InvoiceCompletedNoProjectST}%
+		%
+	\else \error@message{\InternalError}%
+	\fi%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Total@Reset}{%
+	\setcounter{Fee}{0}%
+	\setcounter{VAT}{0}%
+	\setcounter{Expenses}{0}%
+	\setcounter{Total}{0}%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\ST@Reset}{%
+	\setcounter{ST@Fee}{0}%
+	\setcounter{ST@VAT}{0}%
+	\setcounter{ST@Expenses}{0}%
+	\setcounter{ST@Project}{0}%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Print@Value}[1]{%
+	\Rmul\r#1{0.01}%% <- Reduce to BaseCurrency
+	\Rtrunc\r{2}\r%	% <- Truncate to two digits
+	\r%		% <- Output data!
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Message@Value}[1]{%
+	\Rmul\r#1{0.01}%% <- Reduce to BaseCurrency
+	\Rtrunc\r{2}\r%	% <- Truncate to two digits
+	\message{\r}%	% <- Output data!
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Titel@Ausgabe}[1]{%
+	% Internal command called by \ProjectTitle.
+	%
+	\ifnum\theProject>0\\\\\fi%
+	\multicolumn{6}{c}{\textbf{\large#1}}\\\gdef\Flag{2}%
+			\ST@Reset\addtocounter{Project}{1}\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Fee@Title}{%
+	%\\
+	\textbf{\Activity}&&&\UnitRate&\Count&\Amount\ (\BC)\\
+	\hline%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Fee@Line}[3]{%
+	%
+	% #1 Contents
+	% #2 Charged Fee per Unit
+	% #3 Count
+	%
+	% Internal command, called by \Fee.
+	%
+	\gdef\Flag{3}%
+	%
+	#1		&	&	&#2	&#3 &
+%
+%   next is reversed to allow real arithmetic.
+%   intermediate results are stored in integer format, so calculations are
+%   incorrect in case #2 is a real.
+%   fixed by exchanging the 1 and the 100
+%
+		\setcounter{One@Fee}{100 * \real{#2} * \real{#3} * 1}%
+%
+		\addtocounter{ST@Fee}{\theOne@Fee}%
+		\addtocounter{Fee}{\theOne@Fee}%
+		\addtocounter{Fee@ctr}{1}%	    increase counter with 1
+		\Print@Value{\theOne@Fee}\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\ST@Fee}{%
+	\gdef\Flag{4}%
+	\ifnum\theST@Fee>0
+	    \ifthenelse{\theFee@ctr>1} %	    if more than 1 \Fee line
+		{\SubtotalFee &	&	&	&	&
+				\Print@Value{\theST@Fee}\\%
+	    }{}%
+	%\ifnum\theVAT@rate>0
+		\VAT\ (\VAT@rate\%)	 &	&	&	&	&
+			\setcounter{ST@VAT}{\theST@Fee * \real{\VAT@rate} / 100}%
+				\Print@Value{\theST@VAT}\\%
+	%\fi
+	\fi%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Expense@BaseCurrency}[2]{%
+	\gdef\Flag{5}%
+	#1		&	& \BC		&	&	&
+				\Rmul\r{100}{#2}%
+				\setcounter{One@Expense}{1 * \real{\r}}%
+				\addtocounter{ST@Expenses}{\theOne@Expense}%
+				\addtocounter{Expenses}{\theOne@Expense}%
+				\addtocounter{Expense@ctr}{1}%advance counter
+				\Print@Value{\theOne@Expense}\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Expense@ForeignCurrency}[5]{%
+	\gdef\Flag{5}%
+	%
+	% Folgende Angaben sind moeglich:
+	% 1. {Contents}{Currency}{Amount}{Umrechnung}{  }
+	% 2. {Contents}{Currency}{Amount}{          }{BaseCurrency}
+	% 3. {Contents}{Currency}{Amount}{Umrechnung}{BaseCurrency}
+	%
+	#1	 &	& #2	& #3	& #4	&
+	\ifthenelse{\equal{#5}{}}% Target in BaseCurrency or not?
+		{% Target not in BaseCurrency
+			\Rmul\r{100}{#3}%
+			\Rmul\r \r {#4}%
+		}%
+		{% Target in BaseCurrency
+			\Rmul\r{100}{#5}%
+		}%
+	\setcounter{One@Expense}{1 * \real{\r}}%
+	\addtocounter{ST@Expenses}{\theOne@Expense}%
+	\addtocounter{Expenses}{\theOne@Expense}%
+	\Print@Value{\theOne@Expense}%
+	\addtocounter{Expense@ctr}{1}%advance counter
+	\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Expense@Title}{%
+	\\
+	\textbf{\Expense}&&\Currency&\Amount&\Factor &\BC\\
+	\hline%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\ST@Expenses}{%
+	\gdef\Flag{6}%
+	\ifnum\theST@Expenses>0
+	    \ifthenelse{\theExpense@ctr>1} %	    if more than 1 \Fee line
+	{\SubtotalExpenses &	&	&	&	& 
+				\Print@Value{\theST@Expenses}\\
+	}{}%
+	\fi
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\ST@Project}{%
+	\gdef\Flag{7}%
+	\\
+	\SubtotalProject &	&	&	&	& 
+			\addtocounter{ST@Project}{\theST@Fee}%
+			\addtocounter{ST@Project}{\theST@VAT}%
+			\addtocounter{ST@Project}{\theST@Expenses}%
+			\Print@Value{\theST@Project}\\
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Tot@l}{%
+	\\\hline
+	\ifnum\theFee>0 \SumFees&	&	&	&	&
+				\Print@Value{\theFee}\\ 
+		%\ifnum\theVAT@rate>0
+		\SumVAT	&	&	&	&	&
+			\setcounter{VAT}{\theFee * \real{\VAT@rate} / 100}%
+					\Print@Value{\theVAT}\\
+		%\fi
+	\fi
+	\ifnum\theExpenses>0 \SumExpenses&	&	&	&	&
+				\Print@Value{\theExpenses}\\ 
+	\fi
+	\hline\hline
+	\textbf{\Total} &	&	&	&	&
+		\message{^^J\Currency: \BC}%
+		\message{^^J\VAT: \VAT@rate}%
+		\addtocounter{Total}{\theFee}%
+		\message{^^J\SumFees: }\Message@Value{\theFee}%
+		\addtocounter{Total}{\theVAT}%
+		\message{^^J\SumVAT: }\Message@Value{\theVAT}%
+		\addtocounter{Total}{\theExpenses}%
+		\message{^^J\SumExpenses: }\Message@Value{\theExpenses}%
+		\textbf{\Print@Value{\theTotal}}%
+		\message{^^J\Total: }%
+			\Message@Value{\theTotal}\message{^^J^^J}\\%
+	\end{longtable}
+	\end{center}
+	\gdef\Flag{8}%
+}
+\endinput
diff --git a/utils/commercial/invoice/realcalc.tex b/utils/commercial/invoice/realcalc.tex
new file mode 100644
index 0000000000000000000000000000000000000000..be46167fc41559df710b29c86192cc991cca1945
--- /dev/null
+++ b/utils/commercial/invoice/realcalc.tex
@@ -0,0 +1,581 @@
+%% realcalc.tex
+%%
+%% (C) Frank Buchholz, Jan. 1993
+%% e-mail: buchholz@lusty.informatik.uni-dortmund.de
+%  User documentation: All lines starting with two %
+%  Try grep to extract these lines.
+%%
+%% Real arithmetic with big values and high precision.
+%% Calculations are done with 9 decimal digits.
+%% Usable with TeX and LaTeX.
+%%
+%% Parameter:
+%%
+%% 	<macro> Macro, witch catches the result.
+%% 	<value> String or macro witch expands to a value in the range 
+%% 		    from -2147483647.999999999 to 2147483647.999999999
+%%	<precision> Number from 0 to 9
+%%
+%% Functions:
+%%
+
+% Don't read this file twice
+\ifx\Radd\undefined \else \endinput \fi
+
+% Make "@" be a letters
+\chardef\catamp=\the\catcode`\@
+\catcode`@=11
+ 
+\def\@Rversion{Version 1.0, Jan. 1993}
+\message{`Real arithmetic', \@Rversion (C) Frank Buchholz}
+
+% Allocation of temporary registers
+\newcount\@ta
+\newcount\@tb
+%
+\newcount\@xs	% Sign of 1st value
+\newcount\@xi	% Integer part of 1st value
+\newcount\@xf	% Fractional part of 1st value
+%
+\newcount\@ys	% Sign of 2nd value
+\newcount\@yi	% Integer part of 2nd value
+\newcount\@yf	% Fractional part of 2nd value
+%
+\newcount\@mil	\@mil=1000000000	% 10^9
+%
+\countdef\@xa240
+\countdef\@xb241
+\countdef\@xc242
+\countdef\@xd243
+\countdef\@xe244
+\countdef\@ya245
+\countdef\@yb246
+\countdef\@yc247
+\countdef\@yd248
+\countdef\@ye249
+\let\@f=\@tb
+\let\@product=\@ta
+
+\chardef\@zero=0
+
+%% 	\Radd<macro><value><value>	 	Addition
+\def\Radd#1#2#3{\@callc\@Radd#1{#2}{#3}}
+
+%% 	\Rsub<macro><value><value>	 	Subtraction
+\def\Rsub#1#2#3{\@callc\@Radd#1{#2}{-#3}}
+
+\def\@Radd#1#2.#3.#4\relax#5.#6.#7\relax{%
+  % #1 Macro, witch gets the result
+  % #2 integer part of 1st value 
+  % #3 fractional part of 1st value
+  % #4 dummy to swallow everthing after the 2nd '.'
+  % #5 integer part of 2nd value 
+  % #6 fractional part of 2nd value
+  % #7 dummy to swallow everthing after the 2nd '.'
+  %
+  \@readvalue\@xs\@xi\@xf{#2}{#3}%
+  \@readvalue\@ys\@yi\@yf{#5}{#6}%
+  %
+  % Add integer parts
+  \@ta=\@xi \advance\@ta\@yi%
+  %
+  % Add fractional parts if they are not zero
+  \ifnum\@xf=\@zero%
+    \ifnum\@yf=\@zero%
+      \@tb=\@zero%
+    \else%
+      \@longadd%
+    \fi%
+  \else%
+    \@longadd%
+  \fi%
+  %
+  % Store result
+  \@store#1\@ta\@tb%
+}
+
+\def\@longadd{%
+    % Propagate sign to fractional parts
+    \multiply\@xf\@xs \multiply\@yf\@ys%
+    %
+    % Add fractional parts
+    \@tb=\@xf \advance\@tb\@yf%
+    %
+    % Calculate carry
+    \ifnum\@tb<\@zero% 
+      \ifnum\@tb<-\@mil      \advance\@ta -\@ne \advance\@tb\@mil  \fi% 
+    \else% 
+      \ifnum\@tb<\@mil \else \advance\@ta \@ne	\advance\@tb-\@mil \fi% 
+    \fi%
+} 
+
+%% 	\Rmul<macro><value><value>	 	Multiplication
+\def\Rmul#1#2#3{\@callc\@Rmul#1{#2}{#3}}
+
+\def\@Rmul#1#2.#3.#4\relax#5.#6.#7\relax{%
+  % #1 Macro, witch gets the result
+  % #2 integer part of 1st value 
+  % #3 fractional part of 1st value
+  % #4 dummy to swallow everthing after the 2nd '.'
+  % #5 integer part of 2nd value 
+  % #6 fractional part of 2nd value
+  % #7 dummy to swallow everthing after the 2nd '.'
+  %
+  % How to do real multiplications:
+  % Split values in various parts
+  % x y = 1234 567890 . 123 456 789
+  % ->	  xa   xb	xc  xd	xe
+  % ->	  ya   yb	yc  yd	ye
+  % Do 21 (!) integer multiplications if there are any fractional parts
+  % r = x * Y
+  % -> r =   xi*yi
+  %	   + (xa*yc + xa*yc		     )*10^3 
+  %	   + (xa*yd + xd*ya		     )*10^-0 
+  %	   + (xa*ye + xe*ya  +	xb*yc + xc*yb)*10^-3 
+  %	   + (xb*yd + xd*yb  +	xc*yc	     )*10^-6 
+  %	   + (xb*ye + xe*yb  +	xc*yd + xd*yc)*10^-9 
+  %	   + (xc*ye + xe*yc  +	xd*yd	     )*10^-12 
+  %	   + (xd*ye + xe*yd		     )*10^-15 
+  %	   + (xe*ye			     )*10^-18
+  %
+  % -> r = ((((( xe*ye				     / 1000 
+  %		+ xd*ye + xe*yd 		  ) / 1000
+  %	       + xc*ye + xe*yc	+  xd*yd	 ) / 1000
+  %	      + xb*ye + xe*yb  +  xc*yd + xd*yc ) / 1000
+  %	     + xb*yd + xd*yb  +  xc*yc	       ) / 1000
+  %	    + xa*ye + ye*xa  +	xb*yc + xc*yb ) / 1000
+  %	   + xa*yd + xd*ya + (xa*yc + ya*xc)*1000 + xi*yi
+  % The last three digigs are saved just before the divisions.
+  %
+  % Init 
+  %
+  \@readvalue\@xs\@xi\@xf{#2}{#3}%
+  \@readvalue\@ys\@yi\@yf{#5}{#6}%
+  %
+  % Sign
+  \multiply\@xi\@xs%
+  \multiply\@yi\@ys%
+  \multiply\@xs\@ys%
+  %
+  \@product=\@zero%
+  % 
+  \ifnum\@xf=\@zero%
+    \ifnum\@yf=\@zero%
+      % No fractional parts
+      \edef\@frac{000000000}	% digits of fractional part  
+    \else%
+      \@longmul			% Long multiplication		
+    \fi%
+  \else%
+    \@longmul			% Long multiplication		
+  \fi%
+  %
+  % Multiply integer parts
+  \count@=\@xi \multiply\count@\@yi%
+  \advance\@product\count@%
+  %
+  % Sign
+  \multiply\@product\@xs%
+  %
+  % Store result
+  \edef#1{\number\@product.\@frac}%
+}
+
+% Do long multiplication
+\def\@longmul{%
+    % Split values in pieces
+    \@f=1000000%
+    \count@=\@xi%		
+    \divide\count@\@f					\@xa=\count@%
+    \multiply\count@-\@f	\advance\count@\@xi	\@xb=\count@%
+    \count@=\@xf%		
+    \divide\count@\@f					\@xc=\count@%
+    \multiply\count@-\@f	\advance\count@\@xf%	
+    \@f=1000%
+    \@xe=\count@%
+    \divide\count@\@f					\@xd=\count@%
+    \multiply\count@-\@f	\advance\count@\@xe	\@xe=\count@%
+    % 
+    \@f=1000000%
+    \count@=\@yi%		
+    \divide\count@\@f					\@ya=\count@%
+    \multiply\count@-\@f	\advance\count@\@yi	\@yb=\count@%
+    \count@=\@yf%		
+    \divide\count@\@f					\@yc=\count@%
+    \multiply\count@-\@f	\advance\count@\@yf%	
+    \@f=1000%
+    \@ye=\count@%
+    \divide\count@\@f					\@yd=\count@%
+    \multiply\count@-\@f	\advance\count@\@ye	\@ye=\count@%
+    %
+    \edef\@frac{} 				% digits of fractional part
+    % 
+    \@mul ee	      \relax\@shift		% 10^-18
+    \@mul de ed       \relax\@shift		% 10^-15
+    \@mul ce ec dd    \relax\@shift		% 10^-12
+    \@mul be eb cd dc \relax\@saveshift		% 10^-9
+    \@mul bd db cc    \relax\@saveshift		% 10^-6
+    \@mul ae ea bc cb \relax\@saveshift		% 10^-3
+    \multiply\@xa\@f  \multiply\@xc\@f		% 10^3
+    \@mul ad da ac ca \relax%			
+}
+
+\def\@mul#1#2#3{%
+  \count@=\csname @x#1\endcsname%
+  \multiply\count@\csname @y#2\endcsname%
+  \advance\@product\count@%
+  %
+  \ifx#3\relax%
+    \let\next=\relax% 
+  \else%
+    \let\next=\@mul%
+  \fi%
+  \next#3%
+}
+
+\def\@shift{%
+  \divide\@product\@f%
+}
+
+\def\@saveshift{%
+  % Save rightmost digits 
+  \count@=\@product%
+  \divide\@product\@f%
+  \multiply\@product\@f%
+  \advance\count@-\@product%
+  \advance\count@\@f%
+  \edef\@frac{\expandafter\@ignorenext\number\count@\@frac}%
+  %
+  \divide\@product\@f%
+}
+
+%% 	\Rdiv<macro><value><value>	 	Division
+\def\Rdiv#1#2#3{\@callc\@Radd#1{#2}{#3}}
+
+\def\@Rdiv#1#2.#3.#4\relax#5.#6.#7\relax{%
+  % #1 Macro, witch gets the result
+  % #2 integer part of 1st value 
+  % #3 fractional part of 1st value
+  % #4 dummy to swallow everthing after the 2nd '.'
+  % #5 integer part of 2nd value 
+  % #6 fractional part of 2nd value
+  % #7 dummy to swallow everthing after the 2nd '.'
+  %
+  \message{Error: Rdiv not ready}
+  %
+  \@readvalue\@xs\@xi\@xf{#2}{#3}%
+  \@readvalue\@ys\@yi\@yf{#5}{#6}%
+  %
+  \ifnum\@yi=\@zero
+    \@xi=\@zero
+  \else
+    \divide\@xi\@yi
+  \fi
+  %
+  \@store#1\@xi\@xf%
+}
+
+%%	\Rneg<macro><value>		Negation
+\def\Rneg#1#2{%
+  % Expand the value and split it into the integer and the fractional part
+  \edef\next{\noexpand\@Rneg\noexpand#1#2..\noexpand\relax}%
+  \next%
+}
+
+\def\@Rneg#1#2.#3.#4\relax{
+  % #1 Macro, witch gets the result
+  % #2 Integer part of value
+  % #3 Fractional part of value
+  % #4 Remaining tokens
+  %
+  \@readvalue\@xs\@xi\@xf{#2}{#3}%
+  %
+  % Change sign
+  \multiply\@xi-\@ne%
+  \multiply\@xf-\@xs%
+  % 
+  % Store result
+  \@store#1\@xi\@xf%
+}
+
+%%
+%%	\Rtrunc<macro><precision><value> Truncate value to specified precision
+\def\Rtrunc#1#2#3{%
+  % Expand parameter and split the value into the integer and fractional part 
+  \edef\next{\noexpand\@Rtrunc\noexpand#1#2#3..\noexpand\relax}%
+  \next%
+}
+
+\def\@Rtrunc#1#2#3.#4.#5\relax{%
+  % #1 Macro, witch gets the result
+  % #2 Number of decimal places
+  % #3 Integer part of value
+  % #4 Fractional part of value
+  % #5 dummy to swallow everthing after the 2nd '.'
+  %
+  \count@=#2%
+  \edef\next{\empty}%
+  \ifnum\count@>\@zero%
+    \expandafter\@@Rtrunc#4000000000\relax%
+  \fi%
+  \edef#1{#3\next}%
+}
+
+\def\@@Rtrunc#1#2#3#4#5#6#7#8#9{%
+  % #1...#9 fractional part, padded with trailing zeros
+  \edef\next{.#1%
+    \ifnum\count@>1 #2\fi%
+    \ifnum\count@>2 #3\fi%
+    \ifnum\count@>3 #4\fi%
+    \ifnum\count@>4 #5\fi%
+    \ifnum\count@>5 #6\fi%
+    \ifnum\count@>6 #7\fi%
+    \ifnum\count@>7 #8\fi%
+    \ifnum\count@>8 #9\fi%
+  }%
+  \@swallow%
+}
+
+%%
+%%	\Rifle<value><value>		Test v1 < v2
+\def\Rifle#1#2{\@callb\@Rifle{#1}{#2}}
+
+\def\@Rifle#1.#2.#3\relax#4.#5.#6\relax{%
+  % #1 integer part of 1st value 
+  % #2 fractional part of 1st value
+  % #3 dummy to swallow everthing after the 2nd '.'
+  % #4 integer part of 2nd value 
+  % #5 fractional part of 2nd value
+  % #6 dummy to swallow everthing after the 2nd '.'
+  %
+  \@readvalue\@xs\@xi\@xf{#1}{#2}%
+  \@readvalue\@ys\@yi\@yf{#4}{#5}%
+  %
+  \ifnum\@xs<\@ys% 
+    \Rtesttrue% 
+  \else%
+    \ifnum\@xs>\@ys% 
+      \Rtestfalse%
+    \else%
+      \Rtestfalse%
+      \ifnum\@xi<\@yi \Rtesttrue \fi%
+      \ifnum\@xi=\@yi%
+	\multiply\@xf\@xs \multiply\@yf\@ys%
+	\ifnum\@xf<\@yf \Rtesttrue \fi% 
+      \fi%
+    \fi%
+  \fi%
+  %
+  \ifRtest%
+}
+
+%%	\Rifeq<value><value>		Test v1 = v2
+\def\Rifeq#1#2{\@callb\@Rifeq{#1}{#2}}
+
+\def\@Rifeq#1.#2.#3\relax#4.#5.#6\relax{%
+  % #1 integer part of 1st value 
+  % #2 fractional part of 1st value
+  % #3 dummy to swallow everthing after the 2nd '.'
+  % #4 integer part of 2nd value 
+  % #5 fractional part of 2nd value
+  % #6 dummy to swallow everthing after the 2nd '.'
+  %
+  \@readvalue\@xs\@xi\@xf{#1}{#2}%
+  \@readvalue\@ys\@yi\@yf{#4}{#5}%
+  %
+  \Rtestfalse%
+  \ifnum\@xi=\@yi\ifnum\@xf=\@yf \Rtesttrue \fi\fi%
+  \ifRtest%
+}
+
+%%	\Rifgt<value><value>		Test v1 > v2
+\def\Rifgt#1#2{\@callb\@Rifgt{#1}{#2}}
+
+\def\@Rifgt#1.#2.#3\relax#4.#5.#6\relax{%
+  % #1 integer part of 1st value 
+  % #2 fractional part of 1st value
+  % #3 dummy to swallow everthing after the 2nd '.'
+  % #4 integer part of 2nd value 
+  % #5 fractional part of 2nd value
+  % #6 dummy to swallow everthing after the 2nd '.'
+  %
+  \@readvalue\@xs\@xi\@xf{#1}{#2}%
+  \@readvalue\@ys\@yi\@yf{#4}{#5}%
+  %
+  \ifnum\@xs>\@ys% 
+    \Rtesttrue% 
+  \else%
+    \ifnum\@xs<\@ys% 
+      \Rtestfalse% 
+    \else%
+      \Rtestfalse%
+      \ifnum\@xi>\@yi \Rtesttrue \fi%
+      \ifnum\@xi=\@yi% 
+	\multiply\@xf\@xs \multiply\@yf\@ys%
+	\ifnum\@xf>\@yf \Rtesttrue \fi% 
+      \fi%
+    \fi%
+  \fi%
+  %
+  \ifRtest%
+}
+
+%%	\Rifneg<value>			Test v < 0
+\def\Rifneg#1{\@calla\@Rifneg{#1}}
+
+\def\@Rifneg#1.#2.#3\relax{%
+  % #1 Integer part of value
+  % #2 Fractional part of value
+  % #3 dummy to swallow everthing after the 2nd '.'
+   %
+   \@readvalue\@xs\@xi\@xf{#1}{#2}%
+   %
+   \ifnum\@xs<0 \Rtesttrue \else \Rtestfalse \fi%
+   \ifRtest%
+ }
+
+%%	\Rifzero<value>			Test v = 0
+\def\Rifzero#1{\@calla\@Rifzero{#1}}
+
+\def\@Rifzero#1.#2.#3\relax{%
+  % #1 Integer part of value
+  % #2 Fractional part of value
+  % #3 dummy to swallow everthing after the 2nd '.'
+  %
+  \@readvalue\@xs\@xi\@xf{#1}{#2}%
+  %
+  \Rtestfalse%
+  \ifnum\@xi=\@zero \ifnum\@xf=\@zero \Rtesttrue \fi \fi%
+  \ifRtest%
+}
+
+%%	\Rifpos<value>			Test v >= 0
+%%					Take care to have a corresponding \fi
+\def\Rifpos#1{\@calla\@Rifpos{#1}}
+
+\def\@Rifpos#1.#2.#3\relax{%
+  % #1 Integer part of value
+  % #2 Fractional part of value
+  % #3 dummy to swallow everthing after the 2nd '.'
+  %
+  \@readvalue\@xs\@xi\@xf{#1}{#2}%
+  %
+  \ifnum\@xs<0 \Rtestfalse \else \Rtesttrue \fi%
+  \ifRtest%
+}
+
+%%	\Rifint<value>			Test v is an integer value
+%%					Take care to have a corresponding \fi
+\def\Rifint#1{\@calla\@Rifint{#1}}
+
+\def\@Rifint#1.#2.#3\relax{%
+  % #1 Integer part of value
+  % #2 Fractional part of value
+  % #3 dummy to swallow everthing after the 2nd '.'
+  %
+  \@readvalue\@xs\@xi\@xf{#1}{#2}%
+  %
+  \ifnum\@xf=0 \Rtesttrue \else \Rtestfalse \fi%
+  \ifRtest%
+}
+
+% Utility macros
+
+\def\@calla#1#2{%
+  % #1 Macro to call
+  % #2 Value
+  % Expand the value and split them into the integer and the fractional part
+  \edef\next{\noexpand#1#2..\noexpand\relax}%
+  \next%
+}
+
+\def\@callb#1#2#3{%
+  % #1 Macro to call
+  % #2 1st value
+  % #3 2nd value
+  % Expand the values and split them into the integer and the fractional parts 
+  \edef\next{\noexpand#1#2..\noexpand\relax#3..\noexpand\relax}%
+  \next%
+}
+
+\def\@callc#1#2#3#4{%
+  % #1 Macro to call
+  % #2 Macro, witch gets the result
+  % #3 1st value
+  % #4 2nd value
+  % Expand the values and split them into the integer and the fractional parts
+  \edef\next{\noexpand#1\noexpand#2#3..\noexpand\relax#4..\noexpand\relax}%
+  \next%
+}
+
+%% 	\ifRtest ... \else ... \fi	Re-execute the last test
+\newif\ifRtest
+
+%
+% Read value
+%
+\def\@readvalue#1#2#3#4#5{%
+  % #1	  macro to catch the sign ( -1 or 1 )
+  % #2	  macro to catch the integer part (maybe negative)
+  % #3	  macro to catch the fractional part (positive)
+  % #4.#5 value
+  %
+  % Regular expression [-...d]d...["."[d...]]
+  % Attention: There has to be at least one digit between "-" and "."!
+  %
+  % Integer part
+  \if !#4! #2=\@zero \else #2=#4 \fi%
+  %
+  % Sign
+  \ifnum#2<\@zero #1=-\@ne \else #1=\@ne \fi%
+  \ifnum#2=\@zero \ifnum #4#5<\@zero #1=-\@ne \fi \fi%
+  %
+  % Fractional part
+  \if !#5!% 
+    #3=\@zero%
+  \else%
+    \@@setcount@#5000000000\relax%
+    #3=\count@%
+  \fi%
+}
+
+% Set count@ to fractional part with trailing zeros
+\def\@@setcount@#1#2#3#4#5#6#7#8#9{%
+  % #1...#9 fractional part, padded with '0'
+  \count@=#1#2#3#4#5#6#7#8#9%
+  \@swallow%
+}
+
+% Swallow everything up to next \relax
+\def\@swallow#1\relax{}
+
+%
+% Store result 
+%
+\def\@store#1#2#3{%
+  % #1 marcro to catch the result
+  % #2 counter with integer part (maybe negative)
+  % #3 counter with fractional part (maybe negative}
+  % 
+  % Sign
+  \edef#1{}%
+  \count@=#3%
+  \ifnum\count@<\@zero% 
+    \count@=-\count@%
+    \ifnum#2=\@zero% 
+      \edef#1{-}%
+    \fi%
+  \fi%
+  %
+  % Pad fractional part with leading zeros
+  \advance\count@\@mil%
+  %
+  % Store result 
+  \edef#1{#1\number#2.\expandafter\@ignorenext\number\count@}%
+}
+
+% Ignore next token
+\def\@ignorenext#1{}
+
+% Restore catcode of "@"
+\catcode`\@=\catamp