% \iffalse meta-comment % !TEX program = pdfLaTeX %<*internal> \iffalse % %<*readme> # README # Seit dem 1. Januar 2015 gilt in Deutschland grundsätzlich für alle Arbeitnehmer ein flächendeckender gesetzlicher Mindestlohn in Höhe von derzeit 8,50€ pro Stunde. Mit Wirkung ab 1. August 2015 wurden die Dokumentations- und Aufzeichnungspflichten gelockert. Nach §17 MiLoG, muss Beginn, Ende und Dauer der täglichen Arbeitszeit der in §22 MiLoG definierten Arbeitnehmern (formlos) aufgezeichnet werden. Zusätzlich ermöglicht `milog.cls` aus praktischen Gründen die Aufzeichnug von unbezahlten Pausen und Bemerkungen (Ruhetag, Urlaub, Krank, ...). Die Erfassung der Arbeitszeiten erfolgt in einer simplen CSV-Datei, aus der die Klasse automatisch einen Arbeitszeitnachweis erstellt. Alternativ können die Daten auch durch einen CSV-Export — mit eventueller Nachbearbeitung — einer geeigneteten App erhoben werden. The `milog.cls` class provides means to fulfill the documentation duties by the German minimum wage law MiLoG. The recording of working hours is carried out in a simple CSV file from which the class will automatically create a time sheet. Alternatively, data can also be collected by a CSV export of a suitable app. License: LPPL % %<*milogcfg> \milogsetup{company={\TeX\ Satz GmbH},name={Mustermann, Max},id={01.01.1970/0815}} % %<*csvdoc> tag beginn pause ende dauer bemerkung 01 06:20 \{\} 12:00 05:40 \{\} 02 \{\} \{\} \{\} \{\} Ruhetag 03 \{\} \{\} \{\} \{\} Ruhetag 04 06:20 \{\} 12:00 05:40 \{\} 05 06:20 \{\} 12:00 05:40 \{\} 06 06:20 \{\} 12:05 05:45 \{\} 07 06:20 \{\} 12:10 05:50 \{\} 08 06:20 \{\} 12:05 05:45 \{\} 09 \{\} \{\} \{\} \{\} Ruhetag 10 \{\} \{\} \{\} \{\} Ruhetag nan nan nan nan 32:20 nan % %<*exdat> Arbeitszeiten von Max Mustermann;;;;; Mai 2016;;;;TeX Satz GmbH ;;1. Schicht;;;;Arbeitszeit;;Arbeitszeit; Tag;Datum;von;bis;von;bis;Brutto;Pausen;Netto;Visum So.;1;Ruhetag;Ruhetag;;;;;;;; Mo.;2;6:20;12:15;;;5:55;0:00;5:55;;; Di.;3;6:20;12:05;;;5:45;0:00;5:45;;; Mi.;4;6:20;13:15;;;6:55;1:00;5:55;;; Do.;5;Feiertag;Feiertag;;;;;;;; Fr.;6;Ferien/Urlaub;Ferien/Urlaub;;;;;;;; Sa.;7;Ruhetag;Ruhetag;;;;;;;; So.;8;Ruhetag;Ruhetag;;;;;;;; Mo.;9;6:20;12:25;;;6:05;0:00;6:05;;; Di.;10;6:20;12:10;;;5:50;0:00;5:50;;; Mi.;11;6:20;12:25;;;6:05;0:00;6:05;;; Do.;12;6:20;12:20;;;6:00;0:00;6:00;;; Fr.;13;6:20;12:10;;;5:50;0:00;5:50;;; Sa.;14;Ruhetag;Ruhetag;;;;;;;; So.;15;Ruhetag;Ruhetag;;;;;;;; Mo.;16;Feiertag;Feiertag;;;;;;;; Di.;17;6:20;12:05;;;5:45;0:00;5:45;;; Mi.;18;6:20;12:10;;;5:50;0:00;5:50;;; Do.;19;6:20;12:20;;;6:00;0:00;6:00;;; Fr.;20;6:20;12:00;;;5:40;0:00;5:40;;; Sa.;21;Ruhetag;Ruhetag;;;;;;;; So.;22;Ruhetag;Ruhetag;;;;;;;; Mo.;23;6:20;12:05;;;5:45;0:00;5:45;;; Di.;24;6:20;12:10;;;5:50;0:00;5:50;;; Mi.;25;6:20;13:10;;;6:50;0:00;6:50;;; Do.;26;Feiertag;Feiertag;;;;;;;; Fr.;27;Ferien/Urlaub;Ferien/Urlaub;;;;;;;; Sa.;28;Ruhetag;Ruhetag;;;;;;;; So.;29;Ruhetag;Ruhetag;;;;;;;; Mo.;30;6:20;12:05;;;5:45;0:00;5:45;;; Di.;31;6:20;12:05;;;5:45;0:00;5:45;;; ;;;;;Total;;;100:35 ;;;;;Saldo aktueller Monat;;;100:35 ;;;;;S. Vormonat;;;0:00 ;;;;;Bezahlte Überstunden;;;0:00 ;;;;;Saldo per 31.05.2016;;;100:35 % %<*excsv> tag beginn pause ende dauer bemerkung 1 {} {} {} {} Ruhetag 2 6:20 {} 12:15 5:55 {} 3 6:20 {} 12:05 5:45 {} 4 6:20 1:00 13:15 5:55 Arztbesuch 5 {} {} {} {} Feiertag 6 {} {} {} {} Urlaub 7 {} {} {} {} Ruhetag 8 {} {} {} {} Ruhetag 9 6:20 {} 12:25 6:05 {} 10 6:20 {} 12:10 5:50 {} 11 6:20 {} 12:25 6:05 {} 12 6:20 {} 12:20 6:00 {} 13 6:20 {} 12:10 5:50 {} 14 {} {} {} {} Ruhetag 15 {} {} {} {} Ruhetag 16 {} {} {} {} Feiertag 17 6:20 {} 12:05 5:45 {} 18 6:20 {} 12:10 5:50 {} 19 6:20 {} 12:20 6:00 {} 20 6:20 {} 12:00 5:40 {} 21 {} {} {} {} Ruhetag 22 {} {} {} {} Ruhetag 23 6:20 {} 12:05 5:45 {} 24 6:20 {} 12:10 5:50 {} 25 6:20 {} 13:10 6:50 {} 26 {} {} {} {} Feiertag 27 {} {} {} {} Urlaub 28 {} {} {} {} Ruhetag 29 {} {} {} {} Ruhetag 30 6:20 {} 12:05 5:45 {} 31 6:20 {} 12:05 5:45 {} nan nan nan nan 100:35 nan % %<*bibfile> @misc{bib:pgfplotstable, author = {Dr. Christian Feuersänger}, note = {\href{http://mirrors.ctan.org/graphics/pgf/contrib/pgfplots/doc/pgfplotstable.pdf}{http://mirrors.ctan.org/graphics/pgf/contrib/pgfplots/doc/pgfplotstable.pdf}}, title = {{Manual for Package pgfplotstable}}, year = {2016}, } @misc{bib:xkeyval, author = {Hendri Adriaens}, note = {\href{http://mirrors.ctan.org/macros/latex/contrib/xkeyval/xkeyval.pdf}{http://mirrors.ctan.org/macros/latex/contrib/xkeyval/xkeyval.pdf}}, title = {{The xkeyval package}}, year = {2014}, } @misc{bib:geometry, author = {Hideo Umeki}, note = {\href{http://mirrors.ctan.org/macros/latex/contrib/geometry/geometry.pdf}{http://mirrors.ctan.org/macros/latex/contrib/geometry/geometry.pdf}}, title = {{The geometry package}}, year = {2010}, } @misc{bib:tabularx, author = {David Carlisle}, note = {\href{http://mirrors.ctan.org/macros/latex/required/tools/tabularx.pdf}{http://mirrors.ctan.org/macros/latex/required/tools/tabularx.pdf}}, title = {{The tabularx package}}, year = {2014}, } @misc{bib:booktabs, author = {Simon Fear}, note = {\href{http://mirrors.ctan.org/macros/latex/contrib/booktabs/booktabs.pdf}{http://mirrors.ctan.org/macros/latex/contrib/booktabs/booktabs.pdf}}, title = {{Publication quality tables in \LaTeX}}, year = {2005}, } @misc{bib:colortbl, author = {David Carlisle}, note = {\href{http://mirrors.ctan.org/macros/latex/contrib/colortbl/colortbl.pdf}{http://mirrors.ctan.org/macros/latex/contrib/colortbl/colortbl.pdf}}, title = {{The colortbl package}}, year = {2012}, } @misc{bib:xifthen, author = {Josselin Noirel}, note = {\href{http://mirrors.ctan.org/macros/latex/contrib/xifthen/xifthen.pdf}{http://mirrors.ctan.org/macros/latex/contrib/xifthen/xifthen.pdf}}, title = {{The xifthen package}}, year = {2015}, } @misc{bib:background, author = {Gonzalo Medina}, note = {\href{http://mirrors.ctan.org/macros/latex/contrib/background/background.pdf}{http://mirrors.ctan.org/macros/latex/contrib/background/background.pdf}}, title = {{The background package}}, year = {2014}, } @misc{bib:transparent, author = {Heiko Oberdiek}, note = {\href{http://mirrors.ctan.org/macros/latex/contrib/oberdiek/transparent.pdf}{http://mirrors.ctan.org/macros/latex/contrib/oberdiek/transparent.pdf}}, title = {{The transparent package}}, year = {2016}, } @misc{bib:milog, author = {{Bundesministerium der Justiz und für Verbraucherschutz (in Zusammenarbeit mit der juris GmbH)}}, note = {\href{https://www.gesetze-im-internet.de/bundesrecht/milog/gesamt.pdf}{https://www.gesetze-im-internet.de/bundesrecht/milog/gesamt.pdf}}, title = {{Gesetz zur Regelung eines allgemeinen Mindestlohns (Mindestlohngesetz - MiLoG)}}, year = {2014}, } @misc{app:arbeitszeiterfassung, author = {{askanimus}}, note = {\newline\href{https://play.google.com/store/apps/details?id=askanimus.arbeitszeiterfassung}{https://play.google.com/store/apps/details?id=askanimus.arbeitszeiterfassung}}, title = {{Arbeitszeiterfassung}}, year = {2016}, } % %<*examplefile> \documentclass{milog} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{libertine} \begin{document} \milog[month={05/2016},cc=true]{201605.csv} \end{document} % %<*exform> \documentclass{milog} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{libertine} \begin{document} \milog[company={},name={},id={\space}]{\Formular} \end{document} % %<*manifest> This work consists of the following files: milog.dtx milog.pdf milog-example.pdf milog-formular.pdf README.md makefile Files packaged in milog.dtx: milog.cls milog.cfg milog milog-example.tex milog-formular.tex 201605.dat 201605.csv manifest.txt % %<*internal> \fi \def\nameofplainTeX{plain} \ifx\fmtname\nameofplainTeX\else \expandafter\begingroup \fi % %<*install> \input docstrip.tex \keepsilent \askforoverwritefalse \preamble Copyright (C) 2016 by: Josef Kleber This file may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 of this license or (at your option) any later version. The latest version of this license is in: http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all distributions of LaTeX version 2003/12/01 or later. This work has the LPPL maintenance status "maintained". The Current Maintainer of this work is Josef Kleber. This work consists of all files listed in manifest.txt. \endpreamble \usedir{tex/latex/milog} \generate{ \file{\jobname.cls}{\from{\jobname.dtx}{class}} } \generate{ \file{\jobname-example}{\from{\jobname.dtx}{examplefile}} } \generate{ \file{\jobname-formular}{\from{\jobname.dtx}{exform}} } \generate{ \file{\jobname.cfg}{\from{\jobname.dtx}{milogcfg}} } % %\endbatchfile %<*internal> \nopreamble\nopostamble \usedir{doc/latex/milog} \generate{ \file{README.md}{\from{\jobname.dtx}{readme}} } \generate{ \file{manifest.txt}{\from{\jobname.dtx}{manifest}} } \generate{ \file{\jobname.bib}{\from{\jobname.dtx}{bibfile}} } \generate{ \file{mlgdoc.csv}{\from{\jobname.dtx}{csvdoc}} } \generate{ \file{milog.sh}{\from{\jobname.dtx}{milogsh}} } \generate{ \file{201605.dat}{\from{\jobname.dtx}{exdat}} } \generate{ \file{201605.csv}{\from{\jobname.dtx}{excsv}} } \ifx\fmtname\nameofplainTeX \expandafter\endbatchfile \else \expandafter\endgroup \fi % %<*driver> \documentclass[a4paper]{ltxdoc}% \usepackage[ngerman]{babel}% \usepackage[utf8]{inputenc}% \usepackage[T1]{fontenc}% \usepackage{textcomp}% \usepackage{lmodern}% \usepackage{bera}% \usepackage{microtype}% \usepackage{cite}% \usepackage{csquotes}% \usepackage{marginnote}% \usepackage[svgnames,rgb]{xcolor}% \usepackage{listings}% \usepackage{makeidx} \usepackage{eurosym} \usepackage{tocstyle} \usetocstyle{standard} \usepackage[numbered]{hypdoc} \usepackage{ragged2e}% \usepackage{url}% \usepackage[automark,nouppercase]{scrpage2} \usepackage{tikz} \usetikzlibrary{calc}% % turn off idiotic tikz error in doc generation \makeatletter \global\let\tikz@ensure@dollar@catcode=\relax \makeatother \usepackage{alltt}% \usepackage{hyperref} \EnableCrossrefs \CodelineIndex \RecordChanges \makeatletter \setlength{\headheight}{1.1\baselineskip}% \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% {-2.5ex\@plus -1ex \@minus -.25ex}% {1.25ex \@plus .25ex}% {\normalfont\normalsize\bfseries}} \setcounter{secnumdepth}{5} \setcounter{tocdepth}{5} \hypersetup{colorlinks=true,urlcolor=NavyBlue,linkcolor=NavyBlue,citecolor=CornflowerBlue}% \lstset{literate=% {Ö}{{\"O}}1 {Ä}{{\"A}}1 {Ü}{{\"U}}1 {ß}{{\ss}}1 {ü}{{\"u}}1 {ä}{{\"a}}1 {ö}{{\"o}}1 {~}{{\textasciitilde}}1 } \lstset{language=[LaTeX]TeX,numbers=left,numberstyle=\tiny, basicstyle=\ttfamily, aboveskip=\baselineskip, frame=single, backgroundcolor=\color{LightGoldenrodYellow}, keywordstyle=\color{Blue}, emph={}} \renewcommand{\maketitle}% {% \thispagestyle{empty}% \pagecolor{Ivory}% \begin{titlepage}% \begin{tikzpicture}[remember picture,overlay]% \node[yshift=-2cm] at (current page.north west)% {% \begin{tikzpicture}[remember picture, overlay]% \draw[fill=CornflowerBlue,color=CornflowerBlue] (0,0) rectangle% (\paperwidth,2cm);% \draw[anchor=west,yshift=-4cm,xshift=3cm,color=NavyBlue] (0,0) node% {\parbox{15cm}{\RaggedRight\Huge\sffamily\textbf{\@title}}};% \draw[anchor=west,yshift=-6cm,xshift=3cm,color=NavyBlue] (0,0) node% {\parbox{15cm}{\huge\sffamily\textbf{\@fileversion}}};% \draw[anchor=west,yshift=-9cm,xshift=3cm,color=NavyBlue] (0,0) node% {\parbox{15cm}{\RaggedRight\huge\sffamily\textbf{\@subtitle}}};% \draw[anchor=west,yshift=-18cm,xshift=3cm,color=NavyBlue] (0,0) node% {\parbox{15cm}{\huge\sffamily\textbf{\@date}}};% \draw[anchor=west,yshift=-20cm,xshift=3cm,color=NavyBlue] (0,0) node% {\parbox{15cm}{\Large\sffamily{\@authorline\\\textbf{\@author}}}};% \end{tikzpicture}% };% \node[yshift=0cm] at (current page.south west)% {% \begin{tikzpicture}[remember picture, overlay]% \draw[fill=NavyBlue,color=NavyBlue,yshift=6cm,xshift=2cm] (0,0) rectangle (0.2cm,19cm);% \draw[fill=CornflowerBlue,color=CornflowerBlue] (0,0) rectangle (\paperwidth,2cm);% \draw[anchor=west,yshift=1cm,xshift=3cm,color=NavyBlue] (0,0) node% {\parbox{15cm}{\large\sffamily{\@refline}}};% \end{tikzpicture}% };% \end{tikzpicture}% \end{titlepage}% \pagecolor{white}% }% % \newcommand*{\@tikzhead}[1]% {% \begin{tikzpicture}[remember picture,overlay]% \node[yshift=-2cm] at (current page.north west)% {% \begin{tikzpicture}[remember picture, overlay]% \draw[fill=CornflowerBlue] (0,0) rectangle (\paperwidth,2cm);% \draw[anchor=west,yshift=1cm,xshift=1.5cm,color=NavyBlue] (0,0) node% {\parbox{15cm}{\LARGE\sffamily\textbf{\@title}}};% \node[anchor=east,xshift=.9\paperwidth,rectangle,% rounded corners=15pt,inner sep=11pt,fill=NavyBlue]% {\color{white}\textsc{#1}};% \end{tikzpicture}% };% \end{tikzpicture}% }% \clearscrheadings% \ihead{\@tikzhead{\headmark}}% \cfoot{\upshape\thepage}% \pagestyle{scrheadings}% % \newcommand*{\Headline}[1]{\@mkboth{#1}{#1}\markright{#1}}% % \renewcommand{\headfont}{\normalfont\mdseries\scshape} % \gdef\@subtitle{}% \providecommand*{\Subtitle}[1]{\gdef\@subtitle{#1}}% \gdef\@fileversion{}% \providecommand*{\Fileversion}[1]{\gdef\@fileversion{#1}}% \gdef\@author{}% \providecommand*{\Author}[1]{\gdef\@author{#1}}% \gdef\@authorline{Package author:}% \providecommand*{\Authorline}[1]{\gdef\@authorline{#1}}% \gdef\@refline{}% \providecommand*{\Refline}[1]{\gdef\@refline{#1}}% \gdef\and{\unskip{}, }% \newcommand\doubledash{-\kern0.5pt-} \def\enoteformat{\rightskip\z@ \leftskip\z@ \parindent=1em\leavevmode\llap{\makeenmark}} \def\XeLaTeX{Xe\LaTeX}% % \newenvironment{optionlist} {\begin{trivlist}\setlength\leftskip{2em}} {\end{trivlist}} \newcommand\optitem[3]{\item [\texttt{\textbf{\textcolor{DodgerBlue}{#1}} \lbrack\textcolor{Crimson}{#2}\rbrack}] #3} \renewcommand\tableofcontents% {% %\section*{\contentsname}% %\@mkboth{% %\MakeUppercase\contentsname}{\MakeUppercase\contentsname}% \Headline{\MakeUppercase\contentsname} \@starttoc{toc}% }% % %\newcommand\env[1]{\texttt{#1}}% \newcommand\layer[1]{\texttt{#1}\SortIndex{#1}{\texttt{#1} (PGF layer)}% \SortIndex{PGF layer>#1}{\texttt{#1}}}% \newcommand\styleoption[1]{\texttt{#1}\SortIndex{#1}{\texttt{#1} (Style option)}% \SortIndex{Style option>#1}{\texttt{#1}}}% \newcommand\envoption[1]{\texttt{#1}\SortIndex{#1}{\texttt{#1} (Puzzle option)}% \SortIndex{Puzzle option>#1}{\texttt{#1}}}% \newcommand\stylename[1]{\texttt{#1}\SortIndex{#1}{\texttt{#1} (Style file)}% \SortIndex{Style file>#1}{\texttt{#1}}}% \newcommand\package[1]{\texttt{#1}\SortIndex{#1}{\texttt{#1} (Package)}% \SortIndex{Package>#1}{\texttt{#1}}}% \newcommand\class[1]{\texttt{#1}\SortIndex{#1}{\texttt{#1} (Class)}% \SortIndex{Class>#1}{\texttt{#1}}}% \newcommand*\margcs[1]{\marginnote{\hbadness=10000\RaggedLeft\scriptsize #1}}% \def\PrintIndex{\clearpage\Headline{\thechapter Index}\@input@{\jobname.ind}% \global\let\PrintIndex\@empty} \renewenvironment{theindex} {\if@twocolumn \@restonecolfalse \else \@restonecoltrue \fi \columnseprule \z@ \columnsep 35\p@ \def\see##1##2{\textit{See} ##1}% \def\seealso##1##2{\textit{See also} ##1}% \long\def\cmd##1{\cs{\expandafter\cmd@to@cs\string##1}}% \def\@url##1{\url@break\ttt{##1}\endgroup}% \def\ttt{\begingroup\@sanitize\ttfamily\@ttt}% \def\@ttt##1{##1\endgroup}% \mathchardef\save@secnumdepth\c@secnumdepth \c@secnumdepth\m@ne \phantomsection% \twocolumn%[\section{\indexname}]% \refstepcounter{section} \addcontentsline{toc}{section}{\protect\numberline{\thesection}Index}% \c@secnumdepth\save@secnumdepth %\thispagestyle{plain} \parindent\z@ \parskip\z@ \@plus .3\p@\relax \let\item\@idxitem} {\if@restonecol\onecolumn\else\clearpage\fi} \setlength\parindent{0pt}% \newcommand*\myref[1]{(siehe Abschnitt \ref{#1} auf Seite \pageref{#1})} \makeatother \begin{document} \DocInput{\jobname.dtx} \end{document} % % \fi % % \GetFileInfo{\jobname.cls} % \def\filename{milog.cls} % \def\filedate{2016/07/01} % \def\fileversion{v1.0} % \hypersetup{pdfauthor={Josef Kleber},pdftitle={Eine LaTeX-Klasse zur Erfüllung der Dokumentationspflichten nach dem Mindestlohngesetz (MiLoG)},pdfsubject={Dokumentation der LaTeX-Klasse \filename}}% % \lstset{language=[LaTeX]TeX,numbers=left,numberstyle=\tiny, basicstyle=\ttfamily, aboveskip=\baselineskip, frame=single, backgroundcolor=\color{LightGoldenrodYellow}, keywordstyle=\color{Blue}, % emph={milog},emphstyle=\color{Tomato}, % emph={[2]color,companyname,company,namename,name,idname,id,monthname,month,heading},emphstyle={[2]\color{OliveDrab}}, % morekeywords={milog}} % \DoNotIndex{\(,\),\1,\t,\,,\\,\begin,\end,\begingroup,\endgroup,\csname,\def,\else,\endcsname,\equal,\expandafter, % \fi,\gdef,\ifnum,\ifthenelse,\immediate,\MessageBreak,\NeedsTeXFormat,\newcommand,\renewcommand,\newif, % \PackageInfo,\PackageError,\ProcessOptionsX,\ProvidesPackage,\relax,\RequirePackage, % \space,\errmessage,\ExecuteOptionsX,} % % \bibliographystyle{plain} % \title{\filename}% % \Subtitle{Eine \LaTeX -Klasse zur Erfüllung der Dokumentationspflichten nach dem Mindestlohngesetz (MiLoG)}% % \author{Josef Kleber} % \Fileversion{\fileversion} % \date{\filedate} % \Refline{\href{mailto:milog@jklatex.de}{\texttt{milog@jklatex.de}}\\\href{http://milog.jklatex.de/}{\texttt{http://milog.jklatex.de/}}} % \maketitle % \stepcounter{page} % \tableofcontents % \clearpage % \setlength\parskip{6pt}% % % %\StopEventually{^^A % { % \clearpage % \raggedright % \nocite{*} % \bibliography{\jobname} % } % \clearpage % \PrintChanges % \PrintIndex %} % % \Headline{Zusammenfassung} % \begin{abstract} % Seit dem 1. Januar 2015 gilt in Deutschland grundsätzlich für alle Arbeitnehmer ein flächendeckender gesetzlicher Mindestlohn in Höhe von derzeit 8,50\,\euro\ pro Stunde. % Mit Wirkung ab 1. August 2015 wurden die Dokumentations- und Aufzeichnungspflichten gelockert. % Nach \S 17 MiLoG, muss Beginn, Ende und Dauer der täglichen Arbeitszeit der in \S 22 MiLoG definierten Arbeitnehmern (formlos) aufgezeichnet werden. % Zusätzlich ermöglicht \class{milog.cls} aus praktischen Gründen die Aufzeichnug von unbezahlten Pausen und Bemerkungen (Ruhetag, Urlaub, Krank, ...). % % Die Erfassung der Arbeitszeiten erfolgt in einer simplen CSV-Datei, aus der die Klasse automatisch einen Arbeitszeitnachweis erstellt. % Alternativ können die Daten auch durch einen CSV-Export --- mit eventueller Nachbearbeitung --- einer geeigneteten App erhoben werden. % % \vspace{1cm} % % The \class{milog.cls} class provides means to fulfill the documentation duties by the German minimum wage law MiLoG. % The recording of working hours is carried out in a simple \texttt{CSV} file from which the class will automatically create a time sheet. % Alternatively, data can also be collected by a CSV export of a suitable app. % \end{abstract} % \clearpage % \tableofcontents % \Headline{Klassenoptionen} % % \clearpage % % \Headline{Klassenoptionen} % % \section{Klassenoptionen} % \Headline{Klassenoptionen} % Grundsätzlich handelt es sich bei \class{milog.cls} um eine Wrapper-Klasse um \class{article.cls}, d.\,h. es können grundsätzlich die \enquote{normalen} Klassenoptionen vergewendet werden. % Dies sollte jedoch nicht nötig sein, da diese Klasse ein bestimmtes Formulardesign umsetzt! Sie bietet daher die folgenden Optionen, die auch mit lokaler Wirkung im \cmd\milog\ Makro angewendet werden können: % \begin{optionlist} % \optitem{heading}{Arbeitszeitnachweis nach dem Mindestlohngesetz (\S 17 MiLoG)}{Überschrift} % \optitem{cc}{false}{erstellt -- falls auf \texttt{true} gesetzt -- einen Durchschlag mit dem Wasserzeichen \enquote{Kopie}} % \optitem{companyname}{Firma}{Bezeichnung der Arbeitgeberorganisation} % \optitem{company}{}{Firmenname} % \optitem{namename}{Name, Vorname}{Bezeichnung der Personenidentifikation} % \optitem{name}{}{Name} % \optitem{idname}{Geburtsdatum, Personalnummer}{Bezeichnung einer zusätzlichen Personenidentifikation} % \optitem{id}{}{Zusatz-Id} % \optitem{monthname}{Monat/Jahr}{Bezeichnung der Aufzeichnungsperiode} % \optitem{month}{}{Aufzeichnungsperiode} % \optitem{color}{gray!40}{Farbvariation der Aufzeichnungsliste} % \end{optionlist} % \section{Die Konfigurationsdatei \texttt{milog.cfg}} % \label{sec:milogcfg} % Falls vorhanden, wird die Konfigurationsdatei \texttt{milog.cfg} eingebunden. Darin können etwa das Festlegen neuer Defaults für die oben angegebenen Optionen \myref{sec:milogsetup} oder auch % Redefinitionen des Layouts ausgelagert werden. Dies kann sowohl systemweit in einem (lokalen) \TeX-Tree erfolgen oder auch lokal im aktuellen Arbeitsverzeichnis! % \section{Das CSV-Datenformat} % \label{sec:csvformat} % Das folgende Beispiel zeigt den Aufbau der CSV-Dateien für den Arbeitszeitnachweis. Die einzelnen Spalten sind dabei durch Spaces oder Tabulatoren zu trennen. % Dadurch müssen \enquote{leere} Spalten durch die speziellen Marker \texttt{\{\}} bzw. \texttt{nan} gekennzeichnet werden. Diese werden in der ausgegebenen Tabelle % durch \enquote{--} bzw. \enquote{\cmd\space} ersetzt. % % \begin{center} % \begin{alltt}\input{mlgdoc.csv}\end{alltt} % \end{center} % % Eine Besonderheit stellt die letzte Zeile dar, in der die Gesamtarbeitszeit angegeben werden kann. Die Abschlusslinie der Tabelle wird \textbf{vor} der letzten Zeile gesetzt. % Es muss daher eine letzte Zeile mit \texttt{nan}-Einträgen vorhanden sein, falls die Ausgabe der Gesamtarbeitszeit nicht gewünscht sein sollte. % \section{Befehle} % \subsection{\textbackslash{}milog} % Das \cmd\milog{}\marginnote{\cmd\milog\\\oarg{Optionen}\marg{CSV-Datei}} Makro liest die \marg{CSV-Datei} ein und erstellt daraus % automatisch den gewünschten Arbeitszeitnachweis. % \subsection{\textbackslash{}Formular} % \label{sec:Formular} % Das \cmd\Formular{}\marginnote{\cmd\Formular} Makro stellt ein Blankoformular in Form einer \enquote{inline table} zur Verfügung. % Es kann anstatt einer \texttt{CSV}-Datei im \cmd\milog\ Makro verwendet werden. % \subsection{\textbackslash{}milogsetup} % \label{sec:milogsetup} % Das \cmd\milogsetup{}\marginnote{\cmd\milogsetup\marg{Optionen}} Makro dient dem erneuten Setzen der globalen Optionen. % Insbesonders in Verbindung mit der Konfigurationsdatei \texttt{milog.cfg} \myref{sec:milogcfg} zum Setzen systemweiter oder auf das aktuelle Verzeichnis bezogene Defaults. % \section{Beispiel} % Im folgenden Beispiel setzen wir die persönlichen Angaben in der Konfigurationsdatei \texttt{milog.cfg}. % \iffalse %<*example> % \fi \begin{lstlisting} \milogsetup{company={\TeX\ Satz GmbH},name={Mustermann, Max}, id={01.01.1970/0815}} \end{lstlisting} % \iffalse % % \fi % Anstatt in der Konfigurationsdatei könnten die persönlichen Angaben auch als Klassenoptionen gesetzt werden. % Den Zeitraum des Arbeitszeitnachweises setzen wir als lokale Option im \cmd\milog\ Makro. % Außerdem erzwingen wir durch Setzen der Option \texttt{cc} einen Durchschlag. % \iffalse %<*example> % \fi \begin{lstlisting} \documentclass{milog} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{libertine} \begin{document} \milog[month={05/2016},cc=true]{201605.csv} \end{document} \end{lstlisting} % \iffalse % % \fi % \section{An app a day keeps the work away} % Abschließend möchte ich noch eine Möglichkeit zur weitestgehend automatischen Erstellung des Arbeitszeitnachweises aus dem % \texttt{CSV}-Export einer Arbeitszeit-App aufzeigen. Exemplarisch nutzen wir hierzu die Android-App \enquote{Arbeitszeiterfassung}\cite{app:arbeitszeiterfassung}. % Dazu wandeln wir den \texttt{CSV}-Export der App mit Hilfe des \texttt{milog} Bash-Scripts \myref{sec:milogimpl} in das von % \class{milog.cls} benötigte \texttt{CSV}-Format \myref{sec:csvformat}. % Grundsätzlich ermöglicht die App das Erfassen von zwei Schichten. Zur Vereinfachung wertet das Skript jedoch nur die erste Schicht aus. % \iffalse %<*example> % \fi \begin{lstlisting} $ milog -i 201605.dat reading 201605.dat writing _milog_.csv creating milog.pdf \end{lstlisting} % \iffalse % % \fi % Insbesonders verwenden wir für den Namen der \texttt{CSV}-Exportdatei das Format \texttt{YYYYMM}. Das Script setzt damit % die \texttt{month} Option automatisch. Die Angaben zur Person setzen wir mit Hilfe des \cmd\milogsetup\ Makros \myref{sec:milogsetup} % in der Konfigurationsdatei \texttt{milog.cfg} \myref{sec:milogcfg}. Alternativ wäre auch eine Anpassung der \texttt{HERE}-Datei % innerhalb des Scripts möglich. Die Verwendung der Konfigurationsdatei im jeweiligen Arbeitsverzeichnis ermöglicht jedoch % die Erstellung eines Arbeitszeitnachweises für unterschiedliche Personen mit demselben Script. % % Falls Anpassungen der \texttt{CSV}-Datei --- etwa in der Spalte \texttt{bemerkung} --- nötig sein sollten, kann die Erstellung % der \texttt{PDF}-Datei in zwei Schritten erfolgen! % \iffalse %<*example> % \fi \begin{lstlisting} $ milog -i 201605.dat -o 201605.csv -c reading 201605.dat writing 201605.csv [ ... Bearbeitung der CSV-Datei ... ] $ milog -i 201605.csv -p 201605 -l creating 201605.pdf \end{lstlisting} % \iffalse % % \fi % \section{Implementierung} % \subsection{milog.cls} % \changes{v0.1}{2016/05/07}{initial version} % \changes{v1.0}{2016/07/01}{IPO CTAN} % \begin{macrocode} %<*class> % \end{macrocode} % Zunächst stellen wir die \LaTeX\ Klasse \class{milog.cls} bereit. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}% \ProvidesClass{milog}[2016/07/01 class for MiLoG documentation v1.0]% % \end{macrocode} % Wir laden die Pakete \package{xkeyval} und \package{xkvlxp} um geschweifte Klammern und etwas mehr in den globalen Klassenoptionen zu erlauben. % \begin{macrocode} \RequirePackage{xkeyval}% \RequirePackage{xkvltxp}% % \end{macrocode} % Wir stellen das Makro \cmd\MLG@JK@define@key zur Verfügung, das die Klassenoptionen mit globaler Wirkung% % und Optionen für das \cmd\milog\ Makro mit lokaler Wirkung definiert. Es bietet vier Argumente \marg{prefix},% % \marg{class},\marg{option} and \marg{default}. % \begin{macrocode} \newcommand*\MLG@JK@define@key[4]% {% \expandafter\gdef\csname#1@#3\endcsname{#4}% \define@key{#2.cls}{#3}[#4]% {% \expandafter\gdef\csname#1@#3\endcsname{##1}% }% \define@key{#2}{#3}% {% \expandafter\def\csname#1@#3\endcsname{##1}% }% }% % \end{macrocode} % Damit können wir nun unsere Optionen definieren. % \changes{v0.5}{2016/06/03}{changed \texttt{color} default to \texttt{gray\string!40}} % \changes{v0.5}{2016/06/03}{added option \texttt{cc}} % \begin{macrocode} \MLG@JK@define@key{MLG@JK}{milog}{color}{gray!40}% \MLG@JK@define@key{MLG@JK}{milog}{companyname}{Firma}% \MLG@JK@define@key{MLG@JK}{milog}{company}{}% \MLG@JK@define@key{MLG@JK}{milog}{namename}{Name, Vorname}% \MLG@JK@define@key{MLG@JK}{milog}{name}{}% \MLG@JK@define@key{MLG@JK}{milog}{idname}{Geburtsdatum/Personalnummer}% \MLG@JK@define@key{MLG@JK}{milog}{id}{}% \MLG@JK@define@key{MLG@JK}{milog}{monthname}{Monat/Jahr}% \MLG@JK@define@key{MLG@JK}{milog}{month}{}% \MLG@JK@define@key{MLG@JK}{milog}{heading}{Arbeitszeitnachweis nach % dem Mindestlohngesetz (\S 17 MiLoG)}% \MLG@JK@define@key{MLG@JK}{milog}{cc}{false}% % \end{macrocode} % Jetzt wenden wir die Klassenoptionen an und setzen damit die Optionsmakros mit den Default-Werten. % \begin{macrocode} \DeclareOptionX*{\PassOptionsToClass{\CurrentOption}{article}}% \ExecuteOptionsX{color,companyname,company,namename,name,idname,id,% monthname,month,heading,cc}% \ProcessOptionsX*\relax% % \end{macrocode} % Wir laden die \class{article.cls} Klasse und müssen daher nichts weiter definieren. % \begin{macrocode} \LoadClass{article}% % \end{macrocode} % Wir laden weitere benötigte Pakete. % \begin{macrocode} \RequirePackage[margin={2cm,2cm}]{geometry}% \RequirePackage{tabularx}% \RequirePackage{booktabs}% \RequirePackage{colortbl}% \RequirePackage{xifthen}% \RequirePackage[pages=some]{background}% \RequirePackage{transparent}% \RequirePackage{pgfplotstable}% % \end{macrocode} % Für unser \enquote{Formular} benötigen wir keinen Absatzeinzug und keine Seitenzahlen. % \begin{macrocode} \setlength{\parindent}{0pt}% \pagestyle{empty}% % \end{macrocode} % Definitionen: Überschrift % \begin{macrocode} \newcommand*\MLG@JK@heading@font@size{\Large}% \newcommand*\MLG@JK@heading@font@style{\bfseries}% % \end{macrocode} % Definitionen: Abstände der Formularelemente % % Durch die Verwendung von \cmd\vfill\ wird der verbleibende Abstand gleichmäßig verteilt, % insbesonders bei unterschiedlich langen Monaten. Bei kürzeren Zeitabschnitten (wöchentlich) evtl. auf feste Abstände umdefinieren. % \begin{macrocode} \newcommand*\MLG@JK@idtab@topskip{\vfill}% \newcommand*\MLG@JK@csvtab@topskip{\vfill}% \newcommand*\MLG@JK@signaturebox@topskip{\vfill\vfill}% % \end{macrocode} % Definitionen: Tabelle (persönliche Daten) % \begin{macrocode} \newcommand*\MLG@JK@idtab@width{13cm}% \newcommand*\MLG@JK@idtab@as{1.3}% % \end{macrocode} % Definitionen: Tabelle (Arbeitszeitnachweis aus csv) % \begin{macrocode} \newcommand*\MLG@JK@csvtab@as{1.15}% \newcommand*\MLG@JK@csvtab@opacity{0.5}% % \end{macrocode} % Definitionen: cc (Optionen für \cmd\backgroundsetup) % \begin{macrocode} \newcommand*\MLG@JK@bgopt@contents{Kopie}% \newcommand*\MLG@JK@bgopt@color{gray!30}% \newcommand*\MLG@JK@bgopt@opacity{0.5}% \newcommand*\MLG@JK@bgopt@scale{25}% % \end{macrocode} % Definitionen: Unterschriftenabschnitt % \begin{macrocode} \newcommand*\MLG@JK@signaturebox@space{3cm}% % \end{macrocode} % Definitionen: Unterschrift % \begin{macrocode} \newcommand*\MLG@JK@signature@width{6cm}% \newcommand*\MLG@JK@signature@labelskip{2ex}% \newcommand*\MLG@JK@signature@employee{Arbeitnehmer}% \newcommand*\MLG@JK@signature@employer{Arbeitgeber}% % \end{macrocode} % Wir definieren die Ausgestaltung der Tabelle (csv). Insbesonders definieren wir die Ersetzungen \enquote{\texttt{nan}} $\rightarrow$ \enquote{\cmd\space} und \enquote{empty cells} $\rightarrow$ \enquote{--}. % \begin{macrocode} \pgfplotstableset% {% columns/tag/.style={string type,% column name={Tag},% string replace={nan}{\space}},% columns/beginn/.style={string type,% column name={Arbeitsbeginn},% string replace={nan}{\space}},% columns/pause/.style={string type,% column name={Unbezahlte Pause},% string replace={nan}{\space}},% columns/ende/.style={string type,% column name={Arbeitsende},% string replace={nan}{\space}},% columns/dauer/.style={string type,% column name={Arbeitsdauer},% string replace={nan}{\space}},% columns/bemerkung/.style={string type,% column name={Bemerkung},% string replace={nan}{\space}},% empty cells with={--},% every head row/.style={before row=\toprule,after row=\midrule},% every even row/.style={before row={\rowcolor{\MLG@JK@color}}},% % \end{macrocode} % Wir helfen uns hier mit einem \enquote{dirty trick}! Die Abschlusslinie der Tabelle setzen wir \textbf{vor} der letzten Zeile! % Damit kann und \textbf{muss} die letzte Zeile die Gesamtzahl der geleisteten Arbeitstunden bzw. \enquote{nan} enthalten. % \begin{macrocode} every last row/.style={before row=\bottomrule}% }% % \end{macrocode} % \changes{v0.5}{2016/06/03}{made \enquote{\texttt{colortbl}} transparent} % Wir definieren ein Makro, das ein \package{colortbl}-Makro ändert um Transparenz in farbigen Tabellenzeilen zu erlauben. % % Siehe: \href{https://tex.stackexchange.com/questions/56424/alpha-channel-in-colortbl}{https://tex.stackexchange.com/questions/56424/alpha-channel-in-colortbl} % \begin{macrocode} \newcommand*\MLG@JK@colortbl@transparent% {% \def\CT@@do@color% {% \global\let\CT@do@color\relax% \@tempdima\wd\z@% \advance\@tempdima\@tempdimb% \advance\@tempdima\@tempdimc% \kern-\@tempdimb% \transparent{\MLG@JK@csvtab@opacity}% \leaders\vrule% \hskip\@tempdima\@plus 1fill% \kern-\@tempdimc% \hskip-\wd\z@ \@plus -1fill% }% }% % \end{macrocode} % \changes{v0.4}{2016/05/26}{added \cmd\Formular} % \begin{macro}{\Formular} % Das Makro \cmd\Formular\ erlaubt das Setzen eines Blankoformulars für die Arbeitszeiterfassung. % % \cs{Formular} % \begin{macrocode} \pgfplotstableread{% tag beginn pause ende dauer bemerkung 1 nan nan nan nan nan 2 nan nan nan nan nan 3 nan nan nan nan nan 4 nan nan nan nan nan 5 nan nan nan nan nan 6 nan nan nan nan nan 7 nan nan nan nan nan 8 nan nan nan nan nan 9 nan nan nan nan nan 10 nan nan nan nan nan 11 nan nan nan nan nan 12 nan nan nan nan nan 13 nan nan nan nan nan 14 nan nan nan nan nan 15 nan nan nan nan nan 16 nan nan nan nan nan 17 nan nan nan nan nan 18 nan nan nan nan nan 19 nan nan nan nan nan 20 nan nan nan nan nan 21 nan nan nan nan nan 22 nan nan nan nan nan 23 nan nan nan nan nan 24 nan nan nan nan nan 25 nan nan nan nan nan 26 nan nan nan nan nan 27 nan nan nan nan nan 28 nan nan nan nan nan 29 nan nan nan nan nan 30 nan nan nan nan nan 31 nan nan nan nan nan nan nan nan nan nan nan }\Formular% % \end{macrocode} % \end{macro} % Wir laden --- falls vorhanden --- die Datei \texttt{milog.cfg} % \changes{v0.2}{2016/05/20}{added loading of milog.cfg} % \begin{macrocode} \AtBeginDocument% {% \IfFileExists{milog.cfg}% {% \input{milog.cfg}% }{}% }% % \end{macrocode} % Wir setzen die persönlichen Daten innerhalb einer Tabelle mit erhöhtem Zeilenabstand. % \changes{v0.4}{2016/05/26}{made \texttt{id} optional in idtab} % \begin{macrocode} \newcommand*\MLG@JK@idtab% {% \MLG@JK@idtab@topskip% \renewcommand{\arraystretch}{\MLG@JK@idtab@as}% \begin{tabularx}{\MLG@JK@idtab@width}{>{\bfseries}r<{:}X}% \MLG@JK@companyname & \MLG@JK@company \\% \MLG@JK@namename & \MLG@JK@name \\% \ifthenelse{\equal{\MLG@JK@id}{}}% {}% {\MLG@JK@idname & \MLG@JK@id \\}% \MLG@JK@monthname & \MLG@JK@month% \end{tabularx}% }% % \end{macrocode} % Wir setzen die Arbeitszeiten (csv) innerhalb einer Tabelle mit leicht erhöhtem Zeilenabstand. % \begin{macrocode} \newcommand*\MLG@JK@csvtab[1]% {% \MLG@JK@csvtab@topskip% \renewcommand{\arraystretch}{\MLG@JK@csvtab@as}% \pgfplotstabletypeset{#1}% }% % \end{macrocode} % Wir setzen Unterschriftslinien mit zentriertem Label. % \begin{macrocode} \newcommand*\MLG@JK@signature[1]% {% \parbox{\MLG@JK@signature@width}% {% \dotfill\\[\MLG@JK@signature@labelskip]% \centering\footnotesize Datum, Unterschrift (#1)% }% }% % \end{macrocode} % Wir setzen ein Unterschriftenblock für Arbeitnehmer und Arbeitgeber. % \begin{macrocode} \newcommand*\MLG@JK@signaturebox% {% \MLG@JK@signaturebox@topskip% \MLG@JK@signature{\MLG@JK@signature@employee}% \hspace{\MLG@JK@signaturebox@space}% \MLG@JK@signature{\MLG@JK@signature@employer}% }% % \end{macrocode} % Wir definieren ein Makro für den Aufbau des Arbeitszeitnachweises. % \begin{macrocode} \newcommand*\MLG@JK@doc@body[1]% {% {\MLG@JK@heading@font@size\MLG@JK@heading@font@style\MLG@JK@heading}% \MLG@JK@idtab% \MLG@JK@csvtab{#1}% \MLG@JK@signaturebox% }% % \end{macrocode} % \changes{v0.2}{2016/05/20}{added \cmd\milogsetup} % \begin{macro}{\milogsetup} % Das Makro \cmd\milogsetup\ ermöglicht das erneute Setzen der globalen Optionen, z. B. in der Datei \texttt{milog.cfg}. % % \cs{milogsetup}\marg{Optionen} % \begin{macrocode} \newcommand*\milogsetup[1]% {% \setkeys{milog.cls}{#1}% }% % \end{macrocode} % \end{macro} % \begin{macro}{\milog} % Nun können wir das Usermakro \cmd\milog\ definieren % % \cs{milog}\oarg{Optionen}\marg{CSV-Datei} % \begin{macrocode} \newcommand\milog[2][]% {% % \end{macrocode} % Zunächst setzen die die Optionen für das Paket \package{background}. % Wir starten eine Gruppe um die Wirkung der Optionen lokal zu halten und % setzen abschließend die verschiedenen Formularabschnitte. % Falls ein cc (Carbon copy/Kopie) gewünscht wird, setzen wir den Dokumentbody erneut auf einer neuen Seite % und setzen auch das entsprechende Wasserzeichen im Hintergrund. % \begin{macrocode} \centering% \backgroundsetup% {% contents=\MLG@JK@bgopt@contents,% color=\MLG@JK@bgopt@color,% opacity=\MLG@JK@bgopt@opacity,% scale=\MLG@JK@bgopt@scale% }% \begingroup% \setkeys{milog}{#1}% \MLG@JK@colortbl@transparent% \MLG@JK@doc@body{#2}% \ifthenelse{\equal{\MLG@JK@cc}{true}}% {% \newpage% \BgThispage% \MLG@JK@doc@body{#2}% }% {}% \endgroup% }% % \end{macrocode} % \end{macro} % \begin{macrocode} % % \end{macrocode} % \begin{macrocode} %<*milogsh> % \end{macrocode} % \subsection{milog} % \label{sec:milogimpl} % \changes{v0.3}{2016/05/22}{added milog bash script} % Das folgende \texttt{milog} Bash-Script zeigt beispielhaft eine mögliche Implementierung zur automatischen Auswertung eines \texttt{CSV}-Exports % aus einer Arbeitszeiterfassungs"=App am Beispiel \enquote{Arbeitszeiterfassung}\cite{app:arbeitszeiterfassung}. % \begin{macrocode} #!/bin/bash # VERSION="v1.0 (C) Josef Kleber (LPPL)" % \end{macrocode} % Zunächst definieren wir einige Defaults, insbesondere für die \texttt{CSV}- und \texttt{PDF}-Ausgabedatei, sowie \enquote{boolsche} Schalter für die \enquote{CSV} und \enquote{LATEX} Durchgänge. % \begin{macrocode} INPUT="" OUTPUT="_milog_.csv" DATE="" PDF="milog" CSV="true" LATEX="true" # % \end{macrocode} % Nun können wir die Kommandozeilen-Argumente auswerten: % % \begin{description} % \item[-i] \texttt{CSV}-Eingabedatei % \item[-o] \texttt{CSV}-Ausgabedatei % \item[-p] \texttt{PDF}-Ausgabedatei % \item[-d] Datum/Zeitspanne, üblicherwiese im Format MM/YYYY % \item[-c] CSV only $\rightarrow$ \texttt{LATEX="false"} % \item[-l] LATEX only % \end{description} % \begin{macrocode} while getopts "i:o:d:p:cl" flag do case "$flag" in i) INPUT="$OPTARG";; o) OUTPUT="$OPTARG";; p) PDF="$OPTARG";; d) DATE="$OPTARG";; c) LATEX="false";; l) CSV="false";; esac done # % \end{macrocode} % Falls kein Datum übergeben wurde, versuchen wir den Namen der \texttt{CSV}-Eingabedatei im Format YYYYMM auszuwerten. % \begin{macrocode} if [ "$DATE" = "" ] then % \end{macrocode} % Zunächst definieren wir eine \enquote{regular expression} für eine sechsstellige Zahl und besorgen uns den Namen der \texttt{CSV}-Eingabedatei ohne Dateiendung. % \begin{macrocode} regex='^[0-9]{6}$' YEARMONTH=`echo "$INPUT" | cut -d'.' -f1` % \end{macrocode} % Gelingt ein \enquote{Match}, belegen wir \texttt{DATE} entsprechend im Format \texttt{MM/YYYY}. % \begin{macrocode} if [[ "$YEARMONTH" =~ $regex ]] then YEAR=`echo "$YEARMONTH" | cut -c1-4` MONTH=`echo "$YEARMONTH" | cut -c5-6` DATE="$MONTH/$YEAR" fi fi # % \end{macrocode} % Im \texttt{CSV}-Durchgang lesen wir zunächst die \texttt{CSV}-Eingabedatei ein, transformieren sie in das von \class{milog.cls} benötigte Format und schreiben sie in die \texttt{CSV}-Ausgabedatei. % \begin{macrocode} if [ "$CSV" = "true" ] then echo "reading $INPUT" cat "$INPUT" | \ # delete first 3 lines head -n -4 | \ # delete last 3 lines tail -n +4 | \ # deal with "empty" lines sed -e 's/;;;;;;;;;$/{};{};{};{};{};{};{};{};{}/' | \ # delete some columns we don't need cut -d ';' -f 2-4,8-10 | \ # replace the last ';' with ';{}' sed -e 's/;$/;{}/' | \ # replace header keys sed -e 's/Datum/tag/' -e 's/von/beginn/' -e 's/bis/ende/' -e 's/Pausen/pause/' -e 's/Netto/dauer/' -e 's/Visum/bemerkung/' | \ # change 'Ruhetag' lines sed -e 's/\(.*\);Ruhetag;Ruhetag;.*/\1;{};{};{};{};Ruhetag/' | \ # change 'Ferien/Urlaub' lines sed -e 's#\(.*\);Ferien/Urlaub;Ferien/Urlaub;.*#\1;{};{};{};{};Urlaub#' | \ # change 'Krank' lines sed -e 's/\(.*\);Krank;Krank;.*/\1;{};{};{};{};Krank/' | \ # change 'Feiertag' lines sed -e 's/\(.*\);Feiertag;Feiertag;.*/\1;{};{};{};{};Feiertag/' | \ # change last line with total hours sed -e 's/^;;;;\(.*\)/nan;nan;nan;nan;\1;nan/' | \ # replace '0:00' with '{}' sed -e 's/0:00/{}/g' | \ # change order of columns and field seperator (';' -> '\t') awk 'BEGIN { OFS="\t"; FS=";" } { print $1, $2, $4, $3, $5, $6 }' >"$OUTPUT" echo "writing $OUTPUT" fi # % \end{macrocode} % Im \texttt{LATEX}-Durchgang prüfen wir zuerst auf \enquote{\texttt{LATEX} only} und passen die \texttt{CSV}-Ausgabedatei entsprechend an. % \begin{macrocode} if [ "$LATEX" = "true" ] then if [ "$CSV" = "false" ] then if [ -z "$INPUT" ] then OUTPUT="_milog_.csv" else OUTPUT="$INPUT" fi fi % \end{macrocode} % Wir definieren eine \texttt{HERE}-\LaTeX-Datei ... % \begin{macrocode} cat >"$PDF.tex" <&1 >/dev/null rm "$PDF".tex "$PDF".aux "$PDF".log fi # exit 0 % \end{macrocode} % \begin{macrocode} % % \end{macrocode} %\Finale