Ich würde bei folgendem MWE gerne Folgendes erreichen:

  • In Spalte 2 soll immer als Einheit h für Stunde gesetzt werden, wenn nicht "pauschal" ausgegeben wird
  • In Spalte 3 soll immer als Einheit €/h gesetzt werden, wenn nicht "pauschal" ausgegeben wird
  • In Spalte 4 soll immer als Einheit € ausgegeben werden

wobei die Zahlen einer Spalte jeweils am Komma ausgerichtet werden sollen.

Vielen Dank für Vorschläge!

Open in Online-Editor
\documentclass{scrartcl}% Klasse: scrartcl, scrreprt, scrbook, scrletter

\usepackage[ngerman]{babel}
  \defineshorthand{"`}{}
  \defineshorthand{"'}{}

\usepackage{luaotfload}

\usepackage[urw-garamond]{mathdesign}
\usepackage[no-math]{fontspec}%

\usepackage{tabu}
\usepackage{siunitx}
\usepackage{datatool}
% Setup
  \DTLnewdb{rechnung}
\usepackage{ifthen}
\usepackage{eurosym}
\usepackage{ifpdf}
\usepackage{amstext}
\usepackage{etoolbox}
\usepackage{multirow}
\usepackage{calc}
\usepackage{booktabs}
\usepackage{dcolumn}
\usepackage{numprint}
    % Setup
      \nprounddigits{2} \npprintnull \npthousandsep{\,}
%      \newcolumntype{d}[1]{D{,}{,}{#1}}
      \newcommand{\mc}[1]{\multicolumn{1}{c}{#1}}

\makeatletter 
    \let\npunitcommand\@firstofone
    \def\usermacro#1{\numprint[\euro]{\zap@space #1 \@empty}}
    \def\usermacroo#1{\numprint[\euro/h]{\zap@space #1 \@empty}}
\makeatother

\def\useraa#1{\SI[%
  group-four-digits=true, round-mode=places, round-precision=2, round-integer-to-decimal=true, per-mode=symbol]{#1}{\hour}}

\def\userbb#1{\SI[group-four-digits=true, round-mode=places,
round-precision=2, round-integer-to-decimal=true, per-mode=symbol]{#1}{\euro\per\hour}}

\def\usercc#1{\SI[group-four-digits=true, round-mode=places,
round-precision=2, round-integer-to-decimal=true, per-mode=symbol]{#1}{\euro}}

\newcommand\Posten[4][]{%
  \DTLnewrow{rechnung}%
  \DTLnewdbentry{rechnung}{Bezeichnung}{#2}%
  \if\relax\detokenize{#1}\relax%
    \DTLnewdbentry{rechnung}{Anzahl}{#3}%
    \DTLnewdbentry{rechnung}{EP}{#4}%
    {\dtlexpandnewvalue%
      \FPeval\fpresult{round(#3*#4)(2)}%
      \DTLnewdbentry{rechnung}{GP}{\fpresult}%
    }%
  \else%
    \DTLnewdbentry{rechnung}{Anzahl}{pauschal}%
    \DTLnewdbentry{rechnung}{EP}{#4}%
    \DTLnewdbentry{rechnung}{GP}{#1}%
  \fi%
}

\newcommand\mwst{}

\newenvironment{rechnung}[1]{%
  \renewcommand\mwst{#1}%
  \DTLcleardb{rechnung}%
  }{%
  % 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{tabu} {X[4,j] *3{>{\tabudecimal\usermacro}X[r]}}%
  %  \toprule%
    {Leistung} & \mc{Stunden} & \mc{Satz} & \mc{Entgelt}%
    \DTLforeach*{rechnung}{\bez=Bezeichnung,\anz=Anzahl,\ep=EP,\gp=GP}{%
      \DTLiffirstrow{\\ \midrule}{\\}%
      \bez%
      &\ifstr{\anz}{pauschal}%
        {\anz}
        {\nprounddigits{2}%\npnoround
        \numprint{\anz}%\nprounddigits{2}
        }
      &\ifstr{\anz}{pauschal}%
        {\ep}%
        {\usermacro{\ep}}%
      &\usermacro{\gp}% 
    }\\
    \cline{4-4}%\midrule%
    \if\mwst0\else%
      \textbf{Zwischensumme}&&&\usermacro{\Zwischensumme}\\%
      Umsatzsteuer (\mwst\,\%)&&&\usermacro{\MWSt}\\%
      \cline{4-4}%\midrule%
    \fi%
    \textbf{Summe}&&&\usermacro{\Summe}\\%
    \cline{4-4}%
  \end{tabu}%
  \vspace*{.15cm}\par%
}

\begin{document}

\begin{rechnung}{19}
  \Posten[1000.00]{Tätigkeit}{1.00}{}
  \Posten{Tätigkeit}{22.75}{80}
  \Posten[2000.00]{Besprechung}{1.00}{}
  \Posten{Tätigkeit}{24.00}{250.00}
\end{rechnung}

\end{document}

gefragt 10 Dez '15, 07:26

TeX-Newb's gravatar image

TeX-Newb
434
Akzeptiert: 50%

1

Dein Code ist, dafür dass er recht lang ist, zu wenig kommentiert. Wenn du in ein paar Kommentaren schreibst, was du schon vorbereitet hast, kann man dir auch schneller helfen!

(15 Dez '15, 04:43) sudo

Da alle Zahlen auf zwei Nachkommastellen gerundet und in einer Spalte die gleiche Einheit haben ist das ausrichten trivial und von dir schon erledigt. Um die Einheiten an die richtigen Stellen zu bekommen, musst du jetzt natürlich deine Makros auch an den entsprechenden Stellen verwenden. Bei deiner Variante mit \SI hast du eine andere Schrift eingestellt.

Open in Online-Editor
\documentclass{scrartcl}% Klasse: scrartcl, scrreprt, scrbook, scrletter

\usepackage[ngerman]{babel}
  \defineshorthand{"`}{}
  \defineshorthand{"'}{}

\usepackage{luaotfload}

\usepackage[urw-garamond]{mathdesign}
\usepackage[no-math]{fontspec}%

\usepackage{tabu}
\usepackage{siunitx}
\usepackage{datatool}
% Setup
  \DTLnewdb{rechnung}
\usepackage{ifthen}
\usepackage{eurosym}
\usepackage{ifpdf}
\usepackage{amstext}
\usepackage{etoolbox}
\usepackage{multirow}
\usepackage{calc}
\usepackage{booktabs}
\usepackage{dcolumn}
\usepackage{numprint}
    % Setup
      \nprounddigits{2} \npprintnull \npthousandsep{\,}
%      \newcolumntype{d}[1]{D{,}{,}{#1}}
      \newcommand{\mc}[1]{\multicolumn{1}{c}{#1}}

\makeatletter 
    \let\npunitcommand\@firstofone
    \def\EinheitZeit#1{\numprint[h]{\zap@space #1 \@empty}}
    \def\EinheitBetrag#1{\numprint[\euro]{\zap@space #1 \@empty}}
    \def\EinheitSatz#1{\numprint[\euro/h]{\zap@space #1 \@empty}}
\makeatother

% \def\EinheitZeit#1{\SI[%
% group-four-digits=true, round-mode=places, round-precision=2, round-integer-to-decimal=true, per-mode=symbol]{#1}{\hour}}
% \def\EinheitBetrag#1{\SI[group-four-digits=true, round-mode=places,
% round-precision=2, round-integer-to-decimal=true, per-mode=symbol]{#1}{\euro}}
% \def\EinheitSatz#1{\SI[group-four-digits=true, round-mode=places,
% round-precision=2, round-integer-to-decimal=true, per-mode=symbol]{#1}{\euro\per\hour}}
\newcommand\Posten[4][]{%
  \DTLnewrow{rechnung}%
  \DTLnewdbentry{rechnung}{Bezeichnung}{#2}%
  \if\relax\detokenize{#1}\relax%
    \DTLnewdbentry{rechnung}{Anzahl}{#3}%
    \DTLnewdbentry{rechnung}{EP}{#4}%
    {\dtlexpandnewvalue%
      \FPeval\fpresult{round(#3*#4)(2)}%
      \DTLnewdbentry{rechnung}{GP}{\fpresult}%
    }%
  \else%
    \DTLnewdbentry{rechnung}{Anzahl}{pauschal}%
    \DTLnewdbentry{rechnung}{EP}{#4}%
    \DTLnewdbentry{rechnung}{GP}{#1}%
  \fi%
}

\newcommand\mwst{}

\newenvironment{rechnung}[1]{%
  \renewcommand\mwst{#1}%
  \DTLcleardb{rechnung}%
  }{%
  % 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{tabu} {X[4,j] *1{>{\tabudecimal\EinheitZeit}X[r]}*1{>{\tabudecimal\EinheitSatz}X[r]}*1{>{\tabudecimal\EinheitBetrag}X[r]}}% 
  %  \toprule%
    {Leistung} & \mc{Stunden} & \mc{Satz} & \mc{Entgelt}%
    \DTLforeach*{rechnung}{\bez=Bezeichnung,\anz=Anzahl,\ep=EP,\gp=GP}{%
      \DTLiffirstrow{\\ \midrule}{\\}%
      \bez%
      &\ifstr{\anz}{pauschal}%
        {\anz}
        {\nprounddigits{2}%\npnoround
        \EinheitZeit{\anz}%\nprounddigits{2}
        }
      &\ifstr{\anz}{pauschal}%
        {\ep}%
        {\EinheitSatz{\ep}}%
      &\EinheitBetrag{\gp}% 
    }\\
    \cline{4-4}%\midrule%
    \if\mwst0\else%
      \textbf{Zwischensumme}&&&\EinheitBetrag{\Zwischensumme}\\%
      Umsatzsteuer (\mwst\,\%)&&&\EinheitBetrag{\MWSt}\\%
      \cline{4-4}%\midrule%
    \fi%
    \textbf{Summe}&&&\EinheitBetrag{\Summe}\\%
    \cline{4-4}%
  \end{tabu}%
  \vspace*{.15cm}\par%
}

\begin{document}

\begin{rechnung}{19}
  \Posten[1000.00]{Tätigkeit}{1.00}{}
  \Posten{Tätigkeit}{22.75}{80}
  \Posten[2000.00]{Besprechung}{1.00}{}
  \Posten{Tätigkeit}{24.00}{250.00}
\end{rechnung}

\end{document}
Permanenter link

beantwortet 15 Dez '15, 04:41

sudo's gravatar image

sudo
1.9k1817

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:

×24
×11
×8

Frage gestellt: 10 Dez '15, 07:26

Frage wurde angeschaut: 1,073 Mal

Zuletzt aktualisiert: 15 Dez '15, 04:43