%
% Author: Rolf Niepraschk, https://github.com/rolfn/kalenderRN
%
% inspired by http://www.texample.net/tikz/examples/a-calender-for-doublesided-din-a4/
% Original author: Robert Krause
% License: Creative Commons attribution license (CC-BY-SA)

\setcounter{errorcontextlines}{100}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesClass{tikz-kalender}[2019/11/22 v0.4f Calendar class (RN)] 

\DeclareOption*{\OptionNotUsed}
\ProcessOptions\relax

\newcommand*\RN@events@files{}
\newcommand*\RN@titleFont{}
\newcommand*\RN@yearFont{}
\newcommand*\RN@monthFont{}
\newcommand*\RN@dayFont{}
\newcommand*\RN@dayNbFont{}
\newcommand*\RN@weekNbFont{}
\newcommand*\RN@eventFont{}
\newcommand*\RN@normalFont{}
\newcommand*\RN@title{}
\newcommand*\RN@year{}\edef\RN@year{\the\numexpr\year}
\newcommand*\RN@yearText{\RN@year}
\newcommand*\RN@period@name{}
\newcommand*\RN@xcolorOptions{}
\newcommand*\RN@events@I{}
\newcommand*\RN@events@II{}
\newcommand*\RN@backgrounds{}
\newcommand*\RN@periods{}
\newcommand*\RN@tempa{}
\newcommand*\RN@tempb{}

\newcommand*\RN@titleColor{dark}
\newcommand*\RN@eventColor{medium}
\newcommand*\RN@monthBGcolor{dark}
\newcommand*\RN@monthColor{white}
\newcommand*\RN@workdayColor{none}
\newcommand*\RN@saturdayColor{bright}
\newcommand*\RN@sundayColor{medium}
\newcommand*\RN@periodColor{period}

\newcounter{weeknumber}
\newsavebox\RN@pageI
\newsavebox\RN@pageII
\newsavebox\RN@tempbox

\newdimen\RN@xunit
\newdimen\RN@yunit
\newdimen\RN@calheight
\newdimen\RN@calwidth
\newdimen\RN@daywidth 
\newdimen\RN@daysep
\newdimen\RN@dayheight
\newdimen\RN@eventwidthL 
\newdimen\RN@eventwidthS 

\newif\ifRN@showweeknumbers \RN@showweeknumbersfalse
\newif\ifRN@print \RN@printfalse
\newif\ifRN@XeOrLua \RN@XeOrLuafalse
\RequirePackage{ifluatex,ifxetex}
\ifxetex\RN@XeOrLuatrue\else\ifluatex\RN@XeOrLuatrue\fi\fi 

\LoadClass{article}

\RequirePackage{pgfkeys,etoolbox,ragged2e}

\pgfkeys{
  /RN/.cd,
  showweeknumbers/.is if = RN@showweeknumbers,
  print/.is if = RN@print,
  events/.store in=\RN@events@files,
  titleFont/.store in=\RN@titleFont,
  yearFont/.store in=\RN@yearFont,
  monthFont/.store in=\RN@monthFont,
  dayFont/.store in=\RN@dayFont,
  dayNbFont/.store in=\RN@dayNbFont,
  weekNbFont/.store in=\RN@weekNbFont,
  eventFont/.store in=\RN@eventFont,% ???
  title/.store in=\RN@title,
  year/.store in=\RN@year,
  yearText/.store in=\RN@yearText,
  titleColor/.store in=\RN@titleColor,
  eventColor/.store in=\RN@eventColor,
  periodColor/.store in=\RN@periodColor,
  monthBGcolor/.store in=\RN@monthBGcolor,
  monthColor/.store in=\RN@monthColor,
  workdayColor/.store in=\RN@workdayColor,
  saturdayColor/.store in=\RN@saturdayColor,
  sundayColor/.store in=\RN@sundayColor,
  xcoloroptions/.code={\PassOptionsToPackage{#1}{xcolor}},
  lang/.code={\PassOptionsToPackage{#1}{babel}%
    \PassOptionsToPackage{#1}{translator}},
  paper/.code={\PassOptionsToPackage{#1paper}{geometry}}
}

\newcommand*\setup[1]{\pgfqkeys{/RN}{#1}}

\PassOptionsToPackage{a4paper}{geometry}
\PassOptionsToPackage{svgnames}{xcolor}

\ifRN@XeOrLua
  \RequirePackage{fontspec,unicode-math}
  \setmathfont{latinmodern-math}[%
    Extension=.otf,math-style=ISO,bold-style=ISO,
  ]
  \setsansfont{texgyreheros}[%
    Extension=.otf,Ligatures=TeX,
    UprightFont= *-regular,
    BoldFont=*-bold,
    ItalicFont=*-italic,
    BoldItalicFont=*-bolditalic
  ]
\else
  \RequirePackage[T1]{fontenc}
  \RequirePackage{textcomp}
  \RequirePackage{lmodern}
  \RequirePackage{tgheros}
\fi

\renewcommand*\familydefault{\sfdefault}

\AtEndPreamble{% "etoolbox"
  \ifRN@print
    \RequirePackage{graphicx}
    \PassOptionsToPackage{portrait}{geometry}
  \else
    \PassOptionsToPackage{landscape}{geometry}
  \fi
  \RequirePackage[margin={0mm,0mm}]{geometry}
  \ifRN@XeOrLua\else
    \@ifpackageloaded{inputenc}{}{\RequirePackage[utf8]{inputenc}}%
  \fi
  \RequirePackage{babel,translator,tikz}
  \@ifpackagelater{pgf}{2019/05/10}{}{%
    \def\pgfutil@translate#1{\translate{#1}}%
    % Correct the wrong definition in `pgfutil-latex.def' 
  }%
  \input{tikz-kalender-translation.clo}
  \usetikzlibrary{calendar}
}

\AtBeginDocument{%
  \definecolor{dark}{HTML}{A57C00}
  \colorlet{medium}{dark!35}
  \colorlet{bright}{dark!20}
  \colorlet{period}{gray!30}
  \RN@calwidth=\ifRN@print\paperheight\else\paperwidth\fi
  \RN@calheight=\ifRN@print\paperwidth\else\paperheight\fi 
  \@tempcnta=\RN@calwidth
  \divide\@tempcnta by \@M %
  \RN@xunit=\@tempcnta sp %                  0.0845pt (a4)
  \@tempcnta=\RN@calheight
  \divide\@tempcnta by \@M %
  \RN@yunit=\@tempcnta sp %                 0.05974pt (a4)
  \RN@daywidth=1515\RN@xunit%                    45mm (a4)
  \RN@daysep=118\RN@xunit   %                   3.5mm (a4)
  \RN@dayheight=192\RN@xunit%                   5.7mm (a4)
  \RN@setFont{RN@dayFont}{134}%                   8pt (a4)     
  \RN@setFont{RN@dayNbFont}{167}%                10pt (a4)
  \RN@setFont{RN@eventFont}{134}%                 8pt (a4)
  \RN@setFont[\normalfont]{RN@normalFont}{167}%  10pt (a4)
  \RN@setFont{RN@weekNbFont}{134}%                8pt (a4)
  \RN@setFont[\bfseries]{RN@monthFont}{167}%     10pt (a4)
  \RN@setFont[\bfseries]{RN@titleFont}{666}%     40pt (a4)
  \RN@setFont[\bfseries]{RN@yearFont}{1000}%     60pt (a4)
  \RN@normalFont
  \settowidth\@tempdima{\RN@formatDayNb{99}\RN@formatDay{0}}%
  \RN@eventwidthL=\dimexpr\RN@daywidth-\@tempdima
  \settowidth\@tempdima{\setcounter{weeknumber}{99}%
    \RN@formatWeekNb{weeknumber}%
  }
  \RN@eventwidthS=\dimexpr\RN@eventwidthL-\@tempdima
}

\pgfkeys{%
  /RN/.is family, /RN,
  period/.cd,
  color/.estore in=\RN@periodColor,
  name/.estore in=\RN@period@name
}
\pgfkeys{%
  /RN/.is family, /RN,
  event/.cd,
  color/.estore in = \RN@eventColor
}

\newcommand\RN@formatTitle[3]{%
  \raisebox{-.3\height}{\parbox[b]{#1}{%
    \color{\RN@titleColor}%
    \makebox[0pt][l]{\RN@yearFont#2}\hfill
    \RN@titleFont#3\hfill\mbox{}%
  }}%
}
\newcommand*\RN@formatDayNb[1]{%
  \RN@dayNbFont#1\hspace{50\RN@xunit}%
}
\newcommand*\RN@formatDay[1]{%
  \RN@dayFont\pgfcalendarweekdayshortname{#1}%
}
\newcommand*\RN@formatWeekNb[1]{%
  \hspace{30\RN@xunit}\RN@weekNbFont
  \raisebox{.15ex}{[\raisebox{-.15ex}{\arabic{#1}}]}%
  \hspace{20\RN@xunit}%
}
\newcommand*\RN@formatEvent[2]{%
  \RN@eventFont
  \def\RN@tempa{\strut#2}%
  \settowidth\@tempdima{\mbox{\RN@tempa}}%
  \ifdim\@tempdima>#1 %
    \@tempdimb=\dimexpr\f@size pt %
    \@tempdimb=.8\@tempdimb%
    \def\RN@tempa{\fontsize{\@tempdimb}{1.1\@tempdimb}\selectfont#2}%
  \fi
  \makebox[-50\RN@xunit][r]{\raisebox{0.55\totalheight}[\totalheight]{%
    \parbox[c]{#1}{\raggedleft\hskip\z@\RN@tempa}}}% \nointerlineskip 
}

\newcommand*\RN@setFont[3][]{%
  \@tempdima=#3\RN@yunit \@tempdimb=1.2\@tempdima %
  \expandafter\protected@edef\csname#2\endcsname{\noexpand\fontsize
    {\the\@tempdima}{\the\@tempdimb}#1\csname#2\endcsname\noexpand\selectfont}%
} 

\newcommand*\period[2]{%
  \@ifnextchar[{\RN@period@i{#1}{#2}}{\RN@period@i{#1}{#2}[]}%
}
\newcommand*\RN@period@i{}
\def\RN@period@i#1#2[#3]{%
  \begingroup
  \pgfkeys{/RN/period/.cd, #3}%
  \edef\@tempa{%
    \noexpand\ifdate{between=#1 and #2}{%
      \noexpand\tikzset{every day/.style={fill=\RN@periodColor}}}{}%
  }%
  \expandafter\g@addto@macro\expandafter\RN@periods\expandafter{\@tempa}%
  \ifx\RN@period@name\@empty\else
    \pgfcalendar{}{#1}{#2}{%
      \edef\RN@tempa{\pgfcalendarcurrentyear-\pgfcalendarcurrentmonth-%
        \pgfcalendarcurrentday}%
      \let\RN@event@ii=\RN@event@ii@orig% activate temporarily 
      % period name as event entry for event-less days
      \event{\RN@tempa}{\RN@period@name}%
    }%
  \fi
  \endgroup
}

\newcommand*\event{%
  \ClassError{tikz-kalender}{%
    Macro \string\event\space is only allowed inside of .events files}{}%
}

\newcommand*\RN@event{%
  \@ifstar{\@tempswatrue\RN@event@i}{\@tempswafalse\RN@event@i}%
}
\newcommand*\RN@event@i[2]{%
  \@ifnextchar[{\RN@event@ii{#1}{#2}}{\RN@event@ii{#1}{#2}[]}%
}

\newcommand*\RN@event@ii{}%
\def\RN@event@ii#1#2[#3]{%
  \begingroup
  \pgfkeys{/RN/event/.cd, #3}%
  \@tempdima=\RN@eventwidthL
  \ifRN@showweeknumbers
    \pgfcalendarifdate{#1}{Monday}{\@tempdima=\RN@eventwidthS}{}%
  \fi
  \@ifundefined{event@#1}{%
    \expandafter\protected@xdef\csname event@#1\endcsname{#2}%
    \protected@edef\@tempa{\noexpand\@ifundefined{pgf@sh@ns@cal-#1}{}{%
        \noexpand\node[anchor=south west,inner sep=0pt] at (cal-#1.south east){%
        \noexpand\RN@formatEvent{\the\@tempdima}{%
          \noexpand\csname event@#1\endcsname}};%
      }
    }%
    \pgfcalendarifdate{#1}{at most=06-last}% first half-year?
      {\expandafter\g@addto@macro\expandafter\RN@events@I\expandafter{\@tempa}}%
      {\expandafter\g@addto@macro\expandafter\RN@events@II\expandafter{\@tempa}}%
  }{%
    \expandafter\protected@xdef\csname event@#1\endcsname{%
      #2, \csname event@#1\endcsname}%
  }  
  \if@tempswa
    \edef\@tempa{%
      \noexpand\ifdate{equals=#1}{\noexpand\tikzset{%
        every day/.style={fill=\RN@eventColor}}}{}%
    }%
    \expandafter\g@addto@macro\expandafter\RN@backgrounds\expandafter{\@tempa}%
  \fi
  \endgroup 
}

\let\RN@event@ii@orig=\RN@event@ii

\newcommand\RN@makeKalender[2]{%
  \sbox\RN@tempbox{%
    \begin{tikzpicture}[every day/.style={anchor=north}]%
      \calendar[dates=#1 to #2,name=cal,day text={\%d=},%day yshift=3em,%  ????
        day code={%
          \node[name=\pgfcalendarsuggestedname,every day,%
          shape=rectangle,minimum height=\RN@dayheight,%
          text width=\RN@daywidth,draw=black
          ]{\RN@formatDayNb{\tikzdaytext}%
            \RN@formatDay{\pgfcalendarcurrentweekday}%
            \ifRN@showweeknumbers
              \ifdate{Monday}{\stepcounter{weeknumber}%
                \RN@formatWeekNb{weeknumber}}{}%
            \fi};
        },%
        execute before day scope={%
          \ifdate{day of month=1}{%
            \pgftransformxshift{\dimexpr\RN@daywidth+\RN@daysep}%
            % Print month name
            \draw (0,0)node [shape=rectangle,minimum height=\RN@dayheight,%
              text width=\RN@daywidth,fill=\RN@monthBGcolor,%
              draw=\RN@monthBGcolor,text=\RN@monthColor,text centered]{%
              \RN@monthFont\pgfcalendarmonthname{\pgfcalendarcurrentmonth}};
          }{}%
          \ifdate{workday}{\tikzset{every day/.style=%
            {fill=\RN@workdayColor}}}{}%
          %\RN@periods
          \ifdate{Saturday}{\tikzset{every day/.style=%
            {fill=\RN@saturdayColor}}}{}%
          \ifdate{Sunday}{\tikzset{every day/.style=%
            {fill=\RN@sundayColor}}}{}%
          \RN@backgrounds
          \RN@periods
          %\RN@backgrounds
        },%
        execute at begin day scope={%
          \pgftransformyshift{-\pgfcalendarcurrentday\RN@dayheight}%
        }%
      ];%
      \pgfcalendarifdate{#1}{at most=06-last}{\RN@events@I}{\RN@events@II}%
    \end{tikzpicture}%
  }%
  \parbox[c][\RN@calheight]{\RN@calwidth}{%
    \vfill
    \centering
    \RN@formatTitle{\wd\RN@tempbox}{\RN@yearText}{\RN@title}%
    \vfill
    \usebox\RN@tempbox
    \vfill
  }%
}

\newcommand*\makeKalender{%
  \pgfcalendarifdate{\RN@year-01-01}{Tuesday,Wednesday,Thursday}{%
    \setcounter{weeknumber}{1}}{\setcounter{weeknumber}{0}}%
  \begingroup%
    \let\event=\RN@event
    \let\year=\RN@year
    \def\RN@event@ii##1##2[##3]{}% 1st loop: only the periods 
    \def\do##1{\InputIfFileExists{##1.events}{}{}}%
    \expandafter\docsvlist\expandafter{\RN@events@files}%
  \endgroup
  \begingroup
    \let\event=\RN@event
    \let\year=\RN@year
    \def\RN@period@i##1##2[##3]{}% 2nd loop: only the events 
    \def\do##1{\InputIfFileExists{##1.events}{}{}}%
    \expandafter\docsvlist\expandafter{\RN@events@files}%
  \endgroup
  \sbox{\RN@pageI}{\RN@makeKalender{\RN@year-01-01}{\RN@year-06-30}}%
  \sbox{\RN@pageII}{\RN@makeKalender{\RN@year-07-01}{\RN@year-12-31}}%
  \ifRN@print
    \rotatebox[origin=c]{90}{\usebox\RN@pageI}%
  \else
    \usebox\RN@pageI
  \fi
  \newpage
  \ifRN@print
    \rotatebox[origin=c]{-90}{\usebox\RN@pageII}%
  \else
    \usebox\RN@pageII
  \fi
}

\setlength\parindent{0pt}
\pagestyle{empty}

\endinput
%%
%% End of file `tikz-kalender.cls'.




