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, 13:26

TeX-Newb's gravatar image

TeX-Newb
88137
Akzeptiert-Rate: 0%

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, 10: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, 10:41

sudo's gravatar image

sudo
2.0k51521
Akzeptiert-Rate: 39%

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×34
×17
×9

gestellte Frage: 10 Dez '15, 13:26

Frage wurde gesehen: 8,216 Mal

zuletzt geändert: 15 Dez '15, 10:43