diff --git a/calendar.tex b/calendar.tex index fffe050..0bebfc1 100644 --- a/calendar.tex +++ b/calendar.tex @@ -5,7 +5,7 @@ %\usepackage{fontspec} \usepackage[unicode]{hyperref} \usepackage[margin=5mm,a4paper,portrait]{geometry} -\input{calendardata} +%\input{calendardata} \usepackage{calpage} \pagestyle{empty} diff --git a/calendardata.tex b/calendardata.tex deleted file mode 100644 index e34f084..0000000 --- a/calendardata.tex +++ /dev/null @@ -1,403 +0,0 @@ -\usepackage{graphicx} -\usepackage{tikz} -%%%< -\usepackage{verbatim} -%%%> - -\usetikzlibrary{calendar,fit} -\usepackage{expl3,xparse} - -%% Adapted from http://tex.stackexchange.com/a/10199/4771 -\makeatletter% -\tikzoption{day headings}{\tikzstyle{day heading}=[#1]} -\tikzstyle{day heading}=[] -\tikzstyle{day letter headings}=[ - execute before day scope={ \ifdate{day of month=1}{% - \pgfmathsetlength{\pgf@ya}{\tikz@lib@cal@yshift}% - \pgfmathsetlength\pgf@xa{\tikz@lib@cal@xshift}% - \pgftransformyshift{-\pgf@ya} - \foreach \d/\l in {0/Montag,1/Dienstag,2/Mittwoch,3/Donnerstag,% - 4/Freitag,5/Samstag,6/Sonntag} { - \pgf@xa=\d\pgf@xa% - \pgftransformxshift{\pgf@xa-\cellwidth/2}% - \pgftransformyshift{\pgf@ya}% - \node[above=-0.5ex,day heading]{\l};% - } - }{}% - }% -] -\makeatother% -%% End - -%% Adapted from pgf source -\def\pgfcalendarmonthname#1{% - \translate{\ifcase#1\or Januar\or Februar\or März\or April\or - Mai\or Juni\or Juli\or August\or September\or Oktober\or - November\or Dezember\fi}% -} - -\makeatletter -\tikzstyle{month label above centered}=[% - execute before day scope={% - \ifdate{day of month=1}{% - { - \pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift}% - \pgf@xb=\tikz@lib@cal@width\pgf@xa% - \advance\pgf@xb by-\pgf@xa% - \pgf@xb=.5\pgf@xb% - \pgftransformxshift{\pgf@xb}% - \pgftransformxshift{-\cellwidth/2}% - \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift}% - \pgftransformyshift{0.333\pgf@y} - \tikzmonthcode% - } - }{}}, - every month/.append style={anchor=base} -] -\makeatother -%% End - -\ExplSyntaxOn - -%% Adapted from http://tex.stackexchange.com/a/56214/4771 -%% -% first of all we define the user level commands -\NewDocumentCommand{\addtext}{ m }{ \bdaycal_input_add:n { #1 } } -\NewDocumentCommand{\addtextyear}{ mm }{ \bdaycal_input_add_y:nn { #1 } { #2 } } -\NewDocumentCommand{\showtext}{ }{ \bdaycal_output_direct: } - -% allocate variable: -% a sequence for global storage of the inputs; -\seq_new:N \g_bdaycal_input_seq - -% store globally an input in the sequence -\cs_new:Npn \bdaycal_input_add:n #1 - { - \seq_gput_right:Nn \g_bdaycal_input_seq { #1 } - } - -\cs_new:Npn \bdaycal_input_add_y:nn #1 #2 - { - \seq_gput_right:Nn \g_bdaycal_input_seq { #1 ~ ( \int_to_arabic:n - { \pgfcalendarifdateyear - #2 } ) } - } - -% how to output in direct order; we simply do a mapping function calling -% \bdaycal_print:n after incrementing the counter -\cs_new_protected:Npn \bdaycal_output_direct: - { - \seq_map_inline:Nn \g_bdaycal_input_seq - { - \bdaycal_print:n { ##1 } - } - \seq_gclear:N \g_bdaycal_input_seq - } - -% the printing macro; change here for adapting to your wishes -\cs_new:Npn \bdaycal_print:n #1 - { - #1 \par - } -%% End - -%% Knuth's AoCP, vol 1, 2nd ed, pp 155--156 -\int_new:N \l_easter_Y_int -\int_new:N \l_easter_G_int -\int_new:N \l_easter_C_int -\int_new:N \l_easter_X_int -\int_new:N \l_easter_Z_int -\int_new:N \l_easter_D_int -\int_new:N \l_easter_E_int -\int_new:N \l_easter_N_int -\int_new:N \l_easter_M_int -\int_new:N \l_easter_julian_day_int - -\cs_new:Nn \easter_sunday:n { - - \int_set:Nn \l_easter_Y_int { #1 } - - \int_set:Nn \l_easter_G_int { - \int_mod:nn { \l_easter_Y_int } { 19 } + 1 - } - - \int_set:Nn \l_easter_C_int { - \int_div_truncate:nn { \l_easter_Y_int } { 100 } + 1 - } - - \int_set:Nn \l_easter_X_int { - \int_div_truncate:nn { 3 * \l_easter_C_int } { 4 } - 12 - } - - \int_set:Nn \l_easter_Z_int { - \int_div_truncate:nn { 8 * \l_easter_C_int + 5 } { 25 } - 5 - } - - \int_set:Nn \l_easter_D_int { - \int_div_truncate:nn { 5 * \l_easter_Y_int } { 4 } - \l_easter_X_int - 10 - } - - \int_set:Nn \l_easter_E_int { - \int_mod:nn { 11 * \l_easter_G_int + 20 + \l_easter_Z_int - - \l_easter_X_int } { 30 } - } - - % \int_mod:nn behaves strangely. - \int_compare:nNnT { \l_easter_E_int } < { 0 } - { - \int_add:Nn \l_easter_E_int { 30 } - } - - \int_compare:nNnTF { \l_easter_E_int } = { 25 } - { % true - \int_compare:nNnT { \l_easter_G_int } > { 11 } - { % true - \int_incr:N \l_easter_E_int - } - } - { % false - \int_compare:nNnT { \l_easter_E_int } = { 24 } - { % true - \int_incr:N \l_easter_E_int - } - } - - \int_set:Nn \l_easter_N_int { 44 - \l_easter_E_int } - - \int_compare:nNnT { \l_easter_N_int } < { 21 } - { % true - \int_add:Nn \l_easter_N_int { 30 } - } - - \int_add:Nn \l_easter_N_int { - 7 - \int_mod:nn { \l_easter_D_int + \l_easter_N_int } { 7 } - } - - \int_compare:nNnTF { \l_easter_N_int } > { 31 } - { % true - \int_sub:Nn \l_easter_N_int { 31 } - \int_set:Nn \l_easter_M_int { 4 } % April - } - { % false - \int_set:Nn \l_easter_M_int { 3 } % March - } - - \pgfcalendardatetojulian { \l_easter_Y_int - - \l_easter_M_int - \l_easter_N_int - } { \l_easter_julian_day_int } - -} - -\pgfkeys{/pgf/calendar/Easter/.default = 0} -\pgfkeys{/pgf/calendar/Easter/.code = - { - \easter_sunday:n { \pgfcalendarifdateyear } - \int_compare:nNnT { \pgfcalendarifdatejulian } - = {\l_easter_julian_day_int + #1} - { \pgfcalendarmatchestrue } - } -} - -\int_new:N \l_advent_Y_int -\int_new:N \l_advent_xmas_julian_day_int -\int_new:N \l_advent_xmas_week_day_int -\int_new:N \l_advent_julian_day_int - -\cs_new:Nn \advent_sunday:n { - - \int_set:Nn \l_advent_Y_int { #1 } - - \pgfcalendardatetojulian { \l_advent_Y_int - 12 - 25 } { - \l_advent_xmas_julian_day_int } - - \pgfcalendarjuliantoweekday { \l_advent_xmas_julian_day_int } { - \l_advent_xmas_week_day_int } - - \int_set:Nn \l_advent_julian_day_int { - \l_advent_xmas_julian_day_int - \l_advent_xmas_week_day_int - 22 } - -} - -\pgfkeys{/pgf/calendar/Advent/.default = 0} -\pgfkeys{/pgf/calendar/Advent/.code = - { - \advent_sunday:n { \pgfcalendarifdateyear } - \int_compare:nNnT { \pgfcalendarifdatejulian } - = {\l_advent_julian_day_int + #1} - { \pgfcalendarmatchestrue } - } -} - -%% http://www.tondering.dk/claus/cal/week.php#calcweekno -\int_new:N \l_week_number_year_int -\int_new:N \l_week_number_month_int -\int_new:N \l_week_number_day_int -\int_new:N \l_week_number_a_int -\int_new:N \l_week_number_b_int -\int_new:N \l_week_number_c_int -\int_new:N \l_week_number_s_int -\int_new:N \l_week_number_e_int -\int_new:N \l_week_number_f_int -\int_new:N \l_week_number_g_int -\int_new:N \l_week_number_d_int -\int_new:N \l_week_number_n_int -\int_new:N \l_week_number_W_int - -\cs_new:Nn \week_number:nnn { - - \int_set:Nn \l_week_number_year_int { #1 } - \int_set:Nn \l_week_number_month_int { #2 } - \int_set:Nn \l_week_number_day_int { #3 } - - \int_compare:nNnTF { \l_week_number_month_int } < { 3 } % jan or feb - { % true - - \int_set:Nn \l_week_number_a_int { \l_week_number_year_int - 1 } - - \int_set:Nn \l_week_number_b_int { - \int_div_truncate:nn { \l_week_number_a_int } { 4 } - - \int_div_truncate:nn { \l_week_number_a_int } { 100 } - + \int_div_truncate:nn { \l_week_number_a_int } { 400 } - } - - \int_set:Nn \l_week_number_c_int { - \int_div_truncate:nn { \l_week_number_a_int - 1 } { 4 } - - \int_div_truncate:nn { \l_week_number_a_int - 1 } { 100 } - + \int_div_truncate:nn { \l_week_number_a_int - 1 } { 400 } - } - - \int_set:Nn \l_week_number_s_int { - \l_week_number_b_int - \l_week_number_c_int } - - \int_zero:N \l_week_number_e_int - - \int_set:Nn \l_week_number_f_int { \l_week_number_day_int - 1 - + 31 * ( \l_week_number_month_int - 1 ) } - - } % end true - { % false - - \int_set_eq:NN \l_week_number_a_int \l_week_number_year_int - - \int_set:Nn \l_week_number_b_int { - \int_div_truncate:nn { \l_week_number_a_int } { 4 } - - \int_div_truncate:nn { \l_week_number_a_int } { 100 } - + \int_div_truncate:nn { \l_week_number_a_int } { 400 } - } - - \int_set:Nn \l_week_number_c_int { - \int_div_truncate:nn { \l_week_number_a_int - 1 } { 4 } - - \int_div_truncate:nn { \l_week_number_a_int - 1 } { 100 } - + \int_div_truncate:nn { \l_week_number_a_int - 1 } { 400 } - } - - \int_set:Nn \l_week_number_s_int { - \l_week_number_b_int - \l_week_number_c_int } - - \int_set:Nn \l_week_number_e_int { \l_week_number_s_int + 1 } - - \int_set:Nn \l_week_number_f_int { \l_week_number_day_int - + \int_div_truncate:nn { - 153 * ( \l_week_number_month_int - 3 ) + 2 } { 5 } - + 58 + \l_week_number_s_int } - - } % end false - - \int_set:Nn \l_week_number_g_int { - \int_mod:nn { \l_week_number_a_int + \l_week_number_b_int } { 7 } } - - \int_set:Nn \l_week_number_d_int { - \int_mod:nn { \l_week_number_f_int + \l_week_number_g_int - - \l_week_number_e_int } { 7 } } - - \int_set:Nn \l_week_number_n_int { - \l_week_number_f_int + 3 - \l_week_number_d_int } - - \int_compare:nNnTF { \l_week_number_n_int } < { 0 } - { %true - - \int_set:Nn \l_week_number_W_int { 53 - - \int_div_truncate:nn { \l_week_number_g_int - - \l_week_number_s_int } { 5 } } - - } % end true - { % false - - \int_compare:nNnTF { \l_week_number_n_int } > { 364 - + \l_week_number_s_int } - { % true - - \int_set:Nn \l_week_number_W_int { 1 } - - } % end true - { % false - - \int_set:Nn \l_week_number_W_int { \int_div_truncate:nn { - \l_week_number_n_int } { 7 } + 1 } - - } % end false - - } % end false - -} - -\definecolor{red}{rgb}{0.937254901961,0.16862745098,0.176470588235} - -\newsavebox{\flagCH} -\savebox{\flagCH}{ -\begin{tikzpicture} - \fill[red] rectangle (20pt,20pt); - \fill[white,xshift=7.5pt, yshift=3pt] rectangle (5pt,14pt); - \fill[white,xshift=3pt, yshift=7.5pt] rectangle (14pt,5pt); -\end{tikzpicture} -} - -\pgfkeys{/tikz/week~number/.code = - { - \week_number:nnn { - \pgfcalendarifdateyear } { - \pgfcalendarifdatemonth } { - \pgfcalendarifdateday } - \addtext{ Woche ~ \int_to_arabic:n { \l_week_number_W_int } } - } -} - -\ExplSyntaxOff - -\pgfkeys{/tikz/flag-flying day/.code = - { - \draw (-\cellwidth,0) node [above right,font=\Huge] - {\resizebox{!}{0.8ex}{\usebox{\flagCH}}}; - } -} - -\pgfkeys{/tikz/observance/.code = - { - \addtext{#1} - } -} - -\pgfkeys{/tikz/anniversary/.code 2 args=\addtextyear{#1}{#2}} - -\pgfkeys{/tikz/day code = - { - \node (lower right) at (0,0) [above left,font=\Large] {\tikzdaytext}; - \node (upper left) at (-\cellwidth,\cellheight) - [below right,align=left,text width=\cellwidth-\pgflinewidth, - font=\tiny,black] {\showtext}; - \node (lower left) at (-\cellwidth,0) {}; - \node[draw, - fit=(lower right) (upper left) (lower left), - inner sep=1mm] {}; - } -} - -\pgfkeys{/tikz/inner sep = 0pt} - -\pgfkeys{/tikz/day xshift=\cellwidth+2mm+2mm} - -\pgfkeys{/tikz/day yshift=\cellheight+2mm+2mm} - -\newlength{\cellheight} -\setlength{\cellheight}{14mm} -\newlength{\cellwidth} -\setlength{\cellwidth}{24.75mm} diff --git a/calpage.sty b/calpage.sty index ac2c97e..c013ce8 100644 --- a/calpage.sty +++ b/calpage.sty @@ -5,8 +5,407 @@ \ProcessOptions\relax +\usepackage{graphicx} +\usepackage{tikz} \usepackage[export]{adjustbox} \usepackage{xparse} +%%%< +\usepackage{verbatim} +%%%> + +\usetikzlibrary{calendar,fit} +\usepackage{expl3} + +%% Adapted from http://tex.stackexchange.com/a/10199/4771 +\tikzoption{day headings}{\tikzstyle{day heading}=[#1]} +\tikzstyle{day heading}=[] +\tikzstyle{day letter headings}=[ + execute before day scope={ \ifdate{day of month=1}{ + \pgfmathsetlength{\pgf@ya}{\tikz@lib@cal@yshift} + \pgfmathsetlength\pgf@xa{\tikz@lib@cal@xshift} + \pgftransformyshift{-\pgf@ya} + \foreach \d/\l in {0/Montag,1/Dienstag,2/Mittwoch,3/Donnerstag, + 4/Freitag,5/Samstag,6/Sonntag} { + \pgf@xa=\d\pgf@xa + \pgftransformxshift{\pgf@xa-\cellwidth/2} + \pgftransformyshift{\pgf@ya} + \node[above=-0.5ex,day heading]{\l}; + } + }{} + } +] +%% End + +%% Adapted from pgf source +\def\pgfcalendarmonthname#1{ + \translate{\ifcase#1\or Januar\or Februar\or März\or April\or + Mai\or Juni\or Juli\or August\or September\or Oktober\or + November\or Dezember\fi} +} + +\tikzstyle{month label above centered}=[ + execute before day scope={ + \ifdate{day of month=1}{ + { + \pgfmathsetlength{\pgf@xa}{\tikz@lib@cal@xshift} + \pgf@xb=\tikz@lib@cal@width\pgf@xa + \advance\pgf@xb by-\pgf@xa + \pgf@xb=.5\pgf@xb + \pgftransformxshift{\pgf@xb} + \pgftransformxshift{-\cellwidth/2} + \pgfmathsetlength{\pgf@y}{\tikz@lib@cal@yshift} + \pgftransformyshift{0.333\pgf@y} + \tikzmonthcode + } + }{}}, + every month/.append style={anchor=base} +] +%% End + +\ExplSyntaxOn + +%% Adapted from http://tex.stackexchange.com/a/56214/4771 +%% +% first of all we define the user level commands +\NewDocumentCommand{\addtext}{ m }{ \bdaycal_input_add:n { #1 } } +\NewDocumentCommand{\addtextyear}{ mm }{ \bdaycal_input_add_y:nn { #1 } { #2 } } +\NewDocumentCommand{\showtext}{ }{ \bdaycal_output_direct: } + +% allocate variable: +% a sequence for global storage of the inputs; +\seq_new:N \g_bdaycal_input_seq + +% store globally an input in the sequence +\cs_new:Npn \bdaycal_input_add:n #1 + { + \seq_gput_right:Nn \g_bdaycal_input_seq { #1 } + } + +\cs_new:Npn \bdaycal_input_add_y:nn #1 #2 + { + \seq_gput_right:Nn \g_bdaycal_input_seq { #1 ~ ( \int_to_arabic:n + { \pgfcalendarifdateyear - #2 } ) } + } + +% how to output in direct order; we simply do a mapping function calling +% \bdaycal_print:n after incrementing the counter +\cs_new_protected:Npn \bdaycal_output_direct: + { + \seq_map_inline:Nn \g_bdaycal_input_seq + { + \bdaycal_print:n { ##1 } + } + \seq_gclear:N \g_bdaycal_input_seq + } + +% the printing macro; change here for adapting to your wishes +\cs_new:Npn \bdaycal_print:n #1 + { + #1 \par + } +%% End + +%% Knuth's AoCP, vol 1, 2nd ed, pp 155--156 +\int_new:N \l_easter_Y_int +\int_new:N \l_easter_G_int +\int_new:N \l_easter_C_int +\int_new:N \l_easter_X_int +\int_new:N \l_easter_Z_int +\int_new:N \l_easter_D_int +\int_new:N \l_easter_E_int +\int_new:N \l_easter_N_int +\int_new:N \l_easter_M_int +\int_new:N \l_easter_julian_day_int + +\cs_new:Nn \easter_sunday:n { + + \int_set:Nn \l_easter_Y_int { #1 } + + \int_set:Nn \l_easter_G_int { + \int_mod:nn { \l_easter_Y_int } { 19 } + 1 + } + + \int_set:Nn \l_easter_C_int { + \int_div_truncate:nn { \l_easter_Y_int } { 100 } + 1 + } + + \int_set:Nn \l_easter_X_int { + \int_div_truncate:nn { 3 * \l_easter_C_int } { 4 } - 12 + } + + \int_set:Nn \l_easter_Z_int { + \int_div_truncate:nn { 8 * \l_easter_C_int + 5 } { 25 } - 5 + } + + \int_set:Nn \l_easter_D_int { + \int_div_truncate:nn { 5 * \l_easter_Y_int } { 4 } - \l_easter_X_int - 10 + } + + \int_set:Nn \l_easter_E_int { + \int_mod:nn { 11 * \l_easter_G_int + 20 + \l_easter_Z_int + - \l_easter_X_int } { 30 } + } + + % \int_mod:nn behaves strangely. + \int_compare:nNnT { \l_easter_E_int } < { 0 } + { + \int_add:Nn \l_easter_E_int { 30 } + } + + \int_compare:nNnTF { \l_easter_E_int } = { 25 } + { % true + \int_compare:nNnT { \l_easter_G_int } > { 11 } + { % true + \int_incr:N \l_easter_E_int + } + } + { % false + \int_compare:nNnT { \l_easter_E_int } = { 24 } + { % true + \int_incr:N \l_easter_E_int + } + } + + \int_set:Nn \l_easter_N_int { 44 - \l_easter_E_int } + + \int_compare:nNnT { \l_easter_N_int } < { 21 } + { % true + \int_add:Nn \l_easter_N_int { 30 } + } + + \int_add:Nn \l_easter_N_int { + 7 - \int_mod:nn { \l_easter_D_int + \l_easter_N_int } { 7 } + } + + \int_compare:nNnTF { \l_easter_N_int } > { 31 } + { % true + \int_sub:Nn \l_easter_N_int { 31 } + \int_set:Nn \l_easter_M_int { 4 } % April + } + { % false + \int_set:Nn \l_easter_M_int { 3 } % March + } + + \pgfcalendardatetojulian { \l_easter_Y_int - + \l_easter_M_int - \l_easter_N_int + } { \l_easter_julian_day_int } + +} + +\pgfkeys{/pgf/calendar/Easter/.default = 0} +\pgfkeys{/pgf/calendar/Easter/.code = + { + \easter_sunday:n { \pgfcalendarifdateyear } + \int_compare:nNnT { \pgfcalendarifdatejulian } + = {\l_easter_julian_day_int + #1} + { \pgfcalendarmatchestrue } + } +} + +\int_new:N \l_advent_Y_int +\int_new:N \l_advent_xmas_julian_day_int +\int_new:N \l_advent_xmas_week_day_int +\int_new:N \l_advent_julian_day_int + +\cs_new:Nn \advent_sunday:n { + + \int_set:Nn \l_advent_Y_int { #1 } + + \pgfcalendardatetojulian { \l_advent_Y_int - 12 - 25 } { + \l_advent_xmas_julian_day_int } + + \pgfcalendarjuliantoweekday { \l_advent_xmas_julian_day_int } { + \l_advent_xmas_week_day_int } + + \int_set:Nn \l_advent_julian_day_int { + \l_advent_xmas_julian_day_int - \l_advent_xmas_week_day_int - 22 } + +} + +\pgfkeys{/pgf/calendar/Advent/.default = 0} +\pgfkeys{/pgf/calendar/Advent/.code = + { + \advent_sunday:n { \pgfcalendarifdateyear } + \int_compare:nNnT { \pgfcalendarifdatejulian } + = {\l_advent_julian_day_int + #1} + { \pgfcalendarmatchestrue } + } +} + +%% http://www.tondering.dk/claus/cal/week.php#calcweekno +\int_new:N \l_week_number_year_int +\int_new:N \l_week_number_month_int +\int_new:N \l_week_number_day_int +\int_new:N \l_week_number_a_int +\int_new:N \l_week_number_b_int +\int_new:N \l_week_number_c_int +\int_new:N \l_week_number_s_int +\int_new:N \l_week_number_e_int +\int_new:N \l_week_number_f_int +\int_new:N \l_week_number_g_int +\int_new:N \l_week_number_d_int +\int_new:N \l_week_number_n_int +\int_new:N \l_week_number_W_int + +\cs_new:Nn \week_number:nnn { + + \int_set:Nn \l_week_number_year_int { #1 } + \int_set:Nn \l_week_number_month_int { #2 } + \int_set:Nn \l_week_number_day_int { #3 } + + \int_compare:nNnTF { \l_week_number_month_int } < { 3 } % jan or feb + { % true + + \int_set:Nn \l_week_number_a_int { \l_week_number_year_int - 1 } + + \int_set:Nn \l_week_number_b_int { + \int_div_truncate:nn { \l_week_number_a_int } { 4 } + - \int_div_truncate:nn { \l_week_number_a_int } { 100 } + + \int_div_truncate:nn { \l_week_number_a_int } { 400 } + } + + \int_set:Nn \l_week_number_c_int { + \int_div_truncate:nn { \l_week_number_a_int - 1 } { 4 } + - \int_div_truncate:nn { \l_week_number_a_int - 1 } { 100 } + + \int_div_truncate:nn { \l_week_number_a_int - 1 } { 400 } + } + + \int_set:Nn \l_week_number_s_int { + \l_week_number_b_int - \l_week_number_c_int } + + \int_zero:N \l_week_number_e_int + + \int_set:Nn \l_week_number_f_int { \l_week_number_day_int - 1 + + 31 * ( \l_week_number_month_int - 1 ) } + + } % end true + { % false + + \int_set_eq:NN \l_week_number_a_int \l_week_number_year_int + + \int_set:Nn \l_week_number_b_int { + \int_div_truncate:nn { \l_week_number_a_int } { 4 } + - \int_div_truncate:nn { \l_week_number_a_int } { 100 } + + \int_div_truncate:nn { \l_week_number_a_int } { 400 } + } + + \int_set:Nn \l_week_number_c_int { + \int_div_truncate:nn { \l_week_number_a_int - 1 } { 4 } + - \int_div_truncate:nn { \l_week_number_a_int - 1 } { 100 } + + \int_div_truncate:nn { \l_week_number_a_int - 1 } { 400 } + } + + \int_set:Nn \l_week_number_s_int { + \l_week_number_b_int - \l_week_number_c_int } + + \int_set:Nn \l_week_number_e_int { \l_week_number_s_int + 1 } + + \int_set:Nn \l_week_number_f_int { \l_week_number_day_int + + \int_div_truncate:nn { + 153 * ( \l_week_number_month_int - 3 ) + 2 } { 5 } + + 58 + \l_week_number_s_int } + + } % end false + + \int_set:Nn \l_week_number_g_int { + \int_mod:nn { \l_week_number_a_int + \l_week_number_b_int } { 7 } } + + \int_set:Nn \l_week_number_d_int { + \int_mod:nn { \l_week_number_f_int + \l_week_number_g_int + - \l_week_number_e_int } { 7 } } + + \int_set:Nn \l_week_number_n_int { + \l_week_number_f_int + 3 - \l_week_number_d_int } + + \int_compare:nNnTF { \l_week_number_n_int } < { 0 } + { %true + + \int_set:Nn \l_week_number_W_int { 53 + - \int_div_truncate:nn { \l_week_number_g_int + - \l_week_number_s_int } { 5 } } + + } % end true + { % false + + \int_compare:nNnTF { \l_week_number_n_int } > { 364 + + \l_week_number_s_int } + { % true + + \int_set:Nn \l_week_number_W_int { 1 } + + } % end true + { % false + + \int_set:Nn \l_week_number_W_int { \int_div_truncate:nn { + \l_week_number_n_int } { 7 } + 1 } + + } % end false + + } % end false + +} + +\definecolor{red}{rgb}{0.937254901961,0.16862745098,0.176470588235} + +\newsavebox{\flagCH} +\savebox{\flagCH}{ +\begin{tikzpicture} + \fill[red] rectangle (20pt,20pt); + \fill[white,xshift=7.5pt, yshift=3pt] rectangle (5pt,14pt); + \fill[white,xshift=3pt, yshift=7.5pt] rectangle (14pt,5pt); +\end{tikzpicture} +} + +\pgfkeys{/tikz/week~number/.code = + { + \week_number:nnn { + \pgfcalendarifdateyear } { + \pgfcalendarifdatemonth } { + \pgfcalendarifdateday } + \addtext{ Woche ~ \int_to_arabic:n { \l_week_number_W_int } } + } +} + +\ExplSyntaxOff + +\pgfkeys{/tikz/flag-flying day/.code = + { + \draw (-\cellwidth,0) node [above right,font=\Huge] + {\resizebox{!}{0.8ex}{\usebox{\flagCH}}}; + } +} + +\pgfkeys{/tikz/observance/.code = + { + \addtext{#1} + } +} + +\pgfkeys{/tikz/anniversary/.code 2 args=\addtextyear{#1}{#2}} + +\pgfkeys{/tikz/day code = + { + \node (lower right) at (0,0) [above left,font=\Large] {\tikzdaytext}; + \node (upper left) at (-\cellwidth,\cellheight) + [below right,align=left,text width=\cellwidth-\pgflinewidth, + font=\tiny,black] {\showtext}; + \node (lower left) at (-\cellwidth,0) {}; + \node[draw, + fit=(lower right) (upper left) (lower left), + inner sep=1mm] {}; + } +} + +\pgfkeys{/tikz/inner sep = 0pt} + +\pgfkeys{/tikz/day xshift=\cellwidth+2mm+2mm} + +\pgfkeys{/tikz/day yshift=\cellheight+2mm+2mm} + +\newlength{\cellheight} +\setlength{\cellheight}{14mm} +\newlength{\cellwidth} +\setlength{\cellwidth}{24.75mm} \ExplSyntaxOn \keys_define:nn { hungerford/boxgraphics }