--- /dev/null
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% File: invoice.def
+% Author: Oliver Corff
+% Date: 2003-12-12
+%
+% This file contains messages, labels etc. in English, German
+% and other languages.
+%
+% 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 275 of this file, and, please!,
+% do not forget to send the result to
+%
+% corff@zedat.fu-berlin.de or oliver.corff@email.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, Shanghai 2003
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 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\invoice@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 \Project}%
+ \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\invoice@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\invoice@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 \Project}%
+ \def\Total {Total}%
+\fi\fi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This is Afrikaans.
+%
+\ifx\l@afrikaans\undefined
+ \message{^^J(invoice) \Warning:
+ Language \string\l@afrikaans\space unknown.^^J^^J}
+\else
+\ifnum\number\invoice@language=\number\l@afrikaans
+ \def\Warning {Waarskuwing}
+ \def\Error {Fout}
+ \def\Expense {Onkostes}
+ \def\Amount {Bedrag}
+ \def\Currency {Valuta}
+ \def\Factor {Faktor}
+ \def\Activity {Aktiwiteit}
+ \def\Count {Aantal ure}
+ \def\UnitRate {Tarief}
+ \def\Fees {Fooie}
+ \def\VAT {BTW}
+ \def\Expenses {Uitgawes}
+ \def\SumFees {Totaal Fooie}
+ \def\SumVAT {Totaal BTW}
+ \def\SumExpenses {Totaal Uitgawes}
+ \def\SubtotalFee {Subtotaal \Fees}
+ \def\SubtotalExpenses {Subtotaal \Expenses}
+ \def\SubtotalProject {Subtotaal \Project}
+ \def\Total {Totaal}
+\fi\fi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This is Italian.
+%
+\ifx\l@italian\undefined
+ \message{^^J(invoice) \Warning:
+ Language \string\l@italian\space unknown.^^J^^J}
+\else
+\ifnum\number\invoice@language=\number\l@italian
+ \def\Warning {Avvertenza}%
+ \def\Error {Errore}%
+ \def\Expense {Spesa}%
+ \def\Amount {Ammontare}%
+ \def\Currency {Valuta}%
+ \def\Factor {Fattore}%
+ \def\Activity {Attivit\'a}%
+ \def\Count {Quantit\'a}%
+ \def\UnitRate {Prezzo/Unit\'a}%
+ \def\Fees {Onorario}%
+ \def\VAT {IVA}%
+ \def\Expenses {Spese}%
+ \def\SumFees {Totale onorario}%
+ \def\SumVAT {Totale IVA}%
+ \def\SumExpenses {Totale spese}%
+ \def\SubtotalFee {Subtotale onorario}%
+ \def\SubtotalExpenses {Subtotale spese}%
+ \def\SubtotalProject {Subtotale progetto}%
+ \def\Total {Totale}%
+\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 or oliver.corff@email.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\invoice@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
--- /dev/null
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Datei: invoice.sty
+% Autor: Oliver Corff
+% Contact: corff@zedat.fu-berlin.de, oliver.corff@email.de
+% Datum: December 16, 2003
+% Version: 0.7
+% Copyright: Ulaanbaatar, Beijing, Berlin, Zagreb, Shenyang, Shanghai
+% Description: This collection of macros provides
+% tools for generating complex invoices
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Corrections, suggestions and contributions by:
+%%%%%%
+% Jacopo, May 2003
+% e-mail: jacopo@
+%
+% Contributed labels in Italian.
+%
+%%%%%%
+% O. Corff, July 2003
+%
+% fixed one nasty spacing bug, simplified internal table
+% construction (table now has five instead of six columns,
+% the second of which was never used).
+%
+%%%%%%
+% Johann Spies, January 21, 2002
+% e-mail: jspies@sun.ac.za
+%
+% Hinted that \Subtotal Project should show the project name
+% rather than just `Project'.
+%
+% Contributed labels in Afrikaans.
+%
+%%%%%%
+% 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}[2003/12/16]
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% ------------------- language options -------------------
+%
+%
+\newcount\invoice@language
+\let\invoice@language=\language
+%
+\ifx\l@english\undefined \newlanguage\l@english \fi
+\ifx\l@german\undefined \newlanguage\l@german \fi
+\ifx\l@dutch\undefined \newlanguage\l@dutch \fi
+\ifx\l@french\undefined \newlanguage\l@french \fi
+\ifx\l@afrikaans\undefined \newlanguage\l@afrikaans \fi
+\ifx\l@italian\undefined \newlanguage\l@italian \fi
+%
+\DeclareOption{english}{\invoice@language=\number\l@english}
+\DeclareOption{german}{\invoice@language=\number\l@german}
+\DeclareOption{dutch}{\invoice@language=\number\l@dutch}
+\DeclareOption{french}{\invoice@language=\number\l@french}
+\DeclareOption{afrikaans}{\invoice@language=\number\l@afrikaans}
+\DeclareOption{italian}{\invoice@language=\number\l@italian}
+%
+\ProcessOptions
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% ------------------- initial code -------------------
+%
+\RequirePackage{ifthen}
+\RequirePackage{longtable}
+\RequirePackage{calc}
+\input{realcalc}
+\input{invoice.def}
+%
+\newcommand{\InvoiceVersion}{0.7}%
+\newcounter{Fee} %
+\newcounter{VAT} %
+%\newcounter{VAT@rate} %
+\newcounter{Expenses} %
+\newcounter{Discount} % Discount item
+\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
+%
+\gdef\Project{}% % Empty Project Name
+\def\Null{0}%
+\newif\ifVATnonzero
+% \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{Fee@ctr}{0}% % reset counter
+ \setcounter{Expense@ctr}{0}% % reset counter
+ \def\Null{0}%
+ \setcounter{Project}{0}%
+ \ST@Reset\Total@Reset%
+ \def\BC{#1}%
+ \def\VAT@rate{#2}%
+ \ifx\VAT@rate\Null\VATnonzerofalse\else\VATnonzerotrue\fi%
+ \ifVATnonzero
+ \message{^^J^^JVAT is not zero!^^J^^J}%
+ \else
+ \message{^^J^^JVAT is zero!^^J^^J}%
+ \fi%
+ % 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}lrrr}%
+ %
+ \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 \ST@Fee\ST@Project\fi%
+ \Tot@l%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 4: Print subtotal remuneration
+ %
+ \ifnum\theProject>1 \ST@Project\fi%
+ \Tot@l%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 5: Expense item
+ %
+ \ifnum\theProject>1 \ST@Expenses\ST@Project\fi%
+ \Tot@l%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 6: Print subtotal expenses
+ %
+ \ifnum\theProject>1 \ST@Project\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
+ %\gdef\NewProject{#1}
+ %
+ \ifcase\Flag% 0: Invoice not started yet
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 1: Start invoice
+ %
+ \Project@Title{#1}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 2: Start project, print title
+ %
+ \error@message{\NoProjectNesting}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 3: Print remuneration item
+ %
+ \ST@Fee%
+ \ST@Project%
+ \Project@Title{#1}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 4: Print subtotal remuneration
+ %
+ \ST@Project%
+ \Project@Title{#1}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 5: Expense item
+ %
+ \ST@Expenses%
+ \ST@Project%
+ \Project@Title{#1}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 6: Print subtotal expenses
+ %
+ \ST@Project%
+ \Project@Title{#1}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 7: Print subtotal project
+ %
+ \Project@Title{#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
+ %
+ \Print@ST@Fees%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \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
+ %
+ \ST@Fee%
+ \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{\EBCi}[2]{% Yields state 5: Expenses in BaseCurrency
+ % But, unlike base form (no
+ % 'invisible') this version does
+ % not state the item, it only
+ % the total amount of expenses.
+ %
+ % #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@Base@Currency{#1}{#2}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 3: Print remuneration item
+ %
+ \ST@Fee%
+ %\Expense@Title%
+ \Expense@Base@Currency{#1}{#2}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 4: Print subtotal remuneration
+ %
+ %\Expense@Title%
+ \Expense@Base@Currency{#1}{#2}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 5: Expense item
+ %
+ \Expense@Base@Currency{#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
+ %
+ \ST@Fee%
+ \Expense@Title%
+ \Expense@ForeignCurrency{#1}{#2}{#3}{#4}{#5}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 4: Print subtotal remuneration
+ %
+ \Expense@Title%
+ \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{\EFCi}[5]{% Yields state 5: Expenses in ForeignCurrency
+ % But, unlike base form (no
+ % 'invisible') this version does
+ % not state the item, it only
+ % the total amount of expenses.
+ %
+ % #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@Foreign@Currency{#1}{#2}{#3}{#4}{#5}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 3: Print remuneration item
+ %
+ \ST@Fee%
+ % \Expense@Title%
+ \Expense@Foreign@Currency{#1}{#2}{#3}{#4}{#5}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 4: Print subtotal remuneration
+ %
+ % \Expense@Title%
+ \Expense@Foreign@Currency{#1}{#2}{#3}{#4}{#5}%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 5: Expense item
+ %
+ \Expense@Foreign@Currency{#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
+ %
+ \Print@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
+ %
+ \ST@Fee%
+ \ST@Project%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 4: Print subtotal remuneration
+ %
+ \ST@Project%
+ %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \or % 5: Expense item
+ %
+ \ST@Expenses%
+ \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{\Discount}[2]{% Yields no particular state.
+ % Inserts discount in project total,
+ % names discount reason
+ % and amount of discount
+ %
+ \gdef\Discount@Contents{#1}%
+ \setcounter{Discount}{100 * \real{-#2}}%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\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{\Project@Title}[1]{%
+ % Internal command called by \ProjectTitle.
+ %
+ \gdef\Flag{2}%
+ \gdef\Project{#1}%
+ \ST@Reset\addtocounter{Project}{1}%
+ \ifnum\theProject>1 \\\\\else\\\fi%
+ \multicolumn{5}{c}{\textbf{\large#1}}\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Fee@Title}{%
+ \\
+ \noindent\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 &   &
+%
+% 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
+ {\Print@ST@Fees% % print it, else
+ }%
+ {}% % do nothing
+ \ifVATnonzero\ST@VAT@Printout\fi%
+ \fi%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Print@ST@Fees}{%
+ \gdef\Flag{4}%
+ \SubtotalFee & & & &% print the subtotal of fees
+ \Print@Value{\theST@Fee}\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\ST@VAT@Printout}{%
+ \VAT\ (\VAT@rate\%) & & & &%
+ \setcounter{ST@VAT}{\theST@Fee * \real{\VAT@rate} / 100}%
+ \Print@Value{\theST@VAT}\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Expense@BaseCurrency}[2]{%
+ #1 & \BC & & &%
+ \gdef\Flag{5}%
+ \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@Base@Currency}[2]{%
+ \gdef\Flag{5}%
+ \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
+ & & & & \\[-1.2em]% This is an ugly kludge:
+ % Inserting an empty line
+ % which rolls backwards
+ % makes disappear the spurious
+ % spaces caused by external
+ % routines.
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\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}%
+ \addtocounter{Expense@ctr}{1}%advance counter
+ \Print@Value{\theOne@Expense}%
+\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Expense@Foreign@Currency}[5]{%
+ \gdef\Flag{5}%
+ %
+ % Folgende Angaben sind moeglich:
+ % 1. {Contents}{Currency}{Amount}{Umrechnung}{ }
+ % 2. {Contents}{Currency}{Amount}{ }{BaseCurrency}
+ % 3. {Contents}{Currency}{Amount}{Umrechnung}{BaseCurrency}
+ %
+ \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}%
+ \addtocounter{Expense@ctr}{1}%advance counter
+ & & & & \\[-1.2em]% ugly kludge as above
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\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 Expense line
+ {\Print@ST@Expenses}% % print it, else
+ {}% % do nothing
+ \fi%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Print@ST@Expenses}{%
+ \gdef\Flag{6}%
+ & & & & \\[-1.2em]% ugly kludge as above
+ \SubtotalExpenses & & & &% print the subtotal of expenses
+ \Print@Value{\theST@Expenses}\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\ST@Project}{%
+ \gdef\Flag{7}%
+ \\
+ %\multicolumn{4}{l}{\SubtotalProject}%
+ %\let\Project\NewProject%
+ %&
+ \SubtotalProject & & & &
+ \addtocounter{ST@Project}{\theST@Fee}%
+ \addtocounter{ST@Project}{\theST@VAT}%
+ \addtocounter{ST@Project}{\theST@Expenses}%
+ \Print@Value{\theST@Project}\\
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Total@VAT@Printout}{%
+ \setcounter{VAT}{\theFee*\real{\VAT@rate}/100}%
+ \SumVAT & & & &\Print@Value{\theVAT}\\%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\Tot@l}{%
+ \\\hline
+ \ifnum\theFee>0 \SumFees& & & &%
+ \Print@Value{\theFee}\\
+ \ifVATnonzero%
+ \Total@VAT@Printout%
+ \fi%
+ \fi%
+ \ifnum\theExpenses>0 \SumExpenses& & & &%
+ \Print@Value{\theExpenses}\\
+ \fi%
+ \ifnum\theDiscount=0 \else \Discount@Contents& & & &%
+ \Print@Value{\theDiscount}\\
+ \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}%
+ \ifnum\theDiscount=0 \else %
+ \addtocounter{Total}{\theDiscount}%
+ \message{^^J\Discount@Contents: }\Message@Value{\theDiscount}%
+ \fi %
+ \textbf{\Print@Value{\theTotal}}%
+ \message{^^J\Total: }%
+ \Message@Value{\theTotal}\message{^^J^^J}\\%
+ \end{longtable}
+ \end{center}
+ \gdef\Flag{8}%
+}
+\endinput
+% vim:ts=4:sw=4
--- /dev/null
+%% 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