Skip to content
Snippets Groups Projects
Commit 52225a71 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

Add latex files for doing an invoice
parent 1cd4d6e3
No related branches found
No related tags found
No related merge requests found
clean:
rm -f *.aux *.out *.bbl *.toc *.lof *.lot *.log *.blg *.dvi *.idx *.ind *.ilg\
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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
%% 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment