Un calendrier scolaire avec LaTeX

Le package TikZ pour LaTeX possède une librairie dédiée à la conception de calendriers.

Voici un calendrier scolaire pour l’année scolaire 2023-2024.

Pour l’adapter en fonction de l’année, il suffit de modifier la valeur de l’année au début du code, ainsi que les dates des jours fériés. Ces dernières ne peuvent malheureusement pas se placer au tout début du code ; il faudra donc chercher les lignes correspondantes (commentées).

Pour construire les deux colonnes, je me suis rabattu – faute de mieux – sur la création de deux calendriers juxtaposés. L’inconvénient est que les modifications dans la présentation doivent être répercutées sur les deux calendriers. L’avantage est un code relativement simple, si on le compare à des exemples élaborés disponibles sur le web, dont il est difficile de s’approprier le code.

Pour limiter ce désagrément, j’ai créé quelques macros en début de code, qui sont utilisées dans les deux calendriers. Il s’agit des espaces horizontaux et verticaux entre les numéros des jours, et de l’espace intérieur entre le numéro et son cadre.

D’autre part, les couleurs sont définies en début de code pour une modification plus facile.

La stratégie générale est la suivante : les numéros des jours sont inscrits dans des noeuds de TikZ (“node”). Les paramètres de couleur de ces noeuds sont modifiés par des conditions sur la date (samedi, dimanche, jour férié, vacances). Il est facile de modifier la forme du noeud (rectangle ou cercle).

Le code :

\documentclass[a4paper,11pt,french]{article}

%COMPILé AVEC XeLaTeX
\usepackage{fontspec}
\usepackage{babel}
\usepackage[dvipsnames,svgnames,x11names ]{xcolor}
\usepackage{lmodern}
\usepackage[french]{translator}
\usepackage{tikz}
\usetikzlibrary{calc,scopes, calendar}
\usepackage{calculator}
\usepackage[top=1cm,bottom=1cm,left=2cm,right=2cm]{geometry}
\usepackage{moresize}% commande \HUGE pour l'année en titre

% Paramètres utilisateurs -----------------------------------
\def\year{2023}
\setmainfont{Linux Libertine O}% nombres plus élégants
\ADD{\year}{1}{\nextyear}
\colorlet{couleur}{OliveGreen}%couleur mois et week-end
\colorlet{colvac}{Sienna1!60}%couleur des jours de vacances
\colorlet{colfer}{Sienna2}%couleur des jours fériés

% espaces
\newlength{\interieur}% marge intérieure des noeuds
\setlength{\interieur}{3pt}
\newlength{\dayxshift}% espace horiz. entre jours
\setlength{\dayxshift}{2em}
\newlength{\dayyshift}% espace vertic. entre jours
\setlength{\dayyshift}{1.7em}

\setlength{\fboxrule}{1pt}
\setlength{\fboxsep}{5pt}
\renewcommand\fbox{\fcolorbox{couleur}{white}}
%---------------------------------------------------------------

\begin{document}
\pagestyle{empty}

\Large
\centering
	% titre
	{\HUGE \bfseries\color{couleur!80!black}
			 \pgfmathprint{\year} - \pgfmathprint{\nextyear}
	}


\vspace{0.5cm}
\fbox{
%\bfseries
\begin{minipage}{0.9\linewidth}
	\vspace{0.5cm}
	\begin{tikzpicture}[baseline=(current bounding box.north)]
	\tikzset{filling/.style={fill=white}}
	\calendar[dates=\year-09-01 to \nextyear-01-last,week list,
				day text=\%d0,
				every day/.style={%draw,
					rectangle},% forme.On peut choisir "circle". Nécessaire pour éviter décalage (??)
				month label left vertical,
				month text=\textcolor{couleur}{\textsf{\textbf{{\%mt}}}},
				month yshift=1.5cm,
				day xshift=\dayxshift,
				day yshift=\dayyshift,
				 execute before day scope=
				{
				\ifdate{Saturday}
						{
						\tikzset{filling/.style={fill=couleur!30}}
							}
				\ifdate{Sunday}
						{
						\tikzset{filling/.style={fill=couleur!50}}
						}
				\ifdate{workday}
					{
					\tikzset{filling/.style={fill=white}}
					}{
					}
						% Vacances
				\ifdate{between=\year-10-23 and \year-11-05}{%Toussaint
							\tikzset{filling/.style={fill=colvac}}}{}
				\ifdate{between=\year-12-25 and \nextyear-01-07}{%Noël
							\tikzset{filling/.style={fill=colvac}}}{}
				\ifdate{equals=11-01}% toussaint
						{\tikzset{filling/.style={fill=colfer}}}{}
				\ifdate{equals=11-11}%11 nov
						{\tikzset{filling/.style={fill=colfer}}}{}
				\ifdate{equals=12-25}%Noël
						{\tikzset{filling/.style={fill=colfer}}}{}
					\ifdate{equals=01-01}%jour de l'an
						{\tikzset{filling/.style={fill=colfer}}}{}
				},
				execute at begin day scope={%
					},
				day code={
				\draw node[filling,inner sep=\interieur,name=\pgfcalendarsuggestedname,every day,font=\normalsize]{\tikzdaytext}
					;}
				]
				;
	\end{tikzpicture}
	\hfill
	% 2e partie du calendrier (février - juin)
	\begin{tikzpicture}[baseline=(current bounding box.north)]
\tikzset{filling/.style={fill=white}}
\calendar[dates=\nextyear-02-01 to \nextyear-07-07,week list,
day text=\%d0,
every day/.style={%draw,
					rectangle},
month label left vertical,
month text=\textcolor{couleur}{\textsf{\textbf{{\%mt}}}},
month yshift=1.5cm,
day xshift=\dayxshift,
day yshift=\dayyshift,
execute before day scope=
{
	\ifdate{Saturday}
	{
		\tikzset{filling/.style={fill=couleur!30}}
	}
	\ifdate{Sunday}
	{
		\tikzset{filling/.style={fill=couleur!50}}
	}
	\ifdate{workday}
	{
		\tikzset{filling/.style={fill=white}}
	}{
	}
	% Vacances
	\ifdate{between=\nextyear-02-26 and \nextyear-03-10}{% hiver
		\tikzset{filling/.style={fill=colvac}}}{}
	\ifdate{between=\nextyear-04-22 and \nextyear-05-05}{%Pâques
		\tikzset{filling/.style={fill=colvac}}}{}
	%Fériés
	\ifdate{equals=04-01}% Lundi de Pâques
	{\tikzset{filling/.style={fill=colfer}}}{}
	\ifdate{equals=05-01}%1er Mai
	{\tikzset{filling/.style={fill=colfer}}}{}
	\ifdate{equals=05-08}% 8 Mai
	{\tikzset{filling/.style={fill=colfer}}}{}
	\ifdate{between=05-09 and 05-10}% Ascension
	{\tikzset{filling/.style={fill=colfer}}}{}
	\ifdate{equals=05-20}% Pentecôte
	{\tikzset{filling/.style={fill=colfer}}}{}
},
execute at begin day scope={%
},
day code={
	\draw (0,0) node[filling,inner sep=\interieur,name=\pgfcalendarsuggestedname,every day,font=\normalsize]{\tikzdaytext}
	;}
]
;
\end{tikzpicture}
\end{minipage}
}

\begin{flushleft}
\begin{tikzpicture}
\draw (0,0) node[fill=colvac]{} node[right=2mm,black,font=\small]{vacances};
\draw (2,0) node[fill=colfer]{}
node[right=2mm,black,font=\small]{férié};
\end{tikzpicture}
\end{flushleft}

\end{document}

Soyez le premier à commenter

Laisser un commentaire