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!
Ergebnis 5 von 8
show 3 more comments
|
Eine weitere Möglichkeit wäre die Nutzung des 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} beantwortet 24 Mai '14, 17:56 esdd |
Ich nutze diese Gelegenheit um hier den Code für ein kleines Paket vorzustellen, das ich mal gebastelt habe. Inspiriert von
|
Hallo, wie bekommt man hier noch die Rechnungsposition eingebaut? Das Beispiel gefällt mir sehr gut. beantwortet 25 Feb, 21:49 wdwiizh Willkommen auf TeXwelt.de! Hm, das ist jetzt keine Antwort auf die Frage, ist aber als "Antwort" gepostet. Willst Du es vllt. als "Kommentar" zur Frage posten? Oder als eigene Frage? (btw. was "die Rechnungsposition" hier sein soll, sehe ich gerade nicht)
(25 Feb, 21:57)
stefan ♦♦
|
Hallo, es sollte eine Frage zum letzten Beispiel sein. Material wäre Position 1 weiteres Material Pos. 2 Arbeitsstunden Pos. 3 Grüße und Danke für die schnelle Reaktion. beantwortet 25 Feb, 22:00 wdwiizh naja, Du hast es jetzt formal als weitere Antwort auf die Frage gepostet, und nicht als Kommentar (Frage) zum letzten Beispiel (k.A. welches)
(25 Feb, 22:03)
stefan ♦♦
|
@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.
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?
@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.
@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.
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 mitlongtable
weil Köpfe und Füße vonlongtable
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 ohnelongtable
verfolgt. Finde das aber gerade nicht.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.
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.
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