2
2

Ich habe lange nach einer flexiblen Lösung für Rechnungen gesucht und mir dabei folgende Lösung gestrickt, die ich hier vorstellen möchte:

Open in Online-Editor
\documentclass[parskip=half]{scrlttr2}
%Spracheinstellungen
\usepackage{polyglossia}
\setdefaultlanguage[spelling = new]{german}
\usepackage{blindtext, xltxtra}    %The xltxtra-package automatically loads the following packages: fixltx2e, metalogo, xunicode, fontspec

% zum Rechnen in Tabellen
\usepackage{fp, xstring, spreadtab, numprint}
% Um das Euro-Symbol typografisch korrekt auszugeben und es rechts vom Betrag zu stellen, wird das Paket eurosym mit der Option [right] geladen

\usepackage[right]{eurosym}

%Mit den folgenden Optionen wird bei der PDF-Ausgabe des LaTeX-Dokuments der englische Dezimalpunkt als Dezimalkomma ausgegeben.

\STsetdecimalsep{,} % Werte müssen weiterhin mit Punkt geschrieben sein, Ausgabe erfolgt mit Komma
\STautoround*{2} % auf 2 Ziffern runden

% Jetzt werden die Variablen definiert, die durch den Befehl \usekomavar expandiert werden können. Aber innerhalb der Umgebung spreadtab funktioniert das in der Tabelle für Berechnungen nicht. Dank der dante-Mailingliste muss einfach nur eine weitere Variable angelegt werden, in der das Token bereits expandiert gespeichert werden kann. Das erfolgt durch den Befehl \usekomavar[\def\nstundensatz]{stundensatz}. Der Inhalte der Variablen "stundensatz" kann also mit \usekomavar{stundensatz} oder mit \nstundensatz ausgegeben werden.

\newkomavar{leistung}
\setkomavar{leistung}{September}
\newkomavar{stunden}
\setkomavar{stunden}{67.89}
\usekomavar[\def\nstunden]{stunden}
\newkomavar{stundensatz}
\setkomavar{stundensatz}{12.34}
\usekomavar[\def\nstundensatz]{stundensatz}
\newkomavar{mwst}
\setkomavar{mwst}{19}
\usekomavar[\def\nmwst]{mwst}
\setkomavar{invoice}{xxyyzz-2013}
\newkomavar{bank} \setkomavar{bank}{Meine Bank\\BLZ 123 456 78\\Kontonummer 123 456 789 00}

%Nun der eigentliche Brief - die Rechnung:

\begin{document}
\begin{letter}{Firma Freundlich\\Rechnugstraße 12\\45678 Ortsname}
\opening{Sehr geehrte Damen und Herren,}
Wir erbrachten im Monat \usekomavar{leistung} folgende Leistungen:

% Hier nun die rechnende Tabelle (Die Option [\STsavecell\gesamtsumme{c3}]) speichert das Endergebnis (Zelle c3 der Tabelle), um das Ergebnis auch außerhalb der Tabelle verwenden zu können):

% Die Zahlwerte werden in :={Variable oder Zahlwert} gesetzt; so kann "spreadtab" zwischen Text und Zahlwerten unterscheiden. Bleibt :={} leer, wird das als leerer Zahlwert (0) verstanden, der jedoch nicht ausgegeben wird.
\begin{spreadtab}[\STsavecell\gesamtsumme{c3}]{{tabular}{p{55mm}p{41mm}r}}  
:={\nstunden} Stunden   für dies und das &  à \EUR{:={\nstundensatz}}       &   \EUR{\numprint{:={a1*b1}}}\\
:={}                    &  zuzüglich :={}19\,\% USt.        &   \EUR{\numprint{:={\nmwst*(c1)/100}}}\\
:={}                    &   :={}Summe                       &   \EUR{\numprint{:={c1+c2}}}\\ 
\end{spreadtab}

Bitte überweisen Sie den Rechnungsbetrag von \EUR{\numprint{\gesamtsumme}} unter Angabe der Rechnungsnummer \usekomavar{invoice} auf das Konto:

\usekomavar{bank}
\closing{Mit freundlichen Grüßen}   
\end{letter}
\end{document}

Für Anregungen und Kritik jetzt schon vielen Dank!

gefragt 24 Mai '14, 01:49

RMF's gravatar image

RMF
123138
Akzeptiert: 20%

bearbeitet 02 Jun '15, 10:13

esdd's gravatar image

esdd
14.2k53251

4

@RMF Vielleicht wäre es besser, wenn du wirklich eine Frage stellst, in der du die Anforderungen angibst, die die Rechnung erfüllen soll. Deine Lösung könntest du dann als eine mögliche Antwort angeben, zu der Anregungen und Kritik als Kommentar möglich sind. Vielleicht hat jemand anders dann noch einen Alternativvorschlag, den er in einer weiteren Antwort vorstellen könnte.

(24 Mai '14, 03:32) esdd

Sorry, ich dachte nur, dass das was ich mir über viel Recherche zusammengetragen hatte, hier vielleicht interessant sein könnte. Soll ich das hier wieder löschen?

(24 Mai '14, 04:33) RMF
3

@RMF Nein, Du sollst es nicht löschen. Es wäre nur schön, wenn Du es zu einer archiv-Frage und einer Antwort (das oben ist im Prinzip die Antwort ohne die zugehörige Frage) umarbeiten würdest. Das hätte auch den Vorteil, dass leichter weitere Antworten dazu gegeben werden können und dann Deine Antwort in den bewerteten Antworten anderer nicht unter geht. Außerdem bekommst Du dann Punkte sowohl für die Frage als auch für die Antwort. ;) So wie es ist, ist es zwar eine schöne Antwort, ich kann dem aber keine Punkte für eine schöne Frage geben.

(24 Mai '14, 05:24) Bes

@RMF Sehr guter Beitrag! Die Auftrennung in Frage (Anforderungen) und Antwort (Deine Lösung) ist nur eine Formsache, der Funktion von TeXwelt entsprechend, wie @Bes schon schrieb. Im Optimalfall kommen dann weitere Antworten mit Lösungen, die sich auf die Anforderungen beziehen (flexible Rechnungsvorlage) und ganz anders sein könnten, mehr als nur den gezeigten Code zu kommentieren.

(24 Mai '14, 07:11) stefan ♦♦

Grundsätzlich ist die Verwendung einer Tabelle übrigens bei längeren Rechnungen etwas problematisch. Zwar könnte man theoretisch eine longtable verwenden, tatsächlich hätte man dann aber in der Regel gerne Zwischensummen und Überträge. Die gehen aber nicht so einfach mit longtable weil Köpfe und Füße von longtable in einer Box abgelegt werden und sich daher nicht einfach von Seite zu Seite ändern können. AFAIK hat @Ulrike da vor Jahren mal etwas gebastelt. Ich selbst habe auch mal einen Ansatz mit festen Spaltenbreiten und ohne longtable verfolgt. Finde das aber gerade nicht.

(24 Mai '14, 12:03) Bes
1

In der DTK 2/2011 gibt es ab Seite 36 außerdem einen Artikel zum Erstellen einer Rechnung als Brief mit LuaLaTeX, allerdings ebenfalls ohne Seitenumbruch innerhalb der Tabelle.

(24 Mai '14, 12:20) esdd

Gibt es bei LuaLaTeX nicht die Möglichkeit, den Seitenumbruch mit einem callback zu erkennen und ggf. so Zwischensumme und Übertrag einzuschleusen?

Eine weitere Möglichkeit wäre eventuell den Seitenstil dafür zu verwenden. Das würde natürlich voraussetzen, dass man daraus auf die aktuelle Summe zugreifen kann.

(24 Mai '14, 12:25) Bes

Rechnungen mit LaTeX zu schreiben hat nur Sinn, wenn man Zwischensummen und Vorträge automatisch am Seitenumbruch erhält. Soweit ich weiß, sind die einzigen praktikablen Lösungen hier: http://tex.stackexchange.com/questions/151380/how-to-print-subtotals-in-each-page-of-a-long-table

(04 Jun '15, 04:27) Keks Dose
Ergebnis 5 von 8 Alle anzeigen

Ich nutze diese Gelegenheit um hier den Code für ein kleines Paket vorzustellen, das ich mal gebastelt habe. Inspiriert von invoice.sty.

rechnung.sty

Open in writeLaTeX
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{rechnung}

\RequirePackage{fp}
\RequirePackage{calc}
\RequirePackage{array}
\RequirePackage{booktabs}

% Commas instead of dot in mathmode
\mathchardef\period=\mathcode`.
\DeclareMathSymbol{.}{\mathord}{letters}{"3B}

\newcounter{invoice@cost}
\newcounter{invoice@vat}

\newcommand*{\format@float}[1]{\FPround{\invoice@t}{#1}{2}$\invoice@t$}
\newcommand*{\format@int}[1]{$#1$}
\newcommand*{\total}[1]{\FPdiv{\invoice@t}{\arabic{#1}}{1000}\format@float{\invoice@t}}
\newcommand*\textPosten{\bfseries Posten}
\newcommand*\textPreis{St\"uckpreis}
\newcommand*\textAnzahl{Anzahl}
\newcommand*\textBetrag{Betrag}

\newenvironment*{invoice}[1]{
  \setcounter{invoice@cost}{0}
  \setcounter{invoice@vat}{0}
  \def\invoice@VATval{#1}%
  % 
  \newcommand*{\Fee}[3]{%
    \addtocounter{invoice@cost}{1000 * \real{##2} * \real{##3}}%
    \addtocounter{invoice@vat}{10 * \real{#1} * \real{##2} * \real{##3}}%
    {##1} & \format@float{##2} & \format@int{##3} & \FPmul{\invoice@cost}{##2}{##3}\format@float{\invoice@cost} \cr%
  }%
  % 
  ~\par\noindent
  \begin{tabular}{p{\dimexpr0.49\linewidth-2\tabcolsep}*{3}{>{\hfill}p{\dimexpr0.17\linewidth-2\tabcolsep}}}%
    \toprule%
    {\textPosten} & {\textPreis} & {\textAnzahl} & {\textBetrag} \cr%
    \midrule%
  }{%
    \if\invoice@VATval0\else%
    \midrule%
    {Zwischensumme} & & & {\total{invoice@cost}} \cr%
    {MWSt. (\invoice@VATval\,\%)} & & & {\total{invoice@vat}} \cr%
    \fi%
    \midrule%
    \setcounter{invoice@cost}{\theinvoice@cost + \theinvoice@vat}%
    {\bfseries Summe} & & & {\boldmath \total{invoice@cost}} \cr%
    \bottomrule%
  \end{tabular}%
  \par~%
}

Beispieldokument

Open in writeLaTeX
\documentclass{scrlttr2}
\KOMAoptions{enlargefirstpage=true}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenx}
\usepackage{rechnung}
\setkomavar{fromname}{Max Mustermann}
\setkomavar{fromaddress}{Musterstraße 1\\12345 Musterstadt}
\begin{document}
\setkomavar{subject}{Rechnung}
\begin{letter}{Martina Mustermann\\Musterweg 7\\98765 Musterdorf}
  \opening{Sehr geehrte Frau Mustermann,}
  Bezahl oder stirb!

  \renewcommand*\textPreis{Stundensatz}
  \renewcommand*\textAnzahl{Stunden}
  \begin{invoice}{19}% 19% MwSt.
    \Fee{Dies und das}{34.50}{10}
    \Fee{Boden wischen}{14.95}{1000}
  \end{invoice}

  \begin{invoice}{0}% Mehrwertsteuer inbegriffen
    \Fee{Dies und das}{34.50}{10}
    \Fee{Boden wischen}{14.95}{1000}
  \end{invoice}
  \closing{Mit freundlichen Grüßen}
\end{letter}
\end{document}

alt text

Permanenter link

beantwortet 24 Mai '14, 07:26

Henri's gravatar image

Henri
10.0k31730

Eine weitere Möglichkeit wäre die Nutzung des datatool Paketes:

Open in Online-Editor
\documentclass[parskip=full-,enlargefirstpage=true]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage[ngerman]{babel}

\usepackage{tabularx}
\usepackage{booktabs}

\usepackage{numprint}
\nprounddigits{2}

\usepackage[right]{eurosym}

\usepackage{datatool}
\DTLnewdb{rechnung}

\newcommand\Posten[3]{%
  \DTLnewrow{rechnung}
  \DTLnewdbentry{rechnung}{Bezeichnung}{#1}
  \DTLnewdbentry{rechnung}{Anzahl}{#2}
  \DTLnewdbentry{rechnung}{EP}{#3}
  {\dtlexpandnewvalue
    \FPeval\fpresult{round(#2*#3)(2)}
    \DTLnewdbentry{rechnung}{GP}{\fpresult}
  }
}

\newcommand\mwst{}

\newenvironment{rechnung}[1]{%
  \renewcommand\mwst{#1}%
  \DTLcleardb{rechnung}%
}{%
  %\DTLsumforkeys{rechnung}{GP}{\Zwischensumme}% liefert Fehler bei Zwischensummen ab 1000
  % Alternative
  \def\Zwischensumme{0}%
  \DTLforeach*{rechnung}{\gp=GP}{\FPeval\Zwischensumme{\Zwischensumme+\gp}}%
  %
  \FPeval\MWSt{round(\mwst*\Zwischensumme/100)(2)}%
  \FPeval\Summe{round(\Zwischensumme+\MWSt)(2)}%
  \xdef\Summe{\Summe}%
  \par\centering
  \begin{tabularx}{\textwidth}{Xrrr}
    \toprule
    Bezeichnung&Anzahl&Einzelpreis&Gesamtpreis
    \DTLforeach*{rechnung}{\bez=Bezeichnung,\anz=Anzahl,\ep=EP,\gp=GP}{%
      \DTLiffirstrow{\\\midrule}{\\}%
      \bez&\npnoround\numprint{\anz}\nprounddigits{2}&\numprint{\ep}&\numprint{\gp}%
    }\\
    \midrule
    \if\mwst0\else
      Zwischensumme&&&\numprint{\Zwischensumme}\\
      Mehrwertsteuer (\mwst\,\%)&&&\numprint{\MWSt}\\
      \midrule
    \fi
    Summe&&&\numprint{\Summe}\\
    \bottomrule
  \end{tabularx}
  \par
}

\setkomavar{fromname}{Max Mustermann}
\setkomavar{fromaddress}{Musterstraße 1\\12345 Musterstadt}
\newkomavar{bank} 
\setkomavar{bank}{Meine Bank\\BLZ 123 456 78\\Kontonummer 123 456 789 00}

\renewcommand\raggedsignature{\raggedright}

\begin{document}

\begin{letter}{Firma Freundlich\\Rechnungstraße 12\\45678 Ortsname}
\setkomavar{invoice}{xxyyzz-2013}

\opening{Sehr geehrte Damen und Herren,}

hiermit berechnen wir

\begin{rechnung}{19}
  \Posten{Material}{2}{24.95}
  \Posten{weiteres Material}{8}{18}
  \Posten{Arbeitsstunden}{0.75}{30.50}
\end{rechnung}

Bitte überweisen Sie den Rechnungsbetrag von \EUR{\numprint{\Summe}} unter Angabe von Rechnungsnummer und -datum auf das folgende Konto:

\usekomavar{bank}

\closing{Mit freundlichen Grüßen}   
\end{letter}
\end{document}

alt text

Permanenter link

beantwortet 24 Mai '14, 11:56

esdd's gravatar image

esdd
14.2k53251

bearbeitet 04 Jun '15, 09:48

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×73
×3

Frage gestellt: 24 Mai '14, 01:49

Frage wurde angeschaut: 13,381 Mal

Zuletzt aktualisiert: 04 Jun '15, 09:48