With matrix
If you use a style like weekday above defined as
\tikzset{
every weekday/.style={anchor=south east, node contents=\%w.},
weekday above/.style={
if = {(day of month=1) [days={append after command={
node [at={(\tikzlastnode.north east)},
alias=@firstweekday, every weekday]}}]},
if = {(day of month=2, day of month=3, day of month=4,
day of month=5, day of month=6, day of month=7) [
days={append after command={
node [at={(@firstweekday.south east-|\tikzlastnode.south east)},
every weekday]}}]}}}
you can let calendar do the work on placing the weekdays with
every calendar/.append style = weekday above
There's also a style called month label above centered but its horizontal placement isn't very precise.
However, we can use Thurday's node to place the month's node above it by defining:
\tikzset{
weekday above and month label centered above weekdays/.style={
weekday above, every weekday/.append style={
name=\pgfcalendarprefix-weekday-\pgfcalendarcurrentweekday},
if = {(day of month=8) {\tikzmonthcode}},
every month/.style={
at=(\pgfcalendarprefix-weekday-3.north), anchor=south}}}
Code
\documentclass[ngerman,multi=tikzpicture,varwidth=false,border=5]{standalone}
\usepackage{babel,translator,tikz}
\usepackage[utf8]{inputenc}
\renewcommand\familydefault\sfdefault
\usetikzlibrary{calendar}
\colorlet{darkgreen}{green!50!black}
\newcommand{\calperiod}[2][\pgfkeysvalueof{/tikz/current year}]{%
\calendar[dates=#1-#2-01 to #1-#2-last] if (Sunday) [black!50];}
\tikzset{
current year/.initial=2017,
every weekday/.style={anchor=south east, node contents=\%w.},
weekday above/.style={
if = {(day of month=1) [days={append after command={
node [at={(\tikzlastnode.north east)}, alias=@firstweekday, every weekday]}}]},
if = {(day of month=2, day of month=3, day of month=4, day of month=5, day of month=6,
day of month=7) [ days={append after command={
node[at={(@firstweekday.south east-|\tikzlastnode.south east)}, every weekday]}}]}},
weekday above and month label centered above weekdays/.style={
weekday above, every weekday/.append style={
name=\pgfcalendarprefix-weekday-\pgfcalendarcurrentweekday},
if = {(day of month=8) {\tikzmonthcode}},
every month/.style={at=(\pgfcalendarprefix-weekday-3.north), anchor=south}}}
\begin{document}
\tikz[every calendar/.style={
week list, weekday above and month label centered above weekdays,
every month/.append style={darkgreen, anchor=south, font=\bfseries}},
day xshift=4ex]
\matrix[row sep=3ex, column sep=2ex,
draw=darkgreen, thick, rounded corners=5pt,
every weekday/.append style=darkgreen,
]{
\calperiod{01} & \calperiod{02} & \calperiod{03} \\
\calperiod{04} & \calperiod{05} & \calperiod{06} \\
\calperiod{07} & \calperiod{08} & \calperiod{09} \\
\calperiod{10} & \calperiod{11} & \calperiod{12} \\
};
\end{document}
Without matrix
But we can also let calendar do everything without a matrix with a style like week list three columns defined as
\tikzset{
current week in month/.initial=0,
week list three columns/.style={
execute before day scope=%
\ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}{%
\pgftransformyshift
{\pgfkeysvalueof{/tikz/current week in month}*(\tikz@lib@cal@yshift)}%
\pgfkeyssetvalue{/tikz/current week in month}{0}
\pgftransformxshift
{(mod(\numexpr\%m0-1\relax,3) ? 1 : -2) * (\tikz@lib@cal@month@xshift)}%
\pgftransformyshift{!mod(\numexpr\%m0-1\relax,3)*
-(\tikz@lib@cal@month@yshift)}}}{},
execute at begin day scope=%
\pgftransformxshift{\pgfcalendarcurrentweekday*(\tikz@lib@cal@xshift)},
execute after day scope=%
\ifdate{Sunday}{%
\pgftransformyshift{-(\tikz@lib@cal@yshift)}%
\pgfmathadd@{\pgfkeysvalueof{/tikz/current week in month}}{1}%
\pgfkeyslet{/tikz/current week in month}\pgfmathresult}{},
tikz@lib@cal@width=7, month xshift=32ex, month yshift=26ex}}
The backgrounds library is used to draw a rectangle around the whole picture.
Code
\documentclass[ngerman,multi=tikzpicture,varwidth=false,border=5,convert]{standalone}
\usepackage{babel,translator,tikz}
\usepackage[utf8]{inputenc}
\renewcommand\familydefault\sfdefault
\usetikzlibrary{calendar,backgrounds}
\colorlet{darkgreen}{green!50!black}
\makeatletter
\tikzset{
week list three columns/.style={
execute before day scope=%
\ifdate{day of month=1}{\ifdate{equals=\pgfcalendarbeginiso}{}{%
\pgftransformyshift
{\pgfkeysvalueof{/tikz/current week in month}*(\tikz@lib@cal@yshift)}%
\pgfkeyssetvalue{/tikz/current week in month}{0}
\pgftransformxshift
{(mod(\numexpr\%m0-1\relax,3) ? 1 : -2) * (\tikz@lib@cal@month@xshift)}%
\pgftransformyshift{!mod(\numexpr\%m0-1\relax,3)*
-(\tikz@lib@cal@month@yshift)}}}{},
execute at begin day scope=%
\pgftransformxshift{\pgfcalendarcurrentweekday*(\tikz@lib@cal@xshift)},
execute after day scope=%
\ifdate{Sunday}{%
\pgftransformyshift{-(\tikz@lib@cal@yshift)}%
\pgfmathadd@{\pgfkeysvalueof{/tikz/current week in month}}{1}%
\pgfkeyslet{/tikz/current week in month}\pgfmathresult}{},
tikz@lib@cal@width=7, month xshift=32ex, month yshift=26ex}}
\makeatother
\tikzset{
current year/.initial=2017, current week in month/.initial=0,
every weekday/.style={anchor=south east, node contents=\%w.},
weekday above/.style={
if = {(day of month=1) [days={append after command={
node [at={(\tikzlastnode.north east)}, alias=@firstweekday, every weekday]}}]},
if = {(day of month=2, day of month=3, day of month=4, day of month=5, day of month=6,
day of month=7) [ days={append after command={
node[at={(@firstweekday.south east-|\tikzlastnode.south east)}, every weekday]}}]}},
weekday above and month label centered above weekdays/.style={
weekday above, every weekday/.append style={
name=\pgfcalendarprefix-weekday-\pgfcalendarcurrentweekday},
if = {(day of month=8) {\tikzmonthcode}},
every month/.style={at=(\pgfcalendarprefix-weekday-3.north), anchor=south}}}
\begin{document}
\tikz[background rectangle/.style={draw=darkgreen, thick, rounded corners=5pt},
show background rectangle]
\calendar [
week list three columns,
weekday above and month label centered above weekdays,
every month/.append style={darkgreen, font=\bfseries},
every weekday/.append style=darkgreen,
day xshift=4ex, dates=2017-01-01 to 2017-12-31];
\end{document}
Output

day xshift=19ptor another length fo your choice to\begin{tikzpicture}(see chapter 45, page 525 of the pgf manual) – leandriis Dec 31 '17 at 12:35