summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/lualatex/wallcalendar/wallcalendar.cls
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/wallcalendar/wallcalendar.cls')
-rw-r--r--Master/texmf-dist/tex/lualatex/wallcalendar/wallcalendar.cls1714
1 files changed, 1714 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/lualatex/wallcalendar/wallcalendar.cls b/Master/texmf-dist/tex/lualatex/wallcalendar/wallcalendar.cls
new file mode 100644
index 00000000000..be0cc5ef962
--- /dev/null
+++ b/Master/texmf-dist/tex/lualatex/wallcalendar/wallcalendar.cls
@@ -0,0 +1,1714 @@
+% wallcalendar.cls; Don't edit this file. Edit wallcalendar-code.org with emacs org-mode and call 'org-babel-tangle'.
+%
+% Wall Calendar
+%
+% A wall calendar document class with custom layouts and support for internationalization.
+%
+% (c) Gambhiro Bhikkhu, 2017
+% gambhiro.bhikkhu.85@gmail.com
+%
+% LPPL LaTeX Public Project License
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{wallcalendar}[2017/10/21 v1.3.1 A wall calendar class with custom layouts and support for internationalization.]
+
+\RequirePackage{pgfopts}
+\RequirePackage{calc}
+
+\newlength\calPaperWidth
+\newlength\calPaperHeight
+\newlength\@wall@leftMargin
+\newlength\@wall@rightMargin
+\newlength\@wall@topMargin
+\newlength\@wall@bottomMargin
+
+\def\@wall@eventsCsv{}
+\def\@wall@markDefaultsCsv{}
+\def\@wall@translationsInputFile{}
+
+\newcommand*\theMonthName{}
+
+\newif\ifvarnishmask
+\newif\ifshowframe
+\newif\iftranslationsAutoload
+\newif\ifloadBabel
+
+\pgfkeys{
+ /wall/.is family, /wall,
+ defaults/.style = {
+ year = \the\year,
+ altyear = \empty,
+ loadBabel = false,
+ language = english,
+ translationsAutoload = true,
+ imageFolder = {./src-images},
+ choralOctavoPaper,
+ hMargin = 17mm,
+ topMargin = 20.5mm,
+ bottomMargin = 10mm,
+ },
+ year/.store in = \CalendarYear,
+ year/.initial = \the\year,
+ altyear/.store in = \CalendarAltYear,
+ altyear/.initial = \empty,
+ language/.store in = \@wall@calendarLanguage,
+ loadBabel/.is if = loadBabel,
+ translationsInputFile/.store in = \@wall@translationsInputFile,
+ translationsInputFile/.initial = {},
+ translationsAutoload/.is if = translationsAutoload,
+ eventsCsv/.store in = \@wall@eventsCsv,
+ eventsCsv/.initial = {},
+ markDefaultsCsv/.store in = \@wall@markDefaultsCsv,
+ markDefaultsCsv/.initial = {},
+ varnishmask/.is if = varnishmask,
+ showframe/.is if = showframe,
+ imageFolder/.store in = \@wall@imageFolder,
+ paperWidth/.code = {\setlength{\calPaperWidth}{#1}},
+ paperHeight/.code = {\setlength{\calPaperHeight}{#1}},
+ hMargin/.code = {\setlength{\@wall@leftMargin}{#1}%
+ \setlength{\@wall@rightMargin}{#1}},
+ leftMargin/.code = {\setlength{\@wall@leftMargin}{#1}},
+ rightMargin/.code = {\setlength{\@wall@rightMargin}{#1}},
+ topMargin/.code = {\setlength{\@wall@topMargin}{#1}},
+ bottomMargin/.code = {\setlength{\@wall@bottomMargin}{#1}},
+ % Paper sizes
+ choralOctavoPaper/.style = {paperWidth = 6.75in, paperHeight = 10.5in},
+ a2Paper/.style = {paperWidth = 420mm, paperHeight = 594mm},
+ a2PaperLandscape/.style = {paperWidth = 594mm, paperHeight = 420mm},
+ a3Paper/.style = {paperWidth = 297mm, paperHeight = 420mm},
+ a3PaperLandscape/.style = {paperWidth = 420mm, paperHeight = 297mm},
+ a4Paper/.style = {paperWidth = 210mm, paperHeight = 297mm},
+ a4PaperLandscape/.style = {paperWidth = 297mm, paperHeight = 210mm},
+ a5Paper/.style = {paperWidth = 148mm, paperHeight = 210mm},% r = 1.4142 = sqrt(2)
+ prevPaper/.style = {paperWidth = 170mm, paperHeight = 250mm},% r = 1.4705
+}
+
+% Debug with: \wlog{YEA: \the\@wall@bottomMargin}
+
+\DeclareOption*{%
+ \PassOptionsToClass{\CurrentOption}{memoir}
+}
+
+\pgfkeys{/wall, defaults}
+\ProcessPgfOptions{/wall}
+\ProcessOptions\relax
+
+\LoadClass[11pt,oneside]{memoir}
+
+\newlength\@tmp@a
+\newlength\@tmp@b
+\newlength\@tmp@c
+\newlength\@tmp@width
+\newlength\@tmp@height
+
+\ifloadBabel
+\RequirePackage[\@wall@calendarLanguage]{babel}
+\fi
+
+\RequirePackage{nag}
+%\RequirePackage{textcomp}
+\RequirePackage[cmyk]{xcolor}
+\RequirePackage{graphicx}
+\DeclareGraphicsExtensions{.pdf,.png,.jpg}
+\graphicspath{{\@wall@imageFolder}}
+
+\RequirePackage{eso-pic}
+\RequirePackage{ccicons}
+\RequirePackage{multicol}
+\RequirePackage{wasysym}
+
+\RequirePackage{pdftexcmds}
+\RequirePackage{etoolbox}
+\RequirePackage{luacode}
+
+\RequirePackage{xcoffins}
+%\RequirePackage{xstring}
+%\RequirePackage{stringstrings}
+
+\ifloadBabel
+\RequirePackage[final,babel=true]{microtype}
+\else
+\RequirePackage[final]{microtype}
+\fi
+
+\RequirePackage{tikz}
+\usetikzlibrary{calendar}
+\usetikzlibrary{positioning}
+\usetikzlibrary{fit}
+\usetikzlibrary{shapes.geometric}
+
+% http://tex.stackexchange.com/a/20426/831
+\pgfdeclarelayer{one}
+\pgfdeclarelayer{two}
+\pgfsetlayers{main,one,two}
+
+\pgfkeys{%
+ /tikz/on layer/.code={
+ \pgfonlayer{#1}\begingroup
+ \aftergroup\endpgfonlayer
+ \aftergroup\endgroup
+ }
+}
+
+\definecolor{textbody}{gray}{0.15}
+
+% pantone 1245C, RGB 191,145,12 HEX: #BF910C
+% pantone 1255C, CMYK 0,27.5,100,34
+\definecolor{gold}{cmyk}{0,0.275,1,0.34}
+\definecolor{darkgold}{cmyk}{0.27,0.53,1,0.09}
+%\definecolor{orangegold}{cmyk}{0,0.31,0.89,0}
+\colorlet{orangegold}{darkgold}
+
+\colorlet{gridcolor}{black!30}
+\colorlet{weekday}{black}
+\colorlet{weekend}{black!50}
+\colorlet{mooncolor}{textbody}
+
+\definecolor{datenum}{gray}{0.3}
+\definecolor{plannerdatenum}{gray}{0.15}
+\definecolor{quote}{gray}{0.3}
+\definecolor{notes}{gray}{0.3}
+
+\definecolor{gridcolor}{gray}{0.5}
+\colorlet{pagebgcolor}{gridcolor!60}
+
+\colorlet{photo-frame}{blue}
+\colorlet{quote-frame}{red}
+\colorlet{heading-frame}{brown}
+\colorlet{calendar-frame}{orange}
+\colorlet{events-frame}{green}
+
+\ifshowframe
+ \colorlet{calendarbg}{black!50}
+\else
+ \colorlet{calendarbg}{white}
+\fi
+
+\ifshowtrims
+ \setstocksize{\calPaperHeight + 35mm}{\calPaperWidth + 35mm}
+ \setlength{\paperheight}{\calPaperHeight}
+ \setlength{\paperwidth}{\calPaperWidth}
+ \trimXmarks
+ \trimLmarks
+ \quarkmarks
+ \settrims{0.5\stockheight - 0.5\paperheight}{0.5\stockwidth - 0.5\paperwidth}
+ \settrimmedsize{\calPaperHeight}{\calPaperWidth}{*}
+\else\relax
+ \setstocksize{\calPaperHeight}{\calPaperWidth}
+ \settrims{0pt}{0pt}
+ \settrimmedsize{\stockheight}{\stockwidth}{*}
+\fi
+
+%\settypeblocksize{\stockheight}{\stockwidth}{*}
+% TODO: calculate margins by ratios to paper size
+\setlrmarginsandblock{\@wall@leftMargin}{\@wall@rightMargin}{*}
+\setulmarginsandblock{\@wall@topMargin}{\@wall@bottomMargin}{*}
+\setheadfoot{0pt}{0pt}
+\setheaderspaces{0pt}{*}{*}
+
+\checkandfixthelayout% This will typeout values in pt.
+\settypeoutlayoutunit{mm}% It is useful to see layout values in mm too.
+\typeoutlayout
+
+\def\@wall@fontSize{11}
+\def\@wall@lineHeight{13.6}
+
+\renewcommand{\normalsize}{%
+ \@setfontsize\normalsize\@wall@fontSize\@wall@lineHeight
+ \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
+ \belowdisplayskip \abovedisplayskip
+ \color{textbody}
+ \let\@listi\@listI}
+\normalsize
+
+\setlength{\vgap}{1.5em}
+\setlength{\vindent}{\vgap}
+\setlength{\vleftmargin}{2em}
+
+\setlength{\parskip}{0pt}
+\setlength{\parindent}{0pt}
+
+\setlength{\fboxsep}{0pt}
+
+\definecolor{varnishmask}{gray}{0}
+
+% http://tex.stackexchange.com/a/59571/831
+\newcommand*{\strcmpblank}[3]{%
+ \ifnum\pdf@strcmp{#1}{}=\z@ #2\else #3\fi
+}
+
+\newcommand\@placeholder@pre[1]{%
+ \settowidth{\@tmp@width}{#1}%
+ \settototalheight{\@tmp@height}{#1}%
+ \def\@spacer{\rule{\@tmp@width}{0pt}\rule{0pt}{\@tmp@height}}%
+}
+
+\newcommand\placeholder[3][]{%
+ \ifvarnishmask%
+ \ifstrequal{#2}{hasvarnish}{%
+ \@placeholder@pre{#3}%
+ \tikz\node[fill=varnishmask, inner sep=0pt]{\@spacer};%
+ }{}%
+ \else%
+ \ifshowframe%
+ \@placeholder@pre{#3}%
+ \tikz\node[inner sep=0pt, opacity=0.6, #1]{\@spacer};%
+ \else%
+ #3%
+ \fi%
+ \fi%
+}
+
+\def\@wall@photo@putPhoto#1{#1}
+\def\@wall@photo@setYOffset{}
+
+\pgfkeys{
+ /put photo/.is family, /put photo,
+ simple/.code = {%
+ \def\@wall@photo@putPhoto##1{%
+ \includegraphics{##1}%
+ }%
+ \def\@wall@photo@setYOffset{}%
+ },
+ full page/.code = {%
+ \def\@wall@photo@putPhoto##1{%
+ \includegraphics[%
+ keepaspectratio,%
+ width={\calPaperWidth + 2\@t@bleed},%
+ ]{##1}%
+ }%
+ \def\@wall@photo@setYOffset{}%
+ },
+ full width above calendar/.code = {%
+ \def\@wall@photo@putPhoto##1{%
+ \includegraphics[%
+ keepaspectratio,%
+ width={\calPaperWidth + 2\@t@bleed},%
+ ]{##1}%
+ }%
+ \def\@wall@photo@setYOffset{%
+ \setlength{\@t@yOffset}{\@t@calendar@height + \@t@bleed + 1pt}%
+ }%
+ },
+ full width/.code = {%
+ \def\@wall@photo@putPhoto##1{%
+ \includegraphics[%
+ keepaspectratio,%
+ width={\calPaperWidth + 2\@t@bleed},%
+ ]{##1}%
+ }%
+ \def\@wall@photo@setYOffset{%
+ \setlength{\@t@yOffset}{\@t@calendar@height + \@t@bleed}%
+ }%
+ },
+}
+
+\pgfkeys{
+ /Photo/.is family, /Photo,
+ init/.style = {
+ defaults/.style = {file = {}, thumbFile = {}, caption = {}, bleed = 0pt, xOffset=0pt, yOffset=0pt},
+ file/.initial = {},
+ thumbFile/.initial = {},
+ caption/.initial = {},
+ bleed/.initial = 0pt,
+ xOffset/.initial = 0pt,
+ yOffset/.initial = 0pt,
+ },
+}
+
+\pgfkeys{
+ /Quote/.is family, /Quote,
+ init/.style = {
+ defaults/.style = {position=center, text={}, xOffset=0pt, yOffset=0pt},
+ position/.initial = {},
+ text/.initial = {},
+ xOffset/.initial = 0pt,
+ yOffset/.initial = 0pt,
+ },
+}
+
+\pgfkeys{
+ /Calendar/.is family, /Calendar,
+ init/.style = {
+ defaults/.style = {bg/.style={opacity=0.5}},
+ bg/.style = {},
+ minimum height/.initial = {},
+ },
+}
+
+\pgfkeys{
+ /Events/.is family, /Events,
+ init/.style = {
+ defaults/.style = {day code = {}, marks = {}, text = {}},
+ day code/.initial = {},
+ marks/.initial = {},
+ text/.initial = {},
+ },
+}
+
+\pgfkeys{
+ /Txt/.is family, /Txt,
+ init/.style = {
+ defaults/.style = {text = {}},
+ text/.initial = {},
+ },
+}
+
+\def\eIdx{}
+\def\eMaxIdx{}
+\def\eMark{}
+\def\eIsoDate{}
+\def\eYear{}
+\def\eMonth{}
+\def\eMonthShort{}
+\def\eDay{}
+\def\eDayText{}
+\def\eNote{}
+
+\pgfkeys{
+ /parseMonthEvents/.is family, /parseMonthEvents,
+ month/.initial = {},
+ filter pred/.initial = nil,
+ format func/.initial = nil,
+ format cmd/.initial = {},
+ events csv/.initial = {},
+ mark defaults csv/.initial = {},
+ min events/.initial = {},
+ defaults/.style = {
+ month = \theMonthName,
+ filter pred = nil,
+ format func = nil,
+ format cmd = {\textsuperscript{\eIdx}~\eMonthShort~\eDay:~\eNote\par},
+ events csv = \@wall@eventsCsv,
+ mark defaults csv = \@wall@markDefaultsCsv,
+ min events = nil,
+ },
+}
+
+\pgfkeys{
+ /parseYearEvents/.is family, /parseYearEvents,
+ year/.initial = {},
+ filter pred/.initial = nil,
+ format func/.initial = nil,
+ format cmd/.initial = {},
+ events csv/.initial = {},
+ mark defaults csv/.initial = {},
+ min events/.initial = {},
+ defaults/.style = {
+ year = \CalendarYear,
+ filter pred = nil,
+ format func = nil,
+ format cmd = {\textsuperscript{\eIdx}~\eMonthShort~\eDay:~\eNote\ifnumless{\eIdx}{\eMaxIdx}{,\space}{.}},
+ events csv = \@wall@eventsCsv,
+ mark defaults csv = \@wall@markDefaultsCsv,
+ min events = nil,
+ },
+}
+
+\newcommand\StarMark{*}
+
+\newcommand\NoteStarMark{*}
+
+\newlength\@wall@starHeight
+
+% Measure the star's height here, so that we are measuring with the current typeface.
+\newcommand\KiteMark{%
+\setlength{\@wall@starHeight}{\totalheightof{*}}%
+\begin{tikzpicture}
+ \node (box) [
+ rectangle, minimum height=\@wall@starHeight, minimum width=3.4pt,
+ inner sep=0pt, line width=0pt,
+ ] {};
+ \node[
+ kite, draw, textbody, fill=textbody,
+ scale=0.15, kite vertex angles=60,
+ above=0pt of box.north, anchor=north,
+ ] {};%
+\end{tikzpicture}%
+}
+
+% Same as \KiteMark but with scale=0.2
+\newcommand\NoteKiteMark{\raisebox{1pt}{%
+\setlength{\@wall@starHeight}{\totalheightof{*}}%
+\begin{tikzpicture}
+ \node (box) [
+ rectangle, minimum height=\@wall@starHeight, minimum width=3.4pt,
+ inner sep=0pt, line width=0pt,
+ ] {};
+ \node[
+ kite, draw, textbody, fill=textbody,
+ scale=0.2, kite vertex angles=60,
+ above=0pt of box.north, anchor=north,
+ ] {};%
+\end{tikzpicture}%
+}}
+
+\tikzstyle{moon circle}=[
+ circle,
+ inner sep=0pt,
+ line width=0pt,
+ minimum height=8pt,
+]
+
+\newlength\@wall@moonRaise
+\setlength{\@wall@moonRaise}{-0.7pt}
+
+\newcommand\NewMoon{}
+\newcommand\FirstQuarter{}
+\newcommand\FullMoon{}
+\newcommand\LastQuarter{}
+
+\newcommand\@wall@NewMoon{%
+\raisebox{\@wall@moonRaise}{%
+ \tikz\node[moon circle, fill=mooncolor] {};%
+}}
+
+\newcommand\@wall@FullMoon{%
+\raisebox{\@wall@moonRaise}{%
+ \tikz\node[moon circle, draw, mooncolor, line width=0.3pt] {};%
+}}
+
+\newcommand\@wall@FirstQuarter{%
+\raisebox{\@wall@moonRaise}{%
+\begin{tikzpicture}
+\node [moon circle, name=waxing] {};
+\path[fill=mooncolor]
+ (waxing.north) --
+ (waxing.south) to[out=-180,in=-90]
+ (waxing.west) to[out=90,in=-180]
+ (waxing.north);
+\end{tikzpicture}%
+}}
+
+\newcommand\@wall@LastQuarter{%
+\raisebox{\@wall@moonRaise}{%
+\begin{tikzpicture}
+\node [moon circle, name=waning] {};
+\path[fill=mooncolor]
+ (waning.north) --
+ (waning.south) to[out=0,in=-90]
+ (waning.east) to[out=90,in=0]
+ (waning.north);
+\end{tikzpicture}%
+}}
+
+\newcommand\@wall@useDefaultMoons{%
+\renewcommand\NewMoon{\@wall@NewMoon}%
+\renewcommand\FirstQuarter{\@wall@FirstQuarter}%
+\renewcommand\FullMoon{\@wall@FullMoon}%
+\renewcommand\LastQuarter{\@wall@LastQuarter}%
+}
+
+\newcommand\plannerMoonSize{\@setfontsize\plannerMoonSize{14}{14}}
+\newcommand*\plannerMoonFormat[1]{{\plannerMoonSize #1}}
+
+\newcommand\@wall@planner@NewMoon{\plannerMoonFormat{\CIRCLE}}
+\newcommand\@wall@planner@FirstQuarter{\plannerMoonFormat{\LEFTcircle}}
+\newcommand\@wall@planner@FullMoon{\plannerMoonFormat{\Circle}}
+\newcommand\@wall@planner@LastQuarter{\plannerMoonFormat{\RIGHTcircle}}
+
+\newcommand\@wall@usePlannerMoons{%
+\renewcommand\NewMoon{\@wall@planner@NewMoon}%
+\renewcommand\FirstQuarter{\@wall@planner@FirstQuarter}%
+\renewcommand\FullMoon{\@wall@planner@FullMoon}%
+\renewcommand\LastQuarter{\@wall@planner@LastQuarter}%
+}
+
+\@wall@useDefaultMoons
+
+\newcommand\SetPhoto[2][]{%
+ \pgfkeys{%
+ /Photo/#2/.is family, /Photo/#2,
+ /Photo/init,
+ defaults, file={#2},
+ #1%
+ }%
+}
+
+\newcommand\SetCalendar[2][]{%
+ \pgfkeys{%
+ /Calendar/#2/.is family, /Calendar/#2,
+ /Calendar/init,
+ defaults,
+ #1%
+ }%
+}
+
+\newcommand\SetQuote[3][]{%
+ \pgfkeys{%
+ /Quote/#2/.is family, /Quote/#2,
+ /Quote/init,
+ defaults, text={#3},
+ #1%
+ }%
+}
+
+\newcommand\SetEvents[4][]{%
+ \pgfkeys{%
+ /Events/#2/.is family, /Events/#2,
+ /Events/init,
+ defaults, marks={#3}, text={#4},
+ #1%
+ }%
+}
+
+\pgfkeys{
+ /MonthPage/.is family, /MonthPage,
+ layout/.style = {layout handlers/#1/.get = \@wall@month@doLayout},
+ put photo/.style = {/put photo/#1},
+ defaults/.style = {layout = small landscape, put photo = simple},
+ layout handlers/.cd,
+ full page/.initial = \@wall@fullPageLayout,
+ small landscape/.initial = \@wall@smallLandscapeLayout,
+}
+
+\newcommand\MonthPage[2][]{%
+ \pgfkeys{/MonthPage, defaults, #1}%
+ \@wall@month@doLayout{#2}%
+}
+
+\newcommand\SetTxt[2]{%
+ \pgfkeys{%
+ /Txt/#1/.is family, /Txt/#1,
+ /Txt/init,
+ defaults, text={#2},
+ }%
+}
+
+\newcommand\txt[1]{%
+\pgfkeys{/Txt/#1/text/.get=\@val}%
+\@val%
+}
+
+\def\@t@monthName{}
+\def\@t@eventsCsv{}
+\def\@t@markDefaultsCsv{}
+\def\@t@filterPred{}
+\def\@t@formatFunc{}
+\def\@t@formatCmd{}
+\def\@t@minEvents{}
+
+\newcommand\monthMarkFmt{\color{textbody}}
+
+\newcommand\symbolSpace{\thinspace}
+\newcommand\symbolSeparator{,\symbolSpace}
+
+% #1 = option keys
+\newcommand*\parseMonthEvents[1][]{%
+\pgfkeys{/parseMonthEvents, defaults, #1,
+ month/.get=\@t@monthName,
+ filter pred/.get=\@t@filterPred,
+ format func/.get=\@t@formatFunc,
+ format cmd/.get=\@t@formatCmd,
+ events csv/.get=\@t@eventsCsv,
+ mark defaults csv/.get=\@t@markDefaultsCsv,
+ min events/.get=\@t@minEvents,
+}%
+\luadirect{
+require("wallcalendar-helpers.lua")
+monthEvents(
+ \luastring{\@t@monthName},
+ \@t@filterPred,
+ \@t@formatFunc,
+ \luastringO{\@t@formatCmd},
+ \luastring{\@t@eventsCsv},
+ \luastring{\@t@markDefaultsCsv},
+ \@t@minEvents
+)}}
+
+\def\@t@yearNum{}
+
+% #1 = option keys
+\newcommand*\parseYearEvents[1][]{%
+\pgfkeys{/parseYearEvents, defaults, #1,
+ year/.get=\@t@year,
+ filter pred/.get=\@t@filterPred,
+ format func/.get=\@t@formatFunc,
+ format cmd/.get=\@t@formatCmd,
+ events csv/.get=\@t@eventsCsv,
+ mark defaults csv/.get=\@t@markDefaultsCsv,
+ min events/.get=\@t@minEvents,
+}%
+\luadirect{
+require("wallcalendar-helpers.lua")
+yearEvents(
+ tonumber(\@t@year),
+ \@t@filterPred,
+ \@t@formatFunc,
+ \luastringO{\@t@formatCmd},
+ \luastring{\@t@eventsCsv},
+ \luastring{\@t@markDefaultsCsv},
+ \@t@minEvents
+)}}
+
+\newlength\dayTextXshift
+\newlength\dayTextYshift
+\setlength{\dayTextXshift}{0pt}
+\setlength{\dayTextYshift}{0pt}
+
+\newlength\markNumberAbove
+\newlength\markNumberRight
+\setlength{\markNumberAbove}{-10pt}
+\setlength{\markNumberRight}{-3pt}
+
+\newlength\markDayTextAbove
+\newlength\markDayTextRight
+\setlength{\markDayTextAbove}{-10pt}
+\setlength{\markDayTextRight}{-3pt}
+
+\newcommand\parseMonthMarksDayText{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+monthMarksDayText(\luastring{\theMonthName}, nil, \luastring{\@wall@eventsCsv})
+tex.sprint(';')
+}}
+
+\newcommand\parseMonthMarksDayTextMonth[1]{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+monthMarksDayText(\luastring{#1}, nil, \luastring{\@wall@eventsCsv})
+tex.sprint(';')
+}}
+
+\newcommand*\parseMonthMarksDayTextUsing[1]{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+monthMarksDayText(\luastring{\theMonthName}, nil, \luastring{#1})
+}}
+
+\newcommand\parseMonthMarksDayTextMonthUsing[2]{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+monthMarksDayText(\luastring{#1}, nil, \luastring{#2})
+}}
+
+\newcommand*\parseMonthMarksNote{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+monthMarksNote(\luastring{\theMonthName}, nil, \luastring{\@wall@eventsCsv}, \luastring{\@wall@markDefaultsCsv})
+}}
+
+\newcommand*\parseMonthMarksNoteUsing[1]{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+monthMarksNote(\luastring{\theMonthName}, nil, \luastring{#1}, \luastring{\@wall@markDefaultsCsv})
+}}
+
+\makepagestyle{month}
+\makeoddhead{month}{}{}{}
+\makeevenhead{month}{}{}{}
+\makeoddfoot{month}{}{}{}
+\makeevenfoot{month}{}{}{}
+
+\pagestyle{month}
+
+\NewCoffin\@wall@pageWrap
+\NewCoffin\@wall@photo
+\NewCoffin\@wall@quote
+\NewCoffin\@wall@calendar
+\NewCoffin\@wall@events
+
+\newlength\@t@bleed
+\newlength\@t@rightOffset
+\newlength\@t@minipageWidth
+\newlength\@t@calendar@height
+\newlength\@t@calendar@hmargin
+\newlength\@t@calendar@dayYshift
+\newlength\@t@calendar@dayXshift
+\newlength\@t@calendar@gridHeight
+\newlength\@t@calendar@gridHeightFiveRows
+\newlength\@t@calendar@gridHeightSixRows
+\newlength\@t@xOffset
+\newlength\@t@yOffset
+\def\@t@file{}
+
+\newcommand*\monthFmt{}%
+\newcommand*\yearFmt{}%
+\newcommand*\dayLetterColor{}%
+\newcommand*\dayLetterFmt{}%
+\newcommand*\dayTextFmt{}%
+\newcommand*\quoteFmt{}%
+\newcommand*\headingFmt{}%
+\newcommand*\calendarFmt{}%
+\newcommand*\eventsFmt{}%
+
+\newcommand\@wall@layout@reset{%
+ \renewcommand*\monthFmt{}%
+ \renewcommand*\yearFmt{}%
+ \renewcommand*\dayLetterColor{}%
+ \renewcommand*\dayLetterFmt{}%
+ \renewcommand*\dayTextFmt{}%
+ \renewcommand*\quoteFmt{}%
+ \renewcommand*\headingFmt{}%
+ \renewcommand*\calendarFmt{}%
+ \renewcommand*\eventsFmt{}%
+ \def\@t@file{}%
+ \setlength{\@t@calendar@height}{0pt}%
+ \setlength{\@t@calendar@hmargin}{0pt}%
+ \setlength{\@t@calendar@dayYshift}{0pt}%
+ \setlength{\@t@calendar@dayXshift}{0pt}%
+ \setlength{\@t@bleed}{0pt}%
+ \setlength{\@t@rightOffset}{0pt}%
+ \setlength{\@t@minipageWidth}{0pt}%
+ \setlength{\@t@xOffset}{0pt}%
+ \setlength{\@t@yOffset}{0pt}%
+ \setlength{\@t@calendar@gridHeight}{0pt}%
+ \setlength{\@t@calendar@gridHeightFiveRows}{0pt}%
+ \setlength{\@t@calendar@gridHeightSixRows}{0pt}%
+}
+
+\newcommand\fullPageFmt{%
+ \renewcommand*\monthFmt{\LARGE}%
+ \renewcommand*\yearFmt{\LARGE}%
+ \renewcommand*\dayLetterColor{}%
+ \renewcommand*\dayLetterFmt{\tiny}%
+ \renewcommand*\dayTextFmt{\small}%
+ \renewcommand*\quoteFmt{}%
+ \renewcommand*\headingFmt{\centering}%
+ \renewcommand*\calendarFmt{\centering}%
+ \renewcommand*\eventsFmt{\setlength{\parindent}{0pt}\raggedleft\footnotesize}%
+}
+
+\newcommand\@wall@fullPageLayout[2][]{%
+\makeatletter
+\renewcommand*\theMonthName{#2}
+\@wall@layout@reset
+\fullPageFmt
+
+\colorlet{weekday}{black}
+\colorlet{weekend}{black!70}
+
+\pgfkeys{/Photo/#2/bleed/.get=\@val}
+\setlength{\@t@bleed}{\@val}
+
+\def\@t@monthnum{\monthToNum{#2}}
+
+% 40mm = 1.5748 inch
+% 43mm = 1.6929 inch
+\setlength{\@t@calendar@height}{40mm + \@t@bleed}
+
+% See if there was a height given in the options
+\pgfkeys{/Calendar/#2/minimum height/.get=\@val}
+\ifx\@val\empty \relax
+\else
+ \setlength{\@t@calendar@height}{\@val + \@t@bleed}
+\fi
+
+\setlength{\@t@calendar@hmargin}{20pt}
+
+% NOTE: the -4pt and -2pt offset is somehow necessary for the sides to align
+% with the edges
+\setlength{\@t@rightOffset}{\@t@bleed +\@t@calendar@hmargin -4pt}
+\setlength{\@t@minipageWidth}{\calPaperWidth -2\@t@calendar@hmargin -2pt}
+
+\SetHorizontalCoffin\@wall@pageWrap{%
+ \color{white}%
+ \rule{\textwidth}{0pt}%
+ \rule{0pt}{\textheight}%
+}
+
+\pgfkeys{/Photo/#2/file/.get=\@t@file}
+
+\SetHorizontalCoffin\@wall@photo{%
+ \placeholder[fill=photo-frame]{hasvarnish}{%
+ \@wall@photo@putPhoto{\@t@file}%
+ }%
+}
+
+\SetHorizontalCoffin\@wall@quote{%
+ \placeholder[fill=quote-frame]{}{%
+ \begin{minipage}{\linewidth}%
+ \quoteFmt
+ \pgfkeys{/Quote/#2/text/.get=\@val}%
+ \@val%
+ \end{minipage}%
+ }%
+}
+
+\SetHorizontalCoffin\@wall@calendar{%
+\ifvarnishmask\relax
+\else
+\begin{tikzpicture}
+
+\node (bg) [
+ fill = calendarbg,
+ opacity = 0.5,
+ minimum width = {\calPaperWidth + 2\@t@bleed},
+ anchor=north west,
+ /Calendar/#2/bg,
+ % override the style, in case bleed was set above
+ minimum height = {\@t@calendar@height},
+] at (0,0) {};
+
+\node (heading) [
+ below right=10pt and {\@t@rightOffset} of bg.north west,
+ anchor=north west,
+] {%
+\placeholder[fill=heading-frame]{}{%
+\begin{minipage}{\@t@minipageWidth}%
+\headingFmt
+{\monthFmt\@tr@monthNumName{\@t@monthnum}}
+\hfill
+\strcmpblank{\CalendarAltYear}{%
+ {\yearFmt\CalendarYear}%
+}{%
+ {\yearFmt\CalendarYear/\CalendarAltYear}%
+}%
+\end{minipage}%
+}%
+};
+
+\node (calendar) [
+ below right=35pt and {\@t@rightOffset} of bg.north west,
+ anchor=north west,
+] {%
+\placeholder[fill=calendar-frame]{}{%
+\begin{minipage}{\@t@minipageWidth}%
+\calendarFmt
+\tikz{\tikzMonthCalendar@fullpage{\@t@monthnum};}%
+\end{minipage}%
+}%
+};
+
+\node (events) [
+ below=0pt of calendar.south west,
+ anchor=north west,
+] {%
+\placeholder[fill=events-frame]{}{%
+\begin{minipage}{\@t@minipageWidth}%
+\eventsFmt
+\pgfkeys{/Events/#2/text/.get=\@val}%
+\@val%
+\end{minipage}%
+}%
+};
+
+\end{tikzpicture}%
+\fi
+}% \SetHorizontalCoffin
+
+\@wall@photo@setYOffset
+
+\pgfkeys{/Photo/#2/xOffset/.get=\@val}
+\addtolength{\@t@xOffset}{\@val}
+\pgfkeys{/Photo/#2/yOffset/.get=\@val}
+\addtolength{\@t@yOffset}{\@val}
+
+% NOTE: a small whitespace is visible on the left edge of the page when bleed is 0pt, a space must be getting in somewhere.
+\JoinCoffins*\@wall@pageWrap[l,t]\@wall@photo[l,t](-\spinemargin -\@t@bleed + \@t@xOffset, \uppermargin + \@t@bleed + \@t@yOffset)
+
+\pgfkeys{/Quote/#2/xOffset/.get=\@val}
+\setlength{\@t@xOffset}{\@val}
+\pgfkeys{/Quote/#2/yOffset/.get=\@val}
+\setlength{\@t@yOffset}{\@val}
+
+\JoinCoffins*\@wall@pageWrap[l,t]\@wall@quote[l,t](\@t@xOffset, \@t@yOffset)
+
+\JoinCoffins*\@wall@pageWrap[l,b]\@wall@calendar[l,b](-\spinemargin -\@t@bleed, \textheight +\uppermargin -\paperheight -\@t@bleed)
+
+\makeatother
+
+\clearpage
+\TypesetCoffin\@wall@pageWrap%
+}% \@wall@fullPageLayout
+
+\newcommand*{\tikzMonthCalendar@fullpage}[1]{%
+\pgfkeys{/Events/\monthName{#1}/marks/.get=\@eventmarks}%
+\calendar (cal#1) [alnitak, dates=\CalendarYear-#1-01 to \CalendarYear-#1-last] \@eventmarks;%
+}
+
+\newcommand\smallLandscapeFmt{%
+ \renewcommand*\monthFmt{\LARGE}%
+ \renewcommand*\yearFmt{\LARGE}%
+ \renewcommand*\dayLetterColor{}%
+ \renewcommand*\dayLetterFmt{\tiny}%
+ \renewcommand*\dayTextFmt{\small}%
+ \renewcommand*\quoteFmt{\centering}%
+ \renewcommand*\headingFmt{\centering}%
+ \renewcommand*\calendarFmt{\centering}%
+ \renewcommand*\eventsFmt{\setlength{\parindent}{0pt}\raggedright\footnotesize}%
+}
+
+\newcommand\@wall@smallLandscapeLayout[2][]{%
+\makeatletter
+\renewcommand*\theMonthName{#2}
+\@wall@layout@reset
+\smallLandscapeFmt
+
+\colorlet{weekday}{black}
+\colorlet{weekend}{black!70}
+
+\pgfkeys{/Photo/#2/bleed/.get=\@val}
+\setlength{\@t@bleed}{\@val}
+
+\def\@t@monthnum{\monthToNum{#2}}
+
+\setlength{\@t@calendar@height}{85mm + \@t@bleed}
+
+% See if there was a height given in the options
+\pgfkeys{/Calendar/#2/minimum height/.get=\@val}
+\ifx\@val\empty \relax
+\else
+ \setlength{\@t@calendar@height}{\@val + \@t@bleed}
+\fi
+
+\setlength{\@t@calendar@hmargin}{20pt}
+
+% 5mm: day headings
+% 20mm: events
+% 6.5mm: vertical spacing
+\setlength{\@tmp@a}{20mm + 5mm + 6.5mm}
+\setlength{\@tmp@b}{\@t@calendar@height -\@tmp@a}
+\setlength{\@t@calendar@dayYshift}{0.1666\@tmp@b}% 1/6 = 0.1666
+
+\setlength{\@t@calendar@gridHeightSixRows}{\@tmp@b}
+\setlength{\@t@calendar@gridHeightFiveRows}{\@tmp@b -0.1666\@tmp@b}
+
+% NOTE: the -4pt and -2pt offset is somehow necessary for the sides to align
+% with the edges
+\setlength{\@t@rightOffset}{\@t@bleed +\@t@calendar@hmargin -4pt}
+\setlength{\@t@minipageWidth}{\calPaperWidth -2\@t@calendar@hmargin -2pt}
+
+\setlength{\@t@calendar@dayXshift}{0.1428\@t@minipageWidth}% 1/7 = 0.1428
+
+\SetHorizontalCoffin\@wall@pageWrap{%
+ \color{white}%
+ \rule{\textwidth}{0pt}%
+ \rule{0pt}{\textheight}%
+}
+
+\pgfkeys{/Photo/#2/file/.get=\@t@file}
+
+\SetHorizontalCoffin\@wall@photo{%
+ \placeholder[fill=photo-frame]{hasvarnish}{%
+ \@wall@photo@putPhoto{\@t@file}%
+ }%
+}
+
+\SetHorizontalCoffin\@wall@quote{%
+ \placeholder[fill=quote-frame]{}{%
+ \begin{minipage}{\linewidth}%
+ \quoteFmt
+ \pgfkeys{/Quote/#2/text/.get=\@val}%
+ \@val%
+ \end{minipage}%
+ }%
+}
+
+\SetHorizontalCoffin\@wall@calendar{%
+\ifvarnishmask\relax
+\else
+\begin{tikzpicture}
+
+\node (bg) [
+ fill = calendarbg,
+ opacity = 1,
+ minimum width = {\calPaperWidth + 2\@t@bleed},
+ anchor=north west,
+ /Calendar/#2/bg,
+ % override the style, in case bleed was set above
+ minimum height = {\@t@calendar@height},
+] at (0,0) {};
+
+\node (heading) [
+ below right=10pt and {\@t@rightOffset} of bg.north west,
+ anchor=north west,
+] {%
+\placeholder[fill=heading-frame]{}{%
+\begin{minipage}{\@t@minipageWidth}%
+\headingFmt
+{\monthFmt\@tr@monthNumName{\@t@monthnum}}
+\hfill
+\strcmpblank{\CalendarAltYear}{%
+ {\yearFmt\CalendarYear}%
+}{%
+ {\yearFmt\CalendarYear/\CalendarAltYear}%
+}%
+\end{minipage}%
+}%
+};
+
+\node (calendar) [
+ below right=35pt and {\@t@rightOffset} of bg.north west,
+ anchor=north west,
+] {%
+\placeholder[fill=calendar-frame]{}{%
+\begin{minipage}{\@t@minipageWidth}%
+\calendarFmt
+\hspace*{-5pt}% FIXME
+\tikz{\tikzMonthCalendar@smallLandscape{\@t@monthnum};}%
+\end{minipage}%
+}%
+};
+
+\node (events) [
+ above right=10mm and {\@t@rightOffset} of bg.south west,
+ anchor=south west,
+] {%
+\placeholder[fill=events-frame]{}{%
+\begin{minipage}{\@t@minipageWidth}%
+\eventsFmt
+\pgfkeys{/Events/#2/text/.get=\@val}%
+\@val%
+\end{minipage}%
+}%
+};
+
+\end{tikzpicture}%
+\fi
+}% \SetHorizontalCoffin
+
+% The quote has to be centered betweeen the photo and the calendar with manual tweaking.
+% The height of the quote is not known, the height of the calendar plus its heading is not known.
+
+% TODO move the photo with /Photo/#2/xOffset and yOffset as at the full page layout
+
+\pgfkeys{/Quote/#2/yOffset/.get=\@val}
+\setlength{\@t@yOffset}{\@val}
+
+\JoinCoffins*\@wall@photo[hc,b]\@wall@quote[hc,t](0pt, \@t@yOffset)
+
+\pgfkeys{/Photo/#2/yOffset/.get=\@val}
+\setlength{\@t@yOffset}{\@val}
+
+% NOTE: Taking the bottom edge of the photo as fixed.
+% yOffset must be set to pull the photo down into position
+
+\JoinCoffins*\@wall@pageWrap[hc,t]\@wall@photo[hc,b](0pt, \uppermargin + \@t@yOffset)
+
+% Calendar is aligned to the bottom of the page.
+
+\JoinCoffins*\@wall@pageWrap[hc,b]\@wall@calendar[hc,b](0pt, \textheight +\uppermargin -\paperheight -\@t@bleed)
+
+\makeatother
+
+\clearpage
+\TypesetCoffin\@wall@pageWrap%
+}% \@wall@smallLandscapeLayout
+
+\newcommand*{\tikzMonthCalendar@smallLandscape}[1]{%
+\pgfkeys{/Events/\monthName{#1}/marks/.get=\@eventmarks}%
+\calendar (cal#1) [betelgeuse, dates=\CalendarYear-#1-01 to \CalendarYear-#1-last] \@eventmarks;%
+}
+
+\tikzstyle{day letter headings}=[%
+ day heading/.style={black!90},
+ execute before day scope={%
+ \ifdate{day of month=1}{%
+ \pgfmathsetlength\pgf@xa{\tikz@lib@cal@xshift}%
+ \pgfmathsetlength\pgf@ya{\tikz@lib@cal@yshift}%
+ \foreach \d in {0,1,2,3,4,5,6} {%
+ \pgf@xa=\d\pgf@xa%
+ \pgftransformxshift{\pgf@xa}%
+ \pgftransformyshift{\pgf@ya}%
+ \node (d\d) [anchor=south, day heading] {\dayLetterFmt\@tr@dayLetter{\d}};%
+ };%
+ }{}%
+ },%
+]
+
+\newcount\gridRows
+\newcount\gridLines
+\newcount\n
+
+\newif\ifGridNoSurround
+\GridNoSurroundfalse
+
+\tikzstyle{no grid surround}=[execute before day scope={\GridNoSurroundtrue}]
+\tikzstyle{grid surround}=[execute before day scope={\GridNoSurroundfalse}]
+
+\tikzstyle{days grid}=[%
+ execute before day scope={%
+ \ifdate{day of month=1}{%
+ %
+ % Determine if the grid is five or six rows
+ %
+ % 31 day months
+ \ifdate{between=01-01 and 01-31, between=03-01 and 03-31, between=05-01 and 05-31, between=07-01 and 07-31, between=08-01 and 08-31, between=10-01 and 10-31, between=12-01 and 12-31}{%
+ \ifdate{Saturday,Sunday}{%
+ \gridRows=6%
+ \setlength\@t@calendar@gridHeight{\@t@calendar@gridHeightSixRows}%
+ }{%
+ \gridRows=5%
+ \setlength\@t@calendar@gridHeight{\@t@calendar@gridHeightFiveRows}%
+ }
+ }{
+ % 30 day months and February
+ \ifdate{between=02-01 and 02-last}{%
+ \gridRows=5%
+ \setlength\@t@calendar@gridHeight{\@t@calendar@gridHeightFiveRows}%
+ }{%
+ \ifdate{Sunday}{%
+ \gridRows=6%
+ \setlength\@t@calendar@gridHeight{\@t@calendar@gridHeightSixRows}%
+ }{%
+ \gridRows=5%
+ \setlength\@t@calendar@gridHeight{\@t@calendar@gridHeightFiveRows}%
+ }
+ }
+ }
+ %
+ % Horizontal lines
+ %
+ \gridLines=\gridRows
+ \ifGridNoSurround\relax
+ \else
+ \advance\gridLines by 1
+ \n=0
+ \draw [
+ gridcolor,
+ line width=0.3pt,
+ xshift=-0.5\@t@calendar@dayXshift,
+ yshift=0.5\@t@calendar@dayYshift,
+ ] (0,{-\n\@t@calendar@dayYshift}) -- (7\@t@calendar@dayXshift,{-\n\@t@calendar@dayYshift});
+ \fi
+ \foreach \n in {1,2,3,4,5,6} {
+ \ifnum\n<\gridLines
+ \draw [
+ gridcolor,
+ line width=0.3pt,
+ xshift=-0.5\@t@calendar@dayXshift,
+ yshift=0.5\@t@calendar@dayYshift,
+ ] (0,{-\n\@t@calendar@dayYshift}) -- (7\@t@calendar@dayXshift,{-\n\@t@calendar@dayYshift});
+ \fi
+ }
+ %
+ % Vertical lines
+ %
+ \gridLines=7
+ \ifGridNoSurround\relax
+ \else
+ \advance\gridLines by 1
+ \n=0
+ \draw [
+ gridcolor,
+ line width=0.3pt,
+ xshift=-0.5\@t@calendar@dayXshift,
+ yshift=0.5\@t@calendar@dayYshift,
+ ] ({\n\@t@calendar@dayXshift},0) -- ({\n\@t@calendar@dayXshift},{-\gridRows\@t@calendar@dayYshift});
+ \fi
+ \foreach \n in {1,2,3,4,5,6,7} {
+ \ifnum\n<\gridLines
+ \draw [
+ gridcolor,
+ line width=0.3pt,
+ xshift=-0.5\@t@calendar@dayXshift,
+ yshift=0.5\@t@calendar@dayYshift,
+ ] ({\n\@t@calendar@dayXshift},0) -- ({\n\@t@calendar@dayXshift},{-\gridRows\@t@calendar@dayYshift});
+ \fi
+ }
+ %
+ % If we are not drawing the surrounding lines, it looks better to hide
+ % some of the top and bottom edges
+ %
+ \ifGridNoSurround
+ \draw [
+ color=white,
+ line width=6pt,
+ xshift=-0.5\@t@calendar@dayXshift,
+ yshift={0.5\@t@calendar@dayYshift -1pt},
+ ] (0,0) -- (7\@t@calendar@dayXshift,0);
+ \draw [
+ color=white,
+ line width=6pt,
+ xshift=-0.5\@t@calendar@dayXshift,
+ yshift={0.5\@t@calendar@dayYshift +1pt},
+ ] (0,-\gridRows\@t@calendar@dayYshift) -- (7\@t@calendar@dayXshift,-\gridRows\@t@calendar@dayYshift);
+ \fi
+ }{}%
+ }
+]
+
+\tikzstyle{headings background rule}=[
+ background rule/.style={black!90, line width=0.3pt, yshift={0.3\@t@calendar@dayYshift -3pt}},
+ execute before day scope={%
+ \ifdate{day of month=1}{%
+ \draw [
+ xshift=-0.5\@t@calendar@dayXshift,
+ yshift=0.5\@t@calendar@dayYshift,
+ background rule,
+ ] (0,0) -- (7\@t@calendar@dayXshift,0);
+ }{}%
+ }
+]
+
+\tikzstyle{headings background bar}=[
+ headings background rule,
+ background rule/.style={black!20, line width=10pt, yshift={0.3\@t@calendar@dayYshift +3.5pt}},
+]
+
+\tikzstyle{betelgeuse}=[
+ no grid surround,
+ days grid,
+ week list,
+ day xshift=\@t@calendar@dayXshift,
+ day yshift=\@t@calendar@dayYshift,
+ headings background bar,
+ day letter headings,
+ day heading/.style={black!90, yshift={-0.3\@t@calendar@dayYshift}},
+ every day/.append style={anchor=base, inner xsep=0pt, yshift={-0.25\baselineskip}},
+ day text={\dayTextFmt\%d-},
+]
+
+\tikzstyle{alnitak}=[
+ day list right,
+ day xshift={0pt},
+ every month/.append style={anchor=base, inner xsep=0pt, yshift=4mm, xshift=-\widthof{\space}},
+ day text={\dayTextFmt\%d-},
+ every day/.append style={anchor=base, inner xsep=0pt},
+ execute before day scope={
+ %
+ % === Moving the day number ===
+ %
+ % A small offset seems to improve the result, the last day gets closer to the end of the linewidth
+ \pgftransformxshift{0.01em}
+ \pgfcalendarjuliantodate{\pgfcalendarendjulian}{\currentyear}{\currentmonth}{\lastday}
+ % Width of month day digits from 1 - 28
+ \setlength{\@tmp@a}{\widthof{12345678910111213141516171819202122232425262728}}
+ \setlength{\@tmp@b}{\widthof{30}}
+ \pgfmathparse{(\linewidth - \@tmp@a - \@tmp@b * (\lastday-28)) / \lastday}
+ \pgftransformxshift{\pgfmathresult}
+ \let\%=\pgfcalendarshorthand
+ \setlength{\@tmp@a}{\widthof{\%d-}}
+ \pgftransformxshift{\@tmp@a}
+ %
+ % === Weekday letter above the day ===
+ %
+ \ifdate{weekend}{\def\dayLetterColor{\color{weekend}}}{\def\dayLetterColor{\color{weekday}}}%
+ \node[anchor=south,yshift=5mm,inner sep=0pt]{%
+ \dayLetterColor\dayLetterFmt\@tr@dayLetter{\pgfcalendarcurrentweekday}%
+ };%
+ },
+]
+
+\newcommand\plannerPortraitMonthFmt{\fontsize{11}{11}\selectfont\color{darkgold}}
+\newcommand\plannerPortraitDayFmt{\fontsize{8}{8}\selectfont\color{plannerdatenum}}
+
+\tikzstyle{year planner portrait}=[
+ week list,
+ month text={\plannerPortraitMonthFmt\@tr@monthNumName{\pgfcalendarcurrentmonth}},
+ day text={\plannerPortraitDayFmt\%d-},
+ every month/.append style={%
+ anchor=south,
+ inner xsep=0pt,
+ yshift=5mm,
+ xshift=2.5mm,
+ },
+ day letter headings,
+ day heading/.style={gray, xshift=0pt, scale=0.85},
+ month label above centered,
+ every day/.style={anchor=mid},
+]
+
+\newcommand\plannerLandscapeDateDayFont{}
+\newcommand\plannerLandscapeDayFont{}
+\newcommand\plannerLandscapeMonthFont{}
+
+\newcommand\plannerLandscapeMonthFmt{%
+ \plannerLandscapeMonthFont%
+ \fontsize{15}{18}\selectfont%
+ \color{gold}\bfseries%
+}
+
+\newcommand\plannerLandscapeDayFmt{%
+ \plannerLandscapeDayFont%
+ \fontsize{10}{12}\selectfont%
+}
+
+\newcommand*\plannerLandscapeDateDayFormat[1]{%
+ \plannerLandscapeDateDayFont%
+ \fontsize{8}{11}\selectfont%
+ #1%
+}
+
+\newcommand\plannerLandscapeBeginDayScopeHook{%
+ \ifdate{weekend}{\color{black!60}}{}
+}
+
+\newlength\plannerLandscapeDayXShift
+\newlength\plannerLandscapeMonthYShift
+
+% Assuming 25mm to fit 'September'
+\setlength{\@tmp@a}{\calPaperWidth - \@wall@leftMargin - \@wall@rightMargin - 25mm}
+% Max week shift is 6 = Sunday. 31 days + 6 = 37. 1/37 = 0.027
+\setlength{\plannerLandscapeDayXShift}{0.027\@tmp@a}
+
+% Assuming 10mm for day headings (M T W...) and some padding
+\setlength{\@tmp@a}{\calPaperHeight - \@wall@topMargin - \@wall@bottomMargin - 10mm}
+% 1/12 = 0.0833
+\setlength{\plannerLandscapeMonthYShift}{0.0833\@tmp@a}
+
+\tikzstyle{year planner landscape}=[
+ month list,
+ day xshift=\plannerLandscapeDayXShift,
+ month yshift=\plannerLandscapeMonthYShift,
+ every month/.append style={anchor=base, inner xsep=0pt},
+ month text={\plannerLandscapeMonthFmt \%mt},
+ day text={\plannerLandscapeDayFmt \%d-},
+ every day/.append style={anchor=base, inner xsep=0pt},
+ month label left,
+ execute at begin day scope={
+ \plannerLandscapeBeginDayScopeHook
+ % Weekday headers in January
+ \ifdate{between=01-01 and 01-31}{
+ \def\l{\ifcase\pgfcalendarcurrentweekday M\or T\or W\or T\or F\or S\or S\fi}%
+ \ifdate{weekend}{\def\daylabelcolor{gold}}{\def\daylabelcolor{black}}%
+ \node[anchor=south,yshift=5mm,inner sep=0pt]{\color{\daylabelcolor}\plannerLandscapeDateDayFormat{\l}};%
+ }{}
+ % Weekday headers in December
+ \ifdate{between=12-01 and 12-31}{
+ \pgftransformyshift{-3mm}%
+ \def\l{\ifcase\pgfcalendarcurrentweekday M\or T\or W\or T\or F\or S\or S\fi}%
+ \ifdate{weekend}{\def\daylabelcolor{gold}}{\def\daylabelcolor{black}}%
+ \node[anchor=south,yshift=5mm,inner sep=0pt]{\color{\daylabelcolor}\plannerLandscapeDateDayFormat{\l}};%
+ }{}
+ }
+]
+
+\newcommand\plannerGridMonthFont{}
+\newcommand\plannerGridDateDayFont{}
+\newcommand\plannerGridNotesFont{}
+\newcommand\plannerGridDayFont{}
+\newcommand\plannerGridYearNumberFont{}
+
+\newcommand\plannerGridYearNumberFmt{%
+ \plannerGridYearNumberFont%
+ \fontsize{11}{11}\selectfont%
+ \color{white}%
+}
+
+\newcommand\plannerGridMonthFmt{%
+ \plannerGridMonthFont%
+ \fontsize{13}{13}\selectfont%
+ \color{white}%
+}
+
+\newcommand\plannerGridDayFmt{%
+ \plannerGridDayFont%
+ \fontsize{11}{11}\selectfont%
+}
+
+\newcommand\plannerGridDateDayFmt{%
+ \plannerGridDateDayFont%
+ \fontsize{9}{9}\selectfont%
+ \color{black!80}%
+}
+
+\newcommand{\plannerGridNotesFmt}{%
+ \plannerGridNotesFont%
+ \fontsize{11}{11}\selectfont%
+}
+
+\newcommand\plannerGridBeginDayScopeHook{%
+ \ifdate{weekend}{\color{black!60}}{}
+}
+
+\newlength\plannerGridColXShift
+\newlength\plannerGridRowYShift
+
+\newlength\plannerGridCalendarWidth
+\newlength\plannerGridCalendarHeight
+
+\newlength\plannerGridDayHeadingsHeight
+\newlength\plannerGridMonthNamesWidth
+
+\newlength\plannerGridNotesHeight
+\setlength{\plannerGridNotesHeight}{10mm}
+
+\setlength{\plannerGridCalendarWidth}{\calPaperWidth - \@wall@leftMargin - \@wall@rightMargin}
+\setlength{\plannerGridCalendarHeight}{\calPaperHeight - \@wall@topMargin - \@wall@bottomMargin - \plannerGridNotesHeight}
+
+\setlength{\plannerGridDayHeadingsHeight}{10mm}
+\setlength{\plannerGridMonthNamesWidth}{10mm}
+
+\setlength{\@tmp@a}{\plannerGridCalendarWidth - \plannerGridMonthNamesWidth}
+% 37 columns. 1/37 = 0.027. Max week shift is 6 = Sunday. 31 days + 6 = 37.
+\setlength{\plannerGridColXShift}{0.027\@tmp@a}
+
+\setlength{\@tmp@a}{\plannerGridCalendarHeight - 2\plannerGridDayHeadingsHeight}
+% 12 rows. 1/12 = 0.0833
+\setlength{\plannerGridRowYShift}{0.0833\@tmp@a}
+
+\newcounter{verticalCount}
+
+\tikzstyle{year planner landscape grid days}=[
+ month list,
+ day xshift=\plannerGridColXShift,
+ month yshift=\plannerGridRowYShift,
+ day text={\plannerGridDayFmt \%d-},
+ every day/.append style={anchor=base, yshift=-12pt, inner xsep=0pt},
+ execute at begin day scope={%
+ % White fill to cover the page background color
+ \node (cell) [
+ rectangle,
+ fill = white,
+ minimum height = \plannerGridRowYShift - 1pt,
+ minimum width = \plannerGridColXShift - 1pt,
+ xshift = -0.5\plannerGridColXShift,
+ yshift = 4.5pt,
+ ] {};%
+ %
+ \ifdate{Monday}{%
+ \node (a) [above left = 15pt and -3.5pt of cell.west] {};
+ \node (b) [below left = 15pt and -3.5pt of cell.west] {};
+ \node (c) [right = 10pt of cell.west] {};
+ \path [on layer = one, fill = pagebgcolor] (a.south) -- (b.north) -- (c.west) -- (a.south);%
+ }{}%
+ %
+ \ifdate{Sunday}{%
+ \node (a) [above left = 15pt and {-3.5pt + 1pt} of cell.east] {};
+ \node (b) [below left = 15pt and {-3.5pt + 1pt} of cell.east] {};
+ \node (c) [right = {10pt - 1pt} of cell.east] {};
+ \path [on layer = two, fill = white] (a.south) -- (b.north) -- (c.west) -- (a.south);%
+ }{}%
+ %
+ \plannerGridBeginDayScopeHook%
+ },
+]
+
+\newcommand\plannerMarksDayTextCSV{\@wall@eventsCsv}
+\newcommand\plannerMarksNoteCSV{\@wall@eventsCsv}
+\newcommand\plannerMarkDefaultsCsv{}
+
+\newcommand\@wall@plm[1]{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+monthMarksDayText(\luastring{#1}, nil, \luastring{\plannerMarksDayTextCSV})
+tex.sprint(';')
+}}
+
+\newcommand\@wall@plmYear{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+yearMarksDayText(tonumber(\CalendarYear), nil, \luastring{\plannerMarksDayTextCSV})
+tex.sprint(';')
+}}
+
+\newcommand\@wall@plNotes{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+yearMarksNote(tonumber(\CalendarYear), nil, \luastring{\plannerMarksNoteCSV}, \luastring{\plannerMarkDefaultsCsv}, false)
+}}
+
+\newcommand\@wall@plNotesOneCalendar{%
+\luadirect{
+require("wallcalendar-helpers.lua")
+yearMarksNote(tonumber(\CalendarYear), nil, \luastring{\plannerMarksNoteCSV}, \luastring{\plannerMarkDefaultsCsv}, true)
+}}
+
+\newcommand\plannerEvents{%
+\parseYearEvents[filter pred = hasNote]%
+}
+
+\newcommand\YearPlannerPortrait{%
+\@wall@useDefaultMoons%
+\begin{tikzpicture}[every calendar/.style={year planner portrait}]%
+ \matrix[column sep=1.5em, row sep=5mm] {
+ \calendar(cal01)[dates=\CalendarYear-01-01 to \CalendarYear-01-last] \@wall@plm{January}; \pgfmatrixnextcell
+ \calendar(cal02)[dates=\CalendarYear-02-01 to \CalendarYear-02-last] \@wall@plm{February}; \pgfmatrixnextcell
+ \calendar(cal03)[dates=\CalendarYear-03-01 to \CalendarYear-03-last] \@wall@plm{March}; \\
+ \calendar(cal04)[dates=\CalendarYear-04-01 to \CalendarYear-04-last] \@wall@plm{April}; \pgfmatrixnextcell
+ \calendar(cal05)[dates=\CalendarYear-05-01 to \CalendarYear-05-last] \@wall@plm{May}; \pgfmatrixnextcell
+ \calendar(cal06)[dates=\CalendarYear-06-01 to \CalendarYear-06-last] \@wall@plm{June}; \\
+ \calendar(cal07)[dates=\CalendarYear-07-01 to \CalendarYear-07-last] \@wall@plm{July}; \pgfmatrixnextcell
+ \calendar(cal08)[dates=\CalendarYear-08-01 to \CalendarYear-08-last] \@wall@plm{August}; \pgfmatrixnextcell
+ \calendar(cal09)[dates=\CalendarYear-09-01 to \CalendarYear-09-last] \@wall@plm{September}; \\
+ \calendar(cal10)[dates=\CalendarYear-10-01 to \CalendarYear-10-last] \@wall@plm{October}; \pgfmatrixnextcell
+ \calendar(cal11)[dates=\CalendarYear-11-01 to \CalendarYear-11-last] \@wall@plm{November}; \pgfmatrixnextcell
+ \calendar(cal12)[dates=\CalendarYear-12-01 to \CalendarYear-12-last] \@wall@plm{December}; \\
+ };
+ \@wall@plNotes
+\end{tikzpicture}%
+}
+
+\newcommand\YearPlannerLandscape{%
+\@wall@usePlannerMoons%
+\begin{tikzpicture}%
+ \calendar (cal) [
+ year planner landscape,
+ dates=\CalendarYear-01-01 to \CalendarYear-12-31,
+ ] \@wall@plmYear;
+ \@wall@plNotesOneCalendar
+\end{tikzpicture}%
+}
+
+\newcommand\YearPlannerLandscapeGrid{%
+\@wall@usePlannerMoons%
+\begin{tikzpicture}
+
+ % Background frame
+
+ \node (bg) [
+ rectangle,
+ inner sep = 0pt,
+ minimum width = \plannerGridCalendarWidth,
+ minimum height = \plannerGridCalendarHeight,
+ ] {};
+
+ \foreach \x/\m in {1/\xJanShort, 2/\xFebShort, 3/\xMarShort, 4/\xAprShort,
+ 5/\xMayShort, 6/\xJunShort, 7/\xJulShort, 8/\xAugShort, 9/\xSepShort,
+ 10/\xOctShort, 11/\xNovShort, 12/\xDecShort}
+ {
+ \setlength{\@tmp@a}{\x\plannerGridRowYShift + \plannerGridDayHeadingsHeight}
+
+ % Month labels
+
+ \node [
+ below = \@tmp@a of bg.north west,
+ yshift = 0.5\plannerGridRowYShift,
+ xshift = 0.5\plannerGridColXShift - 2pt,
+ anchor = base,
+ rotate = 90,
+ ] {\plannerGridMonthFmt\MakeUppercase{\textls*{\m}}};
+
+ % Horizontal lines
+
+ \addtolength{\@tmp@a}{-\plannerGridRowYShift}
+
+ \node (h-a-\x) [below = \@tmp@a of bg.north west] {};
+ \node (h-b-\x) [below = \@tmp@a of bg.north east] {};
+ \draw [gridcolor] (h-a-\x) -- (h-b-\x);
+ }
+
+ % 13th line
+ \setlength{\@tmp@a}{12\plannerGridRowYShift + \plannerGridDayHeadingsHeight}
+ \node (h-a-13) [below = \@tmp@a of bg.north west] {};
+ \node (h-b-13) [below = \@tmp@a of bg.north east] {};
+ \draw [gridcolor] (h-a-13) -- (h-b-13);
+
+ % Year number in the corner
+ \node [
+ right = 0pt of bg.north west,
+ xshift = 0.5\plannerGridMonthNamesWidth,
+ yshift = -0.5\plannerGridDayHeadingsHeight - 5pt,
+ anchor = base,
+ ] {\plannerGridYearNumberFmt\CalendarYear};
+
+ \setcounter{verticalCount}{1}
+
+ \foreach \i in {0,1,2,3,4,5} {
+ \foreach \j/\d in {
+ 0/\xMondayDayLetter,
+ 1/\xTuesdayDayLetter,
+ 2/\xWednesdayDayLetter,
+ 3/\xThursdayDayLetter,
+ 4/\xFridayDayLetter,
+ 5/\xSaturdayDayLetter,
+ 6/\xSundayDayLetter}
+ {
+ \addtocounter{verticalCount}{1}
+ \ifnumgreater{\value{verticalCount}}{38}{\relax}{
+ \setlength{\@tmp@a}{7\plannerGridColXShift}
+ \setlength{\@tmp@a}{\i\@tmp@a + \j\plannerGridColXShift + \plannerGridMonthNamesWidth}
+
+ % Day headings (top and bottom)
+
+ \node [
+ right = \@tmp@a of bg.north west,
+ xshift = 0.5\plannerGridColXShift + 4pt,
+ yshift = -0.5\plannerGridDayHeadingsHeight - 5pt,
+ anchor = base,
+ ] {\plannerGridDateDayFmt \d};
+
+ \node [
+ right = \@tmp@a of bg.south west,
+ xshift = 0.5\plannerGridColXShift + 4pt,
+ yshift = 0.5\plannerGridDayHeadingsHeight - 5pt,
+ anchor = base,
+ ] {\plannerGridDateDayFmt \d};
+
+ % % Vertical lines
+
+ % \node (v-a-\i-\j) [right = \@tmp@a of bg.north west] {};
+ % \node (v-b-\i-\j) [right = \@tmp@a of bg.south west] {};
+ % \draw [gridcolor] (v-a-\i-\j) -- (v-b-\i-\j);
+ }
+ }
+ }
+
+ \calendar (cal) [
+ year planner landscape grid days,
+ dates=\CalendarYear-01-01 to \CalendarYear-12-31,
+ below right = 0pt and 0pt of bg.north west,
+ anchor = north west,
+ yshift = -\plannerGridDayHeadingsHeight - 3mm,
+ xshift = \plannerGridMonthNamesWidth + 0.5\plannerGridColXShift + 4pt,
+ ] \@wall@plmYear;
+
+ \@wall@plNotesOneCalendar
+
+\end{tikzpicture}%
+}
+
+\newcommand{\YearPlannerLandscapeGridPage}{%
+\pagecolor{pagebgcolor}%
+\AddToShipoutPictureFG*{\put(\LenToUnit{\@wall@leftMargin},\LenToUnit{\@wall@bottomMargin})%
+{\begin{minipage}[b]{\plannerGridCalendarWidth}%
+\YearPlannerLandscapeGrid
+
+\begin{minipage}[b][10mm][c]{\plannerGridCalendarWidth}%
+\plannerGridNotesFmt
+\hspace*{2mm}%
+\parseYearEvents[%
+ filter pred = hasNote,
+ format cmd = {\textsuperscript{\eIdx}~\eMonthShort~\eDay:~\textit{\eNote}\ifnumless{\eIdx}{\eMaxIdx}{,\space}{.}},
+]%
+\end{minipage}%
+\end{minipage}%
+}}}
+
+% Load internal translations
+\InputIfFileExists{i18n/wallcalendar-\@wall@calendarLanguage.tex}{}%
+{\ClassError{wallcalendar}{File Not Found: i18n/wallcalendar-\@wall@calendarLanguage.tex}{}}
+
+% Load user translations if the option was set and translationsAutoload is true
+
+\newcommand\LoadTranslations{%
+\InputIfFileExists{\@wall@translationsInputFile}{}%
+{\ClassWarning{wallcalendar}{File Not Found: \@wall@translationsInputFile}{}}}
+
+\notblank{\@wall@translationsInputFile}{%
+\iftranslationsAutoload \LoadTranslations \fi}
+
+\newcommand*\@tr@monthNumName[1]{%
+\ifcase#1 \relax\or \xJanuary\or \xFebruary\or \xMarch\or \xApril\or \xMay\or \xJune\or
+\xJuly\or \xAugust\or \xSeptember\or \xOctober\or \xNovember\or \xDecember\fi}
+
+\newcommand*\@tr@dayLetter[1]{%
+\ifcase#1 \xMondayDayLetter\or \xTuesdayDayLetter\or \xWednesdayDayLetter\or
+\xThursdayDayLetter\or \xFridayDayLetter\or \xSaturdayDayLetter\or \xSundayDayLetter\fi}
+
+\newcommand*{\monthToNum}[1]{%
+\luadirect{
+ local monthToNum = {
+ january = '01',
+ february = '02',
+ march = '03',
+ april = '04',
+ may = '05',
+ june = '06',
+ july = '07',
+ august = '08',
+ september = '09',
+ october = '10',
+ november = '11',
+ december = '12',
+ }
+ local key = string.lower('#1')
+ tex.sprint(monthToNum[key])
+}}
+
+\newcommand*\monthName[1]{%
+% \ifcase might be just fine here
+\luadirect{
+ local monthName = {
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July',
+ 'August', 'September', 'October', 'November', 'December',
+ }
+ local key = tonumber('#1')
+ tex.sprint(monthName[key])
+}}
+
+% End of wallcalendar.cls